]> rtime.felk.cvut.cz Git - lincan.git/blob - embedded/libs4c/usb/base/usb/usb.h
40338a6b68bd572707dbe95852a1b65dbb39731d
[lincan.git] / embedded / libs4c / usb / base / usb / usb.h
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 /**************************************************************/
7
8 #ifndef _USB_MODULE_
9   #define _USB_MODULE_
10
11   #include "usb_spec.h"
12   
13 #if defined(SDCC) || defined(__KEIL__) || defined(__C51__)
14   /*8051 special handling*/
15   #define REENTRANT_SIGN reentrant
16 #else
17   #define xdata           /*nothing*/
18   #define REENTRANT_SIGN  /*nothing*/
19 #endif
20
21 #define USB_WITH_CB_FNC
22 //#define USB_WITH_UDEV_FNC
23
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*/
29
30 /* control endpoint */
31   #define MAX_CONTROL_XFER_DATA_SIZE 8
32
33   struct usb_ep_t;
34   
35   typedef void endfnc_t( struct  usb_ep_t *ep) REENTRANT_SIGN;
36   
37   #define USB_NEXT_PKT_SEND 0
38   #define USB_NEXT_PKT_REC  1
39
40   #define USB_COMPLETE_OK   0
41   #define USB_COMPLETE_FAIL -1
42
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;
56     long user_data;
57    #endif /*USB_WITH_CB_FNC*/
58   } usb_ep_t;
59
60
61 /* Vendor & Class functions */
62 /*
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;
66
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
73 */
74
75  
76 /* USB device */  
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 */
84
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 */
88
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*/
100     
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 */
103     
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 */
107   } usb_device_t;
108
109
110 /* endpoint flags */
111   /* endpoint state */
112   #define USB_STATE_IDLE       0x00
113   #define USB_STATE_TRANSMIT   0x01
114   #define USB_STATE_RECEIVE    0x02
115   #define USB_STATE_MASK       0x03
116
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
123   
124   #define USB_FLAG_EVENT_RX0  0x40
125   #define USB_FLAG_EVENT_TX0  0x80
126   
127
128
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);
134   
135   #define usb_stall_ep0( udev) \
136     do { \
137       usb_stall( &(udev->ep0)); \
138     } while(0)
139
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);
148
149   
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];
153   
154
155 #ifdef USB_WITH_UDEV_FNC
156
157   #define usb_udev_is_fnc(_M_udev, _M_fnc) (_M_udev->_M_fnc)
158   
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))
165
166   #define usb_udev_stall(_M_ep) ((_M_ep)->udev->stall(_M_ep))
167
168   #define usb_udev_read_endpoint(_M_ep, _M_ptr, _M_size) \
169         ((_M_ep)->udev->read_endpoint(_M_ep, _M_ptr, _M_size))
170
171   #define usb_udev_write_endpoint(_M_ep, _M_ptr, _M_size) \
172         ((_M_ep)->udev->write_endpoint(_M_ep, _M_ptr, _M_size))
173
174 #else /*USB_WITH_UDEV_FNC*/
175
176   #define USB_PDI_DIRECT_FNC
177   #include "pdi.h"
178
179 #endif /*USB_WITH_UDEV_FNC*/
180  
181 #endif