天天看點

【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

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

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。

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

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> 然後添加以下代碼:(注意:此段代碼的位置,見後面的錯誤解決) 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, .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, .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的出錯:

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

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

下載下傳附件 儲存到相冊 設為封面

Linux入門之LCD驅動移植

昨天 15:53 上傳

圖 15‑12 代碼位置出錯圖 分析與解決: 在(2)中添加的...一段代碼的位置出錯,導緻“smdk2410_fb_info”沒有聲明而報錯。此段代碼應放于檔案中調用smdk2410_lcd_cfg __initdata與smdk2410_fb_info __initdata函數的函數之前,否則編譯出錯。 4、如何将開機logo中的光标去除

[[email protected] 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

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

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

繼續閱讀