找回密码
 注册
搜索
查看: 6311|回复: 32

[讨论] LCD工程模式 在线调试程序 求教

[复制链接]
发表于 2009-12-5 13:03:04 | 显示全部楼层 |阅读模式
小弟进入MTK修bug行业几个月以来,大部分时间都在调屏。有时虽然driver IC是一样,但不同客户用的屏玻璃不一样,得调横条纹或颜色深浅(看起来是亮度不一样)。
对于这些效果调试,也就是往某个寄存器写某个值。如果效果变差则向相反的方向(写入更小的值)操作。而这样编译需要1~2分钟,下载4~5分钟,开机看效果需要
2~3分钟,一个回合下来需要花费十分钟左右,效率很低下。所以打算编写可以在线调试的程序,但一直没成功,特来请教各位高手。
如下的LCD函数结构体,平常我们只要完成CheckId(如需要兼容多种IC的屏),Init,EnterSleepMode,ExitSleepMode,BlockWrite,GetSize这几个函数就可以点亮屏

typedef struct
{
   kal_uint16 (* CheckId)(void);       
   void (* Init)(kal_uint32 background, void **buf_addr);
   void (* TurnOnPower)(kal_bool on);
   void (* SetBrightLevel)(kal_uint8 level);
   void (* TurnOnScreen)(kal_bool on);
  void (* BlockWrite)(kal_uint16 startx,kal_uint16 starty,kal_uint16 endx,kal_uint16 endy);
   void (* GetSize)(kal_uint16 *out_LCD_width,kal_uint16 *out_LCD_height);
   void (* EnterSleepMode)(void);
   void (* ExitSleepMode)(void);
   void (* TurnOnPartialDisplay) (kal_uint16 start_page,kal_uint16 end_page);
   void (* TurnOffPartialDisplay) (void);
   kal_uint8 (*GetPartialDisplayAlignment) (void);
   /*Engineering mode*/
   kal_uint8 (* GetEngineeringModeParamNumber)(lcd_func_type type);
   void (* SetBias)(kal_uint8 *bias);
   void (* SetContrast)(kal_uint8 *contrast);
   void (* SetLineRate)(kal_uint8 *linerate);
   void (* SetTemperatureCompensate)(kal_uint8 *compensate);
}LCD_Funcs;
要实现在线调试的功能,想法是可以往某个寄存器写某个值。完成GetEngineeringModeParamNumber和SetLineRate。以HX8340为例,具体实现如下:
kal_uint8 LCD_GetParm_HX8340(lcd_func_type type)
{
   switch(type)
   {
      case lcd_Bais_func:
         return 0;
      case lcd_Contrast_func:
         return 1;
      case lcd_LineRate_func:
         return 2;
      case lcd_Temperature_Compensation_func:
         return 3;
      default:
         ASSERT(0);
         return 100;
   }
}

lcd_Bais_func,lcd_Contrast_func,lcd_LineRate_func,lcd_Temperature_Compensation_func是值为0-3的枚举类型结构体

void LCD_LineRate_HX8340(kal_uint8 *linerate)
{
        kal_uint8 reg_index_h_0;
        kal_uint8 reg_index_l_0;
        kal_uint8 reg_data_h_0;
        kal_uint8 reg_data_l_0;

        kal_uint16 reg_index_0;
        kal_uint16 reg_data_0;
reg_index_h_0=*linerate++;
        kal_prompt_trace(MOD_BMT,"reg_index_h_0=%x\n",reg_index_h_0);
        reg_index_l_0=*linerate++;
        kal_prompt_trace(MOD_BMT,"reg_index_l_0=%x\n",reg_index_l_0);
        reg_data_h_0=*linerate++;
        kal_prompt_trace(MOD_BMT,"reg_data_h_0=%x\n",reg_data_h_0);
        reg_data_l_0=*linerate++;
        kal_prompt_trace(MOD_BMT,"reg_data_l_0=%x\n",reg_data_l_0);
       
        reg_index_0=((reg_index_h_0<<8)| reg_index_l_0);
        kal_prompt_trace(MOD_BMT,"reg_index_0=%x\n",reg_index_0);
                reg_data_0= ((reg_data_h_0 <<8)| reg_data_l_0 );
        kal_prompt_trace(MOD_BMT,"reg_data_0=%x\n",reg_data_0);
       
        LCD_write_reg(reg_index_0,reg_data_0);
        LCD_send_cmd(0x22);   
}
前两个参数为寄存器地址(或者称为指令),后两个参数为写入的值。
MMI部分的程序已做好,运行以后,进入工程模式,写00,36(即十六进制的0x24--VCOMH,会影响横条纹的寄存器),00,28(0x1c)
trace信息也没有打印出来,没能执行到这个函数?,而上层函数都已经调用。
第四个参数不管写入什么值均未看到显示效果有变化。
错在哪里?还需编写哪些代码?恳求高手赐教!
 楼主| 发表于 2009-12-9 23:44:00 | 显示全部楼层
太让人失望了,竟一个留言的人都没有。可能是开篇帖子太长了吧,懒得看。
已经有比较大的进展了,kal_uint8 LCD_GetParm_HX8340(lcd_func_type type)返回的是配置某个函数需要设置的参数个数,比如case lcd_LineRate_func的参数有四个,那么应该返回4,而不是2.所以没看到有变化的效果。等全部完成后再结帖
点评回复

使用道具 举报

 楼主| 发表于 2009-12-16 23:22:44 | 显示全部楼层
这个问题或许比较初级吧,但对经常调屏的人帮助还是挺大的。都是看的人多,回贴的没一个,挺让人失望的。但做事得有始有终,来个总结吧。
(1)首先在MMI_features.h中将__MMI_EM_DEV_LCD__这个宏打开。上层的文件主要在EngineerModeDeviceSrc.c中
(2)在lcd.c中kal_uint8 LCD_GetParm_HX8340(lcd_func_type type)返回参数个数依具体情况而定,一般为3个(1个地址2个数据)或4个(2地址2数据),如写gamma值则更多。
(3)在lcd.c中选取lcd_Bais_func,lcd_Contrast_func,lcd_LineRate_func,lcd_Temperature_Compensation_func这四个函数中的一个完成对寄存器写值的功能。如取lcd_LineRate_func
void LCD_LineRate_HX8340(kal_uint8 *linerate)
{
    LCD_write_command(linerate++);
    LCD_write_command(linerate++);
    LCD_write_data(linerate++);
    LCD_write_data(linerate);
}
(4)如果不想NEW的话,就先make XXX  gprs resgen完成后再make XXX gprs resgen r
(5)开机进入工程模式,进入相应的菜单,就能看到line rate设置了。对于ILI9225,写入0,54(0X36),0,8即可看到屏幕旋转。
点评回复

使用道具 举报

发表于 2009-12-17 00:06:47 | 显示全部楼层
我来学习,继续完善,做一个加载LCD驱动的东东,驱动编译好,放T卡,然后加载,调试更快。
点评回复

使用道具 举报

发表于 2009-12-20 11:31:22 | 显示全部楼层
路过 帮顶  UP
点评回复

使用道具 举报

发表于 2010-3-19 12:58:22 | 显示全部楼层
好贴!!  顶顶。。。
点评回复

使用道具 举报

发表于 2010-3-22 12:15:53 | 显示全部楼层
学习了。。
点评回复

使用道具 举报

发表于 2010-3-22 17:58:53 | 显示全部楼层
好贴!!
点评回复

使用道具 举报

发表于 2010-3-23 11:30:19 | 显示全部楼层
做一个加载LCD驱动的东东,驱动编译好,放T卡,然后加载,调试更快。
这个咋弄?
点评回复

使用道具 举报

发表于 2010-3-29 11:06:05 | 显示全部楼层
先收藏了。
点评回复

使用道具 举报

发表于 2010-3-29 11:17:02 | 显示全部楼层
楼主是个有心人,顶顶吧,做的不错。
点评回复

使用道具 举报

发表于 2010-3-31 17:08:35 | 显示全部楼层
楼主,我想向你拜师,好不好?我刚毕业做手机行业不久,正在学屏驱动这一块,我很诚心向你学习,
点评回复

使用道具 举报

发表于 2010-4-20 23:32:23 | 显示全部楼层
下载4~5分钟
点评回复

使用道具 举报

发表于 2010-5-18 15:00:38 | 显示全部楼层
实在是好东西。谢谢lz
点评回复

使用道具 举报

发表于 2010-6-4 17:01:01 | 显示全部楼层
顶楼主,虽然看不明白!
点评回复

使用道具 举报

发表于 2010-6-6 22:23:25 | 显示全部楼层
thank u for your share[em01]
点评回复

使用道具 举报

发表于 2010-6-9 18:55:29 | 显示全部楼层
支持你。
前辈你的QQ是多少,我做你的徒弟。
点评回复

使用道具 举报

发表于 2010-6-10 19:36:33 | 显示全部楼层
楼主啊,我最近做了个AT命令来调试
通过发送AT命令带参数(一个寄存器 一个寄存器的值)
就可以在线修改你想改的寄存器查看效果
你可以尝试尝试
点评回复

使用道具 举报

发表于 2010-6-12 16:06:14 | 显示全部楼层
楼主高手。
点评回复

使用道具 举报

发表于 2010-6-19 18:56:13 | 显示全部楼层
呵,没有异议,走过路过,[em14][em14]
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-12-23 09:43 , Processed in 0.072501 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表