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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容