1:subsys_initcall宏
#define __define_initcall(level,fn,id) \ static initcall_t __initcall_##fn##id __used \ __attribute__((__section__(".initcall" level ".init"))) = fn #define subsys_initcall(fn) __define_initcall("4",fn,4)
2:module_init宏
module_init
__initcall
device_initcall
__define_initcall("6",fn,6)
通過分析發(fā)現(xiàn),subsys_initcall和module_init這兩個后最終都是調(diào)用__define_initcall();這個宏。
內(nèi)核在啟動過程中需要順序的做很多事,內(nèi)核如何實現(xiàn)按照先后順序去做很多初始化操作。內(nèi)核的解決方案就是給內(nèi)核啟動時要調(diào)用的所有函數(shù)歸類,然后每個類按照一定的次序去調(diào)用執(zhí)行。這些分類名就叫.initcalln.init。n的值從1到8。內(nèi)核開發(fā)者在編寫內(nèi)核代碼時只要將函數(shù)設(shè)置合適的級別,這些函數(shù)就會被鏈接的時候放入特定的段,內(nèi)核啟動時再按照段順序去依次執(zhí)行各個段即可。所以subsys_initcall和module_init的作用是一樣的,都是在內(nèi)核啟動的時候去加載驅(qū)動,不同之處在于內(nèi)核啟動時執(zhí)行的順序不同而已。
3:static int __init leds_init(void)
static int __init leds_init(void) { leds_class = class_create(THIS_MODULE, "leds"); if (IS_ERR(leds_class)) return PTR_ERR(leds_class); leds_class->suspend = led_suspend; leds_class->resume = led_resume; leds_class->dev_attrs = led_class_attrs; return 0; }
這個函數(shù)是作用是通過調(diào)用class_create函數(shù)來創(chuàng)建了一個類名為“l(fā)eds”的設(shè)備類,也就是我們/sys/class/下的leds這個文件夾
4:led_class_attrs
static struct device_attribute led_class_attrs[] = { __ATTR(brightness, 0644, led_brightness_show, led_brightness_store), __ATTR(max_brightness, 0444, led_max_brightness_show, NULL), #ifdef CONFIG_LEDS_TRIGGERS __ATTR(trigger, 0644, led_trigger_show, led_trigger_store), #endif __ATTR_NULL, };
(1)什么是attribute,對應將來/sys/class/leds/目錄里的內(nèi)容,一般是文件和文件夾。這些文件其實就是sysfs開放給應用層的一些操作接口(非常類似于/dev/目錄下的那些設(shè)備文件)
(2)attribute有什么用,作用就是讓應用程序可以通過/sys/class/leds/目錄下面的屬性文件來操作驅(qū)動進而操作硬件設(shè)備。
(3)attribute其實是另一條驅(qū)動實現(xiàn)的路線。有區(qū)別于之前講的file_operations那條線。
5:led_classdev_register
這個函數(shù)里面通過調(diào)用device_create,來創(chuàng)建一個屬于leds設(shè)備類的設(shè)備,其在系統(tǒng)中的體現(xiàn)就是在/sys/class/leds/里面會得到相應的設(shè)備節(jié)點文件。其實這個函數(shù)就是內(nèi)核開發(fā)者為驅(qū)動開發(fā)者提供的一個注冊leds類設(shè)備的一個接口函數(shù),將來我們在寫驅(qū)動去注冊led設(shè)備的時候就是調(diào)用這個函數(shù)去進行注冊的。
6:led_classdev_unregister
通過調(diào)用device_unregister函數(shù)來注銷注冊的LED設(shè)備,和led_classdev_register函數(shù)類似,只是功能相反。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網(wǎng)站欄目:驅(qū)動學習之led-class.c源碼分析-創(chuàng)新互聯(lián)
新聞來源:http://www.ekvhdxd.cn/article40/djoeho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、企業(yè)網(wǎng)站制作、移動網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、電子商務、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容