小弟进入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信息也没有打印出来,没能执行到这个函数?,而上层函数都已经调用。
第四个参数不管写入什么值均未看到显示效果有变化。
错在哪里?还需编写哪些代码?恳求高手赐教![ |