内核:Linux-3.2.1 + Linux-3.6.6
由于工作的需要,需要将Atheros AR8161的驱动编译进内核
一、获取驱动源码
源码地址 AR8161 for Linux
二、拷贝到 /usr/src/linux-3.2.1/drivers/net/ethernet/atheros/ 下
下载的驱动名为 compat-wireless-3.6.6-1-snpc.tar.bz2, 解压缩,进入compat-wireless-3.6.6-1-snpc目录下。我需要的是这个驱动 compat-wireless-3.6.6-1-snpc\drivers\net\ethernet\atheros\alx
三、修改Kconfig和Makefile
config ALX
tristate "Atheros ALX Gigabit Ethernet support"
depends on PCI
select CRC32
select NET_CORE
select MII
---help---
This driver supports the Atheros L1C/L1D/L1F gigabit ethernet
adapter. The alx driver is intended to replace completely the
atl1c driver with proper support and commitment from Qualcomm
Atheros (QCA). Both atl1c and alx supports the following chipsets:
1969:1063 - AR8131 Gigabit Ethernet
1969:1062 - AR8132 Fast Ethernet (10/100 Mbit/s)
1969:2062 - AR8152 v2.0 Fast Ethernet
1969:2060 - AR8152 v1.1 Fast Ethernet
1969:1073 - AR8151 v1.0 Gigabit Ethernet
1969:1083 - AR8151 v2.0 Gigabit Ethernet
Only alx supports the following chipsets:
1969:1091 - AR8161
1969:1090 - AR8162
For more information see:
https://www.linuxfoundation.org/collaborate/workgroups/networking/alx
To compile this driver as a module, choose M here. The module
will be called alx.
-->修改Makefile文件
增加 obj-$(CONFIG_ALX) += alx/
四、编译到内核
make menuconfig ,找到 ALX 选项,选 Y
-------------------------------------------------------------------------------------------------------------------
OK,到这里本以为一切正常,结果。。。。报了诸如此类的错误和警告
drivers/net/ethernet/atheros/alx/alx_main.c: 在函数‘alx_set_multicase_list’中:
drivers/net/ethernet/atheros/alx/alx_main.c:315:6: 警告: “LINUX_VERSION_CODE”未定义 [-Wundef]
drivers/net/ethernet/atheros/alx/alx_main.c:315:28: 警告: “KERNEL_VERSION”未定义 [-Wundef]
drivers/net/ethernet/atheros/alx/alx_main.c:315:42: 错误: 标识符“(”前缺少二元运算符
drivers/net/ethernet/atheros/alx/alx_main.c:318:29: 错误: ‘struct netdev_hw_addr’没有名为‘dmi_addr’的成员
drivers/net/ethernet/atheros/alx/alx_main.c: 在函数‘alx_set_mac_address’中:
drivers/net/ethernet/atheros/alx/alx_main.c:338:6: 警告: “LINUX_VERSION_CODE”未定义 [-Wundef]
drivers/net/ethernet/atheros/alx/alx_main.c:338:28: 警告: “KERNEL_VERSION”未定义 [-Wundef]
drivers/net/ethernet/atheros/alx/alx_main.c:338:42: 错误: 标识符“(”前缺少二元运算符
drivers/net/ethernet/atheros/alx/alx_main.c: 在文件作用域:
drivers/net/ethernet/atheros/alx/alx_main.c:1465:6: 错误: 未知的类型名‘netdev_features_t’
drivers/net/ethernet/atheros/alx/alx_main.c: 在函数‘alx_restore_vlan’中:
drivers/net/ethernet/atheros/alx/alx_main.c:1489:2: 错误: 隐式声明函数‘alx_vlan_mode’ [-Werror=implicit-function-declaration]
LINUX_VERSION_CODE 这个是在 linux/version.h头文件中定义的,而且我编译的时候也进入了这个目录,结果却报了警告,于是我在alx_main.c中包含了这个头文件。
之后再编译,结果又报错,说是有一个结构没有找到,我想,,,不会吧。。。然后在内核的 include 目录找了个遍,果然没有。。。
会不会是我内核的版本太低了?于是我去官网下载了高版本的内核 Linux-3.6.6,这个里面果然有那个头文件(声明一下:其实在Linux-3.3.X里面就有这个结构了)。
好吧,从新来过,按上面的步骤来。
结果。。。又报错
drivers/net/ethernet/atheros/alx/alx_main.c: 在函数‘alx_init’中:
drivers/net/ethernet/atheros/alx/alx_main.c:3551:2: 错误: 隐式声明函数‘netdev_attach_ops’ [-Werror=implicit-function-declaration]
cc1:有些警告被当作是错误
额,我查了下这个函数,不是内核里面的,是这个驱动里面带的,然后我把含有这个函数的头文件包含到了alx_main.c中,这两个头文件分别是:compat-2.6.29.h 和 compat-2.6.32.h
再次编译,OK
也许有人会问为什么不直接在那个驱动源码的目录下编译,那个驱动源码解压后25.5M,且里面含有usb、蓝牙、摄像头和无线驱动,这些是我并不需要的,还有就是工作需要的原因。