IO口模拟I2C收发信息

来源:互联网 发布:35互联域名证书生成 编辑:程序博客网 时间:2024/05/16 12:35

IO口模拟I2C收发信息


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "types.h"
#include "FreeRTOS.h"
#include "task.h"
#include "lib_gpio.h"
#include "ath8809.h"
#include "bcmw_sleep.h"
#include "bcmw_thread.h"

#define I2C_SCL_PIN   ((0) * 32 + (1))
#define I2C_SDA_PIN   ((0) * 32 + (3))
#define I2C_RESET_PIN ((1) * 32 + (22))

#define test_ath 1

u8 ath8809_reg_val[][4]=
{
    {0x1E,0x34 ,0x00,0x9A},
    {0x1E,0x3D ,0x02,0x01},
    {0x1E,0x3E ,0x01,0x00},
    {0x1E,0x44 ,0x00,0xB1},
    {0x1E,0x45 ,0x07,0xFC},
    {0x1E,0x46 ,0x00,0x7C},
    {0x1E,0x4C ,0x02,0x00},
    {0x1E,0x4D ,0x02,0x20},
    {0x1E,0x63 ,0x00,0x02},
    {0x1E,0x86 ,0x00,0x07},
    {0x1E,0x87 ,0x00,0x03},
    {0x1E,0x92 ,0x30,0x00},
    {0x1E,0x9A ,0x30,0x00},
    {0x1E,0xA2 ,0x50,0x00},
    {0x1E,0xBD ,0x70,0x20},
    {0x1E,0xBE ,0x70,0x10},
    {0x1E,0xBF ,0x70,0x00},
    {0x1E,0xC0 ,0x08,0x00},
    {0x1E,0xC1 ,0x0A,0x00},
    {0x1E,0xC2 ,0x10,0x00},
    {0x1E,0xE2 ,0x0B,0x00},
    {0x1E,0xE3 ,0x03,0x00},
    {0x1E,0xE4 ,0x10,0x00},
    {0x1E,0xEF ,0x07,0x00},
    {0x1F,0x10 ,0x7F,0xFF},
    {0x1F,0x11 ,0x60,0x50},
    {0x1F,0x12 ,0x4C,0x9F},
    {0x1F,0x13 ,0x3F,0x82},
    {0x1F,0x14 ,0x36,0x3E},
    {0x1F,0x15 ,0x2E,0xB2},
    {0x1F,0x16 ,0x27,0x11},
    {0x1F,0x17 ,0x1E,0xF8},
    {0x1F,0x18 ,0x17,0xCB},
    {0x1F,0x19 ,0x12,0xF0},
    {0x1F,0x28 ,0x0C,0x00},
    {0x1F,0x29 ,0x10,0x00},
    {0x1F,0x4B ,0x00,0x00},
 {0x1E,0x3A, 0x00,0x00},

};

#if 0
void misc_config_pin_multiplex_36S16MHSM()
{
 /**/
 unsigned long reg_val = 0;
 
 /*
  0x50
   [3:2]----------GPIO_0[1]  GPIO模拟I2C控制消回音芯片
    0: TCK
    1: GPIO_0[1]
    2: PWM4
    3: UART2_SIN
   [5:4]----------GPIO_0[2]  红外灯调光控制PWM
    0: TMS
    1: GPIO_0[2]
    2: PWM5
    3: UART2_SOUT
   [7:6]----------GPIO_0[3]  GPIO模拟I2C控制消回音芯片
    0: TDO
    1: GPIO_0[3]
    2: PWM6
    3: DMIC_DATA
   [9:8]----------GPIO_0[4]  音频开关控制,高有效
    0: TDI
    1: GPIO_0[4]
    2: PWM7
    3: DMIC_CLK
 */
 reg_val = *((unsigned long *)(0x90c00000 + 0x50));
 reg_val &= (~(0xfful << 2));
 reg_val |= (0x55ul << 2);
 *((unsigned long *)(0x90c00000 + 0x50)) = reg_val;
 
 /*
  0x54
   [7:6]----------GPIO_0[10] 水平限位开关,低有效
    0: GPIO_0[10]
    1: CAP0_D[7]
    2: BAYER_D3
    3: SD1_CMD_RSP
   [9:8]----------GPIO_0[11] 垂直电机驱动信号1
    0: GPIO_0[11]
    1: CAP0_D[6]
    2: BAYER_D2
    3: SD1_D3
   [11:10]----------GPIO_0[12] 垂直电机驱动信号2
    0: GPIO_0[12]
    1: CAP0_D[5]
    2: BAYER_D1
    3: SD1_D2
   [13:12]----------GPIO_0[13] 垂直电机驱动信号3
    0: GPIO_0[13]
    1: CAP0_D[4]
    2: BAYER_D0
   [15:14]----------GPIO_0[14] 垂直电机驱动信号4
    0: GPIO_0[14]
    1: CAP0_D[3]
    2: I2C_SCL
    3: SSP1_FS
   [17:16]----------GPIO_0[15] 镜头驱动控制STB
    0: GPIO_0[15]
    1: CAP0_D[2]
    2: I2C_SDA
    3: SSP1_RXD
   [19:18]----------GPIO_0[16] 镜头驱动时钟SCLK
    0: GPIO_0[16]
    1: CAP_LO8_D1
    2: None
    3: SSP1_TXD
   [21:20]----------GPIO_0[17] 镜头驱动数据SDATA
    0: GPIO_0[17]
    1: CAP_LO8_D0
    2: None
    3: SSP1_SCLK
   [23:22]----------I2C_SCL  I2C总线,挂sensor
    0: GPIO_0[18]
    1: I2C_SCL
    2: PWM2
   [25:24]----------I2C_SDA  I2C总线,挂sensor
    0: GPIO_0[19]
    1: I2C_SDA
    2: PWM3
 */
 reg_val = *((unsigned long *)(0x90c00000 + 0x54));
 reg_val &= (~(0xffffful << 6));
 reg_val |= (0x05ul << 22);
 *((unsigned long *)(0x90c00000 + 0x54)) = reg_val;

 /*
  0x58
   [3:2]----------SD_DAT[0]  SD CARD总线
    0: GPIO_0[24]
    1: SD_DAT[0]
   [5:4]----------SD_DAT[1]  SD CARD总线
    0: GPIO_0[25]
    1: SD_DAT[1]
   [7:6]----------SD_DAT[2]  SD CARD总线
    0: GPIO_0[26]
    1: SD_DAT[2]
   [9:8]----------SD_DAT[3]  SD CARD总线
    0: GPIO_0[27]
    1: SD_DAT[3]
   [11:10]----------GPIO_0[28] 水平电机驱动信号1
    0: GPIO_0[28]
    1: SSP1_FS
   [13:12]----------GPIO_0[29] 水平电机驱动信号2
    0: GPIO_0[29]
    1: SSP1_TXD
    2: SD1_CMD_RSP
   [15:14]----------GPIO_0[30] 水平电机驱动信号3
    0: GPIO_0[30]
    1: SSP1_RXD
    2: SD1_DAT[3]
    3: OTG_48M_dbg
   [17:16]----------GPIO_0[31] 水平电机驱动信号4
    0: GPIO_0[31]
    1: SSP1_SCLK
    2: SD1_DAT[2]
    3: OTG_30M_dbg
   [19:18]----------SD_CD  SD CARD总线
    0: GPIO_1[0]
    1: SD_CD
   [21:20]----------SD_CLK  SD CARD总线
    0: GPIO_1[1]
    1: SD_CLK
   [23:22]----------SD_CMD_RSP SD CARD总线
    0: GPIO_1[2]
    1: SD_CMD_RSP
   [25:24]----------GPIO_1[3]  IR CUT控制1
    0: GPIO_1[3]
    1: UART2_SIN
   [27:26]----------GPIO_1[4]  IR CUT控制2
    0: GPIO_1[4]
    1: UART2_SOUT    
 */
 reg_val = *((unsigned long *)(0x90c00000 + 0x58));
 reg_val &= (~(0x3fffffful << 2));
 reg_val |= (0x55ul << 2);
 reg_val |= (0x15ul << 18);
 *((unsigned long *)(0x90c00000 + 0x58)) = reg_val;

 /*
  0x5c
   [25:24]----------GPIO_1[19] CC3200 准备OK, GPIO高低 输入
    0: GPIO_1[19]
    1: SD1_CD
    2: LC_DATA[12]
    4: TV_DATA[12]
   [27:26]----------GPIO_1[20] GM8136S 准备OK, GPIO 输出
    0: GPIO_1[20]
    1: SD1_DAT[1]
    2: LC_DATA[13]
    3: TV_DATA[13]
   [29:28]----------GPIO_1[21] 红外灯开关控制,高开
    0: GPIO_1[21]
    1: SD1_DAT[0]
    2: LC_DATA[14]
    4: TV_DATA[14]
   [31:30]----------GPIO_1[22] 回声抵消芯片复位
    0: GPIO_1[22]
    1: SD1_CLK
    2: LC_DATA[15]
    3: TV_DATA[15]
 */
 reg_val = *((unsigned long *)(0x90c00000 + 0x5c));
 reg_val &= (~(0xfful << 24));
 *((unsigned long *)(0x90c00000 + 0x5c)) = reg_val;

 /*
  0x60
   [13:12]----------PWM0   镜头控制STEP1
    0: GPIO_1[28]
    1: PWM0
    2: DMIC_DATA 
   [15:14]----------PMW1   镜头控制STEP2
    0: GPIO_1[29]
    1: PWM1
    2: DMIC_CLK
 */
 reg_val = *((unsigned long *)(0x90c00000 + 0x60));
 reg_val &= (~(0x0ful << 12));
 reg_val |= (0x05ul << 12);
 *((unsigned long *)(0x90c00000 + 0x60)) = reg_val;

 /*
  0x64
   [1:0]----------SSP1_SCLK  CC3200 SPI 通信SPI_CLK
    0: GPIO_1[27]
    1: SSP1_SCLK (If SSP1 is slave mode, then bit [8] must be logic 1.)
    2: LC_HS
   [3:2]----------SSP1_FS  CC3200 SPI 通信SPI_CS
    0: GPIO_1[24]
    1: SSP1_FS
    2: UART1_SIN
   [5:4]----------SSP1_TXD  CC3200 SPI 通信SPI_TXD
    0: GPIO_1[25]
    1: SSP1_TXD
    2: UART1_SOUT
   [7:6]----------SSP1_RXD  CC3200 SPI 通信SPI_RXD
    0: GPIO_1[26]
    1: SSP1_RXD
    2: LC_VS
 */
 reg_val = *((unsigned long *)(0x90c00000 + 0x64));
 reg_val &= (~(0xfful << 0));
 reg_val |= (0x55ul << 0);
 *((unsigned long *)(0x90c00000 + 0x64)) = reg_val;

 /*
  XAIN0  CDS 检测,GPIO 高低输入
  DN0    (PLDATA0) MIPI 总线
  DP0    (PLDATA1) MIPI 总线
  CKN    (PLDATA2) MIPI 总线
  CKP    (PLDATA3) MIPI 总线
 */
}


void misc_config_pin_dir()
{
 /**/
 unsigned long reg_val = 0;
 
 /*
  0x50
   [3:2]----------GPIO_0[1]  GPIO模拟I2C控制消回音芯片
    0: TCK
    1: GPIO_0[1]
    2: PWM4
    3: UART2_SIN
   [5:4]----------GPIO_0[2]  红外灯调光控制PWM
    0: TMS
    1: GPIO_0[2]
    2: PWM5
    3: UART2_SOUT
   [7:6]----------GPIO_0[3]  GPIO模拟I2C控制消回音芯片
    0: TDO
    1: GPIO_0[3]
    2: PWM6
    3: DMIC_DATA
   [9:8]----------GPIO_0[4]  音频开关控制,高有效
    0: TDI
    1: GPIO_0[4]
    2: PWM7
    3: DMIC_CLK
 */
 reg_val = *((unsigned long *)(0x90c00000 + 0x50));
 reg_val &= (~(0xfful << 2));
 reg_val |= (0x55ul << 2);
 *((unsigned long *)(0x90c00000 + 0x50)) = reg_val;

}


void misc_config_pin_test()
{
 #if 1
 /**/
 unsigned long reg_val = 0;
 /*
  0x50
   [3:2]----------GPIO_0[1]  GPIO模拟I2C控制消回音芯片
    0: TCK
    1: GPIO_0[1]
    2: PWM4
    3: UART2_SIN
   [5:4]----------GPIO_0[2]  红外灯调光控制PWM
    0: TMS
    1: GPIO_0[2]
    2: PWM5
    3: UART2_SOUT
   [7:6]----------GPIO_0[3]  GPIO模拟I2C控制消回音芯片
    0: TDO
    1: GPIO_0[3]
    2: PWM6
    3: DMIC_DATA
   [9:8]----------GPIO_0[4]  音频开关控制,高有效
    0: TDI
    1: GPIO_0[4]
    2: PWM7
    3: DMIC_CLK
 */

 reg_val = *((unsigned long *)(0x90c00000 + 0x50));
 printf("mutli GPIO0_1:%x, ", reg_val);

 reg_val = *((unsigned long *)(0x90c00000 + 0x5c));
 printf(" mutli GPIO1_1:%x, ", reg_val);

 reg_val = *((unsigned long *)(0x91000000 + 0x08));
 printf("direction  GPIO0_1:%x, ", reg_val);

 reg_val = *((unsigned long *)(0x91900000 + 0x08));
 printf("direction  GPIO1_1:%x, ", reg_val);


 reg_val = *((unsigned long *)(0x91000000 + 0x0));
 printf("value GPIO0_1:%x, ", reg_val);
 
 reg_val = *((unsigned long *)(0x91900000 + 0x0));
 printf("value GPIO1_1:%x \n", reg_val);

 #endif

}

void misc_config_pin_value()
{
 #if 1
 /**/
 unsigned long reg_val = 0;
 /*
  0x50
   [3:2]----------GPIO_0[1]  GPIO模拟I2C控制消回音芯片
    0: TCK
    1: GPIO_0[1]
    2: PWM4
    3: UART2_SIN
   [5:4]----------GPIO_0[2]  红外灯调光控制PWM
    0: TMS
    1: GPIO_0[2]
    2: PWM5
    3: UART2_SOUT
   [7:6]----------GPIO_0[3]  GPIO模拟I2C控制消回音芯片
    0: TDO
    1: GPIO_0[3]
    2: PWM6
    3: DMIC_DATA
   [9:8]----------GPIO_0[4]  音频开关控制,高有效
    0: TDI
    1: GPIO_0[4]
    2: PWM7
    3: DMIC_CLK
 */
 reg_val = *((unsigned long *)(0x90c00000 + 0x50));
 printf("mutli GPIO0_1:%x, ", reg_val);
 
 reg_val = *((unsigned long *)(0x91000000 + 0x08));
 printf("direction  GPIO0_1:%x, ", reg_val);

 reg_val = *((unsigned long *)(0x91000000 + 0x0));
 printf("value GPIO0_1 0_3:%x, \n", reg_val);
 #endif
}

#endif

static void  DELAY(s32 X)
{
 s32 counter1= 0x80;
 s32 counter2= 0x80;
 while(counter1 > 0 && counter2 > 0)
 {
  counter1--;
  counter2--;
 }
}

/*?′??8809μúò?′??????á2?3é1|£?μú?t′??òok£??-òò?′?a*/
static s32 ath8809_hw_reset(u32 i2c_reset_pin)
{
    gm_gpio_direction_output(i2c_reset_pin,0);
 BC_Msleep(20);

    gm_gpio_direction_output(i2c_reset_pin,1);
 BC_Msleep(20);
 
    return 0;
}

static s32 i2c_init(u32 i2c_scl_pin,u32 i2c_sda_pin)
{
    /* default out H */
    gm_gpio_direction_output(i2c_scl_pin,1);
 gm_gpio_direction_output(i2c_sda_pin,1);

    return 0;
}

static s32 i2c_start(u32 i2c_scl_pin,u32 i2c_sda_pin)
{
    //i2c_set SDA,SCL
    gm_gpio_direction_output(i2c_scl_pin,1);
 gm_gpio_direction_output(i2c_sda_pin,1);
 
    DELAY(1);
 
    //i2c_clr SDA
    gm_gpio_direction_output(i2c_sda_pin,0);
 
    DELAY(1);
 
    //i2c_clr SCL
    gm_gpio_direction_output(i2c_scl_pin,0);
 
    DELAY(1);
 
    return 0;
}

static s32 i2c_stop(u32 i2c_scl_pin,u32 i2c_sda_pin)
{
    //i2c_clr SDA
    gm_gpio_direction_output(i2c_sda_pin,0);
    DELAY(1);
    //i2c_set SCL
    gm_gpio_direction_output(i2c_scl_pin,1);
    DELAY(1);
    //i2c_set SDA
    gm_gpio_direction_output(i2c_sda_pin,1);
    DELAY(1);
 return 0;
}

static u8 recv_bit(u32 i2c_scl_pin,u32 i2c_sda_pin)
{
 unsigned char gpio_value = 0;
 
    //i2c_clr SCL
 gm_gpio_direction_output(i2c_scl_pin,0);
 
    /* set dir in */
    gm_gpio_direction_input(i2c_sda_pin);
 
    DELAY(1);
    //i2c_set SCL
    gm_gpio_direction_output(i2c_scl_pin,1);
 
    DELAY(1);
   
    gpio_value = gm_gpio_get_value(i2c_sda_pin);
 
    DELAY(1);
    //i2c_clr SCL
    gm_gpio_direction_output(i2c_scl_pin,0);

    DELAY(1);

    if(gpio_value)
    {
  return 1;
    }
    else
    {
  return 0;
    }
}

static u8 i2c_recv_ack(u32 i2c_scl_pin,u32 i2c_sda_pin)
{
    return !recv_bit(i2c_scl_pin,i2c_sda_pin);
}

/*return 1:write fail,rewrite;return 0:write success*/
static s32 ath8809_i2c_write(u32 i2c_scl_pin,u32 i2c_sda_pin,u8 *pdata, u8 len)
{
    u32 ret = 0;
    u8 i;
    u8 bit=0x80;
    u8 *p;
    u8 dev_sync[]= {0xc0,0xfc,0xf3,0x3b}; /* deviceid: 1byte, sync:2byte  cmd:1byte*/
    u8 nreg = 0;
 
 portENTER_CRITICAL();
    /* start */
    i2c_start(i2c_scl_pin,i2c_sda_pin);
 
    i=0;
    for(nreg = 0; nreg < len/4; nreg++)
    {
        for(; i < 8; i++)
        {
            if(i < 4)
            {
                p = (u8*)&dev_sync[i];
            }
            else
            {
                p = &pdata[nreg*4+i-4];
            }

            for(bit=0x80; bit; bit >>= 1)
            {
                if(bit&*p)
                {
                    //i2c_set SDA
                    gm_gpio_direction_output(i2c_sda_pin,1);
//     misc_config_pin_test();
//        printf("1  ");
//        misc_config_pin_value();
                }
                else
                {
                    //i2c_clr SDA
                    gm_gpio_direction_output(i2c_sda_pin,0);
//     misc_config_pin_test();
//        printf("0  ");
//        misc_config_pin_value();
                }
                DELAY(1);
                //i2c_set SCL
                gm_gpio_direction_output(i2c_scl_pin,1);
                DELAY(1);
                DELAY(1);
                //i2c_clr SCL
                gm_gpio_direction_output(i2c_scl_pin,0);
                DELAY(1);
            }
      
            /* recv ack */
            if(!i2c_recv_ack(i2c_scl_pin,i2c_sda_pin))
            {
                printf("ath8809 no ack reg=0x%02x%02x !!!\n", pdata[nreg*4]&0xff,pdata[nreg*4+1]&0xff);
                ret = 1;
                goto out;
            }
        }
    }

out:
    /* stop */
    i2c_stop(i2c_scl_pin,i2c_sda_pin);
 portEXIT_CRITICAL();

 return 0;
    return ret;

}

static s32 i2c_send_ack(u32 i2c_scl_pin,u32 i2c_sda_pin)
{
   // i2c_clr SCL
    //i2c_clr SDA
    gm_gpio_direction_output(i2c_scl_pin,0);
    gm_gpio_direction_output(i2c_sda_pin,0);
    DELAY(1);
    //i2c_set SCL
    gm_gpio_direction_output(i2c_scl_pin,1);
    DELAY(1);
    DELAY(1);
    //i2c_clr SCL
    gm_gpio_direction_output(i2c_scl_pin,0);
    DELAY(1);
    return 0;
}

/*return 1:read fail,rewrite;return 0:read success*/
static s32 ath8809_i2c_read(u32 i2c_scl_pin,u32 i2c_sda_pin,u8 *din, u8 *dout)
{
 u32 ret = 0;
    u8 i;
    u8 bit=0x80;
    u8 *p;
    u8 dev_sync[]= {0xc0,0xfc,0xf3,0x37}; /* deviceid: 1byte, sync:2byte  cmd:1byte*/

    /* start */
    i2c_start(i2c_scl_pin,i2c_sda_pin);


    for(i = 0; i < 4+2; i++)
    {
        if(i < 4)
        {
            p = (u8*)&dev_sync[i];
        }
        else
        {
            p = din+i-4;
        }
        for(bit=0x80; bit; bit >>= 1)
        {
            if(bit&*p)
            {
                //i2c_set SDA
                gm_gpio_direction_output(i2c_sda_pin,1);
            }
            else
            {
                //i2c_clr SDA
                gm_gpio_direction_output(i2c_sda_pin,0);
            }
            DELAY(1);
            //i2c_set SCL
            gm_gpio_direction_output(i2c_scl_pin,1);
            DELAY(1);
            DELAY(1);
            //i2c_clr SCL
            gm_gpio_direction_output(i2c_scl_pin,0);
            DELAY(1);
        }

        /* recv ack */
        if(!i2c_recv_ack(i2c_scl_pin,i2c_sda_pin))
        {
            printf("ath8809_i2c_read no ack !!!\n");
            ret = 1;
            goto out;
        }
    }
    i2c_stop(i2c_scl_pin,i2c_sda_pin);
    i2c_start(i2c_scl_pin,i2c_sda_pin);
    dev_sync[0]=dev_sync[0] | 0x01;

    p= &dev_sync[0];
    for(bit=0x80; bit; bit >>= 1)
    {
        if(bit&*p)
        {
            //i2c_set SDA
            gm_gpio_direction_output(i2c_sda_pin,1);
        }
        else
        {
            //i2c_clr SDA
            gm_gpio_direction_output(i2c_sda_pin,0);
        }
        DELAY(1);
        //i2c_set SCL
        gm_gpio_direction_output(i2c_scl_pin,1);
        DELAY(1);
        DELAY(1);
        //i2c_clr SCL
        gm_gpio_direction_output(i2c_scl_pin,0);
        DELAY(1);
    }

    if (!i2c_recv_ack(i2c_scl_pin,i2c_sda_pin))
    {
        printf("ath8809_i2c_read no ack !!!\n");
        ret = 1;
        goto out;
    }

    for(i=0; i < 2; i++)
    {
        p=&dout[i];
        *p=0;

        for(bit=0x80; bit; bit >>= 1)
        {
  
   *p <<= 1;
            *p |= recv_bit(i2c_scl_pin,i2c_sda_pin);
   
        }
  
        i2c_send_ack(i2c_scl_pin,i2c_sda_pin);
    }

out:
    /* stop */
    i2c_stop(i2c_scl_pin,i2c_sda_pin);
     printf("recv dout[0]  = %02x ,dout[1] = %02x \n",dout[0],dout[1]);
    return ret;
}

/* 一定要加延时,芯片上电太慢,等待上电完成再初始化配置,否则芯片不能正常工作*/
s32 ath8809_init(u32 i2c_scl_pin,u32 i2c_sda_pin,u32 i2c_reset_pin,BC_Thread_handle_t handle)
{
 printf("ath8809_init,I2C_SCL_PIN = %d, I2C_SDA_PIN = %d,I2C_RESET_PIN = %d \n",i2c_scl_pin,i2c_sda_pin,i2c_reset_pin);

 s32 len = 0;
 s32 i = 0;

 BC_Msleep(1500);
 
 i2c_init(i2c_scl_pin,i2c_sda_pin);
 ath8809_hw_reset(i2c_reset_pin);

 len = sizeof(ath8809_reg_val)/4;
// printf("ath8809 init,len = %d \n",len);

 for(i= 0; i < len; i++)
    {
        if(ath8809_i2c_write(i2c_scl_pin,i2c_sda_pin,(u8*)&ath8809_reg_val[i], 4))
        {
            //try again
            printf("try i2c write ath8809 again \n");
   BC_Thread_feed_dog(handle);
            ath8809_i2c_write(i2c_scl_pin,i2c_sda_pin,(u8*)&ath8809_reg_val[i], 4);
        }
    }

#if 0

 printf("write over,start read \n");
 for(i = 0; i < 37; i++)
    {
  memset(data,0,sizeof(data));
  
  while ((ath8809_i2c_read(i2c_scl_pin,i2c_sda_pin,(u8*)&ath8809_reg_val[i], (u8*)&data)!= 0) && (count < 3))
        {
            //  try again
            printf("try i2c read ath8809 again \n");
            ath8809_i2c_read(i2c_scl_pin,i2c_sda_pin,(u8*)&ath8809_reg_val[i], (u8*)&data);
   count++;
        }
        printf("[%d]: %02x%02x \n", i,data[0], data[1]);
        data[0] = 0;
        data[1] = 0;

  if (count >= 3)
  {
   printf("error, over \n");
   count = 0;

  }
    }
 
#endif

 printf("ath8809_init over\n");
 
 return 0;
}

static void init_ath8809_thread(BC_Thread_handle_t handle, void* para)
{
 s32 ret = ath8809_init(I2C_SCL_PIN,I2C_SDA_PIN,I2C_RESET_PIN,handle);
 if(0 != ret)
 {
  printf("ath8809_init fail \n");
 }
}


s32  init_ath8809_handle(void )
{
 BC_Thread_handle_t init_ath8809;
 BC_Thread_para_t thread_para;
 BC_Thread_para_init(&thread_para);
 thread_para.m_depth = 0x400;
 init_ath8809 = BC_Thread_create(init_ath8809_thread,(char *)"init_ath8809",NULL,&thread_para);
 if(NULL == init_ath8809 )
 {
  return -1;
 }
 
 return 0;
}