在初學系統移植的時候,很多同學碰到這樣的問題,比如要新增lcd的支援,網上很多資料說要新增一些**,可是為什麼新增這些**缺不是很清楚。這裡我們分析一些這些**和驅動之間的關係。
比如我們這裡要新增lcd的支援,以s3c2410為例,我們會在arch/arm/mach-s3c2410/
mach-smdk2410.c中新增如下**:
static structs3c2410fb_display s3c2410_lcd_cfg __initdata = else {
printk(kern_err "nomemory for lcd platform data\n");
s3c_device_lcd.dev.platform_data= npd就是將我們用來描述lcd的物理資訊的結構體賦值給s3c_device_lcd的成員,s3c_device_lcd又是什麼定義呢,在那裡使用的呢?
static struct resource s3c_lcd_resource = {
[0] = {
.start = s3c24xx_pa_lcd,
.end = s3c24xx_pa_lcd +s3c24xx_sz_lcd - 1,
.flags = ioresource_mem,
[1] = {
.start = irq_lcd,
.end = irq_lcd,
.flags = ioresource_irq,
static u64 s3c_device_lcd_dmamask = 0xfffffffful;
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
這裡定義了s3c_device_lcd也就是我們的平台裝置,這個結構用來描述lcd的物理資訊,比如控制器的實體地址,及屏的物理資訊。那麼這個內容如何去操作我們的lcd呢。
這裡涉及到linux核心的設計思想,linux核心想把裝置與驅動完全分離,裝置是裝置,驅動是驅動。所以就出現了平台裝置(platform_deivce)和驅動(platform_driver),這兩個結果互不相干,乙個用來描述裝置,乙個是驅動,但是他們有共同的成員是bus_type通過是個東西進行關聯。上面我們定義了乙個平台裝置,並且在arch/arm/mach-s3c2410/
mach-smdk2410.c中將這個裝置註冊到我們的系統中去。
註冊流程為:
在s3c2410fb.c中驅動中定義了這麼乙個結構:
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,
我們看一下這個驅動的註冊流程吧:
linux平台驅動與平台裝置的實現
首先介紹一下註冊乙個驅動的步驟 1 定義乙個platform driver結構 2 初始化這個結構,指定其probe remove等函式,並初始化其中的driver變數 3 實現其probe remove等函式 看platform driver結構,定義於include linux platform...
Linux 平台裝置驅動模型
linux 平台裝置驅動模型 一。平台匯流排概述 1.平台匯流排 platform bus 是linux2.6核心加入的一種虛擬匯流排,其優勢在於採用了匯流排的模型對裝置與驅動進行了管理,這樣提高了程式的可移植性 二。平台裝置 1.平台裝置使用structplatform device來描述 str...
linux裝置樹的識別載入
主要內容 1.裝置樹檔案編譯 2.裝置樹檔案載入 3.裝置樹檔案解析 4.裝置樹上的節點如何與驅動繫結 device與driver如何呼叫probe 5.如掛在i2c上,則中間i2c如何插入,兩者之間如何與i2c互動 參考 該module的initcall等級相比核心核心的core module來說...