Ejemplo n.º 1
0
/*lint -save -e958*/
s32 bsp_i2c_word_data_receive(u8 device_id,u8 addr, u16 *data)
/*lint -restore*/
{
	u32 value1 =0xff;
	u32 value2 =0xff;
	unsigned long flags = 0;
	unsigned long flag = 0;
	int ret = 0;
	struct balong_i2c_ctrl *i2c_master;

	/*find i2c master*/
	i2c_master=find_i2c_ctrl(device_id);
	if(!i2c_master){
		i2c_print_error("can find i2c master for device %0x\n",device_id);
		return I2C_ERROR;
	}

	/*lock i2c master*/
    bsp_ipc_spin_lock_irqsave(IPC_SEM_I2C_SWITHC,flag);
	spin_lock_irqsave(&i2c_master->lock,flags);

	/*clock enable*/
	ret = bsp_i2c_clk_enable(i2c_master);
	if(ret){
		i2c_print_error( "i2c clk enable failed ! \n");
		goto irq_error;
	}

	/*send the first message,include start command and write command */
	balong_i2c_message_start(i2c_master,device_id);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){

		i2c_print_error( "i2c status get error! \n");
		goto clk_error;
	}

	/*send slave register addr into TX register*/
	writel(addr,i2c_master->regs+HI_I2C_TXR_OFFSET);

	/*send write command*/
	writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){

		i2c_print_error( "i2c status get error! \n");
		goto clk_error;
	}

	/*send slave addr*/
	writel(device_id<<1|I2C_READ_FLAG,i2c_master->regs+HI_I2C_TXR_OFFSET);

	/*send start & write*/
	writel(HI_I2C_COM_START|HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){

		i2c_print_error( "i2c status get error! \n");
		goto clk_error;
	}
	/*send read command*/
	writel(HI_I2C_COM_READ,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){

		i2c_print_error( "i2c status get error! \n");
		goto clk_error;
	}

	/*read the first byte data*/
	value1=readl(i2c_master->regs+HI_I2C_RXR_OFFSET);

	/*send read command*/
	writel(HI_I2C_COM_READ|HI_I2C_COM_ACK,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){

		i2c_print_error( "i2c status get error! \n");
		goto clk_error;
	}

	/*read the second byte data*/
	value2=readl(i2c_master->regs+HI_I2C_RXR_OFFSET);

	/*send the stop flag*/
	writel(HI_I2C_COM_STOP,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){

		i2c_print_error( "i2c status get error! \n");
		goto clk_error;
	}

	bsp_i2c_clk_disable(i2c_master);
	spin_unlock_irqrestore(&i2c_master->lock,flags);
    bsp_ipc_spin_unlock_irqrestore(IPC_SEM_I2C_SWITHC,flag);
	*data=(u16)((value1<<8)|value2);
	return I2C_OK;

clk_error:
	bsp_i2c_clk_disable(i2c_master);

irq_error:
	spin_unlock_irqrestore(&i2c_master->lock,flags);
    bsp_ipc_spin_unlock_irqrestore(IPC_SEM_I2C_SWITHC,flag);
	return I2C_ERROR;
}
Ejemplo n.º 2
0
s32 bsp_i2c_word_data_send(u8 device_id,u8 addr, u16 data)
{
	/*lint -save -e958*/
	struct balong_i2c_ctrl *i2c_master;
	unsigned long flags = 0;
	unsigned long flag = 0;
	int ret = 0;
	/*lint -restore*/

	/*find i2c master*/
	i2c_master=find_i2c_ctrl(device_id);
	if(!i2c_master){
		i2c_print_error("can find i2c master for device %0x\n",device_id);
		return I2C_ERROR;
	}

	/*lock i2c master*/
    bsp_ipc_spin_lock_irqsave(IPC_SEM_I2C_SWITHC,flag);
	spin_lock_irqsave(&i2c_master->lock,flags);

	/*clock enable*/
	ret = bsp_i2c_clk_enable(i2c_master);
	if(ret){
		i2c_print_error( "i2c clk enable failed ! \n");
		goto irq_error;
	}

	/*send the first message,include start command and write command */
	balong_i2c_message_start(i2c_master,device_id);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){

		i2c_print_error( "i2c status get error! \n");
		goto clk_error;
	}

	/*set addr in TX Regitster*/
	writel(addr,i2c_master->regs + HI_I2C_TXR_OFFSET);

	/*send write command*/
	writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){

		i2c_print_error( "i2c status get error! \n");
		goto clk_error;
	}

	/*set high 8bit data in TX register*/
	writel(data>>8,i2c_master->regs+HI_I2C_TXR_OFFSET);

	/*send write command*/
	writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){

		i2c_print_error( "i2c status get error! \n");
		goto clk_error;
	}

	/*set low 8bit data in TX register*/
	writel(data&(0xff),i2c_master->regs+HI_I2C_TXR_OFFSET);

	/*send write command*/
	writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){

		i2c_print_error( "i2c status get error! \n");
		goto clk_error;
	}

	/*send the stop flag ,erase bus*/
	writel(HI_I2C_COM_STOP,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){

		i2c_print_error( "i2c status get error! \n");
		goto clk_error;
	}

	bsp_i2c_clk_disable(i2c_master);
	spin_unlock_irqrestore(&i2c_master->lock,flags);
    bsp_ipc_spin_unlock_irqrestore(IPC_SEM_I2C_SWITHC,flag);
	return I2C_OK;

clk_error:
	bsp_i2c_clk_disable(i2c_master);

irq_error:
	spin_unlock_irqrestore(&i2c_master->lock,flags);
    bsp_ipc_spin_unlock_irqrestore(IPC_SEM_I2C_SWITHC,flag);
	return I2C_ERROR;
}
Ejemplo n.º 3
0
/*****************************************************************************
 fun_name	: bsp_i2c_byte_data_receive
 function		: i2c read a byte data
 para_in		: 
			device_id:device id
 			addr		:slave addr offset
 			data 	:back the read data
 para_out		: no
 back_val    	: 
 			  0:success
 			-1:fail

 modify log 	:
  	  date	: 2013-4-16
Modification  	: create file
*****************************************************************************/
s32 bsp_i2c_byte_data_receive(u8 device_id, u8 addr,  u16 *data)
{

	struct balong_i2c_ctrl *i2c_master;
	
	/*find i2c master*/
	i2c_master=find_i2c_ctrl(device_id);
	if(!i2c_master){
		cprintf("can find i2c master for device %0x\n",device_id);
		return I2C_ERROR;
	}

	/*send the first message,include start command and write command */
	balong_i2c_message_start(device_id,i2c_master);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error! \n");
		goto error;
	}

	/*send slave register addr into TX register*/
	writel(addr,i2c_master->regs+HI_I2C_TXR_OFFSET);

	/*send write command*/
	writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET);
	
	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error! \n");
		goto error;
	}

	/*the flag has changed ,so send restart*/
	writel(device_id<<1|I2C_READ_FLAG,i2c_master->regs+HI_I2C_TXR_OFFSET);

	/*send start & write*/
	writel(HI_I2C_COM_START|HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error! \n");
		goto error;
	}
	
	/*send read command*/
	writel(HI_I2C_COM_READ|HI_I2C_COM_ACK,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error! \n");
		goto error;
	}

	/*read the first byte data*/
	*data=readl(i2c_master->regs+HI_I2C_RXR_OFFSET);

	/*send the stop flag*/
	writel(HI_I2C_COM_STOP,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error! \n");
		goto error;
	}
	
	balong_i2c_disable(i2c_master);
	return I2C_OK;
error:	
	return I2C_ERROR;

}
Ejemplo n.º 4
0
/*****************************************************************************
 fun_name	: bsp_i2c_word_data_receive
 function		: i2c read a word data
 para_in		: 
			device_id:device id
 			addr		:slave addr offset
 			data 	:back the read data
 para_out		: no
 back_val    	: 
 			  0:success
 			-1:fail

 modify log 	:
  	  date	: 2013-4-16
Modification  	: create file
*****************************************************************************/
s32 bsp_i2c_word_data_receive(u8 device_id,u8 addr, u16 *data)
{
	u32 value1;
	u32 value2;
	
	struct balong_i2c_ctrl *i2c_master;
	
	/*find i2c master*/
	i2c_master=find_i2c_ctrl(device_id);
	if(!i2c_master){
		cprintf("can find i2c master for device %0x\n",device_id);
		return I2C_ERROR;
	}

	
	/*send the first message,include start command and write command */
	balong_i2c_message_start(device_id,i2c_master);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error!after_message_start \n");
		goto error;
	}

	/*send slave register addr into TX register*/
	writel(addr,i2c_master->regs+HI_I2C_TXR_OFFSET);

	/*send write command*/
	writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET);
	
	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error!after send slave register addr \n");
		goto error;
	}

	/*send slave addr and read commond*/
	writel(device_id<<1|I2C_READ_FLAG,i2c_master->regs+HI_I2C_TXR_OFFSET);

	/*send start & write*/
	writel(HI_I2C_COM_START|HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error!after write slave addr and write commond \n");
		goto error;
	}
	/*send read command*/
	writel(HI_I2C_COM_READ,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error!after send read commond 1 \n");
		goto error;
	}

	/*read the first byte data*/
	value1=readl(i2c_master->regs+HI_I2C_RXR_OFFSET);

	/*send read command*/
	writel(HI_I2C_COM_READ|HI_I2C_COM_ACK,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error!after send read commond 2 \n");
		goto error;
	}
	
	/*read the second byte data*/
	value2=readl(i2c_master->regs+HI_I2C_RXR_OFFSET);
	
	/*send the stop flag*/
	writel(HI_I2C_COM_STOP,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error!after send stop \n");
		goto error;
	}

	*data=(u16)((value1<<8)|value2);
	balong_i2c_disable(i2c_master);

	return I2C_OK;
error:	
	return I2C_ERROR;
}
Ejemplo n.º 5
0
s32 bsp_i2c_word_data_send(u8 device_id,u8 addr, u16 data)
{
	struct balong_i2c_ctrl *i2c_master;
	
	/*find i2c master*/
	i2c_master=find_i2c_ctrl(device_id);
	if(!i2c_master){
		cprintf("can find i2c master for device %0x\n",device_id);
		return I2C_ERROR;
	}
	
	/*send the first message,include start command and write command */
	balong_i2c_message_start(device_id,i2c_master);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error! \n");
		goto error;
	}

	/*set addr in TX Regitster*/
	writel(addr,i2c_master->regs + HI_I2C_TXR_OFFSET);

	/*send write command*/
	writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error! \n");
		goto error;
	}
	
	/*set high 8bit data in TX register*/
	writel(data>>8,i2c_master->regs+HI_I2C_TXR_OFFSET);

	/*send write command*/
	writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error! \n");
		goto error;
	}
	
	/*set low 8bit data in TX register*/
	writel(data&(0xff),i2c_master->regs+HI_I2C_TXR_OFFSET);

	/*send write command*/
	writel(HI_I2C_COM_WRITE,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error! \n");
		goto error;
	}

	/*send the stop flag ,erase bus*/
	writel(HI_I2C_COM_STOP,i2c_master->regs+HI_I2C_COM_OFFSET);

	/*check bus is or not transfer over */
	if(I2C_OK!= balong_i2c_status_check(i2c_master)){
	
		cprintf( "i2c status get error! \n");
		goto error;
	}
	balong_i2c_disable(i2c_master);

	return I2C_OK;
error:
	return I2C_ERROR;
}