如何创建字符设备char(注册主次设备号)以及生成设备节点

**

自动创建节点

**
在驱动中加入对 udev 的支持(自动创建设备节点)的主要做法是:在驱动初始化的代码里调用 class_create() 为该设备创建一个 class,再为每个设备调用 device_create() 创建对应的设备。

内核中定义的 struct class 结构体,顾名思义,一个 struct class 结构体类型的变量对应一个类,内核同时提供了 class_create() 函数,可以用它来创建一个类(class),这个类(class)存放在 sysfs 下面,一旦创建好了这个类,再调用 device_create() 函数来在 /dev 目录下创建相应的设备节点。

这样,加载模块的时候,用户空间中的 udev 会自动响应 device_create() 函数,去 /sysfs 下寻找对应的类,从而在/dev 创建设备节点。
例如:


static int led_init()
{
    major = register_chrdev(0, "led_drv", &led_fops);  //注册设备,同时注册主设备号
    led_drv_class = class_create("THIS_MODULE", "led_drv");   //将放于/sysfs                    查看#ls /sys/class 
    device_create(led_drv_class, NULL, MKDEV(major, 0), NULL, "myled");  //生成设备节点将存放于/dev,这条函数也会注册次设备号
    return 0;
}

static void led_exit()
{
    unregister_chrdev(major, "led_drv");
    device_destroy(led_drv_class, MKDEV(major, 0));
    class_destroy(led_drv_class);
}

宏:

MKDEV(MAJOR, MINOR);  

说明: 获取设备在设备表中的位置。

MAJOR   主设备号
 
MINOR   次设备号   //1 ~ 250 (次设备号的 0 不能使用)

注意:杂项设备主设备号固定为10

之前写的字符类设备驱动,没有自动创建设备节点,因为只使用了register_chrdev()函数,只是注册了这个设备。然后在系统启动后,就要自己创建设备节点mknod,

register_chrdev(MEM_MAJOR,“mem”,&memory_fops) 向内核注册了一个字符设备(不只是注册了设备号,还做了 cdev 的初始化以及 cdev 的注册)。第一个参数为主设备号,0代表动态分配,这里的 MEM_MAJOR 为1;第二个参数是设备的名字;第三个参数为文件操作指针,完成注册后,在 /proc/devices 中第一个字符设备我们就看到了 :/mem。

怎样查看内核中已经注册过的字符设备驱动(和块设备驱动)以及主设备号:cat /proc/devices

/ # cat /proc/devices
cat /proc/devices
Character devices:
  1 mem
256 msm_rng
  4 /dev/vc/0
  4 tty
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
 10 misc
 13 input
 21 sg
 86 ch
 89 i2c
 90 mtd
108 ppp
116 alsa
246 dia
247 smdpkt
248 smd
249 ttyHSL
250 ttyHS
251 bsg
252 rtc
253 msm_thermal_query
254 msm_sps

Block devices:
  1 ramdisk
259 blkext
  7 loop
  8 sd
 31 mtdblock
 65 sd
 66 sd
 67 sd

**

字符设备号简介

**
Linux 的设备管理是和文件系统紧密结合的, 各种设备都以文件的形式存放在/dev 目录下, 称为设备文件。 应用程序可以打开、 关闭和读写这些设备文件, 完成对设备的操作, 就像操作普通的数据文件一样。为了管理这些设备, 系统为设备编了号, 每个设备号又分为主设备号和次设备号。 主设备号用来区分不同类型的设备, 而次设备号用来区分同一类型的多个设备。

**

杂项设备的设备节点名字,对应驱动中的.name。

**例如:
驱动文件中如下定义:

static struct miscdevice pin_test_misc ={
	.minor = MISC_DYNAMIC_MINOR,
	.name  = "pintest_gpio",
	.fops  = &pin_fops,
};

那么会在/dev下生成pintest_gpio的设备节点。则对应的在/proc/misc下也有个pintest_gpio名字

怎样查看内核中已经注册过的杂项设备以及次设备号:cat /proc/misc

/sys # cat /proc/misc
cat /proc/misc
 46 embms_tm_device
 47 android_serial_device
 48 usb_accessory
 49 android_rndis_qc
 50 mtp_usb
 51 ccid_bulk
 52 ccid_ctrl
 53 dpl_ctrl
 54 rmnet_ctrl3
 55 rmnet_ctrl2
 56 rmnet_ctrl1
 57 rmnet_ctrl
 58 android_mbim
 92 pintest_gpio

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值