我是靠谱客的博主 无辜太阳,最近开发中收集的这篇文章主要介绍arm-linux中.ko驱动编译工程示例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近接触到了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驱动编译工程示例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部