0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

USB Gadget 應(yīng)用實(shí)例ADB實(shí)現(xiàn)

麥辣雞腿堡 ? 來(lái)源:嵌入式Linux系統(tǒng)開(kāi)發(fā) ? 作者:嵌入式Linux系統(tǒng)開(kāi) ? 2023-07-13 10:56 ? 次閱讀

本文關(guān)注的不是 adb 本身的實(shí)現(xiàn),而是數(shù)據(jù)如何傳輸。

分析文件:adbd-masteradbusb_linux_client.cpp

4.1 初始化接口描述符

圖片

4.2 申請(qǐng)更多端點(diǎn)

在接口描述符里,定義了多個(gè)接口描述符,這是 APP 提出的請(qǐng)求。如果 Gadget 設(shè)備有足夠的端點(diǎn),那么就會(huì)在在 functionfs 跟目錄下創(chuàng)建出這些端點(diǎn),比如 ep1、ep2。

ADB 程序的調(diào)用關(guān)系如下:

init_functionfs

    // 設(shè)置功能描述符(接口描述符)
    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); // 打開(kāi)端點(diǎn) 0

 // 把接口描述符發(fā)給驅(qū)動(dòng)程序
 ret = adb_write(h- >control, &v2_descriptor, sizeof(v2_descriptor));

 // 發(fā)送字符串描述符, 這會(huì)觸發(fā)驅(qū)動(dòng)程序根據(jù)接口描述符創(chuàng)建更多的 endpoint
 ret = adb_write(h- >control, &strings, sizeof(strings));

上面的函數(shù)操作的都是 ep0,對(duì)應(yīng)的驅(qū)動(dòng)程序如下:

圖片

函數(shù) ffs_epfiles_create 會(huì)根據(jù)接口描述符申請(qǐng)更多的 endpoint,并且在 functionfs 里創(chuàng)建對(duì)應(yīng)的節(jié)點(diǎn):

圖片

5. 移植 ADB

5.1 交叉編譯 adb

如果不想自己編譯,可以使用 GIT 倉(cāng)庫(kù)里的可執(zhí)行程序:

圖片

以 IMX6ULL 為例,打開(kāi)《嵌入式 Linux 應(yīng)用開(kāi)發(fā)完全手冊(cè) V5_IMX6ULL_Pro開(kāi)發(fā)板.pdf》,找到《6.5 構(gòu)建 IMX6ULL Pro 版的根文件系統(tǒng)》章節(jié),執(zhí)行以下命令:

make clean
make 100ask_imx6ull_pro_ddr512m_systemV_qt5_defconfig
make menuconfig

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

圖片

然后執(zhí)行:

make android-tools-rebuild

期間會(huì)自動(dòng)下載源碼、編譯。

成功后,可在如下目錄查看到可執(zhí)行程序 adb、adbd:

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

把可執(zhí)行程序放到開(kāi)發(fā)板的 /usr/bin 目錄。

5.2 腳本

IMX6ULL 上使用的簡(jiǎn)化腳本:

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/ 目錄下創(chuàng)建一個(gè) S99adbd 文件,就可以自動(dòng)使能 ADB 功能。這個(gè)文件在 GIT 倉(cāng)庫(kù)里:

圖片

來(lái)自 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 $?
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5045

    文章

    18817

    瀏覽量

    298499
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7772

    瀏覽量

    262374
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207908
  • adb
    adb
    +關(guān)注

    關(guān)注

    1

    文章

    35

    瀏覽量

    10393
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何配置USB OTG為Gadget serial device?

    現(xiàn)需要將OKA40i-C板子上的OTG下載口配置為虛擬串口,實(shí)現(xiàn)u***串行通信,利用linux已存在的u***轉(zhuǎn)虛擬串口驅(qū)動(dòng):USB Gadget Drivers (Serial Gadge
    發(fā)表于 01-04 06:47

    分享一種將RK3399配置成USB gadget設(shè)備的方法

    一個(gè)USB gadget設(shè)備(比如配置成一個(gè)hid 鍵盤),就得在type-c上實(shí)現(xiàn),實(shí)際中這個(gè)功能有廣泛的應(yīng)用,比如pc主機(jī)和RK3399進(jìn)行數(shù)據(jù)通信,用此就是一種很好的方式,RK3399的
    發(fā)表于 05-24 10:35

    基于Linux內(nèi)核的Rockchip USB Gadget UAC開(kāi)發(fā)資料分享

    1、Rockchip USB Gadget UAC開(kāi)發(fā)步驟本文檔提供 Rockchip 平臺(tái)基于 Linux 內(nèi)核的 USB Gadget UAC(
    發(fā)表于 08-10 16:03

    RK3288使用USB GADGET實(shí)現(xiàn)大容量存儲(chǔ)腳本

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

    求助,關(guān)于USB gadget安裝虛擬網(wǎng)口問(wèn)題求解

    1.make linux-menuconfig USB support ----> <*>USB Gadget Support ---->
    發(fā)表于 09-01 06:14

    在全志R128上啟用USB ADB以及無(wú)線ADB配置方法

    幾個(gè)驅(qū)動(dòng)的勾選 usb device驅(qū)動(dòng) adb gadget驅(qū)動(dòng) adbd應(yīng)用 運(yùn)行menuconfig,選擇對(duì)應(yīng)的驅(qū)動(dòng)以及軟件包: mrtos_menuconfig 配置好的圖片如下圖所示
    發(fā)表于 10-17 17:16

    【全志R128開(kāi)發(fā)經(jīng)驗(yàn)分享】啟用USB ADB以及無(wú)線ADB配置方法

    幾個(gè)驅(qū)動(dòng)的勾選 usb device驅(qū)動(dòng) adb gadget驅(qū)動(dòng) adbd應(yīng)用 運(yùn)行menuconfig,選擇對(duì)應(yīng)的驅(qū)動(dòng)以及軟件包: mrtos_menuconfig 配置好的圖片如下圖所示
    發(fā)表于 10-24 17:29

    S5P4418開(kāi)發(fā)板USB驅(qū)動(dòng)與ADB工具

    S5P4418開(kāi)發(fā)板USB驅(qū)動(dòng)與ADB工具
    發(fā)表于 06-21 17:02 ?21次下載

    adb的使用方法

    ,說(shuō)白了就是debug工具。 adb是一個(gè)客戶端-服務(wù)器端程序,其中客戶端是你用來(lái)操作的電腦,服務(wù)器端是android設(shè)備。 下面詳細(xì)介紹下adb的使用方法 在您的設(shè)備上啟用adb調(diào)試 要在通過(guò)
    發(fā)表于 11-15 10:22 ?1.6w次閱讀

    工具SemExpr可實(shí)現(xiàn)gadget搜索與語(yǔ)義分析

    分析內(nèi)容的基礎(chǔ)上,總結(jié) gadget語(yǔ)義分析應(yīng)包含的要素,提出一種基于表達(dá)式樹(shù)的 gadget語(yǔ)義分析方法。通過(guò)表達(dá)式樹(shù)變體描述寄存器和內(nèi)存讀寫的表達(dá)式信息,提高 gadget語(yǔ)義分析的效率。
    發(fā)表于 03-12 14:52 ?20次下載
    工具SemExpr可<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>gadget</b>搜索與語(yǔ)義分析

    [嵌入式linux]將linux板卡虛擬為USB網(wǎng)卡設(shè)備(Ethernet Gadget

    kernel menuconfig-> Device Drivers ->USB support -> USB Gadget Support 建議最好選成M,作為內(nèi)核驅(qū)動(dòng)模塊,便于
    發(fā)表于 11-02 11:36 ?12次下載
    [嵌入式linux]將linux板卡虛擬為<b class='flag-5'>USB</b>網(wǎng)卡設(shè)備(Ethernet <b class='flag-5'>Gadget</b>)

    AMD Xilinx Linux 2022.1 USB Gadget使用

    有客戶使用Linux中的USB Gadget功能,把MPSoC器件做USB從設(shè)備
    的頭像 發(fā)表于 07-07 14:15 ?632次閱讀

    USB Gadget serial應(yīng)用實(shí)例(上)

    1. 硬件體驗(yàn) 使用 Linux 自帶的 USB Gadget 驅(qū)動(dòng) /drivers/usb/gadget/legacy/serial.c 使用
    的頭像 發(fā)表于 07-13 11:06 ?2278次閱讀
    <b class='flag-5'>USB</b> <b class='flag-5'>Gadget</b> serial應(yīng)用<b class='flag-5'>實(shí)例</b>(上)

    USB Gadget zero應(yīng)用實(shí)例程序

    1. 編寫程序 1.1 編程思路 涉及的程序如下圖所示: PC 端基于 libusb 編寫應(yīng)用程序,開(kāi)發(fā)板端直接使用 Linux 自帶的 USB Gadget 驅(qū)動(dòng) zero.c【/drivers
    的頭像 發(fā)表于 07-13 11:14 ?870次閱讀
    <b class='flag-5'>USB</b> <b class='flag-5'>Gadget</b> zero應(yīng)用<b class='flag-5'>實(shí)例</b>程序

    從硬件軟件角度理解Gadget框架

    2. 從硬件軟件角度理解 Gadget 框架 USB 傳輸?shù)暮诵氖?endpoint,使用 endpoint 可以收發(fā)數(shù)據(jù)。在 endpoint 之上,就可以模擬 USB 串口、USB
    的頭像 發(fā)表于 07-13 11:32 ?821次閱讀
    從硬件軟件角度理解<b class='flag-5'>Gadget</b>框架