Merge pull request #404 from pewpew-game/fix-spi-empty-read-write
Allow empty reads and writes for busio.SPI
This commit is contained in:
commit
4869599f89
|
@ -157,6 +157,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(bitbangio_i2c_unlock_obj, bitbangio_i2c_obj_unlock);
|
||||||
//|
|
//|
|
||||||
//| Read into ``buffer`` from the slave specified by ``address``.
|
//| Read into ``buffer`` from the slave specified by ``address``.
|
||||||
//| The number of bytes read will be the length of ``buffer``.
|
//| The number of bytes read will be the length of ``buffer``.
|
||||||
|
//| At least one byte must be read.
|
||||||
//|
|
//|
|
||||||
//| If ``start`` or ``end`` is provided, then the buffer will be sliced
|
//| If ``start`` or ``end`` is provided, then the buffer will be sliced
|
||||||
//| as if ``buffer[start:end]``. This will not cause an allocation like
|
//| as if ``buffer[start:end]``. This will not cause an allocation like
|
||||||
|
@ -186,6 +187,9 @@ STATIC mp_obj_t bitbangio_i2c_readfrom_into(size_t n_args, const mp_obj_t *pos_a
|
||||||
int32_t start = args[ARG_start].u_int;
|
int32_t start = args[ARG_start].u_int;
|
||||||
uint32_t length = bufinfo.len;
|
uint32_t length = bufinfo.len;
|
||||||
normalize_buffer_bounds(&start, args[ARG_end].u_int, &length);
|
normalize_buffer_bounds(&start, args[ARG_end].u_int, &length);
|
||||||
|
if (length == 0) {
|
||||||
|
mp_raise_ValueError("Buffer must be at least length 1");
|
||||||
|
}
|
||||||
uint8_t status = shared_module_bitbangio_i2c_read(self,
|
uint8_t status = shared_module_bitbangio_i2c_read(self,
|
||||||
args[ARG_address].u_int,
|
args[ARG_address].u_int,
|
||||||
((uint8_t*)bufinfo.buf) + start,
|
((uint8_t*)bufinfo.buf) + start,
|
||||||
|
@ -206,6 +210,9 @@ MP_DEFINE_CONST_FUN_OBJ_KW(bitbangio_i2c_readfrom_into_obj, 3, bitbangio_i2c_rea
|
||||||
//| as if ``buffer[start:end]``. This will not cause an allocation like
|
//| as if ``buffer[start:end]``. This will not cause an allocation like
|
||||||
//| ``buffer[start:end]`` will so it saves memory.
|
//| ``buffer[start:end]`` will so it saves memory.
|
||||||
//|
|
//|
|
||||||
|
//| Writing a buffer or slice of length zero is permitted, as it can be used
|
||||||
|
//| to poll for the existence of a device.
|
||||||
|
//|
|
||||||
//| :param int address: 7-bit device address
|
//| :param int address: 7-bit device address
|
||||||
//| :param bytearray buffer: buffer containing the bytes to write
|
//| :param bytearray buffer: buffer containing the bytes to write
|
||||||
//| :param int start: Index to start writing from
|
//| :param int start: Index to start writing from
|
||||||
|
|
|
@ -191,6 +191,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(bitbangio_spi_unlock_obj, bitbangio_spi_obj_unlock);
|
||||||
//| .. method:: SPI.write(buf)
|
//| .. method:: SPI.write(buf)
|
||||||
//|
|
//|
|
||||||
//| Write the data contained in ``buf``. Requires the SPI being locked.
|
//| Write the data contained in ``buf``. Requires the SPI being locked.
|
||||||
|
//| If the buffer is empty, nothing happens.
|
||||||
//|
|
//|
|
||||||
// TODO(tannewt): Add support for start and end kwargs.
|
// TODO(tannewt): Add support for start and end kwargs.
|
||||||
STATIC mp_obj_t bitbangio_spi_write(mp_obj_t self_in, mp_obj_t wr_buf) {
|
STATIC mp_obj_t bitbangio_spi_write(mp_obj_t self_in, mp_obj_t wr_buf) {
|
||||||
|
@ -198,6 +199,9 @@ STATIC mp_obj_t bitbangio_spi_write(mp_obj_t self_in, mp_obj_t wr_buf) {
|
||||||
raise_error_if_deinited(shared_module_bitbangio_spi_deinited(self));
|
raise_error_if_deinited(shared_module_bitbangio_spi_deinited(self));
|
||||||
mp_buffer_info_t src;
|
mp_buffer_info_t src;
|
||||||
mp_get_buffer_raise(wr_buf, &src, MP_BUFFER_READ);
|
mp_get_buffer_raise(wr_buf, &src, MP_BUFFER_READ);
|
||||||
|
if (src.len == 0) {
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
check_lock(self);
|
check_lock(self);
|
||||||
bool ok = shared_module_bitbangio_spi_write(self, src.buf, src.len);
|
bool ok = shared_module_bitbangio_spi_write(self, src.buf, src.len);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
|
@ -210,7 +214,9 @@ MP_DEFINE_CONST_FUN_OBJ_2(bitbangio_spi_write_obj, bitbangio_spi_write);
|
||||||
|
|
||||||
//| .. method:: SPI.readinto(buf)
|
//| .. method:: SPI.readinto(buf)
|
||||||
//|
|
//|
|
||||||
//| Read into the buffer specified by ``buf`` while writing zeroes. Requires the SPI being locked.
|
//| Read into the buffer specified by ``buf`` while writing zeroes.
|
||||||
|
//| Requires the SPI being locked.
|
||||||
|
//| If the number of bytes to read is 0, nothing happens.
|
||||||
//|
|
//|
|
||||||
// TODO(tannewt): Add support for start and end kwargs.
|
// TODO(tannewt): Add support for start and end kwargs.
|
||||||
STATIC mp_obj_t bitbangio_spi_readinto(size_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t bitbangio_spi_readinto(size_t n_args, const mp_obj_t *args) {
|
||||||
|
@ -218,6 +224,9 @@ STATIC mp_obj_t bitbangio_spi_readinto(size_t n_args, const mp_obj_t *args) {
|
||||||
raise_error_if_deinited(shared_module_bitbangio_spi_deinited(self));
|
raise_error_if_deinited(shared_module_bitbangio_spi_deinited(self));
|
||||||
mp_buffer_info_t bufinfo;
|
mp_buffer_info_t bufinfo;
|
||||||
mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_WRITE);
|
mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_WRITE);
|
||||||
|
if (bufinfo.len == 0) {
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
check_lock(args[0]);
|
check_lock(args[0]);
|
||||||
bool ok = shared_module_bitbangio_spi_read(self, bufinfo.buf, bufinfo.len);
|
bool ok = shared_module_bitbangio_spi_read(self, bufinfo.buf, bufinfo.len);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
|
|
|
@ -207,7 +207,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(busio_spi_unlock_obj, busio_spi_obj_unlock);
|
||||||
//| .. method:: SPI.write(buffer, \*, start=0, end=len(buffer))
|
//| .. method:: SPI.write(buffer, \*, start=0, end=len(buffer))
|
||||||
//|
|
//|
|
||||||
//| Write the data contained in ``buf``. Requires the SPI being locked.
|
//| Write the data contained in ``buf``. Requires the SPI being locked.
|
||||||
//| At least one byte must be written.
|
//| If the buffer is empty, nothing happens.
|
||||||
//|
|
//|
|
||||||
//| :param bytearray buffer: buffer containing the bytes to write
|
//| :param bytearray buffer: buffer containing the bytes to write
|
||||||
//| :param int start: Index to start writing from
|
//| :param int start: Index to start writing from
|
||||||
|
@ -233,7 +233,7 @@ STATIC mp_obj_t busio_spi_write(size_t n_args, const mp_obj_t *pos_args, mp_map_
|
||||||
normalize_buffer_bounds(&start, args[ARG_end].u_int, &length);
|
normalize_buffer_bounds(&start, args[ARG_end].u_int, &length);
|
||||||
|
|
||||||
if (length == 0) {
|
if (length == 0) {
|
||||||
mp_raise_ValueError("Buffer must be at least length 1");
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ok = common_hal_busio_spi_write(self, ((uint8_t*)bufinfo.buf) + start, length);
|
bool ok = common_hal_busio_spi_write(self, ((uint8_t*)bufinfo.buf) + start, length);
|
||||||
|
@ -247,8 +247,9 @@ MP_DEFINE_CONST_FUN_OBJ_KW(busio_spi_write_obj, 2, busio_spi_write);
|
||||||
|
|
||||||
//| .. method:: SPI.readinto(buffer, \*, start=0, end=len(buffer), write_value=0)
|
//| .. method:: SPI.readinto(buffer, \*, start=0, end=len(buffer), write_value=0)
|
||||||
//|
|
//|
|
||||||
//| Read into the buffer specified by ``buf`` while writing zeroes. Requires the SPI being locked.
|
//| Read into the buffer specified by ``buf`` while writing zeroes.
|
||||||
//| At least one byte must be read.
|
//| Requires the SPI being locked.
|
||||||
|
//| If the number of bytes to read is 0, nothing happens.
|
||||||
//|
|
//|
|
||||||
//| :param bytearray buffer: buffer to write into
|
//| :param bytearray buffer: buffer to write into
|
||||||
//| :param int start: Index to start writing at
|
//| :param int start: Index to start writing at
|
||||||
|
@ -276,7 +277,7 @@ STATIC mp_obj_t busio_spi_readinto(size_t n_args, const mp_obj_t *pos_args, mp_m
|
||||||
normalize_buffer_bounds(&start, args[ARG_end].u_int, &length);
|
normalize_buffer_bounds(&start, args[ARG_end].u_int, &length);
|
||||||
|
|
||||||
if (length == 0) {
|
if (length == 0) {
|
||||||
mp_raise_ValueError("Buffer must be at least length 1");
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ok = common_hal_busio_spi_read(self, ((uint8_t*)bufinfo.buf) + start, length, args[ARG_write_value].u_int);
|
bool ok = common_hal_busio_spi_read(self, ((uint8_t*)bufinfo.buf) + start, length, args[ARG_write_value].u_int);
|
||||||
|
|
Loading…
Reference in New Issue