一、快速修改参数快速测试方法:
修改文件
modified: kernel/drivers/video/of_display_timing.c
modified: kernel/drivers/video/videomode.c
modified: kernel/init/do_mounts.c
1、通过bootloader的arg参数传递值到kernel,kernel中lvds获取arg参数进行快速测试验证。
barebox中在env/boot/emmc文件中增加参数值
如
global.linux.bootargs.dyn.root="root=/dev/mmcblk3p2 rootwait rw pclk=50000000 hfp=16 hbp=160 hsync=8 vfp=2 vbp=12 vsync=3"
2、在kernel/init/do_mounts.c获取从barebox中获取到的参数
--- a/kernel/init/do_mounts.c
+++ b/kernel/init/do_mounts.c
@@ -290,6 +290,121 @@ static int __init root_dev_setup(char *line)
__setup("root=", root_dev_setup);
+
+#if 1
+int lcdpara_pclk=0 ;
+
+int lcdpara_hfp =0 ;
+int lcdpara_hbp =0 ;
+int lcdpara_hsync =0 ;
+
+int lcdpara_vfp =0 ;
+int lcdpara_vbp =0 ;
+int lcdpara_vsync =0 ;
+
+ int str2int(const char *str)
+ {
+ int temp = 0;
+ const char *ptr = str;
+ if (*str == '-' || *str == '+')
+ {
+ str++;
+ }
+ while(*str != 0)
+ {
+ if ((*str < '0') || (*str > '9'))
+ {
+ break;
+ }
+ temp = temp * 10 + (*str - '0');
+ str++;
+ }
+ if (*ptr == '-')
+ {
+ temp = -temp;
+ }
+ return temp;
+ }
+
+static int __init lcdpara_pclk_setup(char *line)
+{
+ printk(KERN_INFO"lcdpara_pclk_setup line=%s",line);
+ lcdpara_pclk = str2int(line);
+ printk(KERN_INFO"lcdpara_pclk_setup lcdpara_pclk=%d",lcdpara_pclk);
+ return 1;
+}
+
+__setup("pclk=", lcdpara_pclk_setup);
+
+
+static int __init lcdpara_hfp_setup(char *line)
+{
+ printk(KERN_INFO"lcdpara_hfp_setup line=%s",line);
+ lcdpara_hfp = str2int(line);
+ printk(KERN_INFO"lcdpara_hfp_setup lcdpara_hfp=%d",lcdpara_hfp);
+ return 1;
+}
+
+__setup("hfp=", lcdpara_hfp_setup);
+
+
+static int __init lcdpara_hbp_setup(char *line)
+{
+ printk(KERN_INFO"lcdpara_hbp_setup line=%s",line);
+ lcdpara_hbp = str2int(line);
+ printk(KERN_INFO"lcdpara_hbp_setup lcdpara_hbp=%d",lcdpara_hbp);
+ return 1;
+}
+
+__setup("hbp=", lcdpara_hbp_setup);
+
+
+static int __init lcdpara_hsync_setup(char *line)
+{
+ printk(KERN_INFO"lcdpara_hsync_setup line=%s",line);
+ lcdpara_hsync = str2int(line);
+ printk(KERN_INFO"lcdpara_hsync_setup lcdpara_hsync=%d",lcdpara_hsync);
+ return 1;
+}
+
+__setup("hsync=", lcdpara_hsync_setup);
+
+
+
+static int __init lcdpara_vfp_setup(char *line)
+{
+ printk(KERN_INFO"lcdpara_vfp_setup line=%s",line);
+ lcdpara_vfp = str2int(line);
+ printk(KERN_INFO"lcdpara_vfp_setup line=%d",lcdpara_vfp);
+ return 1;
+}
+
+__setup("vfp=", lcdpara_vfp_setup);
+
+
+static int __init lcdpara_vbp_setup(char *line)
+{
+ printk(KERN_INFO"lcdpara_vbp_setup line=%s",line);
+ lcdpara_vbp = str2int(line);
+ printk(KERN_INFO"lcdpara_vbp_setup lcdpara_vbp=%d",lcdpara_vbp);
+ return 1;
+}
+
+__setup("vbp=", lcdpara_vbp_setup);
+
+
+static int __init lcdpara_vsync_setup(char *line)
+{
+ printk(KERN_INFO"lcdpara_vsync_setup line=%s",line);
+ lcdpara_vsync = str2int(line);
+ printk(KERN_INFO"lcdpara_vsync_setup lcdpara_vsync=%d",lcdpara_vsync);
+ return 1;
+}
+
+__setup("vsync=", lcdpara_vsync_setup);
+#endif
+
+
static int __init rootwait_setup(char *str)
{
if (*str)
3、修改获取从barebox 传来的时序参数
--- a/kernel/drivers/video/videomode.c
+++ b/kernel/drivers/video/videomode.c
@@ -12,6 +12,16 @@
#include <video/videomode.h>
#include <linux/kernel.h>
+extern int lcdpara_pclk;
+
+extern int lcdpara_hfp;
+extern int lcdpara_hbp;
+extern int lcdpara_hsync;
+
+extern int lcdpara_vfp ;
+extern int lcdpara_vbp ;
+extern int lcdpara_vsync ;
+
extern int lcd_get_ver();
void videomode_from_timing(const struct display_timing *dt,
@@ -30,21 +40,23 @@ void videomode_from_timing(const struct display_timing *dt,
printk(KERN_ERR"videomode_from_timing i308_lcd_get_ver()=%d",i308_lcd_get_ver());
if(lcd_get_ver()==1){
- vm->pixelclock = 69000000;
+ vm->pixelclock = lcdpara_pclk;//65000000;
vm->hactive = 1280;
- vm->hfront_porch = 16;
- vm->hback_porch = 160;
- vm->hsync_len = 8;
+ vm->hfront_porch = lcdpara_hfp;//16;
+ vm->hback_porch = lcdpara_hbp;//160;
+ vm->hsync_len = lcdpara_hsync;//8;
vm->vactive = 800;
- vm->vfront_porch = 2;
- vm->vback_porch = 12;
- vm->vsync_len = 3;
+ vm->vfront_porch = lcdpara_vfp;//2;
+ vm->vback_porch = lcdpara_vbp;//12;
+ vm->vsync_len = lcdpara_vsync;//3;
}
printk(KERN_ERR"videomode_from_timing vm->pixelclock=%d\r\n",vm->pixelclock);
+
printk(KERN_ERR"videomode_from_timing vm->hactive=%d\r\n",vm->hactive);
printk(KERN_ERR"videomode_from_timing vm->hfront_porch=%d\r\n",vm->hfront_porch);
printk(KERN_ERR"videomode_from_timing vm->hback_porch=%d\r\n",vm->hback_porch);
+ printk(KERN_ERR"videomode_from_timing vm->hsync_len=%d\r\n",vm->hsync_len);
printk(KERN_ERR"videomode_from_timing vm->vactive=%d\r\n",vm->vactive);
printk(KERN_ERR"videomode_from_timing vm->vfront_porch=%d\r\n",vm->vfront_porch);
(END)
--- a/kernel/drivers/video/of_display_timing.c
+++ b/kernel/drivers/video/of_display_timing.c
@@ -23,7 +23,19 @@
* Every display_timing can be specified with either just the typical value or
* a range consisting of min/typ/max. This function helps handling this
**/
-
+
+extern int lcdpara_pclk;
+
+extern int lcdpara_hfp;
+extern int lcdpara_hbp;
+extern int lcdpara_hsync;
+
+extern int lcdpara_vfp ;
+extern int lcdpara_vbp ;
+extern int lcdpara_vsync ;
+
+
+
@@ -51,32 +63,32 @@ static int parse_timing_property(struct device_node *np, const char *name,
- result->min =160;
- result->min=160;
+ result->min =lcdpara_hbp;//160;