概要:
cdev_add時分配裝置號不足的錯誤示範unregister_chrdev_region沒有完全登出裝置
error, can't open /dev/led1
insmod: cannot insert '/module/myleds_new.ko': file exists (-1): file exists
1.cdev_add時分配裝置號不足的錯誤示範
正確**及現象:
1static
int__init s3c24xx_leds_init()
2else
13if(ret<0)16
17//
初始化並新增cdev結構體
18 cdev_init(&leds_cdev , &s3c24xx_leds_fops );
19 leds_cdev.owner =this_module ;
20 leds_cdev.ops = &s3c24xx_leds_fops;
21 ret = cdev_add(&leds_cdev , devno , leds_dev_count);
22 printk("
cdev_add(&leds_cdev , devno , 4);\n");
23//
這裡因為下面要建立四個子裝置,因此必須至少 4個(leds_dev_count)。否則,使用該裝置是,子裝置0後面的裝置是無法使用的
24//
現象見下面的:「cdev_add時分配裝置號不足的錯誤示範」。
2526
if(ret)
2930
//oo00 :begin : 分配了四個子裝置號 minor == 0 1 2 3
31//
class_create動態建立裝置的邏輯類,並完成部分欄位的初始化,然後將其新增到核心中。建立的邏輯類位於/sys/class/。
32 leds_class = class_create(this_module, "
leds");
33if
(is_err(leds_class))
34return
ptr_err(leds_class);
3536 leds_class_devs[0] = class_device_create(leds_class, null, mkdev(leds_major, 0), null, "
leds");
3738
for (minor = 1; minor < 4; minor++)
43//
oo00 :end
4445
//prow: device_create ? or class_device_create?
4647 printk(leds_dev_name"
initialized\n");
4849
return0;
50}5152
現象:53
# insmod myleds_new.ko
54 cdev_add(&leds_cdev , devno , 4
);55
leds initialized
56 # ./ledtest /dev/leds on
57 info new: in s3c24xx_leds_ioctl!
58 # ./ledtest /dev/led1 off
59 info new: in s3c24xx_leds_ioctl!
錯誤**及現象:
ret = cdev_add(&leds_cdev , devno , 1);printk(
"cdev_add(&leds_cdev , devno , 1);\n");
現象:insmod正常,cat /proc/devices 能看見 leds 231
# insmod myleds_new.ko
cdev_add(&leds_cdev , devno , 1);//
printk , 分配數量不夠
leds initialized //
printk
# ./ledtest /dev/leds on
info
new: in s3c24xx_leds_ioctl!# ./ledtest /dev/led1 off
error, can
't open /dev/led1
2.unregister_chrdev_region沒有完全登出裝置
void unregister_chrdev_region(dev_t from, unsigned count); //count: the number of device numbers to unregister
正確**及現象:
staticvoid
__exit s3c24xx_leds_exit()
class_destroy(leds_class);
cdev_del(&leds_cdev);//
刪除結構體
unregister_chrdev_region(devno, leds_dev_count);//
登出裝置區域,正確的,將4個子裝置域都登出了}//
執行rmmod之後,cat /proc/devices 沒有leds 231
錯誤**及現象:
unregister_chrdev_region(devno, 1);//登出裝置區域, 4個子裝置域沒有完全登出
//執行rmmod之後,cat /proc/devices 仍有leds 231,並導致下次insmod失敗。並且此時leds裝置實體已經被登出了。
02 註冊字元裝置驅動
從核心中最簡單的驅動程式入手,描述linux驅動開發,主要文章目錄如下 持續更新中 01 第乙個核心模組程式 02 註冊字元裝置驅動 03 open close 函式的應用 04 read write 函式的應用 05 ioctl 的應用 06 ioctl led燈硬體分析 07 ioctl 控制l...
字元裝置驅動 2
大部分字元驅動設計三個重要的資料結構 struct file operations struct file struct inode 一 檔案操作 在之前的一篇文章中已經有介紹了如何去生情字元裝置裝置號,但是沒有做任何的工作,也就只能寫乙個不能工作的字元裝置 struct file operatio...
字元裝置驅動 2
參考 宋寶華 linux裝置驅動開發詳解 嵌入式linux驅動開發教程 開發環境 ubuntu16.04 核心版本 4.13.0 36 generic 主要目的 學習字元裝置的編寫 疑問 為何cat dev globalmem會執行兩次?file opration中的函式和open release ...