linux学习笔记

Linux驱动编程——misc设备驱动框架

2021-09-20  本文已影响0人  嵌入式大神

Linux驱动编程——misc设备驱动框架

主要概念:

misc:杂项设备
杂项设备是字符设备的一种,杂项设备可以自动生成设备节点。
设备节点: dev 目录下,全部都是生成的设备节点
cat /proc/misc 查看系统里的砸向设备
misc设备主设备号都是10
设备号:
主设备号 用来标识一个类型的驱动
次设备号 用来标识同一类型中不同的设备号
cat /proc/devices 查看设备号

实验目的:

熟悉杂项设备驱动编写框架,编写一个简易的杂项设备驱动,并编译加载到系统上。

主要函数调用:

struct miscdevice {                     //misc设备结构体
    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;
};

int misc_register(struct miscdevice *misc);     //向系统中注册一个 misc 设备
int misc_deregister(struct miscdevice *misc)    //注销掉 misc 设备

代码:

//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("register is error\r\n");
        return -1;
    }
    
    printk("misc register is succeed\r\n");
    
    return 0;
}

static void misc_exit(void) 
{
    misc_deregister(&misc_dev);
    printk("misc deregister!\r\n");
}

module_init(misc_init);
module_exit(misc_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("SIXER");

Makefile

KERNELDIR := /home/sixer/imx_kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga
CURRENT_PATH := $(shell pwd)

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-

target := misc
obj-m := $(target).o
APP_NAME := $(target)_app

build: kernel_modules

kernel_modules:
    $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

clean:
    $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
#   rm -rf $(APP_NAME)

dir_exist = $(shell if [ -d "/nfsroot/$(target)/" ]; then echo "exist"; else echo "noexist"; fi)
$(info $(dir_exist))

install:
ifeq ("$(dir_exist)", "noexist")
    $(shell mkdir /nfsroot/$(target))
    #"文件夹不存在,已重新创建文件夹"
endif
#   arm-linux-gnueabihf-gcc $(APP_NAME).c -o  $(APP_NAME)
    cp *.ko  /nfsroot/$(target)/

编译运行:

make 编译
make install 将目标文件拷贝到 NFS 目录中

sixer@ubuntu:~/imx_usr/driver/00_misc$ make
noexist
make -C /home/sixer/imx_kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga M=/home/sixer/imx_usr/driver/00_misc modules
make[1]: Entering directory '/home/sixer/imx_kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga'
noexist
  CC [M]  /home/sixer/imx_usr/driver/00_misc/misc.o
  Building modules, stage 2.
noexist
  MODPOST 1 modules
  CC      /home/sixer/imx_usr/driver/00_misc/misc.mod.o
  LD [M]  /home/sixer/imx_usr/driver/00_misc/misc.ko
make[1]: Leaving directory '/home/sixer/imx_kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga'
sixer@ubuntu:~/imx_usr/driver/00_misc$ make install
noexist
#"文件夹不存在,已重新创建文件夹"
cp *.ko  /nfsroot/misc/
sixer@ubuntu:~/imx_usr/driver/00_misc$ 

实验现象:

[root@iTOP-iMX6UL]# cd misc/
[root@iTOP-iMX6UL]# ls
misc.ko
[root@iTOP-iMX6UL]# insmod misc
insmod: can't insert 'misc': No such file or directory
[root@iTOP-iMX6UL]# insmod misc.ko 
misc register is succeed
[root@iTOP-iMX6UL]# ls /dev/hello_misc
/dev/hello_misc
[root@iTOP-iMX6UL]# rmmod misc
misc deregister!

驱动成功加载,在/dev目录中生成 hello_misc 设备节点文件。

总结:

注册 misc 设备在驱动框架的基础上增加了miscdevice结构体,另外多了注册和注销两个操作,加载驱动模块 misc.ko 的过程中,系统是自动在 /dev 目录下生成了 hello_misc 节点文件,这样应用程序就可以通过设备节点文件访问系统内核资源了。

注册misc 设备的三个步骤:
※ 填充 miscdevice 这个结构体
※ 填充 file_operations 这个结构体misc.c
※ 注册杂项设备并生生成设备节点

公众号:

InsertingAll

上一篇下一篇

猜你喜欢

热点阅读