AX88772C驱动交叉编译
近日调试一款处理器为imx6板子,核心板为飞凌XXX,由于自己设计的底版上有USB接口,无网卡。因此采用USB网卡进行开发调试。使用某联的一款100MUSB网卡,实际芯片型号为亚信AX88772C。号称免驱的该网卡插入到板子上,只能枚举出USB设备,查询不到该网卡,分析是没有驱动导致的,好在亚信官网提供了这款网卡驱动的源码。
本人需求对网卡的需求是在开发调试时使用,因此并不需要将驱动集成到内核中,仅仅编译为一个驱动模块即.ko文件即可。
本博客核心是第5步,Makefile文件的修改,请重点关注这部分。
编译平台
操作系统:Ubuntu16 x64
交叉编译器:交叉编译器使用飞凌官方资料提供的“arm-poky-linux-gnueabi-gcc”
编译步骤
1. 检查是否有这款驱动
在嵌入式板上执行命令:
lsmod | grep asix.ko
若能够找到驱动,则可能是其他问题引起的,不必再参考本博客的后续步骤。
2. 下载驱动
核心板运行操作系统内核为4.1.15,因此下载“Linux kernel 4.x/3.x/2.6.x Driver”
下载完成后解压驱动,进入解压后的目录内,可以看到Makefile文件,此时的Makefile是用于编译机x86架构的编译,编译后的驱动文件只能用于编译机,嵌入式设备上一定是无法安装。因此要修改makefile。
3. 检查和安装交叉编译环境
一般的Linux系统具备直接编译x86平台的环境,如果是想在电脑上使用该网卡驱动的话,可以略过该步骤。如果是想在嵌入式平台(imx6)上安装网卡驱动,请参考文末的附录
4. 编译开发板linux内核
复制系统linux内核到某目录下,按照飞凌的官方方法编译,如果编译过程中出现问题,大家可以留言讨论。
步骤这里简要带过
make distclean
make imx_v7_defconfig
make zImage -j8
make dtbs -j8
make modules -j8
内核编译以及驱动编译常见错误问题
- 提示编译器command not found: 一般是由于在配置编译环境时与编译时不是同一个用户或同一个终端,比如安装编译环境时使用的是一般用户,编译时使用了root用户或sudo执行,则会提示一些编译器、链接器的错误。
还有一种情况是飞凌的添加环境变量shell文件默认仅对当前终端有效,想我也是仅编译一次驱动,也就不需要让交叉编译器全局生效,有需求的朋友可以配置为全局有效。
安装驱动,为什么要先编译内核?
- 驱动文件在编译的过程中,包含和链接了大量的内核头文件、功能库。当编译x86的PC版时不需要先编译内核是因为系统本身自带自身系统的内核头文件和可供链接的库,且默认的Makefile文件指向了这些路径。交叉编译驱动时,编译机上并没有嵌入式的内核相关文件供包含供链接,因此需要先编译嵌入式版本的内核。
5. 修改驱动的Makefile
从网卡官网下载的驱动文件目录内的Makefile文件默认用于编译运行X86架构的系统上,要想在交叉编译嵌入式版本并在板子上运行,需要修改Makefile文件。
主要修改内容如下:
- 添加编译器、链接器
# 修改前:
CURRENT = $(shell uname -r)
# 修改后:
ARCH=arm
CROSS_COMPILE=arm-poky-linux-gnueabi-
CC=$(CROSS_COMPILE)gcc
LD=$(CROSS_COMPILE)ld
- 修改KDIR指定的Linux内核路径为嵌入式Linux内核路径
# 修改前:
KDIR = /lib/modules/$(CURRENT)/build
SUBLEVEL= $(shell uname -r | cut -d '.' -f 3 | cut -d '.' -f 1 | cut -d '-' -f 1 | cut -d '_' -f 1)
ifneq (,$(filter $(SUBLEVEL),14 15 16 17 18 19 20 21))
MDIR = drivers/usb/net
endif
# 修改后:
KDIR = ./linux-4.1.15/
- 修改编译后的目标路径
# 修改前:
DEST = /lib/modules/$(CURRENT)/kernel/$(MDIR)
# 修改后:
DEST = ..
修改前后的makefile文件对比:
6. 编译驱动
chenzd@ubuntu:~/projects/ax88772c$ make
make -C ./linux-4.1.15/ SUBDIRS=/home/chenzd/projects/ax88772c modules
make[1]: Entering directory '/home/chenzd/projects/ax88772c/linux-4.1.15'
Building modules, stage 2.
MODPOST 1 modules
CC /home/chenzd/projects/ax88772c/asix.mod.o
LD [M] /home/chenzd/projects/ax88772c/asix.ko
make[1]: Leaving directory '/home/chenzd/projects/ax88772c/linux-4.1.15'
7. 安装驱动
编译好的.ko文件复制到板子上,执行如下命令
insmod asix.ko
#安装成功会有如下提示
#查看驱动
lsmod | grep asix
附录
1. 安装交叉编译器
飞凌官网提供的交叉编译安装文件非常方便,直接运行即可。若已安装交叉编译工具,请跳过本步。
./fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa9hf-neon-toolchain-4.1.15-2.1.0.sh
- 配置环境变量
. /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa9hf-neon-poky-linux-gnueabi
- 检查安装情况
arm-poky-linux-gnueabi-gcc -v
# 正常情况下会打印输出如下
gcc version 5.3.0 (GCC)
2. 安装编译所需的其他工具
lzop是该系统编译zimage文件时所必须的工具,否则编译时会报与其相关的Error。
- 检查工具是否已安装
lzop -v
# 已安装情况下会打印输出如下
- 若未安装,则安装
sudo apt-get install lzop
#确认是否已安装
lzop -v
#正常情况下会打印输出如下
安装成功了,别忘记收藏点赞本博客。