1.新建文本文档,重命名为 hello_dev.c (驱动的开发同应用的开发一样,也是在文本文档下开发的)。

2.包含头文件

内核模块需要包含内核相关头文件,不同模块根据功能的差异,所需要的头文件也不相同,但是和是必不可少的。

#include

#include

3.模块初始化

模块的初始化负责注册模块本身。如果一个内核模块没有被注册,则其内部的各种方法(函数)无法被应用程序使用,只有已注册模块的各种方法才能够被应用程序使用并发挥各方法的实际功能。模块并不是内核内部的代码,而是独立于内核之外,通过初始化,能够让内核之外的代码来替内核完成本应该由内核完成的功能,模块初始化的功能相当于模块与内核之间衔接的桥梁,告知内核“我进来了”。

static int __init module_init_func(void)

{

初始化代码

}

module_init(module_init_func);

说明:

(1) 模块初始化函数一般都需声明为 static,因为初始化函数对于其它文件没有任何意义;

(2) __init 表示初始化函数仅仅在初始化期间使用,一旦初始化完毕,将释放初始化函数所占用的内存,类似的还有__initdata;

(3) module_init 是必须的,没有这个定义,内核将无法执行初始化代码。module_init宏定义会在模块的目标代码中增加一个特殊的代码段,用于说明该初始化函数所在的位置。

当使用 insmod 将模块加载进内核的时候,初始化函数的代码将会被执行。模块初始化代码只与内核模块管理子系统打交道,并不与应用程序交互。

4.模块退出。

当系统不再需要某个模块,可以卸载这个模块以释放该模块所占用的资源。模块的退出相当于告知内核“我要离开了”。实现模块退出的函数常称为模块的退出函数或者清除函数

static void __exit module_exit_func(void)

{

模块退出代码

}

module_exit(module_exit_func);

说明:

(1) 模块退出函数没有返回值;

(2) __exit 标记这段代码仅用于模块卸载;

(3) module_exit 不是必须的。但是,没有 module_exit 定义的模块无法被卸载,如果需要支持模块卸载则必须有 module_exit。

当使用 rmmod 卸载模块时,退出函数的代码将被执行。模块退出代码只与内核模块管理子系统打交道,并不直接与应用程序交互。

5.许可证

Linux 内核是开源的,遵守 GPL 协议,所以要求加载进内核的模块也最好遵循相关协议。为模块指定遵守的协议用 MODULE_LINCENSE 来声明,如:

MODULE_LICENSE("GPL");

内核能够识别的协议有“GPL”、“GPL v2”、“GPL and additional rights(GPL 及附加权利)”、“Dual BSD/GPL(BSD/GPL 双重许可)”、“Dual MPL/GPL(MPL/GPL 双重许可)”以及“Proprietary(私有)”。

如果一个模块没有指定任何许可协议,则会被认为是私有协议。采用私有协议的模块,在加载过程中会出现警告,并且不能被静态编译进内核。

执行完上面步骤,一个最小的linux驱动便写好了。全部代码如下:

6.编译

内核模块的编译需要Makefile文件,在hello_dev.c所在路径建立Makefile文件:

在Makefile输入以下文本并保存。

obj-m := hello_dev.o

PWD  := $(shell pwd)

KVER ?= $(shell uname -r)

KDIR :=/home/qlqcetc/nuc970bsp/02.linux内核3.10.x

all:

$(MAKE) -C $(KDIR) M=$(PWD)

clean:

rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions

其中obj-m 指定要编译的源文件是hello_dev.c,KDIR指定内核的路径,驱动模块的编译是需要内核源码的相关文件的,所以需要设置内核源码所在路径。

中断进入驱动源码所在文件夹:

#/home/qlqcetc/nuc970bsp/06.示例驱动程序/00.hello_dev

#ls

编译:

#make

#ls

生成的hello_dev.ko就是驱动模块,使用U盘将其复制到开发板的/lib/modules/路径下(modules文件夹需要创建),就可以加载驱动模块了。

开发板终端输入:

# cd /lib/modules/

# insmod hello_dev.ko

可以看到驱动加载成功,驱动打印出信息:

开发板终端输入:

# mkdir 3.10.101

# rmmod hello_dev.ko

可以看到驱动卸载成功,驱动打印出信息:

10寸 nuc972_NUC972----最简单的驱动(转)相关推荐

  1. FT5X06 如何应用在10寸电容屏(linux-3.5电容屏驱动简析移植10寸电容屏驱动到Android4.2) (by liukun321咕唧咕唧)

    这是几个月以前的东西了,在彻底遗忘之前拿出来好好写写.做个笔记,也算是造福后来人了.在做这个项目之前,没有做过电容屏的驱动,印象中的电容触摸屏是不需要校正的.IC支持多大的屏就要配多大的屏.但是拿到需 ...

  2. 10寸、10.1寸、10.4寸液晶屏解决方案

    10寸这个尺寸在市面上实际是很少见的一个尺寸,一般都是10.1寸或者10.4寸比较常见,所以一般客户在选择10寸屏时,我们往往都会直接推荐10.1寸或者是10.4寸,10.1寸和10.4寸的区别主要在 ...

  3. 10寸液晶屏怎么选购? 选购10寸液晶屏重要的五点

    10寸液晶屏怎么选购?我们知道10寸液晶屏是一个比较常见的尺寸,近些年来很多厂商也陆续推出该尺寸的产品,那作为消费者的我们应该怎么去选购这些产品呢? 选购10寸液晶屏重要的五点: 1.视角 10寸并不 ...

  4. ESP32学习笔记( VSCode + ESP-IDF环境) 3 ——GPIO相关的简单外设驱动

    1.如何在VSCode和ESP-IDF的环境下创建工程 说实话,这是我用ESP-IDF在VSCode环境下最不喜欢的事情,在一顿CSDN和百度之后,很多大佬博主都推荐使用VSCode,通过官方示例来进 ...

  5. NanoPi NEO Air使用八:编写个简单的驱动和应用程序

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  6. 简单说说驱动程序设计的入门

    简单说说驱动程序设计的入门,其实初级驱动设计中也能使用C++,也能使用类,但和用户程序中的用法有一些区别,一些特殊的地方需要特别注意.从笔者的经验来看,WDK给出的AVStream小端口驱动示例工程, ...

  7. 1.10 编程基础之简单排序 06 整数奇偶排序 python

    http://noi.openjudge.cn/ch0110/06/ """ 1.10 编程基础之简单排序 06 整数奇偶排序 http://noi.openjudge. ...

  8. 1.10 编程基础之简单排序 04 奖学金 7分 python

    http://noi.openjudge.cn/ch0110/04/ """ 1.10 编程基础之简单排序 04 奖学金 7分 http://noi.openjudge. ...

  9. 1.10 编程基础之简单排序 03 成绩排序 3分 python

    http://noi.openjudge.cn/ch0110/03/ """ 1.10 编程基础之简单排序 03 成绩排序 3分 http://noi.openjudge ...

  10. 1.10 编程基础之简单排序_10 单词排序

    http://noi.openjudge.cn/ch0110/10/ /* 1.10 编程基础之简单排序_10 单词排序 http://noi.openjudge.cn/ch0110/10/总时间限制 ...

最新文章

  1. 海信电视服务器暂时不可用,一线也实惠 微星H61M-E35(B3)主板评测
  2. Mybatis 中使用CDATA
  3. 为什么需要ORM 框架
  4. 可能是最全面的 Java G1学习笔记
  5. python创建变量_【转载】 Python动态生成变量
  6. 【Julia】ERROR: UndefVarError: linspace not defined
  7. 数据库创建时间,更新时间设计
  8. php 导出tables,jquery+php实现导出datatables插件数据到excel的方法_php技巧
  9. 2016.10.26
  10. 关于U盘免疫的一些自我认识
  11. 一个index.html怎么添加备案号,ICP备案号怎么添加到自己网页底部?
  12. 五险一金 社保基数 住房公积金基数以及个税(By FlyElephant)
  13. Android开发app实现发送短信功能
  14. 回顾过去,展望未来——2014年终总结
  15. visio2016安装遇到的坑
  16. 为什么SD-WAN不会杀死MPLS_SD-WAN Cheap
  17. 计算机远程用户屏蔽,允许/阻止用户使用远程桌面服务进行远程连接
  18. 蜀门linux服务端架设,蜀门私服常用修改配置大全
  19. ad用户如何和计算机名对应,计算机加域和AD里相应对象的问题
  20. 研究记录02—EKF_SLAM ——2012.4 Joan Sola

热门文章

  1. 关于Sybase iq常用命令
  2. 额外vss水水水水水水
  3. 数据库,计算机网络、操作系统刷题笔记17
  4. java dubbo 连接 zk 报错 Session 0x0 for server 127.0.0.1/<unresolved>:2181, unexpected error, closing so
  5. 一图说明如何修改VisualStudio工程的配置管理器界面宽度
  6. 一建经济公式存入计算机,【2017一建《工程经济》干货第二篇:工程经济必记5个计算公式】- 环球网校...
  7. 山羊抗兔IgG二抗, 绿色DyLight 488荧光标记说明书
  8. Cesium:地心地固坐标(ECEF)转东北天坐标(ENU)
  9. Android音乐播放器开发的MediaPlayer出现IllegalStateException
  10. SuperMap iDesktop实现室内导航