Skip to content

Commit ddc1c95

Browse files
committed
adds adding io_expanders
1 parent 130eb3c commit ddc1c95

File tree

18 files changed

+337
-77
lines changed

18 files changed

+337
-77
lines changed

api_drivers/common_api_drivers/frozen/other/spi3wire.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,17 @@ def __init__(self, miso, sck, cs, cs_active_high=False):
3939

4040
self._cs_active_high = cs_active_high
4141

42-
if cs > 31:
43-
self._cs_enable_reg = _GPIO_ENABLE1_W1TC_REG
44-
cs -= 32
45-
else:
46-
self._cs_enable_reg = _GPIO_ENABLE_W1TC_REG
42+
if isinstance(cs, int):
43+
if cs > 31:
44+
self._cs_enable_reg = _GPIO_ENABLE1_W1TC_REG
45+
cs -= 32
46+
else:
47+
self._cs_enable_reg = _GPIO_ENABLE_W1TC_REG
4748

48-
self._cs_mask = 1 << cs
49+
self._cs_mask = 1 << cs
50+
else:
51+
self._cs_enable_reg = None
52+
self._cs_mask = None
4953

5054
if miso > 31:
5155
self._miso_enable_reg = _GPIO_ENABLE1_W1TC_REG
@@ -75,7 +79,11 @@ def init(self, cmd_bits, param_bits):
7579

7680
self._miso_pin = machine.Pin(self._miso_pin_num, machine.Pin.OUT)
7781
self._sck_pin = machine.Pin(self._sck_pin_num, machine.Pin.OUT)
78-
self._cs_pin = machine.Pin(self._cs_pin_num, machine.Pin.OUT)
82+
83+
if isinstance(self._cs_pin_num, int):
84+
self._cs_pin = machine.Pin(self._cs_pin_num, machine.Pin.OUT)
85+
else:
86+
self._cs_pin = self._cs_pin_num
7987

8088
@micropython.viper
8189
def __deinit_sck(self):
@@ -109,10 +117,13 @@ def deinit(self):
109117
self._miso_pin = None
110118
self.__deinit_miso()
111119

112-
if self._cs_pin is not None:
120+
if isinstance(self._cs_pin, machine.Pin):
113121
del self._cs_pin
114122
self._cs_pin = None
115123
self.__deinit_cs()
124+
else:
125+
del self._cs_pin
126+
self._cs_pin = None
116127

117128
def __senddata(self, data, num_bits):
118129

api_drivers/common_api_drivers/indev/cst816s.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,12 @@ def __init__(
179179

180180
self._device = device
181181

182-
if reset_pin is None:
183-
self._reset_pin = None
182+
if not isinstance(reset_pin, int):
183+
self._reset_pin = reset_pin
184184
else:
185185
self._reset_pin = machine.Pin(reset_pin, machine.Pin.OUT)
186+
187+
if self._reset_pin:
186188
self._reset_pin.value(1)
187189

188190
self._read_reg(_ChipID)
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import io_expander_framework
2+
3+
4+
EXIO1 = 1
5+
EXIO2 = 2
6+
EXIO3 = 3
7+
EXIO4 = 4
8+
EXIO5 = 5
9+
EXIO6 = 6
10+
EXIO7 = 7
11+
EXIO8 = 8
12+
13+
14+
BITS = 8
15+
16+
17+
class Pin(io_expander_framework.Pin):
18+
_output_states = 0xFF
19+
20+
_device = None
21+
22+
@classmethod
23+
def set_device(cls, device):
24+
if cls._device is not None:
25+
raise ValueError('device has already been set')
26+
27+
cls._device = device
28+
29+
def __init__(self, id, mode=-1, value=None):
30+
if Pin._device is None:
31+
raise RuntimeError('The expander device has not been set')
32+
33+
super().__init__(id, mode, value)
34+
35+
@property
36+
def __bit(self):
37+
return 1 << self._id
38+
39+
def __read_reg(self):
40+
self._buf[0] = 0
41+
self._device.read(buf=self._mv[:1])
42+
return self._buf[0]
43+
44+
def __write_reg(self, value):
45+
self._buf[0] = value & 0xFF
46+
self._device.write(buf=self._mv[:1])
47+
48+
def _set_dir(self, direction):
49+
pass
50+
51+
def _set_level(self, level):
52+
if level:
53+
Pin._output_states |= self.__bit
54+
else:
55+
Pin._output_states &= ~self.__bit
56+
57+
self.__write_reg(Pin._output_states)
58+
59+
def _get_level(self):
60+
if self._mode == self.IN:
61+
states = self.__read_reg()
62+
return (states >> self._id) & 0x1
63+
else:
64+
return (Pin._output_states >> self._id) & 0x1
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
from micropython import const
2+
import io_expander_framework
3+
4+
5+
EXIO1 = 1
6+
EXIO2 = 2
7+
EXIO3 = 3
8+
EXIO4 = 4
9+
EXIO5 = 5
10+
EXIO6 = 6
11+
EXIO7 = 7
12+
EXIO8 = 8
13+
EXIO9 = 9
14+
EXIO10 = 10
15+
EXIO11 = 11
16+
EXIO12 = 12
17+
EXIO13 = 13
18+
EXIO14 = 14
19+
EXIO15 = 15
20+
EXIO16 = 16
21+
22+
_INPUT_PORT_REG = const(0x00)
23+
_OUTPUT_PORT_REG = const(0x02)
24+
_POLARITY_INVERSION_REG = const(0x04)
25+
_CONFIGURATION_REG = const(0x06)
26+
27+
# 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, or 0x27
28+
I2C_ADDR = 0x20
29+
BITS = 8
30+
31+
32+
class Pin(io_expander_framework.Pin):
33+
_config_reg = 0
34+
_output_reg = 0
35+
36+
_device = None
37+
38+
@classmethod
39+
def set_device(cls, device):
40+
if cls._device is not None:
41+
raise ValueError('device has already been set')
42+
43+
cls._device = device
44+
45+
def __init__(self, id, mode=-1, value=None):
46+
if Pin._device is None:
47+
raise RuntimeError('The expander device has not been set')
48+
49+
super().__init__(id, mode, value)
50+
51+
@property
52+
def __bit(self):
53+
return 1 << self._id
54+
55+
def __read_reg(self, reg):
56+
self._buf[0] = 0
57+
self._buf[1] = 0
58+
self._device.read_mem(reg, buf=self._mv)
59+
return self._buf[0] << 8 | self._buf[1]
60+
61+
def __write_reg(self, reg, value):
62+
self._buf[0] = value >> 8 & 0xFF
63+
self._buf[1] = value & 0xFF
64+
self._device.write_mem(reg, buf=self._mv)
65+
66+
def _set_dir(self, direction):
67+
if direction:
68+
Pin._config_reg &= ~self.__bit
69+
else:
70+
Pin._config_reg |= self.__bit
71+
72+
self.__write_reg(_CONFIGURATION_REG, Pin._config_reg)
73+
74+
def _set_level(self, level):
75+
if level:
76+
Pin._output_reg |= self.__bit
77+
else:
78+
Pin._output_reg &= ~self.__bit
79+
80+
self.__write_reg(_OUTPUT_PORT_REG, Pin._output_reg)
81+
82+
def _get_level(self):
83+
if self._mode == self.OUT:
84+
Pin._output_reg = self.__read_reg(_OUTPUT_PORT_REG)
85+
return (Pin._output_reg >> self._id) & 0x1
86+
else:
87+
val = self.__read_reg(_INPUT_PORT_REG)
88+
return (val >> self._id) & 0x1
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
from micropython import const
2+
import io_expander_framework
3+
4+
5+
EXIO1 = 1
6+
EXIO2 = 2
7+
EXIO3 = 3
8+
EXIO4 = 4
9+
EXIO5 = 5
10+
EXIO6 = 6
11+
EXIO7 = 7
12+
EXIO8 = 8
13+
14+
15+
_INPUT_PORT_REG = const(0x00)
16+
_OUTPUT_PORT_REG = const(0x02)
17+
_POLARITY_INVERSION_REG = const(0x04)
18+
_CONFIGURATION_REG = const(0x06)
19+
20+
# 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, or 0x27
21+
I2C_ADDR = 0x20
22+
BITS = 8
23+
24+
25+
class Pin(io_expander_framework.Pin):
26+
_config_reg = 0
27+
_output_reg = 0
28+
29+
_device = None
30+
31+
@classmethod
32+
def set_device(cls, device):
33+
if cls._device is not None:
34+
raise ValueError('device has already been set')
35+
36+
cls._device = device
37+
38+
def __init__(self, id, mode=-1, value=None):
39+
if Pin._device is None:
40+
raise RuntimeError('The expander device has not been set')
41+
42+
super().__init__(id, mode, value)
43+
44+
@property
45+
def __bit(self):
46+
return 1 << self._id
47+
48+
def __read_reg(self, reg):
49+
self._buf[0] = 0
50+
self._buf[1] = 0
51+
self._device.read_mem(reg, buf=self._mv)
52+
return self._buf[0] << 8 | self._buf[1]
53+
54+
def __write_reg(self, reg, value):
55+
self._buf[0] = value >> 8 & 0xFF
56+
self._buf[1] = value & 0xFF
57+
self._device.write_mem(reg, buf=self._mv)
58+
59+
def _set_dir(self, direction):
60+
if direction:
61+
Pin._config_reg &= ~self.__bit
62+
else:
63+
Pin._config_reg |= self.__bit
64+
65+
self.__write_reg(_CONFIGURATION_REG, Pin._config_reg)
66+
67+
def _set_level(self, level):
68+
if level:
69+
Pin._output_reg |= self.__bit
70+
else:
71+
Pin._output_reg &= ~self.__bit
72+
73+
self.__write_reg(_OUTPUT_PORT_REG, Pin._output_reg)
74+
75+
def _get_level(self):
76+
if self._mode == self.OUT:
77+
Pin._output_reg = self.__read_reg(_OUTPUT_PORT_REG)
78+
return (Pin._output_reg >> self._id) & 0x1
79+
else:
80+
val = self.__read_reg(_INPUT_PORT_REG)
81+
return (val >> self._id) & 0x1

api_drivers/py_api_drivers/frozen/display/display_driver_framework.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import lvgl as lv # NOQA
99
import lcd_bus
10+
import io_expander_framework
11+
1012

1113
try:
1214
micropython.alloc_emergency_exception_buf(256) # NOQA
@@ -156,15 +158,26 @@ def __init__(
156158

157159
if backlight_pin is None:
158160
self._backlight_pin = None
159-
elif backlight_on_state == STATE_PWM:
160-
pin = machine.Pin(backlight_pin, machine.Pin.OUT)
161-
self._backlight_pin = machine.PWM(pin, freq=38000)
161+
elif not isinstance(backlight_pin, int):
162+
self._backlight_pin = backlight_pin
162163
else:
163-
self._backlight_pin = (
164-
machine.Pin(backlight_pin, machine.Pin.OUT)
165-
)
164+
self._backlight_pin = machine.Pin(backlight_pin, machine.Pin.OUT)
165+
166+
if backlight_on_state == STATE_PWM:
167+
if isinstance(self._backlight_pin, io_expander_framework.Pin):
168+
backlight_on_state = STATE_HIGH
169+
else:
170+
self._backlight_pin = machine.PWM(
171+
self._backlight_pin, freq=38000)
172+
173+
if (
174+
backlight_on_state != STATE_PWM and
175+
self._backlight_pin is not None
176+
):
166177
self._backlight_pin.value(not backlight_on_state)
167178

179+
self._backlight_on_state = backlight_on_state
180+
168181
self._data_bus = data_bus
169182
self._disp_drv = lv.display_create(display_width, display_height) # NOQA
170183
self._disp_drv.set_color_format(color_space)

api_drivers/common_api_drivers/frozen/other/io_expander_framework.py renamed to api_drivers/py_api_drivers/frozen/io_expander/io_expander_framework.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,4 @@
11

2-
EXIO1 = 0x01
3-
EXIO2 = 0x02
4-
EXIO3 = 0x04
5-
EXIO4 = 0x08
6-
EXIO5 = 0x10
7-
EXIO6 = 0x20
8-
EXIO7 = 0x40
9-
EXIO8 = 0x60
10-
11-
122
class Pin(object):
133
IN = 0x00
144
OUT = 0x01

0 commit comments

Comments
 (0)