使用cdev

您所在的位置:网站首页 cdev_add形参含义 使用cdev

使用cdev

2023-08-06 04:54| 来源: 网络整理| 查看: 265

《Linux 设备驱动程序》P61页,“早期的办法”节上说“注册一个字符设备驱动程序的经典方法是:int register_chrdev(... ...);”在上一节“字符设备的注册”给出的注册方法是:定义cdev型结构体、cdev_init()、cdev_add()实现注册。

        我将“006_u-boot_内核_根文件系统(新1期_2期间的衔接)”的“first_drv.c”中static int first_drv_init(void){}的major = register_chrdev();这一句改为

static cdev myCdev;

cdev_init(&myCdev, &first_drv_fops);

myCdev.owner=THIS_MODULE;

myCdev.ops=&first_drv_fops;cdev_add(&myCdev,123,1);         //自定设备号123

        static void first_drv_exit(void){}的unregister_chrdev(major, "first_drv");这一句改为cdev_del(&myCdev);

        其他语句不变,依然使用udev机制,使用make生成first_drv.ko,makefile中KERN_DIR为linux-2.6.22.6。内核和根文件系统为JZ2440V3出厂自带(没有重新烧过)。

        在开发板上#insmod first_drv.ko之后,#lsmod显示first_drv加载,#cat /proc/devices/没有找到设备,#ls /dev/可以找到设备“xyz”,设备号123。使用自带的./firstdrvtest on/off可以开/关灯。

        如果使用没有更改的“first_drv.c”相同的环境make生成first_drv.ko,开发板上#insmod first_drv.ko之后,/proc/devices和/dev/下都有设备,使用自带的./firstdrvtest on/off可以开/关灯。

        我使用的是ubuntu16.04,非虚拟机,arm-linux-gcc为“\006_u-boot_内核_根文件系统(新1期_2期间的衔接)\所有资料\交叉编译器”下的arm-linux-gcc-3.4.5-glibc-2.3.6

        另外,相同修改,forth_drv.c按键中断方式,反应相同,同样是/proc/devices没设备。

        我想问:为什么/proc/devices没有找到设备?而且我发现/dev/下的设备数量明显多于/proc/devices中的设备数量。这两个地方有什么不同?

//

字符设备驱动程序的另外一种写法不是这样的吧,我是这样写的,可以参考一下:

attachments-2020-05-NTGXgtWX5ec6c2e001774.jpg

attachments-2020-05-jZOGce5l5ec6c24baedcf.jpg

实际上就是你没有创建设备文件,自然就找不到了啊。

 

看来 少写了alloc_chrdev_region(),虽然在/proc/devices下没有设备,但是依然可以运行成功。还是不知道/proc/devices中设备的作用,似乎不如/dev/目录下设备有用

 

一个驱动程序中只能有一个主设备号,但是可以有多个次设备号;一个驱动程序中可以有多个字符设备,在每一个字符设备下面又可以创建多个字符设备文件,那么这些字符设备文件的主设备号都是一样的,只有次设备号是不一样的。 /proc/devices下就是字符设备的名字,而/dev目录下才是具体的字符设备文件,也就是说在/dev目录下的某些字符设备文件是属于/proc/devices下的某个字符设备。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3