FreeCalypso > hg > fc-tourmaline
view src/gpf/inc/dio.h @ 268:f2e52cab0a73
abb_inth.c: check all interrupt causes, not just one
The original code used if - else if - else if etc constructs, thus
the first detected interrupt was the only one handled. However,
Iota ITSTATREG is a clear-on-read register, thus if we only handle
the first detected interrupt and skip checking the others, then the
other interrupts will be lost, if more than one interrupt happened
to occur in one ABB interrupt handling cycle - a form of rare race
condition. Change the code to check all interrupts that were read
in this cycle.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 13 Jun 2021 18:17:53 +0000 |
parents | 4e78acac3d88 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Copyright 2004 Texas Instruments Berlin, AG | All rights reserved. | | This file is confidential and a trade secret of Texas | Instruments Berlin, AG | The receipt of or possession of this file does not convey | any rights to reproduce or disclose its contents or to | manufacture, use, or sell anything it may describe, in | whole, or in part, without the specific written consent of | Texas Instruments Berlin, AG. +----------------------------------------------------------------------------- | Purpose : General definitions of DIO driver interface +----------------------------------------------------------------------------- */ #ifndef __DIO_H__ #define __DIO_H__ /*==== INCLUDES =============================================================*/ #include "gdi.h" /*==== DEFINITIONS ==========================================================*/ /* * Device Type */ #define DIO_DATA_SER 0x00800000 /* device can transfer serial data */ #define DIO_DATA_PKT 0x00400000 /* device can transfer packet data */ #define DIO_DATA_MUX 0x00200000 /* device can start a multiplexer */ #define DIO_TYPE_ID 0x0000FF00 /* id to separate different capabilities */ #define DIO_TYPE_SER (DIO_DATA_SER | 0x00000100) /* serial device */ #define DIO_TYPE_SER_MUX (DIO_DATA_SER | DIO_DATA_MUX | 0x00000100) /* mux device */ #define DIO_TYPE_PKT (DIO_DATA_PKT | 0x00000100) /* packet device */ /* * Device Flags */ #define DIO_FLAG_SLEEP 0x80000000 /* sleep state allowed */ /* * Baud rates */ #define DIO_BAUD_921600 0x00800000 #define DIO_BAUD_812500 0x00400000 #define DIO_BAUD_460800 0x00200000 #define DIO_BAUD_406250 0x00100000 #define DIO_BAUD_230400 0x00080000 #define DIO_BAUD_203125 0x00040000 #define DIO_BAUD_115200 0x00020000 #define DIO_BAUD_57600 0x00010000 #define DIO_BAUD_38400 0x00008000 #define DIO_BAUD_33900 0x00004000 #define DIO_BAUD_28800 0x00002000 #define DIO_BAUD_19200 0x00001000 #define DIO_BAUD_14400 0x00000800 #define DIO_BAUD_9600 0x00000400 #define DIO_BAUD_7200 0x00000200 #define DIO_BAUD_4800 0x00000100 #define DIO_BAUD_2400 0x00000080 #define DIO_BAUD_1200 0x00000040 #define DIO_BAUD_600 0x00000020 #define DIO_BAUD_300 0x00000010 #define DIO_BAUD_150 0x00000008 #define DIO_BAUD_110 0x00000004 #define DIO_BAUD_75 0x00000002 #define DIO_BAUD_AUTO 0x00000001 /* automatic baud rate detection */ /* * Character framing */ #define DIO_CF_7N1 0x00000800 #define DIO_CF_7S1 0x00000400 #define DIO_CF_7M1 0x00000200 #define DIO_CF_7E1 0x00000100 #define DIO_CF_7O1 0x00000080 #define DIO_CF_7N2 0x00000040 #define DIO_CF_8N1 0x00000020 #define DIO_CF_8S1 0x00000010 #define DIO_CF_8M1 0x00000008 #define DIO_CF_8E1 0x00000004 #define DIO_CF_8O1 0x00000002 #define DIO_CF_8N2 0x00000001 /* * Types of flow control */ #define DIO_FLOW_XTR_CTS 0x00000800 /* TX= transp. XON/XOFF RX=CTS */ #define DIO_FLOW_XTR_XOFF 0x00000400 /* TX= transp. XON/XOFF RX=XON/XOFF */ #define DIO_FLOW_XTR_NO 0x00000200 /* TX= transp. XON/XOFF RX=OFF */ #define DIO_FLOW_RTS_CTS 0x00000100 /* TX=RTS RX=CTS */ #define DIO_FLOW_RTS_XOFF 0x00000080 /* TX=RTS RX=XON/XOFF */ #define DIO_FLOW_RTS_NO 0x00000040 /* TX=RTS RX=OFF */ #define DIO_FLOW_XON_CTS 0x00000020 /* TX=XON/XOFF RX=CTS */ #define DIO_FLOW_XON_XOFF 0x00000010 /* TX=XON/XOFF RX=XON/XOFF */ #define DIO_FLOW_XON_NO 0x00000008 /* TX=XON/XOFF RX=OFF */ #define DIO_FLOW_NO_CTS 0x00000004 /* TX=OFF RX=CTS */ #define DIO_FLOW_NO_XOFF 0x00000002 /* TX=OFF RX=XON/XOFF */ #define DIO_FLOW_NONE 0x00000001 /* TX=OFF RX=OFF */ /* * Serial device flags */ #define DIO_FLAG_SER_ESC 0x80000000 /* device supports esc seq detection */ /* * MUX mode */ #define DIO_MUX_I 0x00000008 /* advanced option with I frames */ #define DIO_MUX_UI 0x00000004 /* advanced option with UI frames */ #define DIO_MUX_UIH 0x00000002 /* advanced option with UIH frames */ #define DIO_MUX_BASIC 0x00000001 /* basic option */ /* * Sleep Mode */ #define DIO_SLEEP_ENABLE 0x01 /* enter sleep mode if possible */ #define DIO_SLEEP_DISABLE 0x02 /* do not enter sleep mode */ /* * Special Guard Period */ #define DIO_ESC_OFF 0x0000 /* turn escape sequence detection off */ /* * Device Mode */ #define DIO_MODE_MUX 0x00000002 /* acts as 27.010 multiplexer device */ #define DIO_MODE_SER 0x00000001 /* acts as serial device */ /* * Control Type */ #define DIO_CTRL_LINES 0x0001 /* associated structure is T_DIO_CTRL_LINES */ #define DIO_CTRL_MUX 0x0002 /* associated structure is T_DIO_CTRL_MUX */ /* * Line State definition & control structure. */ #define DIO_SA 0x80000000 /* state: read=DTR write-DSR */ #define DIO_SB 0x40000000 /* state: read=RTS write=DCD */ #define DIO_X 0x20000000 /* state: read=RTS write=CTS */ #define DIO_RING 0x10000000 /* state: ring indicator */ #define DIO_ESC 0x08000000 /* state: escape sequence detested. */ #define DIO_MUX_STOPPED 0x04000000 /* multiplexer stopped */ #define DIO_BRK 0x02000000 /* state: break received/to be sent */ #define DIO_BRKLEN 0x000000FF /* state: break signal # of characters */ /*==== TYPES ================================================================*/ /* * Device Capabilities */ typedef struct { U32 device_type; U32 device_flags; U16 mtu_control; U16 mtu_data; char const *driver_name; } T_DIO_CAP; typedef struct { U32 device_type; U32 device_flags; U16 mtu_control; U16 mtu_data; char const *driver_name; U32 baudrate_auto; U32 baudrate_fixed; U32 char_frame; U32 flow_control; U32 ser_flags; } T_DIO_CAP_SER; typedef struct { U32 device_type; U32 device_flags; U16 mtu_control; U16 mtu_data; char const *driver_name; U32 baudrate_auto; U32 baudrate_fixed; U32 char_frame; U32 flow_control; U32 ser_flags; U32 mux_mode; } T_DIO_CAP_SER_MUX; typedef struct { U32 device_type; U32 device_flags; U16 mtu_control; U16 mtu_data; char const *driver_name; } T_DIO_CAP_PKT; /* * Device Control Block */ typedef struct { U32 device_type; /*< 0: 4> device identifier with general capability information */ U8 sleep_mode; /*< 4: 1> enter sleep mode is possible or not */ U8 _align0; /*< 5: 1> alignment */ U8 _align1; /*< 6: 1> alignment */ U8 _align2; /*< 7: 1> alignment */ } T_DIO_DCB; typedef struct { U32 device_type; /*< 0: 4> device identifier with general capability information */ U8 sleep_mode; /*< 4: 1> enter sleep mode is possible or not */ U8 _align0; /*< 5: 1> alignment */ U8 _align1; /*< 6: 1> alignment */ U8 _align2; /*< 7: 1> alignment */ U32 baudrate; /*< 8: 4> user set baudrate */ U32 char_frame; /*< 12: 4> supported character framing */ U32 flow_control; /*< 16: 4> supported modes of flow control */ U8 xon; /*< 20: 1> set/reset XON for flow control */ U8 xoff; /*< 21: 1> set/reset XOFF for flow control */ U8 esc_char; /*< 22: 1> ASCII character which is used in an escape sequence */ U8 _align3; /*< 23: 1> alignment */ U16 guard_period; /*< 24: 2> duration value for escape sequence */ U8 _align4; /*< 26: 1> alignment */ U8 _align5; /*< 27: 1> alignment */ } T_DIO_DCB_SER; typedef struct { U32 device_type; /*< 0: 4> device identifier with general capability information */ U8 sleep_mode; /*< 4: 1> enter sleep mode is possible or not */ U8 _align0; /*< 5: 1> alignment */ U8 _align1; /*< 6: 1> alignment */ U8 _align2; /*< 7: 1> alignment */ U32 baudrate; /*< 8: 4> user set baudrate */ U32 char_frame; /*< 12: 4> supported character framing */ U32 flow_control; /*< 16: 4> supported modes of flow control */ U8 xon; /*< 20: 1> set/reset XON for flow control */ U8 xoff; /*< 21: 1> set/reset XOFF for flow control */ U8 esc_char; /*< 22: 1> ASCII character which is used in an escape sequence */ U8 _align3; /*< 23: 1> alignment */ U16 guard_period; /*< 24: 2> duration value for escape sequence */ U8 _align4; /*< 26: 1> alignment */ U8 _align5; /*< 27: 1> alignment */ U32 device_mode; /*< 28: 4> work mode of device */ U32 mux_mode; /*< 32: 4> supported multiplexer modes */ U16 n1; /*< 36: 2> max frame size of mux frame */ U8 n2; /*< 38: 1> max number of retransmissions */ U8 t1; /*< 39: 1> acknowledgement timer */ U8 t2; /*< 40: 1> response timer */ U8 t3; /*< 41: 1> wake up response timer */ U8 k; /*< 42: 1> windows size */ U8 _align6; /*< 43: 1> alignment */ } T_DIO_DCB_SER_MUX; typedef struct { U32 device_type; /*< 0: 4> device identifier with general capability information */ U8 sleep_mode; /*< 4: 1> enter sleep mode is possible or not */ U8 _align0; /*< 5: 1> alignment */ U8 _align1; /*< 6: 1> alignment */ U8 _align2; /*< 7: 1> alignment */ } T_DIO_DCB_PKT; /* * Data Control */ typedef struct { U16 control_type ; U16 length ; }T_DIO_CTRL ; typedef struct { U16 control_type; U16 length; U32 state; } T_DIO_CTRL_LINES; typedef struct { U16 control_type ; U16 length ; U32 state; }T_DIO_CTRL_MUX ; /* * DIO Data format. */ typedef struct { U8 _align0; /*< 0: 1> alignment */ U8 _align1; /*< 1: 1> alignment */ U16 c_data; /*< 2: 2> counter */ U8 *ptr_data; /*< 4: 4> pointer to pointer to the first byte of the data buffer segment */ } T_dio_segment; typedef struct { U16 length; /*< 0: 2> len of dio_ctrl */ U8 _align0; /*< 2: 1> alignment */ U8 c_dio_segment; /*< 3: 1> counter */ T_dio_segment *ptr_dio_segment; /*< 4: 4> pointer to Structured Element */ } T_dio_buffer; /*==== PROTOTYPES ===========================================================*/ /* +------------------------------------------------------------------------------ | Function : dio_init +------------------------------------------------------------------------------ | Description : The function initializes the interface and the drivers. | | Parameters : none | | Return : DRV_OK - Initialization successful | DRV_INITIALIZED - Interface already initialized | DRV_INITFAILURE - Initialization failed | +------------------------------------------------------------------------------ */ extern U16 dio_init(void); /* +------------------------------------------------------------------------------ | Function : dio_user_init +------------------------------------------------------------------------------ | Description : The function sets the signal callback of a DIO user. | | Parameters : user_name - DIO user name | drv_handle - unique handle for this user | signal_callback - callback function for this user | | Return : DRV_OK - Callback successfully set | DRV_INVALID_PARAMS - The specified user does not exist | DRV_INTERNAL_ERROR - Internal error | DRV_NOTCONFIGURED - DIO interface is not yet initialized. | +------------------------------------------------------------------------------ */ extern U16 dio_user_init(char const * user_name, U16 drv_handle, T_DRV_CB_FUNC signal_callback); /* +------------------------------------------------------------------------------ | Function : dio_user_exit +------------------------------------------------------------------------------ | Description : Termination of User Operation. | | Parameters : user_name - DIO user name | | Return : DRV_OK - User operation successfully terminated. | DRV_INVALID_PARAMS - User operation can not be terminated yet. | DRV_INTERNAL_ERROR - Internal error | +------------------------------------------------------------------------------ */ extern U16 dio_user_exit(char const * user_name); /* +------------------------------------------------------------------------------ | Function : dio_exit +------------------------------------------------------------------------------ | Description : Termination of the Interface. | | Parameters : none | | Return : none | +------------------------------------------------------------------------------ */ extern void dio_exit(void); /* +------------------------------------------------------------------------------ | Function : dio_set_rx_buffer +------------------------------------------------------------------------------ | Description : This function provides a receive buffer to the driver. | | Parameters : device - device number | buffer - buffer to copy received data in it | | Return : DRV_OK - Function successful | DRV_BUFFER_FULL - Buffer queue full. | DRV_INVALID_PARAMS - The specified device does not exist or | the data buffer is not big enough. | DRV_INTERNAL_ERROR - Internal driver error | DRV_NOTCONFIGURED - The device is not yet configured | +------------------------------------------------------------------------------ */ extern U16 dio_set_rx_buffer(U32 device, T_dio_buffer * buffer); /* +------------------------------------------------------------------------------ | Function : dio_read +------------------------------------------------------------------------------ | Description : This function returns a receive buffer and control information. | | Parameters : device - device number | control_info - control information from the driver | buffer - buffer with received data in it | | Return : DRV_OK - Function successful | DRV_INVALID_PARAMS - The specified device does not exist | DRV_INTERNAL_ERROR - Internal driver error | DRV_NOTCONFIGURED - The device is not yet configured | +------------------------------------------------------------------------------ */ extern U16 dio_read(U32 device, T_DIO_CTRL * control_info, T_dio_buffer ** buffer); /* +------------------------------------------------------------------------------ | Function : dio_write +------------------------------------------------------------------------------ | Description : This function provides a send buffer to the driver which | contains data to send. | | Parameters : device - device number | control_info - control information for the driver | buffer - buffer with data to send | | Return : DRV_OK - Function successful | DRV_BUFFER_FULL - Buffer queue full. | DRV_INVALID_PARAMS - The specified device does not exist or | the data buffer to big. | DRV_INTERNAL_ERROR - Internal driver error | DRV_NOTCONFIGURED - The device is not yet configured | +------------------------------------------------------------------------------ */ extern U16 dio_write(U32 device, T_DIO_CTRL * control_info, T_dio_buffer * buffer); /* +------------------------------------------------------------------------------ | Function : dio_get_tx_buffer +------------------------------------------------------------------------------ | Description : This function returns a send buffer provided via dio_write(). | | Parameters : device - device number | buffer - return sent data buffer | | Return : DRV_OK - Function successful | DRV_INVALID_PARAMS - The specified device does not exist | DRV_INTERNAL_ERROR - Internal driver error | DRV_NOTCONFIGURED - The device is not yet configured | +------------------------------------------------------------------------------ */ extern U16 dio_get_tx_buffer(U32 device, T_dio_buffer ** buffer); /* +------------------------------------------------------------------------------ | Function : dio_clear +------------------------------------------------------------------------------ | Description : This function is used to clear the hardware send buffer. | | Parameters : device - device number | | Return : DRV_OK - Function successful | DRV_INVALID_PARAMS - The specified device does not exist | DRV_INTERNAL_ERROR - Internal driver error | DRV_NOTCONFIGURED - The device is not yet configured | DRV_INPROCESS - The driver is busy clearing the buffer | +------------------------------------------------------------------------------ */ extern U16 dio_clear(U32 device); /* +------------------------------------------------------------------------------ | Function : dio_flush +------------------------------------------------------------------------------ | Description : With this function the driver is requested to inform the | user, when data of the hardware send buffer have been written | successfully. | | Parameters : device - device number | | Return : DRV_OK - Function successful | DRV_INVALID_PARAMS - The specified device does not exist | DRV_INTERNAL_ERROR - Internal driver error | DRV_NOTCONFIGURED - The device is not yet configured | DRV_INPROCESS - The driver is busy flushing the buffer | +------------------------------------------------------------------------------ */ extern U16 dio_flush(U32 device); /* +------------------------------------------------------------------------------ | Function : dio_get_capabilities +------------------------------------------------------------------------------ | Description : This function is used to retrieve the capabilities of a device. | | Parameters : device - device number | capabilities - Return: Pointer to the device capabilities | | Return : DRV_OK - Function successful | DRV_INVALID_PARAMS - The specified device does not exist | DRV_INTERNAL_ERROR - Internal driver error | +------------------------------------------------------------------------------ */ extern U16 dio_get_capabilities(U32 device, T_DIO_CAP ** capabilities); /* +------------------------------------------------------------------------------ | Function : dio_set_config +------------------------------------------------------------------------------ | Description : This function is used to configure a device. | | Parameters : device - device number | dcb - pointer to a device control block | | Return : DRV_OK - Function successful | DRV_INVALID_PARAMS - parameter invalid or out of range | DRV_INTERNAL_ERROR - Internal driver error | +------------------------------------------------------------------------------ */ extern U16 dio_set_config(U32 device, T_DIO_DCB * dcb); /* +------------------------------------------------------------------------------ | Function : dio_get_config +------------------------------------------------------------------------------ | Description : This function reads the device configuration. | | Parameters : device - device number | dcb - pointer to a device control block | | Return : DRV_OK - Function successful | DRV_INVALID_PARAMS - The specified device does not exist or | wrong Device Control Block provided. | DRV_INTERNAL_ERROR - Internal driver error | DRV_NOTCONFIGURED - The device is not yet configured | +------------------------------------------------------------------------------ */ extern U16 dio_get_config(U32 device, T_DIO_DCB * dcb); /* +------------------------------------------------------------------------------ | Function : dio_close_device +------------------------------------------------------------------------------ | Description : This function is used to close a device. | | Parameters : device - device number | | Return : DRV_OK - Function successful | DRV_INVALID_PARAMS - The specified device can not be closed yet | DRV_INTERNAL_ERROR - Internal driver error | +------------------------------------------------------------------------------ */ extern U16 dio_close_device(U32 device); #endif /* __DIO_H__ */