20static 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;
25static 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);
30 }
while (bitfield_bit32_read(reg, bit) == set);
38 if (i2c == NULL ||
status == NULL) {
42 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
43 status->enable_host = bitfield_bit32_read(reg, I2C_CTRL_ENABLEHOST_BIT);
44 status->enable_target = bitfield_bit32_read(reg, I2C_CTRL_ENABLETARGET_BIT);
45 status->line_loopback = bitfield_bit32_read(reg, I2C_CTRL_LLPBK_BIT);
46 status->ack_control_en = bitfield_bit32_read(reg, I2C_CTRL_ACK_CTRL_EN_BIT);
47 reg = mmio_region_read32(i2c->
base_addr, I2C_STATUS_REG_OFFSET);
48 status->fmt_fifo_full = bitfield_bit32_read(reg, I2C_STATUS_FMTFULL_BIT);
49 status->rx_fifo_full = bitfield_bit32_read(reg, I2C_STATUS_RXFULL_BIT);
50 status->fmt_fifo_empty = bitfield_bit32_read(reg, I2C_STATUS_FMTEMPTY_BIT);
51 status->rx_fifo_empty = bitfield_bit32_read(reg, I2C_STATUS_RXEMPTY_BIT);
52 status->host_idle = bitfield_bit32_read(reg, I2C_STATUS_HOSTIDLE_BIT);
53 status->target_idle = bitfield_bit32_read(reg, I2C_STATUS_TARGETIDLE_BIT);
54 status->tx_fifo_full = bitfield_bit32_read(reg, I2C_STATUS_TXFULL_BIT);
55 status->acq_fifo_full = bitfield_bit32_read(reg, I2C_STATUS_ACQFULL_BIT);
56 status->tx_fifo_empty = bitfield_bit32_read(reg, I2C_STATUS_TXEMPTY_BIT);
57 status->acq_fifo_empty = bitfield_bit32_read(reg, I2C_STATUS_ACQEMPTY_BIT);
59 bitfield_bit32_read(reg, I2C_STATUS_ACK_CTRL_STRETCH_BIT);
65 const dif_i2c_t *i2c, dif_i2c_controller_halt_events_t *events) {
66 if (i2c == NULL || events == NULL) {
70 mmio_region_read32(i2c->
base_addr, I2C_CONTROLLER_EVENTS_REG_OFFSET);
72 bitfield_bit32_read(reg, I2C_CONTROLLER_EVENTS_NACK_BIT);
74 reg, I2C_CONTROLLER_EVENTS_UNHANDLED_NACK_TIMEOUT_BIT);
76 bitfield_bit32_read(reg, I2C_CONTROLLER_EVENTS_BUS_TIMEOUT_BIT);
78 bitfield_bit32_read(reg, I2C_CONTROLLER_EVENTS_ARBITRATION_LOST_BIT);
83 const dif_i2c_t *i2c, dif_i2c_controller_halt_events_t events) {
88 reg = bitfield_bit32_write(reg, I2C_CONTROLLER_EVENTS_NACK_BIT,
90 reg = bitfield_bit32_write(reg,
91 I2C_CONTROLLER_EVENTS_UNHANDLED_NACK_TIMEOUT_BIT,
93 reg = bitfield_bit32_write(reg, I2C_CONTROLLER_EVENTS_BUS_TIMEOUT_BIT,
95 reg = bitfield_bit32_write(reg, I2C_CONTROLLER_EVENTS_ARBITRATION_LOST_BIT,
97 mmio_region_write32(i2c->
base_addr, I2C_CONTROLLER_EVENTS_REG_OFFSET, reg);
102 const dif_i2c_t *i2c, dif_i2c_target_tx_halt_events_t *events) {
103 if (i2c == NULL || events == NULL) {
107 mmio_region_read32(i2c->
base_addr, I2C_TARGET_EVENTS_REG_OFFSET);
109 bitfield_bit32_read(reg, I2C_TARGET_EVENTS_TX_PENDING_BIT);
111 bitfield_bit32_read(reg, I2C_TARGET_EVENTS_BUS_TIMEOUT_BIT);
113 bitfield_bit32_read(reg, I2C_TARGET_EVENTS_ARBITRATION_LOST_BIT);
118 const dif_i2c_t *i2c, dif_i2c_target_tx_halt_events_t events) {
123 reg = bitfield_bit32_write(reg, I2C_TARGET_EVENTS_TX_PENDING_BIT,
125 reg = bitfield_bit32_write(reg, I2C_TARGET_EVENTS_BUS_TIMEOUT_BIT,
127 reg = bitfield_bit32_write(reg, I2C_TARGET_EVENTS_ARBITRATION_LOST_BIT,
129 mmio_region_write32(i2c->
base_addr, I2C_TARGET_EVENTS_REG_OFFSET, reg);
140 uint32_t clock_period_nanos) {
147 .scl_time_high_cycles = round_up_divide(4000, clock_period_nanos),
148 .scl_time_low_cycles = round_up_divide(4700, clock_period_nanos),
149 .start_signal_setup_cycles =
150 round_up_divide(4700, clock_period_nanos),
151 .start_signal_hold_cycles = round_up_divide(4000, clock_period_nanos),
152 .data_signal_setup_cycles = round_up_divide(250, clock_period_nanos),
153 .data_signal_hold_cycles = 1,
154 .stop_signal_setup_cycles = round_up_divide(4000, clock_period_nanos),
155 .stop_signal_hold_cycles = round_up_divide(4700, clock_period_nanos),
159 .scl_time_high_cycles = round_up_divide(600, clock_period_nanos),
160 .scl_time_low_cycles = round_up_divide(1300, clock_period_nanos),
161 .start_signal_setup_cycles = round_up_divide(600, clock_period_nanos),
162 .start_signal_hold_cycles = round_up_divide(600, clock_period_nanos),
163 .data_signal_setup_cycles = round_up_divide(100, clock_period_nanos),
164 .data_signal_hold_cycles = 1,
165 .stop_signal_setup_cycles = round_up_divide(600, clock_period_nanos),
166 .stop_signal_hold_cycles = round_up_divide(1300, clock_period_nanos),
170 .scl_time_high_cycles = round_up_divide(260, clock_period_nanos),
171 .scl_time_low_cycles = round_up_divide(500, clock_period_nanos),
172 .start_signal_setup_cycles = round_up_divide(260, clock_period_nanos),
173 .start_signal_hold_cycles = round_up_divide(260, clock_period_nanos),
174 .data_signal_setup_cycles = round_up_divide(50, clock_period_nanos),
175 .data_signal_hold_cycles = 1,
176 .stop_signal_setup_cycles = round_up_divide(260, clock_period_nanos),
177 .stop_signal_hold_cycles = round_up_divide(500, clock_period_nanos),
184static const uint32_t kNanosPerKBaud = 1000000;
188 if (config == NULL) {
191 uint32_t lowest_target_device_speed_khz;
194 lowest_target_device_speed_khz = 100;
197 lowest_target_device_speed_khz = 400;
200 lowest_target_device_speed_khz = 1000;
212 config->rise_cycles = round_up_divide(timing_config.
sda_rise_nanos,
214 config->fall_cycles = round_up_divide(timing_config.
sda_fall_nanos,
218 uint32_t slowest_scl_period_nanos =
219 kNanosPerKBaud / lowest_target_device_speed_khz;
220 if (scl_period_nanos < slowest_scl_period_nanos) {
221 scl_period_nanos = slowest_scl_period_nanos;
223 uint16_t scl_period_cycles =
227 int32_t lengthened_high_cycles = scl_period_cycles -
228 config->scl_time_low_cycles -
229 config->rise_cycles - config->fall_cycles;
230 if (lengthened_high_cycles > (int32_t)config->scl_time_high_cycles) {
231 if (lengthened_high_cycles < 0 || lengthened_high_cycles > UINT16_MAX) {
234 config->scl_time_high_cycles = (uint16_t)lengthened_high_cycles;
254 uint32_t timing0 = 0;
255 timing0 = bitfield_field32_write(timing0, I2C_TIMING0_THIGH_FIELD,
256 config.scl_time_high_cycles);
257 timing0 = bitfield_field32_write(timing0, I2C_TIMING0_TLOW_FIELD,
258 config.scl_time_low_cycles);
259 mmio_region_write32(i2c->
base_addr, I2C_TIMING0_REG_OFFSET, timing0);
261 uint32_t timing1 = 0;
262 timing1 = bitfield_field32_write(timing1, I2C_TIMING1_T_R_FIELD,
264 timing1 = bitfield_field32_write(timing1, I2C_TIMING1_T_F_FIELD,
266 mmio_region_write32(i2c->
base_addr, I2C_TIMING1_REG_OFFSET, timing1);
268 uint32_t timing2 = 0;
269 timing2 = bitfield_field32_write(timing2, I2C_TIMING2_TSU_STA_FIELD,
270 config.start_signal_setup_cycles);
271 timing2 = bitfield_field32_write(timing2, I2C_TIMING2_THD_STA_FIELD,
272 config.start_signal_hold_cycles);
273 mmio_region_write32(i2c->
base_addr, I2C_TIMING2_REG_OFFSET, timing2);
275 uint32_t timing3 = 0;
276 timing3 = bitfield_field32_write(timing3, I2C_TIMING3_TSU_DAT_FIELD,
277 config.data_signal_setup_cycles);
278 timing3 = bitfield_field32_write(timing3, I2C_TIMING3_THD_DAT_FIELD,
279 config.data_signal_hold_cycles);
280 mmio_region_write32(i2c->
base_addr, I2C_TIMING3_REG_OFFSET, timing3);
282 uint32_t timing4 = 0;
283 timing4 = bitfield_field32_write(timing4, I2C_TIMING4_TSU_STO_FIELD,
284 config.stop_signal_setup_cycles);
285 timing4 = bitfield_field32_write(timing4, I2C_TIMING4_T_BUF_FIELD,
287 mmio_region_write32(i2c->
base_addr, I2C_TIMING4_REG_OFFSET, timing4);
297 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET);
298 reg = bitfield_bit32_write(reg, I2C_FIFO_CTRL_RXRST_BIT,
true);
299 mmio_region_write32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET, reg);
309 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET);
310 reg = bitfield_bit32_write(reg, I2C_FIFO_CTRL_FMTRST_BIT,
true);
311 mmio_region_write32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET, reg);
321 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET);
322 reg = bitfield_bit32_write(reg, I2C_FIFO_CTRL_TXRST_BIT,
true);
323 mmio_region_write32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET, reg);
333 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET);
334 reg = bitfield_bit32_write(reg, I2C_FIFO_CTRL_ACQRST_BIT,
true);
335 mmio_region_write32(i2c->
base_addr, I2C_FIFO_CTRL_REG_OFFSET, reg);
346 if (i2c == NULL || rx_level > I2C_PARAM_FIFO_DEPTH ||
347 fmt_level >= I2C_PARAM_FIFO_DEPTH) {
351 uint32_t ctrl_value =
352 mmio_region_read32(i2c->
base_addr, I2C_HOST_FIFO_CONFIG_REG_OFFSET);
353 ctrl_value = bitfield_field32_write(
354 ctrl_value, I2C_HOST_FIFO_CONFIG_RX_THRESH_FIELD, rx_level);
355 ctrl_value = bitfield_field32_write(
356 ctrl_value, I2C_HOST_FIFO_CONFIG_FMT_THRESH_FIELD, fmt_level);
357 mmio_region_write32(i2c->
base_addr, I2C_HOST_FIFO_CONFIG_REG_OFFSET,
369 if (i2c == NULL || acq_level > I2C_PARAM_ACQ_FIFO_DEPTH ||
370 tx_level >= I2C_PARAM_FIFO_DEPTH) {
374 uint32_t ctrl_value =
375 mmio_region_read32(i2c->
base_addr, I2C_TARGET_FIFO_CONFIG_REG_OFFSET);
376 ctrl_value = bitfield_field32_write(
377 ctrl_value, I2C_TARGET_FIFO_CONFIG_TX_THRESH_FIELD, tx_level);
378 ctrl_value = bitfield_field32_write(
379 ctrl_value, I2C_TARGET_FIFO_CONFIG_ACQ_THRESH_FIELD, acq_level);
380 mmio_region_write32(i2c->
base_addr, I2C_TARGET_FIFO_CONFIG_REG_OFFSET,
392 if (!dif_is_valid_toggle(state)) {
395 bool flag = dif_toggle_to_bool(state);
397 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
398 reg = bitfield_bit32_write(reg, I2C_CTRL_ENABLEHOST_BIT, flag);
399 mmio_region_write32(i2c->
base_addr, I2C_CTRL_REG_OFFSET, reg);
410 if (!dif_is_valid_toggle(state)) {
413 bool flag = dif_toggle_to_bool(state);
415 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
416 reg = bitfield_bit32_write(reg, I2C_CTRL_ENABLETARGET_BIT, flag);
417 mmio_region_write32(i2c->
base_addr, I2C_CTRL_REG_OFFSET, reg);
428 if (!dif_is_valid_toggle(state)) {
431 bool flag = dif_toggle_to_bool(state);
433 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
434 reg = bitfield_bit32_write(reg, I2C_CTRL_LLPBK_BIT, flag);
435 mmio_region_write32(i2c->
base_addr, I2C_CTRL_REG_OFFSET, reg);
446 if (!dif_is_valid_toggle(state)) {
449 bool flag = dif_toggle_to_bool(state);
451 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
452 reg = bitfield_bit32_write(reg, I2C_CTRL_NACK_ADDR_AFTER_TIMEOUT_BIT, flag);
453 mmio_region_write32(i2c->
base_addr, I2C_CTRL_REG_OFFSET, reg);
464 if (!dif_is_valid_toggle(state)) {
467 bool flag = dif_toggle_to_bool(state);
469 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
470 reg = bitfield_bit32_write(reg, I2C_CTRL_ACK_CTRL_EN_BIT, flag);
471 mmio_region_write32(i2c->
base_addr, I2C_CTRL_REG_OFFSET, reg);
482 if (!dif_is_valid_toggle(state)) {
485 bool flag = dif_toggle_to_bool(state);
487 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
489 bitfield_bit32_write(reg, I2C_CTRL_MULTI_CONTROLLER_MONITOR_EN_BIT, flag);
490 mmio_region_write32(i2c->
base_addr, I2C_CTRL_REG_OFFSET, reg);
501 if (!dif_is_valid_toggle(state)) {
504 bool flag = dif_toggle_to_bool(state);
506 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_CTRL_REG_OFFSET);
507 reg = bitfield_bit32_write(reg, I2C_CTRL_TX_STRETCH_CTRL_EN_BIT, flag);
508 mmio_region_write32(i2c->
base_addr, I2C_CTRL_REG_OFFSET, reg);
519 if (!dif_is_valid_toggle(state)) {
522 bool flag = dif_toggle_to_bool(state);
524 uint32_t reg = mmio_region_read32(i2c->
base_addr, I2C_OVRD_REG_OFFSET);
525 reg = bitfield_bit32_write(reg, I2C_OVRD_TXOVRDEN_BIT, flag);
526 mmio_region_write32(i2c->
base_addr, I2C_OVRD_REG_OFFSET, reg);
537 uint32_t override_val =
538 mmio_region_read32(i2c->
base_addr, I2C_OVRD_REG_OFFSET);
539 override_val = bitfield_bit32_write(override_val, I2C_OVRD_SCLVAL_BIT, scl);
540 override_val = bitfield_bit32_write(override_val, I2C_OVRD_SDAVAL_BIT, sda);
541 mmio_region_write32(i2c->
base_addr, I2C_OVRD_REG_OFFSET, override_val);
547 uint16_t *scl_samples,
548 uint16_t *sda_samples) {
553 uint32_t samples = mmio_region_read32(i2c->
base_addr, I2C_VAL_REG_OFFSET);
554 if (scl_samples != NULL) {
556 (uint16_t)bitfield_field32_read(samples, I2C_VAL_SCL_RX_FIELD);
559 if (sda_samples != NULL) {
561 (uint16_t)bitfield_field32_read(samples, I2C_VAL_SDA_RX_FIELD);
578 mmio_region_read32(i2c->
base_addr, I2C_HOST_FIFO_STATUS_REG_OFFSET);
579 if (fmt_fifo_level != NULL) {
581 values, I2C_HOST_FIFO_STATUS_FMTLVL_FIELD);
583 if (rx_fifo_level != NULL) {
585 values, I2C_HOST_FIFO_STATUS_RXLVL_FIELD);
590 mmio_region_read32(i2c->
base_addr, I2C_TARGET_FIFO_STATUS_REG_OFFSET);
591 if (tx_fifo_level != NULL) {
593 values, I2C_TARGET_FIFO_STATUS_TXLVL_FIELD);
595 if (acq_fifo_level != NULL) {
597 values, I2C_TARGET_FIFO_STATUS_ACQLVL_FIELD);
604 if (i2c == NULL || count == NULL) {
609 mmio_region_read32(i2c->
base_addr, I2C_TARGET_ACK_CTRL_REG_OFFSET);
611 (uint16_t)bitfield_field32_read(reg, I2C_TARGET_ACK_CTRL_NBYTES_FIELD);
620 if (count > I2C_TARGET_ACK_CTRL_NBYTES_MASK) {
625 bitfield_field32_write(0, I2C_TARGET_ACK_CTRL_NBYTES_FIELD, count);
626 mmio_region_write32(i2c->
base_addr, I2C_TARGET_ACK_CTRL_REG_OFFSET, reg);
636 uint32_t reg = bitfield_bit32_write(0, I2C_TARGET_ACK_CTRL_NACK_BIT,
true);
637 mmio_region_write32(i2c->
base_addr, I2C_TARGET_ACK_CTRL_REG_OFFSET, reg);
643 if (i2c == NULL || data == NULL) {
648 mmio_region_read32(i2c->
base_addr, I2C_ACQ_FIFO_NEXT_DATA_REG_OFFSET);
658 uint32_t values = mmio_region_read32(i2c->
base_addr, I2C_RDATA_REG_OFFSET);
660 *
byte = (uint8_t)bitfield_field32_read(values, I2C_RDATA_RDATA_FIELD);
668 if (i2c == NULL || buffer == NULL) {
673 spin_while_status_bit(i2c, I2C_STATUS_RXEMPTY_BIT,
true);
674 uint32_t values = mmio_region_read32(i2c->
base_addr, I2C_RDATA_REG_OFFSET);
675 *(buffer++) = (uint8_t)bitfield_field32_read(values, I2C_RDATA_RDATA_FIELD);
682 uint32_t *fmt_byte) {
687 if (has_write_flags && has_read_flags) {
695 *fmt_byte = bitfield_bit32_write(*fmt_byte, 8, flags.
start);
696 *fmt_byte = bitfield_bit32_write(*fmt_byte, I2C_FDATA_STOP_BIT, flags.
stop);
697 *fmt_byte = bitfield_bit32_write(*fmt_byte, I2C_FDATA_READB_BIT, flags.
read);
699 bitfield_bit32_write(*fmt_byte, I2C_FDATA_RCONT_BIT, flags.
read_cont);
700 *fmt_byte = bitfield_bit32_write(*fmt_byte, I2C_FDATA_NAKOK_BIT,
706 const uint8_t *bytes,
708 if (i2c == NULL || bytes == NULL || size == 0) {
711 uint32_t fmt_byte = 0;
714 for (
size_t i = 0; i < size; ++i) {
716 bitfield_field32_write(fmt_byte, I2C_FDATA_FBYTE_FIELD, bytes[i]);
717 mmio_region_write32(i2c->
base_addr, I2C_FDATA_REG_OFFSET, reg);
718 spin_while_status_bit(i2c, I2C_STATUS_FMTFULL_BIT,
true);
730 uint32_t fmt_byte = 0;
732 fmt_byte = bitfield_field32_write(fmt_byte, I2C_FDATA_FBYTE_FIELD,
byte);
733 mmio_region_write32(i2c->
base_addr, I2C_FDATA_REG_OFFSET, fmt_byte);
745 if (suppress_nak_irq) {
782 return dif_i2c_write_byte_raw(i2c,
byte, flags);
790 uint32_t tx_byte = 0;
791 tx_byte = bitfield_field32_write(tx_byte, I2C_TXDATA_TXDATA_FIELD,
byte);
792 mmio_region_write32(i2c->
base_addr, I2C_TXDATA_REG_OFFSET, tx_byte);
804 mmio_region_read32(i2c->
base_addr, I2C_ACQDATA_REG_OFFSET);
806 *
byte = (uint8_t)bitfield_field32_read(acq_byte, I2C_ACQDATA_ABYTE_FIELD);
808 if (signal != NULL) {
809 *signal = bitfield_field32_read(acq_byte, I2C_ACQDATA_SIGNAL_FIELD);
815 dif_i2c_scl_timeout_t timeout_type,
821 bool timeout_en =
false;
822 uint8_t timeout_mode = 0;
823 switch (timeout_type) {
829 timeout_mode = I2C_TIMEOUT_CTRL_MODE_VALUE_STRETCH_TIMEOUT;
833 timeout_mode = I2C_TIMEOUT_CTRL_MODE_VALUE_BUS_TIMEOUT;
840 config = bitfield_bit32_write(config, I2C_TIMEOUT_CTRL_EN_BIT, timeout_en);
842 bitfield_bit32_write(config, I2C_TIMEOUT_CTRL_MODE_BIT, timeout_mode);
843 config = bitfield_field32_write(config, I2C_TIMEOUT_CTRL_VAL_FIELD, cycles);
844 mmio_region_write32(i2c->
base_addr, I2C_TIMEOUT_CTRL_REG_OFFSET, config);
857 config = bitfield_field32_write(config, I2C_TARGET_ID_ADDRESS0_FIELD,
860 bitfield_field32_write(config, I2C_TARGET_ID_MASK0_FIELD, id0->
mask);
863 config = bitfield_field32_write(config, I2C_TARGET_ID_ADDRESS0_FIELD, 0x7f);
867 config = bitfield_field32_write(config, I2C_TARGET_ID_ADDRESS1_FIELD,
870 bitfield_field32_write(config, I2C_TARGET_ID_MASK1_FIELD, id1->
mask);
873 config = bitfield_field32_write(config, I2C_TARGET_ID_ADDRESS1_FIELD, 0x7f);
876 mmio_region_write32(i2c->
base_addr, I2C_TARGET_ID_REG_OFFSET, config);
885 mmio_region_write32(i2c->
base_addr, I2C_HOST_TIMEOUT_CTRL_REG_OFFSET, cycles);