Не удается открыть файл устройства из-за отсутствия такого устройства или адреса
Я пытаюсь создать драйвер символьного устройства (модуль ядра). Модуль загружается, создает символьное устройство, как показано ниже:
root@imx6x-std:~# ls -l /dev/socledchrdevregion
crw-rw-rw- 1 root root 246, 0 Jan 1 08:56 /dev/socledchrdevregion
Но когда я пытаюсь открыть устройство с помощью тестового приложения (функция открытия внутри драйвера не делает ничего особенного, кроме печати сообщения отладки), я получаю сообщение об ошибке:
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 ответ
Вы зарегистрировали ваше устройство с помощью sysfs, что делает его видимым (и udev создает файл устройства). Вы, однако, не зарегистрировали фактическое устройство. Вам назначен старший несовершеннолетний, но он не связан с вашим водителем.
По всей вероятности, вы пропустили звонок cdev_add
,
Вкратце, последовательность такова:alloc_chrdev_region
дает вам ряд основных / второстепенных идентификаторов устройств, которые вы можете использовать, которые гарантированно будут только для вашего устройства.
cdev_add
зарегистрировать фактические обработчики для этих идентификаторов (вы можете позвонить без вызова alloc_chrdev_region
если ваше устройство имеет предварительно выделенный регион, например /dev/null или /dev/random).