From 367a6e3a3dd370fd43f4d19955a4c56abd007824 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Thu, 24 Aug 2017 16:09:13 -0400 Subject: [PATCH 1/6] Checkpoint: Python interface finished. microcontroller.core.temperature. Dummy value returned for now. --- atmel-samd/Makefile | 1 + atmel-samd/common-hal/microcontroller/core.c | 34 +++++++ shared-bindings/microcontroller/__init__.c | 2 + shared-bindings/microcontroller/core.c | 93 ++++++++++++++++++++ shared-bindings/microcontroller/core.h | 36 ++++++++ 5 files changed, 166 insertions(+) create mode 100644 atmel-samd/common-hal/microcontroller/core.c create mode 100644 shared-bindings/microcontroller/core.c create mode 100644 shared-bindings/microcontroller/core.h diff --git a/atmel-samd/Makefile b/atmel-samd/Makefile index 913461261ae..cca4fb77fa2 100644 --- a/atmel-samd/Makefile +++ b/atmel-samd/Makefile @@ -250,6 +250,7 @@ SRC_COMMON_HAL = \ digitalio/__init__.c \ digitalio/DigitalInOut.c \ microcontroller/__init__.c \ + microcontroller/core.c \ microcontroller/Pin.c \ neopixel_write/__init__.c \ os/__init__.c \ diff --git a/atmel-samd/common-hal/microcontroller/core.c b/atmel-samd/common-hal/microcontroller/core.c new file mode 100644 index 00000000000..4af06e84ef9 --- /dev/null +++ b/atmel-samd/common-hal/microcontroller/core.c @@ -0,0 +1,34 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2016 Dan Halbert for Adafruit Industries + * + * 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 "py/mphal.h" + +#include "samd21_pins.h" + +float common_hal_mcu_core_get_temperature(void) { + // TODO: Fake computation for now + return 123.0F; +} diff --git a/shared-bindings/microcontroller/__init__.c b/shared-bindings/microcontroller/__init__.c index fbe359ed943..c0e5ce331a0 100644 --- a/shared-bindings/microcontroller/__init__.c +++ b/shared-bindings/microcontroller/__init__.c @@ -33,6 +33,7 @@ #include "py/runtime.h" #include "shared-bindings/microcontroller/__init__.h" +#include "shared-bindings/microcontroller/core.h" #include "shared-bindings/microcontroller/Pin.h" #include "common-hal/microcontroller/Pin.h" @@ -107,6 +108,7 @@ const mp_obj_module_t mcu_pin_module = { STATIC const mp_rom_map_elem_t mcu_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_microcontroller) }, { MP_ROM_QSTR(MP_QSTR_delay_us), MP_ROM_PTR(&mcu_delay_us_obj) }, + { MP_ROM_QSTR(MP_QSTR_core), MP_ROM_PTR(&mcu_core_obj) }, { MP_ROM_QSTR(MP_QSTR_disable_interrupts), MP_ROM_PTR(&mcu_disable_interrupts_obj) }, { MP_ROM_QSTR(MP_QSTR_enable_interrupts), MP_ROM_PTR(&mcu_enable_interrupts_obj) }, { MP_ROM_QSTR(MP_QSTR_Pin), MP_ROM_PTR(&mcu_pin_type) }, diff --git a/shared-bindings/microcontroller/core.c b/shared-bindings/microcontroller/core.c new file mode 100644 index 00000000000..eb58805527a --- /dev/null +++ b/shared-bindings/microcontroller/core.c @@ -0,0 +1,93 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Dan Halbert for Adafruit Industries + * + * 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. + */ + +// Microcontroller contains pin references and microcontroller specific control +// functions. + +#include + +#include "py/obj.h" +#include "py/objproperty.h" +#include "py/runtime.h" + +#include "shared-bindings/microcontroller/core.h" + +// Forward declaration due to circularity. +const mp_obj_type_t mcu_core_type; +// there is a singleton microcontroller.core object +const mp_obj_base_t mcu_core_obj = {&mcu_core_type}; + +STATIC mp_obj_t mcu_core_obj_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { + // check arguments + mp_arg_check_num(n_args, n_kw, 0, 0, false); + + // return singleton object + return (mp_obj_t)&mcu_core_obj; +} + +//| :mod:`microcontroller.core` --- Microcontroller core information and control +//| -------------------------------------------------------- +//| +//| .. module:: microcontroller.core +//| :synopsis: Microcontroller core information and control +//| :platform: SAMD21 +//| +//| Get basic info about the code (chip) itself and control it. +//| + +//| .. attribute:: temperature +//| +//| Return the core (on-chip) temperature, in Fahrenheit. +//| +STATIC mp_obj_t mcu_core_obj_get_temperature(mp_obj_t self) { + return mp_obj_new_float(common_hal_mcu_core_get_temperature()); +} + +MP_DEFINE_CONST_FUN_OBJ_1(mcu_core_get_temperature_obj, mcu_core_obj_get_temperature); + +const mp_obj_property_t mcu_core_temperature_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&mcu_core_get_temperature_obj, // getter + (mp_obj_t)&mp_const_none_obj, // no setter + (mp_obj_t)&mp_const_none_obj, // no deleter + }, +}; + +STATIC const mp_map_elem_t mcu_core_obj_locals_dict_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR_temperature), (mp_obj_t)&mcu_core_temperature_obj }, +}; + +STATIC MP_DEFINE_CONST_DICT(mcu_core_obj_locals_dict, mcu_core_obj_locals_dict_table); + +const mp_obj_type_t mcu_core_type = { + { &mp_type_type }, + .name = MP_QSTR_core, + .make_new = mcu_core_obj_make_new, + .locals_dict = (mp_obj_t)&mcu_core_obj_locals_dict, +}; + + + diff --git a/shared-bindings/microcontroller/core.h b/shared-bindings/microcontroller/core.h new file mode 100644 index 00000000000..e6616ce59b5 --- /dev/null +++ b/shared-bindings/microcontroller/core.h @@ -0,0 +1,36 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Dan Halbert for Adafruit Industries + * + * 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_SHARED_BINDINGS_MICROCONTROLLER___CORE___H__ +#define __MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER___CORE___H__ + +#include "py/obj.h" + +extern const mp_obj_base_t mcu_core_obj; + +float common_hal_mcu_core_get_temperature(void); + +#endif // __MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER___CORE___H__ From 0267c45268569f79633630ad7329d4ba89a1828b Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Tue, 29 Aug 2017 13:45:44 -0400 Subject: [PATCH 2/6] Finish core.temperature. Add core.frequency. Squeeze firmware size by using -finline-limit. Otherwise non-Express builds were slightly too big. --- atmel-samd/Makefile | 4 +- atmel-samd/common-hal/microcontroller/core.c | 220 +++++++++++++++++-- shared-bindings/microcontroller/__init__.c | 4 +- shared-bindings/microcontroller/core.c | 25 ++- shared-bindings/microcontroller/core.h | 1 + 5 files changed, 226 insertions(+), 28 deletions(-) diff --git a/atmel-samd/Makefile b/atmel-samd/Makefile index ae637b973c0..3b2af17eebd 100644 --- a/atmel-samd/Makefile +++ b/atmel-samd/Makefile @@ -135,7 +135,9 @@ ifeq ($(DEBUG), 1) # -DMICROPY_DEBUG_MODULES may also be added to an -flto build, if you wish. CFLAGS += -Os -ggdb -DNDEBUG -DENABLE_MICRO_TRACE_BUFFER -DMICROPY_DEBUG_MODULES else -CFLAGS += -Os -DNDEBUG -flto +# -finline-limit can shrink the image size. -finline-limit=80 or so is similar to not having it on. +# There is no simple default value, though. +CFLAGS += -Os -DNDEBUG -flto -finline-limit=57 endif ifneq ($(FROZEN_DIR),) diff --git a/atmel-samd/common-hal/microcontroller/core.c b/atmel-samd/common-hal/microcontroller/core.c index 4af06e84ef9..ee2efac318b 100644 --- a/atmel-samd/common-hal/microcontroller/core.c +++ b/atmel-samd/common-hal/microcontroller/core.c @@ -1,34 +1,210 @@ /* - * This file is part of the MicroPython project, http://micropython.org/ + * Includes code from ASF sample code adc_temp.h and adc_temp.c, + * and so includes this license: * - * The MIT License (MIT) + * Copyright (C) 2015 Atmel Corporation. All rights reserved. * - * Copyright (c) 2016 Dan Halbert for Adafruit Industries + * License * - * 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: + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. * - * 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. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. */ -#include "py/mphal.h" +#include "py/obj.h" +#include "py/runtime.h" + +// Don't reorder these includes because they are dependencies of adc_feature.h. +// They should really be included by adc_feature.h. +#include +#include "asf/sam0/drivers/system/clock/gclk.h" +#include "asf/sam0/utils/cmsis/samd21/include/component/adc.h" + +#include "asf/sam0/drivers/adc/adc_sam_d_r/adc_feature.h" +#include "asf/sam0/drivers/adc/adc.h" + +#define ADC_TEMP_SAMPLE_LENGTH 4 +#define INT1V_VALUE_FLOAT 1.0 +#define INT1V_DIVIDER_1000 1000.0 +#define ADC_12BIT_FULL_SCALE_VALUE_FLOAT 4095.0 + +typedef struct nvm_calibration_data_t { + float tempR; // Production Room temperature + float tempH; // Production Hot temperature + float INT1VR; // Room temp 2's complement of the internal 1V reference value + float INT1VH; // Hot temp 2's complement of the internal 1V reference value + uint16_t ADCR; // Production Room temperature ADC value + uint16_t ADCH; // Production Hot temperature ADC value + float VADCR; // Room temperature ADC voltage + float VADCH; // Hot temperature ADC voltage +} nvm_calibration_data_t; + -#include "samd21_pins.h" +// Decimal to fraction conversion. (adapted from ASF sample). +STATIC float convert_dec_to_frac(uint8_t val) { + float float_val = (float)val; + if (val < 10) { + return (float_val/10.0); + } else if (val < 100) { + return (float_val/100.0); + } else { + return (float_val/1000.0); + } +} + +STATIC void configure_adc_temp(struct adc_module *adc_instance) { + struct adc_config config_adc; + adc_get_config_defaults(&config_adc); + + // The parameters chosen here are from the temperature example in: + // http://www.atmel.com/images/Atmel-42645-ADC-Configurations-with-Examples_ApplicationNote_AT11481.pdf + // That note also recommends in general: + // "Discard the first conversion result whenever there is a change + // in ADC configuration like voltage reference / ADC channel change." + + config_adc.clock_prescaler = ADC_CLOCK_PRESCALER_DIV16; + config_adc.reference = ADC_REFERENCE_INT1V; + config_adc.positive_input = ADC_POSITIVE_INPUT_TEMP; + config_adc.negative_input = ADC_NEGATIVE_INPUT_GND; + config_adc.sample_length = ADC_TEMP_SAMPLE_LENGTH; + adc_init(adc_instance, ADC, &config_adc); + + // Oversample and decimate. A higher samplenum produces a more stable result. + ADC->AVGCTRL.reg = ADC_AVGCTRL_ADJRES(2) | ADC_AVGCTRL_SAMPLENUM_4; + //ADC->AVGCTRL.reg = ADC_AVGCTRL_ADJRES(4) | ADC_AVGCTRL_SAMPLENUM_16; +} + +// Extract the production calibration data information from NVM (adapted from ASF sample). +// +STATIC void load_calibration_data(nvm_calibration_data_t *cal) { + volatile uint32_t val1; /* Temperature Log Row Content first 32 bits */ + volatile uint32_t val2; /* Temperature Log Row Content another 32 bits */ + uint8_t room_temp_val_int; /* Integer part of room temperature in °C */ + uint8_t room_temp_val_dec; /* Decimal part of room temperature in °C */ + uint8_t hot_temp_val_int; /* Integer part of hot temperature in °C */ + uint8_t hot_temp_val_dec; /* Decimal part of hot temperature in °C */ + int8_t room_int1v_val; /* internal 1V reference drift at room temperature */ + int8_t hot_int1v_val; /* internal 1V reference drift at hot temperature*/ + + uint32_t *temp_log_row_ptr = (uint32_t *)NVMCTRL_TEMP_LOG; + + val1 = *temp_log_row_ptr; + temp_log_row_ptr++; + val2 = *temp_log_row_ptr; + + room_temp_val_int = (uint8_t)((val1 & NVMCTRL_FUSES_ROOM_TEMP_VAL_INT_Msk) >> NVMCTRL_FUSES_ROOM_TEMP_VAL_INT_Pos); + room_temp_val_dec = (uint8_t)((val1 & NVMCTRL_FUSES_ROOM_TEMP_VAL_DEC_Msk) >> NVMCTRL_FUSES_ROOM_TEMP_VAL_DEC_Pos); + + hot_temp_val_int = (uint8_t)((val1 & NVMCTRL_FUSES_HOT_TEMP_VAL_INT_Msk) >> NVMCTRL_FUSES_HOT_TEMP_VAL_INT_Pos); + hot_temp_val_dec = (uint8_t)((val1 & NVMCTRL_FUSES_HOT_TEMP_VAL_DEC_Msk) >> NVMCTRL_FUSES_HOT_TEMP_VAL_DEC_Pos); + + room_int1v_val = (int8_t)((val1 & NVMCTRL_FUSES_ROOM_INT1V_VAL_Msk) >> NVMCTRL_FUSES_ROOM_INT1V_VAL_Pos); + hot_int1v_val = (int8_t)((val2 & NVMCTRL_FUSES_HOT_INT1V_VAL_Msk) >> NVMCTRL_FUSES_HOT_INT1V_VAL_Pos); + + cal->ADCR = (uint16_t)((val2 & NVMCTRL_FUSES_ROOM_ADC_VAL_Msk) >> NVMCTRL_FUSES_ROOM_ADC_VAL_Pos); + + cal->ADCH = (uint16_t)((val2 & NVMCTRL_FUSES_HOT_ADC_VAL_Msk) >> NVMCTRL_FUSES_HOT_ADC_VAL_Pos); + + cal->tempR = room_temp_val_int + convert_dec_to_frac(room_temp_val_dec); + cal->tempH = hot_temp_val_int + convert_dec_to_frac(hot_temp_val_dec); + + cal->INT1VR = 1 - ((float)room_int1v_val/INT1V_DIVIDER_1000); + cal->INT1VH = 1 - ((float)hot_int1v_val/INT1V_DIVIDER_1000); + + cal->VADCR = ((float)cal->ADCR * cal->INT1VR)/ADC_12BIT_FULL_SCALE_VALUE_FLOAT; + cal->VADCH = ((float)cal->ADCH * cal->INT1VH)/ADC_12BIT_FULL_SCALE_VALUE_FLOAT; +} + +/* + * Calculate fine temperature using Equation1 and Equation + * 1b as mentioned in data sheet section "Temperature Sensor Characteristics" + * of Electrical Characteristics. (adapted from ASF sample code). + */ +STATIC float calculate_temperature(uint16_t raw_code, nvm_calibration_data_t *cal) +{ + float VADC; /* Voltage calculation using ADC result for Coarse Temp calculation */ + float VADCM; /* Voltage calculation using ADC result for Fine Temp calculation. */ + float INT1VM; /* Voltage calculation for reality INT1V value during the ADC conversion */ + + VADC = ((float)raw_code * INT1V_VALUE_FLOAT)/ADC_12BIT_FULL_SCALE_VALUE_FLOAT; + + // Hopefully compiler will remove common subepxressions here. + + /* Coarse Temp Calculation by assume INT1V=1V for this ADC conversion */ + float coarse_temp = cal->tempR + (((cal->tempH - cal->tempR)/(cal->VADCH - cal->VADCR)) * (VADC - cal->VADCR)); + + /* Calculation to find the real INT1V value during the ADC conversion */ + INT1VM = cal->INT1VR + (((cal->INT1VH - cal->INT1VR) * (coarse_temp - cal->tempR))/(cal->tempH - cal->tempR)); + + VADCM = ((float)raw_code * INT1VM)/ADC_12BIT_FULL_SCALE_VALUE_FLOAT; + + /* Fine Temp Calculation by replace INT1V=1V by INT1V = INT1Vm for ADC conversion */ + float fine_temp = cal->tempR + (((cal->tempH - cal->tempR)/(cal->VADCH - cal->VADCR)) * (VADCM - cal->VADCR)); + + return fine_temp; +} + + +// External interface. +// float common_hal_mcu_core_get_temperature(void) { - // TODO: Fake computation for now - return 123.0F; + struct adc_module adc_instance_struct; + + system_voltage_reference_enable(SYSTEM_VOLTAGE_REFERENCE_TEMPSENSE); + configure_adc_temp(&adc_instance_struct); + nvm_calibration_data_t nvm_calibration_data; + load_calibration_data(&nvm_calibration_data); + + adc_enable(&adc_instance_struct); + + uint16_t data; + enum status_code status; + + // Read twice and discard first result, as recommended in section 14 of + // http://www.atmel.com/images/Atmel-42645-ADC-Configurations-with-Examples_ApplicationNote_AT11481.pdf + // "Discard the first conversion result whenever there is a change in ADC configuration + // like voltage reference / ADC channel change" + // Empirical observation shows the first reading is quite different than subsequent ones. + + adc_start_conversion(&adc_instance_struct); + do { + status = adc_read(&adc_instance_struct, &data); + } while (status == STATUS_BUSY); + + adc_start_conversion(&adc_instance_struct); + do { + status = adc_read(&adc_instance_struct, &data); + } while (status == STATUS_BUSY); + + return calculate_temperature(data, &nvm_calibration_data); +} + + +float common_hal_mcu_core_get_frequency(void) { + return (float) system_cpu_clock_get_hz(); } diff --git a/shared-bindings/microcontroller/__init__.c b/shared-bindings/microcontroller/__init__.c index c004ac6ba2a..a88aaa376ad 100644 --- a/shared-bindings/microcontroller/__init__.c +++ b/shared-bindings/microcontroller/__init__.c @@ -118,9 +118,9 @@ STATIC const mp_rom_map_elem_t mcu_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_disable_interrupts), MP_ROM_PTR(&mcu_disable_interrupts_obj) }, { MP_ROM_QSTR(MP_QSTR_enable_interrupts), MP_ROM_PTR(&mcu_enable_interrupts_obj) }, #if CIRCUITPY_INTERNAL_NVM_SIZE > 0 - { MP_ROM_QSTR(MP_QSTR_nvm), &common_hal_mcu_nvm_obj }, + { MP_ROM_QSTR(MP_QSTR_nvm), MP_ROM_PTR(&common_hal_mcu_nvm_obj) }, #else - { MP_ROM_QSTR(MP_QSTR_nvm), &mp_const_none_obj }, + { MP_ROM_QSTR(MP_QSTR_nvm), MP_ROM_PTR(&mp_const_none_obj) }, #endif { MP_ROM_QSTR(MP_QSTR_Pin), MP_ROM_PTR(&mcu_pin_type) }, { MP_ROM_QSTR(MP_QSTR_pin), MP_ROM_PTR(&mcu_pin_module) }, diff --git a/shared-bindings/microcontroller/core.c b/shared-bindings/microcontroller/core.c index eb58805527a..e7c09e3d4b1 100644 --- a/shared-bindings/microcontroller/core.c +++ b/shared-bindings/microcontroller/core.c @@ -58,9 +58,27 @@ STATIC mp_obj_t mcu_core_obj_make_new(const mp_obj_type_t *type, size_t n_args, //| Get basic info about the code (chip) itself and control it. //| +//| .. attribute:: frequency +//| +//| Return the CPU operating frequency as a float, in Hz. +//| +STATIC mp_obj_t mcu_core_obj_get_frequency(mp_obj_t self) { + return mp_obj_new_float(common_hal_mcu_core_get_frequency()); +} + +MP_DEFINE_CONST_FUN_OBJ_1(mcu_core_get_frequency_obj, mcu_core_obj_get_frequency); + +const mp_obj_property_t mcu_core_frequency_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&mcu_core_get_frequency_obj, // getter + (mp_obj_t)&mp_const_none_obj, // no setter + (mp_obj_t)&mp_const_none_obj, // no deleter + }, +}; + //| .. attribute:: temperature //| -//| Return the core (on-chip) temperature, in Fahrenheit. +//| Return the core (on-chip) temperature, in Celsius. //| STATIC mp_obj_t mcu_core_obj_get_temperature(mp_obj_t self) { return mp_obj_new_float(common_hal_mcu_core_get_temperature()); @@ -76,8 +94,9 @@ const mp_obj_property_t mcu_core_temperature_obj = { }, }; -STATIC const mp_map_elem_t mcu_core_obj_locals_dict_table[] = { - { MP_OBJ_NEW_QSTR(MP_QSTR_temperature), (mp_obj_t)&mcu_core_temperature_obj }, +STATIC const mp_rom_map_elem_t mcu_core_obj_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&mcu_core_frequency_obj) }, + { MP_ROM_QSTR(MP_QSTR_temperature), MP_ROM_PTR(&mcu_core_temperature_obj) }, }; STATIC MP_DEFINE_CONST_DICT(mcu_core_obj_locals_dict, mcu_core_obj_locals_dict_table); diff --git a/shared-bindings/microcontroller/core.h b/shared-bindings/microcontroller/core.h index e6616ce59b5..1915d18f5ca 100644 --- a/shared-bindings/microcontroller/core.h +++ b/shared-bindings/microcontroller/core.h @@ -31,6 +31,7 @@ extern const mp_obj_base_t mcu_core_obj; +float common_hal_mcu_core_get_frequency(void); float common_hal_mcu_core_get_temperature(void); #endif // __MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER___CORE___H__ From 55a6555b5333549aa16da94f47ba27de5fa3d8d3 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Tue, 29 Aug 2017 14:08:48 -0400 Subject: [PATCH 3/6] Update submodules. --- atmel-samd/freetouch | 2 +- lib/axtls | 2 +- shared-bindings/busio/UART.c | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/atmel-samd/freetouch b/atmel-samd/freetouch index 7d8a8f99989..1f21fde3fed 160000 --- a/atmel-samd/freetouch +++ b/atmel-samd/freetouch @@ -1 +1 @@ -Subproject commit 7d8a8f99989a4de5b3fbf491df956d1aaca2c172 +Subproject commit 1f21fde3fed141950b9dcc1b608733bce2ed212e diff --git a/lib/axtls b/lib/axtls index 9b3092eb3b4..67d27df4b5d 160000 --- a/lib/axtls +++ b/lib/axtls @@ -1 +1 @@ -Subproject commit 9b3092eb3b4b230a63c0c389bfbd3c55682c620f +Subproject commit 67d27df4b5d097e146599fc4fb160a2adcbf5632 diff --git a/shared-bindings/busio/UART.c b/shared-bindings/busio/UART.c index 0939910dcf5..ee23ff05535 100644 --- a/shared-bindings/busio/UART.c +++ b/shared-bindings/busio/UART.c @@ -147,7 +147,9 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(busio_uart___exit___obj, 4, 4, busio_ //| .. method:: read(nbytes=None) //| //| Read characters. If ``nbytes`` is specified then read at most that many -//| bytes. Otherwise, read everything that has been buffered. +//| bytes. Otherwise, read everything that arrives until the connection +//| times out. Providing the number of bytes expected is highly recommended +//| because it will be faster. //| //| :return: Data read //| :rtype: bytes or None From 9500e6236b860d33b4aed4193d6571c6df545f10 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Tue, 29 Aug 2017 15:20:53 -0400 Subject: [PATCH 4/6] fix submodule commits --- atmel-samd/freetouch | 2 +- lib/axtls | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/atmel-samd/freetouch b/atmel-samd/freetouch index 1f21fde3fed..7d8a8f99989 160000 --- a/atmel-samd/freetouch +++ b/atmel-samd/freetouch @@ -1 +1 @@ -Subproject commit 1f21fde3fed141950b9dcc1b608733bce2ed212e +Subproject commit 7d8a8f99989a4de5b3fbf491df956d1aaca2c172 diff --git a/lib/axtls b/lib/axtls index 67d27df4b5d..9b3092eb3b4 160000 --- a/lib/axtls +++ b/lib/axtls @@ -1 +1 @@ -Subproject commit 67d27df4b5d097e146599fc4fb160a2adcbf5632 +Subproject commit 9b3092eb3b4b230a63c0c389bfbd3c55682c620f From 536731bbdcd25ee40a6b8ba3bc1e775ebacdc98a Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Tue, 29 Aug 2017 15:34:36 -0400 Subject: [PATCH 5/6] core.frequency is now int instead of float --- atmel-samd/common-hal/microcontroller/core.c | 4 ++-- shared-bindings/microcontroller/core.c | 4 ++-- shared-bindings/microcontroller/core.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/atmel-samd/common-hal/microcontroller/core.c b/atmel-samd/common-hal/microcontroller/core.c index ee2efac318b..8e18b60374d 100644 --- a/atmel-samd/common-hal/microcontroller/core.c +++ b/atmel-samd/common-hal/microcontroller/core.c @@ -205,6 +205,6 @@ float common_hal_mcu_core_get_temperature(void) { } -float common_hal_mcu_core_get_frequency(void) { - return (float) system_cpu_clock_get_hz(); +uint32_t common_hal_mcu_core_get_frequency(void) { + return system_cpu_clock_get_hz(); } diff --git a/shared-bindings/microcontroller/core.c b/shared-bindings/microcontroller/core.c index e7c09e3d4b1..ca601a76389 100644 --- a/shared-bindings/microcontroller/core.c +++ b/shared-bindings/microcontroller/core.c @@ -60,10 +60,10 @@ STATIC mp_obj_t mcu_core_obj_make_new(const mp_obj_type_t *type, size_t n_args, //| .. attribute:: frequency //| -//| Return the CPU operating frequency as a float, in Hz. +//| Return the CPU operating frequency as an int, in Hz. //| STATIC mp_obj_t mcu_core_obj_get_frequency(mp_obj_t self) { - return mp_obj_new_float(common_hal_mcu_core_get_frequency()); + return mp_obj_new_int_from_uint(common_hal_mcu_core_get_frequency()); } MP_DEFINE_CONST_FUN_OBJ_1(mcu_core_get_frequency_obj, mcu_core_obj_get_frequency); diff --git a/shared-bindings/microcontroller/core.h b/shared-bindings/microcontroller/core.h index 1915d18f5ca..86b1772175d 100644 --- a/shared-bindings/microcontroller/core.h +++ b/shared-bindings/microcontroller/core.h @@ -31,7 +31,7 @@ extern const mp_obj_base_t mcu_core_obj; -float common_hal_mcu_core_get_frequency(void); +uint32_t common_hal_mcu_core_get_frequency(void); float common_hal_mcu_core_get_temperature(void); #endif // __MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER___CORE___H__ From 3a4d91be9fe32d0167a83b5d6a935e12c56a4ad2 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Tue, 29 Aug 2017 20:52:29 -0400 Subject: [PATCH 6/6] Rework `microcontroller.core` so it's a module with a `core.Core` singleton class. Clarify some documentation. Transpose support matrix in `shared-bindings/index.rst`. It was getting r-e-a-l-l-y w-i-d-e, especially after adding `core` and `nvm` entries. --- atmel-samd/Makefile | 3 +- .../{microcontroller/core.c => core/Core.c} | 33 +++++- atmel-samd/common-hal/core/Core.h | 37 ++++++ atmel-samd/common-hal/core/__init__.c | 27 +++++ .../common-hal/microcontroller/__init__.c | 10 ++ atmel-samd/common-hal/nvm/__init__.c | 26 ++++ atmel-samd/mpconfigport.h | 2 + esp8266/Makefile | 2 + esp8266/common-hal/core/Core.c | 40 +++++++ esp8266/common-hal/core/Core.h | 37 ++++++ esp8266/common-hal/core/__init__.c | 27 +++++ esp8266/common-hal/microcontroller/__init__.c | 10 ++ esp8266/esp_mphal.c | 4 + esp8266/mpconfigport.h | 2 + shared-bindings/core/Core.c | 109 +++++++++++++++++ shared-bindings/core/Core.h | 39 ++++++ shared-bindings/core/__init__.c | 64 ++++++++++ .../core.h => core/__init__.h} | 13 +- shared-bindings/index.rst | 33 ++++-- shared-bindings/microcontroller/__init__.c | 13 +- shared-bindings/microcontroller/__init__.h | 5 + shared-bindings/microcontroller/core.c | 112 ------------------ shared-bindings/nvm/ByteArray.c | 4 +- 23 files changed, 512 insertions(+), 140 deletions(-) rename atmel-samd/common-hal/{microcontroller/core.c => core/Core.c} (86%) create mode 100644 atmel-samd/common-hal/core/Core.h create mode 100644 atmel-samd/common-hal/core/__init__.c create mode 100644 esp8266/common-hal/core/Core.c create mode 100644 esp8266/common-hal/core/Core.h create mode 100644 esp8266/common-hal/core/__init__.c create mode 100644 shared-bindings/core/Core.c create mode 100644 shared-bindings/core/Core.h create mode 100644 shared-bindings/core/__init__.c rename shared-bindings/{microcontroller/core.h => core/__init__.h} (76%) delete mode 100644 shared-bindings/microcontroller/core.c diff --git a/atmel-samd/Makefile b/atmel-samd/Makefile index fd9c65fb546..5474bba699c 100644 --- a/atmel-samd/Makefile +++ b/atmel-samd/Makefile @@ -246,10 +246,11 @@ SRC_COMMON_HAL = \ busio/I2C.c \ busio/SPI.c \ busio/UART.c \ + core/__init__.c \ + core/Core.c \ digitalio/__init__.c \ digitalio/DigitalInOut.c \ microcontroller/__init__.c \ - microcontroller/core.c \ microcontroller/Pin.c \ neopixel_write/__init__.c \ nvm/__init__.c \ diff --git a/atmel-samd/common-hal/microcontroller/core.c b/atmel-samd/common-hal/core/Core.c similarity index 86% rename from atmel-samd/common-hal/microcontroller/core.c rename to atmel-samd/common-hal/core/Core.c index 8e18b60374d..d94f564db1c 100644 --- a/atmel-samd/common-hal/microcontroller/core.c +++ b/atmel-samd/common-hal/core/Core.c @@ -1,3 +1,29 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2016 Dan Halbert for Adafruit Industries + * + * 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. + */ + /* * Includes code from ASF sample code adc_temp.h and adc_temp.c, * and so includes this license: @@ -35,8 +61,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "py/obj.h" -#include "py/runtime.h" +#include "common-hal/core/Core.h" // Don't reorder these includes because they are dependencies of adc_feature.h. // They should really be included by adc_feature.h. @@ -172,7 +197,7 @@ STATIC float calculate_temperature(uint16_t raw_code, nvm_calibration_data_t *ca // External interface. // -float common_hal_mcu_core_get_temperature(void) { +float common_hal_core_core_get_temperature(void) { struct adc_module adc_instance_struct; system_voltage_reference_enable(SYSTEM_VOLTAGE_REFERENCE_TEMPSENSE); @@ -205,6 +230,6 @@ float common_hal_mcu_core_get_temperature(void) { } -uint32_t common_hal_mcu_core_get_frequency(void) { +uint32_t common_hal_core_core_get_frequency(void) { return system_cpu_clock_get_hz(); } diff --git a/atmel-samd/common-hal/core/Core.h b/atmel-samd/common-hal/core/Core.h new file mode 100644 index 00000000000..37fac02b168 --- /dev/null +++ b/atmel-samd/common-hal/core/Core.h @@ -0,0 +1,37 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Dan Halbert for Adafruit Industries + * + * 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_ATMEL_SAMD_COMMON_HAL_CORE_CORE_H +#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_CORE_CORE_H + +#include "py/obj.h" + +typedef struct { + mp_obj_base_t base; + // Stores no state currently. +} core_core_obj_t; + +#endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_CORE_CORE_H diff --git a/atmel-samd/common-hal/core/__init__.c b/atmel-samd/common-hal/core/__init__.c new file mode 100644 index 00000000000..2181435f28b --- /dev/null +++ b/atmel-samd/common-hal/core/__init__.c @@ -0,0 +1,27 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Dan Halbert for Adafruit Industries + * + * 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. + */ + +// No core module functions. diff --git a/atmel-samd/common-hal/microcontroller/__init__.c b/atmel-samd/common-hal/microcontroller/__init__.c index 2b9cc8bfcd6..636ec0b34f9 100644 --- a/atmel-samd/common-hal/microcontroller/__init__.c +++ b/atmel-samd/common-hal/microcontroller/__init__.c @@ -30,6 +30,7 @@ #include "samd21_pins.h" #include "shared-bindings/nvm/ByteArray.h" +#include "shared-bindings/core/Core.h" void common_hal_mcu_delay_us(uint32_t delay) { mp_hal_delay_us(delay); @@ -50,8 +51,17 @@ void common_hal_mcu_enable_interrupts(void) { cpu_irq_restore(irq_flags); } +// The singleton core.Core object. +// It currently only has properties, and no state. +core_core_obj_t common_hal_core_core_obj = { + .base = { + .type = &core_core_type, + }, +}; + // NVM is only available on Express boards for now. #if CIRCUITPY_INTERNAL_NVM_SIZE > 0 +// The singleton nvm.ByteAray object. nvm_bytearray_obj_t common_hal_mcu_nvm_obj = { .base = { .type = &nvm_bytearray_type, diff --git a/atmel-samd/common-hal/nvm/__init__.c b/atmel-samd/common-hal/nvm/__init__.c index 1b702a1584d..f0792430f01 100644 --- a/atmel-samd/common-hal/nvm/__init__.c +++ b/atmel-samd/common-hal/nvm/__init__.c @@ -1 +1,27 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * + * 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. + */ + // No nvm module functions. diff --git a/atmel-samd/mpconfigport.h b/atmel-samd/mpconfigport.h index e99d190be5c..376084c9f95 100644 --- a/atmel-samd/mpconfigport.h +++ b/atmel-samd/mpconfigport.h @@ -143,6 +143,7 @@ extern const struct _mp_obj_module_t digitalio_module; extern const struct _mp_obj_module_t pulseio_module; extern const struct _mp_obj_module_t busio_module; extern const struct _mp_obj_module_t board_module; +extern const struct _mp_obj_module_t core_module; extern const struct _mp_obj_module_t os_module; extern const struct _mp_obj_module_t random_module; extern const struct _mp_obj_module_t storage_module; @@ -196,6 +197,7 @@ extern const struct _mp_obj_module_t usb_hid_module; { MP_OBJ_NEW_QSTR(MP_QSTR_digitalio), (mp_obj_t)&digitalio_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_busio), (mp_obj_t)&busio_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_board), (mp_obj_t)&board_module }, \ + { MP_OBJ_NEW_QSTR(MP_QSTR_core), (mp_obj_t)&core_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_os), (mp_obj_t)&os_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_random), (mp_obj_t)&random_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_storage), (mp_obj_t)&storage_module }, \ diff --git a/esp8266/Makefile b/esp8266/Makefile index 5c32160ccb8..8fc8f22e644 100644 --- a/esp8266/Makefile +++ b/esp8266/Makefile @@ -104,6 +104,8 @@ SRC_COMMON_HAL = \ analogio/__init__.c \ analogio/AnalogIn.c \ analogio/AnalogOut.c \ + core/__init__.c \ + core/Core.c \ digitalio/__init__.c \ digitalio/DigitalInOut.c \ pulseio/__init__.c \ diff --git a/esp8266/common-hal/core/Core.c b/esp8266/common-hal/core/Core.c new file mode 100644 index 00000000000..8056f3ead1d --- /dev/null +++ b/esp8266/common-hal/core/Core.c @@ -0,0 +1,40 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2016 Dan Halbert for Adafruit Industries + * + * 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 "common-hal/core/Core.h" + +#include + +#include "esp_mphal.h" + + +float common_hal_core_core_get_temperature(void) { + return NAN; +} + +uint32_t common_hal_core_core_get_frequency(void) { + return mp_hal_get_cpu_freq(); +} diff --git a/esp8266/common-hal/core/Core.h b/esp8266/common-hal/core/Core.h new file mode 100644 index 00000000000..9f089f6c148 --- /dev/null +++ b/esp8266/common-hal/core/Core.h @@ -0,0 +1,37 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Dan Halbert for Adafruit Industries + * + * 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_COMMON_HAL_CORE_CORE_H +#define MICROPY_INCLUDED_ESP8266_COMMON_HAL_CORE_CORE_H + +#include "py/obj.h" + +typedef struct { + mp_obj_base_t base; + // Stores no state currently. +} core_core_obj_t; + +#endif // MICROPY_INCLUDED_ESP8266_COMMON_HAL_CORE_CORE_H diff --git a/esp8266/common-hal/core/__init__.c b/esp8266/common-hal/core/__init__.c new file mode 100644 index 00000000000..2181435f28b --- /dev/null +++ b/esp8266/common-hal/core/__init__.c @@ -0,0 +1,27 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Dan Halbert for Adafruit Industries + * + * 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. + */ + +// No core module functions. diff --git a/esp8266/common-hal/microcontroller/__init__.c b/esp8266/common-hal/microcontroller/__init__.c index 4fb5eee6329..3db8efba90c 100644 --- a/esp8266/common-hal/microcontroller/__init__.c +++ b/esp8266/common-hal/microcontroller/__init__.c @@ -28,6 +28,8 @@ #include "common-hal/microcontroller/Pin.h" #include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/core/Core.h" + #include "eagle_soc.h" #include "ets_alt_task.h" #include "etshal.h" @@ -52,6 +54,14 @@ void common_hal_mcu_enable_interrupts() { enable_irq(saved_interrupt_state & ~(1 << ETS_LOOP_ITER_BIT)); } +// The singleton core.Core object. +// It currently only has properties, and no state. +core_core_obj_t common_hal_core_core_obj = { + .base = { + .type = &core_core_type, + }, +}; + // This macro is used to simplify pin definition in boards//pins.c #define PIN(p_name, p_gpio_number, p_gpio_function, p_peripheral) \ const mcu_pin_obj_t pin_## p_name = { \ diff --git a/esp8266/esp_mphal.c b/esp8266/esp_mphal.c index effed04dda6..748c90292ff 100644 --- a/esp8266/esp_mphal.c +++ b/esp8266/esp_mphal.c @@ -55,6 +55,10 @@ void mp_hal_delay_us(uint32_t us) { } } +uint32_t mp_hal_get_cpu_freq(void) { + return system_get_cpu_freq() * 1000000; +} + int mp_hal_stdin_rx_chr(void) { for (;;) { int c = ringbuf_get(&input_buf); diff --git a/esp8266/mpconfigport.h b/esp8266/mpconfigport.h index 41351709902..dcdfc38637e 100644 --- a/esp8266/mpconfigport.h +++ b/esp8266/mpconfigport.h @@ -164,6 +164,7 @@ extern const struct _mp_obj_module_t mp_module_machine; extern const struct _mp_obj_module_t mp_module_onewire; extern const struct _mp_obj_module_t microcontroller_module; extern const struct _mp_obj_module_t board_module; +extern const struct _mp_obj_module_t core_module; extern const struct _mp_obj_module_t analogio_module; extern const struct _mp_obj_module_t digitalio_module; extern const struct _mp_obj_module_t pulseio_module; @@ -181,6 +182,7 @@ extern const struct _mp_obj_module_t multiterminal_module; { MP_ROM_QSTR(MP_QSTR__onewire), MP_ROM_PTR(&mp_module_onewire) }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_microcontroller), (mp_obj_t)µcontroller_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_board), (mp_obj_t)&board_module }, \ + { MP_OBJ_NEW_QSTR(MP_QSTR_core), (mp_obj_t)&core_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_digitalio), (mp_obj_t)&digitalio_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_pulseio), (mp_obj_t)&pulseio_module }, \ diff --git a/shared-bindings/core/Core.c b/shared-bindings/core/Core.c new file mode 100644 index 00000000000..9d3e68646fb --- /dev/null +++ b/shared-bindings/core/Core.c @@ -0,0 +1,109 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Dan Halbert for Adafruit Industries + * + * 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 + +#include "py/objproperty.h" +#include "shared-bindings/core/Core.h" + +#include "py/objproperty.h" +#include "py/runtime.h" + +//| .. currentmodule:: core +//| +//| :class:Core` --- Microcontroller core information and control +//| -------------------------------------------------------- +//| +//| Get basic info about the code (chip) itself and control it. +//| +//| You cannot create an instance of Core, but you can access the sole instance available +//| by importing the microcontroller module. +//| +//| Usage:: +//| +//| import microcontroller +//| print(microcontroller.core.frequency) +//| print(microcontroller.core.temperature) +//| + + +STATIC mp_obj_t core_core_make_new(const mp_obj_type_t *type, + size_t n_args, size_t n_kw, const mp_obj_t *args) { + mp_raise_TypeError("cannot be created: use instance in microcontroller.core"); +} + +//| .. attribute:: frequency +//| +//| Return the CPU operating frequency as an int, in Hz. +//| +STATIC mp_obj_t core_core_get_frequency(mp_obj_t self) { + return mp_obj_new_int_from_uint(common_hal_core_core_get_frequency()); +} + +MP_DEFINE_CONST_FUN_OBJ_1(core_core_get_frequency_obj, core_core_get_frequency); + +const mp_obj_property_t core_core_frequency_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&core_core_get_frequency_obj, // getter + (mp_obj_t)&mp_const_none_obj, // no setter + (mp_obj_t)&mp_const_none_obj, // no deleter + }, +}; + +//| .. attribute:: temperature +//| +//| Return the core (on-chip) temperature, in Celsius, as a float. +//| If the temperature is not available, return None. +//| +STATIC mp_obj_t core_core_get_temperature(mp_obj_t self) { + float temperature = common_hal_core_core_get_temperature(); + return isnan(temperature) ? mp_const_none : mp_obj_new_float(temperature); +} + +MP_DEFINE_CONST_FUN_OBJ_1(core_core_get_temperature_obj, core_core_get_temperature); + +const mp_obj_property_t core_core_temperature_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&core_core_get_temperature_obj, // getter + (mp_obj_t)&mp_const_none_obj, // no setter + (mp_obj_t)&mp_const_none_obj, // no deleter + }, +}; + +STATIC const mp_rom_map_elem_t core_core_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&core_core_frequency_obj) }, + { MP_ROM_QSTR(MP_QSTR_temperature), MP_ROM_PTR(&core_core_temperature_obj) }, +}; + +STATIC MP_DEFINE_CONST_DICT(core_core_locals_dict, core_core_locals_dict_table); + +const mp_obj_type_t core_core_type = { + { &mp_type_type }, + .name = MP_QSTR_core, + .make_new = core_core_make_new, + .locals_dict = (mp_obj_t)&core_core_locals_dict, +}; diff --git a/shared-bindings/core/Core.h b/shared-bindings/core/Core.h new file mode 100644 index 00000000000..16171e867a5 --- /dev/null +++ b/shared-bindings/core/Core.h @@ -0,0 +1,39 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * + * 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_SHARED_BINDINGS_CORE_CORE_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_CORE_CORE_H + +#include "py/obj.h" + +#include "common-hal/core/Core.h" + +const mp_obj_type_t core_core_type; + +uint32_t common_hal_core_core_get_frequency(void); +float common_hal_core_core_get_temperature(void); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_CORE_CORE_H diff --git a/shared-bindings/core/__init__.c b/shared-bindings/core/__init__.c new file mode 100644 index 00000000000..887d3b515c7 --- /dev/null +++ b/shared-bindings/core/__init__.c @@ -0,0 +1,64 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * + * 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 "py/obj.h" +#include "py/mphal.h" +#include "py/runtime.h" + +#include "shared-bindings/core/__init__.h" +#include "shared-bindings/core/Core.h" + +//| :mod:`core` --- Microcontroller core chip information and control +//| =========================================================== +//| +//| .. module:: core +//| :synopsis: Core chip information and control +//| :platform: SAMD21,ESP8266 +//| +//| The `core` module defines the class `Core`. +//| It provdes microcontroller core chip information and control, such as +//| temperature and clock frequency. +//| +//| There is only one instance of Core, available in `microcontroller.core`. +//| + +//| Libraries +//| +//| .. toctree:: +//| :maxdepth: 3 +//| +//| Core +STATIC const mp_rom_map_elem_t core_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_core) }, + { MP_ROM_QSTR(MP_QSTR_Core), MP_ROM_PTR(&core_core_type) }, +}; + +STATIC MP_DEFINE_CONST_DICT(core_module_globals, core_module_globals_table); + +const mp_obj_module_t core_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t*)&core_module_globals, +}; diff --git a/shared-bindings/microcontroller/core.h b/shared-bindings/core/__init__.h similarity index 76% rename from shared-bindings/microcontroller/core.h rename to shared-bindings/core/__init__.h index 86b1772175d..adc86717b2e 100644 --- a/shared-bindings/microcontroller/core.h +++ b/shared-bindings/core/__init__.h @@ -24,14 +24,7 @@ * THE SOFTWARE. */ -#ifndef __MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER___CORE___H__ -#define __MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER___CORE___H__ +#ifndef SHARED_BINDINGS_CORE_H +#define SHARED_BINDINGS_CORE_H -#include "py/obj.h" - -extern const mp_obj_base_t mcu_core_obj; - -uint32_t common_hal_mcu_core_get_frequency(void); -float common_hal_mcu_core_get_temperature(void); - -#endif // __MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER___CORE___H__ +#endif // SHARED_BINDINGS_CORE_H diff --git a/shared-bindings/index.rst b/shared-bindings/index.rst index ab92fd57c43..2ec72eca6bd 100644 --- a/shared-bindings/index.rst +++ b/shared-bindings/index.rst @@ -12,13 +12,32 @@ limited. For example, a microcontroller without analog features will not have Support Matrix --------------- -=============== ========== ========= =========== ======= ======= =========== ================= =============== ================ ======= ========= ======== ========= ======== ========= ======= ========= -Port `analogio` `audioio` `bitbangio` `board` `busio` `digitalio` `microcontroller` `multiterminal` `neopixel_write` `os` `pulseio` `random` `storage` `time` `touchio` `uheap` `usb_hid` -=============== ========== ========= =========== ======= ======= =========== ================= =============== ================ ======= ========= ======== ========= ======== ========= ======= ========= -SAMD21 **Yes** No No **Yes** **Yes** **Yes** **Yes** No **Yes** **Yes** No **Yes** **Yes** **Yes** **Yes** Debug **Yes** -SAMD21 Express **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** No **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** Debug **Yes** -ESP8266 **Yes** No **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** **Yes** No **Yes** **Yes** **Yes** No Debug No -=============== ========== ========= =========== ======= ======= =========== ================= =============== ================ ======= ========= ======== ========= ======== ========= ======= ========= + + + +================= ======= ============== ======= +Module / Port SAMD21 SAMD21 Express ESP8266 +================= ======= ============== ======= +`analogio` **Yes** **Yes** **Yes** +`audioio` No **Yes** No +`bitbangio` No **Yes** **Yes** +`board` **Yes** **Yes** **Yes** +`busio` **Yes** **Yes** **Yes** +`core` **Yes** **Yes** **Partial** + (not temperature) +`digitalio` **Yes** **Yes** **Yes** +`microcontroller` **Yes** **Yes** **Yes** +`multiterminal` No No **Yes** +`neopixel_write` **Yes** **Yes** **Yes** +`nvm` No **Yes** No +`os` **Yes** **Yes** **Yes** +`pulseio` No **Yes** No +`random` **Yes** **Yes** **Yes** +`storage` **Yes** **Yes** **Yes** +`time` **Yes** **Yes** **Yes** +`touchio` **Yes** **Yes** No +`uheap` Debug Debug Debug +`usb_hid` **Yes** **Yes** No Modules --------- diff --git a/shared-bindings/microcontroller/__init__.c b/shared-bindings/microcontroller/__init__.c index a88aaa376ad..c511ffe4590 100644 --- a/shared-bindings/microcontroller/__init__.c +++ b/shared-bindings/microcontroller/__init__.c @@ -33,7 +33,6 @@ #include "py/runtime.h" #include "shared-bindings/microcontroller/__init__.h" -#include "shared-bindings/microcontroller/core.h" #include "shared-bindings/microcontroller/Pin.h" #include "common-hal/microcontroller/Pin.h" @@ -57,6 +56,12 @@ //| Pin //| +//| .. attribute:: core +//| +//| Core chip information and control, such as temperature and clock frequency. +//| This object is the sole instance of `core.Core`. +//| + //| .. method:: delay_us(delay) //| //| Dedicated delay method used for very short delays. DO NOT do long delays @@ -93,8 +98,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(mcu_enable_interrupts_obj, mcu_enable_interrupt //| .. attribute:: nvm //| -//| Available non-volatile memory. Its a `nvm.ByteArray` when available or -//| ``None`` otherwise. +//| Available non-volatile memory. +//| This object is the sole instance of `nvm.ByteArray` when available or ``None`` otherwise. //| //| :mod:`microcontroller.pin` --- Microcontroller pin names @@ -114,7 +119,7 @@ const mp_obj_module_t mcu_pin_module = { STATIC const mp_rom_map_elem_t mcu_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_microcontroller) }, { MP_ROM_QSTR(MP_QSTR_delay_us), MP_ROM_PTR(&mcu_delay_us_obj) }, - { MP_ROM_QSTR(MP_QSTR_core), MP_ROM_PTR(&mcu_core_obj) }, + { MP_ROM_QSTR(MP_QSTR_core), MP_ROM_PTR(&common_hal_core_core_obj) }, { MP_ROM_QSTR(MP_QSTR_disable_interrupts), MP_ROM_PTR(&mcu_disable_interrupts_obj) }, { MP_ROM_QSTR(MP_QSTR_enable_interrupts), MP_ROM_PTR(&mcu_enable_interrupts_obj) }, #if CIRCUITPY_INTERNAL_NVM_SIZE > 0 diff --git a/shared-bindings/microcontroller/__init__.h b/shared-bindings/microcontroller/__init__.h index 9bad926cd3d..1ae90822607 100644 --- a/shared-bindings/microcontroller/__init__.h +++ b/shared-bindings/microcontroller/__init__.h @@ -30,6 +30,8 @@ #include "py/mpconfig.h" #include "py/obj.h" +#include "common-hal/core/Core.h" + extern void common_hal_mcu_delay_us(uint32_t); extern void common_hal_mcu_disable_interrupts(void); @@ -37,6 +39,9 @@ extern void common_hal_mcu_enable_interrupts(void); extern const mp_obj_dict_t mcu_pin_globals; +extern const core_core_obj_t common_hal_core_core_obj; + + #if CIRCUITPY_INTERNAL_NVM_SIZE > 0 #include "common-hal/nvm/ByteArray.h" diff --git a/shared-bindings/microcontroller/core.c b/shared-bindings/microcontroller/core.c deleted file mode 100644 index ca601a76389..00000000000 --- a/shared-bindings/microcontroller/core.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2017 Dan Halbert for Adafruit Industries - * - * 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. - */ - -// Microcontroller contains pin references and microcontroller specific control -// functions. - -#include - -#include "py/obj.h" -#include "py/objproperty.h" -#include "py/runtime.h" - -#include "shared-bindings/microcontroller/core.h" - -// Forward declaration due to circularity. -const mp_obj_type_t mcu_core_type; -// there is a singleton microcontroller.core object -const mp_obj_base_t mcu_core_obj = {&mcu_core_type}; - -STATIC mp_obj_t mcu_core_obj_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - // check arguments - mp_arg_check_num(n_args, n_kw, 0, 0, false); - - // return singleton object - return (mp_obj_t)&mcu_core_obj; -} - -//| :mod:`microcontroller.core` --- Microcontroller core information and control -//| -------------------------------------------------------- -//| -//| .. module:: microcontroller.core -//| :synopsis: Microcontroller core information and control -//| :platform: SAMD21 -//| -//| Get basic info about the code (chip) itself and control it. -//| - -//| .. attribute:: frequency -//| -//| Return the CPU operating frequency as an int, in Hz. -//| -STATIC mp_obj_t mcu_core_obj_get_frequency(mp_obj_t self) { - return mp_obj_new_int_from_uint(common_hal_mcu_core_get_frequency()); -} - -MP_DEFINE_CONST_FUN_OBJ_1(mcu_core_get_frequency_obj, mcu_core_obj_get_frequency); - -const mp_obj_property_t mcu_core_frequency_obj = { - .base.type = &mp_type_property, - .proxy = {(mp_obj_t)&mcu_core_get_frequency_obj, // getter - (mp_obj_t)&mp_const_none_obj, // no setter - (mp_obj_t)&mp_const_none_obj, // no deleter - }, -}; - -//| .. attribute:: temperature -//| -//| Return the core (on-chip) temperature, in Celsius. -//| -STATIC mp_obj_t mcu_core_obj_get_temperature(mp_obj_t self) { - return mp_obj_new_float(common_hal_mcu_core_get_temperature()); -} - -MP_DEFINE_CONST_FUN_OBJ_1(mcu_core_get_temperature_obj, mcu_core_obj_get_temperature); - -const mp_obj_property_t mcu_core_temperature_obj = { - .base.type = &mp_type_property, - .proxy = {(mp_obj_t)&mcu_core_get_temperature_obj, // getter - (mp_obj_t)&mp_const_none_obj, // no setter - (mp_obj_t)&mp_const_none_obj, // no deleter - }, -}; - -STATIC const mp_rom_map_elem_t mcu_core_obj_locals_dict_table[] = { - { MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&mcu_core_frequency_obj) }, - { MP_ROM_QSTR(MP_QSTR_temperature), MP_ROM_PTR(&mcu_core_temperature_obj) }, -}; - -STATIC MP_DEFINE_CONST_DICT(mcu_core_obj_locals_dict, mcu_core_obj_locals_dict_table); - -const mp_obj_type_t mcu_core_type = { - { &mp_type_type }, - .name = MP_QSTR_core, - .make_new = mcu_core_obj_make_new, - .locals_dict = (mp_obj_t)&mcu_core_obj_locals_dict, -}; - - - diff --git a/shared-bindings/nvm/ByteArray.c b/shared-bindings/nvm/ByteArray.c index 0ba511a7799..6f67a74a95d 100644 --- a/shared-bindings/nvm/ByteArray.c +++ b/shared-bindings/nvm/ByteArray.c @@ -46,11 +46,11 @@ //| .. class:: ByteArray() //| -//| Not currently dynamically supported. Access one through `microcontroller.nvm`. +//| Not currently dynamically supported. Access the sole instance through `microcontroller.nvm`. //| STATIC mp_obj_t nvm_bytearray_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { - return mp_const_none; + mp_raise_TypeError("cannot be created: use instance in microcontroller.nvm"); } //| .. method:: __len__()