2014-02-27 92 views
1

我在引用下面的內容將我的嵌入式Arm linux板中使用的所有驅動程序描述爲平臺設備,需要澄清一些問題。請在這些建議。定義平臺設備 - Linux內核

http://thomas.enix.org/pub/conf/rmll2010/kernel-architecture-for-drivers.pdf

===============定義平臺驅動==================

static struct platform_driver serial_imx_driver = { 
.probe = serial_imx_probe, 
.remove = serial_imx_remove, 
.driver = { 
.name = "imx-uart", 
.owner = THIS_MODULE, 
}, 
}; 

=================定義平臺設備================

static struct platform_device imx_uart1_device = { 
.name = "imx-uart", 
.id = 0, 
.num_resources = ARRAY_SIZE(imx_uart1_resources), 
.resource = imx_uart1_resources, 
.dev = { 
.platform_data = &uart_pdata, 
} 
}; 

==== ====內核啓動代碼位置 - /arch/arm/mach-imx/mx1ads.c ===========

static struct platform_device *devices[] __initdata = { 
&cs89x0_device, 
&imx_uart1_device, 
&imx_uart2_device, 
}; 



static void __init mx1ads_init(void) 
{ 
[...] 
platform_add_devices(devices, ARRAY_SIZE(devices)); 
[...] 
} 
MACHINE_START(MX1ADS, "Freescale MX1ADS") 
[...] 
.init_machine = mx1ads_init, 
MACHINE_END 

===============================

在LINUX /司機/文件夾,如果我有10個文件夾爲10個不同的平臺驅動。我想只有6個驅動程序被包含在內核源代碼中? 那麼我的內核怎麼會知道哪個驅動包含在內?

將平臺驅動程序編譯爲模塊還是靜態編譯到內核中?

當我們調用platform_add_devices()系統調用時會發生什麼?

在調用platform_add_devices()系統調用之前,包含在內核中的所有平臺驅動程序是否都加載到ram中?

內核源代碼中的哪個路徑/文件可以定義在我的嵌入式linux系統中使用的所有平臺設備(表示所有在板上使用的平臺設備都被描述)?

回答

3

基本上平臺驅動程序在板文件中註冊(例如/arch/arm/mach-imx/eukrea_mbimx27-baseboard.c)。現代系統使用Device Tree的方法。

爲了編譯驅動程序,必須先選擇它(例如通過make menuconfig)。所以如果你選擇6個驅動程序,那麼將會編譯6個驅動程序。

platform_add_devices()註冊平臺驅動程序(將它們添加到列表中,請參閱drivers/base/platform.c),以便內核知道它們中的哪些要在引導階段初始化。

平臺驅動程序是內核的一部分,所以一旦內核映像本身被加載,它們就在RAM中。

有關更多詳細信息,請參見article

+0

所以在現代系統板文件中包含設備樹或設備樹是由uboot傳遞給內核的? ...你也告訴選擇使用make menuconfig的驅動程序...假設平臺驅動程序不在內核中,我必須添加它,所以在這種情況下,我將不得不在內核源代碼中通過修改makefiles來靜態執行它。 ? – Katoch

+0

使用設備樹方法,基本上有兩個文件:內核映像和設備樹blob('* .dtb')。這兩個文件都將由u-boot加載。對於添加內核驅動程序,請參見[答案](http://stackoverflow.com/questions/11710022/adding-new-driver-code-to-linux-source-code)。 – yegorich