打印

LCD工程模式 在线调试程序 求教

[复制链接]
2468|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
想实习去|  楼主 | 2010-4-14 13:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟进入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信息也没有打印出来,没能执行到这个函数?,而上层函数都已经调用。
第四个参数不管写入什么值均未看到显示效果有变化。
错在哪里?还需编写哪些代码?恳求高手赐教![

相关帖子

沙发
想实习去|  楼主 | 2010-4-14 13:49 | 只看该作者
自己顶,总结一下!
已经有比较大的进展了,kal_uint8 LCD_GetParm_HX8340(lcd_func_type type)返回的是配置某个函数需要设置的参数个数,比如case lcd_LineRate_func的参数有四个,那么应该返回4,而不是2.所以没看到有变化的效果。等全部完成后再结帖

使用特权

评论回复
板凳
想实习去|  楼主 | 2010-4-14 13:50 | 只看该作者
这个问题或许比较初级吧,但对经常调屏的人帮助还是挺大的。都是看的人多,回贴的没一个,挺让人失望的。但做事得有始有终,来个总结吧。
(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即可看到屏幕旋转

使用特权

评论回复
地板
金鱼木鱼| | 2010-4-15 21:16 | 只看该作者
LS几位哥哥太专业了!学习了!

使用特权

评论回复
5
年轻不在| | 2010-4-15 21:23 | 只看该作者
楼主真是牛人,总结的太好了

使用特权

评论回复
6
JackFang16896| | 2011-5-31 19:02 | 只看该作者
学习了
我也是屏的

使用特权

评论回复
7
JackFang16896| | 2011-5-31 19:04 | 只看该作者
向楼主学习了
这个好像可以编写一个休眠自加的程序
很短一段代码
每休眠一次,需要调整的寄存器值自动增加
知道打到最佳结果

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

500

帖子

1

粉丝