/* **************************************************************************************************** * * 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; }
static int cambria_gpio_write(struct cambria_gpio_softc *sc) { device_t dev = sc->sc_dev; int error; error = iicbus_request_bus(device_get_parent(dev), dev, IIC_DONTWAIT); if (error) return (error); i2c_sendstart(sc); i2c_sendbyte(sc, PLD_ADDR & ~LSB); i2c_sendbyte(sc, sc->sc_latch); i2c_sendstop(sc); iicbus_release_bus(device_get_parent(dev), dev); return (0); }
static int cambria_gpio_read(struct cambria_gpio_softc *sc, uint32_t pin, unsigned int *val) { device_t dev = sc->sc_dev; int error; error = iicbus_request_bus(device_get_parent(dev), dev, IIC_DONTWAIT); if (error) return (error); i2c_sendstart(sc); i2c_sendbyte(sc, PLD_ADDR | LSB); *val = (i2c_readbyte(sc) & (1 << pin)) != 0; i2c_sendstop(sc); iicbus_release_bus(device_get_parent(dev), dev); return (0); }
/* **************************************************************************************************** * * 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; }