05_雜項裝置驅動

爱吃冰激凌的黄某某發表於2024-04-22

雜項裝置驅動

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

相關文章