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

上一节文章链接: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. (转)JS之——解决IE6、7、8使用JSON.stringify报JSON未定义错误的问题
  2. 析构函数和动态内存管理
  3. 虚函数表 对C++ 了解的人都应该知道虚函数
  4. maven工程分开common和server
  5. 如何对namedtuples列表进行排序
  6. 《Hack与HHVM权威指南》——1.1 为什么使用类型检查器
  7. 前端开发如何独立解决跨域问题
  8. linux选择内核命令,Lenky个人站点
  9. windows server 2008 R2 集成USB3.0驱动--成功实现
  10. 阿里云服务器搭建私人云盘
  11. 布丰投针问题和蒙特卡洛方法
  12. 安徽省二级计算机证书,在哪个网站打印安徽省二级计算机证书?
  13. 双系统windows+linux如何正确删除linux
  14. 【UI/UE设计师】banner设计原则-CSDN公开课-专题视频课程
  15. R语言课上笔记(第1-4天)
  16. 水星mw300r虚拟服务器,水星(Mercury)MW300R无线路由器设置
  17. 反转链表-就地逆置法
  18. 目标检测 IoU、GloU、DloU、CloU详解
  19. 易拉罐WiFi收集器
  20. cyt の heart

热门文章

  1. web前端开发最佳实践--(笔记之JavaScript最佳实践)
  2. wcf rest系列文章
  3. PL/SQL 08 异常 exception
  4. 查找出系统中大于50k 且小于100k 的文件并删除。
  5. QI实例-改变空间参考
  6. 《软件》2011年第6期刊登出 《DB 查询分析器》中断SQL语句的执行
  7. php签名墙,肺功能检查质量控制网
  8. c语言设计 数组的知识点,C语言程序设计知识点及示例.pdf
  9. Error - Found cycle in the ListNode
  10. 160 - 22 CarLitoZ.1