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)使其在別的原始檔可見:
原始檔:arch/arm/plat-s3c24xx/devs.cstruct 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);
(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.c2.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_probe、s3c2410fb_remove、s3c2410fb_shutdown、s3c2410fb_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.c4 裝置與驅動匹配
參考資料
相關推薦
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 -- 外部編譯 在核
【翻譯】Sklearn與TensorFlow機器學習實用指南 ——第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