电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
【野火i.MX6ULL ARM Linux开发板连载】实现一个最简洁的驱动模板
分 享
扫描二维码分享
【野火i.MX6ULL ARM Linux开发板连载】实现一个最简洁的驱动模板
野火,驱动开发
瑟寒凌风
关注
发布时间: 2021-01-18
丨
阅读: 776
# 驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。 在linux中,驱动加载成功后会在“/dev”目录下生成一个相应的文件,我们自己编写的应用程序可以通过这个文件进行open来打开这个文件,使用close来关闭这个文件。open、 close这些函数是由 C 库提供的,在 Linux 系统中,系统调用作为 C 库的一部分。 # 驱动入口和出口 Linux的驱动加载有两种方式,一种是将驱动编译到内核中,在内核启动的时候,驱动一起启动。另一种是将驱动编译成模块,在内核启动起来之后通过手动或者脚脚本再添加到内核中,添加到内核的命令insmod,卸载驱动的命令rmmod。 在编写驱动中,使用如下入口来加载和卸载驱动 ```c module_init(hello_init); //注册模块加载函数 module_exit(hello_exit); //注册模块卸载函数 ``` 在驱动加载时,输入insmod命令加载驱动, hello_init函数会首先被调用,在卸载驱动时,输入rmmod命令, hello_exit就会被调用。 # 代码实践 下面来写一个最简单的驱动模版。 ```c static int __init hello_init(void) { printk(KERN_EMERG "[ KERN_EMERG ] Hello Module Init\n"); return 0; } static void __exit hello_exit(void) { printk(KERN_EMERG "[ KERN_EMERG ] Hello Module Exit\n"); } ``` 编写makefile文件 ```shell KERNEL_DIR=~/Kernel/ebf-buster-linux/build_image/build ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- export ARCH CROSS_COMPILE obj-m := hellomodule.o all: $(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) modules ``` 然后进行make,在makefile相同目录中会产生一个*.ko的文件 ![](https://cf01.ickimg.com/bbsimages/202101/2a66fc2b94ae9c31f1a30def1ec1e9a9.jpg) 将hellomodule.ko文件拷贝到nfs路径下,命令 ```shell cp ./ hellomodule.ko /home/hasee/nfs ``` 打开开发板的串口终端,在nfs中执行insmod命令,结果如下 ![](https://cf01.ickimg.com/bbsimages/202101/ae54fca3df4fe475b4a044bfae11db99.jpg) 在该图中,我们看到已经打印出来的[ KERN_EMERG ] Hello Module Init内容,说明模块已经加载成功。 我们可以执行lsmod来查看当前内核中有没有我们的模块名存在 ![](https://cf01.ickimg.com/bbsimages/202101/5de2bd39b663847b90e2a615a74ec83d.jpg) 然后我们执行命令rmmod来卸载模块 ![](https://cf01.ickimg.com/bbsimages/202101/137231a7819610f48bd688250d9ff0e6.jpg) 这里有一点不一样,在安装模块时,我们用的命令中模块名写的hellomodule.ko,而卸载是模块名写的hellomodule,这一点一定要注意。 如上我们完成了一个简单的设备驱动,以后所有的驱动都是在这个模板上进行功能的添加的。 完整代码如下 ![](https://cf01.ickimg.com/bbsimages/202101/277ffc9726d116eb809c7fcc02547f6b.jpg) 下一篇文章我们将在该模板中添加设备号,实现open,close,write,read等函数,按照如下图的关系实现一个完整的字符设备测试案例 ![](https://cf01.ickimg.com/bbsimages/202101/acc92d9e915e5108d78c7c0c3b71b9e9.jpg) 本篇完,下次见。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
瑟寒凌风
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交