diff --git a/bsp/rp2040/bsp-info.h b/bsp/rp2040/bsp-info.h index cde02e2..1201450 100644 --- a/bsp/rp2040/bsp-info.h +++ b/bsp/rp2040/bsp-info.h @@ -4,14 +4,14 @@ #define BSP_INFO_H_ /*#define USB_VID 0x2e8a*/ /* Raspberry Pi */ -/*#define USB_VID 0xcafe*/ /* TinyUSB */ +#define USB_VID 0xcafe /* TinyUSB */ /*#define USB_VID 0x1209*/ /* Generic */ /*#define USB_VID 0x1d50*/ /* OpenMoko */ -/*#define USB_PID 0x1312*/ +#define USB_PID 0x1312 /* openFPGAloader silliness */ -#define USB_VID 0x0d28 /* NXP */ -#define USB_PID 0x0204 /* ARM mbed */ +/*#define USB_VID 0x0d28*/ /* NXP */ +/*#define USB_PID 0x0204*/ /* ARM mbed */ // TODO: other RP2040 boards #define INFO_BOARDNAME "RP2040 Pico" diff --git a/bsp/rp2040/m_default/bsp-feature.h b/bsp/rp2040/m_default/bsp-feature.h index 4de1c15..04b74fd 100644 --- a/bsp/rp2040/m_default/bsp-feature.h +++ b/bsp/rp2040/m_default/bsp-feature.h @@ -25,8 +25,9 @@ enum { CDC_N__NITF }; enum { + VND_N_CMSISDAP = 0, #if CFG_TUD_VENDOR > 0 - VND_N_CFG = 0, + VND_N_CFG, #endif VND_N__NITF diff --git a/bsp/rp2040/m_isp/bsp-feature.h b/bsp/rp2040/m_isp/bsp-feature.h index b9cfedb..22e2ecb 100644 --- a/bsp/rp2040/m_isp/bsp-feature.h +++ b/bsp/rp2040/m_isp/bsp-feature.h @@ -22,8 +22,9 @@ enum { CDC_N__NITF }; enum { + VND_N_CMSISDAP = 0, #if CFG_TUD_VENDOR > 0 - VND_N_CFG = 0, + VND_N_CFG, #endif VND_N_MEHFET, diff --git a/src/m_default/_default.c b/src/m_default/_default.c index 9882d05..80b04b5 100644 --- a/src/m_default/_default.c +++ b/src/m_default/_default.c @@ -21,6 +21,10 @@ /* temperature sensor */ #include "m_default/tempsensor.h" +// TODO: CMSIS-DAP USB bulk: +// * DAP_ExecuteCommand (returns response size) +// * interface: vendor, 0.0 subclass/proto, EP1, CMSIS-DAP in name + enum m_default_cmds { mdef_cmd_spi = mode_cmd__specific, mdef_cmd_i2c, @@ -100,6 +104,34 @@ static void leave_cb(void) { #endif } +void dap_do_bulk_stuff(int itf) { + // FIXME: move to a separate file, maybe + static uint8_t rx_buf[DAP_PACKET_SIZE]; + static uint8_t tx_buf[DAP_PACKET_SIZE]; + static uint32_t rxpos = 0; + + if (tud_vendor_n_mounted(itf) && tud_vendor_n_available(itf)) { + uint32_t avail = tud_vendor_n_read(itf, &rx_buf[rxpos], sizeof rx_buf - rxpos); + uint32_t pos2 = rxpos + avail; + + if (pos2) { + uint32_t res = DAP_ExecuteCommand(&rx_buf[rxpos], tx_buf); + + uint16_t respcount = (uint16_t)res, + reqcount = (uint16_t)(res>>16); + + if (reqcount < pos2) { + // welp, let's wait + rxpos = pos2; + } else { + tud_vendor_n_write(itf, tx_buf, respcount); + memmove(rx_buf, &rx_buf[rxpos+reqcount], DAP_PACKET_SIZE - reqcount); + rxpos = 0; + } + } + } +} + static void task_cb(void) { #ifdef DBOARD_HAS_UART tud_task(); @@ -109,6 +141,8 @@ static void task_cb(void) { tud_task(); thread_enter(serprogthread); #endif + + dap_do_bulk_stuff(VND_N_CMSISDAP); } static void handle_cmd_cb(uint8_t cmd) { @@ -190,12 +224,16 @@ enum { STRID_IF_VND_CFG, STRID_IF_HID_CMSISDAP, + STRID_IF_VND_CMSISDAP, STRID_IF_VND_I2CTINYUSB, STRID_IF_CDC_UART, STRID_IF_CDC_SERPROG, STRID_IF_CDC_STDIO, }; enum { +#ifdef DBOARD_HAS_CMSISDAP + ITF_NUM_VND_CMSISDAP, +#endif #if CFG_TUD_VENDOR > 0 ITF_NUM_VND_CFG, #endif @@ -230,6 +268,7 @@ enum { + TUD_I2CTINYUSB_LEN #endif #ifdef DBOARD_HAS_CMSISDAP + + TUD_VENDOR_DESC_LEN + TUD_HID_INOUT_DESC_LEN #endif #ifdef DBOARD_HAS_UART @@ -243,29 +282,20 @@ enum { #endif }; -#define EPNUM_VND_CFG_OUT 0x01 -#define EPNUM_VND_CFG_IN 0x81 -#define EPNUM_HID_CMSISDAP 0x02 -#define EPNUM_CDC_UART_OUT 0x03 -#define EPNUM_CDC_UART_IN 0x83 -#define EPNUM_CDC_UART_NOTIF 0x84 -#define EPNUM_CDC_SERPROG_OUT 0x05 -#define EPNUM_CDC_SERPROG_IN 0x85 -#define EPNUM_CDC_SERPROG_NOTIF 0x86 -#define EPNUM_CDC_STDIO_OUT 0x07 -#define EPNUM_CDC_STDIO_IN 0x87 -#define EPNUM_CDC_STDIO_NOTIF 0x88 - -/*#define EPNUM_CDC_UART_OUT 0x02 -#define EPNUM_CDC_UART_IN 0x82 -#define EPNUM_CDC_UART_NOTIF 0x83 -#define EPNUM_HID_CMSISDAP 0x04 -#define EPNUM_CDC_SERPROG_OUT 0x05 -#define EPNUM_CDC_SERPROG_IN 0x85 -#define EPNUM_CDC_SERPROG_NOTIF 0x86 -#define EPNUM_CDC_STDIO_OUT 0x07 -#define EPNUM_CDC_STDIO_IN 0x87 -#define EPNUM_CDC_STDIO_NOTIF 0x88*/ +#define EPNUM_VND_DAP_OUT 0x01 +#define EPNUM_VND_DAP_IN 0x81 +#define EPNUM_VND_CFG_OUT 0x02 +#define EPNUM_VND_CFG_IN 0x82 +#define EPNUM_HID_CMSISDAP 0x03 +#define EPNUM_CDC_UART_OUT 0x04 +#define EPNUM_CDC_UART_IN 0x84 +#define EPNUM_CDC_UART_NOTIF 0x85 +#define EPNUM_CDC_SERPROG_OUT 0x06 +#define EPNUM_CDC_SERPROG_IN 0x86 +#define EPNUM_CDC_SERPROG_NOTIF 0x87 +#define EPNUM_CDC_STDIO_OUT 0x08 +#define EPNUM_CDC_STDIO_IN 0x88 +#define EPNUM_CDC_STDIO_NOTIF 0x89 // clang-format off #if CFG_TUD_HID > 0 @@ -278,6 +308,11 @@ static const uint8_t desc_configuration[] = { TUD_CONFIG_DESCRIPTOR(1, ITF_NUM__TOTAL, STRID_CONFIG, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), +#ifdef DBOARD_HAS_CMSISDAP + TUD_VENDOR_DESCRIPTOR_EX(ITF_NUM_VND_CMSISDAP, STRID_IF_VND_CMSISDAP, EPNUM_VND_DAP_OUT, + EPNUM_VND_DAP_IN, CFG_TUD_VENDOR_RX_BUFSIZE, 0, 0), +#endif + #if CFG_TUD_VENDOR > 0 TUD_VENDOR_DESCRIPTOR_EX(ITF_NUM_VND_CFG, STRID_IF_VND_CFG, EPNUM_VND_CFG_OUT, EPNUM_VND_CFG_IN, CFG_TUD_VENDOR_RX_BUFSIZE, VND_CFG_SUBCLASS, VND_CFG_PROTOCOL), @@ -321,6 +356,7 @@ static const char* string_desc_arr[] = { // max string length check: ||||||||||||||||||||||||||||||| [STRID_IF_VND_CFG ] = "Device cfg/ctl interface", [STRID_IF_HID_CMSISDAP] = "CMSIS-DAP HID interface", + [STRID_IF_VND_CMSISDAP] = "CMSIS-DAP bulk interface", [STRID_IF_VND_I2CTINYUSB] = "I2C-Tiny-USB interface", [STRID_IF_CDC_UART] = "UART CDC interface", [STRID_IF_CDC_SERPROG] = "Serprog CDC interface", diff --git a/src/m_isp/_isp.c b/src/m_isp/_isp.c index 225a5a0..ccbfccf 100644 --- a/src/m_isp/_isp.c +++ b/src/m_isp/_isp.c @@ -93,6 +93,8 @@ static void leave_cb(void) { #endif } +void dap_do_bulk_stuff(int itf); + static void task_cb(void) { #ifdef DBOARD_HAS_UART tud_task(); @@ -102,6 +104,8 @@ static void task_cb(void) { tud_task(); thread_enter(mehfetthread); #endif + + dap_do_bulk_stuff(VND_N_CMSISDAP); } static void handle_cmd_cb(uint8_t cmd) { @@ -136,11 +140,15 @@ enum { STRID_IF_VND_CFG, STRID_IF_HID_CMSISDAP, + STRID_IF_VND_CMSISDAP, STRID_IF_CDC_UART, STRID_IF_VND_MEHFET, STRID_IF_CDC_STDIO, }; enum { +#ifdef DBOARD_HAS_CMSISDAP + ITF_NUM_VND_CMSISDAP, +#endif #if CFG_TUD_VENDOR > 0 ITF_NUM_VND_CFG, #endif @@ -168,6 +176,7 @@ enum { + TUD_VENDOR_DESC_LEN #endif #ifdef DBOARD_HAS_CMSISDAP + + TUD_VENDOR_DESC_LEN + TUD_HID_INOUT_DESC_LEN #endif #ifdef DBOARD_HAS_UART @@ -181,17 +190,19 @@ enum { #endif }; -#define EPNUM_VND_CFG_OUT 0x01 -#define EPNUM_VND_CFG_IN 0x81 -#define EPNUM_HID_CMSISDAP 0x02 -#define EPNUM_CDC_UART_OUT 0x03 -#define EPNUM_CDC_UART_IN 0x83 -#define EPNUM_CDC_UART_NOTIF 0x84 -#define EPNUM_VND_MEHFET_OUT 0x05 -#define EPNUM_VND_MEHFET_IN 0x85 -#define EPNUM_CDC_STDIO_OUT 0x06 -#define EPNUM_CDC_STDIO_IN 0x86 -#define EPNUM_CDC_STDIO_NOTIF 0x87 +#define EPNUM_VND_DAP_OUT 0x01 +#define EPNUM_VND_DAP_IN 0x81 +#define EPNUM_VND_CFG_OUT 0x02 +#define EPNUM_VND_CFG_IN 0x82 +#define EPNUM_HID_CMSISDAP 0x03 +#define EPNUM_CDC_UART_OUT 0x04 +#define EPNUM_CDC_UART_IN 0x84 +#define EPNUM_CDC_UART_NOTIF 0x85 +#define EPNUM_VND_MEHFET_OUT 0x06 +#define EPNUM_VND_MEHFET_IN 0x86 +#define EPNUM_CDC_STDIO_OUT 0x07 +#define EPNUM_CDC_STDIO_IN 0x87 +#define EPNUM_CDC_STDIO_NOTIF 0x88 // clang-format off #if CFG_TUD_HID > 0 @@ -203,6 +214,11 @@ static const uint8_t desc_configuration[] = { TUD_CONFIG_DESCRIPTOR(1, ITF_NUM__TOTAL, STRID_CONFIG, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), +#ifdef DBOARD_HAS_CMSISDAP + TUD_VENDOR_DESCRIPTOR_EX(ITF_NUM_VND_CMSISDAP, STRID_IF_VND_CMSISDAP, EPNUM_VND_DAP_OUT, + EPNUM_VND_DAP_IN, CFG_TUD_VENDOR_RX_BUFSIZE, 0, 0), +#endif + #if CFG_TUD_VENDOR > 0 TUD_VENDOR_DESCRIPTOR_EX(ITF_NUM_VND_CFG, STRID_IF_VND_CFG, EPNUM_VND_CFG_OUT, EPNUM_VND_CFG_IN, CFG_TUD_VENDOR_RX_BUFSIZE, VND_CFG_SUBCLASS, VND_CFG_PROTOCOL), @@ -242,6 +258,7 @@ static const char* string_desc_arr[] = { // max string length check: ||||||||||||||||||||||||||||||| [STRID_IF_VND_CFG ] = "Device cfg/ctl interface", [STRID_IF_HID_CMSISDAP] = "CMSIS-DAP HID interface", + [STRID_IF_VND_CMSISDAP] = "CMSIS-DAP bulk interface", [STRID_IF_CDC_UART] = "UART CDC interface", [STRID_IF_VND_MEHFET] = "MehFET MSP430 debug interface", #ifdef USE_USBCDC_FOR_STDIO