top - download
⟦91ebd4497⟧ Wang Wps File
Length: 40059 (0x9c7b)
Types: Wang Wps File
Notes: CPS/SDS/028
Names: »1690A «
Derivation
└─⟦6ff65156a⟧ Bits:30006101 8" Wang WCS floppy, CR 0160A
└─ ⟦this⟧ »1690A «
WangText
…0c……05……0c……07……0b……0a……0b……0c……0b……0f……0b……06……0a……0c……0a……00……0a… …09……08……09……0a……09……86…1
…02…
…02…
…02…
…02…CPS/SDS/028
…02…820514…02……02…
I/O CONTROL
DETAILED DESIGN
SPECIFICATION…02……02…CAMPS
SEND ̲OUTPUT ̲BUFFER (TYPE:BUFFER ̲TYPES,BYTE ̲COUNT:INTEGER)()
B ̲REF=OWN ̲SDID.OUTPUTTER.BUFFER ̲ENTRY
B ̲REF.BUFFER ̲SIZE=BYTE ̲COUNT
OWN ̲SDID.OUTPUTTER.BUFFER ̲STATE=NO ̲BUF
BUFFER=B ̲REF.PAGE ̲START
START =B ̲REF.BUFFER ̲ADDR
BUFFER(START+BUFFER ̲TYPE ̲OFFSET)=TYPE,DATA
TYPE INDICATE START
OR ENTIRE LDU
P̲R̲O̲C̲ ̲F̲O̲R̲ ̲F̲I̲R̲S̲T̲
̲B̲U̲F̲F̲E̲R̲ ̲5̲
OWN ̲SDID.OUTPUTTER.SPI.PRIORITY=DATA ̲PRIORITY
OWN ̲SDID.OUTPUTTER.SPI.BUFFER ̲ENTRY=OWN ̲SDID.OUTPUTTER.BUFFER
̲ENTRY
OWN ̲SDID.OUTPUTTER.BUFFER ̲STATE=NO ̲BUF
ACTIVATE ̲SUBDEVICE ̲SPI(OWN ̲SDID,PARENT ̲SDID,
TRANSMIT ̲OUTPUT ̲BUFFER,
OWN ̲SIDI.OUTPUTTER.SPI (CCP)
TYPE INDICATE
END OR ENTIRE LDU
PROC ̲FOR ̲END
̲OF ̲OUTPUT()()
RETURN
Figure 4.1.5.4.5.2-4
P̲R̲O̲C̲ ̲F̲O̲R̲ ̲F̲I̲R̲S̲T̲ ̲B̲U̲F̲F̲E̲R̲ ̲5̲
GET NEXT LDU
OWN ̲SDID,OUTPUTTER,LDU?
GE MAX ̲LDU
OWN ̲SDID.OUTPUTTER.LDU+1 OWN ̲SDID.OUTPUTTER.LDU=0
BUFFER(START+LDU ̲OFFSET) = OWN ̲SDID.OUTPUTTER.LDU
OWN ̲SDID.OUTPUTTER. STATE= SUBSEQUENT ̲BUFFER
SAVE LDU IN QUEUE ELEMENT
OWN ̲SDID.OUTPUTTER.ONGOING.EP.LDU=
OWN ̲SDID.OUTPUTTER.LDU
Figure 4.1.5.4.5.2-5
4.1.5.4.5.3 PARENT PROCEDURES
These are: NOTIFY ̲OUTPUTTER ̲OF ̲STATUS
NOTIFY ̲OUTPUTTER ̲OUTPUT ̲BUFFER
NOTIFY ̲OUTPUTTER ̲OF ̲STATUS (BUFFER ̲ENTRY:POINTER)()
BUFFER=BUFFER ̲ENTRY.PAGE ̲START
START=BUFFER(START+TRANSMISSION ̲STATUS ̲LDU ̲OFFSET)
LOOK FOR CORRESPONDING QEL IN WAIT ̲COMPLETION QUEUE
CASE SEARCH ̲RECORD (OWN ̲SDID.OUTPUTTER.WAIT ̲COMPLETION,
OFFSET ̲OF ̲LDU ̲IN ̲IO ̲QEL,LDU)(QEL)OF
FAIL ? R̲E̲L̲E̲A̲S̲E̲ ̲B̲U̲F̲F̲E̲R̲ ̲ ̲2̲
PASS? P̲R̲O̲C̲ ̲F̲O̲R̲ ̲C̲O̲M̲P̲L̲E̲T̲E̲D̲ ̲O̲U̲T̲P̲U̲T̲ ̲3̲
END CASE
RETURN
Figure 4.1.5.4.5.3-1
R̲E̲L̲E̲A̲S̲E̲ ̲B̲U̲F̲F̲E̲R̲ ̲2̲
OWN ̲SDID.OUTPUTTER.SPI.BUFFER ̲ENTRY=BUFFER ̲ENTRY
ACTIVATE ̲SUBDEVICE ̲SPI(OWN ̲SDID.PARENT ̲SDID,
RELEASE ̲INPUT BUFFER,
OWN ̲SDID.OUTPUTTER.SPI) (CCP)
Figure 4.1.5.4.5.3-2
P̲R̲O̲C̲ ̲F̲O̲R̲ ̲C̲O̲M̲P̲L̲E̲T̲E̲D̲ ̲O̲U̲T̲P̲U̲T̲ ̲3̲
CASE EXTRACT ̲SPECIFIED (QEL,OWN ̲SDID.OUTPUTTER.WAIT
̲COMPLETION)() OF
FAIL ? PROTOCOL ̲ERROR(OUTPUTTER ̲3 ̲3 ̲A)
PASS ?
END CASE
CASE QEL.REQUESTOR OF
PROTOCOL ? - PROTOCOL ̲OUTPUT ̲RESULT(QEL,BUFFER
̲ENTRY)()
USER ? USER ̲OUTPUT ̲RESULT(QEL,BUFFER ̲ENTRY)()
CONTROLLER ? CONTROLLER ̲OUTPUT ̲RESULT(QEL,BUFFER
̲ENTRY)()
SUBDEVICE ? SUBDEVICE ̲OUTPUT ̲RESULT(QEL,BUFFER
̲ENTRY)()
OTHER ? PROTOCOL ̲ERROR (OUTPUTTER ̲3 ̲3 ̲B)
END CASE
Figure 4.1.5.4.5.3-3
NOTIFY ̲OUTPUTTER ̲OUTPUT ̲BUFFER(BUFFER ̲ENTRY:POINTER)()
OWN.SDID.OUTPUTTER.BUFFER ̲ENTRY=BUFFER ̲ENTRY
OWN ̲SDID.OUTPUTTER.STATE ?
EQ CANCELLED
RETURN ̲OUTPUT ̲BUFFER ()() SHIP ̲CANCEL ̲OUTPUT()()
OWN ̲SDID.OUTPUTTER.STATE=IDLE
PROCESS ̲FOR ̲NEXT ̲OUTPUT()()
RETURN
Figure 4.1.5.4.5.3-4
4.1.5.4.5.4 O̲U̲T̲P̲U̲T̲ ̲C̲O̲M̲P̲L̲E̲T̲I̲O̲N̲
These are: PROC ̲FOR ̲END ̲OF ̲OUTPUT
NEXT ̲OUTPUT
PROC ̲FOR ̲NEXT ̲OUTPUT
PROC ̲FOR ̲END ̲OF ̲OUTPUT ()()
MOVE QEL TO QUEUE OF OUTPUTS AWAITING RESPONSE
CASE EXTRACT ̲FIRST(OWN ̲SDID.OUTPUTTER.ONGOING)(QEL)OF
FAIL ? PROTOCOL ̲ERROR (OUTPUTTER ̲4 ̲1)
PASS ?
END CASE
QUEUE (OWN ̲SDID.OUTPUTTER.WAIT ̲COMPLETION,QEL)
OWN ̲SDID.OUTPUTTER.STATUS=IDLE
RETURN
Figure 4.1.5.4.5.4-1
NEXT ̲OUTPUT() (CC:COMPLETION ̲CODE)
CASE EXTRACT ̲FIRST(OWN ̲SDID.OUTPUTTER.PENDING)(QEL)OF
FAIL ?
PASS ?
END CASE
QUEUE(OWN ̲SDID.OUTPUTTER.ONGOING,QEL)()
OWN ̲SDID.OUTPUTTER.STATE=FIRST ̲BUFFER
OWN ̲SDID.OUTPUTTER.BUFFER ̲STATE=PENDING ̲RESERVE
OWN ̲SDID.OUTPUTTER.SPI.PRIORITY=DATA ̲PRIORITY
ACTIVATE ̲SUBDEVICE ̲SPI(OWN ̲SDID.PARENT ̲SDID,
RESERVE ̲OUTPUT ̲BUFFER,
OWN ̲SDID.OUTPUTTER.SPI)(CCP)
CCP EQ REQUEST ̲QUEUED ? CC=REQUEST ̲QUEUED
OWN ̲SDID.OUTPUTTER.BUFFER ̲ENTRY=
OWN ̲SDID.OUTPUTTER.SPI.BUFFER ̲ENTRY
CC=OK
RETURN
Figure 4.1.5.4.5.4-2
PROC ̲FOR ̲NEXT ̲OUTPUT ()()
NEXT ̲OUTPUT () (CCP)
CCP NE OK ?
BUFFER IS AVAILABLE
RETURN ̲OUTPUT ̲BUFFER ()()
RETURN
Figure 4.1.5.4.5.4-3
4.1.5.4.5.5 R̲E̲Q̲U̲E̲S̲T̲O̲R̲ ̲N̲O̲T̲I̲F̲I̲C̲A̲T̲I̲O̲N̲
This is: RETURN ̲OUTPUT ̲BUFFER
RETURN ̲OUTPUT ̲BUFFER ()()
OWN ̲SDID.OUTPUTTER.BUFFER ̲STATE=DELIVERED
EQUIVALENCE(OWN ̲SDID.OUTPUTTER.ONGOING.EP,QEL:IO ̲QEL)
BUFFER ̲REF=OWN ̲SDID.OUTPUTTER.BUFFER ̲ENTRY
OWN ̲SDID.OUTPUTTER.STATE ?
EQ FIRST ̲BUFFER
N̲O̲T̲I̲F̲Y̲ ̲N̲E̲X̲T̲ N̲O̲T̲I̲F̲Y̲ ̲F̲I̲R̲S̲T̲
B̲U̲F̲F̲E̲R̲ ̲2̲ ̲ B̲U̲F̲F̲E̲R̲ ̲3̲
RETURN
Figure 4.1.5.4.5.5-1
N̲O̲T̲I̲F̲Y̲ ̲N̲E̲X̲T̲ ̲B̲U̲F̲F̲E̲R̲ ̲2̲ ̲
CASE QEL.REQUESTOR OF
PROTOCOL ? NOTIFY ̲PROTOCOL ̲SUBSEQUENT ̲OUTPUT ̲
BUFFER (QEL,BUFFER ̲REF) ()
USER ? NOTIFY ̲USER ̲SUBSEQUENT ̲OUTPUT ̲
BUFFER (QEL,BUFFER ̲REF) ()
SUBDEVICE ? NOTIFY ̲SUBDEVICE ̲SUBSEQUENT ̲OUTPUT
̲
BUFFER (QEL,BUFFER ̲REF) ()
CONTROLLER ?NOTIFY ̲CONTROLLER ̲SUBSEQUENT ̲OUTPUT
̲
BUFFER (QEL,BUFFER ̲REF) ()
OTHER ? PROTOCOL ̲ERROR (OUTPUTTER ̲5 ̲2)
END CASE
Figure 4.1.5.4.5.5-2
N̲O̲T̲I̲F̲Y̲ ̲F̲I̲R̲S̲T̲ ̲B̲U̲F̲F̲E̲R̲ ̲3̲ ̲
CASE QEL.REQUESTOR OF
PROTOCOL ? NOTIFY ̲PROTOCOL ̲FIRST ̲OUTPUT
BUFFER (QEL,BUFFER ̲REF)()
USER ? NOTIFY ̲USER ̲FIRST ̲OUTPUT ̲BUFFER
(QEL,BUFFER ̲REF) ()
SUBDEVICE ? NOTIFY ̲SUBDEVICE ̲FIRST ̲OUTPUT ̲
BUFFER (QEL,BUFFER ̲REF) ()
CONTROLLER ?NOTIFY ̲CONTROLLER ̲FIRST ̲OUTPUT ̲
BUFFER (QEL,BUFFER ̲REF) ()
OTHER ? PROTOCOL ̲ERROR (OUTPUTTER ̲5 ̲3)
END CASE
Figure 4.1.5.4.5.5-3
4.1.5.4.5.6 C̲A̲N̲C̲E̲L̲ ̲S̲U̲P̲P̲O̲R̲T̲
These are: CANCEL ̲PENDING ̲OUTPUT
CANCEL ̲ONGOING ̲OUTPUT
CANCEL ̲WAIT ̲COMPLETION ̲OUTPUT
SHIP ̲CANCEL ̲OUTPUT
CANCEL ̲PENDING ̲OUTPUT (QEL:IO ̲QEL) ()
CASE EXTRACT ̲SPECIFIED (QEL,OWN ̲SDID.OUTPUTTER.PENDING)
()OF
FAIL ? PROTOCOL ̲ERROR (OUTPUTTER ̲6 ̲1)
PASS ?
END CASE
RETURN
Figure 4.1.5.4.5.6-1
CANCEL ̲ONGOING ̲OUTPUT (QEL) ()
RELEASE FOR BUFFER
CASE OWN ̲SDID.OUTPUTTER.BUFFER ̲STATE OF
NO ̲BUF ?
PENDING ̲RESERVE? C̲A̲N̲C̲E̲L̲ ̲R̲E̲S̲E̲R̲V̲A̲T̲I̲O̲N̲ ̲3̲
DELIVERED ? R̲E̲L̲E̲A̲S̲E̲ ̲B̲U̲F̲F̲E̲R̲ ̲4̲
END CASE
SEND CANCEL IF FIRST BUFFER HAS ALREADY BEEN OUTPUT
OWN ̲SDID.OUTPUTTER.STATE
EQ SUBSEQUENT ̲BUFFER?
S̲E̲T̲U̲P̲ ̲C̲A̲N̲C̲E̲L̲
̲5̲
COMPLETE EQ
FALSE ?
PROC ̲FOR ̲END ̲OF ̲OUTPUT () ()
RETURN
Figure 4.1.5.4.5.6-2
C̲A̲N̲C̲E̲L̲ ̲R̲E̲S̲E̲R̲V̲A̲T̲I̲O̲N̲ ̲3̲
ACTIVATE ̲SUBDEVICE ̲SPI (OWN ̲SDID.PARENT ̲SDID, CANCEL
̲RESERVE ̲OUTPUT ̲BUFFER, OWN ̲SDID.OUTPUTTER.SPI) (CCP)
Figure 4.1.5.4.5.6-3
R̲E̲L̲E̲A̲S̲E̲ ̲B̲U̲F̲F̲E̲R̲ ̲4̲ ̲
OWN ̲SDID.OUTPUTTER.SPI.BUFFER ̲ENTRY=OWN ̲SDID.OUTPUTTER.BUFFER
̲ENTRY
ACTIVATE ̲SUBDEVICE ̲SPI (OWN ̲SDID.PARENT ̲SDID,RELEASE
̲OUTPUT ̲BUFFER,OWN ̲SDID.OUTPUTTER.SPI) (CCP)
Figure 4.1.5.4.5.6-4
S̲E̲T̲U̲P̲ ̲C̲A̲N̲C̲E̲L̲ ̲5̲ ̲
GET A CANCEL BUFFER
OWN ̲SDID.OUTPUTTER.STATE=CANCELLED
OWN ̲SDID.OUTPUTTER.SPI.PRIORITY= CONTROL ̲PRIOTITY
OWN ̲SDID.OUTPUTTER.BUFFER ̲STATE=PENDING ̲RESERVE
ACTIVATE ̲SUBDEVICE ̲SPI (OWN ̲SDID.PARENT ̲SDID,RESERVE
̲OUTPUT ̲BUFFER,OWN ̲SDID.OUTPUTTER.SPI) (CCP)
CCP EQ REQUEST ̲QUEUED COMPLETE=FALSE
COMPLETE=TRUE
OWN ̲SDID.OUTPUTTER.BUFFER ̲ENTRY=OWN ̲SDID.OUTPUTTER.SPI.BUFFER
̲ENTRY
SHIP ̲CANCEL ̲OUTPUT () ()
Figure 4.1.5.4.5.6-5
CANCEL ̲WAIT ̲COMPLETION ̲OUTPUT (QEL) ()
CASE EXTRACT ̲SPECIFIED (QEL,OWN ̲SDID.OUTPUTTER. WAIT
̲COMPLETION) () OF
FAIL ? PROTOCOL ̲ERROR (OUTPUTTER ̲6 ̲6)
PASS ?
END CASE
RETURN
Figure 4.1.5.4.5.6-6
SHIP ̲CANCEL ̲OUTPUT () ()
BUFFER ̲REF=OWN ̲SDID.OUTPUTTER.BUFFER ̲ENTRY
BUFFER ̲REF.BUFFER ̲SIZE=SIZE ̲OF ̲CANCEL ̲OUTPUT
BUFFER=BUFFER ̲REF.PAGE ̲START
START=BUFFER ̲REF.BUFFER ̲ADDR
BUFFER(START+BUFFER ̲TYPE ̲OFFSET)=CONTROL,ENTIRE ̲LDU
BUFFER (START+CONTROL ̲REQUEST ̲OFFSET)=CANCEL ̲OUTPUT
̲REQUEST
BUFFER (START+CANCEL ̲OUTPUT ̲LDU ̲OFFSET)=OWN ̲SDID.OUTPUTTER.LDU
OWN ̲SDID.OUTPUTTER.SPI.BUFFER ̲ENTRY=BUFFER ̲REF
ACTIVATE ̲SUBDEVICE ̲SPI(OWN ̲SDID.PARENT ̲SDID, TRANSMIT
̲OUTPUT ̲BUFFER, OWN ̲SDID.OUTPUTTER.SPI) (CCP)
RETURN
Figure 4.1.5.4.5.6-7
4.1.5.5 U̲S̲E̲R̲ ̲I̲N̲T̲E̲R̲F̲A̲C̲E̲ ̲M̲o̲d̲u̲l̲e̲
4.1.5.5.1 F̲u̲n̲c̲t̲i̲o̲n̲a̲l̲ ̲S̲p̲e̲c̲i̲f̲i̲c̲a̲t̲i̲o̲n̲
The USER ̲INTERFACE handles the TMS requests for input
and output. INPUT to TMS is performed by TMS calling
the protocol handler through the entry ENABLE ̲INPUT.
On the first call of ENABLE ̲INPUT the USER ̲INTERFACE
Module calls the INPUTTER to obtain an input request
buffer. The INPUTTER may queue the request or may deliver
the buffer immediately. When the buffer for input request
is available the USER ̲INTERFACE loads it with information
specifying the request and sends it to the INPUTTER.
From now on the USER ̲INTERFACE simply awaits input.
Whenever input data for this requested LDU arrives
it is handed to TMS if TMS has a pending request or
the data is queued on the DATA ̲Q. TMS issues series
of ENABLE-INPUT request each indicating the amount
of data requested. The USER ̲INTERFACE either hands
full input buffer to TMS or if the request calls for
less data than a full buffer, part of a buffer. When
part of a buffer has been returned the next request
get either a new part of the buffer or the rest of
the buffer.
Whenever type END ̲OF ̲LDU or ENTIRE ̲LDU has been returned
to TMS, or the input has been abnormally terminated
(result) the next ENABLE ̲INPUT is considered as the
socalled first (see above).
Whenever TMS has cancelled an input request the USER-INTERFACE
calls the INPUTTER with cancel and releases any data
in the DATA ̲Q. A possible input request buffer is released
by the INPUTTER. Upon a cancel TMS shall be notified
asynchronously if the last TMS request was answered
request queued.
OUTPUT from TMS is performed by TMS calling GET ̲OUTPUT
̲BUFFER. Upon the first call of GET ̲OUTPUT ̲BUFFER (i.e.
initialization, a completed output or a cancelled output)
the USER ̲INTERFACE calls the OUTPUTTER by REQUEST ̲DATA
̲OUTPUT. The OUTPUTTER may queue the request or hand
an output buffer immediately. In the first buffer obtained
the USER ̲INTERFACE must have room for LDU header and
therefore modify buffer address and size before returning
it to TMS. Buffers are immediately returned to TMS
in the call of GET ̲OUTPUT ̲BUFFER if they are available.
If the USER ̲INTERFACE is asynchronously notified of
the buffer, it is handled to TMS by asynchronous response.
Whenever the USER ̲INTERFACE has obtained the first
output buffer and until the last part of a LDU is sent
the OUTPUTTER only outputs data for the USER ̲INTERFACE.
Subsequent buffers are reserved by calling REQUEST
̲NEXT ̲BUFFER.
When the output of one LDU is completed, the USER ̲INTERFACE
may immediately start the next output. There may be
as many outstanding outputs as there are queue elements
in the EMPTY queue.
Whenever later on LTU/LTUX has successfully transmitted
the LDU the transmission status buffer completing the
LDU is handed by the OUTPUTTER and TMS is informed
of the result.
The functions performed are identified by the entry
points (Refer section 4.1.5.5.2).
4.1.5.5.2 M̲o̲d̲u̲l̲e̲ ̲I̲n̲t̲e̲r̲f̲a̲c̲e̲
The USER ̲INTERFACE is called via one of the following:
ENABLE ̲INPUT(PARS:ENABLE ̲PARAM)(CC:COMPLETION ̲CODE)
ACK ̲DATA ̲INPUT () ()
NOTIFY ̲USER ̲INPUT ̲REQUEST ̲BUFFER(QEL:IO ̲QEL,BUFFER
̲REF:POINTER) ()
USER ̲INPUT ̲RESULT(QEL:IO ̲QEL,BUFFER ̲REF:POINTER) ()
GET ̲OUTPUT ̲BUFFER(PARS:GET ̲BUFFER ̲PARAM) (CC:COMPLETION
̲CODE)
NOTIFY ̲USER ̲FIRST ̲OUTPUT ̲BUFFER(QEL:IO ̲QEL,BUFFER ̲REF:POINTER)
()
NOTIFY ̲USER ̲SUBSEQUENT ̲OUTPUT ̲BUFFER(QEL:IO ̲QEL,BUFFER
̲REF:POINTER) ()
USER ̲OUTPUT(PARAMS:INIT ̲OUTPUT ̲PARAM)(CC:COMPLETION
̲CODE)
USER ̲OUTPUT ̲RESULT(QEL:IO ̲QEL,RESULT:COMPLETION ̲CODE)
()
NOTIFY ̲USER ̲FIRST ̲INPUT ̲DATA(QEL:IO ̲QEL,BUFFER ̲ENTRY:POINTER)
()
NOTIFY ̲USER ̲INPUT ̲DATA(QEL:IO ̲QEL,BUFFER ̲ENTRY:POINTER)()
CANCEL ̲USER ̲OPERATION(QEL) ()
INITIALIZE ̲USER ̲DATA(PARAMS:OPEN ̲SUBDEVICE ̲PARAM)()
CLEAN ̲USER ̲DATA ()()
The USER ̲INTERFACE calls following functional entries
to other modules:
REQUEST ̲DATA ̲INPUT(QEL:IO ̲QEL,PRIORITY:PRIORITY ̲TYPE)
(CC:COMPLETION ̲CODE,BUFFER ̲REF:POINTER)
SEND ̲INPUT ̲REQUEST(SIZE:INTEGER) ()
RELEASE ̲INPUT ̲BUFFER(BUFFER ̲REF:POINTER) ()
LOAD ̲BUFFER ̲RETURN(PARS:GET ̲BUFFER ̲PARAM) ()
REQUEST ̲DATA ̲OUTPUT(QEL:IO ̲QEL,PRIORITY:PRIORITY ̲TYPE)
(CC:COMPLETION ̲CODE,BUFFER ̲REF:POINTER)
REQUEST ̲NEXT ̲BUFFER () (CC:COMPLETION ̲CODE,BUFFER ̲REF:POINTER)
SEND ̲OUTPUT ̲BUFFER(TYPE:BUFFER ̲TYPES,BYTE ̲COUNT:INTEGER)()
Furthermore:
PROTOCOL ̲ERROR
SEND ̲OPERATIONS ̲REPLY
QUEUE
INIT ̲QD
EXTRACT ̲FIRST
RETURN ̲FIRST ̲DATABUFFER
RETURN ̲NEXT ̲DATABUFFER
LOAD ̲CANCEL ̲REPLY
4.1.5.5.3 M̲o̲d̲u̲l̲e̲ ̲C̲o̲m̲p̲o̲n̲e̲n̲t̲s̲
E̲n̲t̲r̲y̲ ̲P̲o̲i̲n̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
B̲a̲s̲i̲c̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
INITIALIZE ̲USER ̲DATA section 5.1
CLEAN ̲USER ̲DATA section 5.1
I̲n̲p̲u̲t̲ ̲r̲e̲q̲u̲e̲s̲t̲ ̲p̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
ENABLE ̲INPUT section 5.2
ACK ̲DATA ̲INPUT section 5.2
O̲u̲t̲p̲u̲t̲ ̲R̲e̲q̲u̲e̲s̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
GET ̲OUTPUT ̲BUFFER section 5.3
USER ̲OUTPUT section 5.3
C̲a̲n̲c̲e̲l̲
CANCEL ̲USER ̲OPERATION section 5.4
O̲U̲T̲P̲U̲T̲T̲E̲R̲ ̲N̲o̲t̲i̲f̲i̲c̲a̲t̲i̲o̲n̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
NOTIFY ̲USER ̲FIRST ̲OUTPUT ̲BUFFER section 5.5
NOTIFY ̲USER ̲SUBSEQUENT ̲OUTPUT ̲BUFFER section 5.5
USER ̲OUTPUT RESULT section 5.5
I̲N̲P̲U̲T̲T̲E̲R̲ ̲N̲o̲t̲i̲f̲i̲c̲a̲t̲i̲o̲n̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
NOTIFY ̲USER ̲INPUT ̲REQUEST ̲BUFFER section 5.6
NOTIFY ̲USER ̲FIRST ̲INPUT ̲DATA section 5.6
NOTIFY ̲USER ̲INPUT ̲DATA section 5.6
USER ̲INPUT ̲RESULT section 5.6
C̲o̲m̲p̲o̲n̲e̲n̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
I̲n̲p̲u̲t̲ ̲H̲a̲n̲d̲l̲i̲n̲g̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
SETUP ̲INPUT ̲REQUEST section 5.7
RETURN ̲DATA section 5.7
RETURN ̲RESULT section 5.7
NEXT ̲DATA ̲QEL section 5.7
O̲u̲t̲p̲u̲t̲ ̲H̲a̲n̲d̲l̲i̲n̲g̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
RETURN-OUTPUT ̲RESULT section 5.8
C̲a̲n̲c̲e̲l̲ ̲S̲u̲p̲p̲o̲r̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
CANCEL ̲USER ̲INPUT section 5.9
CANCEL ̲USER ̲OUTPUT section 5.9
EMPTY ̲DATA ̲Q section 5.9
O̲p̲t̲i̲o̲n̲a̲l̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲ section 5.10
4.1.5.5.4 D̲a̲t̲a̲ ̲D̲e̲s̲c̲r̲i̲p̲t̲i̲o̲n̲
TYPE USER ̲DATA=RECORD
INPUT : USER ̲INPUT ̲DATA
OUTPUT : USER ̲OUTPUT ̲DATA
END
TYPE USER ̲INPUT ̲DATA=RECORD
STATE : (IDLE,
AWAIT ̲DATA,
PENDING ̲RESULT,"ERROR RECEIVED"
COMPLETE, "End of LDU returned
RESULT ̲RETURNED)
BUF ̲SIZE:INTEGER "Requestors buffer size"
REQUEST ̲STATUS:ACTIVITY
QEL: IO ̲QEL
DATA ̲Q: QD "Queue of data, not yet returned
to requestor
DATA ̲Q ̲SIZE: INTEGER
PART ̲BUFFER ̲OFFSET:INTEGER
PART ̲BUFFER ̲LENGTH:INTEGER
PART ̲BUFFER ̲RET:BOOLEAN
RESULT:COMPLETION ̲CODE
END
STATE Gives the state of current LDU input
BUF ̲SIZE The TMS buffer size as specified in last
ENABLE-INPUT
REQUEST Specifies if there exists an unanswered
TMS
STATUS request. In such cases a cancel shall lead
to asynchronous response.
QEL IO ̲QEL holding the one possible pending/ongoing
input request
DATA ̲Q, Holds databuffers received from lower
DATA ̲Q ̲SIZE level/LTU/LTUR for the case that subsequent
TMS requests do not arrive fast enough.
PART ̲ Holds information of what is left in an
BUFFER inputbuffer
not
completely
returned
to
TMS.
RESULT Holds the result as of a reception status.
The result is returned to TMS after all
data has been transferred since TMS will
not transfer data and result in the same
request.
TYPE USER ̲OUTPUT ̲DATA=RECORD
STATE:ACTIVITY "Indicates if LDU is in
process of being output.
EMPTY:QD
QELS :ARRAY(1..MAX ̲USER ̲OUTPUTS)
OF IO ̲QEL
ACTIVE: INTEGER
END
STATE Indicated status of a LDU actually being
output, but may be idle even when transmission
status is pending.
EMPTY,QELS Queue of nonused output requests (one queue
element used per pending/ongoing/nonacknow-
ledged LDU)
ACTIVE Pointer to active QEL, valid when STATE
is ACTIVE
The field ADDI of the QEL is used to indicate
if TMS has a pending request for this output.
4.1.5.5.5 M̲o̲d̲u̲l̲e̲ ̲D̲e̲s̲i̲g̲n̲
4.1.5.5.5.1 B̲a̲s̲i̲c̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are: INITIALIZE ̲USER ̲DATA
CLEAN ̲USER ̲DATA
INITIALIZE ̲USER ̲DATA(PARAM:OPEN ̲SUBDEVICE ̲PARAM)()
input
OWN ̲SDID.USER.INPUT.STATE=IDLE
OWN ̲SDID.USER.INPUT.REQ ̲STATE=IDLE
INIT ̲QD(OWN ̲SDID.USER.INPUT.DATA ̲Q)()
OWN ̲SDID.USER.INPUT.DATA ̲Q ̲SIZE=0
OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲RET=FALSE
output
OWN ̲SDID.USER.OUTPUT.STATE=IDLE
INIT ̲QD (OWN ̲SDID.USER.OUTPUT.EMPTY) ()
INDEX=1
LOOP
INSERT(OWN ̲SDID.USER.OUTPUT.EMPTY,
OWN ̲SDID.USER.OUTPUT.QELS(INDEX))()
INDEX GE MAX ̲USER ̲OUTPUTS?
INDEX+1
END LOOP
RETURN
Figure 4.1.5.5.5.1-1
CLEAN ̲USER ̲DATA () ()
Release buffer resources
Output buffer and input request buffer released
by OUTPUTTER and INPUTTER.
EMPTY ̲DATA ̲Q () ()
RETURN
Figure 4.1.5.5.5.1-2
4.1.5.5.5.2 I̲n̲p̲u̲t̲ ̲R̲e̲q̲u̲e̲s̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are: ENABLE ̲INPUT
ACK ̲DATA ̲INPUT
ENABLE ̲INPUT(PARS:ENABLE ̲PARAM)(CC:COMPLETION ̲CODE)
TMS only requests one buffer at a time
OWN ̲SDID.USER.INPUT.REQ ̲STATE=ACTIVE
OWN ̲SDID.USER.INPUT.BUF ̲SIZE=
PARS.BUF ̲SIZE
PAR.H ̲OPID=OWN ̲SDID.USER.INPUT.QEL
OWN ̲SDID.USER.INPUT.STATE
NE IDLE?
S̲E̲T̲U̲P̲ ̲I̲N̲P̲U̲T̲ ̲2̲ G̲E̲T̲ ̲N̲E̲X̲T̲ ̲I̲N̲P̲U̲T̲ ̲B̲U̲F̲F̲E̲R̲
̲3̲
RETURN
Figure 4.1.5.5.5.2-1
S̲E̲T̲U̲P̲ ̲I̲N̲P̲U̲T̲ ̲2̲ ̲
EQVIVALENCE (OWN ̲SDID.USER.INPUT.QEL,QEL:IO ̲QEL)
QEL.REQ ̲REF=PARS.OPID
QEL.REQUESTOR=USER
REQUEST ̲DATA ̲INPUT(QEL,USER ̲PRIORITY)(CCP,BUFFER ̲REF)
CCP NE OK ? CC=CCP
SETUP ̲INPUT ̲REQUEST (QEL,BUFFER ̲REF) (SIZE)
OWN ̲SDID.USER.INPUT.STATUS=AWAIT ̲DATA
SEND ̲INPUT ̲REQUEST (SIZE) ()
CC= REQUEST ̲QUEUED
Figure 4.1.5.5.5.2-2
G̲E̲T̲ ̲N̲E̲X̲T̲ ̲I̲N̲P̲U̲T̲ ̲B̲U̲F̲F̲E̲R̲ ̲3̲
Data ?
OWN ̲SDID.USER.INPUT. ?
DATA ̲Q ̲SIZE LE ZERO Pending Result ?
Put data references OWN ̲SDID.USER.INPUT? CC=REQUEST
in Reply STATE NE PENDING ̲RESULT ̲QUEUED
RETURN ̲DATA () () RETURN ̲RESULT()()
Load return parameters
PARS.BYTE ̲COUNT=OWN ̲SDID.
REPLY.BYTE ̲COUNT
PARS.PAGE ̲ADDR=
OWN ̲SDID.REPLY.PAGE ̲ADDR
PARS.BYTE ̲ADDR=
OWN ̲SDID.REPLY.BYTE ̲ADDR
PARS.BUFFER ̲TYPE=
OWN ̲SDID.REPLY.BUFFER ̲TYPE
CC=OWN ̲SDID.REPLY.RESULT
Figure 4.1.5.5.5.3
ACK ̲DATA ̲I̲NPUT() ()
Was Result returned ?
OWN ̲SDID.USER.INPUT.STATE ? OWN ̲SDID.USER.INPUT.
STATE=IDLE
Was only part buffer returned ?
OWN ̲SDID.USER.INPUT.PART ̲
BUFFER ̲RET ?
Release buffer
CASE EXTRACT ̲FIRST(OWN ̲SDID.USER.INPUT.DATA ̲Q)(BUF)OF
FAIL? PROTOCOL ̲ERROR(USER ̲IF ̲2 ̲4)
PASS?
END CASE
OWN ̲SDID.USER.INPUT.DATA ̲Q ̲SIZE-1
RELEASE ̲INPUT ̲BUFFER(BUF) ()
OWN ̲SDID.USER.INPUT.? OWN ̲SDID.USER.
STATE EQ COMPLETE INPUT.STATE=IDLE
RETURN
Figure 4.1.5.5.5.2-4
4.1.5.5.5.3 O̲u̲t̲p̲u̲t̲ ̲R̲e̲q̲u̲e̲s̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are: GET ̲OUTPUT ̲BUFFER
USER ̲OUTPUT
GET ̲OUTPUT ̲BUFFER(PARS:GET ̲BUFFER ̲PARAM)(CC:COMPLETION
̲CODE)
Only one request at a time, but several completed
outputs may wait for answers
OWN ̲SDID.USER.OUTPUT.STATE?
NE IDLE
S̲E̲T̲U̲P̲ ̲O̲U̲T̲P̲U̲T̲ ̲2̲ R̲E̲Q̲U̲E̲S̲T̲ ̲N̲E̲X̲T̲
̲B̲U̲F̲F̲E̲R̲ ̲3̲ ̲
RETURN
Figure 4.1.5.5.5.3-1
S̲E̲T̲U̲P̲ ̲O̲U̲T̲P̲U̲T̲ ̲2̲
CASE EXTRACT ̲FIRST(OWN ̲SDID.USER.OUTPUT.EMPTY)(QEL)OF
FAIL? CC=TOO ̲MANY ̲REQUESTS
PASS?
END CASE
OWN ̲SDID.USER.OUTPUT.STATE=ACTIVE
QEL.ADDI=ACTIVE
QEL.REQ ̲REF= PARS.OPID
QEL.REQESTEOR=USER
OWN ̲SDID.USER.OUTPUT.ACTIVE=QEL
REQUEST ̲DATA ̲OUTPUT(QEL,USER ̲PRIORITY)(CCP,BUFFER ̲REF)
CCP NE OK ? CC=CCP
RETURN ̲FIRST ̲DATABUFFER(QEL,BUFFER ̲REF) ()
QEL.ADDI=IDLE
LOAD ̲BUFFER ̲RETURN(PARS) ()
CC=OK
Figure 4.1.5.5.5.3-2
R̲E̲Q̲U̲E̲S̲T̲ ̲N̲E̲X̲T̲ ̲B̲U̲F̲F̲E̲R̲ ̲3̲
QEL=OWN ̲SDID.USER.OUTPUT.ACTIVE
QEL.ADDI=ACTIVE
REQUEST ̲NEXT ̲BUFFER()(CCP,BUFFER ̲REF)
CCP NE OK ? CC=CCP
RETURN ̲NEXT ̲DATABUFFER(QEL,BUFFER ̲REF)()
QEL.ADDI=IDLE
LOAD ̲BUFFER ̲RETURN (PARS) ()
CC=OK
Figure 4.1.5.5.5.3-3
USER ̲OUTPUT(PARMS:INIT ̲OUTPUT ̲PARAM)(CC:COMPLETION
̲CODE)
TYPE=PARMS.BUFFER ̲TYPE
TYPE IS ENTIRE ̲LDU ?
OR START ̲OF ̲LDU
ADD=LDU ̲DATA ̲OFFSET ADD=START ̲LDU
̲DATA ̲OFFSET
BYTE ̲COUNT=PARMS.BYTE ̲COUNT+ADD
TYPE INDICATES END OF DATA ?
OWN ̲SDID.USER.OUTPUT.
STATE=IDLE
SEND ̲OUTPUT ̲BUFFER(TYPE,BYTE ̲COUNT) ()
All responses to outputs are asynchronous
CC=REQUEST ̲QUEUED
OWN ̲SDID.USER.OUTPUT.ACTIVE.ADDI=ACTIVE
RETURN
Figure 4.1.5.5.5.3-4
4.1.5.5.5.4 C̲a̲n̲c̲e̲l̲
This is: CANCEL ̲USER ̲OPERATION
CANCEL ̲USER ̲OPERATION (QEL:IO ̲QEL) ()
QEL EQ OWN ̲SDID. ?
USER.INPUT.QEL
CANCEL ̲USER ̲OUTPUT (QEL) () CANCEL ̲USER ̲INPUT(QEL)()
RETURN
Figure 4.1.5.5.5.4-1
4.1.5.5.5.5 O̲U̲T̲P̲U̲T̲T̲E̲R̲ ̲N̲o̲t̲i̲f̲i̲c̲a̲t̲i̲o̲n̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These Are: NOTIFY ̲USER ̲FIRST ̲OUTPUT ̲BUFFER
NOTIFY ̲USER ̲SUBSEQUENT ̲OUTPUT ̲BUFFER
USER ̲OUTPUT ̲RESULT
NOTIFY ̲USER ̲FIRST ̲OUTPUT ̲BUFFER
(QEL:IO ̲QEL,BUFFER ̲REF:POINTER) ()
OWN ̲SDID.USER.OUTPUT.STATE=ACTIVE
RETURN ̲FIRST ̲DATABUFFER(QEL,BUFFER ̲REF) ()
QEL.ADDI=IDLE
SEND ̲OPERATIONS ̲REPLY () ()
RETURN
Figure 4.1.5.5.5.5-1
NOTIFY ̲USER ̲SUBSEQUENT ̲OUTPUT ̲BUFFER (QEL: IA ̲QEL,
BUFFER ̲REF:
POINTER)()
RETURN ̲NEXT ̲DATA ̲BUFFER (QEL, BUFFER ̲REF)()
QEL.ADDI = IDLE
SEND ̲OPERATIONS ̲REPLY ()()
RETURN
Figure 4.1.5.5.5.5-2
USER ̲OUTPUT ̲RESULT(QEL:TO ̲QEL, BUFFER ̲ENTRY(POINTER)()
Release queue element
QUEUE (OWN ̲SDID.USER.OUTPUT.EMPTY, QEL)()
QEL.REQUESTOR = NONE
QEL.ADDI = IDLE
RETURN ̲OUTPUT ̲RESULT (QEL, BUFFER ̲ENTRY)
SEND ̲OPERATIONS ̲REPLY()()
RELEASE ̲INPUT ̲BUFFER (BUFFER ̲ENTRY)()
RETURN
Figure 4.1.5.5.5.5-3
4.1.5.5.5.6 I̲N̲P̲U̲T̲T̲E̲R̲ ̲N̲o̲t̲i̲f̲i̲c̲a̲t̲i̲o̲n̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are
NOTIFY ̲USER ̲INPUT ̲REQUEST ̲BUFFER
NOTIFY ̲USER ̲FIRST ̲INPUT ̲DATA
NOTIFY ̲USER ̲INPUT ̲DATA,
USER ̲INPUT ̲RESULT
NOTIFY ̲USER ̲INPUT ̲REQUEST ̲BUFFER(QEL,BUFFER ̲REF)(
)
SETUP ̲INPUT ̲REQUEST (QEL, BUFFER ̲REF) (SIZE)
SEND ̲INPUT ̲REQUEST (SIZE) ( )
RETURN
Fig. 4.1.5.5.6-1
USER ̲INPUT ̲RESULT (QEL: IO ̲QEL,
BUFFER ̲ENTRY: POINTER) ( )
QEL.REQUESTOR = NONE
BUFFER = BUFFER ̲ENTRY.PAGE ̲START
START = BUFFER ̲ENTRY.BUFFER ̲ADDR
RESULT = BUFFER (START + RECEPTION ̲START ̲CODE ̲OFFSET)
OWN ̲SDID.USER.INPUT.RESULT = RESULT
OWN ̲SDID.USER.INPUT.STATE = PENDING ̲RESULT
Data awaited ?
OWN ̲SDID.USER.INPUT.DATA ̲Q ̲SIZE GE 1?
OWN ̲SDID.USER.INPUT.REQUEST ̲STATUS ?
EQ IDLE No
data
awaited
RETURN ̲RESULT ( ) ( )
SEND ̲OPERATIONS ̲REPLY ( ) ( )
RELEASE ̲INPUT ̲BUFFER (BUFFER ̲ENTRY) ( )
RETURN
Fig. 4.1.5.5.5.6-2
NOTIFY ̲USER ̲FIRST ̲INPUT ̲DATA (QEL: IO ̲QEL,
BUFFER
̲ENTRY:
POINTER)
NOTIFY ̲USER ̲INPUT ̲DATA (QEL, BUFFER ̲ENTRY) ( )
RETURN
Fig. 4.1.5.5.5.6-3
NOTIFY ̲USER ̲INPUT ̲DATA (QEL: IO ̲QEL, BUFFER ̲ENTRY:
POINTER) ( )
INSERT (BUFFER ̲ENTRY, OWN ̲SDID.USER.INPUT.DATA
̲Q)
OWN ̲SDID.USER.INPUT.DATA ̲Q ̲SIZE+1
IS DATA ̲Q ̲SIZE GT 1?
NEXT ̲DATA ̲QEL ( ) ( )
No request just now
OWN ̲SDID.USER.INPUT.
REQUEST ̲STATUS EQ IDLE ?
Setup reply parameters
RETURN ̲DATA ( ) ( )
SEND ̲OPERATIONS ̲REPLY ( ) ( )
RETURN
Fig. 4.1.5.5.5.6-4
USER ̲INPUT ̲RESULT (QEL: IO ̲QEL, BUFFER ̲ENTRY:
POINTER) ( )
QEL.REQUESTOR = NONE
BUFFER = BUFFER ̲ENTRY.PAGE ̲START
START = BUFFER ̲ENTRY.BUFFER ̲ADDR
RESULT = BUFFER (START + RECEPTION ̲STATUS ̲CODE
̲OFFSET)
OWN ̲SDID.USER.INPUT.RESULT = RESULT
OWN ̲SDID.USER.INPUT.STATE = PENDING ̲RESULT
Data awaited?
OWN ̲SDID.USER.INPUT.DATA-Q ̲SIZE GE 1?
OWN ̲SDID.USER.INPUT.REQUEST ̲STATE EQ IDLE ? No
data
awaited
RETURN ̲INPUT ̲RESULT ( ) ( )
SEND ̲OPERATIONS ̲REPLY ( ) ( )
RELEASE ̲INPUT ̲BUFFER (BUFFER ̲ENTRY) ( )
RETURN
Fig. 4.1.5.5.5.6-5
4.1.5.5.5.7 I̲n̲p̲u̲t̲ ̲H̲a̲n̲d̲l̲i̲n̲g̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are SETUP
̲INPUT
̲REQUEST
RETURN
̲DATA
RETURN
̲RESULT
NEXT
̲DATA
̲QEL
SETUP ̲INPUT ̲REQUEST (QEL: IO ̲QEL,BUFFER ̲REF: POINTER)
(SIZE: INTEGER)
This routine is used to load additional
parameters into the input request, some
protocols do this. For other protocols
it is empty.
SIZE = 0
RETURN
Fig. 4.1.5.5.5.7-1
RETURN ̲DATA ( ) ( )
Point to buffer as handed by Parent
BUFFER = OWN ̲SDID.USER.INPUT.DATA ̲Q.EP.PAGE
̲START
START = OWN ̲SDID.USER.INPUT.DATA ̲Q.EP.BUFFER
̲ADDR
LDU ̲TYPE = BUFFER (START + BUFFER ̲TYPE ̲OFFSET)
LDU ̲TYPE EQ START ̲OF ̲LDU?
LDU ̲TYPE EQ PART ̲OF ̲LDU?
The available buffer is last in LDU
Can one return all of it ?
OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲SIZE
GT OWN ̲SDID.USER.INPUT.BUF ̲SIZE?
R̲E̲T̲U̲R̲N̲ ̲L̲A̲S̲T̲ ̲D̲A̲T̲A̲ ̲3̲ R̲E̲T̲U̲R̲N̲
̲M̲I̲D̲ ̲O̲R̲ ̲F̲I̲R̲S̲T̲ ̲D̲A̲T̲A̲ ̲4̲
OWN ̲SDID.USER.INPUT.STATE = COMPLETE
OWN ̲SDID.REPLY.RESULT = OK
OWN ̲SDID.REPLY.H ̲OPTO = OWN ̲SDID.USER.INPUT.QEL
OWN ̲SDID.REPLY.OPID = OWN ̲SDID.USER.INPUT.QEL.REQ
̲REF
OWN ̲SDID.USER.INPUT.REQUEST ̲STATUS = IDLE
RETURN
Fig. 4.1.5.5.5.7-2
R̲E̲T̲U̲R̲N̲ ̲L̲A̲S̲T̲ ̲D̲A̲T̲A̲ ̲3̲
OWN ̲SDID.REPLY.BUFFER ̲TYPE = LDU ̲TYPE
OWN ̲SDID.REPLY.PAGE ̲ADDR
= OWN ̲SDID.USER.INPUT.DATA ̲Q.EP.PAGE ̲ADDR
OWN ̲SDID.REPLY.BYTE ̲ADDR
= OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲OFFSET
OWN ̲SDID.REPLY.BYTE ̲COUNT
= OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲SIZE
OWN ̲SDID.USER.INPUT PART ̲BUFFER ̲RET = FALSE
Fig. 4.1.5.5.5.7-3
R̲E̲T̲U̲R̲N̲ ̲M̲I̲D̲ ̲O̲R̲ ̲F̲I̲R̲S̲T̲ ̲D̲A̲T̲A̲ ̲4̲
OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲RET ?
LDU ̲TYPE NE ̲START ̲OF ̲LDU ?
TYP = START ̲OF ̲LDU TYP
=
PART
̲OF
̲LDU
OWN ̲SDID.REPLY.BUFFER ̲TYPE = TYP
OWN ̲SDID.REPLY.PAGE ̲ADDR =
OWN ̲SDID.USER.INPUT.DATA ̲Q.EP.PAGE ̲ADDR
OWN ̲SDID.REPLY.BYTE ̲ADDR =
OWN ̲SDID.USER.PART ̲BUFFER ̲OFFSET
OWN ̲SDID.USER.INPUT.BUF ̲SIZE GE
OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲SIZE ?
Part Buffer Return
OWN ̲SDID.REPLY.BYTE ̲COUNT =
OWN ̲SDID.USER.INPUT.BUF ̲SIZE
Reduce size of left over data
OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲SIZE-
OWN ̲SDID.USER.INPUT.BUF ̲SIZE
OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲OFFSET +
OWN ̲SDID.USER.INPUT.BUF ̲SIZE
Mark part buffer return
OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲RET = TRUE
Return rest of buffer
OWN ̲SDID.REPLY.BYTE ̲COUNT =
OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲SIZE
Mark that all of buffer returned
OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲RET = FALSE
Fig. 4.1.5.5.5.7-4
RETURN ̲RESULT ( ) ( )
Result is returned to TMS after last data
since this will ensure, that the application
gets all data
OWN ̲SDID.REPLY.RESULT =
OWN ̲SDID.USER.INPUT.RESULT
OWN ̲SDID.REPLY.BYTE ̲COUNT = ZERO
OWN ̲SDID.USER.INPUT.STATE = RESULT ̲RETURNED
OWN ̲SDID.REPLY.H ̲OPID = OWN ̲SDID.USER.INPUT.QEL
OWN ̲SDID.REPLY.OPID = OWN ̲SDID.USER.INPUT.QEL.REQ
̲REF
OWN ̲SDID.USER.INPUT.REQUEST ̲STATUS = IDLE
RETURN
Fig. 4.1.5.5.5.7-5
NEXT ̲DATA ̲QEL ( ) ( )
QEL = OWN ̲SDID.USER.INPUT.EP
BUFFER = QEL.PAGE ̲START
START = QEL.BUFFER ̲ADDR
BUFFER(START+BUFFER ̲TYPE ̲OFFSET)
INDICATE START OF DATA?
OFFSET = OFFSET
=
LDU ̲DATA ̲OFFSET START
̲LDU
̲DATA
̲OFFSET
OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲OFFSET =
START + OFFSET
OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲LENGTH =
QEL.BUFFER ̲SIZE-OFFSET
OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲RET =
FALSE
RETURN
Fig. 4.1.5.5.5.7-6
4.1.5.5.5.8 O̲u̲t̲p̲u̲t̲ ̲H̲a̲n̲d̲l̲i̲n̲g̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
This is RETURN ̲OUTPUT ̲RESULT.
RETURN ̲OUTPUT ̲RESULT (QEL: IO ̲QEL, BUFFER ̲REF:
POINTER) ( )
OWN ̲SDID.REPLY.OPID = QEL.REQ ̲REF
OWN ̲SDID.REPLY.H ̲OPID = QEL
BUFFER = BUFFER ̲REF.PAGE ̲START
START = BUFFER ̲REF.BUFFER ̲ADDR
RESULT = BUFFER (START + TRANSMISSION ̲STATUS ̲CODE
̲OFFSET)
OWN ̲SDID.REPLY.RESULT = RESULT
RETURN
Fig. 4.1.5.5.5.8-1
4.1.5.5.5.9 C̲a̲n̲c̲e̲l̲ ̲S̲u̲p̲p̲o̲r̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are CANCEL ̲USER ̲INPUT
CANCEL ̲USER ̲OUTPUT
EMPTY ̲DATA ̲Q
CANCEL ̲USER ̲INPUT (QEL: IO ̲QEL) ( )
CANCEL ̲INPUT (QEL) ( )
EMPTY ̲DATA ̲Q ( ) ( )
QEL.REQUESTOR = NONE
OWN ̲SDID.USER.INPUT.PART ̲BUFFER ̲RET = FALSE
Pending request, answer TMS
OWN ̲SDID.USER.INPUT.REQUEST ̲STATUS EQ IDLE?
OWN ̲SDID.USER.INPUT.RESULT = CANCELLED
RETURN ̲RESULT ( ) ( )
SEND ̲OPERATIONS ̲REPLY ( ) ( )
OWN ̲SDID.USER.INPUT ̲STATE = IDLE
RETURN
Fig. 4.1.5.5.5.9-1
CANCEL ̲USER ̲OUTPUT (QEL: IO ̲QEL) ( )
CANCEL ̲OUTPUT (QEL) ( )
QEL.REQUESTOR = NONE
QEL.ADDI NE ACTIVE ?
TMS requires response
LOAD ̲CANCEL ̲REPLY (QEL) ( )
QEL.ADDI = IDLE
SEND ̲OPERATIONS ̲REPLY ( ) ( )
OWN ̲SDID.USER.OUTPUT.STATE = IDLE
RETURN
Fig. 4.1.5.5.5.9-2
EMPTY ̲DATA ̲Q ( ) ( )
LOOP
CASE EXTRACT ̲FIRST (OWN ̲SDID.USER.INPUT.DATA
̲Q)(BUF) OF
FAIL ?
PASS ? RELEASE ̲INPUT ̲BUFFER (BUF) ( )
END CASE
END LOOP
OWN ̲SDID.USER.INPUT.DATA ̲Q ̲SIZE = ZERO
RETURN
Fig. 4.1.5.5.5.9-3
4.1.5.5.5.10 O̲p̲t̲i̲o̲n̲a̲l̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
For protocols having the USER ̲INTERFACE module
generating protocol commands to the parent
protocol/LTU/LTUX, the response interface for
the PROT ̲CONT module must be implemented i.e.:
NOTIFY ̲USER ̲PROT ̲CONT ̲BUFFER and
USER ̲PROT ̲CONT ̲RESULT
must be included.
Protocols where this interface is missing must
omit the calls in the PROT ̲CONT module to avoid
software linkage errors.
4.1.5.6 C̲O̲N̲T̲R̲O̲L̲L̲E̲R̲ ̲M̲o̲d̲u̲l̲e̲
4.1.5.6.1 F̲u̲n̲c̲t̲i̲o̲n̲a̲l̲ ̲S̲p̲e̲c̲i̲f̲i̲c̲a̲t̲i̲o̲n̲
The CONTROLLER handles the TMS requests for control
of the protocol including asynchronous error reporting.
The CONTROLLER need not be present in all protocols.
Examples in CAMPS where omitted, are VDU ̲DATA protocol
and VDU ̲CONTROL protocol.
Three types of control may be performed.
- Subdevice control giving the requestor the possibility
to interact directly with the running protocol
for example to let the subdevice protocol execute
complex series of control commands to lower levels.
- Lower protocol control (which may be OUTPUT or
OUTPUT + INPUT) to let the control interface send
and receive control buffers of type "Protocol command",
"Protocol status" to/from LTU/LTUX firmware.
- External device. This gives full data communication
capability to the external device, like initialization
of VDU split settings, setting of MSP tabulation.
The error reporting function of the CONTROLLER schedules
errors by priority. It has a queue of one error, any
error with higher priority will overwrite this error.
The CONTROLLER interfaces with the SSC package of CAMPS
through data buffers, where the first word is the control
type.
Based on the control type, the CONTROLLER detects the
action to be taken. For type SUBDEVICE, it requests
the PROTOCOL module to take action, for type LOWER
̲PROTOCOL, the PROT ̲CONT module is requested to deliver
a control buffer for type EXTERNAL ̲DEVICE ̲INPUT, the
INPUTTER is activated, for type EXTERNAL ̲DEVICE ̲OUTPUT,
the OUTPUTTER is activated.
Control requests may output only or combined output-input.
External device input and lower protocol control are
always combined, others depend on the function. Wherever
input is required, the input request must be issued
by SSC before the output.
S̲U̲B̲D̲E̲V̲I̲C̲E̲ ̲C̲o̲n̲t̲r̲o̲l̲ ̲P̲r̲o̲c̲e̲s̲s̲i̲n̲g̲
The CONTROLLER requests the PROTOCOL module for a buffer
where to load the requestors data. When TMS requests
transmission, the PROTOCOL module is informed.
After having processed the data, the PROTOCOL activates
the CONTROLLER giving completion information. If the
completion information is more than just a completion
code and there is no pending input, the Control output
is considered failed.
"Missing input request".
For further details refer each protocol of the PROTOCOL
module.
L̲O̲W̲E̲R̲ ̲P̲R̲O̲T̲O̲C̲O̲L̲ ̲C̲o̲n̲t̲r̲o̲l̲ ̲P̲r̲o̲c̲e̲s̲s̲i̲n̲g̲
Lower protocol control processing. The controller
requests a buffer at the PROT ̲CONT module, hands it
to TMS, which after filling it sends it via CONTROLLER
and PROT ̲CONT to the Parent subdevice. If the control
is of type output only, the CONTROLLER notifies TMS
of the successful completion, if the control is of
type output + input, the CONTROLLER waits for response.
E̲X̲T̲E̲R̲N̲A̲L̲ ̲D̲E̲V̲I̲C̲E̲ ̲C̲o̲n̲t̲r̲o̲l̲ ̲P̲r̲o̲c̲e̲s̲s̲i̲n̲g̲
External device processing is very similar to the USER
̲INTERFACE module processing for data transport except
that an input request is generated after the control
header has been output and that the control header
is not handed on to INPUTTER or OUTPUTTER.
4.1.5.6.2 M̲o̲d̲u̲l̲e̲ ̲I̲n̲t̲e̲r̲f̲a̲c̲e̲
The CONTROLLER is called via one of the following:
INITIALIZE ̲CONTROLLER (PARAM: OPEN ̲SUBDEVICE
̲PARAM) ( )
GET ̲CONTROL ̲BUFFER (PARS: GET ̲BUFFER ̲PARAM)(CC:
COMPLETION ̲CODE)
CONTROLLER ̲OUTPUT (PARAMS: INIT ̲OUTPUT
̲PARAM)(CC: COMPLETION ̲CODE)
ENABLE ̲CONTROL ̲INPUT(PARS: ENABLE ̲PARAM)(CC:
COMPLETION ̲CODE)
NOTIFY ̲CONTROLLER ̲FIRST ̲OUTPUT ̲BUFFER
(QEL: IO ̲QEL,
BUFFER
̲REF:
POINTER)
(
)
NOTIFY ̲CONTROLLER ̲SUBSEQUENT ̲OUTPUT ̲BUFFER
(QEL:
IO
̲QEL,
BUFFER
̲REF:
POINTER)
(
)
CONTROLLER ̲INPUT ̲RESULT (QEL: IO ̲QEL,
BUFFER
̲ENTRY:
POINTER)
(
)
NOTIFY ̲CONTROLLER ̲INPUT ̲REQUEST ̲BUFFER
(QEL:
IO
̲QEL,
BUFFER
̲ENTRY:
POINTER)
(
)
NOTIFY ̲CONTROLLER ̲FIRST ̲INPUT ̲DATA
(QEL:
IO
̲QEL,
BUFFER
̲ENTRY:
POINTER)
(
)
NOTIFY ̲CONTROLLER ̲INPUT ̲DATA
(QEL:
IO
̲QEL,
BUFFER
̲ENTRY:
POINTER)
(
)
CONTROLLER ̲OUTPUT ̲RESULT
(QEL:
IO
̲QEL,
BUFFER
̲ENTRY:
POINTER)
(
)
NOTIFY ̲CONTROLLER ̲PROT ̲CONT ̲BUFFER
(QEL: IO ̲QEL,
BUFFER ̲ENTRY: POINTER) ( )
ACK ̲CONTROL ̲INPUT ( ) ( )
NOTIFY ̲CONTROLLER ̲PROTOCOL ̲BUFFER
(QEL: IO ̲QEL,
BUFFER ̲ENTRY: POINTER) ( )
CONTROLLER ̲PROT ̲CONT ̲RESULT (QEL: IO ̲QEL,
BUFFER ̲ENTRY: POINTER) ( )
CONTROLLER ̲PROTOCOL ̲RESULT (QEL: IO ̲QEL,
BUFFER ̲ENTRY: POINTER)()
CANCEL ̲CONTROLLER ̲OPERATION (QEL: IO ̲QEL)
( )
The CONTROLLER calls the following functional
entries to other protocol modules:
REQUEST ̲DATA ̲INPUT (QEL: IO ̲QEL, PRIORITY:
PRIORITY ̲TYPE)
(CC: COMPLETION ̲CODE, BUFFER
̲REF: POINTER)
SEND ̲INPUT ̲REQUEST (SIZE: INTEGER) ( )
CANCEL ̲INPUT (QEL: IO ̲QEL) ( )
RELEASE ̲INPUT ̲BUFFER (BUFFER ̲REF: POINTER)
( )
REQUEST ̲DATA ̲OUTPUT (QEL: IO ̲QEL, PRIORITY:
PRIORITY ̲TYPE)
(CC: COMPLETION ̲CODE, BUFFER
̲REF: POINTER)
REQUEST ̲NEXT ̲BUFFER ( ) (CC: COMPLETION ̲CODE,
BUFFER ̲REF: POINTER)
SEND ̲OUTPUT ̲BUFFER (TYPE: BUFFER ̲TYPES, BYTE
̲COUNT: INTEGER) ( )
CANCEL ̲OUTPUT (QEL: IO ̲QEL) ( )
REQUEST ̲PROT ̲CONT (QEL: IO ̲QEL, PRIORITY:
PRIORITY ̲TYPE)
(CC: COMPLETION ̲CODE, BUFFER
̲REF: POINTER)
SEND ̲PROT ̲CONT (RESPONSE: BOOLEAN, SIZE: INTEGER)
( )
CANCEL ̲PROT ̲CONT (QEL: IO ̲QEL) ( )
REQUEST ̲PROTOCOL (QEL: IO ̲QEL, PRIORITY: PRIORITY
̲TYPE)
(CC: COMPLETION ̲CODE, BUFFER
̲REF: POINTER)
SEND ̲PROTOCOL (CC: COMPLETION ̲CODE, BUFFER
̲REF: POINTER)()
CANCEL ̲PROTOCOL (QEL: IO ̲QEL) ( )
Furthermore
PROTOCOL ̲ERROR
SEND ̲OPERATIONS ̲REPLY
QUEUE
INIT ̲QD
EXTRACT ̲FIRST
RETURN ̲FIRST ̲DATA BUFFER
RETURN ̲NEXT ̲DATA BUFFER
LOAD ̲CANCEL ̲REPLY
RETURN ̲BUFFER