|
39 | 39 |
|
40 | 40 | #if MICROPY_PY_MACHINE_I2C || MICROPY_PY_MACHINE_SOFTI2C
|
41 | 41 | #include "../../../../micropy_updates/common/mp_i2c_common.h"
|
| 42 | + #include "sdkconfig.h" |
| 43 | + |
| 44 | + #define MP_MACHINE_I2C_FLAG_WRITE2 (0x08) |
42 | 45 |
|
43 | 46 | #if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32S3
|
44 | 47 | #define SCLK_I2C_FREQ XTAL_CLK_FREQ
|
|
65 | 68 | xSemaphoreGive(self->lock.handle); \
|
66 | 69 | }
|
67 | 70 |
|
| 71 | + #if CONFIG_LCD_ENABLE_DEBUG_LOG |
| 72 | + #define I2C_DEBUG_PRINT(...) mp_printf(&mp_plat_print, __VA_ARGS__); |
| 73 | + #else |
| 74 | + #define I2C_DEBUG_PRINT(...) |
| 75 | + #endif |
68 | 76 |
|
69 | 77 | // ********************** machine.I2C.Bus ************************
|
70 | 78 |
|
|
150 | 158 | ++bufs;
|
151 | 159 | }
|
152 | 160 |
|
| 161 | + if (flags & MP_MACHINE_I2C_FLAG_WRITE2) { |
| 162 | + i2c_master_start(cmd); |
| 163 | + i2c_master_write_byte(cmd, addr << 1, true); |
| 164 | + i2c_master_write(cmd, bufs->buf, bufs->len, true); |
| 165 | + data_len += bufs->len; |
| 166 | + --n; |
| 167 | + ++bufs; |
| 168 | + } |
| 169 | + |
153 | 170 | i2c_master_start(cmd);
|
154 | 171 | i2c_master_write_byte(cmd, addr << 1 | (flags & MP_MACHINE_I2C_FLAG_READ), true);
|
155 | 172 |
|
|
168 | 185 | i2c_master_stop(cmd);
|
169 | 186 | }
|
170 | 187 |
|
171 |
| - // TODO proper timeout |
172 | 188 | esp_err_t err = i2c_master_cmd_begin(self->port, cmd, 100 * (1 + data_len) / portTICK_PERIOD_MS);
|
173 | 189 | i2c_cmd_link_delete(cmd);
|
174 | 190 |
|
|
408 | 424 | mp_buffer_info_t read_bufinfo;
|
409 | 425 | mp_get_buffer_raise(args[ARG_write_buf].u_obj, &read_bufinfo, MP_BUFFER_WRITE);
|
410 | 426 |
|
411 |
| - int ret = device_writeto(self, self->device_id, (uint8_t *)write_bufinfo.buf, write_bufinfo.len, false); |
412 |
| - if (ret < 0) { |
413 |
| - mp_raise_OSError(-ret); |
| 427 | + uint8_t * write_buf = (uint8_t *)write_bufinfo.buf; |
| 428 | + uint32_t memaddr = 0; |
| 429 | + |
| 430 | + if ((self->reg_bits & 7) != 0 || self->reg_bits > 32) { |
| 431 | + mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid mem address size (%u)"), self->reg_bits); |
414 | 432 | }
|
415 | 433 |
|
416 |
| - ret = device_readfrom(self, self->device_id, (uint8_t *)read_bufinfo.buf, read_bufinfo.len, true); |
| 434 | + for (int i=(int)(self->reg_bits / 8);i>-1;i--) { |
| 435 | + memaddr |= (uint32_t)(write_buf[i] << ((~i + (int)(self->reg_bits / 8)) * 8)); |
| 436 | + } |
| 437 | + |
| 438 | + uint8_t memaddr_buf[4]; |
| 439 | + size_t memaddr_len = get_memaddr_buf(&memaddr_buf[0], memaddr, self->reg_bits); |
| 440 | + |
| 441 | + size_t num_bufs = 2; |
| 442 | + |
| 443 | + unsigned int flags = MP_MACHINE_I2C_FLAG_WRITE1 | MP_MACHINE_I2C_FLAG_READ | MP_MACHINE_I2C_FLAG_STOP; |
| 444 | + |
| 445 | + mp_machine_i2c_buf_t bufs[3] = { |
| 446 | + {.len = memaddr_len, .buf = memaddr_buf}, |
| 447 | + {.len = 0, .buf = NULL}, |
| 448 | + {.len = 0, .buf = NULL} |
| 449 | + }; |
| 450 | + |
| 451 | + if ((size_t)(self->reg_bits / 8) < write_bufinfo.len) { |
| 452 | + bufs[1].buf = write_buf + (self->reg_bits / 8); |
| 453 | + bufs[1].len = write_bufinfo.len - (size_t)(self->reg_bits / 8); |
| 454 | + num_bufs += 1; |
| 455 | + flags |= MP_MACHINE_I2C_FLAG_WRITE2; |
| 456 | + } |
| 457 | + |
| 458 | + bufs[num_bufs - 1].buf = read_bufinfo.buf; |
| 459 | + bufs[num_bufs - 1].len = read_bufinfo.len; |
| 460 | + |
| 461 | + if (self->bus == NULL) mp_raise_OSError(1); |
| 462 | + |
| 463 | + int ret = i2c_bus_transfer((mp_obj_base_t *)self->bus, self->device_id, num_bufs, bufs, flags); |
417 | 464 | if (ret < 0) {
|
418 | 465 | mp_raise_OSError(-ret);
|
419 | 466 | }
|
|
0 commit comments