MT6572使用busrt mode下parameter的实现
时间:10-02
整理:3721RD
点击:
MT6572支持YUV sensor的的初始化参数特别长, 一般都有几千个参数需要下到sensor里面去,如果采用normal mode,这样会导致从AP进入CAMERA很慢,采用burst mode会提高几百ms的提升.
[SOLUTION]
使用之前要确定要确定以下事项
1): sensor 的addr会有自动加1的功能
2): 客户给过来的init parameter没有频繁地址跳跃,大部分需要是连续的,否则效率不高
以下代码兼顾了中间有1个或2个中途有的address不连续但是大部分连续的paramter.
static unsigned short XXXX_table_write_cmos_sensor(unsigned short* para, unsigned int
len)
{
char puSendCmd[I2C_BUFFER_LEN]; //at most 2 bytes address and 6 bytes data for multiple
write. mtk i2c master has only 8bytes fifo.
unsigned int tosend, IDX;
unsigned short addr, data, addr_last;
unsigned short single_addr = 0;
unsigned short single_data = 0;
tosend = 0;
IDX = 0;
while(IDX < len)
{
addr = para[IDX];
if(tosend == 0)
{
addr_last = addr - 2;
}
else
{
addr_last = para[IDX - 2];
}
if (tosend == 0) //新的一个team addr/data的开始
{
single_addr = addr; //new address
puSendCmd[tosend++] = (char)(addr >> 8);
puSendCmd[tosend++] = (char)(addr & 0xFF);
data = para[IDX+1];
single_data = data;//new data
puSendCmd[tosend++] = (char)(data >> 8);
puSendCmd[tosend++] = (char)(data & 0xFF);
IDX += 2;
}
else if (addr == (addr_last + 2)) //对有一段连续addr,把要写的value加载进要写的一段缓冲buffer
{
data = para[IDX+1]; //continue data
puSendCmd[tosend++] = (char)(data >> 8);
puSendCmd[tosend++] = (char)(data & 0xFF);
IDX += 2;
}
// to send out the data if the sen buffer is full or last data or to program to the
different address.
if ((tosend == I2C_BUFFER_LEN) || (IDX == len) || (addr != (addr_last + 2)))
{
if(tosend < 5)//不是连续的一段addr,就要normal mode直接把当前的add/data直接下进去
{
XXXX_write_cmos_sensor(single_addr, single_data);
}
else //是一段连续的addr,就使用burst mode
{
XXXX_I2C_DATA_WRITE(puSendCmd , tosend, SOC5140_WRITE_ID);
}
tosend = 0; //一段连续的数据或单个数据发完,将tosend清0, 进行下一段连续数据的发送
} }
return 0;
}
路过,顶一顶
