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.

[参考译文] RTOS/TM4C1294NCPDT:USBHCPipeWrite 错误

Guru**** 1865830 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/580397/rtos-tm4c1294ncpdt-usbhcdpipewrite-bug

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

usbhostenum.c 文件中 USBHCPDPipeWrite (uint32_t ui32Pipe、uint8_t * pu8Data、uint32_t ui32Size)函数中有一段代码(Tiva USB 库的修订版本2.1.1.71):

 

           //

           //如果不使用 DMA,一次只发送64个字节。

           //

           if (ui32ByteToSend > 64)

           {

               ui32ByteToSend = 64;

           }

           其他

           {

               //

               //发送请求的字节数。

               //

               ui32ByteToSend = ui32RemainingBytes;

           }

 

           //

           //启动写请求。

           //

           G_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].iState = ePipeWriting;

 

           //

           //在 USB 端点上禁用 uDMA

           //

           MAP_USBEndpointDMADisable (USB0_BASE、ui32端点、

                                     USB_EP_HOST_OUT);

 

           //

           //将数据放入缓冲区。

           //

           MAP_USBEndpointDataPut (USB0_BASE、ui32Endpoint、pui8Data、

                                  ui32字节发送);

 

代码循环运行。 假设函数是用 ui32Size = 200调用的。 在第一遍中、ui32ByteToSend 设置为64。 在第二次传递中,由于 ui32ByteToSend 不大于64,因此它设置为 ui32RemainingBytes,在我们的示例中为136。 写入64个以上字节失败、但函数返回调度发送的 ui32Size 字节数量。 这是一个严重的错误、阻止发送超过128个字节。 通过搜索 e2e.ti.com、我可以看到早在2013年10月就报告了此错误(https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/296947/1035641#1035641https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/468291/1681349

https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/491095/1799245)。

 

已尝试按照发行说明中所述修复它:

用于 C 系列的 TivaWare SW-TM4C-RLN-2.1.4.178版本说明文献编号:SPMU299E 2015年5月–2017年2月修订版

5版本2.1.0的发行说明(2014年2月7日)

5.9.1 USBHCPepeWrite()在某些数据大小时挂起如果调用的数据大小大于64而不是64的倍数并且 USB 管道不使用 DMA,则调用会错误地尝试发送请求的完整字节数。 这也导致了对 USBHCPIPPEWrite()的调用挂起,等待的字节超过了可以发送的字节。 现在、该调用只正确发送剩余的字节并正确返回。

 

但从以下内容中更改:

               ui32ByteToSend = ui32Size;

至:

               ui32ByteToSend = ui32RemainingBytes;

 

为 TivaWare 版本2.1.0.12573执行的操作不能执行此操作。

 

一个简单的修复方法可能是替换:

if (ui32ByteToSend > 64)

其中:

if (ui32ByteToSend >= 64)

但请进行测试。

 

谢谢、

ED

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Ed:
    也许我正在阅读 TivaWare 2.1.2.156中的 usbhostenum.c,我对您写的语句不太清楚,“在第二遍中,因为 ui32ByteToSend 不大于64,它设置为 ui32RemainingBytes,在我们的示例中为136。” 在第二轮中、ByteToSend 不应该再次以64开始?

    在前64个字节被传输后、ui32RemainingBytes 变为136、并且由于它大于64、ui32ByteToSend 再次变为64。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
     
    在行设置断点时:
     
    //
         //将数据放入缓冲区。
         //
         MAP_USBEndpointDataPut (USB0_BASE、ui32Endpoint、pui8Data、
                                ui32字节发送);
     
     
    它应该是:
    通过
    ui32 RemainingBytes
    ui32字节发送
    1
    200
    64
    2.
    136.
    64
    3.
    72.
    64
    4.
    8.
    8.
     
     
    它是:
    通过
    ui32 RemainingBytes
    ui32字节发送
    1
    200
    64
    2.
    136.
    136.
     
    这是因为以下代码不正确:
     
    //
         //如果不使用 DMA,一次只发送64个字节。
         //
         if (ui32ByteToSend > 64)
         {
            ui32ByteToSend = 64;
         }
         其他
         {
             //
             //发送请求的字节数。
             //
             ui32ByteToSend = ui32RemainingBytes;
         }
     
    此致、
    ED
     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Ed:
    很抱歉出现问题。 我看到你现在说什么。 看起来仍然是一个未解决的问题。 我无法保证还会推出另一个 TivaWare 版本。 同时、如果您的黑客攻击有效、请继续。 我需要在内部讨论这个问题。