]> rtime.felk.cvut.cz Git - lincan.git/blob - embedded/libs4c/usb/more/usb_srq.c
Included ARM LPC21xx related code from uLan project. The snapshot date is 2008-07-05
[lincan.git] / embedded / libs4c / usb / more / usb_srq.c
1 /*****************************************************/
2 /***   Module : USB module                         ***/
3 /***   Author : Roman Bartosinski (C) 28.04.2002   ***/
4 /***   Modify : 08.08.2002, 16.04.2003             ***/
5 /*****************************************************/
6
7 #include <string.h>
8
9 #include <system_def.h>
10 #include <usb/usb.h>
11 #include <usb/usb_spec.h>
12 #include <usb/pdiusb.h>
13 #include <usb/usbdebug.h>
14 #include <usb/usb_srq.h>
15 #include <usb/usb_defs.h>
16
17   // ****************************
18   int usb_stdreq_get_status( usb_device_t *udev)
19   {
20     unsigned char c, buf[2] = { 0, 0};
21     unsigned char epid = (unsigned char) udev->request.wIndex;
22
23     usb_debug_print( DEBUG_LEVEL_HIGH, ("GetStatus\n"));
24     switch( udev->request.bmRequestType & USB_RECIPIENT) {
25       case USB_RECIPIENT_DEVICE:
26         if ( udev->flags & USB_FLAG_REMOTE_WAKE) //.remote_wake_up == 1)
27           buf[0] = USB_GETSTATUS_REMOTE_WAKEUP_ENABLED | USB_GETSTATUS_SELF_POWERED;
28         else
29           buf[0] = USB_GETSTATUS_SELF_POWERED;
30         break;
31       case USB_RECIPIENT_INTERFACE:
32         break;
33       case USB_RECIPIENT_ENDPOINT:
34         if ( epid & USB_ENDPOINT_DIRECTION_MASK)
35           c = pdiSelectEp(pdiEp2Idx(epid)); // endpoint in
36         else
37           c = pdiSelectEp(pdiEp2Idx(epid));     // endpoint Out
38           #ifdef PDIUSBD12
39           buf[0] = (( c & PDI_SELEP_STALL) == PDI_SELEP_STALL);
40           #else
41           buf[0] = 0;
42           #endif
43         break;
44       default:
45         return USB_COMPLETE_FAIL;
46     }
47     pdiWriteEndpoint( PDI_EP0_TX, 2, buf);
48     return USB_COMPLETE_OK;
49   }
50
51   int usb_stdreq_clear_feature( usb_device_t *udev)
52   {
53     USB_DEVICE_REQUEST *dreq = &(udev->request);
54     unsigned char epid = (unsigned char) dreq->wIndex;
55
56     usb_debug_print( DEBUG_LEVEL_HIGH, ("ClearFeature\n"));
57     switch( dreq->bmRequestType & USB_RECIPIENT) {
58       case USB_RECIPIENT_DEVICE:
59         if ( dreq->wValue == USB_FEATURE_REMOTE_WAKEUP) {
60           udev->flags &= ~USB_FLAG_REMOTE_WAKE; //.remote_wake_up = 0;
61           usb_udev_ack_setup( udev);
62           return USB_COMPLETE_OK;
63         }
64         break;
65       case USB_RECIPIENT_ENDPOINT:
66         if ( dreq->wValue == USB_FEATURE_ENDPOINT_STALL) {
67           if ( epid & USB_ENDPOINT_DIRECTION_MASK)
68             pdiSetEpStatus(pdiEp2Idx(epid), 0); // clear TX stall for IN on EPn
69           else
70             pdiSetEpStatus(pdiEp2Idx(epid), 0); // clear RX stall for OUT on EPn
71           usb_udev_ack_setup( udev);
72           return USB_COMPLETE_OK;
73         }
74         break;
75     }
76     return USB_COMPLETE_FAIL;
77   }
78
79   int usb_stdreq_set_feature( usb_device_t *udev)
80   {
81     USB_DEVICE_REQUEST *dreq = &(udev->request);
82     unsigned char epid = (unsigned char) dreq->wIndex;
83
84     usb_debug_print( DEBUG_LEVEL_HIGH, ("SetFeature\n"));
85     switch( dreq->bmRequestType & USB_RECIPIENT) {
86       case USB_RECIPIENT_DEVICE:
87         if ( dreq->wValue == USB_FEATURE_REMOTE_WAKEUP) {
88           udev->flags |= USB_FLAG_REMOTE_WAKE; //.remote_wake_up = 1;
89           usb_udev_ack_setup( udev);
90           return USB_COMPLETE_OK;
91         }
92         break;
93       case USB_RECIPIENT_ENDPOINT:
94         if ( dreq->wValue == USB_FEATURE_ENDPOINT_STALL) {
95           if ( epid & USB_ENDPOINT_DIRECTION_MASK)
96             pdiSetEpStatus( pdiEp2Idx(epid), 1); // set TX stall for IN on EPn
97           else
98             pdiSetEpStatus( pdiEp2Idx(epid), 1);     // set RX stall for OUT on EPn
99           usb_udev_ack_setup( udev);
100           return USB_COMPLETE_OK;
101         }
102         break;
103     }
104     return USB_COMPLETE_FAIL;
105   }
106
107   int usb_stdreq_set_address( usb_device_t *udev)
108   {
109     USB_DEVICE_REQUEST *dreq = &(udev->request);
110     usb_debug_print( DEBUG_LEVEL_HIGH, ("SetAddr\n"));
111     usb_udev_ack_setup( udev);
112     pdiSetAddressEnable( (dreq->wValue & DEVICE_ADDRESS_MASK) + PDI_ENAD_ENABLE);
113     return USB_COMPLETE_OK;
114   }
115
116   int usb_stdreq_get_configuration( usb_device_t *udev)
117   {
118     unsigned char buf = udev->configuration; //usb_flags.configured;
119     usb_debug_print( DEBUG_LEVEL_HIGH, ("GetConfig\n"));
120     pdiWriteEndpoint( PDI_EP0_TX, 1, &buf);
121     return USB_COMPLETE_OK;
122   }
123
124   int usb_stdreq_set_configuration( usb_device_t *udev)
125   {
126     USB_DEVICE_REQUEST *dreq = &(udev->request);
127     unsigned char iCfg = dreq->wValue & 0xff;
128     usb_debug_print( DEBUG_LEVEL_HIGH, ("SetConfig\n"));
129     if ( iCfg < 2) {       // put device in unconfigured state or set configuration 1 ( no else)
130       usb_udev_ack_setup( udev);
131       pdiSetEndpointEnable( 0); // USBInitUnconfig();
132       if ( iCfg) {
133         pdiSetEndpointEnable( PDI_EPEN_ENABLE); //USBInitConfig();
134         udev->flags |= USB_FLAG_CONFIGURED;
135       } else {
136         udev->flags &= ~USB_FLAG_CONFIGURED;
137       }
138       udev->configuration = iCfg;  //usb_flags.configured = iCfg;
139       return USB_COMPLETE_OK;
140     } else
141       return USB_COMPLETE_FAIL;
142   }
143
144   int usb_stdreq_get_interface( usb_device_t *udev)
145   {
146     unsigned char buf = 0; /// udev->interface
147     usb_debug_print( DEBUG_LEVEL_HIGH, ("GetIface\n"));
148     pdiWriteEndpoint( PDI_EP0_TX, 1, &buf);
149     return USB_COMPLETE_OK;
150   }
151
152   int usb_stdreq_set_interface( usb_device_t *udev)
153   {
154     USB_DEVICE_REQUEST *dreq = &(udev->request);
155     
156     usb_debug_print( DEBUG_LEVEL_HIGH, ("SetIface\n"));
157     if (( dreq->wValue == 0) && ( dreq->wIndex == 0)) {
158       usb_udev_ack_setup( udev);
159       return USB_COMPLETE_OK;
160     } else {
161       return USB_COMPLETE_FAIL;
162     }
163   }
164
165   int usb_stdreq_get_descriptor( usb_device_t *udev)
166   {
167     unsigned char *pDesc;
168     unsigned short Len = 0;
169     USB_DEVICE_REQUEST *dreq = &(udev->request);
170     int i;
171
172     i = (dreq->wValue >> 8) & 0xff; /* MSB part of wValue */
173     usb_debug_print( DEBUG_LEVEL_HIGH, ("GetDesc\n"));
174     usb_debug_print( DEBUG_LEVEL_VERBOSE, ( " - %s desc.\n", /*(unsigned int)*/ usb_debug_get_std_descriptor(i)));
175
176     switch (i) {
177       case USB_DESCRIPTOR_TYPE_DEVICE:
178         pDesc = (unsigned char *)&DeviceDescription;
179         Len = sizeof( USB_DEVICE_DESCRIPTOR);
180         break;
181       case USB_DESCRIPTOR_TYPE_CONFIGURATION:
182         pDesc = (unsigned char *)&ConfigDescription;
183         Len = CONFIG_DESCRIPTOR_LENGTH;
184         break;
185       case USB_DESCRIPTOR_TYPE_INTERFACE:
186         pDesc = (unsigned char *)&ConfigDescription.interface;
187         Len = sizeof( USB_INTERFACE_DESCRIPTOR);
188         break;
189       case USB_DESCRIPTOR_TYPE_STRING:
190         i = dreq->wValue & 0xff; /* LSB part of wValue */
191         /*printf("Get descriptor indx=0x%02x\n", i);*/
192         if ( i < CNT_STRINGS) {
193           pDesc = (unsigned char *) StringDescriptors[ i];
194           Len = *pDesc;
195           /*usb_debug_print(0,("indx=0x%02x ptr=%p len=%d : '%c'\n", i, pDesc, Len, pDesc[2]));*/
196         } else {
197           return USB_COMPLETE_FAIL;
198         }
199         break;
200       default:
201         return USB_COMPLETE_FAIL;
202     }
203     if ( dreq->wLength < Len) Len = dreq->wLength;
204     usb_send_control_data( udev, pDesc, Len);
205     return USB_COMPLETE_OK;
206   }
207
208
209 /*  
210   void usb_init_stdreq_fnc( usb_device_t *udev)
211   {
212     // memset( udev->stdreq, 0, sizeof(udev->stdreq));
213     
214     udev->stdreq[USB_REQUEST_GET_STATUS] = usb_stdreq_get_status;
215     udev->stdreq[USB_REQUEST_CLEAR_FEATURE] = usb_stdreq_clear_feature;
216     udev->stdreq[USB_REQUEST_SET_FEATURE] = usb_stdreq_set_feature;
217     udev->stdreq[USB_REQUEST_SET_ADDRESS] = usb_stdreq_set_address;
218     udev->stdreq[USB_REQUEST_GET_DESCRIPTOR] = usb_stdreq_get_descriptor;
219     udev->stdreq[USB_REQUEST_GET_CONFIGURATION] = usb_stdreq_get_configuration;
220     udev->stdreq[USB_REQUEST_SET_CONFIGURATION] = usb_stdreq_set_configuration;
221     udev->stdreq[USB_REQUEST_GET_INTERFACE] = usb_stdreq_get_interface;
222     udev->stdreq[USB_REQUEST_SET_INTERFACE] = usb_stdreq_set_interface;
223   }
224 */