[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit
Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/boot/common/src/uboot/drivers/i2c/i2c.c b/boot/common/src/uboot/drivers/i2c/i2c.c
new file mode 100644
index 0000000..83ebd5c
--- /dev/null
+++ b/boot/common/src/uboot/drivers/i2c/i2c.c
@@ -0,0 +1,585 @@
+/*
+ * (C) Copyright 2016, ZIXC Corporation.
+ *
+ */
+
+#include <common.h>
+#include <command.h>
+#include <malloc.h>
+#include <asm/io.h>
+#include <i2c.h>
+#include <drvs_gpio.h>
+#include <asm/arch/i2c.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/uart.h>
+#include <asm/arch/lsp_crpm.h>
+#include <config.h>
+
+
+
+T_I2C_Regs *p_i2c_reg[2] = {NULL};
+static uint retries = 3; /* ÖØ¸´²Ù×÷´ÎÊý */
+
+#define REG32(x) (*(volatile u32*)(x))
+
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ * Input:
+ *
+ * Output:
+ *
+ * Returns:
+ *
+ *
+ * Others: 1. ÔÚ100KHZƵÂÊÏ£¬Ê¹Óà zDrvI2c_DevRead_ByteStream ¶Á 32 ×Ö½Úʱ£¬(ÔÚU207ÊÖ»úÉÏ)
+ Ô¼ÏûºÄ tempTimeOut = 600
+ 2. ÓÉÓÚCPUƵÂʲ»¶¨£¬bsp_udelayº¯ÊýÑÓʱ²»Ì«Çå³þ£¬¹ÊʹÓôó²ÎÊý
+ tempTimeOut = 0x20000;
+ ********************************************************************************/
+ static int i2c_WaitTransferOver( T_I2C_Regs *i2c_reg )
+{
+ uint tempTimeOut = 0x20000;
+ uint tempStatus = 0x0;
+
+ while( tempTimeOut )
+ {
+ tempStatus = i2c_reg->I2C_STATUS;
+ if(tempStatus & 0x1)
+ {
+ break;
+ }
+ else
+ {
+ tempTimeOut--;
+ }
+ }
+ if( 0 == tempTimeOut )
+ {
+ i2c_reg->I2C_STATUS |= I2C_IRQ_ACK;
+ return DRV_I2C_ERROR_TIMEOUT; /* ³¬Ê±´íÎó */
+ }
+
+ if (tempStatus & I2C_IRQ_ERR_DEVICE)
+ {
+ i2c_reg->I2C_STATUS |= I2C_IRQ_ACK;
+ return DRV_I2C_ERROR_DEVICE; /* Æ÷¼þµØÖ·´«ÊäÆÚ¼äÓдíÎó·¢Éú */
+ }
+ if (tempStatus & I2C_IRQ_ERR_DATA)
+ {
+ i2c_reg->I2C_STATUS |= I2C_IRQ_ACK;
+ return DRV_I2C_ERROR_DATA; /* ×ÓµØÖ·´«Êä»òÊý¾Ý´«Êä¹ý³ÌÖÐÓдíÎó·¢Éú */
+ }
+
+ if (tempStatus & I2C_IRQ_TIME_OUT)
+ {
+ i2c_reg->I2C_STATUS |= I2C_IRQ_ACK;
+ return DRV_I2C_ERROR_TIMEOUTSELF; /* ³¬Ê±´íÎó */
+ }
+
+ if (tempStatus & I2C_IRQ_TRANS_DONE)
+ {
+ i2c_reg->I2C_STATUS |= I2C_IRQ_ACK;
+ return 0; /* Õý³£Íê³É */
+ }
+ return 0;
+}
+
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ * Input:
+ *
+ * Output:
+ *
+ * Returns:
+ *
+ *
+ * Others: -----------------------------
+ ********************************************************************************/
+ void i2c_Start( T_I2C_Regs *i2c_reg )
+{
+ i2c_reg->CMD |= I2C_CMD_START; /* ²úÉú¿ªÊ¼Ìõ¼þ£¬¿ªÊ¼´«Êä */
+}
+
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ * Input:
+ *
+ * Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:
+ ********************************************************************************/
+ static int i2c_ReadFifoData( T_I2C_Regs *i2c_reg, uchar *read_buf, uint read_len )
+{
+ if( i2c_reg->RXF_STATUS & I2C_RX_FIFO_FULL )
+ {
+ do
+ {
+ *read_buf++ = i2c_reg->DATA;
+ } while( --read_len );
+ }
+ else
+ {
+ return DRV_I2C_RECV_NOT_COMPLETE;
+ }
+ return 0;
+}
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ * Input:
+ *
+ * Output:
+ *
+ * Returns:
+ *
+ *
+ * Others: ÕâÀïÖ±½ÓÈ϶¨ дµÄ¾ßÌåÊý¾Ý×î´ó¸öÊýΪ 30 £¬ÆäʵÔÚ 8λ¼Ä´æÆ÷ģʽÏÂ×î¶à¿ÉÒÔ 31¸ö
+ ********************************************************************************/
+ void i2c_WriteFifoData( T_I2C_Regs *i2c_reg, uchar *writeBuf, uint writerNum )
+{
+ do
+ {
+ i2c_reg->DATA = *writeBuf++; /* дÊý¾Ý */
+ }while(--writerNum != 0);
+}
+
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ * Input:
+ *
+ * Output:
+ *
+ * Returns:
+ *
+ *
+ * Others: ÔÚÐ´ÕæÕýµÄÊý¾ÝǰдÈë¼Ä´æÆ÷µØÖ·µ½ FIFO
+ 1.8λ¼Ä´æÆ÷µØÖ·
+ 2.16λ¼Ä´æÆ÷µØÖ·
+ ********************************************************************************/
+ static void i2c_WriteFifoRegAddr( T_I2C_Regs *i2c_reg, ushort reg_addr, uint reg_len )
+{
+ ushort tempRegAddr = 0;
+ if( reg_len == 16 ) // Èç¹ûλ16λ¼Ä´æÆ÷µØÖ·£¬ÏÈд--¸ß8λ--; ºóд -µÍ8λ--
+ {
+ tempRegAddr = reg_addr;
+ i2c_reg->DATA = tempRegAddr >> 8;
+ }
+ i2c_reg->DATA = reg_addr;
+}
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ * Input:
+ *
+ * Output:
+ *
+ * Returns:
+ *
+ *
+ * Others: ÔÚ¼òµ¥Ð´Ä£Ê½ÏÂ( 8λ¼Ä´æÆ÷ºÍ16λ¼Ä´æÆ÷ )£¬ÉèÖà FifoDepth
+ 1.¸´Î» ½ÓÊÕFIFO ºÍ ·¢ËÍFIFO
+ 2.ÅжÏÊÇ·ñΪ16λ¼Ä´æÆ÷µØÖ·£¬ÈçÊÇ£¬Ôò writerNum +2;
+ ²»È»Îª 8 λ¼Ä´æÆ÷µØÖ·£¬ writerNum +1;
+ 3.дÈë·¢Ë͸öÊýµ½ÏàÓ¦µÄ¼Ä´æÆ÷¡£
+ ********************************************************************************/
+ static void i2c_SetFifoDepthSimpleWrite( T_I2C_Regs *i2c_reg, uint write_len, uint reg_len )
+{
+ uint tempWriterNum = write_len;
+ //¸´Î»WRITE(read)_FIFO_SOFT_RESET
+ i2c_reg->TXF_CTRL |= I2C_TX_FIFO_RST;
+ i2c_reg->RXF_CTRL |= I2C_RX_FIFO_RST;
+
+ if( reg_len == 16 ) //ʹÓà 16λ¼Ä´æÆ÷µØÖ·
+ {
+ tempWriterNum++; //writerNum = writerNum + 2 - 1; //ÕâÀï¼õÈ¥ÁËд¼Ä´æÆ÷ʱÐèÒª½«È¥µÄ 1
+ }
+ i2c_reg->TXF_CTRL = tempWriterNum;
+ i2c_reg->RXF_CTRL = 0;
+}
+
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ * Input:
+ *
+ * Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:
+ ********************************************************************************/
+ static void i2c_SetFifoDepthCombineRead( T_I2C_Regs *i2c_reg, uint read_len, uint reg_len )
+{
+ uint tempWriterNum = 0;
+ //¸´Î»WRITE(read)_FIFO_SOFT_RESET
+ i2c_reg->TXF_CTRL |= I2C_TX_FIFO_RST;
+ i2c_reg->RXF_CTRL |= I2C_RX_FIFO_RST;
+
+ if( reg_len == 16 ) //ʹÓà 16λ¼Ä´æÆ÷µØÖ·
+ {
+ tempWriterNum++; //tempWriterNum = tempWriterNum + 2 - 1;
+ //ÕâÀï¼õÈ¥ÁËд¼Ä´æÆ÷ʱÐèÒª½«È¥µÄ 1
+ }
+ i2c_reg->TXF_CTRL = tempWriterNum;
+ i2c_reg->RXF_CTRL = --read_len;
+}
+
+/*******************************************************************************
+ * Function: i2c_SetFifoDepthSimpleRead
+ * Description:
+ * Parameters:
+ * Input:
+ *
+ * Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:
+ ********************************************************************************/
+ static void i2c_SetFifoDepthSimpleRead( T_I2C_Regs *pi2cReg, uint readNum )
+{
+ //¸´Î»WRITE(read)_FIFO_SOFT_RESET
+ pi2cReg->TXF_CTRL |= I2C_TX_FIFO_RST;
+ pi2cReg->RXF_CTRL |= I2C_RX_FIFO_RST;
+
+ pi2cReg->TXF_CTRL = 0;
+ pi2cReg->RXF_CTRL = --readNum;
+}
+
+/*******************************************************************************
+ * Function: i2c_SetFifoDepthSimpleWriteWithoutReg
+ * Description:
+ * Parameters:
+ * Input:
+ *
+ * Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:
+ ********************************************************************************/
+ static void i2c_SetFifoDepthSimpleWriteWithoutReg( T_I2C_Regs *pi2cReg, uint writerNum )
+{
+ //¸´Î»WRITE(read)_FIFO_SOFT_RESET
+ pi2cReg->TXF_CTRL |= I2C_TX_FIFO_RST;
+ pi2cReg->RXF_CTRL |= I2C_RX_FIFO_RST;
+
+ pi2cReg->TXF_CTRL = writerNum - 1;
+ pi2cReg->RXF_CTRL = 0;
+}
+
+
+/*******************************************************************************
+ * Function: i2c_SetFreq
+ * Description:
+ * Parameters:
+ * Input:
+ *
+ * Output:
+ *
+ * Returns:
+ *
+ *
+ * Others: ÉèÖÃi2c×ÜÏߵįµÂÊ£¬CLK = Fref_clk/( (CLK_DIV_FS+1)*4 )
+ Fref_clk = 26M
+ ²ÎÊý: I2C_FREQ_ONE_HUNDRED_KILO_HZ 100kHz CLK_DIV_FS = 64
+ ²ÎÊý: I2C_FREQ_THREE_HUNDRED_KILO_HZ 300kHz CLK_DIV_FS = 21
+ ²ÎÊý: I2C_FREQ_FOUR_HUNDRED_KILO_HZ 400kHz CLK_DIV_FS = 16
+ ********************************************************************************/
+ static void i2c_SetFreq( T_I2C_Regs *pi2cReg, T_ZDrvI2c_BusFreq devFreq )
+{
+ pi2cReg->CMD &= (~I2C_CMD_SPEED_MODE); /* ʹÓÿìËÙģʽ */
+
+ switch( devFreq )
+ {
+ case I2C_FREQ_ONE_HUNDRED_KILO_HZ:
+ pi2cReg->CLK_DIV_FS = 64;
+ break;
+ case I2C_FREQ_THREE_HUNDRED_KILO_HZ:
+ pi2cReg->CLK_DIV_FS = 21;
+ break;
+ case I2C_FREQ_FOUR_HUNDRED_KILO_HZ:
+ pi2cReg->CLK_DIV_FS = 16;
+ break;
+ default:
+ pi2cReg->CLK_DIV_FS = 64;
+ break;
+ }
+}
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ * Input:
+ *
+ * Output:
+ *
+ * Returns:
+ *
+ *
+ * Others: ÉèÖÃI2C×ÜÏߵĶÁд·½Ê½£¬ÕâÀïĬÈÏΪÖ÷»úģʽ£¬²»Ê¹ÓÃÖжÏ
+ ·ÖΪ ¼òµ¥Ð´¡¢¼òµ¥¶Á¡¢ ---×éºÏ¶Á--- ÈýÖÖģʽ
+ ********************************************************************************/
+static void i2c_SetMode( T_I2C_Regs *i2c_reg, T_I2C_Mode mode )
+{
+ uint cmd_reg = 0x0;
+
+ cmd_reg |= I2C_IRQ_ACK; //Çå³ýÖжϼ°ÆäËû´íÎó¼°×´Ì¬
+ /* ÕâÀï·ÀÖ¹Çå³ýÉϴδ«Êä¿ÉÄܲúÉúµÄ´íÎó״̬ */
+ cmd_reg |= I2C_CMD_MS_SEL; //Ö÷»úģʽ
+ cmd_reg &= (~I2C_CMD_IRQ_EN); //ÖжÏÇëÇ󹨱Õ;
+
+ switch( mode )
+ {
+ case I2C_SIMPLE_WRITE: //²ÉÓüòµ¥Ð´Ä£Ê½
+ cmd_reg &= (~(I2C_CMD_CMB_RW | I2C_CMD_RW));
+ break;
+ case I2C_COMBINE_READ:
+ cmd_reg |= I2C_CMD_CMB_RW; //---²ÉÓÃ×éºÏ¶Á---
+ cmd_reg &= (~I2C_CMD_RW); //0:w 1:r
+ break;
+ default:
+ cmd_reg &= (~I2C_CMD_CMB_RW); //²ÉÓüòµ¥¶Á
+ cmd_reg |= I2C_CMD_RW;
+ break;
+ }
+
+ i2c_reg->CMD = cmd_reg;
+}
+
+
+/*******************************************************************************
+ * Function:
+ * Description: д´Ó»úµØÖ·
+ * Parameters:
+ * Input:
+ *
+ * Output:
+ *
+ * Returns:
+ *
+ *
+ * Others: дÈë´Ó»úµØÖ·£¬ÕâÀïµÄ´Ó»úµØÖ·Ö§³Ö --7λ--10λ--- ´Ó»úµØÖ·
+ 1.7λ´Ó»úµØÖ·£¬²»Ê¹ÄÜ10λµØÖ·£¬Ö±½ÓдÈë´Ó»úµØÖ·¼Ä´æÆ÷¡£¸üе±Ç°×ÜÏߵĴӻúµØÖ·
+ 2.10λ´Ó»úµØÖ·£¬Ê¹ÄÜ10λµØÖ·£¬·Ö±ðдÈëÏàÓ¦¼Ä´æÆ÷¡£ ¸üе±Ç°×ÜÏߵĴӻúµØÖ·
+ ********************************************************************************/
+static void i2c_SetSlaveAddress( T_I2C_Regs *i2c_reg, ushort slaveAddr )
+{
+ if( (slaveAddr & 0xf700) == 0 ) /* 7λ´Ó»úµØÖ· */
+ {
+ i2c_reg->CMD &= (~I2C_CMD_ADDR_MODE);
+ i2c_reg->DEVICE_L = slaveAddr;
+ }
+ else
+ {
+ i2c_reg->CMD |= I2C_CMD_ADDR_MODE;
+ i2c_reg->DEVICE_L = slaveAddr;
+ i2c_reg->DEVICE_H = slaveAddr >> 7;
+ }
+
+}
+
+
+/* ================================================================================
+ * i2c_read:
+ */
+int i2c_read(uint i2c_bus, ushort slave_addr, ushort reg_addr, uint reg_len,
+ uchar *read_buf, uint read_len)
+{
+ int ret = 0;
+ T_I2C_Regs *i2c_Reg = p_i2c_reg[i2c_bus];
+
+ do //¿ªÊ¼´«Êä
+ {
+ i2c_SetFreq(i2c_Reg, I2C_FREQ_ONE_HUNDRED_KILO_HZ); //ÉèÖÃ×ÜÏ߯µÂÊ
+ i2c_SetSlaveAddress(i2c_Reg, slave_addr); //д´Ó»úµØÖ·
+ i2c_SetMode(i2c_Reg, I2C_COMBINE_READ); //×éºÏ¶Áģʽ
+ i2c_SetFifoDepthCombineRead(i2c_Reg, read_len, reg_len); //ÉèÖÃFIFOµÄÉî¶È
+ i2c_WriteFifoRegAddr(i2c_Reg, reg_addr, reg_len); //ÍùFIFOÖÐдÈë¼Ä´æÆ÷µØÖ·
+ i2c_Start(i2c_Reg); //²úÉú¿ªÊ¼Ìõ¼þ£¬¿ªÊ¼´«Êä
+ ret = i2c_WaitTransferOver(i2c_Reg); //µÈ´ý´«Êä½áÊø
+ if( ret != 0 )
+ {
+ continue; //´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´«
+ }
+ ret = i2c_ReadFifoData(i2c_Reg, read_buf, read_len ); //¶ÁÈ¡Êý¾Ý
+ if( ret != 0 )
+ {
+ continue; //´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´«
+ }
+ break; //´«Êä³É¹¦£¬Ìø³öÑ»·
+ } while( --retries != 0 );
+ retries = 3;
+
+ return ret;
+}
+
+/* ================================================================================
+ * i2c_write:
+ */
+int i2c_write(uint i2c_bus, ushort slave_addr, ushort reg_addr, uint reg_len,
+ uchar *write_buf, uint write_len)
+{
+ int ret = 0;
+ T_I2C_Regs *i2c_Reg = p_i2c_reg[i2c_bus];
+
+ do //¿ªÊ¼´«Êä
+ {
+ i2c_SetFreq(i2c_Reg, I2C_FREQ_ONE_HUNDRED_KILO_HZ); //ÉèÖÃ×ÜÏ߯µÂÊ
+ i2c_SetSlaveAddress(i2c_Reg, slave_addr); //д´Ó»úµØÖ·
+ i2c_SetMode(i2c_Reg, I2C_SIMPLE_WRITE); //×éºÏ¶Áģʽ
+ i2c_SetFifoDepthSimpleWrite(i2c_Reg, write_len, reg_len); //ÉèÖÃFIFOµÄÉî¶È
+ i2c_WriteFifoRegAddr(i2c_Reg, reg_addr, reg_len); //ÍùFIFOÖÐдÈë¼Ä´æÆ÷µØÖ·
+ i2c_WriteFifoData(i2c_Reg, write_buf, write_len); //ÍùFIFOдÈëÊý¾Ý
+ i2c_Start(i2c_Reg); //²úÉú¿ªÊ¼Ìõ¼þ£¬¿ªÊ¼´«Êä
+ ret = i2c_WaitTransferOver(i2c_Reg); //µÈ´ý´«Êä½áÊø
+ if( ret != 0 )
+ {
+ continue; //´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´«
+ }
+ break; //´«Êä³É¹¦£¬Ìø³öÑ»·
+ } while( --retries != 0 );
+ retries = 3;
+
+ return ret;
+}
+
+/* ================================================================================
+ * i2c_simple_read:
+ */
+int i2c_simple_read(uint i2c_bus, ushort slave_addr, uchar *read_buf, uint read_len)
+{
+ int ret = 0;
+ T_I2C_Regs *i2c_Reg = p_i2c_reg[i2c_bus];
+
+ if ( (i2c_Reg == NULL) || (read_buf == NULL) || (read_len > 33))//×î¶àд 32 ¸ö×Ö½Ú
+ {
+ return -1;
+ }
+
+ do //¿ªÊ¼´«Êä
+ {
+ i2c_SetFreq(i2c_Reg, I2C_FREQ_FOUR_HUNDRED_KILO_HZ); //ÉèÖÃ×ÜÏ߯µÂÊ
+ i2c_SetSlaveAddress(i2c_Reg, slave_addr); //д´Ó»úµØÖ·
+ i2c_SetMode(i2c_Reg, I2C_SIMPLE_READ); //×éºÏ¶Áģʽ
+ i2c_SetFifoDepthSimpleRead(i2c_Reg, read_len); //ÉèÖÃFIFOµÄÉî¶È
+ i2c_Start(i2c_Reg); //²úÉú¿ªÊ¼Ìõ¼þ£¬¿ªÊ¼´«Êä
+ ret = i2c_WaitTransferOver(i2c_Reg); //µÈ´ý´«Êä½áÊø
+ if( ret != 0 )
+ {
+ continue; //´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´«
+ }
+ ret = i2c_ReadFifoData(i2c_Reg, read_buf, read_len ); //¶ÁÈ¡Êý¾Ý
+ if( ret != 0 )
+ {
+ continue; //´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´«
+ }
+ break; //´«Êä³É¹¦£¬Ìø³öÑ»·
+ } while( --retries != 0 );
+ retries = 3;
+
+ return ret;
+}
+
+/* ================================================================================
+ * i2c_simple_write:
+ */
+int i2c_simple_write(uint i2c_bus, ushort slave_addr,uchar *write_buf, uint write_len)
+{
+ int ret = 0;
+ T_I2C_Regs *i2c_Reg = p_i2c_reg[i2c_bus];
+
+ if ( (i2c_Reg == NULL) || (write_buf == NULL) || (write_len > 33))//×î¶àд 32 ¸ö×Ö½Ú
+ {
+ return -1;
+ }
+
+ do //¿ªÊ¼´«Êä
+ {
+ i2c_SetFreq(i2c_Reg, I2C_FREQ_FOUR_HUNDRED_KILO_HZ); //ÉèÖÃ×ÜÏ߯µÂÊ
+ i2c_SetSlaveAddress(i2c_Reg, slave_addr); //д´Ó»úµØÖ·
+ i2c_SetMode(i2c_Reg, I2C_SIMPLE_WRITE); //×éºÏ¶Áģʽ
+ i2c_SetFifoDepthSimpleWriteWithoutReg(i2c_Reg, write_len); //ÉèÖÃFIFOµÄÉî¶È
+ i2c_WriteFifoData(i2c_Reg, write_buf, write_len); //ÍùFIFOдÈëÊý¾Ý
+ i2c_Start(i2c_Reg); //²úÉú¿ªÊ¼Ìõ¼þ£¬¿ªÊ¼´«Êä
+ ret = i2c_WaitTransferOver(i2c_Reg); //µÈ´ý´«Êä½áÊø
+ if( ret != 0 )
+ {
+ continue; //´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ»·²¢ÖØ´«
+ }
+ break; //´«Êä³É¹¦£¬Ìø³öÑ»·
+ } while( --retries != 0 );
+ retries = 3;
+
+ return ret;
+}
+
+/* ================================================================================
+ * i2c_init:
+ */
+int i2c_init(void)
+{
+ p_i2c_reg[0] = (T_I2C_Regs *)ARM_I2C0_BASE;
+ p_i2c_reg[1] = (T_I2C_Regs *)ARM_I2C1_BASE;
+ /* p_i2c_reg[2] = (T_I2C_Regs *)ARM_PMICI2C_BASE; */
+
+ /* gpio config */
+ //gpio_set_reuse(GPIO_I2C0_CLK, 0x0);
+ zDrvGpio_SetFunc(GPIO43, GPIO43_SCL0);
+ zDrvGpio_SetDirection(GPIO43, GPIO_OUT);
+ //gpio_set_reuse(GPIO_I2C0_DATA, 0x0);
+ zDrvGpio_SetFunc(GPIO44, GPIO44_SDA0);
+ zDrvGpio_SetDirection(GPIO44, GPIO_OUT);
+ //gpio_set_reuse(GPIO_I2C1_CLK, 0x0);
+ zDrvGpio_SetFunc(GPIO45, GPIO45_SCL1);
+ zDrvGpio_SetDirection(GPIO45, GPIO_OUT);
+ //gpio_set_reuse(GPIO_I2C1_DATA, 0x0);
+ zDrvGpio_SetFunc(GPIO46, GPIO46_SDA1);
+ zDrvGpio_SetDirection(GPIO46, GPIO_OUT);
+
+ /* i2c1 new clk config */
+ REG32(0x140002c) &= ~(0x1<<4);//i2c1 select 26M
+ REG32(0x140002c) &= ~(0x1<<8);//reset on i2c1 apb clk
+ REG32(0x140002c) |= (0x1<<8);//reset off i2c1 apb clk
+ REG32(0x140002c) &= ~(0x1<<9);//reset on i2c1 work clk
+ REG32(0x140002c) |= (0x1<<9);//reset off i2c1 work clk
+ REG32(0x140002c) |= (0x1<<0);//enable i2c1 apb clk
+ REG32(0x140002c) |= (0x1<<1);//enable i2c1 work clk
+
+ /* pmic i2c clk config */
+ REG32(0x13b03c) &= ~(0x1<<1);//pmici2c select 26M
+ REG32(0x13b074) &= ~(0x1<<8);//reset on pmici2c apb clk
+ REG32(0x13b074) |= (0x1<<8);//reset off pmici2c apb clk
+ REG32(0x13b074) &= ~(0x1<<9);//reset on pmici2c work clk
+ REG32(0x13b074) |= (0x1<<9);//reset off pmici2c work clk
+ REG32(0x13b054) |= (0x1<<8);//enable pmici2c apb clk
+ REG32(0x13b054) |= (0x1<<9);//enable pmici2c work clk
+
+ return 0;
+}
+