int inv_serial_read_mem( void *sl_handle, unsigned char slave_addr, unsigned short mem_addr, unsigned short length, unsigned char *data) { int result; unsigned short bytes_read = 0; if ((mem_addr & 0xFF) + length > MPU_MEM_BANK_SIZE) { printk ("memory read length (%d B) extends beyond its limits (%d) " "if started at location %d\n", length, MPU_MEM_BANK_SIZE, mem_addr & 0xFF); return INV_ERROR_INVALID_PARAMETER; } while (bytes_read < length) { unsigned short this_len = min(SERIAL_MAX_TRANSFER_SIZE, length - bytes_read); result = mpu_memory_read((struct i2c_adapter *)sl_handle, slave_addr, mem_addr + bytes_read, this_len, &data[bytes_read]); if (result) { LOG_RESULT_LOCATION(result); return result; } bytes_read += this_len; } return 0; }
/** * @brief used to read multiple bytes of data from the memory. * This should be sent by I2C. * * @param slaveAddr I2C slave address of device. * @param memAddr The location in the memory to read from. * @param length Length of burst data. * @param data Pointer to block of data. * * @return Zero if successful; an error code otherwise */ tMLError MLSLSerialReadMem(void *sl_handle, unsigned char slaveAddr, unsigned short memAddr, unsigned short length, unsigned char *data) { tMLError result; unsigned short bytesRead = 0; if ((memAddr & 0xFF) + length > MPU_MEM_BANK_SIZE) { printk ("memory read length (%d B) extends beyond its limits (%d) " "if started at location %d\n", length, MPU_MEM_BANK_SIZE, memAddr & 0xFF); return ML_ERROR_INVALID_PARAMETER; } while (bytesRead < length) { unsigned short thisLen = min(SERIAL_MAX_TRANSFER_SIZE, length - bytesRead); result = mpu_memory_read((struct i2c_adapter *) sl_handle, slaveAddr, memAddr + bytesRead, thisLen, &data[bytesRead]); if (ML_SUCCESS != result) return result; bytesRead += thisLen; } return ML_SUCCESS; }