溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

驅動學習之led-class.c源碼分析

發(fā)布時間:2020-07-17 13:15:38 來源:網(wǎng)絡 閱讀:994 作者:菜鳥養(yǎng)成記 欄目:開發(fā)技術

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這兩個后最終都是調用__define_initcall();這個宏。

  內核在啟動過程中需要順序的做很多事,內核如何實現(xiàn)按照先后順序去做很多初始化操作。內核的解決方案就是給內核啟動時要調用的所有函數(shù)歸類,然后每個類按照一定的次序去調用執(zhí)行。這些分類名就叫.initcalln.init。n的值從1到8。內核開發(fā)者在編寫內核代碼時只要將函數(shù)設置合適的級別,這些函數(shù)就會被鏈接的時候放入特定的段,內核啟動時再按照段順序去依次執(zhí)行各個段即可。所以subsys_initcallmodule_init的作用是一樣的,都是在內核啟動的時候去加載驅動,不同之處在于內核啟動時執(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ù)是作用是通過調用class_create函數(shù)來創(chuàng)建了一個類名為“l(fā)eds”的設備類,也就是我們/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/目錄里的內容,一般是文件和文件夾。這些文件其實就是sysfs開放給應用層的一些操作接口(非常類似于/dev/目錄下的那些設備文件)
  (2)attribute有什么用,作用就是讓應用程序可以通過/sys/class/leds/目錄下面的屬性文件來操作驅動進而操作硬件設備。
(3)attribute其實是另一條驅動實現(xiàn)的路線。有區(qū)別于之前講的file_operations那條線。

5:led_classdev_register

  這個函數(shù)里面通過調用device_create,來創(chuàng)建一個屬于leds設備類的設備,其在系統(tǒng)中的體現(xiàn)就是在/sys/class/leds/里面會得到相應的設備節(jié)點文件。其實這個函數(shù)就是內核開發(fā)者為驅動開發(fā)者提供的一個注冊leds類設備的一個接口函數(shù),將來我們在寫驅動去注冊led設備的時候就是調用這個函數(shù)去進行注冊的。


6:led_classdev_unregister

通過調用device_unregister函數(shù)來注銷注冊的LED設備,和led_classdev_register函數(shù)類似,只是功能相反。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI