注:基於linux-2.6.38
還是/arch/arm/mach-s3c64xx/mach-mini6410.c這個檔案,前面有篇文章已經說了裡面的mini6410_machine_init()函式是什麼時候被呼叫的,因此在這裡不再重複,直接看這個函式裡面的內容:
1static
void __init mini6410_machine_init(void)2
55if
(array_size(i2c_devs1))
5859
#ifdef config_s3c64xx_dev_fimc0
60s3c_fimc0_set_platdata(null);
61#endif
62#ifdef config_s3c64xx_dev_fimc1
63s3c_fimc1_set_platdata(null);
64#endif
6566
platform_add_devices(mini6410_devices, array_size(mini6410_devices));
6768
#ifdef config_video_samsung
69 create_proc_read_entry("
videomem
", 0
, null, s3c_media_read_proc, null);
70#endif
71 }
雖說有點長,但不難理解,都是對平台裝置相關資料的初始化還有一些暫存器的設定,重點看第66行的platform_add_devices()函式,該函式實現了平台裝置的註冊,第乙個引數是結構體陣列,第二個引數是該陣列的大小,去看看它的定義:
1static
struct platform_device *mini6410_devices __initdata =;
嗯,該陣列裡存放了很多裝置,這些裝置都會隨著mini6410_machine_init()函式被呼叫而被初始化。接下來回到platform_add_devices(),它在drivers/base/platform.c裡定義:
1int platform_add_devices(struct platform_device **devs, int
num)212
}1314return
ret;
15 }
在乙個for迴圈裡通過platform_device_register()將所有定義了的平台裝置逐個註冊進系統。看第6行platform_device_register()的定義:
1int platform_device_register(struct platform_device *pdev)
2
1int platform_device_add(struct platform_device *pdev)231
32if (p &&insert_resource(p, r)) 39}
4041 pr_debug("
registering platform device '%s'. parent at %s\n",
42 dev_name(&pdev->dev), dev_name(pdev->dev.parent));
4344 ret = device_add(&pdev->dev);
45if (ret == 0)46
return
ret;
4748
failed:
49while (--i >= 0
) 56
57return
ret;
58 }
Linux驅動學習 初識PCI驅動 二
寫在前面的話 我們從下面幾個方面來講述 一,初始化裝置模組 當linux 核心啟動並完成對所有 pci裝置進行掃瞄 登入和分配資源等初始化操作的同時,會建立起系統中所有 pci裝置的拓撲結構,此後當 pci驅動程式需要對裝置進行初始化時,一般都會呼叫如下的 static int init examp...
Linux驅動學習之路二
linux驅動學習之路二 上次我們寫了乙個最簡單的驅動程式,但是那個驅動程式中沒有介面可供linux上層應用程式呼叫 這次讓我們新增乙個linux呼叫驅動的介面,讓上層應用可以呼叫 1.首先讓咱們來了解一下linux 中file operations結構體,這個結構體在 include linux ...
linux驅動學習 二 核心模組
因為linux 核心的整體結構非常龐大,包含的元件非常多,如何使用需要的元件呢?有一種方法是把所有的元件都編譯進核心檔案 zimage 或bzimage 但是這樣會產生兩個問題 一是生成的核心檔案過大 二是如果要新增或刪除某乙個元件,需要重新刪除編譯整個核心。於是我們需找另外一種機制讓核心檔案本身不...