05_杂项设备驱动
1.01_Linux最简单驱动-helloworld2.02_Linux下编译驱动模块实践3.03_make menuconfig图形化配置4.04_Linux下把驱动编译进内核
5.05_杂项设备驱动
6.06_应用层和内核层实现数据交互7.07_Linux物理地址到虚拟地址映射8.08_第一个相对完整的驱动实践编写9.09_驱动模块传参数10.10_申请字符类设备号11.11_注册字符类设备12.12_自动创建设备节点13.13_Platform 设备驱动14.14_Linux 设备树15.15_pinctl和gpio子系统16.16_ioctl接口17.17_Linux中断18.18_内核定时器19.19_输入子系统20.20_Linux I2C 驱动21.21_FT5X06触摸驱动实验杂项设备驱动
Linux三大设备驱动
字符设备:IO的传输过程是以字符为单位的,没有缓冲。比如I2C,SPI都是字符设备
块设备:IO的传输过程是以块为单位的。根存储相关的,都属于块设备,比如,tf卡
网络设备:与前俩个不一样,是以socket套接字来访问的。
1.我们这节课要讲的杂项设备驱动是属于我们这三大设备驱动里面的哪个呢?
杂项设备是字符设备的一种。可以自动生成设备节点。
我们的系统里面有很多杂项设备。我们可以输入cat /proc/misc命令来查看。
2.杂项设备除了比字符设备代码简单,还有别的区别吗?
杂项设备的主设备号是相同的,均为10,次设备号是不同的。主设备号相同就可以节省内核的资源。
3.主设备号和次设备号是什么?
设备号包含主设备号和次设备号,主设备号在Linux系统里面是唯一的,次设备号不一定唯一。
设备号是计算机识别设备的一种方式,主设备相同的就被视为同一类设备
主设备号可以比做成电话号码的区号。比如北京的区号是010
次设备号可以比作成电话号码。
主设备号可以通过命令cat /proc/devices来查看。
4 杂项设备的描述
定义在内核源码路径: include/linux/miscdevice.h
struct miscdevice {
int minor; //次设备号
const char *name; //设备节点的名字
const struct file_operations *fops; //文件操作集
struct list_head list;
struct device *parent;
struct device *this_device;
const struct attribute_group **groups;
const char *nodename;
umode_t mode;
};
file_operations文件操作集在定义在include/linux/fs.h下面
里面的一个结构体成员都对应一个调用。
extern int misc_register(struct miscdevice *misc);
注册杂项设备
extern int misc_deregister(struct miscdevice *misc);
注销杂项设备
5 注册杂项设备的流程。
(1)填充miscdevice这个结构体
(2)填充file_operations这个结构体
(3)注册杂项设备并生成设备节点。
实践
misc.c
#include<linux/init.h>
#include<linux/module.h>
#include<linux/miscdevice.h>
#include<linux/fs.h>
/* 文件操作集 */
struct file_operations misc_fops = {
.owner = THIS_MODULE //当前模块
};
/* 杂项设备结构体 */
struct miscdevice misc_dev = {
.minor = MISC_DYNAMIC_MINOR, //动态分配次设备号
.name = "hello_misc", //设备节点的名字
.fops = &misc_fops //文件操作集
};
static int misc_init(void)
{
int ret;
ret = misc_register(&misc_dev); //注册杂项设备
if(ret < 0)
{
printk("misc register is error!\n");
return -1;
}
printk("misc register is ok!\n");
return 0;
}
static void misc_exit(void)
{
misc_deregister(&misc_dev); //注销杂项设备
printk("misc gooodbye!\n");
}
module_init(misc_init);
module_exit(misc_exit);
MODULE_LICENSE("GPL");
Makefile
obj-m+=misc.o
KDIR:=/home/mzx/imx6ull/linux-imx-rel_imx_4.1.15_2.1.0_ga
PWD?=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!