问题描述:
A113D 默认编译之后可以通过 adb 命令连到板子上,经过裁剪或者一些操作,现在测试,板子不能ADB
排除硬件问题、环境问题
找了FAE给了固件,测试可以adb 连接,证明硬件没有问题
查看了PC设备管理器,也可以发现设备
Android Phone
Android Composite ADB Interface
Android Composite ADB Interface
软件分析过程:
以下均为正常打印结果
1.查看usb部分
dmesg | grep tail -n 10 插拔usb观察有没有打印,usb驱动是否工作正常?
下面是正常打印
[ 20.689913] using random self ethernet address
[ 20.689954] using random host ethernet address
[ 20.699729] cpufreq_interactive: cpufreq_hmp_boost_start()
[ 20.699770] cpufreq_interactive: no need to active hmp boost!
[ 20.705872] file system registered
[ 20.719905] assign_ffs_buffer FFS_BUFFER_MAX=100!!!
[ 20.825327] read descriptors
[ 20.825375] read strings
[ 20.998287] audio locker is not init
[ 25.752844] usb0: HOST MAC 62:10:b2:bc:6d:b3
[ 25.753784] usb0: MAC 66:a8:f5:34:0d:72
[ 25.770114] IPv6: ADDRCONF(NETDEV_UP): usb0: link is not ready
[ 26.083270] usb 1-1: new full-speed USB device number 2 using xhci-hcd
[ 36.271051] xhci-hcd xhci-hcd.0.auto: xHCI host not responding to stop endpoint command.
[ 36.273777] xhci-hcd xhci-hcd.0.auto: Assuming host is dying, halting host.
[ 36.305368] xhci-hcd xhci-hcd.0.auto: HC died; cleaning up
[ 36.307238] usb usb1-port1: couldn't allocate usb_device
# [ 172.196793@0] USB RESET
[ 172.239464@0] android_work: sent uevent USB_STATE=CONNECTED
[ 172.242781@0] USB RESET
[ 172.313024@0] configfs-gadget gadget: high-speed config #1: amlogic
[ 172.315321@0] IPv6: ADDRCONF(NETDEV_CHANGE): usb0: link becomes ready
[ 172.327234@0] android_work: sent uevent USB_STATE=CONFIGURED
[ 173.681095@1] adbd (2115): /proc/2115/oom_adj is deprecated, please use /proc/2115/oom_score_adj instead.
如何查看是否已经加载usb驱动?
正常如果有usb驱动 /cat/devices会看到。
如果驱动是-y编译,是不会有usb*.ko会出现的,直接编译到内核
# cat /proc/devices
Character devices:
1 mem
511 ubi1
2 pty
257 dsp
3 ttyp
4 /dev/vc/0
4 tty
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
264 amvideo
10 misc
13 input
269 vfm
270 ionvideo
271 vad
272 videosync
29 fb
81 video4linux
89 i2c
90 mtd
108 ppp
116 alsa
128 ptm
136 pts
153 spi
166 ttyACM
180 usb
188 ttyUSB
2、usb驱动
分析usbgadget 编译以及加载逻辑
在嵌入式设备中,一般采用Gadget驱动,下面看一下,在A113D上是如何应用的
kernel 配置文件:
/home/xingzhibo/openlinux-A113/kernel/aml-4.9/arch/arm64/configs/meson64_smarthome_defconfig
CONFIG_AMLOGIC_USB=y
CONFIG_AMLOGIC_USB_DWC_OTG_HCD=y
CONFIG_AMLOGIC_USB_HOST_ELECT_TEST=y
CONFIG_AMLOGIC_USBPHY=y
CONFIG_AMLOGIC_USB2PHY=y
CONFIG_AMLOGIC_USB3PHY=y
通过查看kernel/aml-4.9/drivers 目录下的Makefile 发现,Amlogic用了自己新建文件夹下的驱动
obj-$(CONFIG_USB_PHY) += usb/
obj-$(CONFIG_USB) += usb/
obj-$(CONFIG_USB_SUPPORT) += usb/
obj-$(CONFIG_PCI) += usb/
obj-$(CONFIG_USB_GADGET) += usb/
obj-$(CONFIG_OF) += usb/
切换到drivers/amlogic 目录下查看驱动
buildroot是把编译的文件拷贝到 out/mexon&**/build/linux 下编译的
一般以为在kernel/arch/arm64/config/meson** 内核配置文件经过编译后再output/linux 下就会生成配置,最终经过 在源码目录和生成编译的目录对比,发现.config文件完全不一样,尤其现在出问题的usb问题
# 源码目录
#
# USB Support
#
CONFIG_AMLOGIC_USB=y
CONFIG_AMLOGIC_USB_DWC_OTG_HCD=y
CONFIG_AMLOGIC_USB_HOST_ELECT_TEST=y
# CONFIG_AMLOGIC_USBPHY is not set
# 编译生成目录
#
# USB Support
#
CONFIG_AMLOGIC_USB_HOST_ELECT_TEST=y
所以usb是没有编译进去的,从这个地方作为切入点
其实之前我是在对应的驱动中打印,发现驱动没有打印,应该是压根没有加载
问题重新梳理
接着又研究了一下,为什么驱动没有加载的问题。都知道,一般对内核镜像进行Make menuconfig ,可以在内核本地目录生成.config配置文件,根据这个配置文件条件编译
Make menuconfig 执行时,默认usb部分驱动总是默认没选上,Kconfig 默认 default 不是yes.另外它有几个依赖项.在用buildroot进行编译时,配置项都在上面提到的 配置文件 meson64_smarthome_defconfig 中
| | [ ] Amlogic Peripheral drivers (NEW)
| | Bus devices ----
从下图可以看出,Amlogic Peripheral
| CONFIG_AMLOGIC_DRIVER: |
| |
| this option is provided for control amlogic |
| drivers, if you want to use amlogic driver |
| please open it |
| |
| Symbol: AMLOGIC_DRIVER [=n] |
| Type : boolean |
| Prompt: Amlogic Peripheral drivers |
| Location: |
| -> Device Drivers |
| Defined at drivers/amlogic/Kconfig:4
问题点:
最终发现
< > Amlogic USB controller support (NEW)
他有很多依赖项
| CONFIG_AMLOGIC_USB: |
| |
| DWC_OTG |
| USB |
| host |
| controller. |
| |
| Symbol: AMLOGIC_USB [=n] |
| Type : tristate |
| Prompt: Amlogic USB controller support |
| Location: |
| -> Device Drivers |
| -> Amlogic Device Drivers |
| -> USB Support |
| Defined at drivers/amlogic/usb/Kconfig:4 |
| Depends on: AMLOGIC_DRIVER [=y] && AMLOGIC_USB_HOST_ELECT_TEST [=y] && USB [=y] |
| Selects: OF_LM
看到Depends on USB
所以在meson64_smarthome_defconfig 中应该有配置项CONFIG_USB才行
最终发现默认是没有的,解释了为什么编译总是没有加载进内涵的,默认虽然有配置,但是“顶层"配置文件都有问题
最终修改如下,重新编译以后usb插拔有响应,usb驱动已经加载工作。adb也可以使用
xingzhibo@ws13:~/openlinux-A113$ git show c83d3f1ced1541fdb0c296a22246d7021028d654
commit c83d3f1ced1541fdb0c296a22246d7021028d654
Author: xingzhibo <xingzb@seirobotics.net>
Date: Fri Jan 15 19:31:23 2021 +0800
[kernel] fix the problem can not use adb
diff --git a/kernel/aml-4.9/arch/arm64/configs/meson64_smarthome_defconfig b/kernel/aml-4.9/arch/arm64/configs/meson64_smarthome_defconfig
index adfdf0d..ed8bbbe 100755
--- a/kernel/aml-4.9/arch/arm64/configs/meson64_smarthome_defconfig
+++ b/kernel/aml-4.9/arch/arm64/configs/meson64_smarthome_defconfig
@@ -305,7 +305,7 @@ CONFIG_AMLOGIC_WDT=y
CONFIG_AMLOGIC_WDT_MESON=y
CONFIG_AMLOGIC_WIFI=y
CONFIG_AMLOGIC_BT_DEVICE=y
-CONFIG_AMLOGIC_PCIE=y
+#CONFIG_AMLOGIC_PCIE=y
CONFIG_AMLOGIC_IRBLASTER=y
CONFIG_AMLOGIC_IIO=y
CONFIG_AMLOGIC_SARADC=y
@@ -370,6 +370,7 @@ CONFIG_REALTEK_PHY=y
#CONFIG_PPPOLAC=y
#CONFIG_PPPOPNS=y
#CONFIG_PPP_ASYNC=y
+CONFIG_USB=y
CONFIG_USB_USBNET=y
CONFIG_ATH10K=m
CONFIG_ATH10K_PCI=m
xingzhibo@ws13:~/openlinux-A113$