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對比分析:與《
2.2 定義
(1)平臺裝置
定義全域性變數s3c_device_fb:
原始檔:arch/arm/plat-samsung/devs.cstruct 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), }, };
(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
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 -- 外部編譯 在核
【翻譯】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