diff --git a/demos/device/keyboard/tusb_descriptors.c b/demos/device/keyboard/tusb_descriptors.c index b69e30e3..584e3f39 100644 --- a/demos/device/keyboard/tusb_descriptors.c +++ b/demos/device/keyboard/tusb_descriptors.c @@ -132,14 +132,14 @@ tusb_descriptor_device_t app_tusb_desc_device = .bMaxPacketSize0 = USB_MAX_PACKET0, .idVendor = TUSB_CFG_DEVICE_VENDORID, - .idProduct = USB_PRODUCT_ID, + .idProduct = TUSB_CFG_PRODUCT_ID, .bcdDevice = 0x0100, .iManufacturer = 0x01, .iProduct = 0x02, .iSerialNumber = 0x03, - .bNumConfigurations = 0x01 // TODO configuration number + .bNumConfigurations = 0x01 // TODO multiple configurations }; diff --git a/demos/device/keyboard/tusb_descriptors.h b/demos/device/keyboard/tusb_descriptors.h index 68dff8c9..e9022ab1 100644 --- a/demos/device/keyboard/tusb_descriptors.h +++ b/demos/device/keyboard/tusb_descriptors.h @@ -98,10 +98,15 @@ typedef ATTR_PACKED_STRUCT(struct) #define TOTAL_INTEFACES (INTERFACES_OF_CDC + INTERFACES_OF_HID_KEYBOARD + INTERFACES_OF_HID_MOUSE + INTERFACES_OF_HID_GENERIC + INTERFACES_OF_MASS_STORAGE) + +// each combination of interfaces need to have different productid, as windows will bind & remember device driver after the +// first plug. +#ifndef TUSB_CFG_PRODUCT_ID // Bitmap: MassStorage | Generic | Mouse | Key | CDC #define PRODUCTID_BITMAP(interface, n) ( (INTERFACES_OF_##interface ? 1 : 0) << (n) ) -#define USB_PRODUCT_ID (0x2000 | ( PRODUCTID_BITMAP(CDC, 0) | PRODUCTID_BITMAP(HID_KEYBOARD, 1) | PRODUCTID_BITMAP(HID_MOUSE, 2) | \ +#define TUSB_CFG_PRODUCT_ID (0x2000 | ( PRODUCTID_BITMAP(CDC, 0) | PRODUCTID_BITMAP(HID_KEYBOARD, 1) | PRODUCTID_BITMAP(HID_MOUSE, 2) | \ PRODUCTID_BITMAP(HID_GENERIC, 3) | PRODUCTID_BITMAP(MASS_STORAGE, 4) ) ) +#endif /////////////////////////////////////////////////////////////////////// typedef ATTR_PACKED_STRUCT(struct) diff --git a/tinyusb/class/hid_device.c b/tinyusb/class/hid_device.c index 958d7489..f666b351 100644 --- a/tinyusb/class/hid_device.c +++ b/tinyusb/class/hid_device.c @@ -74,14 +74,70 @@ ErrorCode_t HID_SetReport( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t ErrorCode_t HID_EpIn_Hdlr (USBD_HANDLE_T hUsb, void* data, uint32_t event); ErrorCode_t HID_EpOut_Hdlr (USBD_HANDLE_T hUsb, void* data, uint32_t event); -//--------------------------------------------------------------------+ -// IMPLEMENTATION -//--------------------------------------------------------------------+ +//--------------------------------------------------------------------+ +// APPLICATION API +//--------------------------------------------------------------------+ +#if TUSB_CFG_DEVICE_HID_KEYBOARD +tusb_error_t tusbd_hid_keyboard_send_report(tusb_keyboard_report_t *p_kbd_report) +{ +// uint32_t start_time = systickGetSecondsActive(); +// while (bKeyChanged) // TODO blocking while previous key has yet sent - can use fifo to improve this +// { +// ASSERT_MESSAGE(systickGetSecondsActive() - start_time < 5, ERR_FAILED, "HID Keyboard Timeout"); +// } + + if (bKeyChanged) + { + return TUSB_ERROR_FAILED; + } + + ASSERT_PTR(p_kbd_report, TUSB_ERROR_FAILED); + + hid_keyboard_report = *p_kbd_report; + bKeyChanged = true; + + return TUSB_ERROR_NONE; +} +#endif + +#if TUSB_CFG_DEVICE_HID_MOUSE +tusb_error_t tusbd_hid_mouse_send_report(tusb_mouse_report_t *p_mouse_report) +{ +// uint32_t start_time = systickGetSecondsActive(); +// while (bMouseChanged) // TODO Block while previous key hasn't been sent - can use fifo to improve this +// { +// ASSERT_MESSAGE(systickGetSecondsActive() - start_time < 5, ERR_FAILED, "HID Mouse Timeout"); +// } + + if (bMouseChanged) + { + return TUSB_ERROR_FAILED; + } + + hid_mouse_report = *p_mouse_report; + bMouseChanged = true; + + return TUSB_ERROR_NONE; +} +#endif //--------------------------------------------------------------------+ // CLASS-USBH API (don't require to verify parameters) //--------------------------------------------------------------------+ +tusb_error_t hidd_configured(USBD_HANDLE_T hUsb) +{ + #if TUSB_CFG_DEVICE_HID_KEYBOARD + ROM_API->hw->WriteEP(hUsb , HID_KEYBOARD_EP_IN , (uint8_t* ) &hid_keyboard_report , sizeof(tusb_keyboard_report_t) ); // initial packet for IN endpoint , will not work if omitted + #endif + + #if TUSB_CFG_DEVICE_HID_MOUSE + ROM_API->hw->WriteEP(hUsb , HID_MOUSE_EP_IN , (uint8_t* ) &hid_mouse_report , sizeof(tusb_mouse_report_t) ); // initial packet for IN endpoint, will not work if omitted + #endif + + return TUSB_ERROR_NONE; +} + tusb_error_t hidd_init(tusb_descriptor_interface_t const * p_interface_desc, uint16_t *p_length) { uint8_t const *p_desc = (uint8_t const *) p_interface_desc; @@ -153,73 +209,14 @@ tusb_error_t hidd_interface_init(tusb_descriptor_interface_t const *pIntfDesc, u }; ASSERT( (pIntfDesc != NULL) && (pIntfDesc->bInterfaceClass == USB_DEVICE_CLASS_HUMAN_INTERFACE), ERR_FAILED); - ASSERT( LPC_OK == ROM_API->hid->init(romdriver_hdl, &hid_param), TUSB_ERROR_FAILED ); - /* update memory variables */ -// *mem_base += (*mem_size - hid_param.mem_size); -// *mem_size = hid_param.mem_size; - return TUSB_ERROR_NONE; } -tusb_error_t hidd_configured(USBD_HANDLE_T hUsb) -{ - #if TUSB_CFG_DEVICE_HID_KEYBOARD - ROM_API->hw->WriteEP(hUsb , HID_KEYBOARD_EP_IN , (uint8_t* ) &hid_keyboard_report , sizeof(tusb_keyboard_report_t) ); // initial packet for IN endpoint , will not work if omitted - #endif - - #if TUSB_CFG_DEVICE_HID_MOUSE - ROM_API->hw->WriteEP(hUsb , HID_MOUSE_EP_IN , (uint8_t* ) &hid_mouse_report , sizeof(tusb_mouse_report_t) ); // initial packet for IN endpoint, will not work if omitted - #endif - - return TUSB_ERROR_NONE; -} - -#if TUSB_CFG_DEVICE_HID_KEYBOARD -tusb_error_t tusbd_hid_keyboard_send_report(tusb_keyboard_report_t *p_kbd_report) -{ -// uint32_t start_time = systickGetSecondsActive(); -// while (bKeyChanged) // TODO blocking while previous key has yet sent - can use fifo to improve this -// { -// ASSERT_MESSAGE(systickGetSecondsActive() - start_time < 5, ERR_FAILED, "HID Keyboard Timeout"); -// } - - if (bKeyChanged) - { - return TUSB_ERROR_FAILED; - } - - ASSERT_PTR(p_kbd_report, TUSB_ERROR_FAILED); - - hid_keyboard_report = *p_kbd_report; - bKeyChanged = true; - - return TUSB_ERROR_NONE; -} -#endif - -#if TUSB_CFG_DEVICE_HID_MOUSE -tusb_error_t tusbd_hid_mouse_send_report(tusb_mouse_report_t *p_mouse_report) -{ -// uint32_t start_time = systickGetSecondsActive(); -// while (bMouseChanged) // TODO Block while previous key hasn't been sent - can use fifo to improve this -// { -// ASSERT_MESSAGE(systickGetSecondsActive() - start_time < 5, ERR_FAILED, "HID Mouse Timeout"); -// } - - if (bMouseChanged) - { - return TUSB_ERROR_FAILED; - } - - hid_mouse_report = *p_mouse_report; - bMouseChanged = true; - - return TUSB_ERROR_NONE; -} -#endif - +//--------------------------------------------------------------------+ +// IMPLEMENTATION +//--------------------------------------------------------------------+ ErrorCode_t HID_GetReport( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t* plength) { USB_HID_CTRL_T* pHidCtrl = (USB_HID_CTRL_T*) hHid; diff --git a/tinyusb/core/std_descriptors.h b/tinyusb/core/std_descriptors.h index 854bbe06..249d3149 100644 --- a/tinyusb/core/std_descriptors.h +++ b/tinyusb/core/std_descriptors.h @@ -53,6 +53,8 @@ extern "C" { #endif +#define ENDPOINT_OUT_LOGICAL_TO_PHYSICAL(addr) (addr) +#define ENDPOINT_IN_LOGICAL_TO_PHYSICAL(addr) ((addr) | 0x80) #define STRING_LEN_BYTE2UNICODE(n) (2 + ((n)<<1)) //--------------------------------------------------------------------+ diff --git a/tinyusb/device/dcd_nxp_romdriver.h b/tinyusb/device/dcd_nxp_romdriver.h index 4143805e..e33c4518 100644 --- a/tinyusb/device/dcd_nxp_romdriver.h +++ b/tinyusb/device/dcd_nxp_romdriver.h @@ -47,22 +47,28 @@ #define _TUSB_DCD_NXP_ROMDRIVER_H_ #include "common/common.h" -#include "romdriver/mw_usbd_rom_api.h" #ifdef __cplusplus extern "C" { #endif + +#define USB_MAX_IF_NUM 8 // maximum interface number supported, should be fixed to 8 + #if (MCU == MCU_LPC18XX) || (MCU == MCU_LPC43XX) #include "dcd_lpc18xx_lpc43xx.h" - #define ROM_API ( * ((USBD_API_T**) NXP_ROMDRIVER_FUNCTION_ADDR) ) + #define ROM_API ( * ((USBD_API_T**) NXP_ROMDRIVER_FUNCTION_ADDR) ) + #define USB_MAX_EP_NUM 6 #elif (MCU == MCU_LPC13UXX) || (MCU == MCU_LPC11UXX) #include "dcd_lpc11uxx_lpc13xx.h" - #define ROM_API ( * (*((USBD_API_T***) NXP_ROMDRIVER_FUNCTION_ADDR)) ) + #define ROM_API ( * (*((USBD_API_T***) NXP_ROMDRIVER_FUNCTION_ADDR)) ) + #define USB_MAX_EP_NUM 5 #else #error forgot something, thach ? #endif +#include "romdriver/mw_usbd_rom_api.h" + extern USBD_HANDLE_T romdriver_hdl; #ifdef __cplusplus diff --git a/tinyusb/device/romdriver/mw_usbd_core.h b/tinyusb/device/romdriver/mw_usbd_core.h index fa1995bc..dddbbb51 100644 --- a/tinyusb/device/romdriver/mw_usbd_core.h +++ b/tinyusb/device/romdriver/mw_usbd_core.h @@ -26,7 +26,7 @@ #include "error.h" #include "mw_usbd.h" -#include "tusb_option.h" +#include "../dcd_nxp_romdriver.h" /** \file * \brief ROM API for USB device stack. diff --git a/tinyusb/device/usbd.h b/tinyusb/device/usbd.h index 8da6da22..4f5e53e0 100644 --- a/tinyusb/device/usbd.h +++ b/tinyusb/device/usbd.h @@ -51,7 +51,10 @@ //--------------------------------------------------------------------+ #include "common/common.h" #include "osal/osal.h" // TODO refractor move to common.h ? + +#ifdef _TINY_USB_SOURCE_FILE_ #include "dcd.h" // TODO hide from application include +#endif //#include "tusb_descriptors.h" #ifdef __cplusplus diff --git a/tinyusb/tusb_option.h b/tinyusb/tusb_option.h index fefe4a2d..add373a1 100644 --- a/tinyusb/tusb_option.h +++ b/tinyusb/tusb_option.h @@ -167,9 +167,7 @@ #endif -// TODO Device APP -#define USB_MAX_IF_NUM 8 -#define USB_MAX_EP_NUM 5 + #define USB_FS_MAX_BULK_PACKET 64 #define USB_HS_MAX_BULK_PACKET USB_FS_MAX_BULK_PACKET /* Full speed device only */ @@ -178,14 +176,13 @@ #define USB_MAX_PACKET0 64 /* HID In/Out Endpoint Address */ -#define HID_KEYBOARD_EP_IN USB_ENDPOINT_IN(1) -//#define HID_KEYBOARD_EP_OUT USB_ENDPOINT_OUT(1) -#define HID_MOUSE_EP_IN USB_ENDPOINT_IN(4) +#define HID_KEYBOARD_EP_IN ENDPOINT_IN_LOGICAL_TO_PHYSICAL(1) +#define HID_MOUSE_EP_IN ENDPOINT_IN_LOGICAL_TO_PHYSICAL(4) /* CDC Endpoint Address */ -#define CDC_NOTIFICATION_EP USB_ENDPOINT_IN(2) -#define CDC_DATA_EP_OUT USB_ENDPOINT_OUT(3) -#define CDC_DATA_EP_IN USB_ENDPOINT_IN(3) +#define CDC_NOTIFICATION_EP ENDPOINT_IN_LOGICAL_TO_PHYSICAL(2) +#define CDC_DATA_EP_OUT ENDPOINT_OUT_LOGICAL_TO_PHYSICAL(3) +#define CDC_DATA_EP_IN ENDPOINT_IN_LOGICAL_TO_PHYSICAL(3) #define CDC_NOTIFICATION_EP_MAXPACKETSIZE 8 #define CDC_DATA_EP_MAXPACKET_SIZE 16