【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
关于v3s网卡驱动,之前我们已经实现了。而且,它还是我们移植的第一个v3s驱动,之前的内容地址在这个地方,
https://blog.csdn.net/feixiaoxing/article/details/130937022?spm=1001.2014.3001.5501
只不过后来在移植其他驱动代码的时候,我们发现有必要通过升级kernel,来解决新的问题。因此,整个kernel的版本也在不断升高,从最初的4.10.y,到4.14.y,一直到现在的5.2.y。当时为了验证新功能,或者说是赶进度,就没有回头去看,当然也没有确认之前已经ok的功能是不是在新版本的kernel上面也是ok的。所以这部分一直等到现在才做。没想到其他驱动移植都还好,就是这个网络驱动成了我们的一个拦路虎。好在最后花了点时间,还是解决了。今天正好周末,花点时间记录一下整个的处理过程。
1、先直接套用4.14.y的修改模式
因为之前网卡驱动在4.14.y成功运行的,所以当时最直接的想法就是修改设备树。我们找到对应的设备树文件,即arch/arm/boot/dts/sun8i-v3s-licheepi-zero-with-lcd.dtsi文件,准备如法炮制一下,
首先添加emac节点,
aliases {
ethernet0 = &emac;
};
接着设置emac的属性,
&emac {
status = "okay";
};
本以为这么做,网卡驱动就ok了。当时4.14.y版本的kernel确实是这么修改的,但是现实还是给我们上了一课,驱动失败。这一点我们也想到了,估计不会太顺利。无疑,还有其他地方需要修改。网卡测试的方法也很简单,就是看看eth0能不能加上去,
# ifconfig eth0 up
ifconfig: SIOCGIFFLAGS: No such device
2、优化emac的属性设置
因为4.14.y的设备树过于简单,所以需要看一下5.2.y中的arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dts中,关于emac的部分究竟有什么变化没有,没想到还是有一点改动的,
&emac {
phy-handle = <&int_mii_phy>;
phy-mode = "mii";
allwinner,leds-active-low;
status = "okay";
};
从内容上看,多了一些属性设置,比如phy-handle、phy-mode、leds-active等等。其他地方都是一样的。看到这个差异之后,毫不犹豫把emac的属性更新到5.2.y的sun8i-v3s-licheepi-zero-with-lcd.dtsi文件中,估计这次应该没问题了。
编译、上传、烧入一顿操作后,还是不行,看来问题还是没有得到解决。
3、考虑从代码处着手
既然设备树方面,sun8i-v3s-licheepi-zero-dock.dts和sun8i-v3s-licheepi-zero-with-lcd.dtsi的文件都差不多了,那么语法树这边其实问题不大了。下面如果需要继续解决问题的话,应该从代码这个角度来尝试去分析和修改了。当然,首先要保证的,就是相关的驱动代码已经编译到zImage当中去了,这是最基本的要求。带着这个思路,我们观察发现,目前来说,很多驱动都改成了ko动态加载的形式,
feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/linux-zero-5.2.y$ find . -name "*.ko"
./drivers/video/backlight/lcd.ko
./drivers/input/mousedev.ko
./drivers/net/mii.ko
./drivers/net/ethernet/davicom/dm9000.ko
./drivers/net/ethernet/allwinner/sun4i-emac.ko
./drivers/net/phy/fixed_phy.ko
./drivers/net/phy/libphy.ko
./drivers/net/phy/mdio-sun4i.ko
./drivers/staging/rtl8723bs/r8723bs.ko
./drivers/of/of_mdio.ko
./drivers/usb/class/cdc-wdm.ko
./drivers/usb/serial/usbserial.ko
./drivers/usb/serial/cp210x.ko
./drivers/usb/serial/usb-serial-simple.ko
./drivers/usb/common/usb-otg-fsm.ko
./lib/crypto/libarc4.ko
./net/ipv4/tcp_westwood.ko
./net/ipv4/tcp_bic.ko
./net/ipv4/udp_diag.ko
./net/ipv4/tcp_htcp.ko
./net/wireless/cfg80211.ko
./net/mac80211/mac80211.ko
上面显示的内容,就是用find命令搜索所有一起跟着内核编译出来的ko文件。简单看一下,就发现drivers/net下面有很多的驱动变成了ko。所以,当前要做的就是把这些驱动都编译到zImage里面去,当然这也是为了图省事。重新make ARCH=arm menuconfig配置,把drivers/net下面的m选项,都修改成y选项,
feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/linux-zero-5.2.y$ find . -name "*.ko"
./drivers/video/backlight/lcd.ko
./drivers/input/mousedev.ko
./drivers/staging/rtl8723bs/r8723bs.ko
./drivers/usb/class/cdc-wdm.ko
./drivers/usb/serial/usbserial.ko
./drivers/usb/serial/cp210x.ko
./drivers/usb/serial/usb-serial-simple.ko
./drivers/usb/common/usb-otg-fsm.ko
./lib/crypto/libarc4.ko
./net/ipv4/tcp_westwood.ko
./net/ipv4/tcp_bic.ko
./net/ipv4/udp_diag.ko
./net/ipv4/tcp_htcp.ko
./net/wireless/cfg80211.ko
./net/mac80211/mac80211.ko
一顿操作,再次编译。对比发现,果然所有的drivers/net驱动都不见了,这个时候我们也很高兴,以为问题马上也要解决了。不过测试结果又让我们失望了,网卡驱动还是没有成功。看来我们的工作还要继续。
4、继续搜索和查找
既然设备树和代码都修改了,驱动问题还在,那说明驱动方面应该还是有地方没有配置好或者修改好。带着这个思路,我们网上搜索了一些答案,结果找到了这个链接,
https://blog.csdn.net/weixin_43850980/article/details/126267303
上面提示我们不光要修改设备树,还要添加 STMicroelectronics devices的驱动配置,而这个配置默认是没有打开的,需要自己手动打开,
直觉告诉我们这一步应该是正确的。因此,配置好内核之后,快速生成zImage和dtb文件,通过uboot的loady、sf erase、sf write命令烧入到spi norflash当中去。等到板子起来,迫不及待地输入ifconfig eth0 up这个熟悉的测试指令后,果然有了不一样的结果打印,
# ifconfig eth0 up
[ 30.342090] dwmac-sun8i 1c30000.ethernet eth0: PHY [0.1:01] driver [Generic PHY]
[ 30.351058] dwmac-sun8i 1c30000.ethernet eth0: No Safety Features support found
[ 30.358460] dwmac-sun8i 1c30000.ethernet eth0: No MAC Management Counters available
[ 30.366118] dwmac-sun8i 1c30000.ethernet eth0: PTP not supported by HW
[ 30.372673] dwmac-sun8i 1c30000.ethernet eth0: configuring for phy/mii link mode
#
命令输入之后,看到一串打印,这应该是eth0驱动加载的动作。看来最后一次对menuconfig做的配置发挥了作用,driver应该生效了。当然,我们可以进一步输入ifconfig确认一下,看看eth0节点有没有加上,
# ifconfig
eth0 Link encap:Ethernet HWaddr 02:01:08:36:99:C3
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:40
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
结果和我们预想的一样,除了之前就存在的lo节点,这一次有多了一个eth0节点。这说明我们的网卡驱动问题基本解决了。整个过程虽然有一些波折,不过结果还是让人满意的。