驱动框架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”這個類名。
(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í)行順序更早。
- 內核將內核啟動時要調用的所有函數歸類,然后每個類按照一定的次序去調用執(zhí)行。
- 這些分類名就叫.initcalln.init,n的值從1到8。
- 內核開發(fā)者在編寫內核代碼時只要將函數設置合適的級別,鏈接的時候,這些函數就會被放入特定的段,內核啟動時再按照(內核鏈接腳本中指定的)段順序去依次執(zhí)行各個段即可。內核鏈接腳本(編譯之后才有)在arch/arm/kernel/vmlinux.lds中。
3、led_class_attrs
- 對應將來/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的基本情况、初步分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 内嵌web,Androi
- 下一篇: 纽曼皮尔逊准则Matlab实现,纽曼-皮