SSU_ADB使用说明


1. 交叉编译

adb工具编译时依赖于openssl、zlib,编译adb工具之前得先交叉编译openssl和zlib。

1.1. openssl交叉编译

1.1.1. 源码下载

openssl下载地址

版本:openssl-1.1.1a


1.1.2. 编译

资源包下载完成后,解压进入opensl-1.1.1a目录,执行Configure配置文件配置编译工具链和指定相应的安装路径,如下:

./Configure linux-generic32 no-asm shared --prefix=/home/xxxx/adbd/openssl CROSS_COMPILE=/tools/toolchain/gcc-6.4.0-20220722-sigmastar-glibc-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- CC=gcc

make clean;make;

make install;

编译安装完成后会在prefix配置的目录下release相关的头文件和库文件等文件。


1.2. zlib交叉编译

1.2.1. 源码下载

zlib下载地址

版本:1.2.11


1.2.2. 编译

资源包下载完成后,解压进入zlib-1.2.11目录,执行configure文件配置安装目录,如下:

./configure --prefix=/home/xxxx/adbd/zlib

修改Makefile编译脚本

CC=arm-linux-gnueabihf-gcc

LDSHARED=arm-linux-gnueabihf-gcc

CPP=arm-linux-gnueabihf-E

AR=arm-linux-gnueabihf-ar

make clean;make;

make install;

编译安装完成后会在prefix配置的目录下release相关的头文件和库文件。


1.3. adb交叉编译

1.3.1. 源码下载

git clone https://github.com/yoannsculo/adbd.git


1.3.2. 编译

下载完成后进入到adbd目录下,修改目录下的Makefile脚本,修改编译工具链和配置需要依赖的openssl和zlib的头文件和库文件,修改内容如下:

CC:=arm-linux-gnueabihf-gcc

CPPFLAGS+= -I/home/xxxx/adbd/openssl/include

CPPFLAGS+= -I/home/xxxx/adbd/zlib/include

LDFLAGS+= -L/home/xxxx/adbd/openssl/lib

LDFLAGS+= -L/home/xxxx/adbd/zlib/lib

make clean;make;

然后会在该目录下生成adbd device端应用程序adbd。


2. 环境搭建

2.1. kernel配置

ADB的实现依赖于functionfs框架,所以打开相关的配置,编译完成后会生成相应的ko,打开配置如下:


2.2. project修改

把交叉编译生成的bin打包进设备,把相应的bin放到project里的相应的release目录下;

config配置完成之后需要在应用层增加一个执行脚本才能使能Function filesystem,脚本内容如下:

#!/bin/sh
USB_DEVICE_DIR=/sys/kernel/config/usb_gadget/s-star/
USB_CONFIGS_DIR=/sys/kernel/config/usb_gadget/s-star/configs/default.1
USB_FUNCTIONS_DIR=/sys/kernel/config/usb_gadget/s-star/functions

config_adb()
{
    #no attributes, all parameters are set through FunctioFS
    mkdir ${USB_FUNCTIONS_DIR}/ffs.adb
    ln -s ${USB_FUNCTIONS_DIR}/ffs.adb ${USB_CONFIGS_DIR}/ffs.adb
}

# main
if [ -d /sys/kernel/config/usb_gadget ]
then
    umount /sys/kernel/config
fi

mount -t configfs none /sys/kernel/config
mkdir $USB_DEVICE_DIR
mkdir $USB_CONFIGS_DIR
mkdir ${USB_DEVICE_DIR}/strings/0x409
mkdir ${USB_CONFIGS_DIR}/strings/0x409

# 配置configs
# MaxPower/bmAttributes
echo 0x02 > ${USB_CONFIGS_DIR}/MaxPower
echo 0xC0 > ${USB_CONFIGS_DIR}/bmAttributes

# 配置strings
# manufacturer/product/serialnumber/configuration
echo "Linux Foundation" > ${USB_DEVICE_DIR}/strings/0x409/manufacturer
echo "ADB gadget" > ${USB_DEVICE_DIR}/strings/0x409/product
echo "0123" > ${USB_DEVICE_DIR}/strings/0x409/serialnumber
echo "ADB" > ${USB_CONFIGS_DIR}/strings/0x409/configuration

# 配置function
config_adb

# 挂载并运行adbd应用
mkdir -p /dev/usb-ffs/adb
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb
/customer/adbd &
sleep 2

# 配置device
# UDC/bDeviceClass/bDeviceProtocol/bDeviceSubClass/bMaxPacketSize0/bcdDevice/bcdUSB/idProduct/idVendor
echo 0xef > ${USB_DEVICE_DIR}/bDeviceClass
echo 0x01 > ${USB_DEVICE_DIR}/bDeviceProtocol
echo 0x02 > ${USB_DEVICE_DIR}/bDeviceSubClass
echo 0x00 > ${USB_DEVICE_DIR}/bMaxPacketSize0
echo 0x0419 > ${USB_DEVICE_DIR}/bcdDevice
echo 0x0200 > ${USB_DEVICE_DIR}/bcdUSB
echo 0x0102 > ${USB_DEVICE_DIR}/idProduct
echo 0x1d6b > ${USB_DEVICE_DIR}/idVendor
UDC=`ls /sys/class/udc/ | awk '{print $1}'`
echo $UDC > ${USB_DEVICE_DIR}/UDC

2.3. patch修改参考

具体的kernel配置修改和project bin打包流程修改参考以下patch:

adb_patch.rar


3. 测试

Windows host端工具:

platform-tools_r33.0.1-windows.zip

pc上环境安装完成之后,通过usb线将设备与pc端连接起来;通过以下的常用命令可以进行测试:

adb devices  --> 枚举adb设备
adb shell   --> 连接adb设备的shell
adb push/pull  -->  与adb设备进行文件传输

4. 常见Q&A

Q1:adb (1.0.31 adb client)连接不上设备,要怎么解决?

PC端adb host扫描设备和连接设备时会先获取USB设备VID值,然后与已向usb if申请VID的公司或读取/user/xx/.android/adb_usb.Ini下的VID做匹配,匹配到VID, interfaceClass, interfaceSubClass, interfaceProtocol正确时,说明外接USB设备为ADB gadget,这时候才能正常连接上。

修改方法:若VID没有在已经申请的数组里,可以在个人PC电脑下创建/user/xx/.android/adb_usb.Ini文件并添加相应的VID;设备VID的查询方法在设备管理器中硬件ID中查看;

Q2:板端ADB在Windows 10上正常,但在Windows 7系统下无法识别设备该怎么处理?

这种情况一般是驱动安装的问题,可以使用这个驱动安装工具ADBDriverInstaller.zip 。在板端USB插入PC后,使用该工具查找到直接安装即可。