Edit online

数据结构设计

2 Dec 2024
Read time: 2 minute(s)
  • drv 层管理 I2C 控制器资源的顶层结构体
    struct aic_i2c_bus {
        struct rt_i2c_bus_device bus;                   //RTT 内核 I2C 控制器数据结构
        aic_i2c_ctrl aic_bus;                           //I2C 控制器资源的底层结构体
        struct rt_completion cmd_complete;              //完成量,用于指示一个 message 是否传输完成
    };
  • RTT 内核 I2C 控制器数据结构
    struct rt_i2c_bus_device
    {
        struct rt_device parent;                        //设备基类 device
        const struct rt_i2c_bus_device_ops *ops;        //I2C 操作方法
        rt_uint16_t  flags;                             //I2C 读写标志
        struct rt_mutex lock;                           //互斥锁,保证多线程访问安全
        rt_uint32_t  timeout;                           //超时时间
        rt_uint32_t  retries;                           //调用次数
        void *priv;                                     //私有数据
    };
  • hal 层管理 I2C 控制器资源的底层结构体
    struct aic_i2c_ctrl
    {
        int32_t index;
        char *device_name;
        unsigned long reg_base;
        uint32_t addr_bit;
        uint32_t speed_mode;
        uint32_t bus_mode;
        struct aic_i2c_msg *msg;                        //指向当前传输的 message
        struct aic_i2c_slave_info slave;                //从机信息数据结构
        enum aic_msg_status msg_status;
        uint32_t slave_addr;
        uint32_t abort_source;
        uint32_t msg_err;
        uint32_t buf_write_idx;                         //当前 message 为 write msg 时,buf_write_idx 为写数据的计数。当前 message 为 read msg 时,buf_write_idx 为写命令的计数(I2C 模块需要每次写 read 命令,才能读出数据)。
        uint32_t buf_read_idx;                          //读数据的计数
        bool is_first_message;                          //是否是最后一个 message
        bool is_last_message;                           //是否是第一个 message
    };
  • I2C 消息数据结构原型
    struct aic_i2c_msg
    {
        uint16_t addr;                              // 从机地址
        uint16_t flags;                             // 读写标志
        uint16_t len;                               // 数据长度
        uint8_t  *buf;                              // 待传输数据的指针
    };
  • I2C 从机信息数据结构原型
    struct aic_i2c_slave_info
    {
        void *callback_param;                       //回调参数
        i2c_slave_cb_t slave_cb;                    //从机回调函数
    };