Loading hw/i2c/smbus.c +44 −18 Original line number Diff line number Diff line Loading @@ -208,34 +208,44 @@ static int smbus_device_init(I2CSlave *i2c) } /* Master device commands. */ void smbus_quick_command(I2CBus *bus, uint8_t addr, int read) int smbus_quick_command(I2CBus *bus, uint8_t addr, int read) { i2c_start_transfer(bus, addr, read); if (i2c_start_transfer(bus, addr, read)) { return -1; } i2c_end_transfer(bus); return 0; } int smbus_receive_byte(I2CBus *bus, uint8_t addr) { uint8_t data; i2c_start_transfer(bus, addr, 1); if (i2c_start_transfer(bus, addr, 1)) { return -1; } data = i2c_recv(bus); i2c_nack(bus); i2c_end_transfer(bus); return data; } void smbus_send_byte(I2CBus *bus, uint8_t addr, uint8_t data) int smbus_send_byte(I2CBus *bus, uint8_t addr, uint8_t data) { i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, data); i2c_end_transfer(bus); return 0; } int smbus_read_byte(I2CBus *bus, uint8_t addr, uint8_t command) { uint8_t data; i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, command); i2c_start_transfer(bus, addr, 1); data = i2c_recv(bus); Loading @@ -244,18 +254,23 @@ int smbus_read_byte(I2CBus *bus, uint8_t addr, uint8_t command) return data; } void smbus_write_byte(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t data) int smbus_write_byte(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t data) { i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, command); i2c_send(bus, data); i2c_end_transfer(bus); return 0; } int smbus_read_word(I2CBus *bus, uint8_t addr, uint8_t command) { uint16_t data; i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, command); i2c_start_transfer(bus, addr, 1); data = i2c_recv(bus); Loading @@ -265,13 +280,16 @@ int smbus_read_word(I2CBus *bus, uint8_t addr, uint8_t command) return data; } void smbus_write_word(I2CBus *bus, uint8_t addr, uint8_t command, uint16_t data) int smbus_write_word(I2CBus *bus, uint8_t addr, uint8_t command, uint16_t data) { i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, command); i2c_send(bus, data & 0xff); i2c_send(bus, data >> 8); i2c_end_transfer(bus); return 0; } int smbus_read_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data) Loading @@ -279,20 +297,24 @@ int smbus_read_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data) int len; int i; i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, command); i2c_start_transfer(bus, addr, 1); len = i2c_recv(bus); if (len > 32) if (len > 32) { len = 0; for (i = 0; i < len; i++) } for (i = 0; i < len; i++) { data[i] = i2c_recv(bus); } i2c_nack(bus); i2c_end_transfer(bus); return len; } void smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data, int smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data, int len) { int i; Loading @@ -300,12 +322,16 @@ void smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data if (len > 32) len = 32; i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, command); i2c_send(bus, len); for (i = 0; i < len; i++) for (i = 0; i < len; i++) { i2c_send(bus, data[i]); } i2c_end_transfer(bus); return 0; } static void smbus_device_class_init(ObjectClass *klass, void *data) Loading include/hw/i2c/smbus.h +6 −6 Original line number Diff line number Diff line Loading @@ -66,15 +66,15 @@ struct SMBusDevice { }; /* Master device commands. */ void smbus_quick_command(I2CBus *bus, uint8_t addr, int read); int smbus_quick_command(I2CBus *bus, uint8_t addr, int read); int smbus_receive_byte(I2CBus *bus, uint8_t addr); void smbus_send_byte(I2CBus *bus, uint8_t addr, uint8_t data); int smbus_send_byte(I2CBus *bus, uint8_t addr, uint8_t data); int smbus_read_byte(I2CBus *bus, uint8_t addr, uint8_t command); void smbus_write_byte(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t data); int smbus_write_byte(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t data); int smbus_read_word(I2CBus *bus, uint8_t addr, uint8_t command); void smbus_write_word(I2CBus *bus, uint8_t addr, uint8_t command, uint16_t data); int smbus_write_word(I2CBus *bus, uint8_t addr, uint8_t command, uint16_t data); int smbus_read_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data); void smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data, int smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data, int len); void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom, Loading Loading
hw/i2c/smbus.c +44 −18 Original line number Diff line number Diff line Loading @@ -208,34 +208,44 @@ static int smbus_device_init(I2CSlave *i2c) } /* Master device commands. */ void smbus_quick_command(I2CBus *bus, uint8_t addr, int read) int smbus_quick_command(I2CBus *bus, uint8_t addr, int read) { i2c_start_transfer(bus, addr, read); if (i2c_start_transfer(bus, addr, read)) { return -1; } i2c_end_transfer(bus); return 0; } int smbus_receive_byte(I2CBus *bus, uint8_t addr) { uint8_t data; i2c_start_transfer(bus, addr, 1); if (i2c_start_transfer(bus, addr, 1)) { return -1; } data = i2c_recv(bus); i2c_nack(bus); i2c_end_transfer(bus); return data; } void smbus_send_byte(I2CBus *bus, uint8_t addr, uint8_t data) int smbus_send_byte(I2CBus *bus, uint8_t addr, uint8_t data) { i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, data); i2c_end_transfer(bus); return 0; } int smbus_read_byte(I2CBus *bus, uint8_t addr, uint8_t command) { uint8_t data; i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, command); i2c_start_transfer(bus, addr, 1); data = i2c_recv(bus); Loading @@ -244,18 +254,23 @@ int smbus_read_byte(I2CBus *bus, uint8_t addr, uint8_t command) return data; } void smbus_write_byte(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t data) int smbus_write_byte(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t data) { i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, command); i2c_send(bus, data); i2c_end_transfer(bus); return 0; } int smbus_read_word(I2CBus *bus, uint8_t addr, uint8_t command) { uint16_t data; i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, command); i2c_start_transfer(bus, addr, 1); data = i2c_recv(bus); Loading @@ -265,13 +280,16 @@ int smbus_read_word(I2CBus *bus, uint8_t addr, uint8_t command) return data; } void smbus_write_word(I2CBus *bus, uint8_t addr, uint8_t command, uint16_t data) int smbus_write_word(I2CBus *bus, uint8_t addr, uint8_t command, uint16_t data) { i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, command); i2c_send(bus, data & 0xff); i2c_send(bus, data >> 8); i2c_end_transfer(bus); return 0; } int smbus_read_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data) Loading @@ -279,20 +297,24 @@ int smbus_read_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data) int len; int i; i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, command); i2c_start_transfer(bus, addr, 1); len = i2c_recv(bus); if (len > 32) if (len > 32) { len = 0; for (i = 0; i < len; i++) } for (i = 0; i < len; i++) { data[i] = i2c_recv(bus); } i2c_nack(bus); i2c_end_transfer(bus); return len; } void smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data, int smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data, int len) { int i; Loading @@ -300,12 +322,16 @@ void smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data if (len > 32) len = 32; i2c_start_transfer(bus, addr, 0); if (i2c_start_transfer(bus, addr, 0)) { return -1; } i2c_send(bus, command); i2c_send(bus, len); for (i = 0; i < len; i++) for (i = 0; i < len; i++) { i2c_send(bus, data[i]); } i2c_end_transfer(bus); return 0; } static void smbus_device_class_init(ObjectClass *klass, void *data) Loading
include/hw/i2c/smbus.h +6 −6 Original line number Diff line number Diff line Loading @@ -66,15 +66,15 @@ struct SMBusDevice { }; /* Master device commands. */ void smbus_quick_command(I2CBus *bus, uint8_t addr, int read); int smbus_quick_command(I2CBus *bus, uint8_t addr, int read); int smbus_receive_byte(I2CBus *bus, uint8_t addr); void smbus_send_byte(I2CBus *bus, uint8_t addr, uint8_t data); int smbus_send_byte(I2CBus *bus, uint8_t addr, uint8_t data); int smbus_read_byte(I2CBus *bus, uint8_t addr, uint8_t command); void smbus_write_byte(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t data); int smbus_write_byte(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t data); int smbus_read_word(I2CBus *bus, uint8_t addr, uint8_t command); void smbus_write_word(I2CBus *bus, uint8_t addr, uint8_t command, uint16_t data); int smbus_write_word(I2CBus *bus, uint8_t addr, uint8_t command, uint16_t data); int smbus_read_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data); void smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data, int smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data, int len); void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom, Loading