1. 程式人生 > >Linux裝置驅動--LCD平臺裝置與驅動(smdk2440)

Linux裝置驅動--LCD平臺裝置與驅動(smdk2440)

1 環境與簡介

    Host:Ubuntu14.04(64bit)

    Target:smdk2440

    Kernel:linux-2.6.39.4

    類似於《Linux裝置驅動--WDT平臺裝置與驅動》,本文再以LCD為例進行說明。本文的原始碼均來自Linux核心(linux-2.6.39.4貌似對mini2440 LCD移植還不完善,因此本文以smdk2440為例,在原始碼中已經完美支援該開發板的LCD)。

2 平臺裝置

2.1 定義

(1)平臺裝置

    定義全域性變數s3c_device_lcd,並且通過EXPORT_SYMBOL(s3c_device_lcd)使其在別的原始檔可見:

struct platform_device s3c_device_lcd = { 
    .name         = "s3c2410-lcd",                                                                                                                                               
    .id       = -1,                 
    .num_resources    = ARRAY_SIZE(s3c_lcd_resource), 
    .resource     = s3c_lcd_resource, 
    .dev              = {
        .dma_mask       = &s3c_device_lcd_dmamask,
        .coherent_dma_mask  = 0xffffffffUL
    }   
};
EXPORT_SYMBOL(s3c_device_lcd);
原始檔:arch/arm/plat-s3c24xx/devs.c

(2)平臺資源

    上述LCD裝置所引用的平臺裝置資源如下所定義:

static struct resource s3c_lcd_resource[] = {
    [0] = {
        .start = S3C24XX_PA_LCD, /* 0x4D000000 */
        .end   = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,/* S3C24XX_SZ_LCD=0x00100000(1M) */                                                                                                                         
        .flags = IORESOURCE_MEM, /* 0x00000200 */                                                                                                                                              
    },                                                                                                                                                                        
    [1] = {                                                                                                                                                                   
        .start = IRQ_LCD, /* 32 */                                                                                                                                                    
        .end   = IRQ_LCD,                                                                                                                                                     
        .flags = IORESOURCE_IRQ, /* 0x00000400 */                                                                                                                                              
    }                                                                                                                                                                                                                                                                                                                                                  
}; 

原始檔:arch/arm/plat-s3c24xx/devs.c

2.2 引用

    定義一個平臺裝置陣列smdk2440_devices,該陣列包含了smdk2440開發板的所有平臺裝置,其中當然包括上述s3c_device_lcd,如下第3行所示:

static struct platform_device *smdk2440_devices[] __initdata = {
    &s3c_device_ohci,
    &s3c_device_lcd,
    &s3c_device_wdt,
    &s3c_device_i2c0,
    &s3c_device_iis,
};
原始檔:arch/arm/mach-s3c2440/mach-smdk2440.c

2.3 註冊

(1)註冊函式    

    在smdk2440_machine_init()函式中呼叫platform_add_devices()函式將上述smdk2440_devices註冊到系統,即可完成平臺裝置的註冊,如下第4行所示:

static void __init smdk2440_machine_init(void)
{
    s3c24xx_fb_set_platdata(&smdk2440_fb_info);
    s3c_i2c0_set_platdata(NULL);

    platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));
    smdk_machine_init();
}

原始檔:arch/arm/mach-s3c2440/mach-smdk2440.c

(2)註冊時機

    上述smdk2440_machine_init()函式是何時被呼叫的呢?答案是在核心初始化裝置的時候,如下第6行所示:

MACHINE_START(S3C2440, "SMDK2440")
    /* Maintainer: Ben Dooks <[email protected]> */
    .boot_params    = S3C2410_SDRAM_PA + 0x100, /* 0x30000100 */
    .init_irq   = s3c24xx_init_irq,
    .map_io     = smdk2440_map_io,
    .init_machine   = smdk2440_machine_init,
    .timer      = &s3c24xx_timer,
MACHINE_END   

原始檔:arch/arm/mach-s3c2440/mach-smdk2440.c

3 平臺驅動

3.1 定義

    為了和平臺裝置匹配,平臺驅動的name要與平臺裝置的name一致:

static struct platform_driver s3c2410fb_driver = {
    .probe      = s3c2410fb_probe, 
    .remove     = __devexit_p(s3c2410fb_remove),
    .suspend    = s3c2410fb_suspend,
    .resume     = s3c2410fb_resume,
    .driver     = {  
        .name   = "s3c2410-lcd",                                                                                                                                       
        .owner  = THIS_MODULE,
    },   
};

原始檔:drivers/video/s3c2410fb.c

    上述s3c2410fb_probes3c2410fb_removes3c2410fb_shutdowns3c2410fb_suspend以及s3c2410fb_resume都在同一個原始檔中定義,詳見原始檔drivers/video/s3c2410fb.c。

    上述s3c2410fb_probe()呼叫s3c24xxfb_probe(),並且在s3c24xxfb_probe()中實現framebuffer的建立,初始化與註冊,詳見《Linux裝置驅動--framebuffer》。

3.2 註冊

     在模組載入函式s3c2410fb_init()中呼叫platform_driver_register()函式註冊上述平臺驅動s3c2410fb_driver

int __init s3c2410fb_init(void)                                                                                                                                               
{                                                                                                                                                                             
    int ret = platform_driver_register(&s3c2410fb_driver);                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                   
    if (ret == 0)                                                                                                                                                             
        ret = platform_driver_register(&s3c2412fb_driver);                                                                                                                    
                                                                                                                                                                              
    return ret;                                                                                                                                                               
}  
原始檔:drivers/video/s3c2410fb.c

4 裝置與驅動匹配

參考資料

相關推薦

Linux裝置驅動--LCD平臺裝置驅動tiny4412

1 環境與簡介     Host:Ubuntu14.04(64bit)     Target:Tiny4412     Kernel:linux-3.5.0 2 平臺裝置 2.1 宣告 extern struct platform_device s5p_device_fim

Linux裝置驅動--LCD平臺裝置驅動smdk2440

1 環境與簡介     Host:Ubuntu14.04(64bit)     Target:smdk2440     Kernel:linux-2.6.39.4     類似於《Linux裝置驅動--WDT平臺裝置與驅動》,本文再以LCD為例進行說明。本文的原始碼均來自L

Linux裝置驅動--LCD平臺裝置驅動s3c64xx

1 開發環境     Host:Ubuntu14.04     Target:s3c64xx     Kernel:linux-3.18.2 2 平臺裝置         關於裝置樹是如果被載入並解析成裝置節點的,詳見參考資料[1],本文重點分析如何利用裝置節點建立相

Linux裝置驅動--LCD平臺裝置驅動smdk6410

1 環境與簡介     Host:Ubuntu14.04(64bit)     Target:smdk6410     Kernel:linux-3.5.0     在《Linux裝置驅動--LCD平臺裝置與驅動(smdk2440)》中基於linux-2.6.39.4對LC

軟體測試中樁模組驅動模組的概念區別轉載,打樁

樁模組和驅動模組(以C語言為例):   很多人對樁模組和驅動模組的概念會搞不清楚,那麼下面來介紹這兩個概念:   模組結構例項圖:   假設現在專案組把任務分給了7個人,每個人負責實現一個模組。你負責的是B模組,你很優秀,第一個完成了編碼工作,現在需要開展單元測試工作,先分析結構圖:   1、由於

linux應用之vim的安裝配置centos

utf8 power scroll pbo gb2312 nco pla red vma 1.vim的安裝 #yum search vim //查看vim相關軟件信息 #yum install -y vim* //在線安裝vim 2.vim的配置 (1)~/.vimi

Linux下NFS伺服器的搭建配置

一、NFS服務簡介  NFS 就是 Network FileSystem 的縮寫,最早之前是由sun 這家公司所發展出來的。 它最大的功能就是可以透過網路,讓不同的機器、不同的作業系統、可以彼此分享個別的檔案 (share files)。所以,你也可以簡單的將他看做是一個檔案伺服器 (file server

Linux中的Redis的下載安裝附圖

一,Redis下載         1,下載地址:http://redis.io/download         2,進入Redis官網首頁下載最新版進行. 二,安裝redis (在root許可權下操

平臺程式設計開發:Java雲平臺服務商一覽

因為Java語言的跨平臺性和高度靈活性,成為目前雲端計算平臺的主流開發語言;所以,這裡重點討論一下Java 雲平臺的比較情況。尤其是討論X5Cloud雲平臺與現有幾個Java雲平臺的聯絡和區別:      * App Engine (http://code.google.com/appengine/)    

linux驅動-7-平臺裝置驅動

[toc] --- ## 前言 區分**裝置驅動模型**和**平臺裝置驅動模型**。 **裝置驅動模型** 可以理解為 **匯流排、裝置、驅動**。 **平臺裝置驅動模型** 就是那些 Linux 核心管理沒有物理匯流排(*即是不需要特殊時序控制的裝置*)(*也是Linux核心沒有自動建立相應驅動匯流

Linux總線、設備驅動》USB設備發現機制

buffer 嵌入 void smo b- 嵌入式系統 root 顯示 ice 說明:本分析基於mstar801平臺Linux2.6.35.11內核,其他內核版本僅供參考。 一、程序在內核中的位置 1.usb host做為pci總線下的一個設備存在(嵌入式系統中有可能也會

Linux驅動平臺設備驅動模型簡析驅動分離分層概念的建立

技術 描述 rst 操作 mem iou 系統 簡單 reg Linux設備模型的目的:為內核建立一個統一的設備模型,從而有一個對系統結構的一般性抽象描述。換句話說,Linux設備模型提取了設備操作的共同屬性,進行抽象,並將這部分共同的屬性在內核中實現,而為需要新添加設備

Linux驅動學習筆記----------IIC框架流程

歷時一個月期末課程設計終於結束了!發現好多東西忘記了,iic流程也有些淡忘,有點慌,夜深人靜的時候就整理下吧!還有,杭州最近熱的我腦袋都不好用了! 關於iic: 1.是一種資料傳輸協議(spi,usb,sdio,uart…)

linux驅動篇之 driver_register 過程分析

linux驅動註冊過程分析--driver_register(一) 個人筆記,歡迎轉載,請註明出處,共同分享 共同進步  http://blog.csdn.net/richard_liujh/article/details/45825333 kernel版本3.10.1

Linux 驅動開發之核心模組開發 —— 核心模組編譯 Makefile 入門

一、模組的編譯  我們在前面核心編譯中驅動移植那塊,講到驅動編譯分為靜態編譯和動態編譯;靜態編譯即為將驅動直接編譯進核心,動態編譯即為將驅動編譯成模組。 而動態編譯又分為兩種: a -- 內部編譯        在核心原始碼目錄內編譯 b -- 外部編譯        在核

【翻譯】SklearnTensorFlow機器學習實用指南 ——第12章 裝置和伺服器上的分散式TensorFlow

在第 11 章,我們討論了幾種可以明顯加速訓練的技術:更好的權重初始化,批量標準化,複雜的優化器等等。 但是,即使採用了所有這些技術,在具有單個 CPU 的單臺機器上訓練大型神經網路可能需要幾天甚至幾周的時間。在本章中,我們將看到如何使用 TensorFlow 在多個裝置(C

LINUX系統服務管理Services---------第六天

rsync同步? ? ?虛擬機A? ? 1. 將防火墻狀態設置為trusted? 2.SELinux當前修改為permissive? 3.SELinux永久狀態修改為permissive? ? 4.清空Yum緩存,檢查Yum是否可用? ? 虛擬機B? ? 1. 將防火墻狀態設置為trusted? 2.SELi

LINUX系統服務管理Services---------第二天

根下常用的命令用途 自定義yum倉庫 ln創建軟連接 源碼包編譯安裝 主要用途/boot ? ? ? ? 存放系統引導必需的文件,包括內核、啟動配置/bin、/sbin ? 存放各種命令程序/dev ? ? ? ? ?存放硬盤、鍵盤、鼠標、光驅等各種設備文件/etc ? ? ? ? ?存放Li

LINUX系統服務管理Services---------第四天

dns服務器虛擬機A? ? 1. 將防火墻狀態設置為trusted? 2.SELinux當前修改為permissive? 3.SELinux永久狀態修改為permissive? ? 4.清空Yum緩存,檢查Yum是否可用? ? 虛擬機B? ? 1. 將防火墻狀態設置為trusted? 2.SELinux當前修

LINUX系統服務管理Services---------第五天

部署dhcp服務器 pxe網絡裝機服務器 虛擬機A? ? 1. 將防火墻狀態設置為trusted? 2.SELinux當前修改為permissive? 3.SELinux永久狀態修改為permissive? ? 4.清空Yum緩存,檢查Yum是否可用? ? 虛擬機B? ? 1. 將防火墻狀態設置為tr