昨天由于一直都有事,也没有来得及整理问题,正好今天没事了,好好整理一下这两天所学的东西吧.
1、编译设备驱动程序
这几天一直在搜索设备驱动编译的方法,而网上大多都是一个makefile模板,大致都是这样的:
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
#把makevfile 中的KERNELDIR ?= /opt/q2440/kernel-2.6.13改成KERNELDIR ?= 你的板子的内核源码在pc上的路径
ifneq ($(KERNELRELEASE),)
obj-m := led2410.c
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
KERNELDIR ?= /root/linux/ #此外是我2.4内核的源码路径。
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
在编译时出现下面的错误:
make[2]: Entering directory `/root/linux/arch/arm/fastfpe'
make[2]: Nothing to be done for `modules'.
make[2]: Leaving directory `/root/linux/arch/arm/fastfpe'
make[1]: Leaving directory `/root/linux'
今天偶然发现了一个用命令进行编译的,拿过来一试,果然好使呢,最初的命令是这样的:
/opt/host/armv4l/bin/armv4l-unknown-linux-gcc -D__KERNEL__ -I/root/linux/include -KBUILD_BASENAME=sw2410 -DMODULE -c -o sw2410.o sw2410.c(/root/linux/是我的2.4内核的路径)
使用命令编译设备驱动时,出现下列问题
[root@Qufeng swShow]# ./build.sh
armv4l-unknown-linux-gcc: unrecognized option `-KBUILD_BASENAME=sw2410'
sw2410.c:1: warning: `MODULE' redefined
*Initialization*:1: warning: this is the location of the previous definition
(不过虽然有问题但仍然能用)
解决办法:去掉命令中的“-KBUILD_BASENAME=sw2410"可解决第一个问题,在sw2410.c中发现有这样一项#define MODULE,可知是与这个宏定义重复,因此改成
#ifndef MODULE
#define MODULE
#endif可解决后两个警告
后来在学着编译Mplayer的时候学会了书写简单的shell脚本文件,即把命令写在文件上,保存,并用chmod +x将文件设置成可执行属性,就可以了,还真是很好用呢,
注意:
1.驱动所在的内核必须是在root用户下编译过的,不然会出现很多路径错误;
2.上面所用的命令中“-I”挂接的一定要是绝对路径;
3.上面所用的命令中“-D__KERNEL__ ”中的两个下划线是连着两个下划线,不是一个,格式不对会导致很多错误。
4.也可以将上面的命令改成Makefile的形式的
2、2.4内核下运行模块驱动的方法
把编译好的LED灯的模块驱动和测试程序下载到开发板上进行试验,先insmod led2410.o,进行加载模块,再chmod +x ledshow 把测试程序设置为可执行属性,运行时又出问题了
# ./ledshow
can't open device
# insmod led2410.o
insmod: a module named led2410 already exists
# rmmmod led2410.o
rmmmod: No such file or directory
# ls /dev 后现没有那个叫io_pb的设备文件啊
今天问了一下技术支持才知道办法,根据技术支持的建议,在insmod led2410.o后,再输入命令mknod /dev/io_pb c 102 0就好用了,而且也能在/dev下发现io_pb这个文件了,注意,一定要把/dev/这个路径加上,因为mknod类似于mkdir,如果不加,例如:,mknod io_pb c 102 0 就会发现在当前目录下有了io_pb。
虽然程序里有register_chrdev函数进行注册的,但是register_chrdev函数只是将其注册到系统,应用程序需要通过节点才能找到驱动程序,所以需要mknod 。
3、开机自动运行命令方法
在文件系统下有一个/etc/init.d/路径下,里面存放的脚本程序都是开机自动运行的,所以完全可以做一个脚本程序的,比如/sbin/ifconfig eth0 10.0.17.110 up,这样就不用每次开机都得设IP了,还可以加载模块了什么的,很有用的。