20 static uint16_t round_up_divide(uint32_t a, uint32_t b) {
21 const uint32_t result = ((a - 1) / b) + 1;
22 return (uint16_t)result;
25 static void spin_while_status_bit(
const dif_i2c_t *i2c, uint32_t bit,
29 reg = mmio_region_read32(i2c->
base_addr, I2C_STATUS_REG_OFFSET);
38 if (i2c == NULL ||
status == NULL) {
42 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
47 reg = mmio_region_read32(i2c->
base_addr, I2C_STATUS_REG_OFFSET);
66 if (i2c == NULL || events == NULL) {
70 mmio_region_read32(i2c->
base_addr, I2C_CONTROLLER_EVENTS_REG_OFFSET);
74 reg, I2C_CONTROLLER_EVENTS_UNHANDLED_NACK_TIMEOUT_BIT);
87 I2C_CONTROLLER_EVENTS_UNHANDLED_NACK_TIMEOUT_BIT,
89 mmio_region_write32(i2c->
base_addr, I2C_CONTROLLER_EVENTS_REG_OFFSET, reg);
100 uint32_t clock_period_nanos) {
107 .scl_time_high_cycles = round_up_divide(4000, clock_period_nanos),
108 .scl_time_low_cycles = round_up_divide(4700, clock_period_nanos),
109 .start_signal_setup_cycles =
110 round_up_divide(4700, clock_period_nanos),
111 .start_signal_hold_cycles = round_up_divide(4000, clock_period_nanos),
112 .data_signal_setup_cycles = round_up_divide(250, clock_period_nanos),
113 .data_signal_hold_cycles = 1,
114 .stop_signal_setup_cycles = round_up_divide(4000, clock_period_nanos),
115 .stop_signal_hold_cycles = round_up_divide(4700, clock_period_nanos),
119 .scl_time_high_cycles = round_up_divide(600, clock_period_nanos),
120 .scl_time_low_cycles = round_up_divide(1300, clock_period_nanos),
121 .start_signal_setup_cycles = round_up_divide(600, clock_period_nanos),
122 .start_signal_hold_cycles = round_up_divide(600, clock_period_nanos),
123 .data_signal_setup_cycles = round_up_divide(100, clock_period_nanos),
124 .data_signal_hold_cycles = 1,
125 .stop_signal_setup_cycles = round_up_divide(600, clock_period_nanos),
126 .stop_signal_hold_cycles = round_up_divide(1300, clock_period_nanos),
130 .scl_time_high_cycles = round_up_divide(260, clock_period_nanos),
131 .scl_time_low_cycles = round_up_divide(500, clock_period_nanos),
132 .start_signal_setup_cycles = round_up_divide(260, clock_period_nanos),
133 .start_signal_hold_cycles = round_up_divide(260, clock_period_nanos),
134 .data_signal_setup_cycles = round_up_divide(50, clock_period_nanos),
135 .data_signal_hold_cycles = 1,
136 .stop_signal_setup_cycles = round_up_divide(260, clock_period_nanos),
137 .stop_signal_hold_cycles = round_up_divide(500, clock_period_nanos),
144 static const uint32_t kNanosPerKBaud = 1000000;
148 if (config == NULL) {
151 uint32_t lowest_target_device_speed_khz;
154 lowest_target_device_speed_khz = 100;
157 lowest_target_device_speed_khz = 400;
160 lowest_target_device_speed_khz = 1000;
172 config->rise_cycles = round_up_divide(timing_config.
sda_rise_nanos,
174 config->fall_cycles = round_up_divide(timing_config.
sda_fall_nanos,
178 uint32_t slowest_scl_period_nanos =
179 kNanosPerKBaud / lowest_target_device_speed_khz;
180 if (scl_period_nanos < slowest_scl_period_nanos) {
181 scl_period_nanos = slowest_scl_period_nanos;
183 uint16_t scl_period_cycles =
187 int32_t lengthened_high_cycles = scl_period_cycles -
188 config->scl_time_low_cycles -
189 config->rise_cycles - config->fall_cycles;
190 if (lengthened_high_cycles > (int32_t)config->scl_time_high_cycles) {
191 if (lengthened_high_cycles < 0 || lengthened_high_cycles > UINT16_MAX) {
194 config->scl_time_high_cycles = (uint16_t)lengthened_high_cycles;
205 uint32_t timing0 = 0;
207 config.scl_time_high_cycles);
209 config.scl_time_low_cycles);
210 mmio_region_write32(i2c->
base_addr, I2C_TIMING0_REG_OFFSET, timing0);
212 uint32_t timing1 = 0;
217 mmio_region_write32(i2c->
base_addr, I2C_TIMING1_REG_OFFSET, timing1);
219 uint32_t timing2 = 0;
221 config.start_signal_setup_cycles);
223 config.start_signal_hold_cycles);
224 mmio_region_write32(i2c->
base_addr, I2C_TIMING2_REG_OFFSET, timing2);
226 uint32_t timing3 = 0;
228 config.data_signal_setup_cycles);
230 config.data_signal_hold_cycles);
231 mmio_region_write32(i2c->
base_addr, I2C_TIMING3_REG_OFFSET, timing3);
233 uint32_t timing4 = 0;
235 config.stop_signal_setup_cycles);
238 mmio_region_write32(i2c->
base_addr, I2C_TIMING4_REG_OFFSET, timing4);
248 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET);
250 mmio_region_write32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET, reg);
260 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET);
262 mmio_region_write32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET, reg);
272 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET);
274 mmio_region_write32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET, reg);
284 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET);
286 mmio_region_write32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET, reg);
297 if (i2c == NULL || rx_level > I2C_PARAM_FIFO_DEPTH ||
298 fmt_level >= I2C_PARAM_FIFO_DEPTH) {
302 uint32_t ctrl_value =
303 mmio_region_read32(i2c->
base_addr, I2C_HOST_FIFO_CONFIG_REG_OFFSET);
305 ctrl_value, I2C_HOST_FIFO_CONFIG_RX_THRESH_FIELD, rx_level);
307 ctrl_value, I2C_HOST_FIFO_CONFIG_FMT_THRESH_FIELD, fmt_level);
308 mmio_region_write32(i2c->
base_addr, I2C_HOST_FIFO_CONFIG_REG_OFFSET,
320 if (i2c == NULL || acq_level > I2C_PARAM_ACQ_FIFO_DEPTH ||
321 tx_level >= I2C_PARAM_FIFO_DEPTH) {
325 uint32_t ctrl_value =
326 mmio_region_read32(i2c->
base_addr, I2C_TARGET_FIFO_CONFIG_REG_OFFSET);
328 ctrl_value, I2C_TARGET_FIFO_CONFIG_TX_THRESH_FIELD, tx_level);
330 ctrl_value, I2C_TARGET_FIFO_CONFIG_ACQ_THRESH_FIELD, acq_level);
331 mmio_region_write32(i2c->
base_addr, I2C_TARGET_FIFO_CONFIG_REG_OFFSET,
348 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
350 mmio_region_write32(i2c->
base_addr, I2C_CTRL_REG_OFFSET, reg);
366 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
368 mmio_region_write32(i2c->
base_addr, I2C_CTRL_REG_OFFSET, reg);
384 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
386 mmio_region_write32(i2c->
base_addr, I2C_CTRL_REG_OFFSET, reg);
402 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
404 mmio_region_write32(i2c->
base_addr, I2C_CTRL_REG_OFFSET, reg);
420 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
422 mmio_region_write32(i2c->
base_addr, I2C_CTRL_REG_OFFSET, reg);
438 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_OVRD_REG_OFFSET);
440 mmio_region_write32(i2c->
base_addr, I2C_OVRD_REG_OFFSET, reg);
451 uint32_t override_val =
452 mmio_region_read32(i2c->
base_addr, I2C_OVRD_REG_OFFSET);
455 mmio_region_write32(i2c->
base_addr, I2C_OVRD_REG_OFFSET, override_val);
461 uint16_t *scl_samples,
462 uint16_t *sda_samples) {
467 uint32_t samples = mmio_region_read32(i2c->
base_addr, I2C_VAL_REG_OFFSET);
468 if (scl_samples != NULL) {
473 if (sda_samples != NULL) {
492 mmio_region_read32(i2c->
base_addr, I2C_HOST_FIFO_STATUS_REG_OFFSET);
493 if (fmt_fifo_level != NULL) {
495 values, I2C_HOST_FIFO_STATUS_FMTLVL_FIELD);
497 if (rx_fifo_level != NULL) {
499 values, I2C_HOST_FIFO_STATUS_RXLVL_FIELD);
504 mmio_region_read32(i2c->
base_addr, I2C_TARGET_FIFO_STATUS_REG_OFFSET);
505 if (tx_fifo_level != NULL) {
507 values, I2C_TARGET_FIFO_STATUS_TXLVL_FIELD);
509 if (acq_fifo_level != NULL) {
511 values, I2C_TARGET_FIFO_STATUS_ACQLVL_FIELD);
518 if (i2c == NULL || count == NULL) {
523 mmio_region_read32(i2c->
base_addr, I2C_TARGET_ACK_CTRL_REG_OFFSET);
534 if (count > I2C_TARGET_ACK_CTRL_NBYTES_MASK) {
540 mmio_region_write32(i2c->
base_addr, I2C_TARGET_ACK_CTRL_REG_OFFSET, reg);
551 mmio_region_write32(i2c->
base_addr, I2C_TARGET_ACK_CTRL_REG_OFFSET, reg);
557 if (i2c == NULL || data == NULL) {
562 mmio_region_read32(i2c->
base_addr, I2C_ACQ_FIFO_NEXT_DATA_REG_OFFSET);
572 uint32_t values = mmio_region_read32(i2c->
base_addr, I2C_RDATA_REG_OFFSET);
582 if (i2c == NULL || buffer == NULL) {
587 spin_while_status_bit(i2c, I2C_STATUS_RXEMPTY_BIT,
true);
588 uint32_t values = mmio_region_read32(i2c->
base_addr, I2C_RDATA_REG_OFFSET);
596 uint32_t *fmt_byte) {
601 if (has_write_flags && has_read_flags) {
620 const uint8_t *bytes,
622 if (i2c == NULL || bytes == NULL || size == 0) {
625 uint32_t fmt_byte = 0;
628 for (
size_t i = 0; i < size; ++i) {
631 mmio_region_write32(i2c->
base_addr, I2C_FDATA_REG_OFFSET, reg);
632 spin_while_status_bit(i2c, I2C_STATUS_FMTFULL_BIT,
true);
644 uint32_t fmt_byte = 0;
647 mmio_region_write32(i2c->
base_addr, I2C_FDATA_REG_OFFSET, fmt_byte);
659 if (suppress_nak_irq) {
704 uint32_t tx_byte = 0;
706 mmio_region_write32(i2c->
base_addr, I2C_TXDATA_REG_OFFSET, tx_byte);
718 mmio_region_read32(i2c->
base_addr, I2C_ACQDATA_REG_OFFSET);
722 if (signal != NULL) {
743 mmio_region_write32(i2c->
base_addr, I2C_TIMEOUT_CTRL_REG_OFFSET, config);
775 mmio_region_write32(i2c->
base_addr, I2C_TARGET_ID_REG_OFFSET, config);
784 mmio_region_write32(i2c->
base_addr, I2C_HOST_TIMEOUT_CTRL_REG_OFFSET, cycles);