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/usbdebug.h>
13 #include <usb/usb_srq.h>
14 #include <usb/usb_defs.h>
15 #include <usb/lpcusb.h>
17 //extern ul_dcnv_state_t ep1_dcnv_state;
19 // ****************************
20 int usb_stdreq_get_status( usb_device_t *udev)
22 unsigned char c,buf[2] = { 0, 0};
23 unsigned char epid = (unsigned char) udev->request.wIndex;
24 usb_ep_t *ep0 = &(udev->ep0);
26 usb_debug_print( DEBUG_LEVEL_HIGH, ("GetStatus\n"));
27 switch( udev->request.bmRequestType & USB_RECIPIENT) {
28 case USB_RECIPIENT_DEVICE:
29 if ( udev->flags & USB_FLAG_REMOTE_WAKE) //.remote_wake_up == 1)
30 buf[0] = USB_GETSTATUS_REMOTE_WAKEUP_ENABLED | USB_GETSTATUS_SELF_POWERED;
32 buf[0] = USB_GETSTATUS_SELF_POWERED;
34 case USB_RECIPIENT_INTERFACE:
36 case USB_RECIPIENT_ENDPOINT:
37 /* if ( epid & USB_ENDPOINT_DIRECTION_MASK)
38 c = pdiSelectEp(pdiEp2Idx(epid)); // endpoint in
40 c = pdiSelectEp(pdiEp2Idx(epid)); // endpoint Out
42 buf[0] = (( c & PDI_SELEP_STALL) == PDI_SELEP_STALL);
48 return USB_COMPLETE_FAIL;
50 usb_udev_write_endpoint( ep0, buf, 2);
51 return USB_COMPLETE_OK;
54 int usb_stdreq_clear_feature( usb_device_t *udev)
56 USB_DEVICE_REQUEST *dreq = &(udev->request);
57 unsigned char epid = (unsigned char) dreq->wIndex;
59 usb_debug_print( DEBUG_LEVEL_HIGH, ("ClearFeature\n"));
60 switch( dreq->bmRequestType & USB_RECIPIENT) {
61 case USB_RECIPIENT_DEVICE:
62 if ( dreq->wValue == USB_FEATURE_REMOTE_WAKEUP) {
63 udev->flags &= ~USB_FLAG_REMOTE_WAKE; //.remote_wake_up = 0;
64 usb_udev_ack_setup( udev);
65 return USB_COMPLETE_OK;
68 case USB_RECIPIENT_ENDPOINT:
69 if ( dreq->wValue == USB_FEATURE_ENDPOINT_STALL) {
70 lpc_usb_clrstallEP(epid);
71 usb_udev_ack_setup( udev);
72 //initialize state of ulan convertor
73 switch (epid&(USB_ENDPOINT_DIRECTION_MASK|0x03)) {
74 case 0x01: //rx USB -> tx ulan
75 // ul_freemsg(ep1_dcnv_state.tx_fd);
76 // ep1_dcnv_state.tx_2send=-1;
78 case 0x81: //tx USB -> rx ulan
79 // ul_freemsg(ep1_dcnv_state.rx_fd);
80 // ep1_dcnv_state.rx_2rec=-1;
81 // ep1_dcnv_state.rx_wait4host=0;
84 return USB_COMPLETE_OK;
88 return USB_COMPLETE_FAIL;
91 int usb_stdreq_set_feature( usb_device_t *udev)
93 USB_DEVICE_REQUEST *dreq = &(udev->request);
94 unsigned char epid = (unsigned char) dreq->wIndex;
96 usb_debug_print( DEBUG_LEVEL_HIGH, ("SetFeature\n"));
97 switch( dreq->bmRequestType & USB_RECIPIENT) {
98 case USB_RECIPIENT_DEVICE:
99 if ( dreq->wValue == USB_FEATURE_REMOTE_WAKEUP) {
100 udev->flags |= USB_FLAG_REMOTE_WAKE; //.remote_wake_up = 1;
101 lpc_usb_setstallEP (epid);
102 usb_udev_ack_setup( udev);
103 return USB_COMPLETE_OK;
106 case USB_RECIPIENT_ENDPOINT:
107 if ( dreq->wValue == USB_FEATURE_ENDPOINT_STALL) {
108 usb_udev_ack_setup( udev);
109 return USB_COMPLETE_OK;
113 return USB_COMPLETE_FAIL;
116 int usb_stdreq_set_address( usb_device_t *udev)
119 USB_DEVICE_REQUEST *dreq = &(udev->request);
120 adr=dreq->wValue & DEVICE_ADDRESS_MASK;
121 usb_debug_print( DEBUG_LEVEL_HIGH, ("SetAddr-%d\n",adr));
122 usb_udev_ack_setup( udev);
123 lpc_usb_set_addr(adr);
124 return USB_COMPLETE_OK;
127 int usb_stdreq_get_configuration( usb_device_t *udev)
129 unsigned char buf = udev->configuration; //usb_flags.configured;
130 usb_ep_t *ep0 = &(udev->ep0);
131 usb_debug_print( DEBUG_LEVEL_HIGH, ("GetConfig\n"));
132 usb_udev_write_endpoint( ep0, &buf, 1);
133 return USB_COMPLETE_OK;
136 int usb_stdreq_set_configuration( usb_device_t *udev)
138 USB_DEVICE_REQUEST *dreq = &(udev->request);
139 unsigned char iCfg = dreq->wValue & 0xff;
140 usb_debug_print( DEBUG_LEVEL_HIGH, ("SetConfig\n"));
141 if ( iCfg < 2) { // put device in unconfigured state or set configuration 1 ( no else)
142 usb_udev_ack_setup( udev);
143 lpc_usb_config_device(iCfg);
145 udev->flags |= USB_FLAG_CONFIGURED;
146 lpc_usb_configEP(0x01,USB_MAX_PACKET0);
147 lpc_usb_configEP(0x81,USB_MAX_PACKET0);
149 udev->flags &= ~USB_FLAG_CONFIGURED;
151 udev->configuration = iCfg; //usb_flags.configured = iCfg;
152 return USB_COMPLETE_OK;
154 return USB_COMPLETE_FAIL;
157 int usb_stdreq_get_interface( usb_device_t *udev)
159 unsigned char buf = 0; /// udev->interface
160 usb_ep_t *ep0 = &(udev->ep0);
161 usb_debug_print( DEBUG_LEVEL_HIGH, ("GetIface\n"));
162 usb_udev_write_endpoint( ep0, &buf, 1);
163 return USB_COMPLETE_OK;
166 int usb_stdreq_set_interface( usb_device_t *udev)
168 USB_DEVICE_REQUEST *dreq = &(udev->request);
170 usb_debug_print( DEBUG_LEVEL_HIGH, ("SetIface\n"));
171 if (( dreq->wValue == 0) && ( dreq->wIndex == 0)) {
172 usb_udev_ack_setup( udev);
173 return USB_COMPLETE_OK;
175 return USB_COMPLETE_FAIL;
179 int usb_stdreq_get_descriptor( usb_device_t *udev)
181 unsigned char *pDesc;
182 unsigned short Len = 0;
183 USB_DEVICE_REQUEST *dreq = &(udev->request);
186 i = (dreq->wValue >> 8) & 0xff; /* MSB part of wValue */
187 usb_debug_print( DEBUG_LEVEL_HIGH, ("GetDesc\n"));
188 usb_debug_print( DEBUG_LEVEL_VERBOSE, ( " - %s desc.\n", /*(unsigned int)*/ usb_debug_get_std_descriptor(i)));
191 case USB_DESCRIPTOR_TYPE_DEVICE:
192 pDesc = (unsigned char *)&DeviceDescription;
193 Len = sizeof( USB_DEVICE_DESCRIPTOR);
195 case USB_DESCRIPTOR_TYPE_CONFIGURATION:
196 pDesc = (unsigned char *)&ConfigDescription;
197 Len = CONFIG_DESCRIPTOR_LENGTH;
199 case USB_DESCRIPTOR_TYPE_INTERFACE:
200 pDesc = (unsigned char *)&ConfigDescription.interface;
201 Len = sizeof( USB_INTERFACE_DESCRIPTOR);
203 case USB_DESCRIPTOR_TYPE_STRING:
204 i = dreq->wValue & 0xff; /* LSB part of wValue */
205 /*printf("Get descriptor indx=0x%02x\n", i);*/
206 if ( i < CNT_STRINGS) {
207 pDesc = (unsigned char *) StringDescriptors[ i];
209 /*usb_debug_print(0,("indx=0x%02x ptr=%p len=%d : '%c'\n", i, pDesc, Len, pDesc[2]));*/
211 return USB_COMPLETE_FAIL;
215 return USB_COMPLETE_FAIL;
217 if ( dreq->wLength < Len) Len = dreq->wLength;
218 usb_send_control_data( udev, pDesc, Len);
219 return USB_COMPLETE_OK;
224 void usb_init_stdreq_fnc( usb_device_t *udev)
226 // memset( udev->stdreq, 0, sizeof(udev->stdreq));
228 udev->stdreq[USB_REQUEST_GET_STATUS] = usb_stdreq_get_status;
229 udev->stdreq[USB_REQUEST_CLEAR_FEATURE] = usb_stdreq_clear_feature;
230 udev->stdreq[USB_REQUEST_SET_FEATURE] = usb_stdreq_set_feature;
231 udev->stdreq[USB_REQUEST_SET_ADDRESS] = usb_stdreq_set_address;
232 udev->stdreq[USB_REQUEST_GET_DESCRIPTOR] = usb_stdreq_get_descriptor;
233 udev->stdreq[USB_REQUEST_GET_CONFIGURATION] = usb_stdreq_get_configuration;
234 udev->stdreq[USB_REQUEST_SET_CONFIGURATION] = usb_stdreq_set_configuration;
235 udev->stdreq[USB_REQUEST_GET_INTERFACE] = usb_stdreq_get_interface;
236 udev->stdreq[USB_REQUEST_SET_INTERFACE] = usb_stdreq_set_interface;