概述
最近接触到了linux驱动,驱动开发中比较常用的就是编译.ko文件了,调试驱动的时候可以很方便加载和卸载驱动。这也类似于应用层使用的.so动态库文件,驱动有什么问题或者更新,直接更换.ko文件即可。
insmod xx.ko //加载驱动
modprobe xx.ko //也是加载驱动命令,能解决驱动依赖关系。
rmmod xx.ko //卸载驱动
modprobe可以解决load module时的依赖关系,比如load moudleA就必须先load mouduleB之类的,它是通过/lib/modules/<kernel-version>/modules.dep文件来查找依赖关系的。
但是modprobe命令只会在/lib/modules/`uname -r`/系统目录下找驱动,如果驱动没放在指定的路径下,就需要用insmod来加载驱动了。
要会使用还不行,咱们还得知道怎么写。于是在此记录一个简单的驱动模板,以作备忘:
Makefile参考模板:
CROSS_COMPILE_ARM = /home/disk/fangye/projects/rv1109_smart_door/prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
KERN_DIR=/home/disk/fangye/projects/rv1109_smart_door/kernel
#PWD=$(shell pwd)
all:
make CROSS_COMPILE=${CROSS_COMPILE_ARM} ARCH=arm -C $(KERN_DIR) M=`pwd` modules
clean:
rm -rf .test* *.ko *.o Module.* modules.order *mod.c .tmp_versions
obj-m += test.o
其中 CROSS_COMPILE_ARM 需要修改为你的交叉编译工具链的路径,当然如果工具链加到了环境变量中,只需要指定工具链的前缀 arm-linux-gnueabihf- 就行了。
因为.ko文件与内核代码是强相关的,KERN_DIR 需要指定为你内核代码所在路径。
驱动源文件*.c参考模板:
#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
static int __init test_init(void) //不写void 会报一个错误
{
printk("Hello,Kernel!!n");
return 0;
}
static void test_exit(void)
{
printk("Exit hello exit!!n");
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL"); // 没有这个GPL也会报错
编译结果:
最后
以上就是无辜太阳为你收集整理的arm-linux中.ko驱动编译工程示例的全部内容,希望文章能够帮你解决arm-linux中.ko驱动编译工程示例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复