驱动开发中共一般有2中内核调试方式 :静态编译进内核& 动态模块加载。而调试方式有3中,一种是每次下载内核与文件系统,启动,调试, 另外一种是在运行中动态加载内核,还有一种是nfs网络启动。
在所有的方法中,动态加载模块的方法是最简单的。但是它主要需要编写一个makefile,但是也可以不写。一下是两种方法。
一。添加支持动态模块加载的内核和应用程序支持。
在make menuconfig中配置内核时选择:Loadable module support --->
[*] Enable loadable module support
[] Set version information on all module symbols (NEW)
[*] Kernel module loader (NEW)
并在应用程序配置中选择busybox下的insmod/rmmod/lsmod,
并选中: [*] Post 2.1 kernel modules。
二。逃避makefile
关于驱动模块的.c(例如mydriver.c)可这样编译,不需要单独写Makefile,就直接放到uClinux/linux2.4.x里面参与内核编译即可:
cp mydriver.c uClinux-dist/linux-2.4.x/drivers/char
然后修改uClinux-dist/linux-2.4.x/drivers/char/Makefile,
obj-y += mem.o tty_io.o n_tty.o tty_ioctl.o raw.o pty.o misc.o random.o mydriver.o
在最后加入mydriver.o
这样内核就会用正确的参数编译出mydriver.o。
然后把这个mydriver.o单独复制出来到uClinux-dist/romfs/usr下面,然后再把uClinux-dist/linux- 2.4.x/drivers/char/Makefile恢复回去,然后再重编内核,烧写,启动后执行insmod /usr/mydriver.o即可成功。再lsmod看看。
三。一个模块的makefile 内容
发现把驱动程序作为模块加载时,使用的也是虚拟地址,用了set_gpio_ctrl才通过。
编译模块驱动:
arm-linux-gcc -DMODULE -D__KERNEL__ -I/home/2.4.18-rmk7/include -c mydriver.c
编译应用程序:
arm-linux-gcc -o myapp myapp.c
看来还是写个Makefile方便
终端:
mount -t nfs -o rw 192.168.0.196:/home/work /mnt
cd /mnt/2.4.18.rmk7/user/mydrive
insmod mydriver.o
mknod /dev/test c 125 0
.'/myapp