📄 sccb.c
字号:
*************************************************************************/
void sccb_write(kal_uint32 cmd, kal_uint32 param)
{
if(sccb_mode==SCCB_SW_8BIT)
{
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_write_id);
sccb_send_byte(cmd);
sccb_send_byte(param);
SCCB_STOP_TRANSMISSION;
}
else if(sccb_mode==SCCB_SW_16BIT)
{
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_write_id);
sccb_send_byte(cmd);
sccb_send_byte(param>>8);
sccb_send_byte(param&0xFF);
SCCB_STOP_TRANSMISSION;
}
else if(sccb_mode==SCCB_HW_8BIT)
{
CLEAR_SCCB_BUFFER;
sccb_status = 0;
SET_SCCB_DATA_LENGTH(3);
ENABLE_SCCB;
REG_SCCB_DATA = sccb_write_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = cmd;
REG_SCCB_DATA = param;
sccb_wait_writeComplete();
}
#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6229))
else if(sccb_mode==SCCB_HW_16BIT)
{
CLEAR_SCCB_BUFFER;
SET_SCCB_DATA_LENGTH(4);
REG_SCCB_DATA = sccb_write_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = cmd;
REG_SCCB_DATA = (param&0xff00)>>8;
REG_SCCB_DATA = (param&0xff);
sccb_status=0;
ENABLE_SCCB;
sccb_wait_writeComplete();
}
#endif
else
{
ASSERT(0);
}
}
/*************************************************************************
* FUNCTION
* sccb_multi_write
*
* DESCRIPTION
* This function 1/2/3/.. phase write to specified register through
* SCCB interface
*
* PARAMETERS
* cmd : the register index
* param : setting value of the specified register
* num : setting number of values
*
* RETURNS
* None
*************************************************************************/
void sccb_multi_write(kal_uint32 cmd, kal_uint32 *param, kal_uint8 num)
{
kal_uint16 i;
if((sccb_mode==SCCB_SW_8BIT)||(sccb_mode==SCCB_SW_16BIT))
{
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_write_id);
sccb_send_byte(cmd);
for(i=0;i<num;i++)
sccb_send_byte(param[i]);
SCCB_STOP_TRANSMISSION;
}
else if(sccb_mode==SCCB_HW_8BIT)
{
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(num+2);
ENABLE_SCCB;
REG_SCCB_DATA = sccb_write_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = cmd;
for(i=0;i<num;i++)
REG_SCCB_DATA = param[i];
sccb_wait_writeComplete();
}
#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6229))
else if(sccb_mode==SCCB_HW_16BIT)
{
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(num*2+2);
REG_SCCB_DATA = sccb_write_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = cmd;
for(i=0;i<num;i++)
{
REG_SCCB_DATA = (param[i]&0xff00)>>8;
REG_SCCB_DATA = (param[i]&0xff);
}
ENABLE_SCCB;
sccb_wait_writeComplete();
}
#endif
else
{
ASSERT(0);
}
}
/*************************************************************************
* FUNCTION
* sccb_cont_write
*
* DESCRIPTION
* This function send cont 8bit command to write 16bit at a time to the register
*
* PARAMETERS
* cmd : the register index of device
* spec_cmd : the special command of device
* parameter : setting value of the specified register of device
*
* RETURNS
* None
*************************************************************************/
void sccb_cont_write(kal_uint32 cmd, kal_uint32 spec_cmd, kal_uint32 param)
{
if(sccb_mode==SCCB_SW_8BIT)
{
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_write_id);
sccb_send_byte(cmd);
sccb_send_byte(param>>8);
SCCB_STOP_TRANSMISSION;
SCCB_START_TRANSMISSION; /*Re-Start Bit*/
sccb_send_byte(sccb_write_id);
sccb_send_byte(spec_cmd);
sccb_send_byte(param&0xFF);
SCCB_STOP_TRANSMISSION;
}
else if(sccb_mode==SCCB_HW_8BIT)
{
SET_SCCB_DATA_LENGTH(3);
REG_SCCB_DATA = sccb_write_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = cmd;
REG_SCCB_DATA = param>>8;
ENABLE_SCCB;
sccb_wait_writeComplete();
SET_SCCB_DATA_LENGTH(3);
REG_SCCB_DATA = sccb_write_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = spec_cmd;
REG_SCCB_DATA = param&0xff;
ENABLE_SCCB;
sccb_wait_writeComplete();
}
else
{
ASSERT(0);
}
}
/*************************************************************************
* FUNCTION
* sccb_read
*
* DESCRIPTION
* This function 2 phase read to specified register through SCCB interface
*
* PARAMETERS
* cmd : the register index of CMOS sensor
*
* RETURNS
* value of the specified register of device
*************************************************************************/
kal_uint32 sccb_read (kal_uint32 cmd)
{
kal_uint32 get_byte=0;
if(sccb_mode==SCCB_SW_8BIT)
{
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_write_id);
sccb_send_byte(cmd);
SCCB_STOP_TRANSMISSION;
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_read_id);
get_byte=sccb_get_byte();
SCCB_STOP_TRANSMISSION;
}
else if(sccb_mode==SCCB_SW_16BIT)
{
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_write_id);
sccb_send_byte(cmd);
SCCB_STOP_TRANSMISSION;
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_read_id);
get_byte=sccb_get_byte();
SCCB_STOP_TRANSMISSION;
}
else if(sccb_mode==SCCB_HW_8BIT)
{
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(2);
ENABLE_SCCB;
REG_SCCB_DATA = sccb_write_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = cmd;
sccb_wait_writeComplete();
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(2);
ENABLE_SCCB;
REG_SCCB_DATA = sccb_read_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = 0;
sccb_wait_readComplete();
get_byte = (REG_SCCB_READ_DATA) & 0xFF;
}
#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6229))
else if(sccb_mode==SCCB_HW_16BIT)
{
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(2);
REG_SCCB_DATA = sccb_write_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = cmd;
ENABLE_SCCB;
sccb_wait_writeComplete();
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(3);
REG_SCCB_DATA = sccb_read_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = 0;
ENABLE_SCCB;
sccb_wait_readComplete();
get_byte=(((REG_SCCB_READ_DATA)&0xff)<<8) | (REG_SCCB_READ_DATA_L);
}
#endif
else
{
ASSERT(0);
}
return get_byte;
}
kal_uint32 sccb_phase3_read (kal_uint32 cmd)
{
kal_uint16 get_byte=0;
if(sccb_mode==SCCB_SW_8BIT)
{
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_write_id);
sccb_send_byte(cmd);
SCCB_STOP_TRANSMISSION;
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_read_id);
get_byte = (sccb_get_byte()&0xFF)<<8;
get_byte |= (sccb_get_byte()&0xFF);
SCCB_STOP_TRANSMISSION;
}
else if(sccb_mode==SCCB_HW_8BIT)
{
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(2);
ENABLE_SCCB;
REG_SCCB_DATA = sccb_write_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = cmd;
sccb_wait_writeComplete();
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(3);
ENABLE_SCCB;
REG_SCCB_DATA = sccb_read_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = 0;
sccb_wait_readComplete();
get_byte = (REG_SCCB_READ_DATA& 0xFF)<<8;
get_byte|= (REG_SCCB_READ_DATA);
}
else
{
ASSERT(0);
}
return get_byte;
}
/*************************************************************************
* FUNCTION
* sccb_multi_read
*
* DESCRIPTION
* This function 1/2/3/.. phase read from specified register through
* SCCB interface (auto increase)
*
* PARAMETERS
* cmd : the register index
* param : read value of the specified register (auto increase)
* num : number of values
*
* RETURNS
* TRUE / FALSE
*************************************************************************/
kal_uint8 sccb_multi_read (kal_uint32 cmd, kal_uint32 *param, kal_uint8 num)
{
kal_uint16 idx;
if((sccb_mode==SCCB_SW_8BIT)||(sccb_mode==SCCB_SW_16BIT))
{
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_write_id);
sccb_send_byte(cmd);
SCCB_STOP_TRANSMISSION;
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_read_id);
for(idx=0;idx<num;idx++)
param[idx]=sccb_get_byte();
SCCB_STOP_TRANSMISSION;
if(idx!=num)
return KAL_FALSE;
}
else if(sccb_mode==SCCB_HW_8BIT)
{
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(2);
ENABLE_SCCB;
REG_SCCB_DATA = sccb_write_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = cmd;
sccb_wait_writeComplete();
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(1+num);
ENABLE_SCCB;
REG_SCCB_DATA = sccb_read_id | SCCB_DATA_REG_ID_ADDRESS;
for(idx=0;idx<num;idx++)
{
if(sccb_wait_readComplete()==KAL_FALSE)
break;
param[idx] = REG_SCCB_READ_DATA;
}
if(idx!=num)
return KAL_FALSE;
}
#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6229))
else if(sccb_mode==SCCB_HW_16BIT)
{
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(2);
REG_SCCB_DATA = sccb_write_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = cmd;
ENABLE_SCCB;
sccb_wait_writeComplete();
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(1+num);
REG_SCCB_DATA = sccb_read_id | SCCB_DATA_REG_ID_ADDRESS;
//REG_SCCB_DATA = 0;
ENABLE_SCCB;
for(idx=0;idx<num;idx++)
{
if(sccb_wait_readComplete()==KAL_FALSE)
break;
param[idx] = (((REG_SCCB_READ_DATA)&0xff)<<8) | (REG_SCCB_READ_DATA_L);
}
if(idx!=num)
return KAL_FALSE;
}
#endif
else
{
ASSERT(0);
}
return KAL_TRUE;
}
/*************************************************************************
* FUNCTION
* sccb_cont_read
*
* DESCRIPTION
* This function send cont 8bit command to read 16bit at a time to the register
*
* PARAMETERS
* cmd : the register index of device
* spec_cmd : the special command of device
*
* RETURNS
* value of the specified register of device
*************************************************************************/
kal_uint32 sccb_cont_read (kal_uint32 cmd, kal_uint32 spec_cmd)
{
kal_uint16 get_byte;
kal_uint8 hibyte=0, lobyte=0;
if(sccb_mode==SCCB_SW_8BIT)
{
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_write_id);
sccb_send_byte(cmd);
SCCB_STOP_TRANSMISSION;
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_read_id);
hibyte = sccb_get_byte()& 0xFF;
SCCB_STOP_TRANSMISSION;
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_write_id);
sccb_send_byte(spec_cmd);
SCCB_STOP_TRANSMISSION;
SCCB_START_TRANSMISSION;
sccb_send_byte(sccb_read_id);
lobyte = sccb_get_byte()& 0xFF;
SCCB_STOP_TRANSMISSION;
}
else if(sccb_mode==SCCB_HW_8BIT)
{
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(2);
REG_SCCB_DATA = sccb_write_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = cmd;
ENABLE_SCCB;
sccb_wait_writeComplete();
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(2);
REG_SCCB_DATA = sccb_read_id | SCCB_DATA_REG_ID_ADDRESS;
//REG_SCCB_DATA = 0;
ENABLE_SCCB;
sccb_wait_readComplete();
hibyte = (REG_SCCB_READ_DATA) & 0xFF;
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(2);
REG_SCCB_DATA = sccb_write_id | SCCB_DATA_REG_ID_ADDRESS;
REG_SCCB_DATA = spec_cmd;
ENABLE_SCCB;
sccb_wait_writeComplete();
CLEAR_SCCB_BUFFER;
sccb_status=0;
SET_SCCB_DATA_LENGTH(2);
REG_SCCB_DATA = sccb_read_id | SCCB_DATA_REG_ID_ADDRESS;
//REG_SCCB_DATA = 0;
ENABLE_SCCB;
sccb_wait_readComplete();
lobyte = (REG_SCCB_READ_DATA) & 0xFF;
}
else
{
ASSERT(0);
}
get_byte =(hibyte<<8) | (lobyte);
return get_byte;
}
#endif /* MT6219 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -