Skip to content

Commit 2bba90b

Browse files
committed
Updates io expander framework and drivers
1 parent e99e3f6 commit 2bba90b

File tree

9 files changed

+4153
-181
lines changed

9 files changed

+4153
-181
lines changed

api_drivers/common_api_drivers/io_expander/axp192.py.wip

Lines changed: 3348 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
from micropython import const # NOQA
2+
import io_expander_framework
3+
import i2c
4+
5+
6+
EXIO1 = io_expander_framework.EXIO1
7+
EXIO2 = io_expander_framework.EXIO2
8+
EXIO3 = io_expander_framework.EXIO3
9+
EXIO4 = io_expander_framework.EXIO4
10+
EXIO5 = io_expander_framework.EXIO5
11+
EXIO6 = io_expander_framework.EXIO6
12+
EXIO7 = io_expander_framework.EXIO7
13+
EXIO8 = io_expander_framework.EXIO8
14+
15+
16+
I2C_ADDR = 0x24 # 36 00100100
17+
BITS = 8
18+
19+
_CH422G_REG_IN = const(0x26) # 38 00100110
20+
_CH422G_REG_OUT = const(0x38) # 56 00111000
21+
22+
_REG_INPUT = const(0)
23+
_REG_OUTPUT = const(1)
24+
_REG_DIRECTION = const(2)
25+
26+
27+
class Pin(io_expander_framework.Pin):
28+
_output_states = 0x00
29+
_i2c_bus: i2c.I2C.Bus = None
30+
_reg_in: i2c.I2C.Device = None
31+
_reg_out: i2c.I2C.Device = None
32+
_reg_int_pins = []
33+
34+
@classmethod
35+
def set_device(cls, device):
36+
io_expander_framework.Pin.set_device.__func__(cls, device)
37+
38+
cls._reg_in = i2c.I2C.Device(
39+
bus=device._bus, # NOQA
40+
dev_id=_CH422G_REG_IN
41+
)
42+
cls._reg_out = i2c.I2C.Device(
43+
bus=device._bus, # NOQA
44+
dev_id=_CH422G_REG_OUT
45+
)
46+
47+
@property
48+
def __bit(self):
49+
return 1 << self._id
50+
51+
@property
52+
def _mode(self):
53+
return 1
54+
55+
@_mode.setter
56+
def _mode(self, value):
57+
pass
58+
59+
def _write_reg(self, reg, value):
60+
if reg == _REG_OUTPUT:
61+
value &= 0xFF
62+
63+
self._buf[0] = 0x01
64+
Pin._device.write(self._mv[:1])
65+
66+
self._buf[0] = value
67+
# _i2c_device.write_mem(_CH422G_REG_OUT, self._mv[:1])
68+
Pin._reg_out.write(self._mv[:1])
69+
self._output = value
70+
71+
elif reg == _REG_DIRECTION:
72+
value &= 0xFF
73+
self._mode = value
74+
75+
def _read_reg(self, reg):
76+
if reg == _REG_INPUT:
77+
# _i2c_device.read_mem(_CH422G_REG_IN, buf=self._mv[:1])
78+
Pin._reg_in.read(buf=self._mv[:1])
79+
return self._buf[0]
80+
elif reg == _REG_OUTPUT:
81+
return self._output
82+
elif reg == _REG_DIRECTION:
83+
return self._mode
84+
85+
def _set_dir(self, direction):
86+
if direction == self.OPEN_DRAIN:
87+
raise ValueError('OPEN_DRAIN is not supported')
88+
89+
def _set_level(self, level):
90+
if self._mode == self.OUT:
91+
if level:
92+
# 3. High level && Set 0 to output high
93+
# 4. Low level && Set 0 to output low
94+
states = Pin._output_states & ~self.__bit
95+
else:
96+
# 1. High level && Set 1 to output high
97+
# 2. Low level && Set 1 to output low
98+
states = Pin._output_states | self.__bit
99+
100+
# Write to reg only when different */
101+
if states != Pin._output_states:
102+
self._write_reg(_REG_OUTPUT, states)
103+
Pin._output_states = states
104+
105+
def _get_level(self):
106+
if self._mode == self.IN:
107+
states = ~self._read_reg(_REG_INPUT)
108+
elif self._mode == self.OUT:
109+
states = Pin._output_states
110+
else:
111+
raise ValueError('Unsupported pin mode')
112+
113+
return int(bool(states & self.__bit))
114+
115+
def _set_irq(self, handler, trigger):
116+
pass
117+
118+
def _set_pull(self, pull):
119+
pass

api_drivers/common_api_drivers/io_expander/ht8574.py

Lines changed: 0 additions & 66 deletions
This file was deleted.
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# Copyright (c) 2024 - 2025 Kevin G. Schlosser
2+
3+
import io_expander_framework
4+
import machine
5+
6+
7+
EXIO1 = io_expander_framework.EXIO1
8+
EXIO2 = io_expander_framework.EXIO2
9+
EXIO3 = io_expander_framework.EXIO3
10+
EXIO4 = io_expander_framework.EXIO4
11+
EXIO5 = io_expander_framework.EXIO5
12+
EXIO6 = io_expander_framework.EXIO6
13+
EXIO7 = io_expander_framework.EXIO7
14+
EXIO8 = io_expander_framework.EXIO8
15+
16+
17+
# 0x70, 0x72, 0x74, 0x76, 0x78, 0x7A, 0x7C, 0x7E
18+
I2C_ADDR = 0x70
19+
BITS = 8
20+
21+
22+
class Pin(io_expander_framework.Pin):
23+
_output_states = 0xFF
24+
_reg_int_pins = []
25+
26+
@property
27+
def __bit(self):
28+
return 1 << self._id
29+
30+
def __read_reg(self):
31+
self._buf[0] = 0
32+
Pin._device.read(buf=self._mv[:1])
33+
return self._buf[0]
34+
35+
def __write_reg(self, value):
36+
self._buf[0] = value & 0xFF
37+
Pin._device.write(buf=self._mv[:1])
38+
39+
def _set_dir(self, direction):
40+
if direction == self.OPEN_DRAIN:
41+
raise ValueError('OPEN_DRAIN is not supported')
42+
43+
def _set_level(self, level):
44+
if self._mode == self.OUT:
45+
if level:
46+
states = Pin._output_states | self.__bit
47+
else:
48+
states = Pin._output_states & ~self.__bit
49+
50+
# 0nly set if there is an actual change
51+
if states != Pin._output_states:
52+
self.__write_reg(Pin._output_states)
53+
Pin._output_states = states
54+
55+
def _get_level(self):
56+
if self._mode == self.IN:
57+
states = self.__read_reg()
58+
elif self.mode == self.OUT:
59+
states = Pin._output_states
60+
else:
61+
raise ValueError('Unsupported pin mode')
62+
63+
return int(bool(states & self.__bit))
64+
65+
def _set_irq(self, handler, trigger):
66+
pass
67+
68+
def _set_pull(self, pull):
69+
pass
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# Copyright (c) 2024 - 2025 Kevin G. Schlosser
2+
3+
import io_expander_framework
4+
5+
6+
EXIO1 = io_expander_framework.EXIO1
7+
EXIO2 = io_expander_framework.EXIO2
8+
EXIO3 = io_expander_framework.EXIO3
9+
EXIO4 = io_expander_framework.EXIO4
10+
EXIO5 = io_expander_framework.EXIO5
11+
EXIO6 = io_expander_framework.EXIO6
12+
EXIO7 = io_expander_framework.EXIO7
13+
EXIO8 = io_expander_framework.EXIO8
14+
15+
16+
# 0x40, 0x42, 0x44, 0x46, 0x48, 0x4A, 0x4C, 0x4E
17+
I2C_ADDR = 0x40
18+
BITS = 8
19+
20+
21+
class Pin(io_expander_framework.Pin):
22+
_output_states = 0xFF
23+
_reg_int_pins = []
24+
25+
@property
26+
def __bit(self):
27+
return 1 << self._id
28+
29+
def __read_reg(self):
30+
self._buf[0] = 0
31+
Pin._device.read(buf=self._mv[:1])
32+
return self._buf[0]
33+
34+
def __write_reg(self, value):
35+
self._buf[0] = value & 0xFF
36+
Pin._device.write(buf=self._mv[:1])
37+
38+
def _set_dir(self, direction):
39+
if direction == self.OPEN_DRAIN:
40+
raise ValueError('OPEN_DRAIN is not supported')
41+
42+
def _set_level(self, level):
43+
if self._mode == self.OUT:
44+
if level:
45+
states = Pin._output_states | self.__bit
46+
else:
47+
states = Pin._output_states & ~self.__bit
48+
49+
# 0nly set if there is an actual change
50+
if states != Pin._output_states:
51+
self.__write_reg(Pin._output_states)
52+
Pin._output_states = states
53+
54+
def _get_level(self):
55+
if self._mode == self.IN:
56+
states = self.__read_reg()
57+
elif self.mode == self.OUT:
58+
states = Pin._output_states
59+
else:
60+
raise ValueError('Unsupported pin mode')
61+
62+
return int(bool(states & self.__bit))
63+
64+
def _set_irq(self, handler, trigger):
65+
pass
66+
67+
def _set_pull(self, pull):
68+
pass

0 commit comments

Comments
 (0)