由于没有此类设备或地址,因此无法打开设备文件

时间:2016-10-13 04:20:47

标签: c linux kernel-module chardev

我正在尝试创建一个字符设备驱动程序(内核模块)。 模块被加载,创建字符设备,如下所示:

    root@imx6x-std:~# ls -l /dev/socledchrdevregion
crw-rw-rw-    1 root     root      246,   0 Jan  1 08:56 /dev/socledchrdevregion

但是当我尝试使用测试应用程序打开设备时(除了打印调试消息之外,驱动程序中的open函数没有做任何特殊操作),我收到错误:

root@imx6x-std:~# ./led_ioctltest
led_ioctltest: open /dev/socledchrdevregion failed due to No such device or addres

以下是/ proc / devices的内容:

    root@imx6x-std:~# cat /proc/devices
Character devices:
  1 mem
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
 10 misc
 13 input
 29 fb
 81 video4linux
 89 i2c
 90 mtd
116 alsa
128 ptm
136 pts
153 spi
180 usb
189 usb_device
199 galcore
207 ttymxc
244 vuc_sim
245 vuc
246 socledchrdevregion
247 ubi0
248 mxc_src
249 mxc_vpu
250 conti_kmod_tracing
251 mxc_ipu
252 ptp
253 pps
254 rtc

Block devices:
259 blkext
 31 mtdblock
179 mmc

该设备的主要编号为246。

这是我尝试打开设备的方式:

 #define DEVICE "/dev/socledchrdevregion"
fd = open(DEVICE, O_RDONLY);

这是LKM的片段:

if ((ret = alloc_chrdev_region(&first, 0, 1, DEVICE_NAME)) < 0)
{
        printk(KERN_ERR PRINTK_CONTEXT": FAILED TO ALLOCATE CHRDEVREGION \n");
        return -1;
}

printk(KERN_INFO PRINTK_CONTEXT": ALLOCATE CHRDEVREGION SUCCESS \n");

classptr = class_create(THIS_MODULE, "socledclass");
device_create(classptr, NULL, first, NULL, DEVICE_NAME);
printk(KERN_INFO "PRINTK_CONTEXT: DEVICE CREATED \n");
led_cdevptr = cdev_alloc();
led_cdevptr->ops = &led_fops;

有人可以帮我找到错误吗?如有必要,我会发布完整的代码。

1 个答案:

答案 0 :(得分:3)

您已使用sysfs注册了设备,这会使其变为可见(并且udev可以创建设备文件)。但是,您没有注册实际设备。你有一个主要的未成年人,但他们没有连接到你的司机。

很可能,您已跳过调用cdev_add

简而言之,顺序是: alloc_chrdev_region为您提供了一系列可以使用的主要/次要设备ID,保证仅适用于您的设备。

cdev_add为这些ID注册实际处理程序(如果您的设备设置了预分配区域,则可以在不调用alloc_chrdev_region的情况下调用它,例如/ dev / null或/ dev / random)。