最近遇到一个客户基于Linux2.6.26进行kernel开发,遇到了开发之后的kernel无法自动识别ECM网卡驱动的问题。我们本地需要帮忙其验证一下该版本的kernel能够本身自动识别ECM网卡。
首先我们找到了ubuntu10.04(kernel版本为2.6.32.21),因为ubuntu10.04版本太老旧了,我想换个源来安装kernel的源码,结果一换就出了各种各样的问题,后来决定还是在网络上手动下载kernel源码,然后再用U盘导到虚拟机里
kernel源码下载地址为:Index of /pub/linux/kernel/
ubuntu镜像下载地址为:WSL | Ubuntu
本文参考的网络文章链接为:Ubuntu内核源码修改编译及加载验证_面朝大海0902的博客-CSDN博客_ubuntu内核源码
查看ubuntu版本:lsb_release -a
查看gcc版本和linux kernel版本:cat /proc/version 或 uname -a
把kernel 2.6.32.21的源码解压到桌面上,进入其中,执行make modules (第一次编译时还需要编一下config,使用make oldconfig或者其他的编译方法都行,看需要啥),就可以对各类ko进行编译
由于ECM的驱动名字叫做cdc_ether,查找一下编译后的位置:
先将系统本身的ko干掉,然后重新加载:
lsmod | grep cdc
rmmod cdc_ether.ko
insmod cdc_ether.ko
在加载的过程中,可能会遇到一些依赖,甚至会报说版本不符合的问题,当时我解决的方法是先用
modprobe usbnet.ko
自动加载ubuntu原本自身的usbnet.ko,这是因为cdc_ether.ko依赖了usbnet.ko
modprobe 在这里起到了动态加载并自动解决加载过程中的依赖关系,加载了usbnet.ko之后再可以直接加载我们新编译出来的cdc_ether.ko
不过第一次使用ubuntu10-04连接上模块USB之后使用AT+GTRNDIS=1,1拨号后ubuntu并不可以通过USB连上网络
查看后发现模块端缺少了usblan0设备,最后调试通过的方法是将ubuntu端的cdc_ether.ko rmmod掉,再重新insmod就可以了
usblan就是外置网卡,直接连接USB口就可以实现方便快速的上网,无须像传统内置网卡一样需要打开机箱安装在网卡卡槽上
修改cdc_ether.c和usbnet.c,加入printk添加打印,
然后把 drivers/net/usb/ 下的 Makefile 改为:
下面是Makefile范例的文字版:
#sample driver module
CONFIG_MODULE_SIG=n
obj-m := option.o
PWD := $(shell pwd)
OUTPUTDIR=/lib/modules/`uname -r`/kernel/drivers/usb/serial/
KDIR := /lib/modules/$(shell uname -r)/build
default:
$(MAKE) -C $(KDIR) M=$(PWD)
install: default
mkdir -p $(OUTPUTDIR)
cp -f option.ko $(OUTPUTDIR)
depmod
modprobe -r option
modprobe option
.PHONY:clean
clean:
rm -f *.mod.c *.mod.o *.ko *.o *.tmp_versions
这样,只需要修改 obj-m,在 drivers/net/usb/ 下执行 make,就可以编译出新的 usbnet.ko 或 cdc_ether.ko,使用 insmod 重新加载就可以
使用 dmesg -c 将旧的 dmesg 清理掉,然后重新加载并插入USB、拨号即可在 dmesg 中看到打印的 log 信息



