以前只是在PC上写了些模块驱动,也在44b0上运行过简单的字符驱动模块,但是44b0上是直接把模块编到内核的,真正作为模块在开发板上运行,这次还真是头一次。
简单介绍下我的环境。开发板是Mini2440,在NAND Flash里装的的是Linux;PC机器有两台,一台Windows操作系统,另一台是Linux系统。两台电脑和开发板的网线都通过一个交换机相连,交换机再连到Cable Medom。Windows PC的USB口通过一个USB转串口线与开发板相连,另外Windows PC与开发板还有根USB相连。
0、建立文件夹memdev
要开发代码,自然在Linux环境下开发比较好。所以,在Linux PC上的某路径下,建立一个文件夹memdev。
1、模块代码
在文件夹memdev下编写模块文件memdev.h和memdev.c。这部分就不详细叙述了,随便找个内核模块或者字符设备驱动的教程看看就知道了。
2、Makefile
Makefile要制定编译的环境的路径。
1)要准备路径,所以首先要将mini2440的内核代码解压到Linux的PC机上。我解压到了/usr/src/linux-2.6.32.2
2)然后根据mini2440手册的步骤,将内核编译。(首先cp config_mini2440_t35 .config, 然后make menuconfig, 最后make zImage)。
3)在文件夹memdev下编写Makefle如下:
ifneq ($(KERNELRELEASE),)
obj-m := memdev.o
else
KDIR := /usr/src/linux-2.6.32.2
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
注意:标红部分是需要改动的部分。其实这个Makefile可以当做模板,每次写内核模块的Makefile的时候都拿来用,然后根据实际情况,修改红色部分就可以了。
3、执行make
成功的话,会生成memdev.ko
4、编写应用程序调用刚才的模块
生成应用程序mapl
5、拷贝到实机上。
这个步骤确实费了不少力气。
首先想通过串口的rz命令把文件从Windows PC上传到开发板上,结果发现串口一传文件,PC机就蓝屏。哎,可能是我电脑没有串口,我用的USB转串口的缘故吧。
然后就试下用U盘。原来我的SD卡读卡器在开发板上很好用的,可惜在公司被大家用的多了,把我的读卡器用坏了,哎,真是可惜啊,我心爱的读卡器。我只能用mp3当做U盘来拷。可惜mp3插到开发板上,很快被识别了,然后又被remove了。哎,又是没办法。试了两个mp3,一个手机,都不行。
最后,只能用ftp了。通过ifconfig eth0 60.63.10.99 netmask 255.255.252.0设置开发板的ip与我的Linux PC的IP设为同一网段。然后通过ftp命令传送memdev.ko和mapl到开发板的/home/plg/目录。
6、添加模块
既然模块文件memdev.ko和应用程序mapl都已经拷贝到了开发板的目录/home/plg下,那么下一步就可以添加模块了。
在开发板上用insmod memdev.ko添加模块,也遇到了不少问题。
首先说我编译的模块和开发板上的内核不匹配。哦,确实是。开发板上的内核,是我之前编译的,编译的时候我改了很多东西。解决办法嘛,当时是把刚才2-2) 步编译出来的zImage重新烧到flash中了。
换了新的内核,接着insmod memdev.ko吧。结果还是不行。哎,左想右想,估计是模块的设备号已经被占用了。所以重新再Linux PC上修改memdev.h,改用动态申请设备号,重新编译出memdev.ko再拷到开发板上。这时候再insmod memdev.ko,就成功了。
7、添加设备节点。
通过lsmod,发现memdev模块已经添加到内核了。那就可以执行应用程序了吗?不是的,还少一步:添加设备节点。不添加设备节点,应用程序无法找到这个模块对应的设备。
1)查看设备号
要添加设备节点,首先要知道我们的设备的设备号。(因为设备号是动态申请的,我们预先不知道。)
使用命令 cat /proc/devices查看我们的设备的设备号为253
2)添加
通过命令 mknod memdev0 c 253 0添加设备节点
这时,在/dev/下面会看到我们添加的设备节点memdev0
8、运行应用程序
在应用程序所在的目录运行命令 ./mapl,查看下结果,果然和自己希望的一样!