AP_HAL_Linux: Add do_transfer method to i2c driver

Method needed for mt9v117 camera sensor
This commit is contained in:
Julien BERAUD 2015-11-26 14:25:40 +01:00 committed by Andrew Tridgell
parent 04f601d42f
commit 26163b6640
2 changed files with 44 additions and 1 deletions

View File

@ -308,7 +308,48 @@ uint8_t I2CDriver::readRegister(uint8_t addr, uint8_t reg, uint8_t* data)
return 0;
}
uint8_t I2CDriver::lockup_count()
/*
main transfer function
*/
bool I2CDriver::do_transfer(uint8_t addr, const uint8_t *send,
uint32_t send_len, uint8_t *recv,
uint32_t recv_len)
{
struct i2c_msg i2cmsg[2] = {
{
addr : addr,
flags : 0,
len : (typeof(i2cmsg->len))send_len,
buf : (typeof(i2cmsg->buf))send
},
{
addr : addr,
flags : I2C_M_RD,
len : (typeof(i2cmsg->len))recv_len,
buf : (typeof(i2cmsg->buf))recv,
}
};
struct i2c_rdwr_ioctl_data msg_rdwr;
if (send_len == 0 && recv_len) {
msg_rdwr.msgs = &i2cmsg[1];
msg_rdwr.nmsgs = 1;
}
else if (send_len && recv_len == 0) {
msg_rdwr.msgs = &i2cmsg[0];
msg_rdwr.nmsgs = 1;
}
else if (send_len && recv_len) {
msg_rdwr.msgs = &i2cmsg[0];
msg_rdwr.nmsgs = 2;
}
else {
return false;
}
return ioctl(_fd, I2C_RDWR, &msg_rdwr) == (int)msg_rdwr.nmsgs;
}
uint8_t I2CDriver::lockup_count()
{
return 0;
}

View File

@ -41,6 +41,8 @@ public:
uint8_t lockup_count();
AP_HAL::Semaphore* get_semaphore() { return _semaphore; }
bool do_transfer(uint8_t address, const uint8_t *send, uint32_t send_len,
uint8_t *recv, uint32_t recv_len)override;
private:
bool set_address(uint8_t addr);