声明:本资料来自公司同事整理
SCCB:简单说跟I2C是相同的一个协议。 SIO_C和SIO_D分别为SCCB总线的时钟线和数据线。SCCB控制总线功能的实现完全是依靠SIO_C、SIO_D两条总线上电平的状态以及两者之间的相互配合实现的。其支持两种地址形式:①从设备地址(ID Address,8bit),分为读地址和写地址,高7位用于选中芯片, 第0位是读/写控制位(R/W),决定是对该芯片进行读或写操作;②内部寄存器单元地址(Sub_ Address,8bit),用于决定对内部的哪个寄存器单元进行操作,通常还支持地址单元连续的多字节顺序读写操作。
DMA传输: DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。所以DMA传输的延时要小。
1.如果遇到SCCB通信不正常,可以看一下这一点建议
具体的例子,位于sccb.h中
#elif defined(MT6253T) || defined(MT6253)
#ifdef __CUST_NEW__
#define SCCB_SERIAL_CLK_PIN 28 //(24|GPIO_MAGIC_NUM)
#define SCCB_SERIAL_DATA_PIN 27 //(25|GPIO_MAGIC_NUM)
#else /* __CUST_NEW__ */
…
建议改为
#elif defined(MT6253T) || defined(MT6253)
#ifdef __CUST_NEW__
#define SCCB_SERIAL_CLK_PIN gpio_sccb_serial_clk_pin //28 //(24|GPIO_MAGIC_NUM)
#define SCCB_SERIAL_DATA_PIN gpio_sccb_serial_data_pin //27 //(25|GPIO_MAGIC_NUM)
#else /* __CUST_NEW__ */
其中SCCB_SERIAL_CLK_PIN 为时钟线,SCCB_SERIAL_DATA_PIN 为数据线。通过其对应的gpio进行电平高低配置来修改所需的地址。
这样方便统一管理引脚配置,MTK定义__CUST_NEW__就是方便配置,否则要花时间到处这个定义。
2. 如果遇到屏无法正常显示,大家可以看一下这一点建议:
lcd.c文件中对lcd的寄存器进行配置时都采用了dma传送数据
现在lcd.c中存在如下代码
例如
#define LCD_CtrlWrite_ILI9325DS(_data) /
{/
SET_LCD_CMD_PARAMETER(0,LCD_CMD,((_data & 0xFF00)>>8));/
SET_LCD_CMD_PARAMETER(1,LCD_CMD,(_data & 0xFF));/
LCD_SEND_DMA_CMD(2);/
}/
SET_LCD_CMD_PARAMETER(0,LCD_CMD, (0x0050&0xFF00));//0x0050 startx的寄存器
SET_LCD_CMD_PARAMETER(1,LCD_CMD, (0x0050 & 0xFF));
SET_LCD_ROI_CTRL_NUMBER_OF_CMD(26);
这样做的好处是快速配置lcd, 更节省时间,但是有一定的弊端:有些屏无法接受如此快的设置,导致无法正常显示。
解决的方法有两个:
方法1:在init_lcd_interface降低lcd读写时序,将延迟加大
方法2.:在配置lcd寄存器时不采用dma传送方式,而采用一般的读写方式,例如如下定义
#define LCD_CtrlWrite_General(_data) /
{/
*(volatile kal_uint8 *) MAIN_LCD_CMD_ADDR= ((_data & 0xFF00)>>8);/
*(volatile kal_uint8 *) MAIN_LCD_CMD_ADDR= (_data & 0xFF);/
LCD_Drv_delay();/
}/
#define LCD_set_reg_General(reg_index, reg_data) /
{ /
LCD_CtrlWrite_General(reg_index); /
LCD_DataWrite_General(reg_data);/
}
虽然方法2会稍微慢一点,但是配置寄存器所占时间毕竟不是很长,影响不大,如果降低dma读写时序,对整个刷屏的时间会有一定的影响。
3. 如果发现camera键已经利用Drv_Tool目录下的DrvGen.exe配置了,但是按camera键还是没有任何反应,可以参考此点
KeyBrd.c的 const static key_code_map_struct g_key_code_map[]中添加如下一行
{DEVICE_KEY_CAMERA, KEY_CAMERA},
同过这个例子,可以看到按键事件的初始化过程存在着物理按键与逻辑按键的映射。