@ -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 ) ;
@ -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 ) ;
@ -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 )
@ -279,33 +297,41 @@ 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 len )
int smbus_write_block ( I2CBus * bus , uint8_t addr , uint8_t command , uint8_t * data ,
int len )
{
int i ;
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 )