diff --git a/esp8266/Makefile b/esp8266/Makefile index 483e8d59a1..f36e283b1f 100644 --- a/esp8266/Makefile +++ b/esp8266/Makefile @@ -60,6 +60,7 @@ SRC_C = \ lexerstr32.c \ uart.c \ esppwm.c \ + esponewire.c \ espneopixel.c \ intr.c \ modpyb.c \ diff --git a/esp8266/esp8266.ld b/esp8266/esp8266.ld index 2c38e1c82d..221782cf2d 100644 --- a/esp8266/esp8266.ld +++ b/esp8266/esp8266.ld @@ -146,6 +146,7 @@ SECTIONS *modutime.o(.literal* .text*) *modlwip.o(.literal* .text*) *modsocket.o(.literal* .text*) + *modonewire.o(.literal* .text*) /* we put as much rodata as possible in this section */ /* note that only rodata accessed as a machine word is allowed here */ diff --git a/esp8266/esponewire.c b/esp8266/esponewire.c new file mode 100644 index 0000000000..797ec0bd22 --- /dev/null +++ b/esp8266/esponewire.c @@ -0,0 +1,99 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015-2016 Damien P. George + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include + +#include "etshal.h" +#include "user_interface.h" +#include "modpyb.h" +#include "esponewire.h" + +#define TIMING_RESET1 (0) +#define TIMING_RESET2 (1) +#define TIMING_RESET3 (2) +#define TIMING_READ1 (3) +#define TIMING_READ2 (4) +#define TIMING_READ3 (5) +#define TIMING_WRITE1 (6) +#define TIMING_WRITE2 (7) +#define TIMING_WRITE3 (8) + +uint16_t esp_onewire_timings[9] = {480, 40, 420, 5, 5, 40, 10, 50, 10}; + +static uint32_t disable_irq(void) { + ets_intr_lock(); + return 0; +} + +static void enable_irq(uint32_t i) { + ets_intr_unlock(); +} + +static void mp_hal_delay_us_no_irq(uint32_t us) { + uint32_t start = system_get_time(); + while (system_get_time() - start < us) { + } +} + +#define DELAY_US mp_hal_delay_us_no_irq + +int esp_onewire_reset(uint pin) { + pin_set(pin, 0); + DELAY_US(esp_onewire_timings[TIMING_RESET1]); + uint32_t i = disable_irq(); + pin_set(pin, 1); + DELAY_US(esp_onewire_timings[TIMING_RESET2]); + int status = !pin_get(pin); + enable_irq(i); + DELAY_US(esp_onewire_timings[TIMING_RESET3]); + return status; +} + +int esp_onewire_readbit(uint pin) { + pin_set(pin, 1); + uint32_t i = disable_irq(); + pin_set(pin, 0); + DELAY_US(esp_onewire_timings[TIMING_READ1]); + pin_set(pin, 1); + DELAY_US(esp_onewire_timings[TIMING_READ2]); + int value = pin_get(pin); + enable_irq(i); + DELAY_US(esp_onewire_timings[TIMING_READ3]); + return value; +} + +void esp_onewire_writebit(uint pin, int value) { + uint32_t i = disable_irq(); + pin_set(pin, 0); + DELAY_US(esp_onewire_timings[TIMING_WRITE1]); + if (value) { + pin_set(pin, 1); + } + DELAY_US(esp_onewire_timings[TIMING_WRITE2]); + pin_set(pin, 1); + DELAY_US(esp_onewire_timings[TIMING_WRITE3]); + enable_irq(i); +} diff --git a/esp8266/esponewire.h b/esp8266/esponewire.h new file mode 100644 index 0000000000..da0a1d3880 --- /dev/null +++ b/esp8266/esponewire.h @@ -0,0 +1,36 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2016 Damien P. George + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef __MICROPY_INCLUDED_ESP8266_ESPONEWIRE_H__ +#define __MICROPY_INCLUDED_ESP8266_ESPONEWIRE_H__ + +extern uint16_t esp_onewire_timings[9]; + +int esp_onewire_reset(uint pin); +int esp_onewire_readbit(uint pin); +void esp_onewire_writebit(uint pin, int value); + +#endif // __MICROPY_INCLUDED_ESP8266_ESPONEWIRE_H__ diff --git a/esp8266/modonewire.c b/esp8266/modonewire.c index 267da281ed..0fcf1ab6a6 100644 --- a/esp8266/modonewire.c +++ b/esp8266/modonewire.c @@ -27,80 +27,28 @@ #include #include -#include "etshal.h" -#include "user_interface.h" #include "py/obj.h" #include "py/mphal.h" #include "modpyb.h" - -STATIC uint32_t disable_irq(void) { - ets_intr_lock(); - return 0; -} - -STATIC void enable_irq(uint32_t i) { - ets_intr_unlock(); -} - -STATIC void mp_hal_delay_us_no_irq(uint32_t us) { - uint32_t start = system_get_time(); - while (system_get_time() - start < us) { - } -} - -#define DELAY_US mp_hal_delay_us_no_irq - -#define TIMING_RESET1 (0) -#define TIMING_RESET2 (1) -#define TIMING_RESET3 (2) -#define TIMING_READ1 (3) -#define TIMING_READ2 (4) -#define TIMING_READ3 (5) -#define TIMING_WRITE1 (6) -#define TIMING_WRITE2 (7) -#define TIMING_WRITE3 (8) - -static int timings[] = {480, 40, 420, 5, 5, 40, 10, 50, 10}; +#include "esponewire.h" STATIC mp_obj_t onewire_timings(mp_obj_t timings_in) { mp_obj_t *items; mp_obj_get_array_fixed_n(timings_in, 9, &items); for (int i = 0; i < 9; ++i) { - timings[i] = mp_obj_get_int(items[i]); + esp_onewire_timings[i] = mp_obj_get_int(items[i]); } return mp_const_none; } STATIC MP_DEFINE_CONST_FUN_OBJ_1(onewire_timings_obj, onewire_timings); STATIC mp_obj_t onewire_reset(mp_obj_t pin_in) { - uint pin = mp_obj_get_pin(pin_in); - pin_set(pin, 0); - DELAY_US(timings[TIMING_RESET1]); - uint32_t i = disable_irq(); - pin_set(pin, 1); - DELAY_US(timings[TIMING_RESET2]); - int status = !pin_get(pin); - enable_irq(i); - DELAY_US(timings[TIMING_RESET3]); - return mp_obj_new_bool(status); + return mp_obj_new_bool(esp_onewire_reset(mp_obj_get_pin(pin_in))); } STATIC MP_DEFINE_CONST_FUN_OBJ_1(onewire_reset_obj, onewire_reset); -STATIC int _onewire_readbit(uint pin) { - pin_set(pin, 1); - uint32_t i = disable_irq(); - pin_set(pin, 0); - DELAY_US(timings[TIMING_READ1]); - pin_set(pin, 1); - DELAY_US(timings[TIMING_READ2]); - int value = pin_get(pin); - enable_irq(i); - DELAY_US(timings[TIMING_READ3]); - return value; -} - STATIC mp_obj_t onewire_readbit(mp_obj_t pin_in) { - return MP_OBJ_NEW_SMALL_INT(_onewire_readbit(mp_obj_get_pin(pin_in))); + return MP_OBJ_NEW_SMALL_INT(esp_onewire_readbit(mp_obj_get_pin(pin_in))); } STATIC MP_DEFINE_CONST_FUN_OBJ_1(onewire_readbit_obj, onewire_readbit); @@ -108,25 +56,14 @@ STATIC mp_obj_t onewire_readbyte(mp_obj_t pin_in) { uint pin = mp_obj_get_pin(pin_in); uint8_t value = 0; for (int i = 0; i < 8; ++i) { - value |= _onewire_readbit(pin) << i; + value |= esp_onewire_readbit(pin) << i; } return MP_OBJ_NEW_SMALL_INT(value); } STATIC MP_DEFINE_CONST_FUN_OBJ_1(onewire_readbyte_obj, onewire_readbyte); -STATIC void _onewire_writebit(uint pin, int value) { - uint32_t i = disable_irq(); - pin_set(pin, 0); - DELAY_US(timings[TIMING_WRITE1]); - pin_set(pin, value); - DELAY_US(timings[TIMING_WRITE2]); - pin_set(pin, 1); - DELAY_US(timings[TIMING_WRITE3]); - enable_irq(i); -} - STATIC mp_obj_t onewire_writebit(mp_obj_t pin_in, mp_obj_t value_in) { - _onewire_writebit(mp_obj_get_pin(pin_in), mp_obj_get_int(value_in)); + esp_onewire_writebit(mp_obj_get_pin(pin_in), mp_obj_get_int(value_in)); return mp_const_none; } STATIC MP_DEFINE_CONST_FUN_OBJ_2(onewire_writebit_obj, onewire_writebit); @@ -135,7 +72,7 @@ STATIC mp_obj_t onewire_writebyte(mp_obj_t pin_in, mp_obj_t value_in) { uint pin = mp_obj_get_pin(pin_in); int value = mp_obj_get_int(value_in); for (int i = 0; i < 8; ++i) { - _onewire_writebit(pin, value & 1); + esp_onewire_writebit(pin, value & 1); value >>= 1; } return mp_const_none;