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.

[参考译文] J6EVM5777:在具有 NCM 支持的 J6 (Android OS)上添加 USB 小工具

Guru**** 2562120 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/598656/j6evm5777-adding-usb-gadget-on-j6-android-os-with-ncm-support

器件型号:J6EVM5777

在 J6上、我尝试从 USB 2.0端口执行 USB 角色开关(主机->器件)、并创建具有多个接口的 USB 小工具、但会遇到一些问题。

当我使用 USB 2.0端口使用公头 Mini-B 转母头标准 A USB 适配器插入 iPhone 时、J6充当主机并正确检测智能手机、并显示相关弹出窗口以选择如何连接到手机。 因此、"主机"部件工作正常。

我打算做一个角色切换、因此 J6不是"器件"、我想创建一个小工具(或从器件)、该小工具具有以下接口配置。
-自定义批量输入/输出
-USB NCM 控制接口
-USB NCM 数据接口

现在、操作系统似乎被配置为使用'configfs'、但我不能 在'/config/usb_gadget 下'mkdir'、因为它会导致以下错误。
>kobject_add_internal 失败对于使用-EEXIST 的 android0、请勿尝试在同一目录中注册具有相同名称的内容。

此外、还有一个用于 USB 3.0端口的'/config/usb_gadget/g1 '。

因此、要使其正常工作、需要解决多个问题、下面是我的问题:

Q1)除了使用 shell 写入'mode'文件之外、是否可以通过编程方式完成角色切换?

Q2)如何使用'configfs'添加一个附加小工具(对于 USB 2.0端口)(mkdir 当前失败)?

Q2)如何添加对 NCM 的支持、以便在将要创建的新 USB 小工具中使用。


谢谢、
Alan

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

    您的查询已转发给专家。 他们将在这里直接评论。

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

    Alan

    您使用的是 Processor SDK Linux 发行版的版本是什么?

    您是在 TI-EVM 板上还是在定制板上尝试?

    此致

    Ravi

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

    您使用的是哪个端口? 设置了什么 dr_mode?
    DR_MODE 应设置为"OTG"。

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

    尊敬的 Ravi:

    正如我在标题中指定的、我使用的是 Android 操作系统、构建版本为6.A.1.3。

    我使用的电路板是具有 JAMR3子卡的 Jacinto 6EVM。

    谢谢、

    Alan

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

    如原始问题中所述、我将使用标有 USB2的端口、这是一个具有 miniB 端口的 USB 2.0端口。 我使用 插入端口的母 A 转公迷你 B 适配器。 我认为'dr_mode'被设置为'OTG'。 我可以使用 shell 上的'echo'命令从"host"<->"device"更改角色(模式文件中至少更改值)。 关于 Q1、我想我可以尝试打开该文件并对其进行写入。

    Q2和 Q3是更重要的问题。

    -Alan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    关于创建 USB 小工具失败的一条注意事项。
    它似乎出现在'kernel/android-4.4/drivers/USB/gadget/configfs.c'中的'androdevice_create()函数中,始终使用设备名称"android0"调用 device_create()。
    由于默认情况下已经创建了一个小工具、因此尝试添加其他小工具时似乎会失败、因为它正在尝试创建名为"android0"的器件、该器件已存在。 这应该如何解决?

    static int android_device_create (struct gadget_info *gi)

    //……
    Android_device = device_create (android_class、NULL、
    mkdev (0、0)、NULL、"android0");
    //……
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的

    是否有关于此问题的任何更新?

    谢谢、

    Alan

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

    Alan

    我不确定"Android 特定更改" drivers/USB/gadget/configfs.c 文件。 ADB 是在端口0还是 USB0超高速端口上启用?

    我已经在独立 Linux 内核上使用 configfs 在主机和器件之间进行了 DRD 角色切换验证。

    您能否在没有 Android 特定更改的情况下尝试内核。

    确保 USB2端口的 dr_mode ="OTG"。  

    mount -t configfs none /sys/kernel/config

    CD /sys/kernel/config
    cd USB_gadget/
    mkdir j6g
    cd j6g
    回显"0xA55A">idVendor
    Cat idVendor
    echo "0x0111"> idProduct
    mkdir 字符串/0x409
    CD 字符串/
    CD 0x409/
    回显"0123456789">序列号
    ECHO "XYZ 公司" >制造商
    ECHO "NCM+ACM 小工具">"产品"
    CD .
    CD .
    CD 功能/
    mkdir acm.GS0
    mkdir ncm.usb0
    CD .
    CD 配置/
    mkdir C.1
    CD C.1.
    mkdir 字符串/0x409
    CD 灯串/0x409/
    回显"ACM+NCM">配置
    CD .
    CD .
    CD .
    CD .
    LN -s functions/ACM.GS0 configs/C.1
    LN -s 函数/ncm.usb0 configs/c.1.
    回显"48890000.usb"> UDC           //对于 USB0

    回显"488d0000.usb"> UDC           //对于 USB1

    此致

    Ravi

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

    感谢您的验证。

    >是否只能在没有 Android 特定更改的情况下尝试内核。

    我可以尝试这种方法、但最终我将需要这种方法才能在 Android 上使用示例配置。
    如果 Android 专家对此进行了研究并提供了建议、我们将不胜感激。
    我看到的问题是它无法使用 configFS 创建第二个 USB 小工具,因为它始终使用"android0"调用`device_create()`。
    (我应该为此创建一个新的线程吗?)

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

    我已将该主题转发给 Android 专家。

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

    尊敬的

    您能否说明启用 USB NCM 功能的步骤?

    似乎 Android 版本禁用了它。

    我知道 TI 使用'ti_config_fragment'来构建内核构建配置。

    在构建内核之前、我尝试在`arch/arm/configs/ti_sdk_dra7x_android_debug_defconfig'中修改生成的文件、但它似乎不起作用。

    也许我错过了一个步骤。

    谢谢、

    Alan

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

    尊敬的 Ravi B:

    我了解了如何使用"ti_config_frages"正确配置内容。

    我尝试手动编辑 defconfig 文件、但可能缺少一些标志。

    看起来、.config 是作为构建步骤的一部分创建的、我需要做的就是使用最终的.config 文件进行"make menuconfig"以添加适当的功能。

    因此、您现在可以忽略我关于 USB NCM 功能构建的最后一个问题。

    我仍然需要获得支持、以使其他 USB 小工具在 Android 操作系统上正常工作。

    谢谢、

    Alan

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

    Alan

    确保构建了 G_NCM 模块、并在 DTB 文件中将 DR_MODE 设置为"OTG"。

    CONFIG_USB_NET_CDC_NCM = m
    CONFIG_USB_F_NCM = m
    CONFIG_USB_G_NCM = m

    内核启动后、

    # mount -t debugfs debugfs /mnt

    # echo "device">/mnt/488 <9或 d>0000/USB/MODE (分别用于 usb0或 USB1)

    # modprobe g_NCM

    您必须看到应该已经创建了 usb0接口(ifconfig -a)。

    更多信息、请参阅 PSDKLA 用户指南。

    此致

    Ravi

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

    您能否确认在最终的.config 中启用了 USB_CONFIGFS_NCM?

    此致、
    Vishal
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我启用了 USB_CONFIGFS_NCM。
    尽管我尚未测试实际通信、
    我能够使用默认小工具在函数下创建一个目录以进行测试、但现在也可以在 ifconfig 中看到 usb0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、我启用了 USB_CONFIGFS_NCM。
    尽管我尚未测试实际通信、
    我能够使用默认小工具在函数下创建一个目录以进行测试、但现在也可以在 ifconfig 中看到 usb0。

    我使用在启动时创建的默认小工具执行了测试、而不是使用我要创建的其他小工具执行了测试。

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

    您可以尝试以下步骤吗? 以检查您是否可以将 USB2.0端口用作器件。
    因此、我能够使用 USB2.0端口测试 NCM。 目前、我必须为此禁用 ADB (通过执行下面的 setprop 命令)

    setprop sys.usb.config none
    RM /config/usb_gadget/g1/configs/b.1/f1
    RM /config/usb_gadget/g1/configs/b.1/f2
    mkdir /config/usb_gadget/g1/functions/ncm.gs2
    LN -s /config/usb_gadget/g1/functions/ncm.gs2 /config/usb_gadget/g1/configs/b.1/f3
    回显"488d0000.usb">/config/usb_gadget/g1/UDC


    以上步骤是进行正确的内核配置和 DTS 更改的基础。


    默认情况下、init.usb.configfs.rc 和 init.jacinto6evm.usb.rc 文件中包含使用 CONFIGFS 为 ADB 配置 USB3.0端口的步骤。 这些可能会妨碍其他小工具端口。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另请注意、执行上述命令后、可以通过执行以下命令在 USB2.0端口上进行角色切换。

    echo "host">/d/488d0000.usb/mode
    echo 'device'>/d/488d0000.usb/mode
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、 Vishal。

    使用您的命令、我能够通过重新配置"G1"小工具、将 USB 2.0端口启用为具有 NCM 的 USB 设备。

    执行 IP 配置和简单的 ping 测试、似乎可以正常工作。

    现在添加附加小工具仍然是一个问题

    但是、我将首先执行测试、为小工具添加额外的接口、并使用您的权变措施。

    我们可能需要重新讨论添加附加小工具部件。

    此致、

    Alan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此限制是通过 Android 内核对 CONFIGFS 所做的更改来实现的。 当我们尝试了解如何解决问题时、该调试将需要一些时间。

    还有另一种解决方法、您可以在不禁用 ADB 的情况下使用多个小工具。 但是、通过此变通办法、您不会看到 ADB 连接的 Android UI 通知。

    在内核中进行以下更改,然后重新构建您的配置和 zImage 以反映所做的更改。 请注意、您还必须从内核中禁用 CONFIG_USB_CONFIGFS_F_AUDIO_SRC、以避免编译问题

    索引5cf6802,5cf6802.fc208aa
    --- a/drivers/USB/gadget/Kconfig
    ++ b/drivers/usb/gadget/kconfig
    @@@-413、14 -413、14 +413、6 @@@配置 USB_CONFIGFS_F_AUDIO_SR
    帮助
    USB 小工具音频源支持

    --config USB_CONFIGFS_UEVENT
    -- 布尔"小工具状态的 uevent 通知"
    -- 取决于 USB_CONFIGFS
    -- 帮助
    -- 启用小工具时向用户空间发送 uevent 通知
    -- 状态变化。 小工具可以位于以下任何一个中
    -- 三种状态:"已连接/已断开/已配置"
    --
    配置 USB_CONFIGFS_F_UAC1
    bool "音频类1.0"
    取决于 USB_CONFIGFS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Vishal、
    感谢有关其他解决方法的提示。
    如果我们需要重新讨论此问题或提出更好的解决方案、我将认为多个小工具问题现在已解决、并开始新的主题。

    我目前正在尝试向小工具添加自定义批量输入/输出接口。
    我认为这需要添加 ACM。
    有什么提示吗?

    此致、
    Alan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上、我使用的是看起来更合适的通用 USB 批量输入/输出。
    >> mkdir /config/usb_gadget/g1/functions/gser.gs0
    我能够使用/dev/ttyXXXX 验证主机和器件之间的简单通信
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 

    我确实看到了一个与 USB 角色开关相关的问题。

    即使在 TI J6端口更改为"设备"后、我们也需要为 VBUS 供电。

    我们如何做到这一点?

    谢谢、

    Alan

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

    我在下一页中找到了一个看起来像释放的修补程序的内容:
    processors.wiki.ti.com/.../Template:GLSDK_USB_DRD

    >使用 GPIO 驱动 VBUS
    >、以便在"主机"模式或"器件"模式之间的角色切换中将 drvbus 驱动为"始终开启"。 请从链接中参阅参考补丁>实施。
    >
    >此补丁基于3.14内核和 u-boot-2014.07。
    > u-boot-2014.07-drd-patches.tar -包含 u-boot 更改、这些更改使用 GPIO 为驱动 VBUS 配置引脚多路复用。

    这可以应用于 Android 内部版本6A.1.3吗? (omapedia.org/.../6AM.1.3_Release_Notes)

    此外、还需要有关如何正确应用和使用它的更多详细信息。

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

    该主题中的原始问题似乎已解决。
    您能否创建具有新问题的单独主题?

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

    是的、我为此创建了一个新的线程--> https://e2e.ti.com/support/arm/automotive_processors/f/1020/t/615520

    谢谢、

    Alan