int MPU9250_SPI::read(unsigned reg_speed, void *data, unsigned count) { /* We want to avoid copying the data of MPUReport: So if the caller * supplies a buffer not MPUReport in size, it is assume to be a reg or reg 16 read * and we need to provied the buffer large enough for the callers data * and our command. */ uint8_t cmd[3] = {0, 0, 0}; uint8_t *pbuff = count < sizeof(MPUReport) ? cmd : (uint8_t *) data ; if (count < sizeof(MPUReport)) { /* add command */ count++; } set_bus_frequency(reg_speed); /* Set command */ pbuff[0] = reg_speed | DIR_READ ; /* Transfer the command and get the data */ int ret = transfer(pbuff, pbuff, count); if (ret == OK && pbuff == &cmd[0]) { /* Adjust the count back */ count--; /* Return the data */ memcpy(data, &cmd[1], count); } return ret; }
int MPU6000_SPI::write(unsigned reg_speed, void *data, unsigned count) { uint8_t cmd[MPU_MAX_WRITE_BUFFER_SIZE]; if (sizeof(cmd) < (count + 1)) { return -EIO; } /* Set the desired speed and isolate the register */ set_bus_frequency(reg_speed); cmd[0] = reg_speed | DIR_WRITE; cmd[1] = *(uint8_t *)data; return transfer(&cmd[0], &cmd[0], count + 1); }