AP_HAL_Linux: Add do_transfer method to i2c driver
Method needed for mt9v117 camera sensor
This commit is contained in:
parent
04f601d42f
commit
26163b6640
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user