Skip to content

Commit 330e343

Browse files
committed
Replaces machine.I2C with a driver that has the same API as i2c.I2C
This update moves the `machine.I2C` driver to `machine.I2C.Bus`. and it creates a new driver which is `machine.I2C.Device`. The use of `machine.I2C.Device` is only required when dealing with the touch drivers.
1 parent 2df9373 commit 330e343

File tree

9 files changed

+945
-218
lines changed

9 files changed

+945
-218
lines changed
Lines changed: 142 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,140 +1,144 @@
11
import machine
22

3-
4-
class I2C(object):
5-
class Bus(object):
6-
7-
def __init__(self, host, scl, sda, freq=400000, use_locks=False, pullup=False):
8-
9-
if pullup:
10-
scl = machine.Pin(scl, pull=machine.Pin.PULL_UP)
11-
sda = machine.Pin(sda, pull=machine.Pin.PULL_UP)
12-
else:
13-
scl = machine.Pin(scl)
14-
sda = machine.Pin(sda)
15-
16-
self._bus = machine.I2C(
17-
host,
18-
scl=scl,
19-
sda=sda,
20-
freq=freq
21-
)
22-
23-
if use_locks:
24-
import _thread
25-
self._lock = _thread.allocate_lock()
26-
else:
27-
class Lock(object):
28-
29-
@staticmethod
30-
def acquire():
31-
pass
32-
33-
@staticmethod
34-
def release():
35-
pass
36-
37-
@staticmethod
38-
def is_locked():
39-
return False
40-
41-
self._lock = Lock
42-
43-
def __enter__(self):
44-
self._lock.acquire()
45-
return self
46-
47-
def __exit__(self, exc_type, exc_val, exc_tb):
48-
self._lock.release()
49-
50-
def scan(self):
51-
self._lock.acquire()
52-
data = self._bus.scan()
53-
self._lock.release()
54-
return data
55-
56-
def start(self):
57-
self._bus.start()
58-
59-
def stop(self):
60-
self._bus.stop()
61-
62-
def readinto(self, buf, nack=True):
63-
self._bus.readinto(buf, nack)
64-
65-
def write(self, buf):
66-
self._bus.write(buf)
67-
68-
def readfrom(self, addr, nbytes, stop=True):
69-
return self._bus.readfrom(addr, nbytes, stop)
70-
71-
def readfrom_into(self, addr, buf, stop=True):
72-
self._bus.readfrom_into(addr, buf, stop)
73-
74-
def writeto(self, addr, buf, stop=True):
75-
self._bus.writeto(addr, buf, stop)
76-
77-
def writevto(self, addr, vector, stop=True):
78-
self._bus.writevto(addr, vector, stop)
79-
80-
def readfrom_mem(self, addr, memaddr, nbytes, addrsize=8):
81-
return self._bus.readfrom_mem(addr, memaddr,
82-
nbytes, addrsize=addrsize)
83-
84-
def readfrom_mem_into(self, addr, memaddr, buf, addrsize=8):
85-
self._bus.readfrom_mem_into(addr, memaddr, buf, addrsize=addrsize)
86-
87-
def writeto_mem(self, addr, memaddr, buf, addrsize=8):
88-
self._bus.writeto_mem(addr, memaddr, buf, addrsize=addrsize)
89-
90-
class Device(object):
91-
92-
def __init__(self, bus, dev_id, reg_bits=8):
93-
self._bus = bus
94-
self.dev_id = dev_id
95-
self._reg_bits = reg_bits
96-
97-
def write_readinto(self, write_buf, read_buf):
98-
memaddr = 0
99-
100-
for i in range(int(self._reg_bits / 8) - 1, -1, -1):
101-
memaddr |= write_buf[i] << ((~i + int(self._reg_bits / 8)) * 8)
102-
103-
self.read_mem(memaddr, buf=read_buf)
104-
105-
def read_mem(self, memaddr, num_bytes=None, buf=None):
106-
with self._bus:
107-
if num_bytes is not None:
108-
return self._bus.readfrom_mem(
109-
self.dev_id,
110-
memaddr,
111-
num_bytes,
112-
addrsize=self._reg_bits
113-
)
114-
else:
115-
self._bus.readfrom_mem_into(
116-
self.dev_id,
117-
memaddr,
118-
buf,
119-
addrsize=self._reg_bits
120-
)
121-
return
122-
123-
def write_mem(self, memaddr, buf):
124-
with self._bus:
125-
self._bus.writeto_mem(
126-
self.dev_id,
127-
memaddr,
128-
buf,
129-
addrsize=self._reg_bits
130-
)
131-
132-
def read(self, num_bytes=None, buf=None):
133-
with self._bus:
134-
if num_bytes is not None:
135-
return self._bus.readfrom(self.dev_id, num_bytes)
136-
else:
137-
self._bus.readfrom_into(self.dev_id, buf)
138-
139-
def write(self, buf):
140-
self._bus.writeto(self.dev_id, buf)
3+
# for backwards compatability
4+
I2C = machine.I2C
5+
6+
#
7+
#
8+
# class I2C(object):
9+
# class Bus(object):
10+
#
11+
# def __init__(self, host, scl, sda, freq=400000, use_locks=False, pullup=False):
12+
#
13+
# if pullup:
14+
# scl = machine.Pin(scl, pull=machine.Pin.PULL_UP)
15+
# sda = machine.Pin(sda, pull=machine.Pin.PULL_UP)
16+
# else:
17+
# scl = machine.Pin(scl)
18+
# sda = machine.Pin(sda)
19+
#
20+
# self._bus = machine.I2C(
21+
# host,
22+
# scl=scl,
23+
# sda=sda,
24+
# freq=freq
25+
# )
26+
#
27+
# if use_locks:
28+
# import _thread
29+
# self._lock = _thread.allocate_lock()
30+
# else:
31+
# class Lock(object):
32+
#
33+
# @staticmethod
34+
# def acquire():
35+
# pass
36+
#
37+
# @staticmethod
38+
# def release():
39+
# pass
40+
#
41+
# @staticmethod
42+
# def is_locked():
43+
# return False
44+
#
45+
# self._lock = Lock
46+
#
47+
# def __enter__(self):
48+
# self._lock.acquire()
49+
# return self
50+
#
51+
# def __exit__(self, exc_type, exc_val, exc_tb):
52+
# self._lock.release()
53+
#
54+
# def scan(self):
55+
# self._lock.acquire()
56+
# data = self._bus.scan()
57+
# self._lock.release()
58+
# return data
59+
#
60+
# def start(self):
61+
# self._bus.start()
62+
#
63+
# def stop(self):
64+
# self._bus.stop()
65+
#
66+
# def readinto(self, buf, nack=True):
67+
# self._bus.readinto(buf, nack)
68+
#
69+
# def write(self, buf):
70+
# self._bus.write(buf)
71+
#
72+
# def readfrom(self, addr, nbytes, stop=True):
73+
# return self._bus.readfrom(addr, nbytes, stop)
74+
#
75+
# def readfrom_into(self, addr, buf, stop=True):
76+
# self._bus.readfrom_into(addr, buf, stop)
77+
#
78+
# def writeto(self, addr, buf, stop=True):
79+
# self._bus.writeto(addr, buf, stop)
80+
#
81+
# def writevto(self, addr, vector, stop=True):
82+
# self._bus.writevto(addr, vector, stop)
83+
#
84+
# def readfrom_mem(self, addr, memaddr, nbytes, addrsize=8):
85+
# return self._bus.readfrom_mem(addr, memaddr,
86+
# nbytes, addrsize=addrsize)
87+
#
88+
# def readfrom_mem_into(self, addr, memaddr, buf, addrsize=8):
89+
# self._bus.readfrom_mem_into(addr, memaddr, buf, addrsize=addrsize)
90+
#
91+
# def writeto_mem(self, addr, memaddr, buf, addrsize=8):
92+
# self._bus.writeto_mem(addr, memaddr, buf, addrsize=addrsize)
93+
#
94+
# class Device(object):
95+
#
96+
# def __init__(self, bus, dev_id, reg_bits=8):
97+
# self._bus = bus
98+
# self.dev_id = dev_id
99+
# self._reg_bits = reg_bits
100+
#
101+
# def write_readinto(self, write_buf, read_buf):
102+
# memaddr = 0
103+
#
104+
# for i in range(int(self._reg_bits / 8) - 1, -1, -1):
105+
# memaddr |= write_buf[i] << ((~i + int(self._reg_bits / 8)) * 8)
106+
#
107+
# self.read_mem(memaddr, buf=read_buf)
108+
#
109+
# def read_mem(self, memaddr, num_bytes=None, buf=None):
110+
# with self._bus:
111+
# if num_bytes is not None:
112+
# return self._bus.readfrom_mem(
113+
# self.dev_id,
114+
# memaddr,
115+
# num_bytes,
116+
# addrsize=self._reg_bits
117+
# )
118+
# else:
119+
# self._bus.readfrom_mem_into(
120+
# self.dev_id,
121+
# memaddr,
122+
# buf,
123+
# addrsize=self._reg_bits
124+
# )
125+
# return
126+
#
127+
# def write_mem(self, memaddr, buf):
128+
# with self._bus:
129+
# self._bus.writeto_mem(
130+
# self.dev_id,
131+
# memaddr,
132+
# buf,
133+
# addrsize=self._reg_bits
134+
# )
135+
#
136+
# def read(self, num_bytes=None, buf=None):
137+
# with self._bus:
138+
# if num_bytes is not None:
139+
# return self._bus.readfrom(self.dev_id, num_bytes)
140+
# else:
141+
# self._bus.readfrom_into(self.dev_id, buf)
142+
#
143+
# def write(self, buf):
144+
# self._bus.writeto(self.dev_id, buf)

builder/esp32.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1215,6 +1215,7 @@ def update_main():
12151215
'#include "../../../../ext_mod/lcd_bus/esp32_include/i2c_bus.h"',
12161216
'#include "../../../../ext_mod/spi3wire/include/spi3wire.h"',
12171217
'#include "../../../../micropy_updates/common/mp_spi_common.h"',
1218+
'#include "../../../../micropy_updates/common/mp_i2c_common.h"',
12181219
'',
12191220
'#if MICROPY_BLUETOOTH_NIMBLE'
12201221
]
@@ -1242,7 +1243,9 @@ def update_main():
12421243
' ',
12431244
' mp_spi3wire_deinit_all();',
12441245
' ',
1245-
' machine_hw_spi_bus_deinit_all();'
1246+
' mp_machine_hw_spi_bus_deinit_all();'
1247+
' ',
1248+
' mp_machine_hw_i2c_bus_deinit_all();'
12461249
]
12471250

12481251
data = data.replace(
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include <stdbool.h>
2+
3+
#include "py/obj.h"
4+
#include "py/runtime.h"
5+
6+
#ifndef __MP_I2C_COMMON_H__
7+
#define __MP_I2C_COMMON_H__
8+
9+
#define I2C_MAX_DEVICES (31)
10+
11+
typedef struct _mp_machine_hw_i2c_bus_obj_t mp_machine_hw_i2c_bus_obj_t;
12+
typedef struct _mp_machine_hw_i2c_device_obj_t mp_machine_hw_i2c_device_obj_t;
13+
14+
typedef struct _i2c_bus_lock_t i2c_bus_lock_t;
15+
16+
struct _mp_machine_hw_i2c_bus_obj_t {
17+
mp_obj_base_t base;
18+
i2c_port_t port : 8;
19+
gpio_num_t scl : 8;
20+
gpio_num_t sda : 8;
21+
uint8_t active : 1;
22+
uint8_t device_count : 5;
23+
mp_machine_hw_i2c_device_obj_t **devices;
24+
uint32_t freq;
25+
uint32_t timeout_us;
26+
uint8_t use_locks : 1;
27+
uint8_t pullup : 1;
28+
};
29+
30+
struct _mp_machine_hw_i2c_device_obj_t {
31+
mp_obj_base_t base;
32+
uint16_t device_id;
33+
uint8_t reg_bits;
34+
i2c_bus_lock_t lock;
35+
mp_machine_hw_i2c_bus_obj_t *bus;
36+
};
37+
38+
extern const mp_obj_type_t mp_machine_hw_i2c_device_type;
39+
extern const mp_obj_type_t mp_machine_hw_i2c_bus_type;
40+
41+
void mp_machine_hw_i2c_bus_deinit_all(void);
42+
43+
#endif /* __MP_I2C_COMMON_H__ */
44+

0 commit comments

Comments
 (0)