void fm34_reset_DSP(void) { gpio_set_value(TEGRA_GPIO_PH2, 0); msleep(TIME_RESET); FM34_INFO("GPIO = %d , state = %d\n", TEGRA_GPIO_PH2, gpio_get_value(TEGRA_GPIO_PH2)); gpio_set_value(TEGRA_GPIO_PH2, 1); FM34_INFO("GPIO = %d , state = %d\n", TEGRA_GPIO_PH2, gpio_get_value(TEGRA_GPIO_PH2)); return; }
int fm34_config_DSP(void) { int ret=0; struct i2c_msg msg[3]; u8 buf1; int config_length; u8 *config_table; if(!bConfigured){ fm34_reset_DSP(); msleep(100); gpio_set_value(TEGRA_GPIO_PBB6, 1); // Enable DSP msleep(TIME_WAKEUP_TO_PROGRAMMING); //access chip to check if acknowledgement. buf1=0xC0; /* Write register */ msg[0].addr = dsp_chip->client->addr; msg[0].flags = 0; msg[0].len = 1; msg[0].buf = &buf1; ret = i2c_transfer(dsp_chip->client->adapter, msg, 1); if(ret < 0){ FM34_INFO("DSP NOack, Failed to read 0x%x: %d\n", buf1, ret); msleep(50); fm34_reset_DSP(); return ret; } else FM34_INFO("DSP ACK, read 0x%x: %d\n", buf1, ret); FM34_INFO("Load TF201 DSP parameters\n"); config_length= sizeof(input_parameter); config_table= (u8 *)input_parameter; ret = fm34_i2c_retry(dsp_chip->client, config_table, config_length); FM34_INFO("config_length = %d\n", config_length); if(ret == config_length){ FM34_INFO("DSP configuration is done\n"); bConfigured=true; } msleep(100); gpio_set_value(TEGRA_GPIO_PBB6, 0); } return ret; }
unsigned int fm34_i2c_read(unsigned char AdrHi,unsigned char AdrLo, unsigned char *data) { unsigned int ret = 0; u8 cmd_addr[5] = {0}; u8 cmd_lo[4] = {0}; u8 cmd_hi[4] = {0}; cmd_addr[0] = 0xFC; cmd_addr[1] = 0xF3; cmd_addr[2] = 0x37; cmd_addr[3] = AdrHi; cmd_addr[4] = AdrLo; cmd_lo[0] = 0xFC; cmd_lo[1] = 0xF3; cmd_lo[2] = 0x60; cmd_lo[3] = 0x25; cmd_hi[0] = 0xFC; cmd_hi[1] = 0xF3; cmd_hi[2] = 0x60; cmd_hi[3] = 0x26; //set read addr ret = i2c_master_send(dsp_chip->client, cmd_addr, 5); if(ret != 5){ FM34_INFO("DSP set read reg fail\n"); } ret = i2c_master_send(dsp_chip->client, cmd_lo, 4); if(ret != 4){ FM34_INFO("DSP send read low byte addr fail\n"); } ret = i2c_master_recv(dsp_chip->client, data, 1); if(ret != 1){ FM34_INFO("DSP read low byte fail, data: %d\n", data[0]); } ret = i2c_master_send(dsp_chip->client, cmd_hi, 4); if(ret != 4){ FM34_INFO("DSP send read high byte addr fail\n"); } ret = i2c_master_recv(dsp_chip->client, (data + 1), 1); if(ret != 1){ FM34_INFO("DSP read high byte fail, data: %d\n", data[1]); } return ret; }
int fm34_i2c_retry(struct i2c_client *fm34_i2c_client, u8* parameter, size_t size) { int retry = 0; int ret = -1; ret = i2c_master_send(fm34_i2c_client, parameter, size); msleep(5); while(retry < MAX_RETRY && ret < 0){ retry++; FM34_INFO("i2c no ack retry time = %d\n", retry); ret = i2c_master_send(fm34_i2c_client, parameter, size); msleep(5); } if(retry == MAX_RETRY) FM34_INFO("i2c retry fail, exceed maximum retry times = %d\n", MAX_RETRY); return ret; }