fi2c.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /*
  2. * Copyright : (C) 2022 Phytium Information Technology, Inc.
  3. * All Rights Reserved.
  4. *
  5. * This program is OPEN SOURCE software: you can redistribute it and/or modify it
  6. * under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
  7. * either version 1.0 of the License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
  10. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. * See the Phytium Public License for more details.
  12. *
  13. *
  14. * FilePath: fi2c.h
  15. * Date: 2022-02-10 14:53:42
  16. * LastEditTime: 2022-02-18 08:37:04
  17. * Description:  This files is for
  18. *
  19. * Modify History:
  20. * Ver   Who        Date         Changes
  21. * ----- ------     --------    --------------------------------------
  22. */
  23. #ifndef DRIVERS_I2C_FI2C_H
  24. #define DRIVERS_I2C_FI2C_H
  25. #ifdef __cplusplus
  26. extern "C"
  27. {
  28. #endif
  29. /***************************** Include Files *********************************/
  30. #include "ftypes.h"
  31. #include "fassert.h"
  32. #include "ferror_code.h"
  33. #include "sdkconfig.h"
  34. /************************** Constant Definitions *****************************/
  35. #define FI2C_SUCCESS FT_SUCCESS
  36. #define FI2C_ERR_INVAL_PARM FT_MAKE_ERRCODE(ErrModBsp, ErrBspI2c, 1)
  37. #define FI2C_ERR_NOT_READY FT_MAKE_ERRCODE(ErrModBsp, ErrBspI2c, 2)
  38. #define FI2C_ERR_TIMEOUT FT_MAKE_ERRCODE(ErrModBsp, ErrBspI2c, 3)
  39. #define FI2C_ERR_NOT_SUPPORT FT_MAKE_ERRCODE(ErrModBsp, ErrBspI2c, 4)
  40. #define FI2C_ERR_INVAL_STATE FT_MAKE_ERRCODE(ErrModBsp, ErrBspI2c, 5)
  41. /* add up new error code above and plust FI2C_ERR_CODE_MAX by ONE*/
  42. #define FI2C_ERR_CODE_MAX FT_MAKE_ERRCODE(ErrModBsp, ErrBspI2c, 6)
  43. #define FI2C_ERR_CODE_PREFIX FI2C_ERR_CODE_MAX & (FT_ERRCODE_SYS_MODULE_MASK | FT_ERRCODE_SUB_MODULE_MASK)
  44. #define FI2C_NUM_OF_ERR_CODE FI2C_ERR_CODE_MAX & FT_ERRCODE_TAIL_VALUE_MASK
  45. /*
  46. * status codes
  47. */
  48. #define STATUS_IDLE 0x0
  49. #define STATUS_WRITE_IN_PROGRESS 0x1
  50. #define STATUS_READ_IN_PROGRESS 0x2
  51. enum
  52. {
  53. FI2C_MASTER = 0, /* i2c主设备 */
  54. FI2C_SLAVE /* i2c从设备 */
  55. };
  56. enum
  57. {
  58. FI2C_SPEED_STANDARD_RATE = 100000, /* 100kb/s */
  59. FI2C_SPEED_FAST_RATE = 400000 /* 400kb/s */
  60. };
  61. enum
  62. {
  63. FI2C_EVT_MASTER_TRANS_ABORTED = 0,/*master模式传输出错回调函数事件值*/
  64. FI2C_EVT_MASTER_READ_DONE, /*master模式接收完成回调函数事件值*/
  65. FI2C_EVT_MASTER_WRITE_DONE, /*master模式发送完成回调函数事件值*/
  66. FI2C_MASTER_INTR_EVT_NUM
  67. }; /* master mode evt */
  68. enum/*slave模式回调函数事件值*/
  69. {
  70. FI2C_EVT_SLAVE_READ_REQUESTED = 0, /*slave收到主机读取内容的请求*/
  71. FI2C_EVT_SLAVE_WRITE_REQUESTED, /*slave收到主机发送的写请求*/
  72. FI2C_EVT_SLAVE_READ_PROCESSED, /*在Slave发送模式下,发送完数据的最后一个字节后,在规定时间内没有收到 Master 端的回应*/
  73. FI2C_EVT_SLAVE_WRITE_RECEIVED, /*Slave收到主机发送的数据,需要存下*/
  74. FI2C_EVT_SLAVE_STOP, /*I2C总线接口上是否产生了STOP。与控制器工作在Master模式还是 Slave 模式无关。*/
  75. FI2C_SLAVE_INTR_EVT_NUM
  76. }; /* slave mode evt */
  77. /**************************** Type Definitions *******************************/
  78. typedef struct
  79. {
  80. u32 instance_id; /* Device instance id */
  81. uintptr base_addr; /* Device base address */
  82. u32 irq_num; /* Device intrrupt id */
  83. u32 irq_prority; /* Device intrrupt priority */
  84. u32 ref_clk_hz; /* Input reference clock frequency in Hz */
  85. u32 work_mode; /* Device work mode Slave or Master */
  86. u32 slave_addr; /*Master mode Slave Address writing/reading to/from ,Slave mode set local address*/
  87. boolean use_7bit_addr; /* Slave in-chip address offset in 7bit or 10bit */
  88. u32 speed_rate; /* I2C speed rate */
  89. } FI2cConfig; /* Device configure setting */
  90. typedef void (*FI2cEvtHandler)(void *instance_p, void *param);
  91. typedef struct
  92. {
  93. /* data */
  94. const void *data_buff;
  95. u32 tx_total_num;
  96. volatile u32 tx_cnt;
  97. u32 flag;/* CMD BIT(8), STOP BIT(9) and RESTART BIT(10) Generation */
  98. } FI2cFrameTX;
  99. typedef struct
  100. {
  101. /* data */
  102. void *data_buff;
  103. u32 rx_total_num;
  104. volatile u32 rx_cnt;
  105. } FI2cFrameRX;
  106. typedef struct
  107. {
  108. FI2cConfig config; /* Current active configs */
  109. u32 is_ready; /* Device is initialized and ready */
  110. volatile u32 status;
  111. FI2cFrameTX txframe;
  112. FI2cFrameRX rxframe;
  113. /** only apply to master device **/
  114. /* Master intrrupt handler */
  115. FI2cEvtHandler master_evt_handlers[FI2C_MASTER_INTR_EVT_NUM];
  116. /** only apply to slave device **/
  117. /* Slave intrrupt handler */
  118. FI2cEvtHandler slave_evt_handlers[FI2C_SLAVE_INTR_EVT_NUM];
  119. } FI2c; /* Device instance */
  120. /************************** Variable Definitions *****************************/
  121. /***************** Macros (Inline Functions) Definitions *********************/
  122. /************************** Function Prototypes ******************************/
  123. /* fi2c_sinit.c */
  124. /* 获取I2C驱动的默认配置参数 */
  125. const FI2cConfig *FI2cLookupConfig(u32 instance_id);
  126. /* fi2c.c */
  127. /* 完成I2C驱动实例的初始化,使之可以使用*/
  128. FError FI2cCfgInitialize(FI2c *instance_p, const FI2cConfig *cofig_p);
  129. /* 完成I2C驱动实例去使能,清零实例数据 */
  130. void FI2cDeInitialize(FI2c *instance_p);
  131. /* 获取I2C模块错误码对应的错误信息 */
  132. const char *FI2cErrorToMessage(FError error);
  133. /* fi2c_master.c */
  134. /* I2C主机读,阻塞直到完成读操作或失败 */
  135. FError FI2cMasterReadPoll(FI2c *instance_p, u32 mem_addr, u8 mem_byte_len, u8 *buf_p, u32 buf_len);
  136. /*I2C主机读,接收中断读操作或者失败 */
  137. FError FI2cMasterReadIntr(FI2c *instance_p, u32 mem_addr, u8 mem_byte_len, u8 *buf_p, u32 buf_len);
  138. /* I2C主机写,中断发送直到完成写操作或失败 */
  139. FError FI2cMasterWriteIntr(FI2c *instance_p, u32 mem_addr, u8 mem_byte_len, const u8 *buf_p, u32 buf_len);
  140. /* I2C主机写,阻塞直到完成写操作或失败 */
  141. FError FI2cMasterWritePoll(FI2c *instance_p, u32 mem_addr, u8 mem_byte_len, const u8 *buf_p, u32 buf_len);
  142. /* 获取I2C的中断值*/
  143. u32 FI2cGetIntr(FI2c *instance_p);
  144. /* 设置I2C主机的中断 */
  145. FError FI2cMasterSetupIntr(FI2c *instance_p, u32 mask);
  146. /* 主机模式中断服务函数 */
  147. void FI2cMasterIntrHandler(s32 vector, void *param);
  148. /* 注册I2C主机中断事件函数 */
  149. void FI2cMasterRegisterIntrHandler(FI2c *instance_p, u32 evt, FI2cEvtHandler handler);
  150. /* 设置I2C从机的中断 */
  151. FError FI2cSlaveSetupIntr(FI2c *instance_p);
  152. /* 从机模式中断服务函数 */
  153. void FI2cSlaveIntrHandler(s32 vector, void *param);
  154. /* 注册I2C从机中断事件函数 */
  155. void FI2cSlaveRegisterIntrHandler(FI2c *instance_p, u32 evt, FI2cEvtHandler handler);
  156. #ifdef __cplusplus
  157. }
  158. #endif
  159. #endif