2019-04-08 17:38:38 -03:00
|
|
|
#include "common.h"
|
2019-04-09 09:33:52 -03:00
|
|
|
#include "arm.h"
|
2017-07-10 01:46:52 +02:00
|
|
|
|
2019-04-08 17:38:38 -03:00
|
|
|
#include "i2c.h"
|
|
|
|
#include "pxi.h"
|
2020-07-19 11:44:03 -03:00
|
|
|
#include "shmem.h"
|
2017-11-24 02:48:56 +01:00
|
|
|
|
2019-09-02 23:34:27 -03:00
|
|
|
bool I2C_readRegBuf(I2cDevice devId, u8 regAddr, u8 *out, u32 size)
|
|
|
|
{
|
2019-04-08 17:38:38 -03:00
|
|
|
int ret;
|
2020-07-19 11:44:03 -03:00
|
|
|
const u32 arg = devId | (regAddr << 8) | (size << 16);
|
2016-02-13 17:29:56 +01:00
|
|
|
|
2020-07-19 11:44:03 -03:00
|
|
|
if (size >= I2C_SHARED_BUFSZ)
|
2019-09-02 23:34:27 -03:00
|
|
|
return false;
|
|
|
|
|
2020-08-25 10:49:52 -03:00
|
|
|
ret = PXI_DoCMD(PXICMD_I2C_OP, &arg, 1);
|
2019-09-02 23:34:27 -03:00
|
|
|
|
2020-07-19 11:44:03 -03:00
|
|
|
ARM_InvDC_Range(ARM_GetSHMEM()->i2cBuffer, size);
|
|
|
|
memcpy(out, ARM_GetSHMEM()->i2cBuffer, size);
|
2019-04-08 17:38:38 -03:00
|
|
|
return ret;
|
2016-02-13 17:29:56 +01:00
|
|
|
}
|
|
|
|
|
2019-04-08 17:38:38 -03:00
|
|
|
bool I2C_writeRegBuf(I2cDevice devId, u8 regAddr, const u8 *in, u32 size)
|
2017-07-10 01:46:52 +02:00
|
|
|
{
|
2019-04-08 17:38:38 -03:00
|
|
|
int ret;
|
2020-08-25 10:49:52 -03:00
|
|
|
const u32 arg = devId | (regAddr << 8) | (size << 16) | BIT(31);
|
2016-02-13 17:29:56 +01:00
|
|
|
|
2020-07-19 11:44:03 -03:00
|
|
|
if (size >= I2C_SHARED_BUFSZ)
|
2019-09-02 23:34:27 -03:00
|
|
|
return false;
|
|
|
|
|
2020-07-19 11:44:03 -03:00
|
|
|
ARM_InvDC_Range(ARM_GetSHMEM()->i2cBuffer, size);
|
|
|
|
memcpy(ARM_GetSHMEM()->i2cBuffer, in, size);
|
|
|
|
ARM_WbDC_Range(ARM_GetSHMEM()->i2cBuffer, size);
|
2019-04-11 18:16:20 -03:00
|
|
|
ARM_DSB();
|
2016-02-13 17:29:56 +01:00
|
|
|
|
2020-08-25 10:49:52 -03:00
|
|
|
ret = PXI_DoCMD(PXICMD_I2C_OP, &arg, 1);
|
2019-04-08 17:38:38 -03:00
|
|
|
return ret;
|
2016-02-13 17:29:56 +01:00
|
|
|
}
|
|
|
|
|
2017-11-24 02:48:56 +01:00
|
|
|
u8 I2C_readReg(I2cDevice devId, u8 regAddr)
|
|
|
|
{
|
2020-07-19 11:44:03 -03:00
|
|
|
u8 data = 0xFF;
|
|
|
|
I2C_readRegBuf(devId, regAddr, &data, 1);
|
2017-11-24 02:48:56 +01:00
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool I2C_writeReg(I2cDevice devId, u8 regAddr, u8 data)
|
|
|
|
{
|
|
|
|
return I2C_writeRegBuf(devId, regAddr, &data, 1);
|
|
|
|
}
|