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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

驱动框架2——内核驱动框架中LED的基本情况、初步分析

發(fā)布時間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 驱动框架2——内核驱动框架中LED的基本情况、初步分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下內容源于朱有鵬嵌入式課程的學習,如有侵權,請告知刪除。


一、內核驅動框架中LED的基本情況

1、相關文件

(1)drivers/leds目錄
  • 驅動框架規(guī)定的LED這種硬件的驅動應該待的地方。

(2)drivers/leds目錄下有l(wèi)ed-class.c和led-core.c

  • 屬于LED驅動框架的第一部分。
  • 由內核開發(fā)者提供的。
  • 描述的是內核中所有廠家的不同LED硬件的相同部分的邏輯。

(3)leds-xxxx.c文件

  • 屬于LED驅動框架的第二部分。
  • 由不同廠商的驅動工程師編寫添加的;
  • 廠商驅動工程師結合自己公司的硬件的不同情況來對LED進行操作,使用第一部分提供的接口來和驅動框架進行交互,最終實現驅動的功能。

2、九鼎移植的內核中l(wèi)ed驅動

  • 九鼎實際未使用內核推薦的led驅動框架;也就是說,不一定要用框架來實現
  • drivers/char/led/x210-led.c;

3、案例分析驅動框架的使用

(1)以leds-s3c24xx.c為例

  • leds-s3c24xx.c中通過調用led_classdev_register來完成LED驅動的注冊,而led_classdev_register是在drivers/leds/led-class.c中定義的。
  • 所以其實SoC廠商的驅動工程師是調用內核開發(fā)者在驅動框架中提供的接口來實現自己的驅動的。

(2)驅動框架的關鍵點

  • 內核開發(fā)者提供了什么?
  • 驅動開發(fā)者要完成什么?

4、典型的驅動開發(fā)行業(yè)現狀

(1)內核開發(fā)者對驅動框架進行開發(fā)和維護、升級,對應led-class.c和led-core.c;

(2)SoC廠商的驅動工程師對設備驅動源碼進行編寫、調試,提供參考版本,對應leds-s3c24xx.c;(全志、三星、華為等芯片廠商)

(3)做產品的廠商的驅動工程師以SoC廠商提供的驅動源碼為基礎,來做移植和調試;


二、初步分析LED框架代碼

1、包含的文件

  • led-core.c(一些宏與頭文件包含而已)
  • led-class.c(重點)

(1)LED驅動框架中,內核開發(fā)者實現的部分主要是led-class.c;

(2)led-class.c是一個內核模塊(有安裝和卸載函數)

  • 對led-class.c的分析應該從下往上,遵從對模塊的基本分析方法。

(3)為什么LED驅動框架中,內核開發(fā)者實現的部分,要實現成一個模塊?

  • 因為內核開發(fā)者希望這個驅動框架是可以被裝載/卸載的。
  • 這樣當內核使用者不需要這個驅動框架時可以完全去掉,需要時可以隨時加上。

(4)led_init在/sys/class目錄下創(chuàng)建“l(fā)eds”這個類名;led_exit銷毀“l(fā)eds”這個類名。


2、subsys_initcall




(1)subsys_initcall是一個宏

  • 定義在linux/init.h中。
  • 功能是將其聲明的函數放到一個特定的段:.initcall4.init。

(2)分析module_init宏,可以看出它將函數放到了.initcall6.init段中。

  • module_init—》__initcall—》device_initcall—》__define_initcall("6",fn,6)。
  • 經過分析可以看出,subsys_initcall和module_init的作用是一樣的,只不過前者所聲明的函數要比后者在內核啟動時的執(zhí)行順序更早。
(3)內核如何實現按照先后順序去做很多初始化操作?
  • 內核將內核啟動時要調用的所有函數歸類,然后每個類按照一定的次序去調用執(zhí)行。
  • 這些分類名就叫.initcalln.init,n的值從1到8。
  • 內核開發(fā)者在編寫內核代碼時只要將函數設置合適的級別,鏈接的時候,這些函數就會被放入特定的段,內核啟動時再按照(內核鏈接腳本中指定的)段順序去依次執(zhí)行各個段即可。內核鏈接腳本(編譯之后才有)在arch/arm/kernel/vmlinux.lds中。

3、led_class_attrs







(1)什么是attribute?
  • 對應將來/sys/class/leds/目錄里的內容,一般是文件和文件夾。
  • 這些文件其實就是sysfs開放給應用層的一些操作接口(非常類似于/dev/目錄下的那些設備文件,對這些設備文件的操作API,對應file_operations里面的函數)。
  • 讓應用程序可以通過/sys/class/leds/目錄下面的屬性文件來操作驅動進而操作硬件設備。

(2)attribute有什么用?

  • attribute其實是另一條驅動實現的路線(不再有c_dev相關的函數操作),有區(qū)別于之前講的file_operations那條線。

4、led_classdev_register設備注冊函數

  • led_classdev_register函數創(chuàng)建一個屬于leds這個類的一個設備,其實就是去注冊一個設備。
  • 這個函數是led驅動框架中,內核開發(fā)者提供給SoC廠家驅動開發(fā)者的一個注冊驅動的接口。
  • 當使用led驅動框架去編寫驅動的時候,這個led_classdev_register函數的作用類似于之前使用file_operations方式去注冊字符設備驅動時的register_chrdev函數。
  • 之前使用file_operations方式時,在sys/class目錄下創(chuàng)建一個類,然后再創(chuàng)建屬于這個類的一個設備。

5、led_classdev結構體

w




總結

以上是生活随笔為你收集整理的驱动框架2——内核驱动框架中LED的基本情况、初步分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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