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.

[参考译文] CCS/TM4C1294NCPDT:管道中的 Android 打开附件问题

Guru**** 2555630 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/904653/ccs-tm4c1294ncpdt-android-open-accessory-in-pipe-problem

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

您好!

我编写了一个主机驱动程序、使用 Android Open Accessory 协议将 Android 设备连接到定制板。 我可以连接 Android 设备。 让设备以附件模式重新连接、在附件模式下连接后、我可以在 Android 设备上发送数据和接收数据。 当我尝试从 Android 设备向 TM4C1294发送数据时、会出现问题。 我将数据写入器件上的数据流、没有任何错误、但在 TM4C1294上没有收到任何错误。 端点上的 RX 计数保持为零。 器件返回一个接口、其中包含两个端点。 和输出端点地址01中的端点地址。 该驱动程序基本上是 位于 Tiva USBLIB 之上的自定义主机驱动程序。 如果有人有想法,我将不胜感激。

谢谢、

Richard。   

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

    您好 RK、

     我对 AOA 协议没有任何经验。 我刚刚在我的结尾读了一些关于它的内容 我的理解是、在附件模式下、MCU 是 USB 主机、Android 供电设备是 USB 设备。 如果我理解正确、充当主机的 MCU 能够在 Android 设备上发送数据和接收数据。 这是正确的理解吗? 您指出、当从 Android 设备向 TM4C1294发送数据时会出现问题。 这是我不清楚的地方。 这似乎与之前关于您可以在 Android 设备上发送和接收数据的声明相矛盾。 TM4C1294是 USB 主机。 USB 主机应先从器件请求数据、然后器件才能发送数据。 我不清楚 TM4C 是否首先向 Android 设备发送请求而不是接收数据。 如果您有 USB 分析仪、调试将变得更容易。 您将能够了解主机是否发送了正确的请求以及 Android 设备是否发回数据。  

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

    您好!

    有时、如果财富不能实现、相关信息可能(间接)来源于相关信息。   我们的几家小公司的员工在使用(另一家) ARM Cortex M4 MCU 的同时、通过 USB 中心公司 FTDI 得出的"关键发现"、实现了"与您表达的需求类似"的目标。   (这是几年前的事-我们可能(或可能不)能够进一步提供帮助...)

    Android 的"FTDI"适应范围在本屏幕截图中有很好的说明:

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

    您好!

    是您正确、主机必须从设备请求数据。 我正在使用 USBHCPDPipeRead 在端点设置请求数据包标志。 下面是设置请求包标志后端点的接收控制寄存器值。 您将注意到数据错误标志已设置。 数据表中说、这表示数据就绪标志已设置、并且发生了数据包 CRC、但数据就绪未设置。   

    USB_RXCSRL1_CLRDT 0x0清除数据切换
    USB_RXCSRL1_STALLED 0x0端点挂起
    USB_RXCSRL1_STALL 0x1发送 STALL
    USB_RXCSRL1_REQPKT 0x1请求数据包
    USB_RXCSRL1_FLUSH 0x0清空 FIFO
    USB_RXCSRL1_DATAERR 0x1数据错误
    USB_RXCSRL1_NAKTO 0x1 NAK 超时
    USB_RXCSRL1_OVER 0x0溢出
    USB_RXCSRL1_ERROR 0x0错误
    USB_RXCSRL1_FULL 0x0 FIFO 满
    USB_RXCSRL1_RXRDY 0x0接收数据包就绪

    Richard。

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

    您好 Richard、

    我浏览了一些 Android 页面、但找不到需要在 MCU 级别提供进一步指导的信息。

    AOA 希望主机使用哪种 USB 接口进行数据传输? 具有批量传输的 CDC? HID? 其他类别的器件?

    这件事并不清楚,需要在这里加以揭露。

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

    拉尔夫

    通信是通过批量传输进行的。 我包含了下面器件返回的端点描述符。  

    找到 Android 附件设备

    pEndpointDescriptor 详细信息:
    bLength =0x07 (应为0x07)
    b 描述符类型=0x05
    bEndpointAddress =0x81
    bmAttributes =0x02 (0x00=CTRL、0x01=ISOC、0x02=BULK、0x03=INT
    wMaxPacketSize = 0x0040
    b 间隔=0x0000
    alloc USB 管道中的批量端点
    pEndpointDescriptor 详细信息:
    bLength =0x07 (应为0x07)
    b 描述符类型=0x05
    bEndpointAddress =0x02
    bmAttributes =0x02 (0x00=CTRL、0x01=ISOC、0x02=BULK、0x03=INT
    wMaxPacketSize = 0x0040
    b 间隔=0x0000
    端点批量输出分配 USB 管道

    Richard。

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

    您好 Richard、

    我看到了大量端点组件、但许多接口都使用这些端点。 CDC、MSC 等 我要尝试理解的是接口在这里。

    如果 AOA 等效于 CDC/MSC/HID、则需要构建堆栈的自定义部分来处理它。

    但是、如果它连接到其中一个接口上、那么 TivaWare 可能会在本地支持它。

    我在这里担心的是、它可能需要 CDC 接口、我们目前不支持主机。

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

    拉尔夫

    我不确定它属于任何 特定类别的器件。 请参阅 https://source.android.com/devices/accessories/aoa。 以下是 https://tool.oschina.net/uploads/apidocs/android/tools/adk/aoa.html 的完整说明 

    Richard。

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

    您好 Richard、

     您共享的有关 Android 设备的链接需要处于附件模式、供应商 ID 应与 Google 的 ID (0x18D1)匹配、产品 ID 应为0x2D00或0x2D01。 您是否知道 Android 是否处于附件模式?

     该链接未说明要使用的接口或 USB 类。 如果 AOA 需要独特的 USB 接口、则需要创建自己的接口。 您可能需要引用具有批量传输的 MSC 层。  

     查看您发送的状态寄存器、NAK 超时和错误位被置位。 似乎 Android 设备没有响应。 您可能还想调查 Android 设备端。 正如我提到过的、如果您有 USB 分析器、它将有助于您的调试。

    USB_RXCSRL1_STALL 0x1发送 STALL
    USB_RXCSRL1_REQPKT 0x1请求数据包
    USB_RXCSRL1_DATAERR 0x1数据错误
    USB_RXCSRL1_NAKTO 0x1 NAK 超时

     我对《行动计划》并不熟悉、因此无法提供比上述内容更多的评论/建议。  

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

    查尔斯

    我已经在 USBLIB 主机驱动程序的基础上创建了自己的自定义主机。  所有功能都符合标准。 当我将器件切换到附件模式时、我为端点分配和配置管道。 我可以通过输出管道向 Android 设备发送数据、并在 Android 应用中接收数据。 唯一不起作用的是在管道中接收数据。 非常近! 遗憾的是、我没有 USB 分析仪、真希望我这么做!  

    Richard。

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

    您好 Richard、

     您是否使用过不同的 Android 设备? 这让我感觉您遇到问题的状态可能是在设备端。 您需要调试主机在从管道中读取时从器件获取 NAK 的原因。 器件未准备好发送、或者没有任何东西可使用 NAK 发送和回复。  

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

    所有、

    我要感谢大家的帮助。 我现在已经解决了这个问题。 这不是一个问题,而是两个问题。 首先、Tiva USB 驱动程序不处理 NAK 超时。 因此、如果您向器件发出 PipeRead、并且器件没有要发送的数据。 端点将出现 NAK 超时。 这会导致调用线程在 PipeRead 函数中无限循环。

    为了解决此问题、我必须使用 Pipeschedule 、在接收回调中查看端点是否有 NAK 超时、如果是、则发出 PipeSchedule、否则从接收缓冲区读取数据。

    第二个问题是器件侧。 即使我在分离时关闭流、在重新连接时重新打开流。 除非关闭并重新打开应用程序、否则不能传输任何数据。 我确定这是我做的不正确的事情。  

    谢谢、

    Richard。

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

    您好 Richard、

    我一直在努力改进主机 USB 的功能、我还记得我们进行的这项交流。 我想知道您是否能够分享您对 USB 驱动程序所做的修改以解决此问题? 我也可以查看这些内容、看看将来直接将其纳入驱动程序中是否有意义、或者至少通过文档提及。

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

    拉尔夫

    我非常愿意分享我的代码。 但我必须寻求许可才能这样做。 无论如何、我至少能够解释使驱动程序正常工作所涉及的内容以及一些相关的代码段。  

    此致、

    Richard。