1

キャラクターデバイスドライバー(カーネルモジュール)を作成しようとしています。モードが読み込まれ、以下に示すようにキャラクター デバイスが作成されます。

    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;

誰でもエラーを見つけるのを手伝ってもらえますか? 必要に応じて、完全なコードを投稿します。

4

1 に答える 1

4

デバイスが sysfs に登録されているため、デバイスが表示されます (そして udev がデバイス ファイルを作成します)。ただし、実際のデバイスは登録していません。メジャー マイナーが割り当てられましたが、それらはドライバーに接続されていません。

おそらく、あなたは呼び出しをスキップしcdev_addました。

簡単に言えば、シーケンスは次 のとおりalloc_chrdev_regionです。使用できるメジャー/マイナー デバイス ID の範囲を提供します。これらは、デバイス専用であることが保証されています。

cdev_addalloc_chrdev_regionそれらの ID の実際のハンドラーを登録します (デバイスに /dev/null や /dev/random などの事前割り当て領域が設定されている場合は、呼び出さずに呼び出すことができます)。

于 2016-10-15T13:44:38.640 に答える