2013-08-04 105 views
2

我是編寫設備驅動程序的新手。在Linux中編寫設備驅動程序

我想爲ARM平臺上的外設寫一個設備驅動程序。

1問題:有沒有什麼不同編寫基於ARM平臺的外圍不是x86 Linux中的設備驅動程序?

第二問題:我檢查的/ proc/IOMEM文件以查看處理器的當前地址的地圖。但是,並不是所有外圍設備,包括我想訪問的外圍設備都不存在於該文件中。我怎樣才能包含外設的地址範圍?

第三個問題:在寫入設備驅動程序時設備樹的重要性如何?

回答

3

1.只要外圍設備與SoC接口類似(即在兩個平臺上使用相同的硬件接口),就可以在x86和ARM上使用相同的驅動程序。這是開發獨立於Linux內核核心的模塊化驅動程序的優勢。


2.如果您的特定外設並不在當前的地址映射(/proc/iomem)存在,那麼這可能意味着兩種可能性之一:

  • 的設備驅動程序尚未加載。
  • 該設備使用尋址(NOT存儲器映射的I/O)

約外圍的任何附加信息的其它形式的?它如何連接到SoC?


3.的設備樹在Linux內核用於描述的許多硬件(兩者上芯片和外圍設備),它們的連通性和間基本PARAMS適用於它們的適當的配置並在爲其寫入設備樹的特定平臺/板上進行初始化。

本質上,它執行相同的功能和「董事會文件」,在當前的Linux內核中發現的。它還減少了bootargs對初始配置的依賴性,因爲它可以在設備樹中提供。有關device trees的更多信息。

+0

「該設備使用尋址的其它形式的」 - 請注意,ARM不具有I/O指令或I/O地址空間,因此具有直接連接的外設必須進行內存映射。設備樹 - 可用性取決於內核版本。 – sawdust

+0

SoC具有ARM926EJS處理器並利用AMBA AHB系統作爲總線組織。 – yildizabdullah

+0

好的。你想寫什麼外圍設備驅動程序?... – TheCodeArtist

4

如果駕駛員沒有在內核源代碼樹的存在,並且該裝置是存儲器設備中的地址空間映射,則該設備的資源(ADRESS區域,IRQ線路)在某處被聲明。在較早版本的內核中,這是電路板文件的責任,但現在它已轉移到設備樹中。

因此,與x86架構的主要區別不在於你怎麼寫驅動程序,而是你如何匹配的設備和驅動程序。在x86上,您有例如pci驅動程序和可發現的pci設備。在ARM上,通常沒有這種自我描述硬件,並且爲了模擬整個設備/驅動程序跳舞,創建了平臺總線。

所以上ARM的典型設備驅動程序的平臺的驅動程序,以及相關聯的設備是平臺裝置。來自當前內核的示例以太網mac驅動程序是here

在上面的鏈接驅動程序中,驅動程序代碼不知道設備的位置。此信息在探測時間使用platform_device對象傳遞給驅動程序。和平臺設備可以像這樣(source)來描述:

static struct platform_device at91sam9260_eth_device = { 
     .name   = "macb", 
     .id    = -1, 
     .dev   = { 
           .dma_mask    = &eth_dmamask, 
           .coherent_dma_mask  = DMA_BIT_MASK(32), 
           .platform_data   = &eth_data, 
     }, 
     .resource  = eth_resources, 
     .num_resources = ARRAY_SIZE(eth_resources), 
}; 

平臺裝置可從C代碼創建如這裏所示,或者它們可以在設備樹進行說明。在這兩種情況下,在驅動程序探測到設備之前,您都不會在proc/iomem中看到任何內容。這與他的大多數設備是PCI設備的x86世界形成鮮明對比。

這裏是,但在一個device tree file描述的相同的設備:

   macb0: [email protected] { 
         compatible = "cdns,at32ap7000-macb", "cdns,macb"; 
         reg = <0xfffc4000 0x100>; 
         interrupts = <21 IRQ_TYPE_LEVEL_HIGH 3>; 
         pinctrl-names = "default"; 
         pinctrl-0 = <&pinctrl_macb_rmii>; 
         status = "disabled"; 
       }; 
相關問題