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

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

1 環境與簡介

    Host:Ubuntu14.04(64bit)

    Target:smdk6410

    Kernel:linux-3.5.0
    在《Linux裝置驅動--LCD平臺裝置與驅動(smdk2440)》中基於linux-2.6.39.4對LCD平臺裝置與驅動進行了分析,在此繼續基於linux-3.5.0對LCD平臺裝置與驅動進行分析(本文所有原始碼均來自Linux核心)。

2 平臺裝置

2.1 宣告

extern struct platform_device s3c_device_fb;
原始檔:arch/arm/plat-samsung/include/plat/devs.h
對比分析:與《
Linux裝置驅動--LCD平臺裝置與驅動(smdk2440)
》不同的是,這裡不是通過EXPORT_SYMBOL(s3c_device_fb)使其在別的原始檔可見,而是在標頭檔案中宣告該變數。

2.2 定義

(1)平臺裝置

    定義全域性變數s3c_device_fb

struct platform_device s3c_device_fb = {
	.name       = "s3c-fb",
	.id     = -1,
	.num_resources  = ARRAY_SIZE(s3c_fb_resource),
	.resource   = s3c_fb_resource,
	.dev        = {
	  .dma_mask       = &samsung_device_dma_mask,
	  .coherent_dma_mask  = DMA_BIT_MASK(32),
	},   
};
原始檔:arch/arm/plat-samsung/devs.c

(2)平臺資源

static struct resource s3c_fb_resource[] = {
	[0] = DEFINE_RES_MEM(S3C_PA_FB, SZ_16K),
	[1] = DEFINE_RES_IRQ(IRQ_LCD_VSYNC),
	[2] = DEFINE_RES_IRQ(IRQ_LCD_FIFO),
	[3] = DEFINE_RES_IRQ(IRQ_LCD_SYSTEM),
};
原始檔:arch/arm/plat-samsung/devs.c

2.3 引用

    定義一個平臺裝置陣列smdk6410_devices

,該陣列包含了smdk6410開發板的所有平臺裝置,其中當然包括上述s3c_device_fb,如下第10行所示:

static struct platform_device *smdk6410_devices[] __initdata = {
#ifdef CONFIG_SMDK6410_SD_CH0
    &s3c_device_hsmmc0,
#endif
#ifdef CONFIG_SMDK6410_SD_CH1
    &s3c_device_hsmmc1,
#endif
    &s3c_device_i2c0,
    &s3c_device_i2c1,
    &s3c_device_fb,
    &s3c_device_ohci,
    &s3c_device_usb_hsotg,
    &samsung_asoc_dma,
    &s3c64xx_device_iisv4,
    &samsung_device_keypad,

#ifdef CONFIG_REGULATOR
    &smdk6410_b_pwr_5v,
#endif
    &smdk6410_lcd_powerdev,

    &smdk6410_smsc911x,
    &s3c_device_adc,
    &s3c_device_cfcon,
    &s3c_device_rtc,
    &s3c_device_ts,
    &s3c_device_wdt,
};

原始檔:arch/arm/mach-s3c64xx/mach-smdk6410.c

2.4 註冊

(1)註冊函式

    在smdk6410_machine_init()函式中呼叫platform_add_devices()函式將上述smdk6410_devices註冊到系統,即可完成平臺裝置的註冊,如下最後1行所示:

static void __init smdk6410_machine_init(void)
{
    u32 cs1;

    s3c_i2c0_set_platdata(NULL);
    s3c_i2c1_set_platdata(NULL);
    s3c_fb_set_platdata(&smdk6410_lcd_pdata);    /* LCD平臺數據. */
    s3c_hsotg_set_platdata(&smdk6410_hsotg_pdata);

    samsung_keypad_set_platdata(&smdk6410_keypad_data);

    s3c24xx_ts_set_platdata(NULL);

    /* configure nCS1 width to 16 bits */

    cs1 = __raw_readl(S3C64XX_SROM_BW) &
            ~(S3C64XX_SROM_BW__CS_MASK << S3C64XX_SROM_BW__NCS1__SHIFT);
    cs1 |= ((1 << S3C64XX_SROM_BW__DATAWIDTH__SHIFT) |
        (1 << S3C64XX_SROM_BW__WAITENABLE__SHIFT) |
        (1 << S3C64XX_SROM_BW__BYTEENABLE__SHIFT)) <<
                           S3C64XX_SROM_BW__NCS1__SHIFT;
    __raw_writel(cs1, S3C64XX_SROM_BW);
    
    /* set timing for nCS1 suitable for ethernet chip */
             
    __raw_writel((0 << S3C64XX_SROM_BCX__PMC__SHIFT) |
             (6 << S3C64XX_SROM_BCX__TACP__SHIFT) | 
             (4 << S3C64XX_SROM_BCX__TCAH__SHIFT) |
             (1 << S3C64XX_SROM_BCX__TCOH__SHIFT) |
             (0xe << S3C64XX_SROM_BCX__TACC__SHIFT) |
             (4 << S3C64XX_SROM_BCX__TCOS__SHIFT) |
             (0 << S3C64XX_SROM_BCX__TACS__SHIFT), S3C64XX_SROM_BC1);

    gpio_request(S3C64XX_GPN(5), "LCD power");
    gpio_request(S3C64XX_GPF(13), "LCD power");

    i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
    i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
    
    s3c_ide_set_platdata(&smdk6410_ide_pdata);
    
    samsung_bl_set(&smdk6410_bl_gpio_info, &smdk6410_bl_data);

    platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices)); /* 註冊平臺裝置. */
} 
原始檔:arch/arm/mach-s3c64xx/mach-smdk6410.c

(2)註冊時機

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

MACHINE_START(SMDK6410, "SMDK6410")
    /* Maintainer: Ben Dooks <[email protected]> */
    .atag_offset    = 0x100,
    
    .init_irq   = s3c6410_init_irq,
    .handle_irq = vic_handle_irq,
    .map_io     = smdk6410_map_io,
    .init_machine   = smdk6410_machine_init,
    .init_late  = s3c64xx_init_late,
    .timer      = &s3c24xx_timer,
    .restart    = s3c64xx_restart,
MACHINE_END   
原始檔:arch/arm/mach-s3c64xx/mach-smdk6410.c

3 平臺驅動

3.1 定義

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

static struct platform_driver s3c_fb_driver = {
	.probe      = s3c_fb_probe,
	.remove     = __devexit_p(s3c_fb_remove),
	.id_table   = s3c_fb_driver_ids,
	.driver     = {                                                                                                                                                         
	  .name   = "s3c-fb",                                                                                                                                                 
	  .owner  = THIS_MODULE,                                                                                                                                              
	  .pm = &s3cfb_pm_ops,                                                                                                                                                
	},                                                                                                                                                                      
}; 
原始檔:drivers/video/s3c-fb.c

3.2 註冊

module_platform_driver(s3c_fb_driver); 

原始檔:drivers/video/s3c-fb.c

    module_platform_driver()是新版本核心新新增的巨集,根據參考資料[1]的提示,上述巨集可展開為:

static int __init s3c_fb_driver_init(void)
{
        return platform_driver_register(&s3c_fb_driver);
}
module_init(s3c_fb_driver_init);
static void __exit s3c_fb_driver_init(void)
{
        return platform_driver_unregister(&s3c_fb_driver);
}
module_exit(s3c_fb_driver_exit);

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