Skip to content

File syn_i2c_queue.h

File List > drivers > syn_i2c_queue.h

Go to the documentation of this file

#ifndef SYN_I2C_QUEUE_H
#define SYN_I2C_QUEUE_H

#include "../common/syn_defs.h"
#include "../port/syn_port_i2c.h"
#include "../port/syn_port_i2c_async.h"

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef SYN_I2C_QUEUE_MAX_DEPTH
#define SYN_I2C_QUEUE_MAX_DEPTH 16
#endif

typedef void (*SYN_I2C_Queue_Callback)(uint8_t bus, SYN_Status result, void *user_data);

typedef struct {
    uint8_t bus;                     
    uint16_t addr;                   
    uint32_t clock_speed_hz;         
    const uint8_t *tx_data;          
    size_t tx_len;                   
    uint8_t *rx_data;                
    size_t rx_len;                   
    SYN_I2C_Queue_Callback callback; 
    void *user_data;                 
} SYN_I2C_Transaction;

typedef struct {
    SYN_I2C_Transaction ring[SYN_I2C_QUEUE_MAX_DEPTH]; 
    uint16_t head;                                     
    uint16_t tail;                                     
    uint16_t count;                                    
    uint8_t bus;                                       
    bool active;                                       
    bool initialized;                                  
} SYN_I2C_Queue;

SYN_Status syn_i2c_queue_init(SYN_I2C_Queue *q, uint8_t bus);

SYN_Status syn_i2c_queue_enqueue(SYN_I2C_Queue *q, const SYN_I2C_Transaction *tx);

SYN_Status syn_i2c_queue_process(SYN_I2C_Queue *q);

SYN_Status syn_i2c_queue_cancel_all(SYN_I2C_Queue *q);

size_t syn_i2c_queue_count(const SYN_I2C_Queue *q);

#ifdef __cplusplus
}
#endif

#endif /* SYN_I2C_QUEUE_H */