Am335x lcd驅動分析

一 文件列表

本文使用的爲sdk6.0 kernel版本爲3.2 並未使用dtshtml

am335x的lcd驅動相關文件有:數組

(kernel)/drivers/video/da8xx-fb.c
(kernel)/drivers/video/fbmem.c
(kernel)/arch/arm/mach-davinci/devices-da8xx.c
(kernel)/arch/arm/mach-omap2/board-com335x.c(個人板子是這個板級初始化文件,其餘的多是board-am335xevm.c等)

二 代碼流程分析

咱們寫代碼以前通常都要先看下這個模塊基本的流程是怎麼樣的, 熟悉流程以後基本就知道如何寫驅動了.數據結構

fbmem.c是LCD驅動的核心層, 他向上層提供了open/read/write/ioctl等接口, 並經過fb_info數組鏈接到下層. fb_info[]數組保存的是經過register_freambuffer註冊到系統的fb_info結構體,數組的下標是設備的次設備號. fb_info結構體有個成員爲fb_ops, 它就相似於file_operations的做用同樣. 如此以來,就能夠經過設備的次設備號找到fb_ops進而操做他的fb_read/fb_write等接口了. ide

次設備號->fb_info[]->fb_info->fb_ops->read/write/ioctl...函數

應用層: read(「/dev/fb0」, …..)spa

-------------------------------------------------------------------------------------------code

驅動層:orm

fb_read
    struct fb_info *info = file_fb_info(file);//fb_info[次設備號]
    info->fbops->fb_read(info, buf, count, ppos);//調用fb_info->fops->fb_read

由以上可知, 核心層已經爲咱們作好了上層的代碼,咱們只須要實現註冊fb_info而且填充它就能夠了.具體流程以下htm

       /* 1. 分配一個fb_info */
       framebuffer_alloc();
       /* 2. 設置 */
           /* 2.1 設置固定的參數     */
           /* 2.2 設置可變的參數     */
           /* 2.3 設置操做函數       */
           /* 2.4 其餘的設置         */
       /* 3. 硬件相關的操做           */
           /* 3.1 配置GPIO用於LCD     */
           /* 3.2 根據LCD手冊設置LCD控制器, 好比VCLK的頻率等 */
           /* 3.3 分配顯存(framebuffer), 並把地址告訴LCD控制器 */
       /* 4. 註冊 */
       register_framebuffer();

2.1 設置lcd類型

在uboot中設置lcdtypeblog

2.2 初始化am335x的lcd模塊硬件

       board-com335x.c的板級初始化入口處調用了lcd初始化函數: com335x_lcdc_init()

該函數主要進行1設置GPIO做爲lcd引腳 2設置lcd模塊工做時鐘 3設置電源管理相關內容 4註冊lcd設備 5設置GPU

2.2 註冊platform_device(board-com335x.c)

在com335x_lcdc_init中註冊了名爲 「da8xx_lcdc」的平臺設備, 而且設置了platform_data

com335x_lcd_pdata[] = {
…
       [3] = {
              .manu_name = "LVDS",
              .controller_data = &lcd_cfg,
              .type = "LVDS_1024x768",
       },
…
}

2.3 註冊platform_driver(da8xx-fb.c)

Da8xx-fb.c的probe中platform_get_resource是否是得到的device-da8xx.c中的platform_device中的數據?

不是 kernel中的mem resource start爲 0x 4830E000而 device-da8xx.c中爲0x01e13000

另外device-da8xx.c中所有都是da8xx開頭的設備, 這些設備全都是am335x的麼?

反正lcd這個不是

1.     申請fb_info
2.     設置fb_info
3.     註冊register_framebuffer

 總結:兩個數據結構共同決定LCD控制寄存器的配置參數:

static struct lcd_ctrl_config lcd_cfg = {
    &disp_panel,
    .ac_bias        = 255,
    .ac_bias_intrpt        = 0,
    .dma_burst_sz        = 16,
    .bpp            = 32,
    .fdd            = 0x80,
    .tft_alt_mode        = 0,
    .stn_565_mode        = 0,
    .mono_8bit_mode        = 0,
    .invert_line_clock    = 1,
    .invert_frm_clock    = 1,
    .sync_edge        = 0,
    .sync_ctrl        = 1,
    .raster_order        = 0,
};

static struct da8xx_panel known_lcd_panels[] = {
    [2] = {
        .name = "TFC_S9700RTWV35TR_01B",
        .width = 800,
        .height = 480,
        .hfp = 39,
        .hbp = 39,
        .hsw = 47,
        .vfp = 13,
        .vbp = 29,
        .vsw = 2,
        .pxl_clk = 30000000,
        .invert_pxl_clk = 0,
    },
}

 還沒有搞明白的問題, 在fb_probe中的platform_resource是從何而來?

參考: http://blog.sina.com.cn/s/blog_944790400101kz8f.html

相關文章
相關標籤/搜索