驱动框架2——内核驱动框架中LED的基本情况、初步分析
以下內(nèi)容源于朱有鵬嵌入式課程的學(xué)習(xí),如有侵權(quán),請(qǐng)告知?jiǎng)h除。
一、內(nèi)核驅(qū)動(dòng)框架中LED的基本情況
1、相關(guān)文件
(1)drivers/leds目錄- 驅(qū)動(dòng)框架規(guī)定的LED這種硬件的驅(qū)動(dòng)應(yīng)該待的地方。
(2)drivers/leds目錄下有l(wèi)ed-class.c和led-core.c
- 屬于LED驅(qū)動(dòng)框架的第一部分。
- 由內(nèi)核開發(fā)者提供的。
- 描述的是內(nèi)核中所有廠家的不同LED硬件的相同部分的邏輯。
(3)leds-xxxx.c文件
- 屬于LED驅(qū)動(dòng)框架的第二部分。
- 由不同廠商的驅(qū)動(dòng)工程師編寫添加的;
- 廠商驅(qū)動(dòng)工程師結(jié)合自己公司的硬件的不同情況來對(duì)LED進(jìn)行操作,使用第一部分提供的接口來和驅(qū)動(dòng)框架進(jìn)行交互,最終實(shí)現(xiàn)驅(qū)動(dòng)的功能。
2、九鼎移植的內(nèi)核中l(wèi)ed驅(qū)動(dòng)
- 九鼎實(shí)際未使用內(nèi)核推薦的led驅(qū)動(dòng)框架;也就是說,不一定要用框架來實(shí)現(xiàn)
- drivers/char/led/x210-led.c;
3、案例分析驅(qū)動(dòng)框架的使用
(1)以leds-s3c24xx.c為例
- leds-s3c24xx.c中通過調(diào)用led_classdev_register來完成LED驅(qū)動(dòng)的注冊(cè),而led_classdev_register是在drivers/leds/led-class.c中定義的。
- 所以其實(shí)SoC廠商的驅(qū)動(dòng)工程師是調(diào)用內(nèi)核開發(fā)者在驅(qū)動(dòng)框架中提供的接口來實(shí)現(xiàn)自己的驅(qū)動(dòng)的。
(2)驅(qū)動(dòng)框架的關(guān)鍵點(diǎn)
- 內(nèi)核開發(fā)者提供了什么?
- 驅(qū)動(dòng)開發(fā)者要完成什么?
4、典型的驅(qū)動(dòng)開發(fā)行業(yè)現(xiàn)狀
(1)內(nèi)核開發(fā)者對(duì)驅(qū)動(dòng)框架進(jìn)行開發(fā)和維護(hù)、升級(jí),對(duì)應(yīng)led-class.c和led-core.c;
(2)SoC廠商的驅(qū)動(dòng)工程師對(duì)設(shè)備驅(qū)動(dòng)源碼進(jìn)行編寫、調(diào)試,提供參考版本,對(duì)應(yīng)leds-s3c24xx.c;(全志、三星、華為等芯片廠商)
(3)做產(chǎn)品的廠商的驅(qū)動(dòng)工程師以SoC廠商提供的驅(qū)動(dòng)源碼為基礎(chǔ),來做移植和調(diào)試;
二、初步分析LED框架代碼
1、包含的文件
- led-core.c(一些宏與頭文件包含而已)
- led-class.c(重點(diǎn))
(1)LED驅(qū)動(dòng)框架中,內(nèi)核開發(fā)者實(shí)現(xiàn)的部分主要是led-class.c;
(2)led-class.c是一個(gè)內(nèi)核模塊(有安裝和卸載函數(shù))
- 對(duì)led-class.c的分析應(yīng)該從下往上,遵從對(duì)模塊的基本分析方法。
(3)為什么LED驅(qū)動(dòng)框架中,內(nèi)核開發(fā)者實(shí)現(xiàn)的部分,要實(shí)現(xiàn)成一個(gè)模塊?
- 因?yàn)閮?nèi)核開發(fā)者希望這個(gè)驅(qū)動(dòng)框架是可以被裝載/卸載的。
- 這樣當(dāng)內(nèi)核使用者不需要這個(gè)驅(qū)動(dòng)框架時(shí)可以完全去掉,需要時(shí)可以隨時(shí)加上。
(4)led_init在/sys/class目錄下創(chuàng)建“l(fā)eds”這個(gè)類名;led_exit銷毀“l(fā)eds”這個(gè)類名。
(1)subsys_initcall是一個(gè)宏
- 定義在linux/init.h中。
- 功能是將其聲明的函數(shù)放到一個(gè)特定的段:.initcall4.init。
(2)分析module_init宏,可以看出它將函數(shù)放到了.initcall6.init段中。
- module_init—》__initcall—》device_initcall—》__define_initcall("6",fn,6)。
- 經(jīng)過分析可以看出,subsys_initcall和module_init的作用是一樣的,只不過前者所聲明的函數(shù)要比后者在內(nèi)核啟動(dòng)時(shí)的執(zhí)行順序更早。
- 內(nèi)核將內(nèi)核啟動(dòng)時(shí)要調(diào)用的所有函數(shù)歸類,然后每個(gè)類按照一定的次序去調(diào)用執(zhí)行。
- 這些分類名就叫.initcalln.init,n的值從1到8。
- 內(nèi)核開發(fā)者在編寫內(nèi)核代碼時(shí)只要將函數(shù)設(shè)置合適的級(jí)別,鏈接的時(shí)候,這些函數(shù)就會(huì)被放入特定的段,內(nèi)核啟動(dòng)時(shí)再按照(內(nèi)核鏈接腳本中指定的)段順序去依次執(zhí)行各個(gè)段即可。內(nèi)核鏈接腳本(編譯之后才有)在arch/arm/kernel/vmlinux.lds中。
3、led_class_attrs
- 對(duì)應(yīng)將來/sys/class/leds/目錄里的內(nèi)容,一般是文件和文件夾。
- 這些文件其實(shí)就是sysfs開放給應(yīng)用層的一些操作接口(非常類似于/dev/目錄下的那些設(shè)備文件,對(duì)這些設(shè)備文件的操作API,對(duì)應(yīng)file_operations里面的函數(shù))。
- 讓應(yīng)用程序可以通過/sys/class/leds/目錄下面的屬性文件來操作驅(qū)動(dòng)進(jìn)而操作硬件設(shè)備。
(2)attribute有什么用?
- attribute其實(shí)是另一條驅(qū)動(dòng)實(shí)現(xiàn)的路線(不再有c_dev相關(guān)的函數(shù)操作),有區(qū)別于之前講的file_operations那條線。
4、led_classdev_register設(shè)備注冊(cè)函數(shù)
- led_classdev_register函數(shù)創(chuàng)建一個(gè)屬于leds這個(gè)類的一個(gè)設(shè)備,其實(shí)就是去注冊(cè)一個(gè)設(shè)備。
- 這個(gè)函數(shù)是led驅(qū)動(dòng)框架中,內(nèi)核開發(fā)者提供給SoC廠家驅(qū)動(dòng)開發(fā)者的一個(gè)注冊(cè)驅(qū)動(dòng)的接口。
- 當(dāng)使用led驅(qū)動(dòng)框架去編寫驅(qū)動(dòng)的時(shí)候,這個(gè)led_classdev_register函數(shù)的作用類似于之前使用file_operations方式去注冊(cè)字符設(shè)備驅(qū)動(dòng)時(shí)的register_chrdev函數(shù)。
- 之前使用file_operations方式時(shí),在sys/class目錄下創(chuàng)建一個(gè)類,然后再創(chuàng)建屬于這個(gè)類的一個(gè)設(shè)備。
5、led_classdev結(jié)構(gòu)體
w
總結(jié)
以上是生活随笔為你收集整理的驱动框架2——内核驱动框架中LED的基本情况、初步分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 内嵌web,Androi
- 下一篇: 纽曼皮尔逊准则Matlab实现,纽曼-皮