X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/cc1afb21bdc089426652f21769164645cae062fd..243fec4450d3a3246f3f0d92751a95daef7c1503:/embedded/libs4c/usb/base/usb.c diff --git a/embedded/libs4c/usb/base/usb.c b/embedded/libs4c/usb/base/usb.c index 2061c8c..a45e8a1 100644 --- a/embedded/libs4c/usb/base/usb.c +++ b/embedded/libs4c/usb/base/usb.c @@ -17,12 +17,10 @@ #include #include -#include /* temporary include - standard control request responses */ - /* ep0 buffer */ - xdata unsigned char ep0_buffer[ MAX_CONTROL_XFER_DATA_SIZE]; + __xdata unsigned char ep0_buffer[ MAX_CONTROL_XFER_DATA_SIZE]; + - /* usb initialize */ int usb_init( usb_device_t *udev) { int ret = 0; @@ -45,7 +43,7 @@ return ret; } - + // connecting to USB by SoftConnect int usb_connect( usb_device_t *udev) { int ret = 0; @@ -63,7 +61,7 @@ return ret; } - + int usb_disconnect( usb_device_t *udev) { int ret = 0; usb_debug_print( DEBUG_LEVEL_LOW,("USB:OFF\n")); @@ -80,7 +78,7 @@ return ret; } - + void usb_stall( usb_ep_t *ep) { usb_debug_print( DEBUG_LEVEL_HIGH, ("USB:STALL %1d\n", ep->epnum)); if ( usb_udev_is_fnc(ep->udev,stall)) { @@ -88,7 +86,7 @@ } } - + int usb_check_events( usb_device_t *udev) { int ret = 0; @@ -122,7 +120,7 @@ ep0->ptr = pData; ep0->actual = 0; if ( ep0->size > len) ep0->size = len; - + /* Schedule TX processing for later execution */ ep0->flags = (ep0->flags & ~USB_STATE_MASK) | USB_STATE_TRANSMIT; udev->flags |= USB_FLAG_EVENT_TX0; @@ -136,14 +134,14 @@ usb_udev_ack_setup(ep->udev); } - + /************************************************************* *** Control endpoint0 responses *************************************************************/ int usb_control_response( usb_device_t *udev) { int ret = 0; usb_ep_t *ep0 = &(udev->ep0); - + /* response to interrupt BusReset */ if ( udev->flags & USB_FLAG_BUS_RESET) { udev->flags &= ~(USB_FLAG_BUS_RESET | USB_FLAG_SUSPEND); // usb_flags.bus_reset = 0; usb_flags.configured = 0; @@ -157,10 +155,10 @@ ret = 1; } - + /* response to interrupt SetupPacket execute response to standard device request or vendor request */ if ( udev->flags & USB_FLAG_SETUP) { - unsigned char type, req; + unsigned char type; USB_DEVICE_REQUEST *preq = &(udev->request); ep0->ptr = NULL; @@ -173,8 +171,8 @@ ep0->next_pkt_fnc = NULL; ep0->complete_fnc = NULL; #endif /*USB_WITH_CB_FNC*/ - - if ( usb_udev_read_endpoint(ep0, preq, sizeof( USB_DEVICE_REQUEST)) + + if ( usb_udev_read_endpoint(ep0, preq, sizeof( USB_DEVICE_REQUEST)) != sizeof( USB_DEVICE_REQUEST)) { usb_udev_stall( ep0); return -1; @@ -185,81 +183,52 @@ preq->wLength = bswap_16( preq->wLength); #endif usb_debug_print( DEBUG_LEVEL_MEDIUM,( "SePa:x%02X,x%02X,x%04X,x%04X,x%04X\n", preq->bmRequestType, preq->bRequest, preq->wValue, preq->wIndex, preq->wLength)); - + // acknowledge setup here if(usb_udev_is_fnc( udev, ack_control_setup)) { usb_udev_ack_control_setup(udev); } - + ep0->size = preq->wLength; if ((( preq->bmRequestType & USB_DATA_DIR_MASK) == USB_DATA_DIR_FROM_HOST) && preq->wLength) { ep0->ptr = ep0_buffer; ep0->flags = (ep0->flags & ~USB_STATE_MASK) | USB_STATE_RECEIVE; } - + type = preq->bmRequestType & USB_REQUEST_TYPE_MASK; - req = preq->bRequest & USB_REQUEST_MASK; if ( type == USB_STANDARD_REQUEST) { int ret = -1; - usb_debug_print( DEBUG_LEVEL_HIGH, ( "StdReq-%d\n", req)); -/* - if ( (udev->stdreq[ req]) != NULL) { - ret = udev->stdreq[ req]( udev); - } - if( ret < 0) - udev->ack_setup( udev); -*/ - switch( req) { - case USB_REQUEST_GET_STATUS: ret=usb_stdreq_get_status( udev); break; - case USB_REQUEST_CLEAR_FEATURE: ret=usb_stdreq_clear_feature( udev); break; - case USB_REQUEST_SET_FEATURE: ret=usb_stdreq_set_feature( udev); break; - case USB_REQUEST_SET_ADDRESS: ret=usb_stdreq_set_address( udev); break; - - case USB_REQUEST_GET_DESCRIPTOR: ret=usb_stdreq_get_descriptor( udev); break; -// case USB_REQUEST_SET_DESCRIPTOR: break; - case USB_REQUEST_GET_CONFIGURATION: ret=usb_stdreq_get_configuration( udev); break; - case USB_REQUEST_SET_CONFIGURATION: ret=usb_stdreq_set_configuration( udev); break; - case USB_REQUEST_GET_INTERFACE: ret=usb_stdreq_get_interface( udev); break; - case USB_REQUEST_SET_INTERFACE: ret=usb_stdreq_set_interface( udev); break; -// case USB_REQUEST_SYNC_FRAME: break; -// default: ret=-1; break; - } + #ifdef USB_WITH_CB_FNC + if ( udev->standard_fnc != NULL) + ret = udev->standard_fnc( udev); + else + #endif /*USB_WITH_CB_FNC*/ + ret = usb_standard_control_response( udev); if (ret<0) usb_udev_stall( ep0); } else { if ( type == USB_VENDOR_REQUEST) { -//putchar('#'); #ifdef USB_WITH_CB_FNC int ret = -1; -// if(USBVendorRequestCBFnc != NULL) -// ret = USBVendorRequestCBFnc(&usb_ep0, &dreq); if ( udev->vendor_fnc != NULL) ret = udev->vendor_fnc( udev); if ( ret < 0) usb_udev_stall( ep0); -// #else /*USB_WITH_CB_FNC*/ -// if ( USBVendorRequest(&dreq) == -1) -// udev->ack_setup( udev); #endif /*USB_WITH_CB_FNC*/ } else if ( type == USB_CLASS_REQUEST) { #ifdef USB_WITH_CB_FNC int ret = -1; -// if(USBClassRequestCBFnc != NULL) -// ret = USBClassRequestCBFnc(&usb_ep0, &dreq); if( udev->class_fnc != NULL) ret = udev->class_fnc( udev); if( ret < 0) usb_udev_stall( ep0); -// #else /*USB_WITH_CB_FNC*/ -// if ( USBClassRequest(&dreq) == -1) -// udev->ack_setup( udev); #endif /*USB_WITH_CB_FNC*/ } else usb_udev_stall( ep0); } ret = 1; } - + /* response to interrupt Ep0RxInt - receive data */ if ( udev->flags & USB_FLAG_EVENT_RX0) { int i; @@ -293,14 +262,14 @@ } /* response to interrupt Ep0TxInt */ - if ( udev->flags & USB_FLAG_EVENT_TX0) { + if ( udev->flags & USB_FLAG_EVENT_TX0) { short i = ep0->size - ep0->actual; udev->flags &= ~USB_FLAG_EVENT_TX0; //usb_debug_print( DEBUG_LEVEL_LOW, ("0S-%d(%d){%d}\n", ep0->state, ep0->size, ep0->max_packet_size)); usb_debug_print( DEBUG_LEVEL_MEDIUM, ( "EP0Tx:i=%d\n", i)); if (( ep0->flags & USB_STATE_MASK) == USB_STATE_TRANSMIT) { - + if(i > ep0->max_packet_size) i = ep0->max_packet_size; if ( i > 0 ) {