Skip to content

Commit a861498

Browse files
authored
Merge pull request adafruit#4114 from tannewt/spidevice_spi
Add .spi accessor to SPIDevice
2 parents 8789a2c + 8fd6bff commit a861498

File tree

3 files changed

+40
-4
lines changed

3 files changed

+40
-4
lines changed

shared-bindings/adafruit_bus_device/SPIDevice.c

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
#include "lib/utils/buffer_helper.h"
3636
#include "lib/utils/context_manager_helpers.h"
37+
#include "py/objproperty.h"
3738
#include "py/runtime.h"
3839
#include "supervisor/shared/translate.h"
3940

@@ -100,22 +101,51 @@ STATIC mp_obj_t adafruit_bus_device_spidevice_make_new(const mp_obj_type_t *type
100101
return (mp_obj_t)self;
101102
}
102103

104+
//| def __enter__(self) -> busio.SPI:
105+
//| """Starts a SPI transaction by configuring the SPI and asserting chip select."""
106+
//| ...
107+
//|
103108
STATIC mp_obj_t adafruit_bus_device_spidevice_obj___enter__(mp_obj_t self_in) {
104109
adafruit_bus_device_spidevice_obj_t *self = MP_OBJ_TO_PTR(self_in);
105-
common_hal_adafruit_bus_device_spidevice_enter(self);
106-
return self->spi;
110+
return common_hal_adafruit_bus_device_spidevice_enter(self);
107111
}
108112
STATIC MP_DEFINE_CONST_FUN_OBJ_1(adafruit_bus_device_spidevice___enter___obj, adafruit_bus_device_spidevice_obj___enter__);
109113

114+
115+
//| def __exit__(self) -> None:
116+
//| """Ends a SPI transaction by deasserting chip select. See
117+
//| :ref:`lifetime-and-contextmanagers` for more info."""
118+
//| ...
119+
//|
110120
STATIC mp_obj_t adafruit_bus_device_spidevice_obj___exit__(size_t n_args, const mp_obj_t *args) {
111121
common_hal_adafruit_bus_device_spidevice_exit(MP_OBJ_TO_PTR(args[0]));
112122
return mp_const_none;
113123
}
114124
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(adafruit_bus_device_spidevice___exit___obj, 4, 4, adafruit_bus_device_spidevice_obj___exit__);
115125

126+
//| spi: busio.SPI
127+
//| """The underlying SPI bus. Useful for weird uses like clocking an SD card without chip select.
128+
//|
129+
//| You shouldn't normally need this."""
130+
//|
131+
STATIC mp_obj_t adafruit_bus_device_spidevice_obj_get_spi(mp_obj_t self_in) {
132+
adafruit_bus_device_spidevice_obj_t *self = MP_OBJ_TO_PTR(self_in);
133+
return common_hal_adafruit_bus_device_spidevice_get_spi(self);
134+
}
135+
MP_DEFINE_CONST_FUN_OBJ_1(adafruit_bus_device_spidevice_get_spi_obj, adafruit_bus_device_spidevice_obj_get_spi);
136+
137+
const mp_obj_property_t adafruit_bus_device_spidevice_spi_obj = {
138+
.base.type = &mp_type_property,
139+
.proxy = {(mp_obj_t)&adafruit_bus_device_spidevice_get_spi_obj,
140+
(mp_obj_t)&mp_const_none_obj,
141+
(mp_obj_t)&mp_const_none_obj},
142+
};
143+
116144
STATIC const mp_rom_map_elem_t adafruit_bus_device_spidevice_locals_dict_table[] = {
117145
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&adafruit_bus_device_spidevice___enter___obj) },
118146
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&adafruit_bus_device_spidevice___exit___obj) },
147+
148+
{ MP_ROM_QSTR(MP_QSTR_spi), MP_ROM_PTR(&adafruit_bus_device_spidevice_spi_obj) },
119149
};
120150

121151
STATIC MP_DEFINE_CONST_DICT(adafruit_bus_device_spidevice_locals_dict, adafruit_bus_device_spidevice_locals_dict_table);

shared-bindings/adafruit_bus_device/SPIDevice.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ extern const mp_obj_type_t adafruit_bus_device_spidevice_type;
4444
// Initializes the hardware peripheral.
4545
extern void common_hal_adafruit_bus_device_spidevice_construct(adafruit_bus_device_spidevice_obj_t *self, busio_spi_obj_t *spi, digitalio_digitalinout_obj_t *cs,
4646
uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t extra_clocks);
47-
extern void common_hal_adafruit_bus_device_spidevice_enter(adafruit_bus_device_spidevice_obj_t *self);
47+
extern mp_obj_t common_hal_adafruit_bus_device_spidevice_enter(adafruit_bus_device_spidevice_obj_t *self);
4848
extern void common_hal_adafruit_bus_device_spidevice_exit(adafruit_bus_device_spidevice_obj_t *self);
49+
extern mp_obj_t common_hal_adafruit_bus_device_spidevice_get_spi(adafruit_bus_device_spidevice_obj_t *self);
4950

5051
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BUSDEVICE_SPIDEVICE_H

shared-module/adafruit_bus_device/SPIDevice.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ void common_hal_adafruit_bus_device_spidevice_construct(adafruit_bus_device_spid
4141
self->chip_select = cs;
4242
}
4343

44-
void common_hal_adafruit_bus_device_spidevice_enter(adafruit_bus_device_spidevice_obj_t *self) {
44+
mp_obj_t common_hal_adafruit_bus_device_spidevice_enter(adafruit_bus_device_spidevice_obj_t *self) {
4545
bool success = false;
4646
while (!success) {
4747
success = common_hal_busio_spi_try_lock(self->spi);
@@ -54,6 +54,7 @@ void common_hal_adafruit_bus_device_spidevice_enter(adafruit_bus_device_spidevic
5454
if (self->chip_select != MP_OBJ_NULL) {
5555
common_hal_digitalio_digitalinout_set_value(MP_OBJ_TO_PTR(self->chip_select), false);
5656
}
57+
return self->spi;
5758
}
5859

5960
void common_hal_adafruit_bus_device_spidevice_exit(adafruit_bus_device_spidevice_obj_t *self) {
@@ -83,3 +84,7 @@ void common_hal_adafruit_bus_device_spidevice_exit(adafruit_bus_device_spidevice
8384

8485
common_hal_busio_spi_unlock(self->spi);
8586
}
87+
88+
mp_obj_t common_hal_adafruit_bus_device_spidevice_get_spi(adafruit_bus_device_spidevice_obj_t *self) {
89+
return self->spi;
90+
}

0 commit comments

Comments
 (0)