05_杂项设备驱动

杂项设备驱动

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下面

img

里面的一个结构体成员都对应一个调用。

extern int misc_register(struct miscdevice *misc);

注册杂项设备

extern int misc_deregister(struct miscdevice *misc);

注销杂项设备

5 注册杂项设备的流程。

(1)填充miscdevice这个结构体

(2)填充file_operations这个结构体

(3)注册杂项设备并生成设备节点。

image-20240418213603719

实践

image-20240420130412955

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
posted @ 2024-04-25 22:33  爱吃冰激凌的黄某某  阅读(29)  评论(0编辑  收藏  举报