linux字符驱动之自动创建设备节点
上一节中,我们是手工创建设备节点,大家肯定也会觉得这样做太麻烦了。
上一节文章链接:https://blog.csdn.net/qq_37659294/article/details/104302700
问:能不能让系统自动创建设备节点?
答:可以,linux有udev、mdev的机制,而我们的ARM开发板上移植的busybox有mdev机制,那么就使用mdev机制来自动创建设备节点。
问:文件系统里,在哪里设置了mdev机制?
答:在etc/init.d/rcS文件里有一句:
echo /sbin/mdev > /proc/sys/kernel/hotplug
问:在驱动程序里面如何编写程序,让系统自动创建设备节点?
答:首先创建一个class类,然后在class类下,创建一个class_device,即类下面创建类的设备。
详细请参考驱动源码:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>static struct class *firstdrv_class;
static struct class_device *firstdrv_class_dev;int major;
static int first_drv_open(struct inode * inode, struct file * filp)
{printk("first_drv_open\n");return 0;
}
static int first_drv_write(struct file * file, const char __user * buffer, size_t count, loff_t * ppos)
{printk("first_drv_write\n");return 0;
}/* File operations struct for character device */
static const struct file_operations first_drv_fops = {.owner = THIS_MODULE,.open = first_drv_open,.write = first_drv_write,
};/* 驱动入口函数 */
static int first_drv_init(void)
{/* 主设备号设置为0表示由系统自动分配主设备号 */major = register_chrdev(0, "first_drv", &first_drv_fops);/* 创建firstdrv类 */firstdrv_class = class_create(THIS_MODULE, "firstdrv"); //创建一个“类”/* 在firstdrv类下创建xxx设备,供应用程序打开设备*//* 在“类”里面创建设备* MKDEV(major, 0)指定主设备号为major,次设备号为0(这里的major必须和register_chrdev返回的一致,不然会出错)*/firstdrv_class_dev = device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xxx");return 0;
}/* 驱动出口函数 */
static void first_drv_exit(void)
{unregister_chrdev(major, "first_drv");device_unregister(firstdrv_class_dev); //卸载类下的设备class_destroy(firstdrv_class); //卸载类
}module_init(first_drv_init); //用于修饰入口函数
module_exit(first_drv_exit); //用于修饰出口函数 MODULE_AUTHOR("LWJ");
MODULE_DESCRIPTION("Just for Demon");
MODULE_LICENSE("GPL"); //遵循GPL协议
测试程序和Makefile没有修改,故再不贴。
上一节文章链接:https://blog.csdn.net/qq_37659294/article/details/104302700
测试步骤:
[WJ2440]# ls
Qt driver_test lib root udisk
TQLedtest etc linuxrc sbin usr
app_test first_drv.ko mnt sddisk var
bin first_test opt sys web
dev home proc tmp
[WJ2440]# ls -l /dev/xxx //还没有设备节点
ls: /dev/xxx: No such file or directory
[WJ2440]# insmod first_drv.ko //装上我们写的驱动后,会自动生成设备节点/dev/xxx
[WJ2440]# lsmod
first_drv 1912 0 - Live 0xbf000000
[WJ2440]# ls -l /dev/xxx //查看生成的设备节点
crw-rw---- 1 root root 252, 0 Jan 1 23:17 /dev/xxx
[WJ2440]# cat proc/devices
Character devices:1 mem4 /dev/vc/04 tty5 /dev/tty5 /dev/console5 /dev/ptmx7 vcs10 misc13 input14 sound29 fb81 video4linux89 i2c90 mtd
116 alsa
128 ptm
136 pts
180 usb
188 ttyUSB
189 usb_device
204 tq2440_serial
252 first_drv
253 usb_endpoint
254 rtcBlock devices:
259 blkext7 loop8 sd31 mtdblock65 sd66 sd67 sd68 sd69 sd70 sd71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
179 mmc
[WJ2440]# cd /sys/class/ //打开/sys/class可以看到我们生成的firstdrv类
[WJ2440]# ls
bdi i2c-adapter misc scsi_device usb_endpoint
block i2c-dev mmc_host scsi_disk usb_host
firmware ieee80211 mtd scsi_host vc
firstdrv input net sound video4linux
graphics mem rtc tty vtconsole
[WJ2440]# cd firstdrv/ //firstdrv类里面有我们的xxx设备
[WJ2440]# ls
xxx
[WJ2440]# cd xxx/
[WJ2440]# ls
dev subsystem uevent
[WJ2440]# cat dev //主设备号252,次设备号0
252:0
[WJ2440]# cat uevent
MAJOR=252
MINOR=0
[WJ2440]# cd /
[WJ2440]# ./first_test //有了设备节点便能够运行我们的程序了
first_drv_open
first_drv_write
[WJ2440]#
本文参考于:
https://blog.csdn.net/lwj103862095/article/details/17470573
linux字符驱动之自动创建设备节点相关推荐
- linux驱动:自动创建设备节点
在加载驱动模块后,就要自己使用mknod创建设备节点,这样虽然是可行的,但是比较麻烦.我们可以在__init()函数里面添加一些函数,自动创建设备节点.创建设备节点使用了两个函数 class_crea ...
- linux 设备节点 驱动,【Linux驱动】自动创建设备节点
开始学习驱动的时候,是将驱动程序编译成模块然后用mknod命令手动建立设备节点以提供给应用程序调用.这对于刚开始调试驱动程序的时候常用的一种方法.但是,当有种需要必须在系统启动的时候就将驱动程序就绪, ...
- Linux 字符设备驱动结构(二)—— 自动创建设备节点
上一篇我们介绍到创建设备文件的方法,利用cat /proc/devices查看申请到的设备名,设备号. 第一种是使用mknod手工创建:mknod filename type major minor ...
- linux内核创建节点,Linux内核驱动自动创建设备节点文件
Linux下生成驱动设备节点文件的方法有3个:1.手动mknod:2.利用devfs:3.利用udev 在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上L ...
- linux自动创建设备节点
在有2.6系列版本中支持udev管理设备文件可以方便的创建设备节点,不必使用mknod来创建 //主要用到的四个方法在linux/device.h定义: //创建类和释放类的函数 创建成后将创建/s ...
- Linux:驱动之自动创建字符设备的设备文件(未完)
自动创建字符设备的设备文件 目前尚不是最终版本,还望有心人自己学习的时候,把自己整合的知识点相关的答案也好问题也好,或者实践过程中的一些操作截图,再或者其他的一些想要分享材料发给笔者邮箱:uestc_ ...
- linux内核创建字符节点,Tiny6410学习ing—(四)、嵌入式Linux内核驱动进阶—(7)、高级字符设备驱动(自动创建节点)—#931...
按照国嵌的视频教程上来说的,最后就是-自动创建设备文件! 其实我感觉以前完全可以直接是手动创建了设备文件,然后就可以直接讲述自动创建设备文件,为啥非要拖到最后来讲述,我也就不清楚了!! 不管了,写完收 ...
- 新字符设备驱动实验(自动分配设备号、自动创建应用层设备节点、新字符设备注册到内核的结构体)
目录 自动分配和释放设备号 示例代码 新的字符设备注册到内核方法 字符设备结构体(前面的设备号也放进来) cdev_init结构体初始化函数 cdev_add 添加到linux内核 cdev_del内 ...
- linux mdev 命令,linux设备驱动----利用mdev(udev)自动创建设备文件节点
1.mdev的使用方法和原理: mdev是busybox 自带的一个简化版的udev,适合于嵌入式的应用埸合.其具有使用简单的特点.它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程 ...
最新文章
- 前端学习 -- Css -- 盒子模式
- 带你认识“货真价实”的P2P网贷风控
- VTK:字形2D用法实战
- PID入门的十五个基本概念
- LeetCode 617合并二叉树-简单
- java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?
- 【转载】我只是随便说说的即时通讯
- 创建设计模式 - 抽象工厂设计模式
- Disruptor本地线程队列_实现线程间通信---线程间通信工作笔记001
- 【干货】华为-智能世界2030:构建万物互联的智能世界
- Java中的文件压缩
- VC InitInstance函数
- NO.170 六问禅道1:为什么任务的剩余工时不自动更新?
- .net反混淆脱壳工具de4dot的使用
- lbochs模拟器最新版_Bochs模拟器下载_Bochs模拟器免费[系统增强]-下载之家
- 打造自己的MyLifeOrganized 2(MLO2)云同步
- pthon图片信息-3cv2-高阶处理
- 25岁就死了,75才埋,程序员们的中年危机:有点懵
- AD中T型节点添加泪滴失败,原因是T型走线有问题
- 身份证读卡器 浏览器插件
热门文章
- SpringMVC学习笔记整理
- Codeforces Round #318 (Div. 2) B 	 Bear and Three Musketeers (暴力)
- .NET通用基本权限系统
- HadoopSourceAnalyse --- Nodemanager Container request handler
- php接口开发 安全_PHP开发api接口安全验证的实例讲解
- python文件的读取与写入_python中文件的读取与写入以及os模块
- python怎么打开程序管理器_Python 进程管理工具 Supervisor 使用教程
- java comparator_Java基础之String漫谈(二)
- java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...
- python 编码声明位置,python中的编码声明