最近研究QQ2440,想做水下机器人的位姿检测,用Linux需要对设备驱动编程,学了学,挺麻烦的,麻烦在编译和加载上,在网上找到一个例子不错,抄下来备用。
PC机上的:
- obj-m := hello.o
- KERNELDIR := /lib/modules/$(shell uname -r)/build
- default:
- make -C $(KERNELDIR) M=$(shell pwd) modules
- install:
- insmod hello.ko
- uninstall:
- rmmod hello.ko
- clean:
- make -C $(KERNELDIR) M=$(shell pwd) clean
ARM上的:
-
KERNELDIR
= /opt/linux-2.6.30.4-copy(内核源码的位置)
PWD :=$(shell pwd)
- CROSS_COMPILE =arm-linux-
- CC =$(CROSS_COMPILE)gcc (指定交叉编译器)
- INSTALLDIR =/home/hwmt2014/share(生成的.ko文件放置的位置)
-
target
=hello
obj-m :=$(target).o
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
cp $(target).ko $(INSTALLDIR)
clean:
rm -rf *.ko *.cmd *.o
.PHONY:modules modules_install clean
arm 端运行步骤及解释:
- (1)make:只是编译模块生成.ko文件
(2)make install:将模块安装到指定的目录下
(3)make clean:清除生成的文件,为重新编译做好准备。
两者的区别仅仅在内核目录上,这个问题是后来才研究明白的,因为之前内核配置上的错误导致了很多问题,在网上找到一些解决方法,一一解决了,现在想总结时却发现都忘了是什么问题了,只记得最后的时候insmod hello.ko时出现如下错误:
version magic '2.6.14.7 ARMv4 gcc-3.4' should be '2.6.14.7 preempt ARMv4
gcc-3.4'
insmod: cannot insert `st7565p_driver26.ko': Invalid module format (-1): Exec format error
解决办法:
用如下操作:
我用的是make menuconfig.
注意:
您的内核必须已启用这些选项进行了编译,用以支持模块的动态加载。
(用make menuconfig调出内核配置菜单):
Loadable module support --->
Enable loadable module support
Module unloading
[ ] Module versioning support (EXPERIMENTAL)
Automatic kernel module loading
注:该步没做时,在make modules时将出错。
Kernel Feautre -> Preemptible Kernel
配置完后重新make,然后就能在arm端成功运行!