大部分驅動程式都是核心自帶的,主要是為了進行驅動移植。驅動模型分為驅動層和裝置層。現在核心已經帶有驅動層帶**,還缺少裝置層**。我們可以根據核心提供的lcd驅動程式,分析出裝置層**。
在「平台裝置驅動之平台裝置」中,可以知道裝置層步驟:
1.裝置占用的資源;2.裝置的平台資料結構struct platform_data(可以從裝置相應的驅動程式中獲得);3.定義並填充struct platform_device結構;4.註冊;5.登出
而1,2中的問題可以從兩個方面得到:(1)裝置硬體原理圖;(2)驅動層的探測函式(probe)
s3c2410fb_probe (drivers\video\s3c2410fb.c)
1 static int __init s3c24xxfb_probe(struct platform_device *pdev,2enum s3c_drv_type drv_type)
3
platform_data是平台資料結構,其對應的是mach_info,struct s3c2410fb_mach_info(); (include\mach\fb.h)
1struct s3c2410fb_mach_info ;
struct s3c2410fb_mach_info()中的struct s3c2410fb_display()
1struct s3c2410fb_display ;
平台資料已經找到,接下來是平台資料的初始化和struct platform_device的定義 (arch\arm\mach-s3c2440\mach-mini2440.c)
1//(arch\arm\mach-s3c2440\mach-mini2440.c)
2static
struct s3c2410fb_display mini2440_lcd_cfg __initdata =;
3031
32static
struct s3c2410fb_mach_info mini2440_fb_info __initdata =;
5051
#endif
5253
/*(arch\arm\plat-s3c24xx\dev.c)
*/54
55static
struct resource s3c_lcd_resource =,
61 [1] =
6667
};68
6970
//struct platform_device的定義 (arch\arm\plat-s3c24xx\dev.c)
7172
struct platform_device s3c_device_lcd =
81 };
我在看struct platform_device時,發現裡面少了struct platform_data的定義,於是便有了在probe函式中,為什麼struct s3c2410fb_mach_info *mach_info=pdev->dev.platform_data?
也就是說為什麼pdev->dev.platform_data結構型別會是struct s3c2410fb_mach_info, 比如在led驅動時,dev.platform_data的結構型別就會是s3c2410_leds_drv_data.led_pdata, 就是說platform_data是怎麼實現不同資料結構之間的賦值的?
經查詢資料知道,在dev.c ( arch\arm\plat-s3c24xx\dev.c)中,會呼叫函式void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd), **如下
1void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd)
2 else
12 }
在這個程式完成了對dev.platformdata的定義,對函式void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd)的理解,可以參考
p.s. void __init s3c24xx_...注意(初始化函式)init前面的__ , 而不是_ ;之前在調程式時,遇到了這種提示,找了大半天才發現,是這錯了_^_
Framebuffer LCD驅動介紹
學習framebuffer過程中,最大的困惑不是fb層的各個資料結構的互動,而是stm32驅動lcd時的畫點,畫線,畫圈這樣的函式上哪去了。直到了解了lcd控制器的原理,總算知道了為什麼沒了。原來給lcd控制器承包了!在說framebuffer之前,得先提一下lcd控制器。如下圖 那麼我們要怎麼在應...
android layout weight設定解讀
參考文章 android layout weight的真實含義是 一旦view設定了該屬性 假設有效的情況下 那麼該 view的寬度等於原有寬度 android layout width 加上其在剩餘空間中的佔比!設螢幕寬度為l,在兩個view的寬度都為match parent的情況下,原有寬度為l...
Android RecyclerView設定空布局
1 自定義乙個emptyrecyclerview繼承recyclerview 2 採用adapterdataobserver觀察者模式來監聽資料的變化,如果有資料就隱藏空布局,反之,則顯示。view memptyview private adapterdataobserver emptyobserv...