0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

USB Gadget 应用实例ADB实现

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-13 10:56 次阅读

本文关注的不是 adb 本身的实现,而是数据如何传输。

分析文件:adbd-masteradbusb_linux_client.cpp

4.1 初始化接口描述符

图片

4.2 申请更多端点

在接口描述符里,定义了多个接口描述符,这是 APP 提出的请求。如果 Gadget 设备有足够的端点,那么就会在在 functionfs 跟目录下创建出这些端点,比如 ep1、ep2。

ADB 程序的调用关系如下:

init_functionfs

    // 设置功能描述符(接口描述符)
    v2_descriptor.fs_count = 3;
    v2_descriptor.hs_count = 3;
    v2_descriptor.ss_count = 5;
    v2_descriptor.os_count = 1;
    v2_descriptor.fs_descs = fs_descriptors;
    v2_descriptor.hs_descs = hs_descriptors;
    v2_descriptor.ss_descs = ss_descriptors;
    v2_descriptor.os_header = os_desc_header;
    v2_descriptor.os_desc = os_desc_compat;

 h- >control = adb_open(USB_FFS_ADB_EP0, O_RDWR); // 打开端点 0

 // 把接口描述符发给驱动程序
 ret = adb_write(h- >control, &v2_descriptor, sizeof(v2_descriptor));

 // 发送字符串描述符, 这会触发驱动程序根据接口描述符创建更多的 endpoint
 ret = adb_write(h- >control, &strings, sizeof(strings));

上面的函数操作的都是 ep0,对应的驱动程序如下:

图片

函数 ffs_epfiles_create 会根据接口描述符申请更多的 endpoint,并且在 functionfs 里创建对应的节点:

图片

5. 移植 ADB

5.1 交叉编译 adb

如果不想自己编译,可以使用 GIT 仓库里的可执行程序:

图片

以 IMX6ULL 为例,打开《嵌入式 Linux 应用开发完全手册 V5_IMX6ULL_Pro开发板.pdf》,找到《6.5 构建 IMX6ULL Pro 版的根文件系统》章节,执行以下命令:

make clean
make 100ask_imx6ull_pro_ddr512m_systemV_qt5_defconfig
make menuconfig

配置 ADB:-> Target packages -> System tools

图片

然后执行:

make android-tools-rebuild

期间会自动下载源码、编译。

成功后,可在如下目录查看到可执行程序 adb、adbd:

/home/book/100ask_imx6ull-sdk/Buildroot_2020.02.x/output/target/usr/bin

把可执行程序放到开发板的 /usr/bin 目录。

5.2 脚本

IMX6ULL 上使用的简化脚本:

modprobe libcomposite
mount -t configfs none /sys/kernel/config
mkdir -p /dev/usb-ffs/adb
mkdir -p /sys/kernel/config/usb_gadget/g1 
mkdir  -p /sys/kernel/config/usb_gadget/g1/functions/ffs.adb
mkdir  -p /sys/kernel/config/usb_gadget/g1/configs/b.1
ln -s  /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1
mount -t functionfs adb /dev/usb-ffs/adb
start-stop-daemon --start --oknodo --pidfile /var/run/adbd.pid --startas /usr/bin/adbd --background
sleep 1
echo ci_hdrc.0 > /sys/kernel/config/usb_gadget/g1/UDC

可以在 /etc/init.d/ 目录下创建一个 S99adbd 文件,就可以自动使能 ADB 功能。这个文件在 GIT 仓库里:

图片

来自 STM32MP157 的供参考的脚本:

#!/bin/bash -e
### BEGIN INIT INFO
# Provides:          adbd
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:       Linux ADB
### END INIT INFO

VENDOR_ID="0x1d6b"
PRODUCT_ID="0x0104"
UDC=`ls /sys/class/udc/ | awk '{print $1}'`

start() {
        mkdir -p /dev/usb-ffs/adb -m 0770

        mkdir -p /sys/kernel/config/usb_gadget/g1  -m 0770

        echo ${VENDOR_ID} > /sys/kernel/config/usb_gadget/g1//idVendor
        echo ${PRODUCT_ID} > /sys/kernel/config/usb_gadget/g1//idProduct

        mkdir  -p /sys/kernel/config/usb_gadget/g1/strings/0x409   -m 0770

        echo "0123456789ABCDEF" > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
        echo "STMicroelectronics"  > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer
        echo "STM32MP1"  > /sys/kernel/config/usb_gadget/g1/strings/0x409/product

        mkdir  -p /sys/kernel/config/usb_gadget/g1/functions/ffs.adb
        mkdir  -p /sys/kernel/config/usb_gadget/g1/configs/b.1  -m 0770
        mkdir  -p /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409  -m 0770

        ln -s  /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1
        echo "adb" > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
        mount -t functionfs adb /dev/usb-ffs/adb

        start-stop-daemon --start --oknodo --pidfile /var/run/adbd.pid --startas /bin/adbd --background

        sleep 1

        echo $UDC > /sys/kernel/config/usb_gadget/g1/UDC
}

stop() {
        start-stop-daemon --stop --oknodo --pidfile /var/run/adbd.pid --retry 5
        umount /dev/usb-ffs/adb
}

restart() {
        echo $UDC > /sys/kernel/config/usb_gadget/g1/UDC
}

if [  "$UDC" != "" ]; then
        case $1 in
                start|stop|restart) "$1" ;;
        esac
fi

exit $?
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4982

    文章

    18281

    浏览量

    288464
  • usb
    usb
    +关注

    关注

    59

    文章

    7432

    浏览量

    258173
  • Linux
    +关注

    关注

    87

    文章

    10991

    浏览量

    206736
  • adb
    adb
    +关注

    关注

    1

    文章

    33

    浏览量

    10342
收藏 人收藏

    评论

    相关推荐

    如何配置USB OTG为Gadget serial device?

    现需要将OKA40i-C板子上的OTG下载口配置为虚拟串口,实现u***串行通信,利用linux已存在的u***转虚拟串口驱动:USB Gadget Drivers (Serial Gadge
    发表于 01-04 06:47

    分享一种将RK3399配置成USB gadget设备的方法

    一个USB gadget设备(比如配置成一个hid 键盘),就得在type-c上实现,实际中这个功能有广泛的应用,比如pc主机和RK3399进行数据通信,用此就是一种很好的方式,RK3399的
    发表于 05-24 10:35

    基于Linux内核的Rockchip USB Gadget UAC开发资料分享

    1、Rockchip USB Gadget UAC开发步骤本文档提供 Rockchip 平台基于 Linux 内核的 USB Gadget UAC(
    发表于 08-10 16:03

    RK3288使用USB GADGET实现大容量存储脚本

    /mass_storage.0fiif [ $ADB_EN = on ];thenmkdir /sys/kernel/config/usb_gadget/rockchip
    发表于 11-18 16:33

    关于NUC980 gadget实现Ethernet + ACM问题

    NUC980 gadget 实现Ethernet + ACM 问题 生成 CDC Composite Device (Ethernet and ACM) 图像后下载运行, Win10 上没有反应
    发表于 09-01 07:59

    求助,关于USB gadget安装虚拟网口问题求解

    1.make linux-menuconfig USB support ----> <*>USB Gadget Support ---->
    发表于 09-01 06:14

    在全志R128上启用USB ADB以及无线ADB配置方法

    几个驱动的勾选 usb device驱动 adb gadget驱动 adbd应用 运行menuconfig,选择对应的驱动以及软件包: mrtos_menuconfig 配置好的图片如下图所示
    发表于 10-17 17:16

    【全志R128开发经验分享】启用USB ADB以及无线ADB配置方法

    几个驱动的勾选 usb device驱动 adb gadget驱动 adbd应用 运行menuconfig,选择对应的驱动以及软件包: mrtos_menuconfig 配置好的图片如下图所示
    发表于 10-24 17:29

    S5P4418开发板USB驱动与ADB工具

    S5P4418开发板USB驱动与ADB工具
    发表于 06-21 17:02 21次下载

    工具SemExpr可实现gadget搜索与语义分析

    分析内容的基础上,总结 gadget语义分析应包含的要素,提出一种基于表达式树的 gadget语义分析方法。通过表达式树变体描述寄存器和内存读写的表达式信息,提高 gadget语义分析的效率。
    发表于 03-12 14:52 20次下载
    工具SemExpr可<b class='flag-5'>实现</b><b class='flag-5'>gadget</b>搜索与语义分析

    [嵌入式linux]将linux板卡虚拟为USB网卡设备(Ethernet Gadget

    kernel menuconfig-> Device Drivers ->USB support -> USB Gadget Support 建议最好选成M,作为内核驱动模块,便于
    发表于 11-02 11:36 11次下载
    [嵌入式linux]将linux板卡虚拟为<b class='flag-5'>USB</b>网卡设备(Ethernet <b class='flag-5'>Gadget</b>)

    AMD Xilinx Linux 2022.1 USB Gadget使用

    有客户使用Linux中的USB Gadget功能,把MPSoC器件做USB从设备
    的头像 发表于 07-07 14:15 473次阅读

    USB Gadget serial应用实例(上)

    1. 硬件体验 使用 Linux 自带的 USB Gadget 驱动 /drivers/usb/gadget/legacy/serial.c 使用
    的头像 发表于 07-13 11:06 1251次阅读
    <b class='flag-5'>USB</b> <b class='flag-5'>Gadget</b> serial应用<b class='flag-5'>实例</b>(上)

    USB Gadget zero应用实例程序

    1. 编写程序 1.1 编程思路 涉及的程序如下图所示: PC 端基于 libusb 编写应用程序,开发板端直接使用 Linux 自带的 USB Gadget 驱动 zero.c【/drivers
    的头像 发表于 07-13 11:14 628次阅读
    <b class='flag-5'>USB</b> <b class='flag-5'>Gadget</b> zero应用<b class='flag-5'>实例</b>程序

    从硬件软件角度理解Gadget框架

    2. 从硬件软件角度理解 Gadget 框架 USB 传输的核心是 endpoint,使用 endpoint 可以收发数据。在 endpoint 之上,就可以模拟 USB 串口、USB
    的头像 发表于 07-13 11:32 604次阅读
    从硬件软件角度理解<b class='flag-5'>Gadget</b>框架