[add] soft i2c rewrite

This commit is contained in:
robinson
2026-05-11 08:25:49 +08:00
parent ed81f89cd6
commit 5bf1920867
36 changed files with 1374 additions and 3797 deletions

View File

@@ -0,0 +1,43 @@
#include "soft_i2c_if.h"
static const soft_i2c_ops_t *g_soft_i2c_ops = 0;
void soft_i2c_register_ops(const soft_i2c_ops_t *ops)
{
g_soft_i2c_ops = ops;
}
int soft_i2c_if_init(int ch)
{
if (!g_soft_i2c_ops || !g_soft_i2c_ops->init)
return -1;
return g_soft_i2c_ops->init(ch);
}
int soft_i2c_if_mem_write(int ch, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_add_size, const uint8_t *data, uint16_t size, uint32_t timeout)
{
if (!g_soft_i2c_ops || !g_soft_i2c_ops->mem_write)
return -1;
return g_soft_i2c_ops->mem_write(ch, dev_addr, mem_addr, mem_add_size, data, size, timeout);
}
int soft_i2c_if_mem_read(int ch, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_add_size, uint8_t *data, uint16_t size, uint32_t timeout)
{
if (!g_soft_i2c_ops || !g_soft_i2c_ops->mem_read)
return -1;
return g_soft_i2c_ops->mem_read(ch, dev_addr, mem_addr, mem_add_size, data, size, timeout);
}
int soft_i2c_if_write(int ch, uint16_t dev_addr, const uint8_t *data, uint16_t size, uint32_t timeout)
{
if (!g_soft_i2c_ops || !g_soft_i2c_ops->write)
return -1;
return g_soft_i2c_ops->write(ch, dev_addr, data, size, timeout);
}
int soft_i2c_if_read(int ch, uint16_t dev_addr, uint8_t *data, uint16_t size, uint32_t timeout)
{
if (!g_soft_i2c_ops || !g_soft_i2c_ops->read)
return -1;
return g_soft_i2c_ops->read(ch, dev_addr, data, size, timeout);
}

View File

@@ -0,0 +1,37 @@
#ifndef __SOFT_I2C_IF_H__
#define __SOFT_I2C_IF_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stddef.h>
typedef struct {
int (*init)(int ch);
int (*mem_write)(int ch, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_add_size, const uint8_t *data, uint16_t size, uint32_t timeout);
int (*mem_read)(int ch, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_add_size, uint8_t *data, uint16_t size, uint32_t timeout);
int (*write)(int ch, uint16_t dev_addr, const uint8_t *data, uint16_t size, uint32_t timeout);
int (*read)(int ch, uint16_t dev_addr, uint8_t *data, uint16_t size, uint32_t timeout);
void (*__start_frame)(int ch);
void (*__send_frame)(int ch, uint8_t byte);
int (*__wait_ack_frame)(int ch);
void (*__stop_frame)(int ch);
int (*__read_frame)(int ch, int ack);
void (*__send_ack_frame)(int ch, int ack);
} soft_i2c_ops_t;
void soft_i2c_register_ops(const soft_i2c_ops_t *ops);
int soft_i2c_if_init(int ch);
int soft_i2c_if_mem_write(int ch, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_add_size, const uint8_t *data, uint16_t size, uint32_t timeout);
int soft_i2c_if_mem_read(int ch, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_add_size, uint8_t *data, uint16_t size, uint32_t timeout);
int soft_i2c_if_write(int ch, uint16_t dev_addr, const uint8_t *data, uint16_t size, uint32_t timeout);
int soft_i2c_if_read(int ch, uint16_t dev_addr, uint8_t *data, uint16_t size, uint32_t timeout);
#ifdef __cplusplus
}
#endif
#endif