针对itop-4412这个板子移植网卡驱动,本来以为非常简单的,结果费了老大的劲还不能成功,经过反复厂家提供的编辑过的内核,发现内核linux-4.14.2中drivers/char/目录下有个power_ctrl.c这样一个文件,这应该是这个网卡dm9625的电源驱动代码,如果不将这个编入内核,网卡灯死活不亮,而虽然内核中有这个文件,最关键的一点,是在Makefile中即没有将它加入进去,导致代码一样,运行起来却老是失败。而在内核linux-5.6.8中,没有这个power_ctrl.c文件。
下面是排查步聚:
1. 软件硬件环境
1.1 itop-4412开发板,实际arm内核为cortex-A9
这里需要认真看一家硬件手册,这个网卡芯片为DM-9621,也就是基于usb的网卡芯片,另外特别注意它的连接方式图,hub方式。
1.2 软件环境
内核我选择linux-5.6.8,同时下载linux-4.14.2
2. 内核中驱动配置
2.1 网卡驱动配置
Device Drivers
->Network device support
->USB Network Adapters
->Multi-purpose USB Networking Framework
->Davicom DM96xx based USB 10/100 ethernet devices
注意都选*号
2.2 USB驱动部分
Device Drivers
->USB Support
->EHCI HCD (USB 2.0) support
->Improved Transaction Translator scheduling
->EHCI support for Samsung S5P/Exynos SoC Series
3. 编译后运行
网卡灯不亮,但是串口输出可以看到如下字样:
[ 2.069416] usbcore: registered new interface driver dm9601
但是没有识别到usb-hub设备,说明这儿电源管理一定有问题,电路没有接通,对比厂家的输出,
发现有如下输出时灯才亮:
[ 3.213796] usb 1-3: New USB device found, idVendor=0424, idProduct=3503, bcdDevice=a1.a0
[ 3.220887] usb 1-3: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 3.234438] hub 1-3:1.0: USB hub found
[ 3.238661] hub 1-3:1.0: 3 ports detected
[ 3.561117] usb 1-3.2: new high-speed USB device number 3 using exynos-ehci
[ 3.712329] usb 1-3.2: config 1 interface 0 altsetting 0 endpoint 0x83 has an invalid bInterval 0, changing to 7
[ 3.801829] usb 1-3.2: New USB device found, idVendor=0a46, idProduct=9621, bcdDevice= 1.01
[ 3.808800] usb 1-3.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 3.827055] dm9601 1-3.2:1.0 eth0: register 'dm9601' at usb-12580000.ehci-3.2, Davicom DM96xx USB 10/100 Ethernet, 00:00:ff:ff:00:00
[ 4.180788] dm9601 1-3.2:1.0 eth0: link down
[ 6.755003] dm9601 1-3.2:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1
经过反复测试对比,发现在linux-4.14.2中目录drivers/char/下有这个文件:power_ctrl.c,这个应该就是usb-hub电路驱动,而在内核
linux-5.6.8中相应目录下是没有这个文件的。即使用在linux-4.14.2中有这个文件,为什么灯还是不亮呢?没有办法了,知道肯定问题就在这儿,逐渐排除对比后,发现在原生的内核中,虽然有这个文件,但是没有加入Makefile中。
即在drivers/char/Makefile中最后加一行:
obj-y += power_ctrl.o
我使用的是linux-5.6.8内核,将power_ctrl.c这个文件从linux-4.14.2中复制到drivers/char/下,再将
obj-y += power_ctrl.o
加入Makefile中,重新编译,这次可以看到灯亮了。
后记:这里要鄙视一下一些板子厂家,这种关键细节在文档中故意只字不提,埋了很多坑等着你去踩,浪费了很多的时间,为了让更多的
技术研习朋友少浪费时间,我把我的经历分享出来,希望对大家有帮助。