top - metrics - download
⟦1cd090af3⟧ Wang Wps File
Length: 38913 (0x9801)
Types: Wang Wps File
Notes: CPS/SDS/028
Names: »2017A «
Derivation
└─⟦6ff65156a⟧ Bits:30006101 8" Wang WCS floppy, CR 0160A
└─⟦this⟧ »2017A «
WangText
A…09…A…01…A…06…@…0c…@…01…@…05…?…0a…?…0f…?…01…?
? ?…06…>…08…>…0a…>…0c…>…0e…>…00…>…02…> >…06…=…08…=…0b…=…0e…=…00…=…02…=
= =…06…<…08…<…0b…<…0d…<…0f……86…1
…02…
…02…
…02…
…02…CPS/SDS/028
…02…820514…02……02…
I/O CONTROL
DETAILED
DESIGN
SPECIFICATION…02……02…CAMPS
4.1.5.7 S̲U̲B̲D̲E̲V̲I̲C̲E̲ ̲I̲N̲T̲E̲R̲F̲A̲C̲E̲ ̲M̲O̲D̲U̲L̲E̲
4.1.5.7.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 SUBDEVICE INTERFACE module implements the scheduling
of request among the subdevices, an example is scheduling
of split communication for the VOV protocol.
The SUBDEVICE INTERFACE interfaces to the higher level
protocols of the subdevices through the SPI entries
of these protocols. Within one protocol it interfaces
to the INPUTTER, OUTPUTTER, and PROT ̲CONT ̲modules
The task of the SUBDEVICE INTERFACE is to add subdevice
address to output data and input request as appropriate
for the protocol.
The processing for an input request received from a
subdevice is:
1. A queue element is fetched from the protocol's
local subdevice data. The input request data is
stored and the subdevice LDU is saved in the queue
element.
2. The INPUTTER is requested for permission to perform
input.
3. When an input request buffer is available it is
loaded with the request and sent.
4. When data arrives it is marked with the subdevice
LDU identification and handed to the subdevice.
5. The input is complete when END ̲OF ̲LDU or ENTIRE
̲LDU has been handed to the subdevice.
Input requests are only accepted one by one from a
subdevice.
The processing for an output request is as follows:
1. The SUBDEVICE INTERFACE is called by the subdevice
RESERVE ̲OUTPUT ̲BUFFER.
2. A queue element is fetched from the protocols SUBDEV
̲DATA for the subdevice and the OUTPUTTER module
is called to schedule the output.
3. When higher priority output requests have been
served or an ongoing lower priority request is
completed the SUBDEVICE INTERFACE is notified of
the availability of an output buffer.
4. The output buffer is handed to the subdevice. First
buffer is shortened to have room for the protocol
to load addressing information.
5. When the subdevice has loaded the data the protocol
picks up the subdevice LDU identification and saves
it in the queue element.
6. Addressing information is loaded in the buffer
as appropriate and the buffer is handed to the
outputter for transmission.
7. The OUTPUTTER is reserved for this subdevice until
completion of output for one LDU.
8. Eventually the SUBDEVICE INTERFACE is notified
by a buffer of the result. The subdevice identification
of the request is loaded from the queue element
and the subdevice is notified.
The processing for a control buffer request from a
subdevice is:
1. The subdevice calls the protocol via RESERVE ̲OUTPUT
̲BUFFER with control priority.
2. If the SUBDEVICE INTERFACE has no outgoing control
the control buffer is immediately handed to the
requestor else the request is queued by means of
the requestor's own request buffer.
3. After having obtained the buffer the subdevice
loads the control information and hands it back
to the SUBDEVICE INTERFACE. The control buffer
may now contain an input request or a cancel request
or a protocol control command. Input requests have
already been described. Cancel request and protocol
control commands are described below.
The processing for a cancel of a request is as follows:
1. The subdevice has sent a control buffer to the
SUBDEVICE interface with a request to cancel either
an input or an output.
2. The SUBDEVICE INTERFACE calls the INPUTTER or OUTPUTTER
to cancel the request and upon completion of the
call the same control buffer is loaded with transmission
status or reception status and the buffer is returned
to the subdevice.
The processing for a protocol control command is as
follows:
1. The subdevice has sent a control buffer with a
control command to the SUBDEVICE INTERFACE.
2. The control may concern the SUBDEVICE INTERFACE
locally. In this case the request is processed
and the buffer used to return completion immediately.
3. The request may be to the PROTOCOL module. In this
case the PROTOCOL module is requested to deliver
a buffer whereinto the request is copied and handed
to the PROTOCOL module.
4. When the PROTOCOL module has completed it returns
a buffer as response. This buffer is used to notify
the subdevice of the result.
4.1.5.7.2 M̲o̲d̲u̲l̲e̲ ̲I̲n̲t̲e̲r̲f̲a̲c̲e̲
The SUBDEVICE INTERFACE is called via one of the following:
TRANSMIT ̲OUTPUT ̲BUFFER (IF ̲PARAM: SPI ̲PARAM,
SUBDEV: SUBDEV ̲DATA)
(CC: COMPLETION ̲CODE)
RELEASE ̲OUTPUT ̲BUFFER (IF ̲PARAM: SPI ̲PARAM,
SUBDEV: SUBDEV ̲DATA)
(CC: COMPLETION ̲CODE)
CANCEL ̲RESERVE ̲OUTPUT ̲BUFFER (IF ̲PARAM: SPI ̲PARAM,
SUBDEV: SUBDEV ̲DATA)
(CC: COMPLETION ̲CODE)
RELEASE ̲INPUT ̲B (IF ̲PARAM: SPI ̲PARAM,
SUBDEV: SUBDEV ̲DATA)
(CC: COMPLETION ̲CODE)
RESERVE ̲OUTPUT ̲BUFFER (IF ̲PARAM: SPI ̲PARAM,
SUBDEV: SUBDEV ̲DATA)
(CC: COMPLETION ̲CODE)
NOTIFY ̲SUBDEVICE ̲FIRST ̲OUTPUT ̲BUFFER
(QEL: IO ̲QEL, BUFFER ̲REF: POINTER)()
NOTIFY ̲SUBDEVICE ̲SUBSEQUENT ̲OUTPUT ̲BUFFER
(QEL: IO ̲QEL, BUFFER ̲REF: POINTER)()
SUBDEVICE ̲OUTPUT ̲RESULT (QEL: IO ̲QEL, BUFFER
̲REF:
POINTER)()
SUBDEVICE ̲INPUT ̲RESULT (QEL: IO ̲QEL, BUFFER
̲REF:
POINTER)()
NOTIFY ̲SUBDEVICE ̲INPUT ̲REQUEST ̲BUFFER
(QEL: IO ̲QEL, BUFFER ̲REF: POINTER)()
NOTIFY ̲SUBDEVICE ̲INPUT ̲DATA
(QEL: IO ̲QEL, BUFFER ̲REF: POINTER)()
NOTIFY ̲SUBDEVICE ̲FIRST ̲INPUT ̲DATA
(QEL: IO ̲QEL, BUFFER ̲REF: POINTER)()
INITIALIZE ̲SUBDEVICE ̲INTERFACE
(PARAM: OPEN ̲SUBDEVICE ̲PARAM)()
CLEAN ̲SUBDEVICES()()
SUBDEVICE ̲OUTPUT ̲RESULT (QEL: IO ̲QEL,
BUFFER-̲REF: POINTER)()
NOTIFY ̲SUBDEVICE ̲FIRST ̲INPUT ̲DATA (QEL: IO ̲QEL,
BUFFER ̲REF: POINTER)()
NOTIFY ̲SUBDEVICE ̲INPUT ̲DATA (QEL: IO ̲QEL,
BUFFER ̲REF: POINTER)()
NOTIFY ̲SUBDEVICE ̲INPUT ̲REQUEST ̲BUFFER (QEL: IO ̲QEL,
BUFFER ̲REF: POINTER)()
SUBDEVICE ̲INPUT ̲RESULT (QEL: IO ̲QEL,
BUFFER ̲REF: POINTER)()
NOTIFY ̲SUBDEVICE ̲FIRST ̲OUTPUT ̲BUFFER (QEL: IO ̲QEL,
BUFFER ̲REF: POINTER)
()
NOTIFY ̲SUBDEVICE ̲SUBSEQUENT ̲OUTPUT ̲BUFFER (QEL: IO
̲QEL,
BUFFER ̲REF: POINTER)()
OPEN ̲SUBDEVICE (PARAM: OPEN ̲SUBDEVICE
̲PARAM) (CC: COMPLETION
̲CODE)
WANT ̲TO ̲CLOSE (SUBDEV: SUBDEV ̲DATA)()
The SUBDEVICE INTERFACE calls the following functional
entries of other modules:
REQUEST ̲DATA ̲INPUT (QEL: IO ̲QEL,
PRIORITY: PRIORITY ̲TYPE)
(CC: COMPLETION ̲CODE,
BUFFER ̲REF: POINTER)
SEND ̲INPUT ̲REQUEST (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)()
Furthermore
PROTOCOL ̲ERROR
QUEUE
INIT ̲QD
EXTRACT ̲FIRST
4.1.5.7.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 ̲SUBDEVICE ̲INTERFACE 5.1
CLEAN ̲SUBDEVICES 5.1
I̲n̲p̲u̲t̲-̲o̲u̲t̲p̲u̲t̲ ̲p̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
RELEASE ̲INPUT ̲B 5.2
RESERVE ̲OUTPUT ̲BUFFER 5.2
CANCEL ̲RESERVE ̲OUTPUT ̲BUFFER 5.2
RELEASE ̲OUTPUT ̲BUFFER 5.2
TRANSMIT ̲OUTPUT ̲BUFFER 5.2
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 ̲SUBDEVICE ̲FIRST ̲OUTPUT ̲BUFFER 5.3
NOTIFY ̲SUBDEVICE ̲SUBSEQUENT ̲OUTPUT
BUFFER 5.3
SUBDEVICE ̲OUTPUT ̲RESULT 5.3
I̲N̲P̲U̲T̲T̲E̲R̲ ̲n̲o̲t̲i̲c̲i̲f̲a̲t̲i̲o̲n̲ ̲p̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
NOTIFY ̲SUBDEVICE ̲INPUT ̲REQUEST ̲BUFFER 5.4
NOTIFY ̲SUBDEVICE ̲FIRST ̲INPUT ̲DATA 5.4
NOTIFY ̲SUBDEVICE ̲INPUT ̲DATA 5.4
SUBDEVICE ̲INPUT ̲RESULT 5.4
S̲u̲b̲d̲e̲v̲i̲c̲e̲ ̲c̲o̲n̲t̲r̲o̲l̲ ̲p̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
OPEN ̲SUBDEVICE 5.5
WANT ̲TO ̲CLOSE 5.5
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̲
LOAD ̲INPUT ̲REQUEST 5.6
RETURN ̲INPUT ̲DATA 5.6
O̲u̲t̲p̲u̲t̲ ̲h̲a̲n̲d̲l̲i̲n̲g̲ ̲p̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
CANCEL ̲ONGOING ̲OUTPUT 5.7
SETUP ̲FIRST ̲OUTPUT ̲BUFFER 5.7
SETUP ̲NEXT ̲OUTPUT ̲BUFFER 5.7
RETURN ̲OUTPUT ̲BUFFER 5.7
S̲u̲b̲d̲e̲v̲i̲c̲e̲ ̲h̲a̲n̲d̲l̲i̲n̲g̲ ̲p̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
CLEAN ̲SUBDEVICE 5.8
INITIALIZE ̲SUBDEVICE ̲DATA 5.8
C̲o̲n̲t̲r̲o̲l̲ ̲h̲a̲n̲d̲l̲i̲n̲g̲ ̲p̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
NOTIFY ̲CONTROL ̲BUFFER 5.9
NEXT ̲CONTROL 5.9
TERMINATE ̲ONGOING ̲CONTROL 5.9
4.1.5.7.4 D̲a̲t̲a̲ ̲D̲e̲s̲c̲r̲i̲p̲t̲i̲o̲n̲
TYPE SUBDEVICE ̲INTERFACE ̲DATA =
RECORD
CONTROL ̲STATE : ACTIVITY
CONTROL ̲BUFFER : ARRAY(0..SUBDEV ̲IE
̲
BUFFER ̲SIZE ̲1) OF
BYTES
CONTROL ̲BUF-
FER ̲ENTRY : BUFFER ̲ENTRY
PENDING ̲CONTROL : QD
ONGOING ̲CONTROL : QD
OUTPUT ̲BUF-
FER ̲ENTRY : BUFFER ̲ENTRY
OUTPUT ̲STATE : ACTIVITY
OUTPUT ̲QEL : POINTER
SPI : SPI ̲PARAM
END
CONTROL ̲STATE Indicates if the CONTROL ̲BUFFER is
in use or not.
CONTROL ̲BUFFER, Used to hand to subdevices when-
CONTROL ̲BUFFER ̲ENTRY ever RESERVE ̲OUTPUT ̲BUFFER with
control priority
PENDING ̲CONTROL Queue of REQUEST ̲RECORDS for control
buffers. (No priority)
OUTPUT ̲BUFFER ̲ENTRY Used to load parameters for
a possible reduced buffer before
returned to subdevice
OUTPUT ̲STATE Indicates if SUBDEVICE INTERFACE
is responsible for an LDU in
transmission.
OUTPUT ̲QEL Points the possible active QEL.
SPI For interfare to subdevice
TYPE SUBDEV ̲DATA = RECORD
PRIORITY : PRIORITY ̲TYPE
INPUT ̲QEL : IO ̲QEL
OUTPUT ̲EMPTY : QD
QELS : ARRAY (1.,MAX ̲SUBDEV ̲OUTQELS)
OF IO ̲QELS
"Protocol dependent"
INSAVE : ARRAY (1..INPUT ̲REQUEST ̲LENGTH)
OF BYTES
END
PRIORITY The priority to be used for request of
input and output is the OPEN ̲SUBDEVICE
priority + SUBDEVICE ̲PRIORITY
INPUT ̲QEL Holds an input request from the subdevice
OUTPUT ̲EMPTY Holds pending output requests for one
QELS subdevice
INSAVE Save area for input request data
4.1.5.7.5 M̲o̲d̲u̲l̲e̲ ̲D̲e̲s̲i̲g̲n̲
4.1.5.7.5.1 B̲a̲s̲i̲c̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are
INITIALIZE ̲SUBDEVICE ̲INTERFACE
CLEAN ̲SUBDEVICES.
INITIALIZE ̲SUBDEVICE ̲INTERFACE (PARAM: OPEN ̲SUBDEVICE
̲PARAM)()
P = OWN ̲SDID. SUBDEVICE ̲IF
P. CONTROL ̲STATE = IDLE
INIT ̲QD (P.ONGOING ̲CONTROL)()
INIT ̲QD (P.PENDING ̲CONTROL)()
INIT CONTROL ̲BUFFER ̲ENTRY
P. OUTPUT ̲STATE = IDLE
RETURN
Figure 4.1.5.7.5.1-1
CLEAN ̲SUBDEVICES ()()
LOOP
SUBDEV= OWN ̲SDID. SDDREF. CHILD ̲QUEUE. EP
SUBDEV EQ NIL ?
CLEAN ̲SUBDEVICE (SUBDEV)()
END LOOP
RETURN
Figure 4.1.5.7.5.1-2
4.1.5.7.5.2 I̲n̲p̲u̲t̲-̲O̲u̲t̲p̲u̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are
RELEASE ̲INPUT ̲B
RESERVE ̲OUTPUT ̲BUFFER
CANCEL ̲RESERVE ̲OUTPUT ̲BUFFER
RELEASE ̲OUTPUT ̲BUFFER
TRANSMIT ̲OUTPUT ̲BUFFER
RELEASE ̲INPUT ̲B (IF ̲PARAM: SPI ̲PARAM, SUBDEV: SUBDEV
̲DATA)
(CC:COMPLETION ̲CODE)
BREF = IF ̲PARAM. BUFFER ̲ENTRY
BREF EQ OWN ̲SOID. SUBDEVICE ̲IF
CONTROL ̲BUFFER ENTRY?
RELEASE ̲INPUT TERMINATE ̲ONGOING ̲
BUFFER (BREF)() CONTROL()()
CC = OK
RETURN
Figure 4.1.5.7.5.2-1
RESERVE ̲OUTPUT ̲BUFFER (IF ̲PARAM: SPI ̲PARAM, SUBDEV:SUBDEV
̲DATA)
(CC: COMPLETION
̲CODE)
IF ̲PARAM. PRIORITY C̲O̲N̲T̲R̲O̲L̲ ̲3̲
EQ CONTROL ̲PRIORITY ?
RR = IF ̲PARAM. REQ ̲RECORD
RR. WORD2 = SUBDEV. OUTPUT ̲QEL
SUBDEV. OUTPUT ̲QEL. REQ ̲RECORD = RR
RR. WORD3 = DATA
OWN ̲SDID: SUBDEVICE ̲IF:
OUTPUT ̲STATE NE IDLE? N̲E̲X̲T̲ ̲O̲U̲T̲P̲U̲T̲ ̲5̲
FIRST OUTPUT 4
Figure 4.1.5.7.5.2-2
C̲O̲N̲T̲R̲O̲L̲ ̲3̲
RR = IF ̲PARAM. REQ ̲RECORD
RR. WORD2 = SUBDEV. SDIDREF
RR. WORD3 = CONTROL
INSERT (OWN ̲SDID. SUBDEVICE ̲IF. PENDING ̲CONTROL, RR)()
OWN ̲SDID. SUBDEVICE ̲IF.
CONTROL ̲STATE.EQ.ACTIVE? CC= REQUEST ̲QUEUED
NEXT ̲CONTROL() (CCP)
IF ̲PARAM. BUFFER ̲ENTRY=
OWN ̲SDID. SUBDEVICE ̲IF.
CONTROL ̲BUFFER ̲ENTRY
CC = OK
Figure 4.1.5.7.5.2-3
F̲I̲R̲S̲T̲ ̲O̲U̲T̲P̲U̲T̲ ̲4̲
OWN ̲SDID. SUBDEVICE ̲IE. OUTPUT ̲STATE = ACTIVE
REQUEST ̲DATA ̲OUTPUT (SUBDEV. OUTPUT ̲QEL,
SUBDEV. PRIORITY)
(CCP, BUFFER ̲REF)
CCP EQ REQUEST ̲QUEUED ? CC= REQUEST ̲QUEUED
SETUP ̲FIRST ̲OUTPUT ̲BUFFER (BUFFER ̲REF)()
IF ̲PARAM. BUFFER ̲ENTRY =
OWN ̲SDID. SUBDEVICE ̲IF
OUTPUT ̲BUFFER ̲ENTRY
CC = OK
Figure 4.1.5.7.5.2-4
N̲E̲X̲T̲ ̲O̲U̲T̲P̲U̲T̲ ̲5̲
REQUEST ̲NEXT ̲BUFFER() (CCP, BUFFER ̲REF)
CCP EQ REQUEST ̲QUEUED ? CC = REQUEST QUEUED
SETUP ̲NEXT ̲OUTPUT ̲BUFFER (BUFFER ̲REF)()
IF ̲PARAM. BUFFER ̲ENTRY =
OWN ̲SDID. SUBDEVICE ̲IF
OUTPUT ̲BUFFER ̲ENTRY
CC = OK
Figure 4.1.5.7.5.2-5
CANCEL ̲RESERVE ̲OUTPUT ̲BUFFER (IF ̲PARAM: SPI
̲PARAM,
SUBDEV: SUBDEV
̲DATA)
(CC: COMPLETION
̲CODE)
RR = IF ̲PARAM. REQ ̲RECORD
CASE RR. WORD3 OF
CONTROL ? C̲A̲N̲C̲E̲L̲ ̲C̲O̲N̲T̲R̲O̲L̲ ̲
DATA ? CANCEL ̲ONGOING ̲OUTPUT()()
END CASE
CC = OK
RETURN
Figure 4.1.5.7.5.2-6
C̲A̲N̲C̲E̲L̲ ̲C̲O̲N̲T̲R̲O̲L̲ ̲7̲
A pending buffer reserve is not active control
CASE EXTRACT ̲SPECIFIED (OWN ̲SDID. SUBDEVICE ̲IF. PENDING
̲
CONTROL, RR)()OF
FAIL ? PROTOCOL ̲ERROR (SUBDEVICE ̲2 ̲7)
PASS ?
END CASE
CC = OK
Figure 4.1.5.7.5.2-7
RELEASE ̲OUTPUT ̲BUFFER (IF ̲PARAM: SPI ̲PARAM,
SUBDEV: SUBDEV ̲DATA)
(CC: COMPLETION ̲CODE)
BREF = IF ̲PARAM. BUFFER ̲ENTRY
BREF EQ OWN ̲SDID. SUBDEVICE ̲
IF. CONTROL ̲BUFFER ̲ENTRY?
CANCEL ̲ONGOING ̲OUTPUT()() TERMINATE ̲ONGOING ̲CONTROL()()
RETURN
Figure 4.1.5.7.5.2-8
TRANSMIT ̲OUTPUT ̲BUFFER (IF ̲PARAM: SPI ̲PARAM,
SUBDEV: SUBDEV ̲DATA)
(CC ̲COMPLETION ̲CODE)
BREF = IF ̲PARAM. BUFFER ̲ENTRY
BUFFER = BREF. PAGE ̲START
START = BREF. BUFFER ̲ADDR
SIZE = BREF. BUFFER ̲SIZE
TYPE = BUFFER (START+BUFFER ̲TYPE ̲OFFSET)
TYPE INDICATE CONTROL ?
D̲A̲T̲A̲ ̲O̲U̲T̲P̲U̲T̲ ̲1̲0̲ C̲O̲N̲T̲R̲O̲L̲ ̲O̲U̲T̲P̲U̲T̲ ̲1̲1̲
RETURN
Figure 4.1.5.7.5.2-9
D̲A̲T̲A̲ ̲O̲U̲T̲P̲U̲T̲ ̲1̲0̲
TYPE INDICATE START ̲OF ̲LDU
OR ENTIRE ̲LOU?
SIZE 1 = SIZE SETUP ̲FIRST ̲OUTPUT ̲BUFFER
(SIZE)
(SIZE
1)
SEND ̲OUTPUT ̲BUFFER (TYPE, SIZE 1)()
TYPE INDICATE END OF DATA ?
OWN ̲SDID. SUBDEVICE ̲IF.
OUTPUT ̲STATE = IDLE
Figure 4.1.5.7.5.2-10
C̲O̲N̲T̲R̲O̲L̲ ̲O̲U̲T̲P̲U̲T̲ ̲1̲1̲
CONTROL ̲TYPE = BUFFER (START+CONTROL ̲REQUEST ̲OFFSET)
CASE CONTROL ̲TYPE OF
INPUT ̲REQUEST ? I̲N̲P̲U̲T̲ ̲R̲E̲Q̲U̲E̲S̲T̲
̲1̲2̲
CANCEL ̲INPUT ̲REQUEST ? C̲A̲N̲C̲E̲L̲ ̲I̲N̲P̲U̲T̲ ̲R̲E̲Q̲U̲E̲S̲T̲
̲1̲3̲
CANCEL-̲OUTPUT ? C̲A̲N̲C̲E̲L̲ ̲O̲U̲T̲P̲U̲T̲
̲1̲4̲
PROTOCOL ̲COMMAND ? P̲R̲O̲T̲O̲C̲O̲L̲ ̲C̲O̲M̲M̲A̲N̲D̲
̲1̲5̲
OTHER ? PROTOCOL ̲ERROR (SUBDEVICE ̲2 ̲11)
END CASE
CONTROL ̲COMPLETE EQ FALSE ?
NEXT ̲CONTROL() (CCP)
CCP NE OK ?
NOTIFY ̲CONTROL ̲BUFFER()()
Figure 4.1.5.7.5.2-11
I̲N̲P̲U̲T̲ ̲R̲E̲Q̲U̲E̲S̲T̲ ̲1̲2̲
Caller identification
SUBDEV. INPUT ̲QEL. ADDI = SUBDEV. SDIDREF
SUBDEV: INPUT ̲QEL. REQUESTOR = SUBDEVICE
LDU
SUBDEV. INPUT ̲QEL. REQ ̲REF = BUFFER (START + INPUT
̲REQUEST ̲LDU ̲
OFFSET)
COPY INPUT REQUEST DATA TO SUBDEV. INSAVE
REQUEST ̲DATA ̲INPUT (SUBDEV.INPUT ̲QEL, SUBDEV.PRIORITY)
CCP, BUFFER
̲REF)
CCP NE OK ?
LOAD ̲INPUT ̲REQUEST (SUBDEV.INPUT ̲QEL, BUFFER ̲REF) (SIZE)
SEND ̲INPUT ̲REQUEST (SIZE)()
CONTROL ̲COMPLETE = TRUE
Figure 4.1.5.7.5.2-12
C̲A̲N̲C̲E̲L̲ ̲I̲N̲P̲U̲T̲ ̲R̲E̲Q̲U̲E̲S̲T̲ ̲1̲3̲
LDU = BUFFER (START + CANCEL ̲INPUT ̲LDU ̲OFFSET)
LDU NE SUBDEV. INPUT ̲QEL. REF ̲REF ?
CANCEL ̲INPUT (SUBDEV. INPUT ̲QEL)()
CONTROL ̲COMPLETE = TRUE
Figure 4.1.5.7.5.2-13
C̲A̲N̲C̲E̲L̲ ̲O̲U̲T̲P̲U̲T̲ ̲1̲4̲
Search LDU in QELS
LDU = BUFFER (START + CANCEL ̲OUTPUT ̲LDU ̲OFFSET)
INDEX = 1
LOOP
QEL = SUBDEV. QELS (INDEX)
LDU EQ QELREQ ̲REF ? FOUND = TRUE
INDEX GE MAX ̲SUBDEV ̲OUTQELS ? FOUND = FALSE
INDEX + 1
END LOOP
FOUND EQ FALSE ?
CANCEL ̲OUTPUT (QEL)()
INSERT (SUBDEV. OUTPUT ̲EMPTY, QEL)()
CONTROL ̲COMPLETE = TRUE
Figure 4.1.5.7.5.2-14
P̲R̲O̲T̲O̲C̲O̲L̲ ̲C̲O̲M̲M̲A̲N̲D̲ ̲1̲5̲
PROTOCOL ̲COMMAND()(CONTROL ̲COMPLETE)
Figure 4.1.5.7.5.2-15
4.1.5.7.5.3 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 ̲SUBDEVICE ̲FIRST ̲OUTPUT ̲BUFFER
NOTIFY ̲SUBDEVICE ̲SUBSEQUENT ̲OUTPUT ̲BUFFER
SUBDEVICE ̲OUTPUT ̲RESULT
NOTIFY ̲SUBDEVICE ̲FIRST ̲OUTPUT ̲BUFFER (QEL: IO ̲QEL,
BUFFER ̲REF: POINTER)()
SETUP ̲FIRST ̲OUTPUT ̲BUFFER (BUFFER ̲REF)
RETURN ̲OUTPUT ̲BUFFER (QEL)()
RETURN
Figure 4.1.5.7.5.3-1
NOTIFY ̲SUBDEVICE ̲SUBSEQUENT ̲OUTPUT ̲BUFFER
(QEL: IO ̲QEL, BUFFER ̲REF: POINTER)()
SETUP ̲NEXT ̲OUTPUT ̲BUFFER (BUFFER ̲REF)()
RETURN ̲OUTPUT ̲BUFFER (QEL)()
RETURN
Figure 4.1.5.7.5.3-2
SUBDEVICE ̲OUTPUT ̲RESULT (QEL: IO ̲QEL, BUFFER ̲REF: POINTER)()
Put the subdevice LDU into the result
BUFFER = BUFFER ̲REF.PAGE ̲START
START = BUFFER ̲REF. BUFFER ̲ADDR
BUFFER (START + TRANSMISSION ̲START ̲LDU ̲OFFSET) = QEL.REQ
̲REF
Release queue element
SUBDEV = QEL. ADDI. SDDREF
INSERT (SUBDEV. OUTPUT ̲EMPTY, QEL)()
Send buffer
RETURN ̲INPUT ̲DATA (QEL, BUFFER ̲REF)()
RETURN
Figure 4.1.5.7.5.3-3
4.1.5.7.5.4 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 ̲SUBDEVICE ̲INPUT ̲REQUEST ̲BUFFER
NOTIFY ̲SUBDEVICE ̲FIRST INPUT ̲DATA
NOTIFY ̲SUBDEVOCE ̲INPUT ̲DATA
SUBDEVICE ̲INPUT ̲RESULT
NOTIFY ̲SUBDEVICE ̲INPUT ̲REQUEST ̲BUFFER (QEL: IO ̲QEL,
BUFFER ̲REF:
POINTER)()
LOAD ̲INPUT ̲REQUEST (QEL, BUFFER ̲REF)(SIZE)
SEND ̲INPUT ̲REQUEST (SIZE)()
RETURN
Figure 4.1.5.7.5.4-1
NOTIFY ̲SUBDEVICE ̲FIRST ̲INPUT ̲DATA
(QEL: IO ̲QEL, BUFFER ̲REF: POINTER)()
Copy the subdevice identification into the buffer
(LDU)
BUFFER = BUFFER ̲REF.PAGE ̲START
START = BUFFER ̲REF.BUFFER ̲ADDR
BUFFER (START + LDU ̲HEAD ̲OFFSET) = QEL. REQ ̲REF
RETURN ̲INPUT ̲DATA (QEL, BUFFER ̲REF)
RETURN
Figure 4.1.5.7.5.4-2
NOTIFY ̲SUBDEVICE ̲INPUT ̲DATA
(QEL: IO ̲QEL, BUFFER ̲REF: POINTER)()
RETURN ̲INPUT ̲DATA (QEL, BUFFER ̲REF)
RETURN
Figure 4.1.5.7.5.4-3
SUBDEVICE ̲INPUT ̲RESULT (QEL: IO ̲QEL, BUFFER ̲REF: POINTER)()
Put the subdevice LDU into the result
BUFFER = BUFFER ̲REF. PAGE ̲START
START = BUFFER ̲REF. BUFFER ̲ADDR
BUFFER (START + RECEPTION ̲STATUS ̲LDU ̲OFFSET) = QEL.
REQ ̲REF
RETURN ̲INPUT ̲DATA (QEL, BUFFER ̲REF)
RETURN
Figure 4.1.5.7.5.4-4
4.1.5.7.5.5 S̲u̲b̲d̲e̲v̲i̲c̲e̲ ̲C̲e̲n̲t̲r̲a̲l̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are:
OPEN ̲SUBDEVICE
WANT ̲TO ̲CLOSE
OPEN ̲SUBDEVICE (PARAM: OPEN ̲SUBDEVICE ̲PARAM)(CC: COMPLETION
̲
CODE)
CASE CREATE ̲CHILD()(SUBDEV) OF
FAIL ? CC = NO ̲RESOURCE
PASS ?
END CASE
INITIALIZE ̲SUBDEVICE ̲DATA (PARAM, SUBDEV)()
OWN ̲SDID.SUBDEVICE ̲IF. SPI. PARAM = PARAM
ACTIVATE ̲SUBDEVICE ̲SPI (SUBDEV. SDIDREF,
OPEN ̲PROTOCOL,
OWN ̲SDID. SUBDEVICE ̲IF. SPI) (CCP)
CC = OK
Figure 4.1.5.7.5.5-1
WANT ̲TO ̲CLOSE (SUBDEV: SUBDEV ̲DATA)()
CLEAN ̲SUBDEVICE (SUBDEV)()
RETURN
Figure 4.1.5.7.5.5-2
4.1.5.7.5.6 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:
LOAD ̲INPUT ̲REQUEST
RETURN ̲INPUT ̲DATA
LOAD ̲INPUT ̲REQUEST (QEL: IO ̲QEL, BUFFER ̲REF: POINTER)
COPY FROM SUBDEV. INSAVE DATA FOR
INPUT REQUEST
RETURN
Figure 4.1.5.7.5.6-1
RETURN ̲INPUT ̲DATA (QEL: IO ̲QEL, BUFFER ̲REF: POINTER)()
OWN ̲SDID. SUBDEVICE ̲IF. SPI. BUFFER ̲ENTRY = BUFFER
̲REF
CHILD = QEL. ADDI
ACTIVATE ̲SUBDEVICE ̲SPI (CHILD,
NOTIFY ̲INPUT ̲BUFFER,
OWN ̲SDID, SUBDEVICE ̲IF. SPI)()
RETURN
Figure 4.1.5.7.5.6-2
4.1.5.7.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̲
These are:
CANCEL ̲ONGOING ̲OUTPUT
SETUP ̲FIRST ̲OUTPUT ̲BUFFER
SETUP ̲NEXT ̲OUTPUT ̲BUFFER
RETURN ̲OUTPUT ̲BUFFER
CANCEL ̲ONGOING ̲OUTPUT()()
QEL = OWN ̲SDID. SUBDEVICE ̲IF. OUTPUT ̲QEL
CANCEL ̲OUTPUT (QEL)()
SUBDEV = QEL. ADDI. SDDREF
INSERT (SUBDEV. OUTPUT ̲EMPTY, QEL)()
OWN ̲SDID. SUBDEVICE ̲IF. OUTPUT ̲STATE = IDLE
RETURN
Figure 4.1.5.7.5.7-1
SETUP ̲FIRST ̲OUTPUT ̲BUFFER (BUFFER ̲ENTRY: POINTER)()
COPY BUFFER ̲ENTRY TO
OWN ̲SDID, SUBDEVICE ̲IF. OUTPUT ̲BUFFER ̲ENTRY
REDUCE BUFFER SIZE LEAVING ROOM FOR
SUBDEVICE ADDRESS
RETURN
Figure 4.1.5.7.5.7-2
SETUP ̲NEXT ̲OUTPUT ̲BUFFER (BUFFER ̲ENTRY: POINTER)()
OWN ̲SDID. SUBDEVICE ̲IF. OUTPUT ̲BUFFER ̲ENTRY = BUFFER
̲ENTRY
RETURN
Figure 4.1.5.7.5.7-3
RETURN ̲OUTPUT ̲BUFFER (QEL: IO ̲QEL)()
OWN ̲SDID. SUBDEVICE ̲IF. SPI. BUFFER ̲ENTRY =
OWN ̲SDID, SUBDEVICE ̲IF. OUTPUT ̲BUFFER ̲ENTRY
REQ ̲RECORD = QEL. REQ ̲RECORD
OWN ̲SDID. SUBDEVICE ̲IF. SPI. REQ ̲RECORD = REQ ̲RECORD
CHILD = QEL. ADDI
ACTIVATE ̲SUBDEVICE ̲SPI (CHILD,
NOTIFY ̲OUTPUT ̲BUFFER,
OWN ̲SDID. SUBDEVICE ̲IF. SPI)(CCP)
RETURN
Figure 4.1.5.7.5.7-4
4.1.5.7.5.8 S̲u̲b̲d̲e̲v̲i̲c̲e̲ ̲H̲a̲n̲d̲l̲i̲n̲g̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are:
CLEAN ̲SUBDEVICE
INITIALIZE ̲SUBDEVICE ̲DATA
CLEAN ̲SUBDEVICE (SUBDEV: SUBDEV ̲DATA)()
C̲A̲N̲C̲E̲L̲ ̲I̲N̲P̲U̲T̲ ̲2̲
C̲A̲N̲C̲E̲L̲ ̲O̲U̲T̲P̲U̲T̲ ̲3̲
C̲A̲N̲C̲E̲L̲ ̲C̲O̲N̲T̲R̲O̲L̲ ̲4̲
CHILD = SUBDEV. SDIDREF
ACTIVATE ̲SUBDEVICE ̲SPI (CHILD,
CLEAN ̲UP ̲ALL, DUMMY)()
CASE DELETE ̲CHILD (SUBDEV)() OF
FAIL ? PROTOCOL ̲ERROR (SUBDEVICE ̲8 ̲1)
PASS ?
END CASE
RETURN
Figure 4.1.5.7.5.8-1
C̲A̲N̲C̲E̲L̲ ̲I̲N̲P̲U̲T̲ ̲2̲
SUBDEV. INPUT ̲QEL. REQUESTOR EQ NONE ?
CANCEL ̲INPUT (SUBDEV. INPUT ̲QEL)()
Figure 4.1.5.7.5.8-2
C̲A̲N̲C̲E̲L̲ ̲O̲U̲T̲P̲U̲T̲ ̲3̲
INDEX = 1
LOOP
SUBDEV. QELS (INDEX). REQUESTOR EQ NONE
CANCEL ̲OUTPUT (SUBDEV. QELS (INDEX)()
INDEX GE MAX ̲SUBDEV ̲OUTQELS
INDEX + 1
END LOOP
Figure 4.1.5.7.5.8-3
C̲A̲N̲C̲E̲L̲ ̲C̲O̲N̲T̲R̲O̲L̲ ̲4̲
Search in pending control queue.
There might be up to 3 requests pending
(from controller, input and output)
CHILD = SUBDEV. SDIDREF
LOOP
CASE SEARCH ̲RECORD (OWN ̲SDID. SUBDEVICE ̲IF. PENDING
̲CONTROL,
CONTROL ̲SDID ̲OFFSET,
SUBDEV. CHILD)
(QEL) OF
FAIL ?
PASS ?
END CASE
CASE EXTRACT ̲SPECIFIED (OWN ̲SDID. SUBDEVICE ̲IF.
PENDING ̲CONTROL,
QEL)() OF
FAIL, PASS
END CASE
END LOOP
Figure 4.1.5.7.5.8-4
INITIALIZE ̲SUBDEVICE ̲DATA (PARAM: OPEN ̲SUBDEVICE
̲PARAM,
SUBDEV: SUBDEV ̲DATA)()
EQUIVALENCE (PARAM. PARAMETERS, INIT ̲D: SUBDEV ̲INIT
̲DATA)
SUBDEV: PRIORITY = INIT ̲D. PRIORITY + SUBDEVICE ̲PRIORITY
INIT ̲QD (SUBDEV. OUTPUT ̲EMPTY)()
INDEX = 1
LOOP
INSERT (SUBDEV. QELS(INDEX), SUBDEV, OUTPUT ̲EMPTY)()
INDEX GE MAX ̲SUBDEV ̲OUTQELS ?
INDEX + 1
END LOOP
"Protocol dependend data"
INITIALIZE ̲PROTOCOL ̲DATA ̲FOR ̲SUBDEVICE (INIT ̲D, SUBDEV)()
RETURN
Figure 4.1.5.7.5.8-5
4.1.5.7.5.9 C̲o̲n̲t̲r̲o̲l̲ ̲H̲a̲n̲d̲l̲i̲n̲g̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are:
NOTIFY ̲CONTROL ̲BUFFER
NEXT ̲CONTROL
TERMINATE ̲ONGOING ̲CONTROL
NOTIFY ̲CONTROL ̲BUFFER()()
CHILD = OWN ̲SDID, SUBDEVICE ̲IF. ONGOING ̲CONTROL.EP.
WORD2
OWN ̲SDID. SUBDEVICE ̲IF. SPI. REQ ̲RECORD =
OWN ̲SDID. SUBDEVICE ̲IF. ONGOING ̲CONTROL.EP
ACTIVATE ̲SUBDEVICE ̲SPI (CHILD,
NOTIFY ̲OUTPUT ̲BUFFER,
OWN ̲SDID. SUBDEVICE ̲IF. SPI)(CCP)
RETURN
Figure 4.1.5.7.5.9-1
NEXT ̲CONTROL() (CC: COMPLETION ̲CODE)
CASE EXTRACT ̲FIRST (OWN ̲SDID. SUBDEVICE ̲IF. PENDING
̲CONTROL)
(QEL)
OF
FAIL ? CC = NO ̲PENDING
PASS ?
END CASE
OWN ̲SDID. SUBDEVICE ̲IF. ONGOING ̲CONTROL.EP = QEL
Reset control buffer
OWN ̲SDID. SUBDEVICE ̲IF. CONTROL ̲
BUFFER ̲ENTRY. BUFFER ̲SIZE =
SUBDEV ̲IF ̲BUFFER ̲SIZE-1
CC = OK
RETURN
Figure 4.1.5.7.5.9-2
T̲E̲R̲M̲I̲N̲A̲T̲E̲ ̲O̲N̲G̲O̲I̲N̲G̲ ̲C̲O̲N̲T̲R̲O̲L̲()()
NEXT ̲CONTROL()(CCP)
CCP NE OK? no pending
NOTIFY ̲CONTROL ̲BUFFER()()
RETURN
Figure 4.1.5.7.5.9-3
4.1.5.8 P̲R̲O̲T̲ ̲C̲O̲N̲T̲ ̲M̲o̲d̲u̲l̲e̲
4.1.5.8.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 PROT ̲CONT module controls the exchange of Protocol
command/Protocol status buffers with the Parent protocol.
Especially the CONTROLLER and the PROTOCOL modules
make use of this.
The processing is as follows:
The PROT ̲CONT module controls that only one Protocol
Command to LTU/LTUX is in execution at any time.
The requestor calls REQUEST ̲PROT ̲CONT and may either
be queued or immediately be supplied with a buffer.
When the requestor gets a control buffer he loads it
with the command and hands it to the PROT ̲CONT module
for transmission.
The requestor may here specify that no response is
expected and the request is complete. If a response
is expected, the PROT ̲CONT module awaits the arrival
and hands back the buffer to the requestor. From now
on the requestor is in charge of the buffer (e.g. for
cancel processing) and the PROT ̲CONT module executes
next request.
4.1.5.8.2 M̲o̲d̲u̲l̲e̲ ̲I̲n̲t̲e̲r̲f̲a̲c̲e̲
The PROT ̲CONT is called via one of the following entries:
INITIALIZE ̲PROT ̲CONT (PARAM: OPEN ̲SUBDEVICE ̲PARAM)()
REQUEST ̲PROT ̲CONT (QEL: IO ̲QEL,
PRIORITY: PRIORITY ̲TYPE)
(CC: COMPLETION ̲CODE,
BUFFER ̲REF: POINTER)
NOTIFY ̲PROT ̲CONT ̲OUTPUT ̲BUFFER (BUFFER ̲REF: POINTER)()
NOTIFY ̲PROT ̲CONT ̲OF ̲RESPONSE (BUFFER ̲REF: POINTER)()
SEND ̲PROT ̲CONT (RESPONSE: BOOLEAN,
SIZE: INTEGER)()
CANCEL ̲PROT ̲CONT (QEL: IO ̲QEL)()
CLEAN ̲PROT ̲CONT()()
The PROT ̲CONT module calls the following functional
entries of other modules:
USER ̲PROT ̲CONT ̲RESULT (QEL: IO ̲QEL, BUFFER ̲REF: POINTER)()
CONTROLLER ̲PROT ̲CONT ̲RESULT (QEL: IO ̲QEL,BUFFER ̲REF:POINTER)()
PROTOCOL ̲PROT ̲CONT ̲RESULT (QEL:IO ̲QEL,BUFFER ̲REF:POINTER)()
NOTIFY ̲USER ̲PROT ̲CONT ̲BUFFER (QEL:IO ̲QEL,BUFFER ̲REF:POINTER)()
NOTIFY ̲CONTROLLER ̲PROT ̲CONT ̲BUFFER (QEL:IO ̲QEL, BUFFER
̲REF:
POINTER)()
NOTIFY ̲PROTOCOL ̲PROT ̲CONT ̲BUFFER (QEL:IO ̲QEL,BUFFER
̲REF:
POINTER)()
Furthermore:
PROTOCOL ̲ERROR
ACTIVATE ̲SUBDEVICE ̲SPI
QUEUE ̲PRIORITIZED
QUEUE
INIT ̲QD
EXTRACT ̲FIRST
EXTRACT ̲SPECIFIED
4.1.5.8.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 ̲PROT ̲CONT 5.1
CLEAN ̲PROT ̲CONT 5.1
R̲e̲q̲u̲e̲s̲t̲ ̲p̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
REQUEST ̲PROT ̲CONT 5.2
CANCEL ̲PROT ̲CONT 5.2
SEND ̲PROT ̲CONT 5.2
P̲a̲r̲e̲n̲t̲ ̲p̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
NOTIFY ̲PROT ̲CONT ̲OUTPUT ̲BUFFER 5.3
NOTIFY ̲PROT ̲CONT ̲OF ̲RESPONSE 5.3
C̲o̲m̲p̲o̲n̲e̲n̲t̲ ̲p̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
R̲e̲q̲u̲e̲s̲t̲o̲r̲ ̲n̲o̲t̲i̲f̲i̲c̲a̲t̲i̲o̲n̲
RETURN ̲PROT ̲CONT ̲BUFFER 5.4
C̲o̲m̲p̲l̲e̲t̲i̲o̲n̲ ̲p̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
NEXT ̲PROT ̲CONT 5.5
RELEASE ̲PROT ̲CONT ̲BUFFER 5.5
PROC ̲FOR ̲END ̲OF ̲PROT ̲CONT 5.5
4.1.5.8.4 D̲a̲t̲a̲ ̲D̲e̲s̲c̲r̲i̲p̲t̲i̲o̲n̲
PROT ̲CONT ̲DATA = RECORD
STATE : (IDLE, ACTIVE)
PENDING : QD
ONGOING : QD
BUFFER ̲STATE: (NO ̲BUF, PENDING ̲RESERVE, DELIVERED)
BUFFER ̲ENTRY: POINTER
REQ ̲RECORD : REQ ̲RECORD ̲TYPE
SPI : SPI ̲PARAM
ID : 0.. PROT ̲CONT ̲ID ̲MAX
END
STATE Identifies if active
PENDING, Queues holding waiting request
ONGOING and the possible ongoing request
BUFFER ̲STATE Status of output control buffer
BUFFER ̲ENTRY Pointer to a buffer returned to
requestor
REQ ̲RECORD Used for parent communication
SPI
ID The identification sent with a protocol
command (is returned in the correspon-
ding status).
4.1.5.8.5 M̲o̲d̲u̲l̲e̲ ̲D̲e̲s̲i̲g̲n̲
4.1.5.8.5.1 B̲a̲s̲i̲c̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are: INITIALIZE ̲PROT ̲CONT
CLEAN ̲PROT ̲CONT
INITIALIZE ̲PROT ̲CONT (PARAM: OPEN ̲SUBDEVICE ̲PARAM)()
OWN ̲SDID. PROT ̲CONT. SPI.PRIORITY = CONTROL ̲PRIORITY
OWN ̲SDID. PROT ̲CONT. SPI. REQ ̲RECORD =
POINTER TO OWN ̲SDID. PROT ̲CONT. REQ ̲RECORD
INIT ̲QD (OWN ̲SDID. PROT ̲CONT. PENDING)()
INIT ̲QD (OWN ̲SDID. PROT ̲CONT. ONGOING)()
OWN ̲SDID. PROT ̲CONT. BUFFER ̲STATE = NO ̲BUF
OWN ̲SDID. PROT ̲CONT. STATE = IDLE
OWN ̲SDID. PROT ̲CONT. ID = PROT ̲CONT ̲ID ̲MAX
RETURN
Figure 4.1.5.8.5.1-1
CLEAN ̲PROT ̲CONT()()
The buffer is released by the requestor
RETURN
Figure 4.1.5.8.5.1-2
4.1.5.8.5.2 R̲e̲q̲u̲e̲s̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are: REQUEST ̲PROT ̲CONT
CANCEL ̲PROT ̲CONT
SEND ̲PROT ̲CONT
REQUEST ̲PROT ̲CONT (QEL: IO ̲QEL,
PRIORITY: PRIORITY ̲TYPE)
(CC: COMPLETION ̲CODE,
BUFFER ̲REF: POINTER)
QUEUE PRIORITIZED (OWN ̲SDID.PROT ̲CONT. PENDING, PRIORITY,
QEL)()
OWN ̲SDID. PROT ̲CONT.
STATE NE IDLE? CC = REQUEST ̲QUEUED
NEXT ̲PROT ̲CONT()(CCP)
CCP EQ REQUEST ̲QUEUED ? CC = REQUEST ̲QUEUED
OWN ̲SDID. PROT ̲CONT. STATE = DELIVERED
BUFFER ̲REF = OWN ̲SDID. PROT ̲CONT. BUFFER ̲ENTRY
CC = OK
RETURN
Figure 4.1.5.8.5.2-1
CANCEL ̲PROT ̲CONT (QEL: IO ̲QEL)()
CASE QEL. QUEUE OF
OWN ̲SDID. PROT ̲CONT.
PENDING? PENDING 3
OWN ̲SDID. PROT ̲CONT.
ONGOING? PENDING 4
OTHER ? PROTOCOL ̲ERROR (PROT ̲CONT ̲2 ̲2)
END CASE
RETURN
Figure 4.1.5.8.5.2-2
P̲E̲N̲D̲I̲N̲G̲ ̲3̲
CASE EXTRACT ̲SPECIFIED (QEL, OWN ̲SDID. PROT ̲CONT. PENDING)()
OF
FAIL ? PROTOCOL ̲ERROR (PROT ̲CONT ̲2 ̲3)
PASS ?
END CASE
Figure 4.1.5.8.5.2-3
O̲N̲G̲O̲I̲N̲G̲ ̲4̲
CASE OWN ̲SDID. PROT ̲CONT. BUFFER ̲STATE OF
NO ̲BUF ?
PENDING ̲RESERVE ? C̲A̲N̲C̲E̲L̲ ̲R̲E̲S̲E̲R̲V̲A̲T̲I̲O̲N̲ ̲5̲
DELIVERED ? R̲E̲L̲E̲A̲S̲E̲ ̲B̲U̲F̲F̲E̲R̲ ̲6̲
END CASE
PROCESS ̲FOR ̲END ̲OF ̲PROT ̲CONT ()()
Figure 4.1.5.8.5.2-4
C̲A̲N̲C̲E̲L̲ ̲R̲E̲S̲E̲R̲V̲A̲T̲I̲O̲N̲ ̲5̲
ACTIVATE ̲SUBDEVICE ̲SPI (OWN ̲SDID. PARENT ̲SDID,
CANCEL ̲RESERVE ̲OUTPUT ̲BUFFER,
OWN ̲SDID. PROT ̲CONT. SPI) (CCP)
Figure 4.1.5.8.5.2-5
R̲E̲L̲E̲A̲S̲E̲ ̲B̲U̲F̲F̲E̲R̲ ̲6̲
OWN ̲SDID. PROT ̲CONT. SPI. BUFFER ̲ENTRY =
OWN ̲SDID. PROT ̲CONT. BUFFER ̲ENTRY
ACTIVATE ̲SUBDEVICE ̲SPI (OWN ̲SDID. PARENT ̲SDID,
RELEASE ̲OUTPUT ̲BUFFER,
OWN ̲SDID. PROT ̲CONT. SPI) (CCP)
Figure 4.1.5.8.5.2-6
SEND ̲PROT ̲CONT (RESPONSE: BOOLEAN,
SIZE : INTEGER)
BREF = OWN ̲SDID. PROT ̲CONT. BUFFER ̲ENTRY
BREF. BUFFER ̲SIZE = SIZE
BUFFER = BREF. PAGE ̲START
START = BREF. BUFFER ̲ADDR
BUFFER (START+BUFFER ̲TYPE ̲OFFSET) = CONTROL, ENTIRE
̲LDU
BUFFER (START+CONTROL ̲REQUEST ̲OFFSET) = PROTOCOL ̲COMMAND
OWN ̲SDID. PROT ̲CONT. ID GE
PROT ̲CONT ̲ID ̲MAX? OWN ̲SDID.PROT ̲CONT.ID
= 0
OWN ̲SDID. PROT ̲CONT.ID+1
BUFFER (START+PROT ̲CONT ̲ID ̲OFFSET) = OWN ̲SDID. PROT
̲CONT.ID
OWN ̲SDID. PROT ̲CONT. BUFFER ̲STATE = NO ̲BUF
OWN ̲SDID. PROT ̲CONT. SPI. BUFFER ̲ENTRY = BREF
ACTIVATE ̲SUBDEVICE ̲SPI (OWN ̲SDID. PARENT ̲SDID,
TRANSMIT ̲OUTPUT ̲BUFFER,
OWN ̲SDID. PROT ̲CONT. SPI) (CCP)
RESPONSE EQ TRUE ?
No response expected
OWN ̲SDID. PROT ̲CONT. STATE = IDLE
NEXT ̲PROT ̲CONT () (CCP)
CCP NE OK ?
RETURN ̲PROT ̲CONT ̲BUFFER()()
RETURN
Figure 4.1.5.8.5.2-7
4.1.5.8.5.3 P̲a̲r̲e̲n̲t̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are: NOTIFY ̲PROT ̲CONT ̲OUTPUT ̲BUFFER
NOTIFY ̲PROT ̲CONT ̲OF ̲RESPONSE
NOTIFY ̲PROT ̲CONT ̲OUTPUT ̲BUFFER (BUFFER ̲REF: POINTER)()
OWN ̲SDID. PROT ̲CONT. BUFFER ̲ENTRY = BUFFER ̲REF
RETURN ̲PROT ̲CONT ̲BUFFER()()
RETURN
Figure 4.1.5.8.5.3-1
NOTIFY ̲PROT ̲CONT ̲OF ̲RESPONSE (BUFFER ̲REF: POINTER)()
BUFFER = BUFFER ̲REF. PAGE ̲START
START = BUFFER ̲REF. BUFFER ̲ADDR
BUFFER (START+PROT ̲CONT ̲ID ̲OFFSET) NE
OWN ̲SDID.PROT ̲CONT.ID? RELEASE ̲PROT
̲CONT ̲BUFFER
(BUFFER ̲REF)()
CASE EXTRACT ̲FIRST (OWN ̲SDID. PROT ̲CONT. ONGOING)(QEL)
OF
FAIL ? RELEASE ̲PROT ̲CONT ̲BUFFER (BUFFER
̲REF)()
PASS ? N̲O̲T̲I̲F̲Y̲ ̲B̲U̲F̲F̲E̲R̲ ̲3̲
END CASE
OWN ̲SDID. PROT ̲CONT. STATE = IDLE
NEXT ̲PROT ̲CONT()(CCP)
CCP NE OK ?
RETURN ̲PROT ̲CONT ̲BUFFER()()
RETURN
Figure 4.1.5.8.5.3-2
N̲O̲T̲I̲F̲Y̲ ̲B̲U̲F̲F̲E̲R̲ ̲3̲
CASE QEL. REQUESTOR OF
USER ? USER ̲PROT ̲CONT ̲RESULT (QEL, BUFFER
̲REF)()
CONTROLLER ? CONTROLLER ̲PROT ̲CONT ̲RESULT (QEL,
BUFFER ̲
REF)()
PROTOCOL ? PROTOCOL ̲PROT ̲CONT ̲RESULT (QEL, BUFFER
̲REF)()
OTHER ? PROTOCOL ̲ERROR (PROT ̲CONT ̲3 ̲3)
END CASE
Figure 4.1.5.8.5.3-3
4.1.5.8.5.4 R̲e̲q̲u̲e̲s̲t̲o̲r̲ ̲N̲o̲t̲i̲f̲i̲c̲a̲t̲i̲o̲n̲
This is RETURN ̲PROT ̲CONT ̲BUFFER
RETURN ̲PROT ̲CONT ̲BUFFER()()
OWN ̲SDID. PROT ̲CONT. BUFFER ̲STATE = DELIVERED
QEL = OWN ̲SDID. PROT ̲CONT. ONGOING. EP
BUF = OWN ̲SDID. PROT ̲CONT. BUFFER ̲ENTRY
CASE QEL. REQUESTOR OF
USER ? NOTIFY ̲USER ̲PROT ̲CONT ̲BUFFER (QEL, BUF)()
CONTROLLER? NOTIFY ̲CONTROLLER ̲PROT ̲CONT ̲BUFFER (QEL,BUF)()
PROTOCOL ? NOTIFY ̲PROTOCOL ̲PROT ̲CONT ̲BUFFER (QEL,BUF)()
OTHER ? PROTOCOL ̲ERROR (PROT ̲CONT ̲4 ̲1)
END CASE
RETURN
Figure 4.1.5.8.5.4-1
4.1.5.8.5.5 C̲o̲m̲p̲l̲e̲t̲i̲o̲n̲ ̲P̲r̲o̲c̲e̲d̲u̲r̲e̲s̲
These are: NEXT ̲PROT ̲CONT
RELEASE ̲PROT ̲CONT ̲BUFFER
PROC ̲FOR ̲END ̲OF ̲PROT ̲CONT.
NEXT ̲PROT ̲CONT()(CC: COMPLETION ̲CODE)
CASE EXTRACT ̲FIRST (OWN ̲SDID. PROT ̲CONT. PENDING)(QEL)
OF
FAIL ? CC = NO ̲PENDING
PASS ?
END CASE
OWN ̲SDID. PROT ̲CONT. STATE = ACTIVE
QUEUE (OWN ̲SDID, PROT ̲CONT. ONGOING, QEL)()
OWN ̲SDID. PROT ̲CONT. BUFFER ̲STATE = PENDING ̲RESERVE
ACTIVATE ̲SUBDEVICE ̲SPI (OWN ̲SDID. PARENT ̲SDID,
RESERVE ̲OUTPUT ̲BUFFER,
OWN ̲SDID. PROT ̲CONT. SPI)(CCP)
CCP EQ REQUEST ̲QUEUED ? CC = REQUEST ̲QUEUED
OWN ̲SDID. PROT ̲CONT. BUFFER ̲ENTRY =
OWN ̲SDID. PROT ̲CONT. SPI. BUFFER ̲ENTRY
CC = OK
RETURN
Figure 4.1.5.8.5.5-1
RELEASE ̲PROT ̲CONT ̲BUFFER (BUFFER ̲REF: POINTER)()
OWN ̲SDID. PROT ̲CONT. SPI. BUFFER ̲ENTRY= BUFFER ̲REF
ACTIVATE ̲SUBDEVICE ̲SPI (OWN ̲SDID. PARENT ̲SDID,
RELEASE ̲INPUT ̲BUFFER,
OWN ̲SDID. PROT ̲CONT. SPI) (CCP)
RETURN
Figure 4.1.5.8.5.5-2
PROC ̲FOR ̲END ̲OF ̲PROT ̲CONT()()
CASE EXTRACT ̲FIRST (OWN ̲SDID. PROT ̲CONT. ONGOING)(QEL)
OF
FAIL ? PROTOCOL ̲ERROR (PROT ̲CONT ̲5 ̲3)
PASS ?
END CASE
OWN ̲SDID. PROT ̲CONT. STATE = IDLE
RETURN
Figure 4.1.5.8.5.5-3