linux核心led模組分析(二)
上次分析到那裡後,還是有些同志說看不懂,那我就繼續分析一把我認為不需要繼續分析的東西吧。上回分析了
led_cdev和trigger的關係後就沒有繼續說了。有同志還是沒明白怎麼呼叫的。幹活的函式是:
static void led_heartbeat_function(unsigned long data)
led_set_brightness(led_cdev, brightness);
mod_timer(&heartbeat_data->timer, jiffies + delay);
}這個函式裡面呼叫了led_set_brightness(led_cdev, brightness);
static inline void led_set_brightness(struct led_classdev *led_cdev,
enum led_brightness value)
很明顯這個函式呼叫了led_cdev->brightness_set(led_cdev, value);
這個就是我們在leds-sunfire.c中註冊的led_cdev。
我們回過頭想一想我們剛開始註冊led_cdev的過程:
static int __devinit sunfire_led_generic_probe(struct platform_device *pdev,
struct led_type *types)
p = kzalloc(sizeof(*p), gfp_kernel);
if (!p)
for (i = 0; i < num_leds_per_board; i++)
}dev_set_drvdata(&pdev->dev, p);
err = 0;
out:
return err;
out_unregister_led_cdevs:
for (i--; i >= 0; i--)
led_classdev_unregister(&p->leds[i].led_cdev);
goto out;
}看到了吧:
or (i = 0; i < num_leds_per_board; i++)
}這時候就會將我們的handle函式掛在led_cdev的brightness_set。所以我們最終呼叫的是:
static struct led_type clockboard_led_types[num_leds_per_board] = ,,,
};這個結構體陣列中第三個成員的handler函式。
也就是clockboard_right_set()。
static void clockboard_right_set(struct led_classdev *led_cdev,
enum led_brightness led_val)
static void __clockboard_set(struct led_classdev *led_cdev,
enum led_brightness led_val, u8 bit)
upa_writeb(reg, p->reg);
}這個就是寫暫存器了。ok。總算分析完了,還不明白就沒辦法了。^_^
Linux核心模組(二)
ko kernel object so shared object root rhel6 ls lib modules uname r kernel arch x86 kvm kvm amd.ko kvm intel.ko kvm.ko 通過移除核心模組可達到禁用該模組的作用 root rhel6 ...
Linux核心分析 實驗二
該實驗要求完成乙個簡單的時間片輪轉多道程式核心 首先我們看看mykernel裡面的mypcb.h define max task num 10 max num of task in system define kernel stack size 1024 8struct thread typedef...
linux驅動學習 二 核心模組
因為linux 核心的整體結構非常龐大,包含的元件非常多,如何使用需要的元件呢?有一種方法是把所有的元件都編譯進核心檔案 zimage 或bzimage 但是這樣會產生兩個問題 一是生成的核心檔案過大 二是如果要新增或刪除某乙個元件,需要重新刪除編譯整個核心。於是我們需找另外一種機制讓核心檔案本身不...