experimental CMSIS-DAP USB bulk interface

This commit is contained in:
Triss 2021-10-24 16:39:52 +02:00
parent 22141ddd45
commit 9892383e1f
5 changed files with 95 additions and 40 deletions

View File

@ -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"

View File

@ -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

View File

@ -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,

View File

@ -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",

View File

@ -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