diff options
| author | Aditya Naik | 2020-07-30 14:16:20 -0400 |
|---|---|---|
| committer | Aditya Naik | 2020-07-30 14:16:20 -0400 |
| commit | c8c06aea5199e555235f71acc8547ed2ef0706cf (patch) | |
| tree | e1d72f836873c9fc99dd200dd8829c6f0046b96f /src/stream_i2c.c | |
| parent | 70f623d66439a826927b7d2fc9d64ae0cb631b92 (diff) | |
Stream abstraction
Diffstat (limited to 'src/stream_i2c.c')
| -rw-r--r-- | src/stream_i2c.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/stream_i2c.c b/src/stream_i2c.c new file mode 100644 index 0000000..b149756 --- /dev/null +++ b/src/stream_i2c.c @@ -0,0 +1,37 @@ +#include "stream_i2c.h" +#include "port.h" +#include "stream.h" + +int i2c_read(uint8_t* buf, size_t count, void **vptr, void *sptr) +{ + p_stream_t *stream = (p_stream_t*)sptr; + I2C_HandleTypeDef dev = *(I2C_HandleTypeDef*)stream->props[DEVICE]; + + uint16_t addr = *(uint16_t*)vptr[0]; + uint32_t timeout = *(uint32_t*)vptr[1]; + uint16_t AF_limit = *(uint32_t*)vptr[2]; + + int error, AF_counter = 0; + while (HAL_I2C_Master_Receive(&dev, addr, buf, count, timeout) != HAL_OK) { + if ((error = HAL_I2C_GetError(&dev)) != HAL_I2C_ERROR_AF) { + return error; + } + else if (++AF_counter > AF_limit) { + return HAL_I2C_ERROR_AF; + } + } + return 0; +} + +int i2c_write(uint8_t* buf, size_t count, void **vptr, void *sptr) +{ + p_stream_t *stream = (p_stream_t*)sptr; + I2C_HandleTypeDef dev = *(I2C_HandleTypeDef*)stream->props[DEVICE]; + uint16_t addr = *(uint16_t*)vptr[1]; + uint32_t timeout = *(uint32_t*)vptr[2]; + + while (HAL_I2C_Master_Transmit(&dev, addr, buf, count, timeout) != HAL_OK) { + return HAL_I2C_GetError(&dev); + } + return 0; +} |
