Armbian 使用 ADB 连接 MQ-Quad Shell
此贴使用的是芒果群里的@sputnik 大佬的Armbian
感谢 sputnik 的贡献让我们能用上MQ-Quad的Armbian
GitHub地址:https://github.com/open-cores/mangguo-h616-armbian
使用v22.08分支做的测试
修改内核配置以及设备树
# 修改 config/kernel/linux-sunxi-edge.config 文件
# 打开 functionfs 功能
CONFIG_USB_FUNCTIONFS=m
# 修改 path/kernel/archive/sunxi-5.19/xkernel-mangopimcore.patch 文件
# 关闭 ehci0 以及 ohci0 节点
+&ehci0 {
+ status = "disabled";
+};
+&ohci0 {
+ status = "disabled";
+};
# 修改 usbotg 节点的 dr_mode 为 peripheral 模式
+&usbotg {
+ dr_mode = "peripheral"; /* USB A type receptable */
+ status = "okay";
+};
修改完成后重新编译imag并写入到SD卡,这里不做讲解了。
编译并安装 adbd
# 在设备中执行以下指令
git clone https://github.com/Evlers/adbd
cd adbd
# 编译以及安装 adbd
make -j4
sudo make install
配置 USB Gadget 设备
让设备使用USB复合设备:libcomposite
# 让 libcomposite 模块开机自动装载
su root
echo "libcomposite" >> /etc/modules
进入sbin目录:cd /usr/local/sbin
制作Starting脚本用于开机自动运行
vi usb-gadget-start.sh
# 复制以下内容
#!/bin/bash
# 设置 adbd 参数(好像没什么卵用,先配置下吧)
DEVNAME="MQ-Quad"
DEVMODEL="Allwinner H616"
DEVPRODUCT="MangoPI MQ-Quad"
BANNER="MQ-Quad-Allwinner-H616"
# 创建 adbd 设备
mkdir /sys/kernel/config/usb_gadget/g1
echo "0x18D1" > /sys/kernel/config/usb_gadget/g1/idVendor
echo "0xD002" > /sys/kernel/config/usb_gadget/g1/idProduct
# 写入USB描述
# 注意:serialnumber长度必须是16个字符 否则绑定USB控制器时会出现Device or resource busy的问题
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
echo "Allwinner" > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer
echo "MangoPI-MQ-Quad" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
echo MangoPI--MQ-Quad > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
# 创建 ffs function 注册 functionfs 文件系统
mkdir /sys/kernel/config/usb_gadget/g1/functions/ffs.adb
ln -s /sys/kernel/config/usb_gadget/g1/functions/ffs.adb/ /sys/kernel/config/usb_gadget/g1/configs/c.1/ffs.adb
# 用户态挂在 adbd 的 functionfs 文件系统
mkdir /dev/usb-ffs
mkdir /dev/usb-ffs/adb
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb/
# 使用 bash 启动 adbd
/usr/bin/adbd -d -n "$DEVNAME" -m "$DEVMODEL" -p "$DEVPRODUCT" -b "$BANNER" -s /bin/bash
# 将 Gadget 绑定到USB控制器
echo `ls /sys/class/udc/` > /sys/kernel/config/usb_gadget/g1/UDC
制作Stopping脚本
vi usb-gadget-stop.sh
# 复制以下内容
#!/bin/bash
cd /sys/kernel/config/usb_gadget/g1
# disconnected
echo `` > /sys/kernel/config/usb_gadget/g1/UDC
# remove all links
find . -type l -exec rm -v {} \;
# rmdir configs/c.1/strings/0x409
find configs -name 'strings' -exec rmdir -v {}/0x409 \;
#rmdir configs/c.1
ls -d configs/* | xargs rmdir -v
#rmdir strings/0x409
ls -d strings/* | xargs rmdir -v
#rmdir functions/hid.usb0
ls -d functions/* | xargs rmdir -v
cd ..
rmdir -v g1
给脚本提供执行权限
chmod +x usb-gadget-start.sh
chmod +x usb-gadget-stop.sh
利用 Systemd 让 USB Gadget 以及 adbd 开机启动
vi /etc/systemd/system/usb-gadget.service
# 复制以下内容
[Unit]
Description=USB gadeget
After=sys-kernel-config.mount
Before=network-pre.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/usb-gadget-start.sh
ExecStop=/usr/local/sbin/usb-gadget-stop.sh
[Install]
WantedBy=multi-user.target
使能开机启动:sudo systemctl enable usb-gadget
重启设备:reboot
测试
在PC端执行如下测试
# 查看设备
adb devices
# 连接到设备Shell
adb shell
efdb1d4d-d692-4f4e-97ca-40e10ae062d9-image.png
03140ea8-acdf-4192-b88a-7958c60fe058-image.png