由于没有这样的设备或地址,打开设备文件失败
Opening a device file fails due to No such device or address
我正在尝试创建一个字符设备驱动程序(内核模块)。
模块被加载,创建字符设备,如下所示:
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;
谁能帮我找出错误?如有必要,我将 post 完整代码。
您已经使用 sysfs 注册了您的设备,这使它变得可见(并且 udev 可以创建设备文件)。但是,您没有注册实际设备。您已分配了一个主要未成年人,但他们没有连接到您的驱动程序。
很可能您跳过了调用 cdev_add
。
简而言之,顺序是:
alloc_chrdev_region
为您提供了一系列 major/minor 您可以使用的设备 ID,保证仅适用于您的设备。
cdev_add
为这些 ID 注册实际的处理程序(如果您的设备设置了预分配区域,例如 /dev/null 或 [=24,您可以在不调用 alloc_chrdev_region
的情况下调用它=]).
我正在尝试创建一个字符设备驱动程序(内核模块)。 模块被加载,创建字符设备,如下所示:
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;
谁能帮我找出错误?如有必要,我将 post 完整代码。
您已经使用 sysfs 注册了您的设备,这使它变得可见(并且 udev 可以创建设备文件)。但是,您没有注册实际设备。您已分配了一个主要未成年人,但他们没有连接到您的驱动程序。
很可能您跳过了调用 cdev_add
。
简而言之,顺序是:
alloc_chrdev_region
为您提供了一系列 major/minor 您可以使用的设备 ID,保证仅适用于您的设备。
cdev_add
为这些 ID 注册实际的处理程序(如果您的设备设置了预分配区域,例如 /dev/null 或 [=24,您可以在不调用 alloc_chrdev_region
的情况下调用它=]).