From 89ace295ba2b509dcb42d3df9501134df968c2f4 Mon Sep 17 00:00:00 2001 From: hathach Date: Sun, 28 Apr 2019 00:43:36 +0700 Subject: add TUD_ to HID_REPORT_DESC_* template --- src/class/msc/msc_device.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src/class/msc') diff --git a/src/class/msc/msc_device.c b/src/class/msc/msc_device.c index e2cf92324..360503d9b 100644 --- a/src/class/msc/msc_device.c +++ b/src/class/msc/msc_device.c @@ -163,9 +163,12 @@ bool mscd_control_request(uint8_t rhport, tusb_control_request_t const * p_reque case MSC_REQ_GET_MAX_LUN: { + uint8_t maxlun = 1; + if (tud_msc_maxlun_cb) maxlun = tud_msc_maxlun_cb(); + TU_VERIFY(maxlun); + // MAX LUN is minus 1 by specs - uint8_t maxlun = 0; - if (tud_msc_maxlun_cb) maxlun = tud_msc_maxlun_cb() -1; + maxlun--; usbd_control_xfer(rhport, p_request, &maxlun, 1); } -- cgit v1.3.1 From c006f3dbce7820bbdc2c1736ba0cb4a4e629f0b6 Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 1 May 2019 19:29:56 +0700 Subject: adding optional ep out for hid refactor usbd_open_edpt_pair --- src/class/cdc/cdc_device.c | 8 +++----- src/class/hid/hid_device.c | 14 +++++--------- src/class/msc/msc_device.c | 5 ++--- src/device/usbd.c | 20 ++++++++++---------- src/device/usbd_pvt.h | 3 +-- 5 files changed, 21 insertions(+), 29 deletions(-) (limited to 'src/class/msc') diff --git a/src/class/cdc/cdc_device.c b/src/class/cdc/cdc_device.c index c194aacd8..5e0f4e3f7 100644 --- a/src/class/cdc/cdc_device.c +++ b/src/class/cdc/cdc_device.c @@ -289,14 +289,12 @@ bool cdcd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t (TUSB_CLASS_CDC_DATA == ((tusb_desc_interface_t const *) p_desc)->bInterfaceClass) ) { // next to endpoint descriptor - (*p_length) += tu_desc_len(p_desc); p_desc = tu_desc_next(p_desc); - // Open endpoint pair with usbd helper - tusb_desc_endpoint_t const *p_desc_ep = (tusb_desc_endpoint_t const *) p_desc; - TU_ASSERT( usbd_open_edpt_pair(rhport, p_desc_ep, TUSB_XFER_BULK, &p_cdc->ep_out, &p_cdc->ep_in) ); + // Open endpoint pair + TU_ASSERT( usbd_open_edpt_pair(rhport, p_desc, 2, TUSB_XFER_BULK, &p_cdc->ep_out, &p_cdc->ep_in) ); - (*p_length) += 2*sizeof(tusb_desc_endpoint_t); + (*p_length) += sizeof(tusb_desc_interface_t) + 2*sizeof(tusb_desc_endpoint_t); } // Prepare for incoming data diff --git a/src/class/hid/hid_device.c b/src/class/hid/hid_device.c index b1a4efe9a..87b1b2c7b 100644 --- a/src/class/hid/hid_device.c +++ b/src/class/hid/hid_device.c @@ -160,6 +160,10 @@ bool hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t { uint8_t const *p_desc = (uint8_t const *) desc_itf; + // TODO support multiple HID interface + uint8_t itf = 0; + hidd_interface_t * p_hid = &_hidd_itf[itf]; + //------------- HID descriptor -------------// p_desc = tu_desc_next(p_desc); tusb_hid_descriptor_hid_t const *desc_hid = (tusb_hid_descriptor_hid_t const *) p_desc; @@ -167,20 +171,12 @@ bool hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t //------------- Endpoint Descriptor -------------// p_desc = tu_desc_next(p_desc); - tusb_desc_endpoint_t const *desc_edpt = (tusb_desc_endpoint_t const *) p_desc; - TU_ASSERT(TUSB_DESC_ENDPOINT == desc_edpt->bDescriptorType); - - TU_ASSERT(dcd_edpt_open(rhport, desc_edpt)); - - // TODO support multiple HID interface - uint8_t itf = 0; - hidd_interface_t * p_hid = &_hidd_itf[itf]; + TU_ASSERT(usbd_open_edpt_pair(rhport, p_desc, desc_itf->bNumEndpoints, TUSB_XFER_INTERRUPT, &p_hid->ep_out, &p_hid->ep_in)); if ( desc_itf->bInterfaceSubClass == HID_SUBCLASS_BOOT ) p_hid->boot_protocol = desc_itf->bInterfaceProtocol; p_hid->boot_mode = false; // default mode is REPORT p_hid->itf_num = desc_itf->bInterfaceNumber; - p_hid->ep_in = desc_edpt->bEndpointAddress; p_hid->reprot_desc_len = desc_hid->wReportLength; *p_len = sizeof(tusb_desc_interface_t) + sizeof(tusb_hid_descriptor_hid_t) + desc_itf->bNumEndpoints*sizeof(tusb_desc_endpoint_t); diff --git a/src/class/msc/msc_device.c b/src/class/msc/msc_device.c index 360503d9b..1d5a3fc26 100644 --- a/src/class/msc/msc_device.c +++ b/src/class/msc/msc_device.c @@ -135,9 +135,8 @@ bool mscd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t mscd_interface_t * p_msc = &_mscd_itf; - // Open endpoint pair with usbd helper - tusb_desc_endpoint_t const *p_desc_ep = (tusb_desc_endpoint_t const *) tu_desc_next( itf_desc ); - TU_ASSERT( usbd_open_edpt_pair(rhport, p_desc_ep, TUSB_XFER_BULK, &p_msc->ep_out, &p_msc->ep_in) ); + // Open endpoint pair + TU_ASSERT( usbd_open_edpt_pair(rhport, tu_desc_next(itf_desc), 2, TUSB_XFER_BULK, &p_msc->ep_out, &p_msc->ep_in) ); p_msc->itf_num = itf_desc->bInterfaceNumber; (*p_len) = sizeof(tusb_desc_interface_t) + 2*sizeof(tusb_desc_endpoint_t); diff --git a/src/device/usbd.c b/src/device/usbd.c index f02b21208..d811c471a 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -702,25 +702,25 @@ void dcd_event_xfer_complete (uint8_t rhport, uint8_t ep_addr, uint32_t xferred_ // Helper //--------------------------------------------------------------------+ -// Helper to parse an pair of endpoint descriptors (IN & OUT) -bool usbd_open_edpt_pair(uint8_t rhport, tusb_desc_endpoint_t const* ep_desc, uint8_t xfer_type, uint8_t* ep_out, uint8_t* ep_in) +// Parse consecutive endpoint descriptors (IN & OUT) +bool usbd_open_edpt_pair(uint8_t rhport, uint8_t const* p_desc, uint8_t ep_count, uint8_t xfer_type, uint8_t* ep_out, uint8_t* ep_in) { - for(int i=0; i<2; i++) + for(int i=0; ibDescriptorType && - xfer_type == ep_desc->bmAttributes.xfer ); + tusb_desc_endpoint_t const * desc_ep = (tusb_desc_endpoint_t const *) p_desc; - TU_ASSERT(dcd_edpt_open(rhport, ep_desc)); + TU_VERIFY(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType && xfer_type == desc_ep->bmAttributes.xfer); + TU_ASSERT(dcd_edpt_open(rhport, desc_ep)); - if ( tu_edpt_dir(ep_desc->bEndpointAddress) == TUSB_DIR_IN ) + if ( tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN ) { - (*ep_in) = ep_desc->bEndpointAddress; + (*ep_in) = desc_ep->bEndpointAddress; }else { - (*ep_out) = ep_desc->bEndpointAddress; + (*ep_out) = desc_ep->bEndpointAddress; } - ep_desc = (tusb_desc_endpoint_t const *) tu_desc_next(ep_desc); + p_desc = tu_desc_next(p_desc); } return true; diff --git a/src/device/usbd_pvt.h b/src/device/usbd_pvt.h index 8518ee209..fb3672359 100644 --- a/src/device/usbd_pvt.h +++ b/src/device/usbd_pvt.h @@ -53,9 +53,8 @@ bool usbd_edpt_stalled(uint8_t rhport, uint8_t ep_addr); /*------------------------------------------------------------------*/ /* Helper *------------------------------------------------------------------*/ -// helper to parse an pair of In and Out endpoint descriptors. They must be consecutive -bool usbd_open_edpt_pair(uint8_t rhport, tusb_desc_endpoint_t const* p_desc_ep, uint8_t xfer_type, uint8_t* ep_out, uint8_t* ep_in); +bool usbd_open_edpt_pair(uint8_t rhport, uint8_t const* p_desc, uint8_t ep_count, uint8_t xfer_type, uint8_t* ep_out, uint8_t* ep_in); void usbd_defer_func( osal_task_func_t func, void* param, bool in_isr ); -- cgit v1.3.1 From 205077876380cc63f34c99c559c41ed3a2eaaa81 Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 1 May 2019 20:41:26 +0700 Subject: clean up --- src/class/cdc/cdc_device.c | 2 +- src/class/msc/msc_device.c | 12 ++++-------- src/portable/nordic/nrf5x/dcd_nrf5x.c | 4 ++-- 3 files changed, 7 insertions(+), 11 deletions(-) (limited to 'src/class/msc') diff --git a/src/class/cdc/cdc_device.c b/src/class/cdc/cdc_device.c index 5e0f4e3f7..7a0380e6b 100644 --- a/src/class/cdc/cdc_device.c +++ b/src/class/cdc/cdc_device.c @@ -71,7 +71,7 @@ typedef struct //--------------------------------------------------------------------+ // INTERNAL OBJECT & FUNCTION DECLARATION //--------------------------------------------------------------------+ -CFG_TUSB_MEM_SECTION static cdcd_interface_t _cdcd_itf[CFG_TUD_CDC] = { { 0 } }; +CFG_TUSB_MEM_SECTION static cdcd_interface_t _cdcd_itf[CFG_TUD_CDC]; // TODO will be replaced by dcd_edpt_busy() bool pending_read_from_host; diff --git a/src/class/msc/msc_device.c b/src/class/msc/msc_device.c index 1d5a3fc26..f980e941e 100644 --- a/src/class/msc/msc_device.c +++ b/src/class/msc/msc_device.c @@ -42,13 +42,9 @@ enum MSC_STAGE_STATUS }; -typedef struct { - CFG_TUSB_MEM_ALIGN msc_cbw_t cbw; - -//#if defined (__ICCARM__) && (CFG_TUSB_MCU == OPT_MCU_LPC11UXX || CFG_TUSB_MCU == OPT_MCU_LPC13XX) -// uint8_t padding1[64-sizeof(msc_cbw_t)]; // IAR cannot align struct's member -//#endif - +typedef struct +{ + CFG_TUSB_MEM_ALIGN msc_cbw_t cbw; CFG_TUSB_MEM_ALIGN msc_csw_t csw; uint8_t itf_num; @@ -66,7 +62,7 @@ typedef struct { uint8_t add_sense_qualifier; }mscd_interface_t; -CFG_TUSB_MEM_SECTION CFG_TUSB_MEM_ALIGN static mscd_interface_t _mscd_itf = { 0 }; +CFG_TUSB_MEM_SECTION CFG_TUSB_MEM_ALIGN static mscd_interface_t _mscd_itf; CFG_TUSB_MEM_SECTION CFG_TUSB_MEM_ALIGN static uint8_t _mscd_buf[CFG_TUD_MSC_BUFSIZE]; //--------------------------------------------------------------------+ diff --git a/src/portable/nordic/nrf5x/dcd_nrf5x.c b/src/portable/nordic/nrf5x/dcd_nrf5x.c index 1f8e94420..3e5f69f79 100644 --- a/src/portable/nordic/nrf5x/dcd_nrf5x.c +++ b/src/portable/nordic/nrf5x/dcd_nrf5x.c @@ -489,7 +489,7 @@ void USBD_IRQHandler(void) { xfer->total_len = xfer->actual_len; - // BULK/INT OUT complete + // CBI OUT complete dcd_event_xfer_complete(0, epnum, xfer->actual_len, XFER_RESULT_SUCCESS, true); } } @@ -524,7 +524,7 @@ void USBD_IRQHandler(void) xact_in_prepare(epnum); } else { - // Bulk/Int IN complete + // CBI IN complete dcd_event_xfer_complete(0, epnum | TUSB_DIR_IN_MASK, xfer->actual_len, XFER_RESULT_SUCCESS, true); } } -- cgit v1.3.1 From a25ca701cda3e1989bab3add052e82b7a71e5820 Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 1 May 2019 23:26:52 +0700 Subject: text clean up --- src/class/cdc/cdc_device.h | 8 ++++++++ src/class/msc/msc_device.h | 14 ++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) (limited to 'src/class/msc') diff --git a/src/class/cdc/cdc_device.h b/src/class/cdc/cdc_device.h index 6c59bac7a..18d6f842f 100644 --- a/src/class/cdc/cdc_device.h +++ b/src/class/cdc/cdc_device.h @@ -89,9 +89,17 @@ static inline bool tud_cdc_write_flush (void) //--------------------------------------------------------------------+ // APPLICATION CALLBACK API (WEAK is optional) //--------------------------------------------------------------------+ + +// Invoked when received new data ATTR_WEAK void tud_cdc_rx_cb(uint8_t itf); + +// Invoked when received `wanted_char` ATTR_WEAK void tud_cdc_rx_wanted_cb(uint8_t itf, char wanted_char); + +// Invoked when line state DTR & RTS are changed via SET_CONTROL_LINE_STATE ATTR_WEAK void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts); + +// Invoked when line coding is change via SET_LINE_CODING ATTR_WEAK void tud_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* p_line_coding); /** @} */ diff --git a/src/class/msc/msc_device.h b/src/class/msc/msc_device.h index 6e3aef8bb..b1e7e8da1 100644 --- a/src/class/msc/msc_device.h +++ b/src/class/msc/msc_device.h @@ -64,10 +64,11 @@ TU_VERIFY_STATIC(CFG_TUD_MSC_BUFSIZE < UINT16_MAX, "Size is not correct"); bool tud_msc_set_sense(uint8_t lun, uint8_t sense_key, uint8_t add_sense_code, uint8_t add_sense_qualifier); //--------------------------------------------------------------------+ -// APPLICATION CALLBACK (WEAK is optional) +// Application Callbacks (WEAK is optional) //--------------------------------------------------------------------+ + /** - * Callback invoked when received \ref SCSI_CMD_READ_10 command + * Invoked when received \ref SCSI_CMD_READ_10 command * \param[in] lun Logical unit number * \param[in] lba Logical Block Address to be read * \param[in] offset Byte offset from LBA @@ -86,7 +87,7 @@ bool tud_msc_set_sense(uint8_t lun, uint8_t sense_key, uint8_t add_sense_code, u int32_t tud_msc_read10_cb (uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize); /** - * Callback invoked when received \ref SCSI_CMD_WRITE_10 command + * Invoked when received \ref SCSI_CMD_WRITE_10 command * \param[in] lun Logical unit number * \param[in] lba Logical Block Address to be write * \param[in] offset Byte offset from LBA @@ -104,7 +105,8 @@ int32_t tud_msc_read10_cb (uint8_t lun, uint32_t lba, uint32_t offset, void* buf */ int32_t tud_msc_write10_cb (uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize); -// Invoked to determine the disk size +// Invoked when received SCSI_CMD_READ_CAPACITY_10 and SCSI_CMD_READ_FORMAT_CAPACITY to determine the disk size +// Application update block count and block size void tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_size); /** @@ -128,13 +130,13 @@ int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer, /*------------- Optional callbacks -------------*/ -// Invoked to determine max LUN +// Invoked when received GET_MAX_LUN request ATTR_WEAK uint8_t tud_msc_maxlun_cb(void); // Invoked when Read10 command is complete ATTR_WEAK void tud_msc_read10_complete_cb(uint8_t lun); -// Invoke when Write10 command is complete +// Invoke when Write10 command is complete, can be used to flush flash caching ATTR_WEAK void tud_msc_write10_complete_cb(uint8_t lun); // Invoked when command in tud_msc_scsi_cb is complete -- cgit v1.3.1