X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Fusb.h;h=02448f2c398982cd247c8d9171e369b811c0c663;hb=944e16fb3be5c147b6d400b9bfa65b7fa6d53ae3;hp=b68d9bf6fb5770007b3acede54ef7eba83af63fd;hpb=7713a5e329a770f53d53e39e9b3b8dae55c71614;p=bertos.git diff --git a/bertos/drv/usb.h b/bertos/drv/usb.h index b68d9bf6..02448f2c 100644 --- a/bertos/drv/usb.h +++ b/bertos/drv/usb.h @@ -47,27 +47,10 @@ #include -/* - * Handle CPU endianess - * - * TODO: consider to move this stuff in compiler.h - */ -#define usb_bswap16(x) (((x & 0xff) << 8) | (x >> 8)) -#define usb_bswap32(x) ((usb_bswap16(x & 0xffff) << 16) | usb_bswap16(x >> 16)) - -#if CPU_BYTE_ORDER == CPU_LITTLE_ENDIAN -#define usb_cpu_to_le16(x) (x) -#define usb_le16_to_cpu(x) (x) -#define usb_cpu_to_le32(x) (x) -#define usb_le32_to_cpu(x) (x) -#elif CPU_BYTE_ORDER == CPU_BIG_ENDIAN -#define usb_cpu_to_le16(x) usb_bswap16(x) -#define usb_le16_to_cpu(x) usb_bswap16(x) -#define usb_cpu_to_le32(x) usb_bswap32(x) -#define usb_le32_to_cpu(x) usb_bswap32(x) -#else -#error "unrecognized CPU endianness" -#endif +#define usb_cpu_to_le16(x) cpu_to_le16(x) +#define usb_le16_to_cpu(x) le16_to_cpu(x) +#define usb_cpu_to_le32(x) cpu_to_le32(x) +#define usb_le32_to_cpu(x) le32_to_cpu(x) /* State of a USB device */ enum usb_device_state { @@ -89,6 +72,7 @@ enum usb_device_state { */ #define USB_DIR_OUT 0 /* to device */ #define USB_DIR_IN 0x80 /* to host */ +#define USB_DIR_MASK 0x80 /* * USB types, the second of three bRequestType fields @@ -151,24 +135,24 @@ enum usb_device_state { * * It matches the different fields of the USB 2.0 spec. section 9.3, table 9-2. */ -typedef struct usb_ctrlrequest +typedef struct UsbCtrlRequest { uint8_t mRequestType; uint8_t bRequest; uint16_t wValue; uint16_t wIndex; uint16_t wLength; -} PACKED usb_ctrlrequest_t; +} PACKED UsbCtrlRequest; /* All standard descriptors have these 2 fields at the beginning */ -typedef struct usb_descriptor_header +typedef struct UsbDescHeader { uint8_t bLength; uint8_t bDescriptorType; -} PACKED usb_descriptor_header_t; +} PACKED UsbDescHeader; /* Device descriptor */ -typedef struct usb_device_descriptor +typedef struct UsbDeviceDesc { uint8_t bLength; uint8_t bDescriptorType; @@ -184,15 +168,15 @@ typedef struct usb_device_descriptor uint8_t iProduct; uint8_t iSerialNumber; uint8_t bNumConfigurations; -} PACKED usb_device_descriptor_t; +} PACKED UsbDeviceDesc; /* USB string descriptor */ -typedef struct usb_string_descriptor +typedef struct UsbStringDesc { uint8_t bLength; uint8_t bDescriptorType; uint8_t data[0]; -} PACKED usb_string_descriptor_t; +} PACKED UsbStringDesc; /* * Macros to define USB strings @@ -220,7 +204,7 @@ typedef struct usb_string_descriptor #define DEFINE_USB_STRING(__name, __text) \ struct { \ - usb_descriptor_header_t __header; \ + UsbDescHeader __header; \ uint8_t __body[sizeof(__text)]; \ } PACKED __name = { \ .__header = { \ @@ -252,8 +236,18 @@ typedef struct usb_string_descriptor #define USB_CLASS_APP_SPEC 0xfe #define USB_CLASS_VENDOR_SPEC 0xff +/* USB Device subclasses */ +#define USB_CDC_SUBCLASS_ACM 0x02 +#define USB_CDC_SUBCLASS_ETHERNET 0x06 +#define USB_CDC_SUBCLASS_WHCM 0x08 +#define USB_CDC_SUBCLASS_DMM 0x09 +#define USB_CDC_SUBCLASS_MDLM 0x0a +#define USB_CDC_SUBCLASS_OBEX 0x0b +#define USB_CDC_SUBCLASS_EEM 0x0c +#define USB_CDC_SUBCLASS_NCM 0x0d + /* Device configuration descriptor */ -typedef struct usb_config_descriptor +typedef struct UsbConfigDesc { uint8_t bLength; uint8_t bDescriptorType; @@ -263,7 +257,7 @@ typedef struct usb_config_descriptor uint8_t iConfiguration; uint8_t bmAttributes; uint8_t bMaxPower; -} PACKED usb_config_descriptor_t; +} PACKED UsbConfigDesc; /* from config descriptor bmAttributes */ #define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */ @@ -272,7 +266,7 @@ typedef struct usb_config_descriptor #define USB_CONFIG_ATT_BATTERY (1 << 4) /* battery powered */ /* Device interface descriptor */ -typedef struct usb_interface_descriptor +typedef struct UsbInterfaceDesc { uint8_t bLength; uint8_t bDescriptorType; @@ -283,10 +277,10 @@ typedef struct usb_interface_descriptor uint8_t bInterfaceSubClass; uint8_t bInterfaceProtocol; uint8_t iInterface; -} PACKED usb_interface_descriptor_t; +} PACKED UsbInterfaceDesc; /* Endpoint descriptor */ -typedef struct usb_endpoint_descriptor +typedef struct UsbEndpointDesc { uint8_t bLength; uint8_t bDescriptorType; @@ -294,13 +288,13 @@ typedef struct usb_endpoint_descriptor uint8_t bmAttributes; uint16_t wMaxPacketSize; uint8_t bInterval; -} PACKED usb_endpoint_descriptor_t; +} PACKED UsbEndpointDesc; /* * Endpoints */ #define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ -#define USB_ENDPOINT_DIR_MASK 0x80 +#define USB_ENDPOINT_DIR_MASK USB_DIR_MASK #define USB_ENDPOINT_SYNCTYPE 0x0c #define USB_ENDPOINT_SYNC_NONE (0 << 2) @@ -316,144 +310,148 @@ typedef struct usb_endpoint_descriptor #define USB_ENDPOINT_MAX_ADJUSTABLE 0x80 /* USB: generic device descriptor */ -struct usb_device +typedef struct UsbDevice { - usb_device_descriptor_t *device; - usb_descriptor_header_t **config; - usb_string_descriptor_t **strings; + UsbDeviceDesc *device; + const UsbDescHeader **config; + const UsbStringDesc **strings; + + /* Callbacks */ + void (*event_cb)(UsbCtrlRequest *); + /* Private data */ bool configured; -}; +} UsbDevice; /* - * usb_endpoint_num - get the endpoint's number + * usb_endpointNum - get the endpoint's number */ -INLINE int usb_endpoint_num(const usb_endpoint_descriptor_t *epd) +INLINE int usb_endpointNum(const UsbEndpointDesc *epd) { return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; } /* - * usb_endpoint_type - get the endpoint's transfer type + * usb_endpointType - get the endpoint's transfer type */ -INLINE int usb_endpoint_type(const struct usb_endpoint_descriptor *epd) +INLINE int usb_endpointType(const struct UsbEndpointDesc *epd) { return epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; } /* - * usb_endpoint_dir_in - check if the endpoint has IN direction + * usb_endpointDirIn - check if the endpoint has IN direction */ -INLINE int usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd) +INLINE int usb_endpointDirIn(const struct UsbEndpointDesc *epd) { return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN); } /* - * usb_endpoint_dir_out - check if the endpoint has OUT direction + * usb_endpointDirOut - check if the endpoint has OUT direction */ -INLINE int usb_endpoint_dir_out(const struct usb_endpoint_descriptor *epd) +INLINE int usb_endpointDirOut(const struct UsbEndpointDesc *epd) { return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT); } /* - * usb_endpoint_xfer_bulk - check if the endpoint has bulk transfer type + * usb_endpointXferBulk - check if the endpoint has bulk transfer type */ -INLINE int usb_endpoint_xfer_bulk(const struct usb_endpoint_descriptor *epd) +INLINE int usb_endpointXferBulk(const struct UsbEndpointDesc *epd) { return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK); } /* - * usb_endpoint_xfer_control - check if the endpoint has control transfer type + * usb_endpointXferControl - check if the endpoint has control transfer type */ -INLINE int usb_endpoint_xfer_control(const struct usb_endpoint_descriptor *epd) +INLINE int usb_endpointXferControl(const struct UsbEndpointDesc *epd) { return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_CONTROL); } /* - * usb_endpoint_xfer_int - check if the endpoint has interrupt transfer type + * usb_endpointXferInt - check if the endpoint has interrupt transfer type */ -INLINE int usb_endpoint_xfer_int(const struct usb_endpoint_descriptor *epd) +INLINE int usb_endpointXferInt(const struct UsbEndpointDesc *epd) { return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT); } /* - * usb_endpoint_xfer_isoc - check if the endpoint has isochronous transfer type + * usb_endpointXferIsoc - check if the endpoint has isochronous transfer type */ -INLINE int usb_endpoint_xfer_isoc(const struct usb_endpoint_descriptor *epd) +INLINE int usb_endpointXferIsoc(const struct UsbEndpointDesc *epd) { return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_ISOC); } /* - * usb_endpoint_is_bulk_in - check if the endpoint is bulk IN + * usb_endpointIsBulkIn - check if the endpoint is bulk IN */ -INLINE int usb_endpoint_is_bulk_in(const struct usb_endpoint_descriptor *epd) +INLINE int usb_endpointIsBulkIn(const struct UsbEndpointDesc *epd) { - return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_in(epd); + return usb_endpointXferBulk(epd) && usb_endpointDirIn(epd); } /* - * usb_endpoint_is_bulk_out - check if the endpoint is bulk OUT + * usb_endpointIsBulkOut - check if the endpoint is bulk OUT */ -INLINE int usb_endpoint_is_bulk_out(const struct usb_endpoint_descriptor *epd) +INLINE int usb_endpointIsBulkOut(const struct UsbEndpointDesc *epd) { - return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_out(epd); + return usb_endpointXferBulk(epd) && usb_endpointDirOut(epd); } /* - * usb_endpoint_is_int_in - check if the endpoint is interrupt IN + * usb_endpointIsIntIn - check if the endpoint is interrupt IN */ -INLINE int usb_endpoint_is_int_in(const struct usb_endpoint_descriptor *epd) +INLINE int usb_endpointIsIntIn(const struct UsbEndpointDesc *epd) { - return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd); + return usb_endpointXferInt(epd) && usb_endpointDirIn(epd); } /* - * usb_endpoint_is_int_out - check if the endpoint is interrupt OUT + * usb_endpointIsIntOut - check if the endpoint is interrupt OUT */ -INLINE int usb_endpoint_is_int_out(const struct usb_endpoint_descriptor *epd) +INLINE int usb_endpointIsIntOut(const struct UsbEndpointDesc *epd) { - return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_out(epd); + return usb_endpointXferInt(epd) && usb_endpointDirOut(epd); } /* - * usb_endpoint_is_isoc_in - check if the endpoint is isochronous IN + * usb_endpointIsIsocIn - check if the endpoint is isochronous IN */ -INLINE int usb_endpoint_is_isoc_in(const struct usb_endpoint_descriptor *epd) +INLINE int usb_endpointIsIsocIn(const struct UsbEndpointDesc *epd) { - return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_in(epd); + return usb_endpointXferIsoc(epd) && usb_endpointDirIn(epd); } /* - * usb_endpoint_is_isoc_out - check if the endpoint is isochronous OUT + * usb_endpointIsIsocOut - check if the endpoint is isochronous OUT */ -INLINE int usb_endpoint_is_isoc_out(const struct usb_endpoint_descriptor *epd) +INLINE int usb_endpointIsIsocOut(const struct UsbEndpointDesc *epd) { - return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_out(epd); + return usb_endpointXferIsoc(epd) && usb_endpointDirOut(epd); } /* - * usb_ep_read - configure endponint and perform the read operation + * usb_endpointRead - configure endponint and perform the read operation */ -ssize_t usb_ep_read(int ep, void *buffer, ssize_t size); +ssize_t usb_endpointRead(int ep, void *buffer, ssize_t size); /* - * usb_ep_write - configure endponint and perform the write operation + * usb_endpointWrite - configure endponint and perform the write operation */ -ssize_t usb_ep_write(int ep, const void *buffer, ssize_t size); +ssize_t usb_endpointWrite(int ep, const void *buffer, ssize_t size); /* - * usb_device_register - register a generic USB device driver + * usb_deviceRegister - register a generic USB device driver */ -int usb_device_register(struct usb_device *dev); +int usb_deviceRegister(UsbDevice *dev); #endif /* USB_H */