⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sccb.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 2 页
字号:
*************************************************************************/
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 + -