日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字符设备驱动高级篇1——新接口介绍

發布時間:2023/12/20 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符设备驱动高级篇1——新接口介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下內容源于朱有鵬《物聯網大講堂》課程的學習整理,如有侵權,請告知刪除。


一、概覽

1、新接口與老接口

(1)老接口:register_chrdev()

  • 通過第一個參數是否為0,判斷內核是否自動分配設備號,或者就是該參數表示的設備號;
  • 此函數完成設備號分配,以及注冊設備驅動的功能;

(2)新接口:register_chrdev_region()?+cdev_add()

  • 先注冊設備號,然后再注冊設備驅動
  • 卸載時先卸載設備驅動,然后注銷設備號。
  • register_chrdev_region()(傳參表示要某個設備號),或者alloc_chrdev_region()(讓內核自動分配設備號)。
  • cdev_add()(注冊設備驅動)。

2、新接口涉及的內容

(1)cdev結構體


(2)設備號

  • 由主設備號和次設備號組成;
  • 屬于dev_t類型(其實就是int類型);
  • MKDEV(由主次設備號得出設備號);
  • MAJOR(從設備號中提取主設備號);
  • MINOR(從設備號中提取次設備號);

(3)相關函數

  • cdev_alloc:分配空間
  • cdev_init:初始化
  • cdev_add:注冊驅動
  • cdev_del:注銷驅動

(3)總結

  • 使用register_chrdev_region (申請設備號)+ cdev_init(分配空間) + cdev_add(注冊設備驅動)進行字符設備驅動注冊;
  • 使用cdev_del(注銷設備驅動)+unregister_chrdev_region(注銷設備號)來注銷字符設備驅動。
  • 即新接口將老接口的一步分為兩步完成:申請設備號,然后注冊設備驅動。


二、接口函數

1、register_chrdev_region函數申請想要的設備號

  • 此函數用來申請設備號(包括主次設備號);
  • 假如是 200(主設備號), 0 1 2 3(次設備號) ,則from為MKDEV(200,0)(MKDEV用來合成設備號,0表示起始次設備號),count為4(表示有四個次設備號);



2、alloc_chrdev_region函數自動分配設備號

  • register_chrdev_region,要事先知道所使用的主、次設備號,則要先用cat /proc/devices查看有沒有使用。
  • 可以使用alloc_chrdev_region,讓內核自動分配一個主設備號。
  • 如果申請成功,則把得到的設備號放入第一個參數dev中。

? ? ? ??


3、cdev_init函數? ? ? ? ? ? ??

  • 主要將cdev和fops關聯起來。將傳入的文件操作結構體指針賦值給cdev的ops
? ? ? ? ?
  • 可以不使用此函數,直接用下面的代碼。
//cdev_init(pcdev, &test_fops);pcdev->owner = THIS_MODULE;pcdev->ops = &test_fops;


4、cdev_add函數

  • 此函數用來注冊設備驅動。


5、cdev_alloc函數


(1)函數


(2)從內存角度體會cdev_alloc用與不用的差別
//static struct cdev test_cdev;//這個變量分配在數據段,整個程序運行期間都存在,不夠靈活static struct cdev *pcdev; //只占4個字節,之后cdev_alloc給它實例化,分配在堆上,可以按需分配。由cdev_del釋放pcdev = cdev_alloc(); // 給pcdev分配內存,指針實例化

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

6、代碼

(1)注冊

  • 先注冊主次設備號,然后才使用cdev_add()注冊字符設備

// 使用新的cdev接口來注冊字符設備驅動,需要2步// 第1步:注冊主次設備號mydev = MKDEV(MYMAJOR, 0);//MYMAJOR在這里是200,這里合成了要申請的設備號,即200,0retval = register_chrdev_region(mydev, MYCNT, MYNAME);//這里申請剛才合成的設備號if (retval) {printk(KERN_ERR "Unable to register minors for %s\n", MYNAME);return -EINVAL;}printk(KERN_INFO "register_chrdev_region success\n");// 第2步:注冊字符設備驅動cdev_init(&test_cdev, &test_fops);//這步其實可以用其他代碼來代替,見下節retval = cdev_add(&test_cdev, mydev, MYCNT);//注冊字符設備驅動if (retval) {printk(KERN_ERR "Unable to cdev_add\n");return -EINVAL;}printk(KERN_INFO "cdev_add success\n");


(2)注銷

// 使用新的接口來注銷字符設備驅動,注銷分2步:// 第一步真正注銷字符設備驅動用cdev_delcdev_del(&test_cdev);// 第二步去注銷申請的主次設備號unregister_chrdev_region(mydev, MYCNT);


總結

以上是生活随笔為你收集整理的字符设备驱动高级篇1——新接口介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。