1 /**************************************************************/
2 /*** Module : USB module - header file ***/
3 /*** Author : Roman Bartosinski (C) 28.04.2002 ***/
4 /*** Modify : 08.08.2002 ***/
5 /*** Rewrite: 05.09.2002 ***/
6 /**************************************************************/
13 #if defined(SDCC) || defined(__KEIL__) || defined(__C51__)
14 /*8051 special handling*/
15 #define REENTRANT_SIGN reentrant
17 #define xdata /*nothing*/
18 #define REENTRANT_SIGN /*nothing*/
21 #define USB_WITH_CB_FNC
22 //#define USB_WITH_UDEV_FNC
24 #ifdef USB_WITH_UDEV_FNC
25 #define USB_UDEV_REENTRANT_SIGN REENTRANT_SIGN
26 #else /*USB_WITH_UDEV_FNC*/
27 #define USB_UDEV_REENTRANT_SIGN /*nothing*/
28 #endif /*USB_WITH_UDEV_FNC*/
30 /* control endpoint */
31 #define MAX_CONTROL_XFER_DATA_SIZE 8
35 typedef void endfnc_t( struct usb_ep_t *ep) REENTRANT_SIGN;
37 #define USB_NEXT_PKT_SEND 0
38 #define USB_NEXT_PKT_REC 1
40 #define USB_COMPLETE_OK 0
41 #define USB_COMPLETE_FAIL -1
43 typedef struct usb_ep_t {
44 struct usb_device_t *udev; /* pointer to parent device */
45 unsigned short max_packet_size; /* max. size of endpoint package, e.g. PDI_EP0_PACKET_SIZE */
46 unsigned char *ptr; /* pointer to current transmitted data */
47 unsigned int size; /* full size of current transmitted data */
48 unsigned int actual; /* transmitted data size */
49 endfnc_t *efnc; /* ??? */
50 unsigned char flags; /* endpoint flags & state - idle,receiving, transmitting ??? HERE ??? */
51 unsigned char epnum; /* endpoint number (index) - endpoint0 must be set to 0 */
52 unsigned short event_mask; /* event(interrupt) mask for this endpoint, e.g. PDI_INT_EP1_IN for pdiusbd1x */
53 #ifdef USB_WITH_CB_FNC
54 int (*next_pkt_fnc)(struct usb_ep_t *ep, int len, int codeval) REENTRANT_SIGN;
55 int (*complete_fnc)(struct usb_ep_t *ep, int status) REENTRANT_SIGN;
57 #endif /*USB_WITH_CB_FNC*/
61 /* Vendor & Class functions */
63 #ifdef USB_WITH_CB_FNC
64 typedef int usb_vendor_extension_fnc_t(usb_ep_t *ep, USB_DEVICE_REQUEST *dreq);
65 extern xdata usb_vendor_extension_fnc_t USBVendorRequestCBFnc;
67 typedef int usb_class_extension_fnc_t(usb_ep_t *ep, USB_DEVICE_REQUEST *dreq);
68 extern xdata usb_class_extension_fnc_t USBClassRequestCBFnc;
69 #else //USB_WITH_CB_FNC
70 char USBVendorRequest( USB_DEVICE_REQUEST *dr);
71 char USBClassRequest( USB_DEVICE_REQUEST *dr);
72 #endif //USB_WITH_CB_FNC
77 typedef struct usb_device_t {
78 unsigned char id; /* device ID ??? */
79 unsigned char flags; /* usb device flags + endpoint0 events */
80 unsigned char ep_events; /* one bit for each endpoint (without ep0) event,(bit0 for udev->ep[0], bit1 for udev->ep[1], ...)*/
81 unsigned char configuration; /* current configuration */
82 // unsigned char interface; /* current interface */
83 // unsigned char altinterface; /* current alternative interface */
85 //int (stdreq[13])( struct usb_device_t *udev) REENTRANT_SIGN; /* pointer to array of standard request processing functions */
86 int (*vendor_fnc)( struct usb_device_t *udev) REENTRANT_SIGN; /* pointer to vendor request processing function */
87 int (*class_fnc)( struct usb_device_t *udev) REENTRANT_SIGN; /* pointer to class request processing function */
89 #ifdef USB_WITH_UDEV_FNC
90 int (*init)( struct usb_device_t *udev) REENTRANT_SIGN; /* function for hw specific part of initialize usb device */
91 int (*connect)( struct usb_device_t *udev) REENTRANT_SIGN; /* function for hw specific part of connecting device to usb */
92 int (*disconnect)( struct usb_device_t *udev) REENTRANT_SIGN; /* function for hw specific part of disconnecting device to usb */
93 void (*ack_setup)( struct usb_device_t *udev) REENTRANT_SIGN; /* function for hw specific part of control response acknowledge */
94 void (*ack_control_setup)( struct usb_device_t *udev) REENTRANT_SIGN; /* function for hw specific part of control response acknowledge */
95 int (*check_events)( struct usb_device_t *udev) REENTRANT_SIGN; /* hw specific part of function for checking events */
96 void (*stall)( usb_ep_t *ep) REENTRANT_SIGN; /* hw specific function for stall endpoint */
97 int (*read_endpoint)( usb_ep_t *ep, void *ptr, int size) REENTRANT_SIGN;
98 int (*write_endpoint)( usb_ep_t *ep, const void *ptr, int size) REENTRANT_SIGN;
99 #endif /*USB_WITH_UDEV_FNC*/
101 // USB_DEVICE_REQUEST *request; /* current usb request - only if there is a valid usb request in processing */
102 USB_DEVICE_REQUEST request; /* usb device request */
104 unsigned char cntep; /* number of device endpoints in ep array without EP0 */
105 usb_ep_t ep0; /* endpoint 0 */
106 usb_ep_t *ep; /* others endpoints in array */
112 #define USB_STATE_IDLE 0x00
113 #define USB_STATE_TRANSMIT 0x01
114 #define USB_STATE_RECEIVE 0x02
115 #define USB_STATE_MASK 0x03
117 /* usb_device flags */
118 #define USB_FLAG_CONFIGURED 0x01
119 #define USB_FLAG_BUS_RESET 0x02
120 #define USB_FLAG_SUSPEND 0x04
121 #define USB_FLAG_SETUP 0x08 // setup_packet
122 #define USB_FLAG_REMOTE_WAKE 0x10
124 #define USB_FLAG_EVENT_RX0 0x40
125 #define USB_FLAG_EVENT_TX0 0x80
129 /* device functions - inline ??? */
130 int usb_init( usb_device_t *udev);
131 int usb_connect( usb_device_t *udev);
132 int usb_disconnect( usb_device_t *udev);
133 void usb_stall( usb_ep_t *ep);
135 #define usb_stall_ep0( udev) \
137 usb_stall( &(udev->ep0)); \
140 /* check usb events(interrupts) */
141 int usb_check_events( usb_device_t *udev);
142 /* response to standard constrol requests */
143 int usb_control_response( usb_device_t *udev);
144 /* send control data */
145 void usb_send_control_data( usb_device_t *udev, unsigned char *pData, unsigned short len);
146 void usb_set_control_endfnc( usb_device_t *udev, endfnc_t *efnc);// REENTRANT_SIGN;
147 void usb_ack_setup( usb_ep_t *ep);
150 /* Standard requests functions */
151 // typedef int (*usb_stdreq_fnc_t)( usb_device_t *udev) REENTRANT_SIGN;
152 // extern xdata usb_stdreq_fnc_t usb_standard_requests[13];
155 #ifdef USB_WITH_UDEV_FNC
157 #define usb_udev_is_fnc(_M_udev, _M_fnc) (_M_udev->_M_fnc)
159 #define usb_udev_init(_M_udev) (_M_udev->init(_M_udev))
160 #define usb_udev_connect(_M_udev) (_M_udev->connect(_M_udev))
161 #define usb_udev_disconnect(_M_udev) (_M_udev->disconnect(_M_udev))
162 #define usb_udev_ack_setup(_M_udev) (_M_udev->ack_setup(_M_udev))
163 #define usb_udev_ack_control_setup(_M_udev) (_M_udev->ack_control_setup(_M_udev))
164 #define usb_udev_check_events(_M_udev) (_M_udev->check_events(_M_udev))
166 #define usb_udev_stall(_M_ep) ((_M_ep)->udev->stall(_M_ep))
168 #define usb_udev_read_endpoint(_M_ep, _M_ptr, _M_size) \
169 ((_M_ep)->udev->read_endpoint(_M_ep, _M_ptr, _M_size))
171 #define usb_udev_write_endpoint(_M_ep, _M_ptr, _M_size) \
172 ((_M_ep)->udev->write_endpoint(_M_ep, _M_ptr, _M_size))
174 #else /*USB_WITH_UDEV_FNC*/
176 #define USB_PDI_DIRECT_FNC
179 #endif /*USB_WITH_UDEV_FNC*/