#include <usb/usb.h>
#include <usb/usbdebug.h>
-#include <usb/usb_srq.h> /* 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;
return ret;
}
-
+
// connecting to USB by SoftConnect
int usb_connect( usb_device_t *udev) {
int ret = 0;
return ret;
}
-
+
int usb_disconnect( usb_device_t *udev) {
int ret = 0;
usb_debug_print( DEBUG_LEVEL_LOW,("USB:OFF\n"));
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)) {
}
}
-
+
int usb_check_events( usb_device_t *udev)
{
int ret = 0;
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;
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;
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;
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;
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;
}
/* 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 ) {