【Linux基礎】Linux-2.6.30 _LCD 驅動移植

LCD驅動和型號包括支持幀緩衝設備和支持S3C2410 LCD(好多時候S3C2440和S3C2410是一樣驅動的,所以就沒有爲S3C2440另外給出)幀緩衝,3.5寸的NEC LCD。
在linux-2.6.30.4內核結構中對寄存器 lcdcon1-4 全部用函數進行了自動設置,Linux入門培訓我們只需對 lcdcon5進行設置(重點在下面幾個變量數值上)。
.left_margin
.right_margin
.hsync_len
.upper_margin
.lower_margin
.vsync_len
上面變量主要是在內核源碼drivers/video/s3c2410fb.c中定義,其與VSPW、VFPD、VBPD、HFPD等物理量之間的匹配關係也可以從drivers/video/s3c2410fb.c中找到。
VSPW :垂直同步信號的脈寬,單位爲 1 行( Line )的時間。
VFPD:垂直同步信號的前肩,單位爲 1 行( Line )的時間。
VBPD:垂直同步信號的後肩,單位爲 1 行( Line )的時間。
LINEVAL :垂直顯示尺寸 -1 ,即屏行寬 -1 。
HBPD :水平同步信號的後肩,單位爲 1VCLK 的時間。
HFPD : 水平同步信號的前肩, 單位爲 1VCLK 的時間 。
HSPW : 水平同步信號的脈寬,單位爲 1VCLK 的時間。
HOZVAL :水平顯示尺寸 -1 ,即屏列寬 -1 。
時序圖如圖 15‑10

01.jpg (52.06 KB, 下載次數: 1)

下載附件 保存到相冊 設爲封面

Linux-2.6.30-LCD驅動移植

昨天 15:45 上傳

圖 15‑10 3.5寸屏時序圖
因此根據時序關係可以確定3.5寸屏的變量值爲
.left_margin = 21.
.right_margin = 39
.hsync_len = 31
.upper_margin = 13
.lower_margin = 16
.vsync_len = 4
備註:如何計算出上面各種變量呢?如圖 15‑11。

02.jpg (22.43 KB, 下載次數: 1)

下載附件 保存到相冊 設爲封面

Linux入門培訓之驅動移植

昨天 15:49 上傳

例如 :
.left_margin = 21, 該值的計算是根據內核 LCD 寄存器取值的定義函數
S3C2410_LCDCON3_HFPD(var->left_margin - 1) HFPD 的數據可以根據芯片廠
商的說明手冊來獲取。
可確定( left_margin – 1 )的值等於 20 ,即 left_margin 爲 21.
其它的變量類似。
下面對相關結構體作如下修改。
1 、在linux-2.6.30.4/arch/arm/mach-s3c2410/mach-smdk2410.c 中添加如下的LCD配置源碼:
#vi arch/arm/mach-s3c2410/mach-smdk2410.c
(1) 首先添加 LCD 頭文件
#include <mach/fb.h>
然後添加以下代碼:(注意:此段代碼的位置,見後面的錯誤解決)
/* LCD driver info */
static struct s3c2410fb_display smdk2410_lcd_cfg __initdata = {
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
.type = S3C2410_LCDCON1_TFT,
.width = 320,
.height = 240,
.pixclock = 170000, /* HCLK 60 MHz, divisor 10 */
.xres = 320,
.yres = 240,
.bpp = 16,
.left_margin = 21,
.right_margin = 39,
.hsync_len = 31,
.upper_margin = 16,
.lower_margin = 13,
.vsync_len = 4,
};
static struct s3c2410fb_mach_info smdk2410_fb_info __initdata = {
.displays = &smdk2410_lcd_cfg,
.num_displays = 1,
.default_display = 0,
};
(3) 然後在 static void init smdk2410_init(void) C語言入門始化函數中添加 LCD 初始化
功能。
static void __init smdk2410_init(void)
{
s3c24xx_fb_set_platdata(&smdk2410_fb_info);
s3c_i2c0_set_platdata(NULL);
platform_add_devices(smdk2410_devices,ARRAY_SIZE(smdk2410_devices));
smdk_machine_init();
}
(4) 刪除 arch/arm/mach-s3c2440/mach-smdk2440.c 中內容如下( 加粗部分 )
static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
.type = S3C2410_LCDCON1_TFT,
.width = 240,
.height = 320,
.pixclock = 166667, /* HCLK 60 MHz, divisor 10 */
.xres = 240,
.yres = 320,
. bpp = 16,
.left_margin = 20,
.right_margin = 8,
.hsync_len = 4,
.upper_margin = 8,
.lower_margin = 7,
.vsync_len = 4,
};
2 、自定義logo
(1)進入linux的kde圖形界面,使用The GIMP 圖像編輯器打開你想要的圖像文件,依次選擇圖像->模式->索引顏色,將顏色改爲224色;至於圖片大小,不要大於顯示器分辨率,最後將文件另存爲ppm格式(ASCii碼),C語言教程文件名爲:logo_linux_clut224.ppm。
(2)把logo_linux_clut224.ppm 拷貝到 drivers/video/logo 下替換相應用 ppm 圖片,並刪除所生成的目標代碼。
#rm - fr drivers/video/logo/logo_linux_clut224.*
#cp -r /mnt/hgfs/share/logo_linux_clut224.ppm drivers/video/logo
3 、重新配置內核。
在 make menuconfig 時,選中
Device Drivers --->
Graphics support --->
< * > Support for frame buffer devices
[ * ] Bootup logo --->
[ * ] Standard 224-color Linux logo
最後,編譯
make
燒寫到開發板上,重新啓動即可以看到自定義的圖像。
可能出現如圖 15‑12的出錯:

03.jpg (30.43 KB, 下載次數: 1)

下載附件 保存到相冊 設爲封面

Linux入門之LCD驅動移植

昨天 15:53 上傳

圖 15‑12 代碼位置出錯圖
分析與解決:
在(2)中添加的/* LCD driver info */...一段代碼的位置出錯,導致“smdk2410_fb_info”沒有聲明而報錯。此段代碼應放於文件中調用smdk2410_lcd_cfg __initdata與smdk2410_fb_info __initdata函數的函數之前,否則編譯出錯。
4、如何將開機logo中的光標去除
[root@localhost linux-2.6.30.4]# vi drivers/video/console/fbcon.c
將static void fb_flashcursor(struct work_struct *work)製作空函數
static void fb_flashcursor(struct work_struct *work)
{
#if 0
struct fb_info *info = container_of(work, struct fb_info, queue);
struct fbcon_ops *ops = info->fbcon_par;
struct display *p;
struct vc_data *vc = NULL;
int c;
int mode;
acquire_console_sem();
if (ops && ops->currcon != -1)
vc = vc_cons[ops->currcon].d;
…………
CM_ERASE : CM_DRAW;
ops->cursor(vc, info, mode, softback_lines, get_color(vc, info, c, 1),
get_color(vc, info, c, 0));
release_console_sem();
#endif
}
將static void fbcon_cursor(struct vc_data *vc, int mode)製成空函數
static void fbcon_cursor(struct vc_data *vc, int mode)
{
#if 0
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
struct fbcon_ops *ops = info->fbcon_par;
int y;
int c = scr_readw((u16 *) vc->vc_pos);
……………
ops->cursor(vc, info, mode, y, get_color(vc, info, c, 1),
get_color(vc, info, c, 0));
vbl_cursor_cnt = CURSOR_DRAW_DELAY;
#endif
}
logo顯示程序流程分析,如圖 15‑13

04.jpg (33.13 KB, 下載次數: 1)

下載附件 保存到相冊 設爲封面

Linux入門之驅動移植

昨天 15:55 上傳

系統正常啓動後10分鐘後LCD黑屏?
解決方法:
、修改LCD驅動,把關閉LCD控制器的函數變爲空(不推薦)
、修改drivers/char/vt.c中的blank_screen_t()函數,讓其爲空(在系統不需要使用關閉顯示功能時推薦)
、修改/drivers/char/vt.c中的blankinterval,讓其爲0(系統可能需要使用關閉顯示功能,而且希望系統上電後正常狀態下不會關閉顯示時推薦)
、修改用戶程序,加入設置blankinterval的代碼(推薦)
修改結果爲:觸摸屏停留在顯示你的圖片上,有時會因爲文件系統出問題而導致顯示短暫,換個文件系統試試即可。
本文轉載於C語言入門,http://www.weicedu.com/thread-275836-1-1.html
發佈了1 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章