forked from dragonlock2/MMv3
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathcircuitpython.patch
More file actions
85 lines (79 loc) · 3.74 KB
/
circuitpython.patch
File metadata and controls
85 lines (79 loc) · 3.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
diff --git a/shared-module/onewireio/OneWire.c b/shared-module/onewireio/OneWire.c
index aeb4dcb00..162321859 100644
--- a/shared-module/onewireio/OneWire.c
+++ b/shared-module/onewireio/OneWire.c
@@ -29,12 +29,17 @@
#include "shared-bindings/microcontroller/__init__.h"
#include "shared-bindings/digitalio/DigitalInOut.h"
+#include "ports/raspberrypi/sdk/src/rp2_common/hardware_timer/include/hardware/timer.h"
+#include "ports/raspberrypi/sdk/src/rp2_common/hardware_gpio/include/hardware/gpio.h"
+
// Durations are taken from here: https://www.maximintegrated.com/en/app-notes/index.mvp/id/126
void common_hal_onewireio_onewire_construct(onewireio_onewire_obj_t *self,
const mcu_pin_obj_t *pin) {
self->pin.base.type = &digitalio_digitalinout_type;
common_hal_digitalio_digitalinout_construct(&self->pin, pin);
+ common_hal_digitalio_digitalinout_switch_to_output(&self->pin, false, DRIVE_MODE_OPEN_DRAIN);
+ gpio_set_dir(self->pin.pin->number, GPIO_IN); // od high
}
bool common_hal_onewireio_onewire_deinited(onewireio_onewire_obj_t *self) {
@@ -52,38 +57,43 @@ void common_hal_onewireio_onewire_deinit(onewireio_onewire_obj_t *self) {
// to do accurate timekeeping, since we disable interrupts during the delays below.
bool common_hal_onewireio_onewire_reset(onewireio_onewire_obj_t *self) {
+ const uint8_t pin = self->pin.pin->number;
+ gpio_set_dir(pin, GPIO_OUT); // od low
+ busy_wait_us_32(70);
common_hal_mcu_disable_interrupts();
- common_hal_digitalio_digitalinout_switch_to_output(&self->pin, false, DRIVE_MODE_OPEN_DRAIN);
- common_hal_mcu_delay_us(480);
- common_hal_digitalio_digitalinout_switch_to_input(&self->pin, PULL_NONE);
- common_hal_mcu_delay_us(70);
- bool value = common_hal_digitalio_digitalinout_get_value(&self->pin);
- common_hal_mcu_delay_us(410);
+ gpio_set_dir(pin, GPIO_IN); // od high
+ busy_wait_us_32(9);
+ bool value = gpio_get(pin);
common_hal_mcu_enable_interrupts();
+ busy_wait_us_32(40);
return value;
}
bool common_hal_onewireio_onewire_read_bit(onewireio_onewire_obj_t *self) {
+ const uint8_t pin = self->pin.pin->number;
+ gpio_set_dir(pin, GPIO_IN); // od high
common_hal_mcu_disable_interrupts();
- common_hal_digitalio_digitalinout_switch_to_output(&self->pin, false, DRIVE_MODE_OPEN_DRAIN);
- common_hal_mcu_delay_us(6);
- common_hal_digitalio_digitalinout_switch_to_input(&self->pin, PULL_NONE);
- // TODO(tannewt): Test with more devices and maybe make the delays
- // configurable. This should be 9 by the datasheet but all bits read as 1
- // then.
- common_hal_mcu_delay_us(6);
- bool value = common_hal_digitalio_digitalinout_get_value(&self->pin);
- common_hal_mcu_delay_us(55);
+ gpio_set_dir(pin, GPIO_OUT); // od low
+ // this generates a 0.75us delay...
+ gpio_set_dir(pin, GPIO_IN); // od high
+ asm volatile("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop");
+ bool value = gpio_get(pin);
common_hal_mcu_enable_interrupts();
+ busy_wait_us_32(9);
return value;
}
void common_hal_onewireio_onewire_write_bit(onewireio_onewire_obj_t *self,
bool bit) {
+ const uint8_t pin = self->pin.pin->number;
common_hal_mcu_disable_interrupts();
- common_hal_digitalio_digitalinout_switch_to_output(&self->pin, false, DRIVE_MODE_OPEN_DRAIN);
- common_hal_mcu_delay_us(bit? 6 : 60);
- common_hal_digitalio_digitalinout_switch_to_input(&self->pin, PULL_NONE);
- common_hal_mcu_delay_us(bit? 64 : 10);
+ gpio_set_dir(pin, GPIO_OUT); // od low
+ // this generates a 0.75us delay...
+ if (bit) {
+ gpio_set_dir(pin, GPIO_IN); // od high
+ }
+ busy_wait_us_32(6);
+ gpio_set_dir(pin, GPIO_IN); // od high
+ busy_wait_us_32(3);
common_hal_mcu_enable_interrupts();
}