上一节中,我们是手工创建设备节点,大家肯定也会觉得这样做太麻烦了。

上一节文章链接: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字符驱动之自动创建设备节点相关推荐

  1. linux驱动:自动创建设备节点

    在加载驱动模块后,就要自己使用mknod创建设备节点,这样虽然是可行的,但是比较麻烦.我们可以在__init()函数里面添加一些函数,自动创建设备节点.创建设备节点使用了两个函数 class_crea ...

  2. linux 设备节点 驱动,【Linux驱动】自动创建设备节点

    开始学习驱动的时候,是将驱动程序编译成模块然后用mknod命令手动建立设备节点以提供给应用程序调用.这对于刚开始调试驱动程序的时候常用的一种方法.但是,当有种需要必须在系统启动的时候就将驱动程序就绪, ...

  3. Linux 字符设备驱动结构(二)—— 自动创建设备节点

    上一篇我们介绍到创建设备文件的方法,利用cat /proc/devices查看申请到的设备名,设备号. 第一种是使用mknod手工创建:mknod filename type major minor ...

  4. linux内核创建节点,Linux内核驱动自动创建设备节点文件

    Linux下生成驱动设备节点文件的方法有3个:1.手动mknod:2.利用devfs:3.利用udev 在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上L ...

  5. linux自动创建设备节点

    在有2.6系列版本中支持udev管理设备文件可以方便的创建设备节点,不必使用mknod来创建 //主要用到的四个方法在linux/device.h定义: //创建类和释放类的函数  创建成后将创建/s ...

  6. Linux:驱动之自动创建字符设备的设备文件(未完)

    自动创建字符设备的设备文件 目前尚不是最终版本,还望有心人自己学习的时候,把自己整合的知识点相关的答案也好问题也好,或者实践过程中的一些操作截图,再或者其他的一些想要分享材料发给笔者邮箱:uestc_ ...

  7. linux内核创建字符节点,Tiny6410学习ing—(四)、嵌入式Linux内核驱动进阶—(7)、高级字符设备驱动(自动创建节点)—#931...

    按照国嵌的视频教程上来说的,最后就是-自动创建设备文件! 其实我感觉以前完全可以直接是手动创建了设备文件,然后就可以直接讲述自动创建设备文件,为啥非要拖到最后来讲述,我也就不清楚了!! 不管了,写完收 ...

  8. 新字符设备驱动实验(自动分配设备号、自动创建应用层设备节点、新字符设备注册到内核的结构体)

    目录 自动分配和释放设备号 示例代码 新的字符设备注册到内核方法 字符设备结构体(前面的设备号也放进来) cdev_init结构体初始化函数 cdev_add 添加到linux内核 cdev_del内 ...

  9. linux mdev 命令,linux设备驱动----利用mdev(udev)自动创建设备文件节点

    1.mdev的使用方法和原理: mdev是busybox 自带的一个简化版的udev,适合于嵌入式的应用埸合.其具有使用简单的特点.它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程 ...

最新文章

  1. 前端学习 -- Css -- 盒子模式
  2. 带你认识“货真价实”的P2P网贷风控
  3. VTK:字形2D用法实战
  4. PID入门的十五个基本概念
  5. LeetCode 617合并二叉树-简单
  6. java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?
  7. 【转载】我只是随便说说的即时通讯
  8. 创建设计模式 - 抽象工厂设计模式
  9. Disruptor本地线程队列_实现线程间通信---线程间通信工作笔记001
  10. 【干货】华为-智能世界2030:构建万物互联的智能世界
  11. Java中的文件压缩
  12. VC InitInstance函数
  13. NO.170 六问禅道1:为什么任务的剩余工时不自动更新?
  14. .net反混淆脱壳工具de4dot的使用
  15. lbochs模拟器最新版_Bochs模拟器下载_Bochs模拟器免费[系统增强]-下载之家
  16. 打造自己的MyLifeOrganized 2(MLO2)云同步
  17. pthon图片信息-3cv2-高阶处理
  18. 25岁就死了,75才埋,程序员们的中年危机:有点懵
  19. AD中T型节点添加泪滴失败,原因是T型走线有问题
  20. 身份证读卡器 浏览器插件

热门文章

  1. SpringMVC学习笔记整理
  2. Codeforces Round #318 (Div. 2) B Bear and Three Musketeers (暴力)
  3. .NET通用基本权限系统
  4. HadoopSourceAnalyse --- Nodemanager Container request handler
  5. php接口开发 安全_PHP开发api接口安全验证的实例讲解
  6. python文件的读取与写入_python中文件的读取与写入以及os模块
  7. python怎么打开程序管理器_Python 进程管理工具 Supervisor 使用教程
  8. java comparator_Java基础之String漫谈(二)
  9. java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...
  10. python 编码声明位置,python中的编码声明