Files
luban-lite-t3e-pro/packages/third-party/i2c-tools/src/i2c_utils.cpp
刘可亮 7bbc029dae v1.0.0
2023-08-30 16:21:18 +08:00

159 lines
3.5 KiB
C++

#include "i2c_utils.h"
#ifdef I2C_TOOLS_USE_SW_I2C
#include "SoftwareI2C.h"
SoftwareI2C softwarei2c;
#else
struct rt_i2c_bus_device *i2c_bus;
#endif
long strtonum(const char* str)
{
long data;
if (strcmp(str, "0x"))
{
data = (rt_uint8_t)strtol(str, NULL, 0);
}
else
{
data = atoi(str);
}
return data;
}
void i2c_help()
{
rt_kprintf("---------------\n");
rt_kprintf("i2c tools help:\n");
rt_kprintf("---------------\n");
#ifdef I2C_TOOLS_USE_SW_I2C
rt_kprintf("i2c scan pin_sda pin_scl [start addr] [stop addr]\n");
rt_kprintf("i2c read pin_sda pin_scl address register [len=1]\n");
rt_kprintf("i2c write pin_sda pin_scl address [register] data_0 data_1 ...\n\n");
#else
rt_kprintf("i2c scan bus_name [start addr] [stop addr]\n");
rt_kprintf("i2c read bus_name address register [len=1]\n");
rt_kprintf("i2c write bus_name address [register] data_0 data_1 ...\n\n");
#endif
}
#ifdef I2C_TOOLS_USE_SW_I2C
rt_bool_t i2c_init(int sda, int scl)
{
softwarei2c.begin(sda, scl);
return RT_EOK;
}
#else
rt_bool_t i2c_init(const char* busname)
{
i2c_bus = rt_i2c_bus_device_find(busname);
if(i2c_bus == RT_NULL)
{
return RT_ERROR;
}
else
{
return RT_EOK;
}
}
#endif
int i2c_probe(char addr)
{
#ifdef I2C_TOOLS_USE_SW_I2C
int ret = softwarei2c.beginTransmission(addr);
softwarei2c.endTransmission();
return ret;
#else
unsigned char cmd[1];
cmd[0] = 0;
struct rt_i2c_msg msgs;
msgs.addr = addr;
msgs.flags = RT_I2C_WR;
msgs.buf = cmd;
msgs.len = 0;
return rt_i2c_transfer(i2c_bus, &msgs, 1);
#endif
}
rt_bool_t i2c_write(char addr, rt_uint8_t* data, int len)
{
#ifdef I2C_TOOLS_USE_SW_I2C
softwarei2c.beginTransmission(addr);
int ret = softwarei2c.write(data, len);
softwarei2c.endTransmission();
return ret;
#else
struct rt_i2c_msg msgs;
msgs.addr = addr;
msgs.flags = RT_I2C_WR;
msgs.buf = data;
msgs.len = len;
return (rt_i2c_transfer(i2c_bus, &msgs, 1) == 1);
#endif
}
rt_uint8_t i2c_read(rt_uint8_t addr, rt_uint8_t reg, rt_uint8_t* buffer, rt_uint8_t len)
{
#ifdef I2C_TOOLS_USE_SW_I2C
rt_uint8_t ret = 0;
softwarei2c.requestFrom(addr, len);
while (softwarei2c.available()) {
buffer[ret] = softwarei2c.read();
ret++;
}
return ret;
#else
struct rt_i2c_msg msgs[2];
msgs[0].addr = addr;
msgs[0].flags = RT_I2C_WR;
msgs[0].buf = ®
msgs[0].len = 1;
msgs[1].addr = addr;
msgs[1].flags = RT_I2C_RD;
msgs[1].buf = buffer;
msgs[1].len = len;
if (rt_i2c_transfer(i2c_bus, msgs, 2) == 2)
{
return len;
}
else
{
return 0;
}
#endif
}
void i2c_scan(rt_uint8_t start_addr, rt_uint8_t stop_addr)
{
rt_kputs(" 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
rt_uint8_t pos = start_addr <= 0xF? 0x00: start_addr & 0xF;
for(; pos < stop_addr; pos++)
{
if((pos & 0xF) == 0)
{
rt_kprintf("\n%02X: ", pos);
}
if(pos < start_addr)
{
rt_kputs(" ");
continue;
}
if( i2c_probe(pos) == 1)
{
rt_kprintf("%02X", pos);
}
else
{
rt_kputs("--");
}
rt_kputs(" ");
}
rt_kputs("\n");
}