As mentioned above, IORBs are managed by user tasks. The user program prepares the IORB data structure and passes it to the read and write calls.
Example 8-2. IORB base class
typedef struct Cyg_IORB_t { friend class Cyg_Device; private: Cyg_Device * pdevice; // Accessor functions void set_pdevice(Cyg_Device * device) { pdevice = device; } public: // Accessor functions Cyg_Device * get_pdevice(void) { return(pdevice); } struct Cyg_IORB_t * volatile next; void * buffer; // ptr to buffer cyg_uint32 buffer_length; // length of buffer volatile cyg_uint32 xferred_length; // length of buffer xferd cyg_uint8 opcode; // operation code + options volatile cyg_uint8 status; // state, result + error code CYG_ADDRWORD callback_data; // data field for callback routine void (*callback)( struct Cyg_IORB_t * piorb); } Cyg_IORB; |
Example 8-3. IORB operation flag codes and result status codes
// opcodes #define CYG_IORB_NOBLOCK 0x01 // opcode for special serial reads // Resultstatus codes #define CYG_IORB_OK 0x00 #define CYG_IORB_CANCELED 0x02 |
Example 8-4. Definition of the Cyg_Device class
class Cyg_Device { protected: // Accessor functions void set_iorb_pdevice( Cyg_IORB * iorb ) { iorb->set_pdevice( this ); } public: }; |