简述如何编译开发板的网卡驱动程序

来源:互联网 发布:剑三优化版客户端 编辑:程序博客网 时间:2024/05/21 17:21

简述如何编译开发板的网卡驱动程序

经过4天的努力,今天终于成功编译了一款基于ralink芯片组的无线网卡(Asus WL-107G)。在编译的过程中遇到了很多问题,多亏论坛上的一些热心兄弟帮忙才得以顺利解决。现在把主要的编译步骤阐述如下(基于linux2.6.x内核):

Arm开发板上虽然能够运行linux的系列内核以及基于此环境而开发出来的驱动程序﹑应用程序,但毕竟和pc机的运行环境有所不一样。在PC机下安装了linux系统之后一般会把源放在目录/lib/modules/’uname –r’/build/之下,这个源是主要供编译PC机下运行的程序使用的,当我们需要编译Arm开发板的程序时就需要给其建立一个内核编译环境,在建立内核编译环境之前需要在PC机的编译环境下安装一个交叉编译环境,我使用arm-linux-gcc. 安装方法是:解压arm-linux-gcc包到一个新建的文件夹中,进入该文件夹之后你会发现有一个bin目录,在该目录下存放的是交叉编译环境的可执行文件,等下添加路径的时候就需要这个路径了。好了,接下来进入PC机中linux目录/etc/下找到文件bashrc,或是在用户主目录下寻找文件.bashrc,找的哦啊之后使用vi编辑器在该文件中最后一行添加export PATH=$PATH:/path/to/excutable/file(就是上面所提到的那个路径)。保存之后退出,用命令source /etc/bashrc来加载该执行路径。最后用echo $PATH查看下PATH环境变量,这时应该可以看到交叉编译环境已经添加进去了。下面阐述一下开发板内核编译环境的建立:

1)  将你arm板子中运行的linux内核源代码下载到PC机运行的环境中,找个路径给其建立一个文件夹(如我的板子是pxa255的:/usr/src/pxa255;

2)  建立了一个文件夹之后就需要采用tar命令把源代码解压到该目录下,如:tar jxvf [src dir] [des dir];

3)  接下来进入解压后的源目录文件夹,修改一下Makefile文件,主要是修改为ARCH=armCROSS_COMPILE=/path/to/arm-linux-(就是arm-linux-gcc所在的目录,一定要注意最后一个文件的写法一定是arm-linux-,因为Makefile文件会自动加入gcc字样)

4)  下一步就是修改./include/asm的链接方向(当然有些开发板提供的内核可能已经做了34两步),采用命令ln –s asm-arm asm(意思是给asm-arm建立一个符号链接,符号链接名为asm);

5)  接下来就是配置下开发板的linux内核,进入开发板的内核目录执行make menuconfig就回弹出一个配置界面(当然系统需要安装qt-devel),选择Load an Alternate Configuration File添加进你板子以.cfg结尾的配置文件。接下来就只剩下重新编译内核了make zImage,如果你的机子配置比较好的话,稍等一下就可以将内核编译成功了。这样内核编译环境就算是建立了。

后面剩下的工作就是编译驱动程序了,进入驱动程序所在的目录首先make config以配置文件,接下来就是make –C /path/to/linux/source SUBDIRS=$PWD modules(/path/to/linux/source是指开发板内核编译环境所在的目录),不出意外应该就可以编译成功了。

我在编译的过程中出现的一些问题以及个人的解决方法粘贴如下:

Dmesg1:

include/asm/uaccess.h:537: warning: `warn_unused_result' attribute directive ignored

include/asm/system.h: In function `__set_64bit':

include/asm/system.h:169: error: unknown register name `dx' in `asm'

include/asm/system.h:169: error: unknown register name `ax' in `asm'

include/asm/system.h: In function `__set_64bit_constant':

include/asm/system.h:169: error: unknown register name `dx' in `asm'

include/asm/system.h:169: error: unknown register name `ax' in `asm'

include/asm/system.h: In function `__set_64bit_var':

include/asm/system.h:169: error: unknown register name `dx' in `asm'

include/asm/system.h:169: error: unknown register name `ax' in `asm'

include/asm/processor.h: In function `cpuid_eax':

include/asm/processor.h:144: error: unknown register name `dx' in `asm'

include/asm/processor.h:144: error: unknown register name `cx' in `asm'

include/asm/processor.h:144: error: unknown register name `bx' in `asm'

include/asm/processor.h: In function `cpuid_ebx':

include/asm/processor.h:154: error: unknown register name `dx' in `asm'

include/asm/processor.h:154: error: unknown register name `cx' in `asm'

include/asm/processor.h: In function `cpuid_ecx':

include/asm/processor.h:164: error: unknown register name `dx' in `asm'

include/asm/processor.h:164: error: unknown register name `bx' in `asm'

include/asm/processor.h: In function `cpuid_edx':

include/asm/processor.h:174: error: unknown register name `cx' in `asm'

include/asm/processor.h:174: error: unknown register name `bx' in `asm'

include/asm/processor.h: In function `set_in_cr4':

include/asm/processor.h:211: error: unknown register name `ax' in `asm'

include/asm/processor.h: In function `clear_in_cr4':

include/asm/processor.h:221: error: unknown register name `ax' in `asm'

include/asm/rwsem.h: In function `__up_write':

include/asm/rwsem.h:214: error: unknown register name `edx' in `asm'

include/asm/rwsem.h: In function `up_write':

include/asm/rwsem.h:214: error: unknown register name `edx' in `asm'

make[1]: *** [/usr/src/linux-2.6.5-1.358/RT2500-Linux-STA-1.4.2.0/Module/rtmp_main.o] ?? 1

make: *** [/usr/src/linux-2.6.5-1.358/RT2500-Linux-STA-1.4.2.0/Module] 错误 2

make: Leaving directory `/lib/modules/2.6.5-1.358/build'

这个问题是编译环境中的/include/asm链接不对,指向了asm-i386,因为在arm处理器中是没有AX等寄存器的。需要将asm文件指向asm-arm就可以解决。

Dmesg2:

[root@localhost Module]# make -C /usr/src/pxa255/linux-2.6.8.1-hzh/ SUBDIRS=$PWD modules

make: Entering directory `/usr/src/pxa255/linux-2.6.8.1-hzh'

  CC [M]  /usr/src/linux-2.6.5-1.358/RT2500-Linux-STA-1.4.2.0/Module/rtmp_main.oIn file included from include/linux/timex.h:186,

                 from include/linux/sched.h:11,

                 from include/linux/module.h:10,

                 from /usr/src/linux-2.6.5-1.358/RT2500-Linux-STA-1.4.2.0/Module/rt_config.h:46,

                 from /usr/src/linux-2.6.5-1.358/RT2500-Linux-STA-1.4.2.0/Module/rtmp_main.c:30:

include/linux/time.h:145:31: division by zero in #if

include/linux/time.h:145:31: division by zero in #if

include/linux/time.h:145:31: division by zero in #if

include/linux/time.h:145:31: division by zero in #if

include/linux/time.h:145:31: division by zero in #if

include/linux/time.h:145:31: division by zero in #if

include/linux/time.h:145:31: division by zero in #if

include/linux/time.h:145:31: division by zero in #if

 

include/linux/time.h:145:31: division by zero in #if

include/linux/time.h:145:31: division by zero in #if

include/linux/time.h:145:31: division by zero in #if

include/linux/time.h:145:31: division by zero in #if

include/linux/time.h:145:31: division by zero in #if

include/linux/time.h:145:31: division by zero in #if

include/linux/time.h:145:31: division by zero in #if

In file included from include/linux/timex.h:186,

                 from include/linux/sched.h:11,

                 from include/linux/module.h:10,

                 from /usr/src/linux-2.6.5-1.358/RT2500-Linux-STA-1.4.2.0/Module/rt_config.h:46,

                 from /usr/src/linux-2.6.5-1.358/RT2500-Linux-STA-1.4.2.0/Module/rtmp_main.c:30:

include/linux/time.h: In function `timespec_to_jiffies':

include/linux/time.h:223: error: `CLOCK_TICK_RATE' undeclared (first use in this function)

include/linux/time.h:223: error: (Each undeclared identifier is reported only once

include/linux/time.h:223: error: for each function it appears in.)

include/linux/time.h: In function `jiffies_to_timespec':

include/linux/time.h:242: error: `CLOCK_TICK_RATE' undeclared (first use in this function)

include/linux/time.h: In function `timeval_to_jiffies':

include/linux/time.h:264: error: `CLOCK_TICK_RATE' undeclared (first use in this function)

include/linux/time.h: In function `jiffies_to_timeval':

include/linux/time.h:280: error: `CLOCK_TICK_RATE' undeclared (first use in this function)

/usr/src/linux-2.6.5-1.358/RT2500-Linux-STA-1.4.2.0/Module/rtmp_main.c: In function `RT2500_probe':

/usr/src/linux-2.6.5-1.358/RT2500-Linux-STA-1.4.2.0/Module/rtmp_main.c:124: warning: implicit declaration of function `pci_request_regions'

/usr/src/linux-2.6.5-1.358/RT2500-Linux-STA-1.4.2.0/Module/rtmp_main.c:220: warning: implicit declaration of function `pci_release_regions'

make[1]: *** [/usr/src/linux-2.6.5-1.358/RT2500-Linux-STA-1.4.2.0/Module/rtmp_main.o] 错误 1

make: *** [_module_/usr/src/linux-2.6.5-1.358/RT2500-Linux-STA-1.4.2.0/Module] 错误 2

make: Leaving directory `/usr/src/pxa255/linux-2.6.8.1-hzh'

 

这个应该是没有配置内核的原因,只需要将开发板的内核重新配置一下,再编译出内核,这个问题就可以解决的。

原创粉丝点击