1 // THIS HEADER FILE IS AUTOMATICALLY GENERATED -- DO NOT EDIT 2 3 /** 4 * Copyright (c) 2024 Raspberry Pi Ltd. 5 * 6 * SPDX-License-Identifier: BSD-3-Clause 7 */ 8 #ifndef _HARDWARE_STRUCTS_I2C_H 9 #define _HARDWARE_STRUCTS_I2C_H 10 11 /** 12 * \file rp2350/i2c.h 13 */ 14 15 #include "hardware/address_mapped.h" 16 #include "hardware/regs/i2c.h" 17 18 // Reference to datasheet: https://datasheets.raspberrypi.com/rp2350/rp2350-datasheet.pdf#tab-registerlist_i2c 19 // 20 // The _REG_ macro is intended to help make the register navigable in your IDE (for example, using the "Go to Definition" feature) 21 // _REG_(x) will link to the corresponding register in hardware/regs/i2c.h. 22 // 23 // Bit-field descriptions are of the form: 24 // BITMASK [BITRANGE] FIELDNAME (RESETVALUE) DESCRIPTION 25 26 typedef struct { 27 _REG_(I2C_IC_CON_OFFSET) // I2C_IC_CON 28 // I2C Control Register 29 // 0x00000400 [10] STOP_DET_IF_MASTER_ACTIVE (0) Master issues the STOP_DET interrupt irrespective of... 30 // 0x00000200 [9] RX_FIFO_FULL_HLD_CTRL (0) This bit controls whether DW_apb_i2c should hold the bus... 31 // 0x00000100 [8] TX_EMPTY_CTRL (0) This bit controls the generation of the TX_EMPTY... 32 // 0x00000080 [7] STOP_DET_IFADDRESSED (0) In slave mode: - 1'b1: issues the STOP_DET interrupt... 33 // 0x00000040 [6] IC_SLAVE_DISABLE (1) This bit controls whether I2C has its slave disabled,... 34 // 0x00000020 [5] IC_RESTART_EN (1) Determines whether RESTART conditions may be sent when... 35 // 0x00000010 [4] IC_10BITADDR_MASTER (0) Controls whether the DW_apb_i2c starts its transfers in... 36 // 0x00000008 [3] IC_10BITADDR_SLAVE (0) When acting as a slave, this bit controls whether the... 37 // 0x00000006 [2:1] SPEED (0x2) These bits control at which speed the DW_apb_i2c... 38 // 0x00000001 [0] MASTER_MODE (1) This bit controls whether the DW_apb_i2c master is enabled 39 io_rw_32 con; 40 41 _REG_(I2C_IC_TAR_OFFSET) // I2C_IC_TAR 42 // I2C Target Address Register 43 // 0x00000800 [11] SPECIAL (0) This bit indicates whether software performs a Device-ID... 44 // 0x00000400 [10] GC_OR_START (0) If bit 11 (SPECIAL) is set to 1 and bit 13(Device-ID) is... 45 // 0x000003ff [9:0] IC_TAR (0x055) This is the target address for any master transaction 46 io_rw_32 tar; 47 48 _REG_(I2C_IC_SAR_OFFSET) // I2C_IC_SAR 49 // I2C Slave Address Register 50 // 0x000003ff [9:0] IC_SAR (0x055) The IC_SAR holds the slave address when the I2C is... 51 io_rw_32 sar; 52 53 uint32_t _pad0; 54 55 _REG_(I2C_IC_DATA_CMD_OFFSET) // I2C_IC_DATA_CMD 56 // I2C Rx/Tx Data Buffer and Command Register 57 // 0x00000800 [11] FIRST_DATA_BYTE (0) Indicates the first data byte received after the address... 58 // 0x00000400 [10] RESTART (0) This bit controls whether a RESTART is issued before the... 59 // 0x00000200 [9] STOP (0) This bit controls whether a STOP is issued after the... 60 // 0x00000100 [8] CMD (0) This bit controls whether a read or a write is performed 61 // 0x000000ff [7:0] DAT (0x00) This register contains the data to be transmitted or... 62 io_rw_32 data_cmd; 63 64 _REG_(I2C_IC_SS_SCL_HCNT_OFFSET) // I2C_IC_SS_SCL_HCNT 65 // Standard Speed I2C Clock SCL High Count Register 66 // 0x0000ffff [15:0] IC_SS_SCL_HCNT (0x0028) This register must be set before any I2C bus transaction... 67 io_rw_32 ss_scl_hcnt; 68 69 _REG_(I2C_IC_SS_SCL_LCNT_OFFSET) // I2C_IC_SS_SCL_LCNT 70 // Standard Speed I2C Clock SCL Low Count Register 71 // 0x0000ffff [15:0] IC_SS_SCL_LCNT (0x002f) This register must be set before any I2C bus transaction... 72 io_rw_32 ss_scl_lcnt; 73 74 _REG_(I2C_IC_FS_SCL_HCNT_OFFSET) // I2C_IC_FS_SCL_HCNT 75 // Fast Mode or Fast Mode Plus I2C Clock SCL High Count Register 76 // 0x0000ffff [15:0] IC_FS_SCL_HCNT (0x0006) This register must be set before any I2C bus transaction... 77 io_rw_32 fs_scl_hcnt; 78 79 _REG_(I2C_IC_FS_SCL_LCNT_OFFSET) // I2C_IC_FS_SCL_LCNT 80 // Fast Mode or Fast Mode Plus I2C Clock SCL Low Count Register 81 // 0x0000ffff [15:0] IC_FS_SCL_LCNT (0x000d) This register must be set before any I2C bus transaction... 82 io_rw_32 fs_scl_lcnt; 83 84 uint32_t _pad1[2]; 85 86 _REG_(I2C_IC_INTR_STAT_OFFSET) // I2C_IC_INTR_STAT 87 // I2C Interrupt Status Register 88 // 0x00001000 [12] R_RESTART_DET (0) See IC_RAW_INTR_STAT for a detailed description of... 89 // 0x00000800 [11] R_GEN_CALL (0) See IC_RAW_INTR_STAT for a detailed description of R_GEN_CALL bit 90 // 0x00000400 [10] R_START_DET (0) See IC_RAW_INTR_STAT for a detailed description of... 91 // 0x00000200 [9] R_STOP_DET (0) See IC_RAW_INTR_STAT for a detailed description of R_STOP_DET bit 92 // 0x00000100 [8] R_ACTIVITY (0) See IC_RAW_INTR_STAT for a detailed description of R_ACTIVITY bit 93 // 0x00000080 [7] R_RX_DONE (0) See IC_RAW_INTR_STAT for a detailed description of R_RX_DONE bit 94 // 0x00000040 [6] R_TX_ABRT (0) See IC_RAW_INTR_STAT for a detailed description of R_TX_ABRT bit 95 // 0x00000020 [5] R_RD_REQ (0) See IC_RAW_INTR_STAT for a detailed description of R_RD_REQ bit 96 // 0x00000010 [4] R_TX_EMPTY (0) See IC_RAW_INTR_STAT for a detailed description of R_TX_EMPTY bit 97 // 0x00000008 [3] R_TX_OVER (0) See IC_RAW_INTR_STAT for a detailed description of R_TX_OVER bit 98 // 0x00000004 [2] R_RX_FULL (0) See IC_RAW_INTR_STAT for a detailed description of R_RX_FULL bit 99 // 0x00000002 [1] R_RX_OVER (0) See IC_RAW_INTR_STAT for a detailed description of R_RX_OVER bit 100 // 0x00000001 [0] R_RX_UNDER (0) See IC_RAW_INTR_STAT for a detailed description of R_RX_UNDER bit 101 io_ro_32 intr_stat; 102 103 _REG_(I2C_IC_INTR_MASK_OFFSET) // I2C_IC_INTR_MASK 104 // I2C Interrupt Mask Register 105 // 0x00001000 [12] M_RESTART_DET (0) This bit masks the R_RESTART_DET interrupt in... 106 // 0x00000800 [11] M_GEN_CALL (1) This bit masks the R_GEN_CALL interrupt in IC_INTR_STAT register 107 // 0x00000400 [10] M_START_DET (0) This bit masks the R_START_DET interrupt in IC_INTR_STAT register 108 // 0x00000200 [9] M_STOP_DET (0) This bit masks the R_STOP_DET interrupt in IC_INTR_STAT register 109 // 0x00000100 [8] M_ACTIVITY (0) This bit masks the R_ACTIVITY interrupt in IC_INTR_STAT register 110 // 0x00000080 [7] M_RX_DONE (1) This bit masks the R_RX_DONE interrupt in IC_INTR_STAT register 111 // 0x00000040 [6] M_TX_ABRT (1) This bit masks the R_TX_ABRT interrupt in IC_INTR_STAT register 112 // 0x00000020 [5] M_RD_REQ (1) This bit masks the R_RD_REQ interrupt in IC_INTR_STAT register 113 // 0x00000010 [4] M_TX_EMPTY (1) This bit masks the R_TX_EMPTY interrupt in IC_INTR_STAT register 114 // 0x00000008 [3] M_TX_OVER (1) This bit masks the R_TX_OVER interrupt in IC_INTR_STAT register 115 // 0x00000004 [2] M_RX_FULL (1) This bit masks the R_RX_FULL interrupt in IC_INTR_STAT register 116 // 0x00000002 [1] M_RX_OVER (1) This bit masks the R_RX_OVER interrupt in IC_INTR_STAT register 117 // 0x00000001 [0] M_RX_UNDER (1) This bit masks the R_RX_UNDER interrupt in IC_INTR_STAT register 118 io_rw_32 intr_mask; 119 120 _REG_(I2C_IC_RAW_INTR_STAT_OFFSET) // I2C_IC_RAW_INTR_STAT 121 // I2C Raw Interrupt Status Register 122 // 0x00001000 [12] RESTART_DET (0) Indicates whether a RESTART condition has occurred on... 123 // 0x00000800 [11] GEN_CALL (0) Set only when a General Call address is received and it... 124 // 0x00000400 [10] START_DET (0) Indicates whether a START or RESTART condition has... 125 // 0x00000200 [9] STOP_DET (0) Indicates whether a STOP condition has occurred on the... 126 // 0x00000100 [8] ACTIVITY (0) This bit captures DW_apb_i2c activity and stays set... 127 // 0x00000080 [7] RX_DONE (0) When the DW_apb_i2c is acting as a slave-transmitter,... 128 // 0x00000040 [6] TX_ABRT (0) This bit indicates if DW_apb_i2c, as an I2C transmitter,... 129 // 0x00000020 [5] RD_REQ (0) This bit is set to 1 when DW_apb_i2c is acting as a... 130 // 0x00000010 [4] TX_EMPTY (0) The behavior of the TX_EMPTY interrupt status differs... 131 // 0x00000008 [3] TX_OVER (0) Set during transmit if the transmit buffer is filled to... 132 // 0x00000004 [2] RX_FULL (0) Set when the receive buffer reaches or goes above the... 133 // 0x00000002 [1] RX_OVER (0) Set if the receive buffer is completely filled to... 134 // 0x00000001 [0] RX_UNDER (0) Set if the processor attempts to read the receive buffer... 135 io_ro_32 raw_intr_stat; 136 137 _REG_(I2C_IC_RX_TL_OFFSET) // I2C_IC_RX_TL 138 // I2C Receive FIFO Threshold Register 139 // 0x000000ff [7:0] RX_TL (0x00) Receive FIFO Threshold Level 140 io_rw_32 rx_tl; 141 142 _REG_(I2C_IC_TX_TL_OFFSET) // I2C_IC_TX_TL 143 // I2C Transmit FIFO Threshold Register 144 // 0x000000ff [7:0] TX_TL (0x00) Transmit FIFO Threshold Level 145 io_rw_32 tx_tl; 146 147 _REG_(I2C_IC_CLR_INTR_OFFSET) // I2C_IC_CLR_INTR 148 // Clear Combined and Individual Interrupt Register 149 // 0x00000001 [0] CLR_INTR (0) Read this register to clear the combined interrupt, all... 150 io_ro_32 clr_intr; 151 152 _REG_(I2C_IC_CLR_RX_UNDER_OFFSET) // I2C_IC_CLR_RX_UNDER 153 // Clear RX_UNDER Interrupt Register 154 // 0x00000001 [0] CLR_RX_UNDER (0) Read this register to clear the RX_UNDER interrupt (bit... 155 io_ro_32 clr_rx_under; 156 157 _REG_(I2C_IC_CLR_RX_OVER_OFFSET) // I2C_IC_CLR_RX_OVER 158 // Clear RX_OVER Interrupt Register 159 // 0x00000001 [0] CLR_RX_OVER (0) Read this register to clear the RX_OVER interrupt (bit... 160 io_ro_32 clr_rx_over; 161 162 _REG_(I2C_IC_CLR_TX_OVER_OFFSET) // I2C_IC_CLR_TX_OVER 163 // Clear TX_OVER Interrupt Register 164 // 0x00000001 [0] CLR_TX_OVER (0) Read this register to clear the TX_OVER interrupt (bit... 165 io_ro_32 clr_tx_over; 166 167 _REG_(I2C_IC_CLR_RD_REQ_OFFSET) // I2C_IC_CLR_RD_REQ 168 // Clear RD_REQ Interrupt Register 169 // 0x00000001 [0] CLR_RD_REQ (0) Read this register to clear the RD_REQ interrupt (bit 5)... 170 io_ro_32 clr_rd_req; 171 172 _REG_(I2C_IC_CLR_TX_ABRT_OFFSET) // I2C_IC_CLR_TX_ABRT 173 // Clear TX_ABRT Interrupt Register 174 // 0x00000001 [0] CLR_TX_ABRT (0) Read this register to clear the TX_ABRT interrupt (bit... 175 io_ro_32 clr_tx_abrt; 176 177 _REG_(I2C_IC_CLR_RX_DONE_OFFSET) // I2C_IC_CLR_RX_DONE 178 // Clear RX_DONE Interrupt Register 179 // 0x00000001 [0] CLR_RX_DONE (0) Read this register to clear the RX_DONE interrupt (bit... 180 io_ro_32 clr_rx_done; 181 182 _REG_(I2C_IC_CLR_ACTIVITY_OFFSET) // I2C_IC_CLR_ACTIVITY 183 // Clear ACTIVITY Interrupt Register 184 // 0x00000001 [0] CLR_ACTIVITY (0) Reading this register clears the ACTIVITY interrupt if... 185 io_ro_32 clr_activity; 186 187 _REG_(I2C_IC_CLR_STOP_DET_OFFSET) // I2C_IC_CLR_STOP_DET 188 // Clear STOP_DET Interrupt Register 189 // 0x00000001 [0] CLR_STOP_DET (0) Read this register to clear the STOP_DET interrupt (bit... 190 io_ro_32 clr_stop_det; 191 192 _REG_(I2C_IC_CLR_START_DET_OFFSET) // I2C_IC_CLR_START_DET 193 // Clear START_DET Interrupt Register 194 // 0x00000001 [0] CLR_START_DET (0) Read this register to clear the START_DET interrupt (bit... 195 io_ro_32 clr_start_det; 196 197 _REG_(I2C_IC_CLR_GEN_CALL_OFFSET) // I2C_IC_CLR_GEN_CALL 198 // Clear GEN_CALL Interrupt Register 199 // 0x00000001 [0] CLR_GEN_CALL (0) Read this register to clear the GEN_CALL interrupt (bit... 200 io_ro_32 clr_gen_call; 201 202 _REG_(I2C_IC_ENABLE_OFFSET) // I2C_IC_ENABLE 203 // I2C ENABLE Register 204 // 0x00000004 [2] TX_CMD_BLOCK (0) In Master mode: - 1'b1: Blocks the transmission of data... 205 // 0x00000002 [1] ABORT (0) When set, the controller initiates the transfer abort 206 // 0x00000001 [0] ENABLE (0) Controls whether the DW_apb_i2c is enabled 207 io_rw_32 enable; 208 209 _REG_(I2C_IC_STATUS_OFFSET) // I2C_IC_STATUS 210 // I2C STATUS Register 211 // 0x00000040 [6] SLV_ACTIVITY (0) Slave FSM Activity Status 212 // 0x00000020 [5] MST_ACTIVITY (0) Master FSM Activity Status 213 // 0x00000010 [4] RFF (0) Receive FIFO Completely Full 214 // 0x00000008 [3] RFNE (0) Receive FIFO Not Empty 215 // 0x00000004 [2] TFE (1) Transmit FIFO Completely Empty 216 // 0x00000002 [1] TFNF (1) Transmit FIFO Not Full 217 // 0x00000001 [0] ACTIVITY (0) I2C Activity Status 218 io_ro_32 status; 219 220 _REG_(I2C_IC_TXFLR_OFFSET) // I2C_IC_TXFLR 221 // I2C Transmit FIFO Level Register 222 // 0x0000001f [4:0] TXFLR (0x00) Transmit FIFO Level 223 io_ro_32 txflr; 224 225 _REG_(I2C_IC_RXFLR_OFFSET) // I2C_IC_RXFLR 226 // I2C Receive FIFO Level Register 227 // 0x0000001f [4:0] RXFLR (0x00) Receive FIFO Level 228 io_ro_32 rxflr; 229 230 _REG_(I2C_IC_SDA_HOLD_OFFSET) // I2C_IC_SDA_HOLD 231 // I2C SDA Hold Time Length Register 232 // 0x00ff0000 [23:16] IC_SDA_RX_HOLD (0x00) Sets the required SDA hold time in units of ic_clk... 233 // 0x0000ffff [15:0] IC_SDA_TX_HOLD (0x0001) Sets the required SDA hold time in units of ic_clk... 234 io_rw_32 sda_hold; 235 236 _REG_(I2C_IC_TX_ABRT_SOURCE_OFFSET) // I2C_IC_TX_ABRT_SOURCE 237 // I2C Transmit Abort Source Register 238 // 0xff800000 [31:23] TX_FLUSH_CNT (0x000) This field indicates the number of Tx FIFO Data Commands... 239 // 0x00010000 [16] ABRT_USER_ABRT (0) This is a master-mode-only bit 240 // 0x00008000 [15] ABRT_SLVRD_INTX (0) 1: When the processor side responds to a slave mode... 241 // 0x00004000 [14] ABRT_SLV_ARBLOST (0) This field indicates that a Slave has lost the bus while... 242 // 0x00002000 [13] ABRT_SLVFLUSH_TXFIFO (0) This field specifies that the Slave has received a read... 243 // 0x00001000 [12] ARB_LOST (0) This field specifies that the Master has lost... 244 // 0x00000800 [11] ABRT_MASTER_DIS (0) This field indicates that the User tries to initiate a... 245 // 0x00000400 [10] ABRT_10B_RD_NORSTRT (0) This field indicates that the restart is disabled... 246 // 0x00000200 [9] ABRT_SBYTE_NORSTRT (0) To clear Bit 9, the source of the ABRT_SBYTE_NORSTRT... 247 // 0x00000100 [8] ABRT_HS_NORSTRT (0) This field indicates that the restart is disabled... 248 // 0x00000080 [7] ABRT_SBYTE_ACKDET (0) This field indicates that the Master has sent a START... 249 // 0x00000040 [6] ABRT_HS_ACKDET (0) This field indicates that the Master is in High Speed... 250 // 0x00000020 [5] ABRT_GCALL_READ (0) This field indicates that DW_apb_i2c in the master mode... 251 // 0x00000010 [4] ABRT_GCALL_NOACK (0) This field indicates that DW_apb_i2c in master mode has... 252 // 0x00000008 [3] ABRT_TXDATA_NOACK (0) This field indicates the master-mode only bit 253 // 0x00000004 [2] ABRT_10ADDR2_NOACK (0) This field indicates that the Master is in 10-bit... 254 // 0x00000002 [1] ABRT_10ADDR1_NOACK (0) This field indicates that the Master is in 10-bit... 255 // 0x00000001 [0] ABRT_7B_ADDR_NOACK (0) This field indicates that the Master is in 7-bit... 256 io_ro_32 tx_abrt_source; 257 258 _REG_(I2C_IC_SLV_DATA_NACK_ONLY_OFFSET) // I2C_IC_SLV_DATA_NACK_ONLY 259 // Generate Slave Data NACK Register 260 // 0x00000001 [0] NACK (0) Generate NACK 261 io_rw_32 slv_data_nack_only; 262 263 _REG_(I2C_IC_DMA_CR_OFFSET) // I2C_IC_DMA_CR 264 // DMA Control Register 265 // 0x00000002 [1] TDMAE (0) Transmit DMA Enable 266 // 0x00000001 [0] RDMAE (0) Receive DMA Enable 267 io_rw_32 dma_cr; 268 269 _REG_(I2C_IC_DMA_TDLR_OFFSET) // I2C_IC_DMA_TDLR 270 // DMA Transmit Data Level Register 271 // 0x0000000f [3:0] DMATDL (0x0) Transmit Data Level 272 io_rw_32 dma_tdlr; 273 274 _REG_(I2C_IC_DMA_RDLR_OFFSET) // I2C_IC_DMA_RDLR 275 // DMA Transmit Data Level Register 276 // 0x0000000f [3:0] DMARDL (0x0) Receive Data Level 277 io_rw_32 dma_rdlr; 278 279 _REG_(I2C_IC_SDA_SETUP_OFFSET) // I2C_IC_SDA_SETUP 280 // I2C SDA Setup Register 281 // 0x000000ff [7:0] SDA_SETUP (0x64) SDA Setup 282 io_rw_32 sda_setup; 283 284 _REG_(I2C_IC_ACK_GENERAL_CALL_OFFSET) // I2C_IC_ACK_GENERAL_CALL 285 // I2C ACK General Call Register 286 // 0x00000001 [0] ACK_GEN_CALL (1) ACK General Call 287 io_rw_32 ack_general_call; 288 289 _REG_(I2C_IC_ENABLE_STATUS_OFFSET) // I2C_IC_ENABLE_STATUS 290 // I2C Enable Status Register 291 // 0x00000004 [2] SLV_RX_DATA_LOST (0) Slave Received Data Lost 292 // 0x00000002 [1] SLV_DISABLED_WHILE_BUSY (0) Slave Disabled While Busy (Transmit, Receive) 293 // 0x00000001 [0] IC_EN (0) ic_en Status 294 io_ro_32 enable_status; 295 296 _REG_(I2C_IC_FS_SPKLEN_OFFSET) // I2C_IC_FS_SPKLEN 297 // I2C SS, FS or FM+ spike suppression limit 298 // 0x000000ff [7:0] IC_FS_SPKLEN (0x07) This register must be set before any I2C bus transaction... 299 io_rw_32 fs_spklen; 300 301 uint32_t _pad2; 302 303 _REG_(I2C_IC_CLR_RESTART_DET_OFFSET) // I2C_IC_CLR_RESTART_DET 304 // Clear RESTART_DET Interrupt Register 305 // 0x00000001 [0] CLR_RESTART_DET (0) Read this register to clear the RESTART_DET interrupt... 306 io_ro_32 clr_restart_det; 307 308 uint32_t _pad3[18]; 309 310 _REG_(I2C_IC_COMP_PARAM_1_OFFSET) // I2C_IC_COMP_PARAM_1 311 // Component Parameter Register 1 312 // 0x00ff0000 [23:16] TX_BUFFER_DEPTH (0x00) TX Buffer Depth = 16 313 // 0x0000ff00 [15:8] RX_BUFFER_DEPTH (0x00) RX Buffer Depth = 16 314 // 0x00000080 [7] ADD_ENCODED_PARAMS (0) Encoded parameters not visible 315 // 0x00000040 [6] HAS_DMA (0) DMA handshaking signals are enabled 316 // 0x00000020 [5] INTR_IO (0) COMBINED Interrupt outputs 317 // 0x00000010 [4] HC_COUNT_VALUES (0) Programmable count values for each mode 318 // 0x0000000c [3:2] MAX_SPEED_MODE (0x0) MAX SPEED MODE = FAST MODE 319 // 0x00000003 [1:0] APB_DATA_WIDTH (0x0) APB data bus width is 32 bits 320 io_ro_32 comp_param_1; 321 322 _REG_(I2C_IC_COMP_VERSION_OFFSET) // I2C_IC_COMP_VERSION 323 // I2C Component Version Register 324 // 0xffffffff [31:0] IC_COMP_VERSION (0x3230312a) 325 io_ro_32 comp_version; 326 327 _REG_(I2C_IC_COMP_TYPE_OFFSET) // I2C_IC_COMP_TYPE 328 // I2C Component Type Register 329 // 0xffffffff [31:0] IC_COMP_TYPE (0x44570140) Designware Component Type number = 0x44_57_01_40 330 io_ro_32 comp_type; 331 } i2c_hw_t; 332 333 #define i2c0_hw ((i2c_hw_t *)I2C0_BASE) 334 #define i2c1_hw ((i2c_hw_t *)I2C1_BASE) 335 static_assert(sizeof (i2c_hw_t) == 0x0100, ""); 336 337 #endif // _HARDWARE_STRUCTS_I2C_H 338 339