/* **************************************************************************************************** * * TWIC_Write * * Description: * DRV_MOpen * * Parameters: * * Return value: * EPDK_OK * EPDK_FAIL **************************************************************************************************** */ int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len) { int i, ret, ret0, addrlen; char *slave_reg; ret0 = -1; ret = i2c_sendstart(); if(ret) { goto i2c_write_err_occur; } ret = i2c_sendslaveaddr(chip, I2C_WRITE); if(ret) { goto i2c_write_err_occur; } //send byte address if(alen >= 3) { addrlen = 2; } else if(alen <= 1) { addrlen = 0; } else { addrlen = 1; } slave_reg = (char *)&addr; for (i = addrlen; i>=0; i--) { ret = i2c_sendbyteaddr(slave_reg[i] & 0xff); if(ret) { goto i2c_write_err_occur; } } ret = i2c_senddata(buffer, len); if(ret) { goto i2c_write_err_occur; } ret0 = 0; i2c_write_err_occur: i2c_stop(); return ret0; }
/* **************************************************************************************************** * * TWIC_Write * * Description: * DRV_MOpen * * Parameters: * * Return value: * EPDK_OK * EPDK_FAIL **************************************************************************************************** */ int i2c_write(uint bus_id, uchar chip, uint addr, int alen, uchar *buffer, int len) { int i, ret, ret0, addrlen; char *slave_reg; uint twi_host = 0; ret0 = -1; if(bus_id < SUNXI_TWI_COUNT) { twi_host = SUNXI_TWI0_BASE + SUNXI_TWI_OFFSET * bus_id; } else { printf("i2c bus id %d is error\n", bus_id); return ret0; } ret = i2c_sendstart(twi_host); if(ret) { goto i2c_write_err_occur; } ret = i2c_sendslaveaddr(twi_host, chip, I2C_WRITE); if(ret) { goto i2c_write_err_occur; } //send byte address if(alen >= 3) { addrlen = 2; } else if(alen <= 1) { addrlen = 0; } else { addrlen = 1; } slave_reg = (char *)&addr; for (i = addrlen; i>=0; i--) { ret = i2c_sendbyteaddr(twi_host, slave_reg[i] & 0xff); if(ret) { goto i2c_write_err_occur; } } ret = i2c_senddata(twi_host, buffer, len); if(ret) { goto i2c_write_err_occur; } ret0 = 0; i2c_write_err_occur: i2c_stop(twi_host); return ret0; }