linux 设备 major 253,浅析/dev/bus/usb/下的major主设备号189和动态253对应的内核驱动...

浅析/dev/bus/usb/下的major主设备号189和动态253对应的内核驱动

drivers/usb/core/devio.c

usb_devio_init

==>

const struct file_operations usbdev_file_operations = {

.owner =     THIS_MODULE,

.llseek =    usbdev_lseek,

.read =        usbdev_read,

.poll =        usbdev_poll,

.ioctl =    usbdev_ioctl,

.open =        usbdev_open,

.release =    usbdev_release,

};

usbdev_ioctl

==>

#define USBDEVFS_CONTROL           _IOWR('U', 0, struct usbdevfs_ctrltransfer)

#define USBDEVFS_BULK              _IOWR('U', 2, struct usbdevfs_bulktransfer)

case USBDEVFS_CONTROL:

proc_control(ps, p);

luther@gliethttp:~$ ll /dev/bus/usb/001/

total 0

crw-rw-r-- 1 root root 189, 4 2009-07-15 08:10 005

crw-rw-r-- 1 root root 189, 5 2009-07-15 08:12 006

crw-rw-r-- 1 root root 189, 0 2009-07-15 15:17 001

至于/dev/usbdev*主设备号253,是每个usb设备具有的端点控制接口

generic_probe

==>usb_create_sysfs_dev_files

==*>usb_create_ep_files(dev, &udev->ep0, udev);

==**>ep_dev->dev.devt = MKDEV(usb_endpoint_major, ep_dev->minor); // 这里usb_endpoint_major就是253

init_endpoint_class

==>usb_endpoint_major_init();

#define MAX_ENDPOINT_MINORS (64*128*32) // 最多观测endpoint数目

==*>alloc_chrdev_region(&dev, 0, MAX_ENDPOINT_MINORS, "usb_endpoint");

==*>usb_endpoint_major = MAJOR(dev); // 将alloc_chrdev_region动态申请的major号添进去.

luther@gliethttp:/vobs/libusb$ ll /dev/usbdev*

crw-rw---- 1 root root 253,  9 2009-07-14 18:48 /dev/usbdev1.5_ep00

crw-rw---- 1 root root 253,  6 2009-07-14 18:48 /dev/usbdev1.5_ep01

crw-rw---- 1 root root 253,  7 2009-07-14 18:48 /dev/usbdev1.5_ep82

crw-rw---- 1 root root 253,  8 2009-07-14 18:48 /dev/usbdev1.5_ep83

crw-rw---- 1 root root 253, 10 2009-07-14 19:33 /dev/usbdev2.19_ep81

crw-rw---- 1 root root 253, 11 2009-07-14 19:33 /dev/usbdev2.19_ep00

crw-rw---- 1 root root 253, 14 2009-07-14 19:33 /dev/usbdev2.20_ep00

crw-rw---- 1 root root 253, 12 2009-07-14 19:33 /dev/usbdev2.20_ep81

crw-rw---- 1 root root 253, 13 2009-07-14 19:33 /dev/usbdev2.20_ep02

crw-rw---- 1 root root 253,  0 2009-07-15 02:03 /dev/usbdev1.1_ep81

crw-rw---- 1 root root 253,  1 2009-07-15 02:03 /dev/usbdev1.1_ep00

crw-rw---- 1 root root 253,  3 2009-07-15 02:03 /dev/usbdev2.1_ep00

crw-rw---- 1 root root 253,  2 2009-07-15 02:03 /dev/usbdev2.1_ep81

crw-rw---- 1 root root 253,  5 2009-07-15 02:03 /dev/usbdev2.2_ep00

crw-rw---- 1 root root 253,  4 2009-07-15 02:03 /dev/usbdev2.2_ep81

luther@gliethttp:~$ ls /sys/class/usb_endpoint

usbdev1.1_ep00  usbdev1.3_ep81  usbdev2.1_ep00  usbdev3.1_ep81  usbdev5.1_ep00  usbdev6.1_ep81

usbdev1.1_ep81  usbdev1.5_ep00  usbdev2.1_ep81  usbdev4.1_ep00  usbdev5.1_ep81  usbdev7.1_ep00

usbdev1.3_ep00  usbdev1.5_ep81  usbdev3.1_ep00  usbdev4.1_ep81  usbdev6.1_ep00  usbdev7.1_ep81

阅读(5455) | 评论(0) | 转发(0) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如前所述,Linux内核中的设备节点是通过设备驱动程序注册实现的。设备驱动程序注册的函数是register_chrdev,该函数的原型定义在头文件linux/fs.h中: ``` int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops); ``` 其中,major是设备主设备,name是设备节点的名称,fops是一个指向file_operations结构体的指针,该结构体包含了设备操作函数的地址。 设备驱动程序在初始化时调用register_chrdev函数来注册设备,如下所示: ``` static struct file_operations fops = { .owner = THIS_MODULE, .read = device_read, .write = device_write, }; static int __init my_init(void) { int ret = 0; /* 申请设备 */ dev = MKDEV(dev_major, dev_minor); ret = register_chrdev(dev_major, "my_dev", &fops); if (ret < 0) { printk(KERN_ALERT "failed to register device\n"); return ret; } /* 其他初始化操作 */ return ret; } static void __exit my_exit(void) { /* 卸载设备 */ unregister_chrdev(dev_major, "my_dev"); /* 其他清理操作 */ } module_init(my_init); module_exit(my_exit); ``` 在这段代码中,我们定义了一个file_operations结构体,它包含了设备操作函数的地址。然后,我们在驱动程序初始化时调用register_chrdev函数来注册设备节点。如果注册成功,系统会为该设备节点创建一个文件,并将其挂载到/dev目录下。当设备节点被打开时,内核就会调用file_operations结构体中的对应操作函数来处理读写等操作。最后,在驱动程序退出时,我们需要调用unregister_chrdev函数来卸载设备节点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值