字元裝置驅動2 易錯點 註冊 登出

2021-09-08 17:22:28 字數 3098 閱讀 5805

概要:

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時分配裝置號不足的錯誤示範

正確**及現象:

1

static

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

正確**及現象:

static

void

__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 ...