1 /*****************************************************/
2 /*** Module : USB module ***/
3 /*** Author : Roman Bartosinski (C) 28.04.2002 ***/
4 /*** Modify : 08.08.2002, 16.04.2003 ***/
5 /*****************************************************/
9 #include <system_def.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>
17 // ****************************
18 int usb_stdreq_get_status( usb_device_t *udev)
20 unsigned char c, buf[2] = { 0, 0};
21 unsigned char epid = (unsigned char) udev->request.wIndex;
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;
29 buf[0] = USB_GETSTATUS_SELF_POWERED;
31 case USB_RECIPIENT_INTERFACE:
33 case USB_RECIPIENT_ENDPOINT:
34 if ( epid & USB_ENDPOINT_DIRECTION_MASK)
35 c = pdiSelectEp(pdiEp2Idx(epid)); // endpoint in
37 c = pdiSelectEp(pdiEp2Idx(epid)); // endpoint Out
39 buf[0] = (( c & PDI_SELEP_STALL) == PDI_SELEP_STALL);
45 return USB_COMPLETE_FAIL;
47 pdiWriteEndpoint( PDI_EP0_TX, 2, buf);
48 return USB_COMPLETE_OK;
51 int usb_stdreq_clear_feature( usb_device_t *udev)
53 USB_DEVICE_REQUEST *dreq = &(udev->request);
54 unsigned char epid = (unsigned char) dreq->wIndex;
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;
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
70 pdiSetEpStatus(pdiEp2Idx(epid), 0); // clear RX stall for OUT on EPn
71 usb_udev_ack_setup( udev);
72 return USB_COMPLETE_OK;
76 return USB_COMPLETE_FAIL;
79 int usb_stdreq_set_feature( usb_device_t *udev)
81 USB_DEVICE_REQUEST *dreq = &(udev->request);
82 unsigned char epid = (unsigned char) dreq->wIndex;
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;
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
98 pdiSetEpStatus( pdiEp2Idx(epid), 1); // set RX stall for OUT on EPn
99 usb_udev_ack_setup( udev);
100 return USB_COMPLETE_OK;
104 return USB_COMPLETE_FAIL;
107 int usb_stdreq_set_address( usb_device_t *udev)
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;
116 int usb_stdreq_get_configuration( usb_device_t *udev)
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;
124 int usb_stdreq_set_configuration( usb_device_t *udev)
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();
133 pdiSetEndpointEnable( PDI_EPEN_ENABLE); //USBInitConfig();
134 udev->flags |= USB_FLAG_CONFIGURED;
136 udev->flags &= ~USB_FLAG_CONFIGURED;
138 udev->configuration = iCfg; //usb_flags.configured = iCfg;
139 return USB_COMPLETE_OK;
141 return USB_COMPLETE_FAIL;
144 int usb_stdreq_get_interface( usb_device_t *udev)
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;
152 int usb_stdreq_set_interface( usb_device_t *udev)
154 USB_DEVICE_REQUEST *dreq = &(udev->request);
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;
161 return USB_COMPLETE_FAIL;
165 int usb_stdreq_get_descriptor( usb_device_t *udev)
167 unsigned char *pDesc;
168 unsigned short Len = 0;
169 USB_DEVICE_REQUEST *dreq = &(udev->request);
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)));
177 case USB_DESCRIPTOR_TYPE_DEVICE:
178 pDesc = (unsigned char *)&DeviceDescription;
179 Len = sizeof( USB_DEVICE_DESCRIPTOR);
181 case USB_DESCRIPTOR_TYPE_CONFIGURATION:
182 pDesc = (unsigned char *)&ConfigDescription;
183 Len = CONFIG_DESCRIPTOR_LENGTH;
185 case USB_DESCRIPTOR_TYPE_INTERFACE:
186 pDesc = (unsigned char *)&ConfigDescription.interface;
187 Len = sizeof( USB_INTERFACE_DESCRIPTOR);
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];
195 /*usb_debug_print(0,("indx=0x%02x ptr=%p len=%d : '%c'\n", i, pDesc, Len, pDesc[2]));*/
197 return USB_COMPLETE_FAIL;
201 return USB_COMPLETE_FAIL;
203 if ( dreq->wLength < Len) Len = dreq->wLength;
204 usb_send_control_data( udev, pDesc, Len);
205 return USB_COMPLETE_OK;
210 void usb_init_stdreq_fnc( usb_device_t *udev)
212 // memset( udev->stdreq, 0, sizeof(udev->stdreq));
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;