Skip to content

Commit cc410ad

Browse files
committed
common-hal I2C combined write_read
1 parent d5740c8 commit cc410ad

File tree

12 files changed

+134
-30
lines changed

12 files changed

+134
-30
lines changed

locale/circuitpython.pot

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1616,7 +1616,7 @@ msgstr ""
16161616

16171617
#: shared-module/adafruit_bus_device/i2c_device/I2CDevice.c
16181618
#, c-format
1619-
msgid "No I2C device at address: %x"
1619+
msgid "No I2C device at address: 0x%x"
16201620
msgstr ""
16211621

16221622
#: ports/espressif/common-hal/busio/SPI.c
@@ -4069,7 +4069,10 @@ msgstr ""
40694069
#: ports/espressif/boards/unexpectedmaker_feathers2/mpconfigboard.h
40704070
#: ports/espressif/boards/unexpectedmaker_feathers2_neo/mpconfigboard.h
40714071
#: ports/espressif/boards/unexpectedmaker_feathers2_prerelease/mpconfigboard.h
4072+
#: ports/espressif/boards/unexpectedmaker_feathers3/mpconfigboard.h
4073+
#: ports/espressif/boards/unexpectedmaker_pros3/mpconfigboard.h
40724074
#: ports/espressif/boards/unexpectedmaker_tinys2/mpconfigboard.h
4075+
#: ports/espressif/boards/unexpectedmaker_tinys3/mpconfigboard.h
40734076
msgid "pressing boot button at start up.\n"
40744077
msgstr ""
40754078

ports/atmel-samd/common-hal/busio/I2C.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) {
190190
self->has_lock = false;
191191
}
192192

193-
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
193+
STATIC uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
194194
const uint8_t *data, size_t len, bool transmit_stop_bit) {
195195

196196
uint16_t attempts = ATTEMPTS;
@@ -216,6 +216,11 @@ uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
216216
return MP_EIO;
217217
}
218218

219+
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
220+
const uint8_t *data, size_t len) {
221+
return _common_hal_busio_i2c_write(self, addr, data, len, true);
222+
}
223+
219224
uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr,
220225
uint8_t *data, size_t len) {
221226

@@ -242,6 +247,16 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr,
242247
return MP_EIO;
243248
}
244249

250+
uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr,
251+
uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) {
252+
uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false);
253+
if (result != 0) {
254+
return result;
255+
}
256+
257+
return common_hal_busio_i2c_read(self, addr, in_data, in_len);
258+
}
259+
245260
void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) {
246261
never_reset_sercom(self->i2c_desc.device.hw);
247262

ports/broadcom/common-hal/busio/I2C.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) {
124124
}
125125

126126
bool common_hal_busio_i2c_probe(busio_i2c_obj_t *self, uint8_t addr) {
127-
uint8_t result = common_hal_busio_i2c_write(self, addr, NULL, 0, true);
127+
uint8_t result = common_hal_busio_i2c_write(self, addr, NULL, 0);
128128
return result == 0;
129129
}
130130

@@ -147,7 +147,7 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) {
147147

148148
// Discussion of I2C implementation is here: https://github.com/raspberrypi/linux/issues/254
149149

150-
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
150+
STATIC uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
151151
const uint8_t *data, size_t len, bool transmit_stop_bit) {
152152
COMPLETE_MEMORY_READS;
153153
self->peripheral->S_b.DONE = true;
@@ -202,6 +202,11 @@ uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
202202
return 0;
203203
}
204204

205+
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
206+
const uint8_t *data, size_t len) {
207+
return _common_hal_busio_i2c_write(self, addr, data, len, true);
208+
}
209+
205210
uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr,
206211
uint8_t *data, size_t len) {
207212
COMPLETE_MEMORY_READS;
@@ -247,6 +252,16 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr,
247252
return 0;
248253
}
249254

255+
uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr,
256+
uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) {
257+
uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false);
258+
if (result != 0) {
259+
return result;
260+
}
261+
262+
return common_hal_busio_i2c_read(self, addr, in_data, in_len);
263+
}
264+
250265
void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) {
251266
never_reset_i2c[self->index] = true;
252267

ports/cxd56/common-hal/busio/I2C.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ bool common_hal_busio_i2c_probe(busio_i2c_obj_t *self, uint8_t addr) {
9797
return I2C_TRANSFER(self->i2c_dev, &msg, 1) < 0 ? false : true;
9898
}
9999

100-
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t address, const uint8_t *data, size_t len, bool stop) {
100+
STATIC uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t address, const uint8_t *data, size_t len, bool stop) {
101101
struct i2c_msg_s msg;
102102

103103
msg.frequency = self->frequency;
@@ -108,6 +108,11 @@ uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t address, cons
108108
return -I2C_TRANSFER(self->i2c_dev, &msg, 1);
109109
}
110110

111+
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
112+
const uint8_t *data, size_t len) {
113+
return _common_hal_busio_i2c_write(self, addr, data, len, true);
114+
}
115+
111116
uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t address, uint8_t *data, size_t len) {
112117
struct i2c_msg_s msg;
113118

@@ -119,6 +124,16 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t address, uint8
119124
return -I2C_TRANSFER(self->i2c_dev, &msg, 1);
120125
}
121126

127+
uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr,
128+
uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) {
129+
uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false);
130+
if (result != 0) {
131+
return result;
132+
}
133+
134+
return common_hal_busio_i2c_read(self, addr, in_data, in_len);
135+
}
136+
122137
void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) {
123138
never_reset_pin_number(self->scl_pin->number);
124139
never_reset_pin_number(self->sda_pin->number);

ports/espressif/common-hal/busio/I2C.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,19 +182,19 @@ static uint8_t convert_esp_err(esp_err_t result) {
182182
}
183183
}
184184

185-
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint8_t addr, const uint8_t *data, size_t len) {
185+
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) {
186186
return convert_esp_err(len == 0
187187
? i2c_zero_length_write(self, addr, 100)
188-
: i2c_master_write_to_device(self->i2c_num, addr, data, len, 100 /* wait in ticks */)
188+
: i2c_master_write_to_device(self->i2c_num, (uint8_t)addr, data, len, 100 /* wait in ticks */)
189189
);
190190
}
191191

192-
uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint8_t addr, uint8_t *data, size_t len) {
192+
uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) {
193193
return convert_esp_err(
194-
i2c_master_read_from_device(self->i2c_num, addr, data, len, 100 /* wait in ticks */));
194+
i2c_master_read_from_device(self->i2c_num, (uint8_t)addr, data, len, 100 /* wait in ticks */));
195195
}
196196

197-
uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint8_t addr,
197+
uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr,
198198
uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) {
199199
return convert_esp_err(
200200
i2c_master_write_read_device(self->i2c_num, (uint8_t)addr,

ports/mimxrt10xx/common-hal/busio/I2C.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) {
210210
self->has_lock = false;
211211
}
212212

213-
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
213+
STATIC uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
214214
const uint8_t *data, size_t len, bool transmit_stop_bit) {
215215

216216
lpi2c_master_transfer_t xfer = { 0 };
@@ -227,6 +227,11 @@ uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
227227
return MP_EIO;
228228
}
229229

230+
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
231+
const uint8_t *data, size_t len) {
232+
return _common_hal_busio_i2c_write(self, addr, data, len, true);
233+
}
234+
230235
uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr,
231236
uint8_t *data, size_t len) {
232237

@@ -243,3 +248,13 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr,
243248

244249
return MP_EIO;
245250
}
251+
252+
uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr,
253+
uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) {
254+
uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false);
255+
if (result != 0) {
256+
return result;
257+
}
258+
259+
return common_hal_busio_i2c_read(self, addr, in_data, in_len);
260+
}

ports/nrf/common-hal/busio/I2C.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) {
238238
self->has_lock = false;
239239
}
240240

241-
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len, bool stopBit) {
241+
STATIC uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len, bool stopBit) {
242242
if (len == 0) {
243243
return common_hal_busio_i2c_probe(self, addr) ? 0 : MP_ENODEV;
244244
}
@@ -266,6 +266,10 @@ uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const u
266266
return twi_error_to_mp(err);
267267
}
268268

269+
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr, const uint8_t *data, size_t len) {
270+
return _common_hal_busio_i2c_write(self, addr, data, len, true);
271+
}
272+
269273
uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t *data, size_t len) {
270274
if (len == 0) {
271275
return 0;
@@ -292,3 +296,13 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr, uint8_t
292296

293297
return twi_error_to_mp(err);
294298
}
299+
300+
uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr,
301+
uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) {
302+
uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false);
303+
if (result != 0) {
304+
return result;
305+
}
306+
307+
return common_hal_busio_i2c_read(self, addr, in_data, in_len);
308+
}

ports/raspberrypi/common-hal/busio/I2C.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) {
145145
}
146146

147147
bool common_hal_busio_i2c_probe(busio_i2c_obj_t *self, uint8_t addr) {
148-
return common_hal_busio_i2c_write(self, addr, NULL, 0, true) == 0;
148+
return common_hal_busio_i2c_write(self, addr, NULL, 0) == 0;
149149
}
150150

151151
bool common_hal_busio_i2c_try_lock(busio_i2c_obj_t *self) {
@@ -165,7 +165,7 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) {
165165
self->has_lock = false;
166166
}
167167

168-
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
168+
STATIC uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
169169
const uint8_t *data, size_t len, bool transmit_stop_bit) {
170170
if (len == 0) {
171171
// The RP2040 I2C peripheral will not perform 0 byte writes.
@@ -203,6 +203,11 @@ uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
203203
}
204204
}
205205

206+
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
207+
const uint8_t *data, size_t len) {
208+
return _common_hal_busio_i2c_write(self, addr, data, len, true);
209+
}
210+
206211
uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr,
207212
uint8_t *data, size_t len) {
208213
int result = i2c_read_timeout_us(self->peripheral, addr, data, len, false, BUS_TIMEOUT_US);
@@ -219,6 +224,16 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr,
219224
}
220225
}
221226

227+
uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr,
228+
uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) {
229+
uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false);
230+
if (result != 0) {
231+
return result;
232+
}
233+
234+
return common_hal_busio_i2c_read(self, addr, in_data, in_len);
235+
}
236+
222237
void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) {
223238
never_reset_i2c[i2c_hw_index(self->peripheral)] = true;
224239

ports/stm/common-hal/busio/I2C.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) {
246246
self->has_lock = false;
247247
}
248248

249-
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
249+
STATIC uint8_t _common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
250250
const uint8_t *data, size_t len, bool transmit_stop_bit) {
251251
HAL_StatusTypeDef result;
252252
if (!transmit_stop_bit) {
@@ -271,6 +271,11 @@ uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
271271
return result == HAL_OK ? 0 : MP_EIO;
272272
}
273273

274+
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
275+
const uint8_t *data, size_t len) {
276+
return _common_hal_busio_i2c_write(self, addr, data, len, true);
277+
}
278+
274279
uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr,
275280
uint8_t *data, size_t len) {
276281
if (!self->frame_in_prog) {
@@ -288,6 +293,16 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t addr,
288293
}
289294
}
290295

296+
uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr,
297+
uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len) {
298+
uint8_t result = _common_hal_busio_i2c_write(self, addr, out_data, out_len, false);
299+
if (result != 0) {
300+
return result;
301+
}
302+
303+
return common_hal_busio_i2c_read(self, addr, in_data, in_len);
304+
}
305+
291306
STATIC void i2c_clock_enable(uint8_t mask) {
292307
// Note: hard reset required due to soft reboot issue.
293308
#ifdef I2C1

shared-bindings/busio/I2C.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,16 @@ extern void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self);
6060
extern bool common_hal_busio_i2c_probe(busio_i2c_obj_t *self, uint8_t addr);
6161

6262
// Write to the device and return 0 on success or an appropriate error code from mperrno.h
63-
extern uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint8_t address,
63+
extern uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t address,
6464
const uint8_t *data, size_t len);
6565

6666
// Reads memory of the i2c device picking up where it left off and return 0 on
6767
// success or an appropriate error code from mperrno.h
68-
extern uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint8_t address,
68+
extern uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self, uint16_t address,
6969
uint8_t *data, size_t len);
7070

7171
// Do a write and then a read in the same I2C transaction.
72-
uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint8_t address,
72+
uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t address,
7373
uint8_t *out_data, size_t out_len, uint8_t *in_data, size_t in_len);
7474

7575
// This is used by the supervisor to claim I2C devices indefinitely.

0 commit comments

Comments
 (0)