Skip to content

Commit 68c640d

Browse files
committed
esp8266/modonewire: Move low-level 1-wire bus code to modonewire.c.
The reason it was separated is so that the low-level code could be put in iRAM, for timing reasons. But: 1. Tests show that it's not necessary to have this code in iRAM for it to function correctly, and taking it out of iRAM reclaims some of that precious resource. Furthermore, even though these functions were in iRAM there were some functions that it called (eg pin get/set functions) which were not in iRAM, so partially defeated the purpose of putting the 1-wire code in iRAM. 2. It's easier to reuse this 1-wire code in other ports if it's in a single file. 3. If it turns out that certain code does need to be in iRAM then one can use the MP_FASTCODE macro to do that.
1 parent d94bc67 commit 68c640d

4 files changed

Lines changed: 62 additions & 124 deletions

File tree

esp8266/Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ SRC_C = \
6868
lexerstr32.c \
6969
uart.c \
7070
esppwm.c \
71-
esponewire.c \
7271
espneopixel.c \
7372
espapa102.c \
7473
intr.c \

esp8266/esponewire.c

Lines changed: 0 additions & 77 deletions
This file was deleted.

esp8266/esponewire.h

Lines changed: 0 additions & 38 deletions
This file was deleted.

esp8266/modonewire.c

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* The MIT License (MIT)
55
*
6-
* Copyright (c) 2015 Damien P. George
6+
* Copyright (c) 2015-2017 Damien P. George
77
*
88
* Permission is hereby granted, free of charge, to any person obtaining a copy
99
* of this software and associated documentation files (the "Software"), to deal
@@ -29,8 +29,62 @@
2929

3030
#include "py/obj.h"
3131
#include "py/mphal.h"
32-
#include "modmachine.h"
33-
#include "esponewire.h"
32+
33+
/******************************************************************************/
34+
// Low-level 1-Wire routines
35+
36+
#define TIMING_RESET1 (0)
37+
#define TIMING_RESET2 (1)
38+
#define TIMING_RESET3 (2)
39+
#define TIMING_READ1 (3)
40+
#define TIMING_READ2 (4)
41+
#define TIMING_READ3 (5)
42+
#define TIMING_WRITE1 (6)
43+
#define TIMING_WRITE2 (7)
44+
#define TIMING_WRITE3 (8)
45+
46+
STATIC uint16_t esp_onewire_timings[9] = {480, 40, 420, 5, 5, 40, 10, 50, 10};
47+
48+
STATIC int onewire_bus_reset(mp_hal_pin_obj_t pin) {
49+
mp_hal_pin_write(pin, 0);
50+
mp_hal_delay_us(esp_onewire_timings[TIMING_RESET1]);
51+
uint32_t i = mp_hal_quiet_timing_enter();
52+
mp_hal_pin_write(pin, 1);
53+
mp_hal_delay_us_fast(esp_onewire_timings[TIMING_RESET2]);
54+
int status = !mp_hal_pin_read(pin);
55+
mp_hal_quiet_timing_exit(i);
56+
mp_hal_delay_us(esp_onewire_timings[TIMING_RESET3]);
57+
return status;
58+
}
59+
60+
STATIC int onewire_bus_readbit(mp_hal_pin_obj_t pin) {
61+
mp_hal_pin_write(pin, 1);
62+
uint32_t i = mp_hal_quiet_timing_enter();
63+
mp_hal_pin_write(pin, 0);
64+
mp_hal_delay_us_fast(esp_onewire_timings[TIMING_READ1]);
65+
mp_hal_pin_write(pin, 1);
66+
mp_hal_delay_us_fast(esp_onewire_timings[TIMING_READ2]);
67+
int value = mp_hal_pin_read(pin);
68+
mp_hal_quiet_timing_exit(i);
69+
mp_hal_delay_us_fast(esp_onewire_timings[TIMING_READ3]);
70+
return value;
71+
}
72+
73+
STATIC void onewire_bus_writebit(mp_hal_pin_obj_t pin, int value) {
74+
uint32_t i = mp_hal_quiet_timing_enter();
75+
mp_hal_pin_write(pin, 0);
76+
mp_hal_delay_us_fast(esp_onewire_timings[TIMING_WRITE1]);
77+
if (value) {
78+
mp_hal_pin_write(pin, 1);
79+
}
80+
mp_hal_delay_us_fast(esp_onewire_timings[TIMING_WRITE2]);
81+
mp_hal_pin_write(pin, 1);
82+
mp_hal_delay_us_fast(esp_onewire_timings[TIMING_WRITE3]);
83+
mp_hal_quiet_timing_exit(i);
84+
}
85+
86+
/******************************************************************************/
87+
// MicroPython bindings
3488

3589
STATIC mp_obj_t onewire_timings(mp_obj_t timings_in) {
3690
mp_obj_t *items;
@@ -43,27 +97,27 @@ STATIC mp_obj_t onewire_timings(mp_obj_t timings_in) {
4397
STATIC MP_DEFINE_CONST_FUN_OBJ_1(onewire_timings_obj, onewire_timings);
4498

4599
STATIC mp_obj_t onewire_reset(mp_obj_t pin_in) {
46-
return mp_obj_new_bool(esp_onewire_reset(mp_hal_get_pin_obj(pin_in)));
100+
return mp_obj_new_bool(onewire_bus_reset(mp_hal_get_pin_obj(pin_in)));
47101
}
48102
STATIC MP_DEFINE_CONST_FUN_OBJ_1(onewire_reset_obj, onewire_reset);
49103

50104
STATIC mp_obj_t onewire_readbit(mp_obj_t pin_in) {
51-
return MP_OBJ_NEW_SMALL_INT(esp_onewire_readbit(mp_hal_get_pin_obj(pin_in)));
105+
return MP_OBJ_NEW_SMALL_INT(onewire_bus_readbit(mp_hal_get_pin_obj(pin_in)));
52106
}
53107
STATIC MP_DEFINE_CONST_FUN_OBJ_1(onewire_readbit_obj, onewire_readbit);
54108

55109
STATIC mp_obj_t onewire_readbyte(mp_obj_t pin_in) {
56110
mp_hal_pin_obj_t pin = mp_hal_get_pin_obj(pin_in);
57111
uint8_t value = 0;
58112
for (int i = 0; i < 8; ++i) {
59-
value |= esp_onewire_readbit(pin) << i;
113+
value |= onewire_bus_readbit(pin) << i;
60114
}
61115
return MP_OBJ_NEW_SMALL_INT(value);
62116
}
63117
STATIC MP_DEFINE_CONST_FUN_OBJ_1(onewire_readbyte_obj, onewire_readbyte);
64118

65119
STATIC mp_obj_t onewire_writebit(mp_obj_t pin_in, mp_obj_t value_in) {
66-
esp_onewire_writebit(mp_hal_get_pin_obj(pin_in), mp_obj_get_int(value_in));
120+
onewire_bus_writebit(mp_hal_get_pin_obj(pin_in), mp_obj_get_int(value_in));
67121
return mp_const_none;
68122
}
69123
STATIC MP_DEFINE_CONST_FUN_OBJ_2(onewire_writebit_obj, onewire_writebit);
@@ -72,7 +126,7 @@ STATIC mp_obj_t onewire_writebyte(mp_obj_t pin_in, mp_obj_t value_in) {
72126
mp_hal_pin_obj_t pin = mp_hal_get_pin_obj(pin_in);
73127
int value = mp_obj_get_int(value_in);
74128
for (int i = 0; i < 8; ++i) {
75-
esp_onewire_writebit(pin, value & 1);
129+
onewire_bus_writebit(pin, value & 1);
76130
value >>= 1;
77131
}
78132
return mp_const_none;

0 commit comments

Comments
 (0)