Changeset 6003:7f0e74d54fdb in roaraudio
- Timestamp:
- 04/06/14 17:40:08 (10 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
roard/driver_i2cdmx.c
r6000 r6003 141 141 } 142 142 143 static inline int __i2c_read_block(struct driver_i2cdmx * self, size_t off, uint8_t * value); 144 static inline int __i2c_write_block(struct driver_i2cdmx * self, size_t off, const uint8_t * value) { 145 union i2c_smbus_data data; 146 struct i2c_smbus_ioctl_data args = {.read_write = I2C_SMBUS_WRITE, .command = off, .size = I2C_SMBUS_I2C_BLOCK_BROKEN, .data = &data}; 147 struct roar_vio_sysio_ioctl ctl = {.cmd = I2C_SMBUS, .argp = &args}; 148 size_t i; 149 150 for (i = 0; i < sizeof(data.block); i++) 151 data.block[i] = 0xAF; 152 153 data.block[0] = I2C_SMBUS_BLOCK_MAX; 154 155 for (i = 0; i < I2C_SMBUS_BLOCK_MAX; i++) 156 data.block[i+1] = value[i]; 157 158 return roar_vio_ctl(&(self->vio), ROAR_VIO_CTL_SYSIO_IOCTL, &ctl); 159 } 160 143 161 static inline int __i2c_command(struct driver_i2cdmx * self, uint8_t command) { 144 162 int16_t ret; … … 318 336 } 319 337 338 static int __i2c_write_channel_block(struct driver_i2cdmx * self, size_t channel, const uint8_t * value) { 339 size_t bank, offset; 340 341 bank = channel/32; 342 offset = bank*32; 343 344 if ( __i2c_write(self, ADDR_BANK, bank) == -1 ) 345 return -1; 346 347 return __i2c_write_block(self, ADDR_DATA+channel-offset, value); 348 } 349 320 350 static ssize_t __vio_read (struct roar_vio_calls * vio, void *buf, size_t count) { 321 351 struct driver_i2cdmx * self; … … 346 376 struct driver_i2cdmx * self; 347 377 size_t i; 348 size_t endaddr; 378 // size_t endaddr; 379 size_t todo; 380 size_t len; 349 381 350 382 if ( vio == NULL ) { … … 363 395 return -1; 364 396 397 /* 365 398 for (i = self->startaddr, endaddr = self->startaddr + self->len; i < endaddr; i++) 366 399 if ( __i2c_write_channel(self, i, ((uint8_t*)buf)[i]) == -1 ) 367 400 return -1; 401 */ 402 403 i = self->startaddr; 404 todo = self->len; 405 while (todo) { 406 if ( todo >= I2C_SMBUS_BLOCK_MAX ) { 407 if ( __i2c_write_channel_block(self, i, &(((const uint8_t*)buf)[i])) == -1 ) 408 return -1; 409 i += I2C_SMBUS_BLOCK_MAX; 410 todo -= I2C_SMBUS_BLOCK_MAX; 411 } else { 412 if ( __i2c_write_channel(self, i, ((uint8_t*)buf)[i]) == -1 ) 413 return -1; 414 i++; 415 todo--; 416 } 417 } 368 418 #ifdef ROAR_HAVE_H_LINUX_SPI_SPIDEV 369 419 memcpy(self->txtransfer+6, buf, sizeof(self->txtransfer)-6);
Note: See TracChangeset
for help on using the changeset viewer.