Linux下驱动框架与杂项字符设备框架介绍

网友投稿 589 2022-05-29

1. linux下驱动框架介绍

1.1 驱动框架分类

Linux下驱动框架分为3大类型:

字符设备 ---------

块设备 存储设备 SD 硬盘

网络设备 网卡 无线 有线

字符设备和块设备都会生成设备节点在/dev目录下。

网络设备不会生成设备节点. 可以使用ifconfig查看

字符设备标准框架详细区分:

RTC设备驱动

LCD屏设备驱动—帧缓冲设备框架

声卡设备驱动—音频设备

标准输入设备驱动—输入子系统框架

…等等

内核提供的字符设备注册的方式: 原生的—最底层注册方式

早期设备注册方式—linux 2.6

Linux下驱动框架与杂项字符设备框架介绍

标准设备注册方式

杂项设备注册方式

比如: 温度传感器、湿度传感器、光照度、门锁、LED灯、蜂鸣器 驱动都是使用字符设备框架编写

1.2 驱动框架代码模板

示例代码:

#include #include static int __init tiny4412_hello_drv_init(void) { printk("Hello 驱动注册-安装成功.\n"); return 0; } static void __exit tiny4412_hello_drv_exit(void) { printk("Hello 驱动注销成功.\n"); } /*驱动入口*/ module_init(tiny4412_hello_drv_init); /*驱动出口*/ module_exit(tiny4412_hello_drv_exit); /*许可证*/ MODULE_LICENSE("GPL");

1.3 Makefile示例代码

KER_DRI=/home/wbyq/work/linux-3.5/linux-3.5 all: make -C $(KER_DRI) M=`pwd` modules clean: make -C $(KER_DRI) M=`pwd` modules clean obj-m += drv_hello.o

编译完成之后,生成的驱动文件名称还是xxxx.ko文件。以ko为后缀。

1.4 安装驱动过程

[root@wbyq ]#insmod drv_hello.ko [ 435.765000] Hello 驱动注册-安装成功. [root@wbyq ]#rmmod drv_hello.ko rmmod: can't change directory to '/lib/modules': No such file or directory [root@wbyq ]#mkdir /lib/modules [root@wbyq ]#rmmod drv_hello.ko rmmod: can't change directory to '3.5.0-FriendlyARM': No such file or directory [root@wbyq ]# [root@wbyq ]# [root@wbyq ]#mkdir /lib/modules/3.5.0-FriendlyARM [root@wbyq ]#rmmod drv_hello.ko [ 1024.225000] Hello 驱动注销成功. [root@wbyq ]#insmod drv_hello.ko [ 1080.500000] Hello 驱动注册-安装成功. [root@wbyq ]#lsmod drv_hello 614 0 - Live 0xbf004000 (O) [root@wbyq ]#modinfo drv_hello.ko modinfo: can't open '/lib/modules/3.5.0-FriendlyARM/modules.dep': No such file or directory [root@wbyq ]#touch /lib/modules/3.5.0-FriendlyARM/modules.dep [root@wbyq ]#modinfo drv_hello.ko filename: drv_hello.ko license: GPL depends: vermagic: 3.5.0-FriendlyARM SMP preempt mod_unload ARMv7 p2v8 [root@wbyq ]#

驱动的安装方式:

动态安装. lsmod 查看动态方式安装的驱动.

静态安装. 静态是固化到内核里的。

2. 杂项设备框架

2.1 框架结构介绍

杂项字符设备的主设备号固定: 10 主设备号: 0 ~ 255

次设备号范围: 0 ~ 255

Linux内核寻找驱动节点是依靠设备号寻找的。

设备号: 主设备号(区分类型)、次设备号(区分同类型的具体设备)

主设备号: 10 ,240

下面是查看串口设备节点、MMC设备节点的详细信息:

下面是杂项设备的模型图:

Linux下把无法分类的一些设备都归类为杂项设备,杂项设备本身就是字符设备,只是简单封装了一层,注册调用更加简单。杂项设备(misc device)是在嵌入式系统中用得比较多的一种设备驱动。

在Linux内核的include\linux目录下有Miscdevice.h文件,misc设备定义及其内核提供的相关函数在这里。

内核用struct miscdevice的结构体来描述杂项设备:

struct miscdevice { int minor; //次设备号,杂项设备的主设备?10 const char *name; //设备的名称 const struct file_operations *fops; //文件操作 /* 下面的成员是供内核使用 ,驱动编写不需要理会 */ struct list_head list; //misc_list的链表头 struct device *parent; //父设备 struct device *this_device; //当前设备,是device_create的返回值 };

杂项设备结构里有一个文件集合指针,当字符设备驱动安装成功之后,在应用层是open函数打开这个设备文件,会访问到驱动层里文件集合对应的函数。

文件操作集合的模型图:

2.2 蜂鸣器驱动示例代码

这是蜂鸣器的驱动层示例代码,使用杂项设备框架编写:

应用层的代码:

#include int main(int argc,char**argv) { int fd; fd=open("/dev/tiny4412_hello",2); //3 0 - 1 - 2 if(fd<0) { printf("驱动打开失败!\n"); return -1; } int data1; int data2; while(1) { read(fd,&data1,4); sleep(1); write(fd,&data2,4); sleep(1); } close(fd); return 0; }

2.3 运行效果

Linux

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《Hadoop权威指南:大数据的存储与分析》—3.2.5 HDFS的高可用性
下一篇:能力认证计划 -- 名企内推保 offer 直通车
相关文章