1. 程式人生 > >i.mx6 lvds介面的DE模式液晶屏驅動除錯

i.mx6 lvds介面的DE模式液晶屏驅動除錯

我這篇文章主要講述i.mx6 平臺下 採用DE模式的lvds液晶屏的驅動除錯,

閱讀該文章之前請先閱讀如下兩篇我轉載的文章,這兩篇文章是理解我這篇文章的基礎知識。

詳細閱讀並理解這兩篇文章之後,就會對液晶屏顯示的關鍵結構體的各個引數有一個詳細的瞭解。

Linux核心的amba lcd控制器使用clcd_panel結構體表示一個LCD屏的硬體引數:

/* include/linux/fb.h */

struct fb_videomode {     const char*name;     /* optional */
     u32refresh;          /* optional */
     u32 xres;
     u32 yres;
     u32 pixclock;
     u32 left_margin;
     u32 right_margin;
     u32 upper_margin;
     u32 lower_margin;
     u32 hsync_len;
     u32 vsync_len;
     u32 sync;
     u32 vmode;
     u32 flag;
};

在i.mx6中,關於lvds液晶屏的這個結構體引數所屬檔案為:driver/video/mxc/ldb.c

 

有這幅圖可以知道結構體struct  fb_videomode各個元素所對應的具體含義,如果液晶屏採用行場(HV)模式的,根據液晶屏資料手冊可以很容易的把這個結構體中各個元素的數值填寫進去,但是如果液晶屏是採用DE模式的話,液晶屏資料手冊上提供的引數就不好和結構體中各個引數對應了。現在我就來說一下DE模式下的液晶屏如何把手冊中提供的資料與該結構體中各元素的值進行對應。

      先說我用的液晶屏是EJ070NA-01F,手冊中該螢幕的引數如下:


      有該資料列表可知(其後所述均採用標稱值),該螢幕解析度為1024x600,時鐘頻率為51.2MHz,由此可知畫素時鐘週期(單位皮秒)為14065。但是其他資料就和結構體裡的元素對應不上了,有以上資料手冊可以得知,其一行1344個畫素點,空白點是320個,即其掃描一行在行首會有320個無效畫素點。根據手冊又可知,其掃描一場即掃描一屏有35個空白行,

      這裡邊沒有和結構體fb_videomode個元素對應的值啊,這該怎麼填呢,其實圖1所示的是一個螢幕中與各元素對應的值,但實際上螢幕上顯示的影象是一屏一屏連續的,你可以把兩個螢幕即把兩個圖1左右並排放置,如下圖所示:


看兩個圖片之間,看出來了吧,即right_margin + hsync_len + left_margin = 一行總的空白數,在該款螢幕中這個和的值為320,

      再把這兩個圖片上下拼起來看:


再看兩個圖片中間無效區間,即upper_margin + lower_margin + hsync_len = 一場總空白行,在該款螢幕中,這個和的值為35。

之後就可以隨意分配結構體fb_videomode中的各元素的值,只要滿足以上的兩個等式就可以了。

在看我這款螢幕在實際中設定的值如下:

static structfb_videomode ldb_modedb[] = {

      {

       "LDB-WXGA", 60, 1280, 800, 14065,

       40,40,

       10,3,

       80,10,

       0,

       FB_VMODE_NONINTERLACED,

       FB_MODE_IS_DETAILED,},

      {

      "LDB-XGA",60, 1024, 600, 19531,

       220, 40,

       20, 5,

       60, 10,

       0,

       FB_VMODE_NONINTERLACED,

       FB_MODE_IS_DETAILED,},

}

紅色部分即為我這款螢幕的引數值,看是不是滿足上述兩個等式,我也隨意調換了幾次其中的引數值,發現只有滿足我之前所說的兩個等式就可以正常顯示。

當然這也只是我的一家之言,我其實對Linux的顯示這部分內容瞭解的也不深,只是因為專案需要,需要除錯液晶屏驅動,我也就對著瞭解了一點這部分的內容,可能有些地方說的不一定對,寫出來僅供大家參考吧。