工具/软件:
我在 LP-AM243 上运行 cc_echo_freertos_am243x-evm_r5fss0-0_freertos_ti-arm-clang 工程。
如何检查 USB 测试模式 (TEST_J、TEST_K、TEST_packet、SE0_NAK)?
此致、
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
尊敬的 Tushar:
这些是我添加的虚拟代码。
cc_echo_freertos_am243x-evm_r5fss0-0_freertos_ti-arm-clang/cc_echo_freertos.c
156-175 号线
{
extern void dcd_testmodeCheck(int test_selector);
switch (buf[i])
{
case 'a':
dcd_testmodeCheck(1);
break;
case 'b':
dcd_testmodeCheck(2);
break;
case 'c':
dcd_testmodeCheck(3);
break;
case 'd':
dcd_testmodeCheck(4);
break;
default:
break;
}
}
cc_echo_freertos_am243x-evm_r5fss0-0_freertos_ti-arm-clang\usb\tinyusb\portable\am64x_am243x\dcd.c
第 523-532 行
void dcd_testmodeCheck(int test_selector)
{
extern void testmodeCheck(CUSBD_PrivateData* pD, int test_Selector);
testmodeCheck(usb_handle.pD, test_selector);
}
cc_echo_freertos_am243x-evm_r5fss0-0_freertos_ti-arm-clang/usb/cdn/core_drivers/device/cusbd.c src
2466-2471 号线
void testmodeCheck(CUSBD_PrivateData * dev, int test_selector)
{
CH9_UsbSetup setup;
setup.wIndex = (test_selector & 0xFF) << 8;
handleFeatureRecDevTest(dev, &setup);
}
此致、
本笃史
e2e.ti.com/.../cdc_5F00_echo_5F00_freertos.ce2e.ti.com/.../dcd.ce2e.ti.com/.../cusbd.c
尊敬的 Tushar:
感谢您发送编修。
我尝试了以下两种模式,也没有看到任何变化。
① 按顺序写入 STMODE 和 TMODE_SEL
void testmodeCheck(CUSBD_PrivateData * dev, int test_selector)
{
CH9_UsbSetup setup;
setup.wIndex = (test_selector & 0xFF) << 8;
CPS_UncachedWrite32(&dev->reg->USBR_CMD, 1U << 9);
handleFeatureRecDevTest(dev, &setup);
}
②Write STMODE 和 TMODE_SEL
static uint32_t handleFeatureRecDevTest(CUSBD_PrivateData * dev, const CH9_UsbSetup *ctrl) {
uint32_t wIndex = ctrl->wIndex;
uint32_t ret = CDN_EOK;
if ((wIndex & 0xffU) != 0U) {
ret = CDN_EINVAL;
}
if (ret == CDN_EOK) {
uint8_t test_selector = (uint8_t) ((ctrl->wIndex >> 8) & 0x00FFU);
uint32_t regSelec = 1U << 9;
switch (test_selector) {
/* TEST J */
case CH9_TEST_J:
SET_USB_CMD_TMODE_SEL(®Selec, USBRV_TM_TEST_J);
break;
/*test K*/
case CH9_TEST_K:
SET_USB_CMD_TMODE_SEL(®Selec, USBRV_TM_TEST_K);
break;
/*test se0_NAK*/
case CH9_TEST_SE0_NAK:
SET_USB_CMD_TMODE_SEL(®Selec, USBRV_TM_SE0_NAK);
break;
/* packet test */
case CH9_TEST_PACKET:
SET_USB_CMD_TMODE_SEL(®Selec, USBRV_TM_TEST_PACKET);
break;
case CH9_TEST_FORCE_EN:
break;
default:;
break;
}
CPS_UncachedWrite32(&dev->reg->USBR_CMD, regSelec);
}
return ret;
}
此致、
本笃史
尊敬的 Tushar:
以下实施是否正确?
我重新检查了这个、没有看到任何变化。
void testmodeCheck(CUSBD_PrivateData * dev, int test_selector)
{
CH9_UsbSetup setup;
setup.wIndex = (test_selector & 0xFF) << 8;
setup.bmRequestType = CH9_USB_REQ_RECIPIENT_DEVICE;
setup.wValue = CH9_USB_FS_TEST_MODE;
setup.bRequest = CH9_USB_REQ_SET_FEATURE;
CPS_UncachedWrite32(&dev->reg->USBR_CMD, 1U << 9);
handleFeatureRecDevTest(dev, &setup);
}
此致、
本笃史
嗨、Motofumi、
感谢您的更新。 很高兴听到您能够解决该问题。
能否说明您正在从哪个 API 调用此 setConfigStateAddressed 函数?
您的代码现在看起来像下面的代码片段吗?
void testmodeCheck(CUSBD_PrivateData * dev, int test_selector)
{
CH9_UsbSetup setup;
setup.wIndex = (test_selector & 0xFF) << 8;
setup.bmRequestType = CH9_USB_REQ_RECIPIENT_DEVICE;
setup.wValue = CH9_USB_FS_TEST_MODE;
setup.bRequest = CH9_USB_REQ_SET_FEATURE;
CPS_UncachedWrite32(&dev->reg->USBR_CMD, 1U << 9);
setConfigStateAddressed(dev, setup, test_selector);
handleFeatureRecDevTest(dev, &setup);
}
此致、
Tushar
尊敬的 Tushar:
这是我的代码。
1. 我已经停止使用 CDC 数据作为触发器。 (在接收设置配置时调用 setConfigStateAddressed)
2. 添加了检测 handleEp0IrqSetup 函数中 CH9_USB_REQ_SET_CONFIGURATION 的处理以调用 setConfigStateAddressed 和 testmodeCheck。
if (ctrl.bRequest == CH9_USB_REQ_SET_CONFIGURATION)
{
setConfigStateAddressed(dev, &ctrl, ctrl.wValue & 0xFF);
testmodeCheck(dev, 1);
}
3.要同时写入 TMODE_SEL 和 STMODE、围绕测试模式的实现如下所示
static uint32_t handleFeatureRecDevTest(CUSBD_PrivateData * dev, const CH9_UsbSetup *ctrl) {
uint32_t wIndex = ctrl->wIndex;
uint32_t ret = CDN_EOK;
if ((wIndex & 0xffU) != 0U) {
ret = CDN_EINVAL;
}
if (ret == CDN_EOK) {
uint8_t test_selector = (uint8_t) ((ctrl->wIndex >> 8) & 0x00FFU);
uint32_t regSelec = 1U << 9;
switch (test_selector) {
/* TEST J */
case CH9_TEST_J:
SET_USB_CMD_TMODE_SEL(®Selec, USBRV_TM_TEST_J);
break;
/*test K*/
case CH9_TEST_K:
SET_USB_CMD_TMODE_SEL(®Selec, USBRV_TM_TEST_K);
break;
/*test se0_NAK*/
case CH9_TEST_SE0_NAK:
SET_USB_CMD_TMODE_SEL(®Selec, USBRV_TM_SE0_NAK);
break;
/* packet test */
case CH9_TEST_PACKET:
SET_USB_CMD_TMODE_SEL(®Selec, USBRV_TM_TEST_PACKET);
break;
case CH9_TEST_FORCE_EN:
break;
default:;
break;
}
CPS_UncachedWrite32(&dev->reg->USBR_CMD, regSelec);
}
return ret;
}
void testmodeCheck(CUSBD_PrivateData * dev, int test_selector)
{
CH9_UsbSetup setup;
setup.wIndex = (test_selector & 0xFF) << 8;
setup.bmRequestType = CH9_USB_REQ_RECIPIENT_DEVICE;
setup.wValue = CH9_USB_FS_TEST_MODE;
setup.bRequest = CH9_USB_REQ_SET_FEATURE;
handleFeatureRecDevTest(dev, &setup);
}
此致、
本笃史