1 /** 2 * @file hi_i2c.h 3 * 4 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED. 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 /** @defgroup iot_i2c I2C 19 * @ingroup drivers 20 */ 21 #ifndef __HI_I2C_H__ 22 #define __HI_I2C_H__ 23 24 #include <hi_types_base.h> 25 26 /* 27 * I2C Interface 28 */ 29 #define I2C_RATE_DEFAULT 100000 30 31 typedef hi_void (*i2c_reset_func)(hi_void); 32 typedef hi_void (*i2c_prepare_func)(hi_void); 33 typedef hi_void (*i2c_restore_func)(hi_void); 34 35 /** 36 * @ingroup iot_i2c 37 * 38 * I2C callback function. CNcomment:I2C回调函数。CNend 39 */ 40 typedef struct { 41 i2c_reset_func reset_func; /**< This function is called back when the communication with the slave device 42 is abnormal.CNcomment:I2C从异常处理函数CNend */ 43 i2c_prepare_func prepare_func; /**< This function is called back before the I2C read/write operation to implement 44 the preparations before the I2C operation. 45 CNcomment:I2C操作前准备函数CNend */ 46 i2c_restore_func restore_func; /**< After the I2C read/write operation is performed, this function is 47 called back to implement the recovery after the I2C operation. 48 CNcomment:I2C操作后恢复函数CNend */ 49 } hi_i2c_func; 50 51 /** 52 * @ingroup iot_i2c 53 * 54 * I2C TX/RX data descriptor. CNcomment:I2C发送/接收数据描述符。CNend 55 */ 56 typedef struct { 57 hi_u8* send_buf; /**< Data TX pointer. The user needs to ensure that no null pointer is transferred. 58 CNcomment:数据发送指针CNend */ 59 hi_u32 send_len; /**< Length of sent data (unit: byte). 60 CNcomment:发送数据长度(单位:byte)CNend */ 61 hi_u8* receive_buf; /**< Data RX pointer. CNcomment:数据接收指针CNend */ 62 hi_u32 receive_len; /**< Length of received data (unit: byte). 63 CNcomment:接收数据长度(单位:byte)CNend */ 64 } hi_i2c_data; 65 66 /** 67 * @ingroup iot_i2c 68 * 69 * I2C hardware index. CNComment:I2C硬件设备枚举。CNend 70 */ 71 typedef enum { 72 HI_I2C_IDX_0, 73 HI_I2C_IDX_1, 74 } hi_i2c_idx; 75 76 /** 77 * @ingroup iot_i2c 78 * @brief Set I2C baudrate. CNcomment:I2C设置波特率。CNend 79 * 80 * @par 描述: 81 * Set I2C baudrate. CNcomment:I2C设置波特率。CNend 82 * 83 * @attention Multiple tasks are not protected (multiple tasks are not supported). CNcomment:未作 84 多任务保护(不支持多任务)。CNend 85 * @param id [IN] type #hi_i2c_idx,I2C hardware selection. CNcomment:I2C硬件设备选择。CNend 86 * @param baudrate [IN] type #hi_u32,I2C baudrate. CNcomment:I2C波特率。CNend 87 * 88 * @retval #0 Success. 89 * @retval #Other Failure. For details, see hi_errno.h. 90 * @par 依赖: 91 * @li hi_i2c.h:Declares the API.CNcomment:该接口声明所在的头文件。CNend 92 * @see hi_i2c_write|hi_i2c_receive。 93 */ 94 hi_u32 hi_i2c_set_baudrate(hi_i2c_idx id, hi_u32 baudrate); 95 96 /** 97 * @ingroup iot_i2c 98 * @brief I2C data TX and RX.CNcomment:I2C发送与接收数据。CNend 99 * 100 * @par 描述: 101 * The I2C sends data to the slave device and then receives data from the slave device. 102 CNcomment:I2C向从机发送数据,然后接收从机数据。CNend 103 * 104 * @attention Multi-tasking is not supported. CNcomment:未作多任务保护(不支持多任务)。CNend 105 * @param id [IN] type #hi_i2c_idx,I2C hardware selection. CNcomment:I2C硬件设备选择。CNend 106 * @param device_addr [IN] type #hi_u16,The device ID. High three bits of offset address of the I2C device on chipset. 107 CNcomment:设备号及设备片内偏移地址高3位(从设备哪个地方开始读)。CNend 108 * @param i2c_data [IN/OUT] type #const hi_i2c_data*,The data descriptor to be received. 109 * The structure member data sending pointer and data receiving pointer cannot be null. 110 CNcomment:待接收数据描述符,结构体成员数据发送指针和数据接收指针都不为空。CNend 111 * 112 * @retval #0 Success. 113 * @retval #Other Failure. For details, see hi_errno.h. 114 * @par 依赖: 115 * @li hi_i2c.h:Declares the API.CNcomment:该接口声明所在的头文件。CNend 116 * @see hi_i2c_write|hi_i2c_receive。 117 */ 118 hi_u32 hi_i2c_writeread(hi_i2c_idx id, hi_u16 device_addr, const hi_i2c_data *i2c_data); 119 120 /** 121 * @ingroup iot_i2c 122 * @brief I2C data TX. CNcomment:I2C发送数据。CNend 123 * 124 * @par 描述: 125 * I2C data TX. CNcomment:I2C发送数据。CNend 126 * 127 * @attention Multiple tasks are not protected (multiple tasks are not supported). CNcomment:未作 128 多任务保护(不支持多任务)。CNend 129 * @param id [IN] type #hi_i2c_idx,I2C hardware selection. CNcomment:I2C硬件设备选择。CNend 130 * @param device_addr [IN] type #hi_u16,The device ID. High three bits of offset address of the I2C device on chipset. 131 CNcomment:设备号及设备片内偏移地址高3位(从设备哪个地方开始读)。CNend 132 * @param i2c_data [IN] type #const hi_i2c_data*,The data descriptor to be received. The structure member data sending 133 * pointer and data receiving pointer cannot be null. 134 CNcomment:待接收数据描述符,结构体成员数据发送指针和数据接收指针都不为空。CNend 135 * 136 * @retval #0 Success. 137 * @retval #Other Failure. For details, see hi_errno.h. 138 * @par 依赖: 139 * @li hi_i2c.h:Declares the API.CNcomment:该接口声明所在的头文件。CNend 140 * @see hi_i2c_writeread|hi_i2c_receive。 141 */ 142 hi_u32 hi_i2c_write(hi_i2c_idx id, hi_u16 device_addr, const hi_i2c_data *i2c_data); 143 144 /** 145 * @ingroup iot_i2c 146 * @brief I2C data RX. CNcomment:I2C接收数据。CNend 147 * 148 * @par 描述: 149 * I2C data RX. CNcomment:I2C接收数据。CNend 150 * 151 * @attention Multi-tasking is not supported. CNcomment:未作多任务保护(不支持多任务)。CNend 152 * @param id [IN] type #hi_i2c_idx,I2C hardware selection. CNcomment:I2C硬件设备选择。CNend 153 * @param device_addr [IN] type #hi_u16,The device ID. High three bits of offset address of the I2C device on chipset. 154 CNcomment:设备号及设备片内偏移地址高3位(从设备哪个地方开始读)。CNend 155 * @param i2c_data [OUT] type #const hi_i2c_data*,The data descriptor to be received. The structure member data sending 156 * pointer and data receiving pointer cannot be null. 157 CNcomment:待接收数据描述符,结构体成员数据发送指针和数据接收指针都不为空。CNend 158 * 159 * @retval #0 Success. 160 * @retval #Other Failure. For details, see hi_errno.h. 161 * @par 依赖: 162 * @li hi_i2c.h:Declares the API.CNcomment:该接口声明所在的头文件。CNend 163 * @see hi_i2c_write|hi_i2c_sendreceive。 164 */ 165 hi_u32 hi_i2c_read(hi_i2c_idx id, hi_u16 device_addr, const hi_i2c_data *i2c_data); 166 167 /** 168 * @ingroup iot_i2c 169 * @brief Initializes the I2C controller. CNcomment:I2C初始化。CNend 170 * 171 * @par 描述: 172 * Initializes the I2C controller. CNcomment:I2C初始化。CNend 173 * 174 * @attention None 175 * @param id [IN] type #hi_i2c_idx,I2C hardware selection. CNcomment:I2C硬件设备选择。CNend 176 * @param baudrate [IN] type #hi_u32,I2C baudrate. CNcomment:I2C波特率。CNend 177 * 178 * @retval #0 Success. 179 * @retval #Other Failure. For details, see hi_errno.h. 180 * @par 依赖: 181 * @li hi_i2c.h:Declares the API.CNcomment:该接口声明所在的头文件。CNend 182 * @see hi_i2c_deinit。 183 */ 184 hi_u32 hi_i2c_init(hi_i2c_idx id, hi_u32 baudrate); 185 186 /** 187 * @ingroup iot_i2c 188 * @brief Exits the I2C module.CNcomment:退出I2C模块。CNend 189 * 190 * @par 描述: 191 * Exits the I2C module. CNcomment:退出I2C模块。CNend 192 * 193 * @attention This API is called after hi_i2c_init is called. CNcomment:hi_i2c_init调用后再使用。CNend 194 * @param id [IN] type #hi_i2c_idx,I2C hardware selection. CNcomment:I2C硬件设备选择。CNend 195 * 196 * @retval #0 Success. 197 * @retval #Other Failure. For details, see hi_errno.h. 198 * @par 依赖: 199 * @li hi_i2c.h:Declares the API.CNcomment:该接口声明所在的头文件。CNend 200 * @see hi_i2c_init。 201 */ 202 hi_u32 hi_i2c_deinit(hi_i2c_idx id); 203 204 /** 205 * @ingroup iot_i2c 206 * @brief Registers the I2C callback function.CNcomment:注册I2C回调函数。CNend 207 * 208 * @par 描述: 209 * Registers the I2C callback function, for extension.CNcomment:注册I2C回调函数,用于扩展。CNend 210 * 211 * @attention None 212 * @param id [IN] type #hi_i2c_idx,I2C hardware selection. CNcomment:I2C硬件设备选择。CNend 213 * @param pfn [IN] type #hi_i2c_func,Callback function. CNcomment:回调函数。CNend 214 * 215 * @retval #0 Success. 216 * @retval #Other Failure. For details, see hi_errno.h. 217 * @par 依赖: 218 * @li hi_i2c.h:Declares the API.CNcomment:该接口声明所在的头文件。CNend 219 * @see None 220 */ 221 hi_void hi_i2c_register_reset_bus_func(hi_i2c_idx id, hi_i2c_func pfn); 222 223 #endif 224