Interrupt handling – Comtrol eCos User Manual

Page 772

Advertising
background image

Writing New Devices - target

arg1

arg2

For some requests it is convenient to pass one or two additional parameters alongside the request code. For
example an ethernet device could define a multicast-all request, with

arg1

controlling whether this mode

should be enabled or disabled. Both

arg1

and

arg2

should be signed 32-bit integers, and their values are

interpreted only by the device-specific Tcl script.

txdata

txlen

Some I/O operations may involve sending additional data, for example an ethernet packet. Alternatively a
control operation may require many more parameters than can easily be encoded in

arg1

and

arg2

, so those

parameters have to be placed in a suitable buffer and extracted at the other end.

txdata

is an arbitrary buffer

of

txlen

bytes that should be sent to the host-side. There is no specific upper bound on the number of bytes

that can be sent, but usually it is a good idea to allocate the transmit buffer statically and keep transfers down
to at most several kilobytes.

reply

If the host-side is expected to send a reply message then

reply

should be a pointer to an integer variable and

will be updated with a reply code, a simple 32-bit integer. The synthetic target HAL code assumes that the
host-side and target-side agree on the protocol being used: if the host-side will not send a reply to this message
then the

reply

argument should be a NULL pointer; otherwise the host-side must always send a reply code

and the

reply

argument must be valid.

rxdata

rxlen

Some operations may involve additional data coming from the host-side, for example an incoming ethernet
packet.

rxdata

should be a suitably-sized buffer, and

rxlen

a pointer to an integer variable that will end up

containing the number of bytes that were actually received. These arguments will only be used if the host-side
is expected to send a reply and hence the

reply

argument was not NULL.

max_rxlen

If a reply to this message is expected and that reply may involve additional data,

max_rxlen

limits the size of

that reply. In other words, it corresponds to the size of the

rxdata

buffer.

Most I/O operations involve only some of the arguments. For example transmitting an ethernet packet would use the

request

,

txdata

and

txlen

fields (in addition to

device_id

which is always required), but would not involve

arg1

or

arg2

and no reply would be expected. Receiving an ethernet packet would involve

request

,

rxdata

,

rxlen

and

max_rxlen

; in addition

reply

is needed to get any reply from the host-side at all, and could be used

to indicate whether or not any more packets are buffered up. A control operation such as enabling multicast mode
would involve

request

and

arg1

, but none of the remaining arguments.

Interrupt Handling

Interrupt handling in the synthetic target is much the same as on a real target. An interrupt object is created using

cyg_drv_interrupt_create

, attached, and unmasked. The emulated device - in other words the Tcl script run-

ning inside the I/O auxiliary - can raise an interrupt. Subject to interrupts being disabled and the appropriate vector
being masked, the system will invoke the specified ISR function. The synthetic target HAL implementation does

668

Advertising