diff --git a/pic16bit/Makefile b/pic16bit/Makefile new file mode 100644 index 000000000..4fab7f61c --- /dev/null +++ b/pic16bit/Makefile @@ -0,0 +1,66 @@ +include ../py/mkenv.mk + +# qstr definitions (must come before including py.mk) +QSTR_DEFS = qstrdefsport.h + +# include py core make definitions +include ../py/py.mk + +XC16 = /opt/microchip/xc16/v1.24 +CROSS_COMPILE = $(XC16)/bin/xc16- + +PARTFAMILY = dsPIC33F +PART = 33FJ256GP506 + +INC = -I. +INC += -I.. +INC += -I../lib/mp-readline +INC += -I../stmhal +INC += -I$(BUILD) +INC += -I$(XC16)/include +INC += -I$(XC16)/support/$(PARTFAMILY)/h + +CFLAGS_PIC16BIT = -mcpu=$(PART) -mlarge-code +CFLAGS = $(INC) -Wall -Werror -ansi -std=gnu99 -nostdlib $(CFLAGS_PIC16BIT) $(COPT) + +#Debugging/Optimization +ifeq ($(DEBUG), 1) +CFLAGS += -O0 -ggdb +else +CFLAGS += -O1 -DNDEBUG +endif + +LDFLAGS = --heap=0 -nostdlib -T $(XC16)/support/$(PARTFAMILY)/gld/p$(PART).gld -Map=$@.map --cref -p$(PART) +LIBS = -L$(XC16)/lib -L$(XC16)/lib/$(PARTFAMILY) -lc -lm -lpic30 -lp$(PART) + +SRC_C = \ + main.c \ + board.c \ + pic16bit_mphal.c \ + modpyb.c \ + modpybled.c \ + modpybswitch.c \ + stmhal/pybstdio.c \ + stmhal/pyexec.c \ + lib/mp-readline/readline.c \ + +SRC_S = \ +# gchelper.s \ + +OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o)) + +all: $(BUILD)/firmware.hex + +$(BUILD)/firmware.hex: $(BUILD)/firmware.elf + $(ECHO) "Create $@" + $(Q)$(CROSS_COMPILE)bin2hex $< + +$(BUILD)/firmware.elf: $(OBJ) + $(ECHO) "LINK $@" + $(Q)$(LD) $(LDFLAGS) -o $@ $(OBJ) $(LIBS) + $(Q)size $@ + +$(PY_BUILD)/gc.o: CFLAGS += -O1 +$(PY_BUILD)/vm.o: CFLAGS += -O1 + +include ../py/mkrules.mk diff --git a/pic16bit/board.c b/pic16bit/board.c new file mode 100644 index 000000000..77f059fc7 --- /dev/null +++ b/pic16bit/board.c @@ -0,0 +1,153 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 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 "board.h" + +/********************************************************************/ +// CPU + +void cpu_init(void) { + // set oscillator to operate at 40MHz + // Fosc = Fin*M/(N1*N2), Fcy = Fosc/2 + // Fosc = 7.37M*40/(2*2) = 80Mhz for 7.37M input clock + PLLFBD = 41; // M=39 + CLKDIVbits.PLLPOST = 0; // N1=2 + CLKDIVbits.PLLPRE = 0; // N2=2 + OSCTUN = 0; + + // initiate clock switch to FRC with PLL + __builtin_write_OSCCONH(0x01); + __builtin_write_OSCCONL(0x01); + + // wait for clock switch to occur + while (OSCCONbits.COSC != 0x01) { + } + while (!OSCCONbits.LOCK) { + } +} + +/********************************************************************/ +// LEDs + +#define RED_LED_TRIS _TRISC15 +#define YELLOW_LED_TRIS _TRISC13 +#define GREEN_LED_TRIS _TRISC14 + +#define RED_LED _LATC15 +#define YELLOW_LED _LATC13 +#define GREEN_LED _LATC14 + +#define LED_ON (0) +#define LED_OFF (1) + +void led_init(void) { + // set led GPIO as outputs + RED_LED_TRIS = 0; + YELLOW_LED_TRIS = 0; + GREEN_LED_TRIS = 0; + + // turn off the LEDs + RED_LED = LED_OFF; + YELLOW_LED = LED_OFF; + GREEN_LED = LED_OFF; +} + +void led_state(int led, int state) { + int val = state ? LED_ON : LED_OFF; + switch (led) { + case 1: RED_LED = val; break; + case 2: YELLOW_LED = val; break; + case 3: GREEN_LED = val; break; + } +} + +void led_toggle(int led) { + switch (led) { + case 1: RED_LED ^= 1; break; + case 2: YELLOW_LED ^= 1; break; + case 3: GREEN_LED ^= 1; break; + } +} + +/********************************************************************/ +// switches + +#define SWITCH_S1_TRIS _TRISD8 +#define SWITCH_S2_TRIS _TRISD9 + +#define SWITCH_S1 _RD8 +#define SWITCH_S2 _RD9 + +void switch_init(void) { + // set switch GPIO as inputs + SWITCH_S1_TRIS = 1; + SWITCH_S2_TRIS = 1; +} + +int switch_get(int sw) { + int val = 1; + switch (sw) { + case 1: val = SWITCH_S1; break; + case 2: val = SWITCH_S2; break; + } + return val == 0; +} + +/********************************************************************/ +// UART + +/* +// TODO need an irq +void uart_rx_irq(void) { + if (c == interrupt_char) { + MP_STATE_VM(mp_pending_exception) = MP_STATE_PORT(keyboard_interrupt_obj); + } +} +*/ + +void uart_init(void) { + // baudrate = F_CY / 16 (uxbrg + 1) + // F_CY = 40MHz for us + UART1.uxbrg = 64; // 38400 baud + UART1.uxmode = 1 << 15; // UARTEN + UART1.uxsta = 1 << 10; // UTXEN +} + +int uart_rx_any(void) { + return UART1.uxsta & 1; // URXDA +} + +int uart_rx_char(void) { + return UART1.uxrxreg; +} + +void uart_tx_char(int chr) { + while (UART1.uxsta & (1 << 9)) { + // tx fifo is full + } + UART1.uxtxreg = chr; +} diff --git a/pic16bit/board.h b/pic16bit/board.h new file mode 100644 index 000000000..0eb022436 --- /dev/null +++ b/pic16bit/board.h @@ -0,0 +1,43 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 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_PIC16BIT_BOARD_H__ +#define __MICROPY_INCLUDED_PIC16BIT_BOARD_H__ + +void cpu_init(void); + +void led_init(void); +void led_state(int led, int state); +void led_toggle(int led); + +void switch_init(void); +int switch_get(int sw); + +void uart_init(void); +int uart_rx_any(void); +int uart_rx_char(void); +void uart_tx_char(int chr); + +#endif // __MICROPY_INCLUDED_PIC16BIT_BOARD_H__ diff --git a/pic16bit/main.c b/pic16bit/main.c new file mode 100644 index 000000000..9b993fda9 --- /dev/null +++ b/pic16bit/main.c @@ -0,0 +1,125 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 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 +#include +#include + +#include "py/compile.h" +#include "py/runtime.h" +#include "py/gc.h" +#include "pyexec.h" +#include "readline.h" +#include MICROPY_HAL_H +#include "board.h" +#include "modpyb.h" + +_FGS(GWRP_OFF & GCP_OFF); +_FOSCSEL(FNOSC_FRC); +_FOSC(FCKSM_CSECMD & OSCIOFNC_ON & POSCMD_NONE); +_FWDT(FWDTEN_OFF); + +// maximum heap for device with 8k RAM +static char heap[4600]; + +int main(int argc, char **argv) { + // init the CPU and the peripherals + cpu_init(); + led_init(); + switch_init(); + uart_init(); + +soft_reset: + + // flash green led for 150ms to indicate boot + led_state(1, 0); + led_state(2, 0); + led_state(3, 1); + mp_hal_milli_delay(150); + led_state(3, 0); + + // init MicroPython runtime + int stack_dummy; + MP_STATE_VM(stack_top) = (char*)&stack_dummy; + gc_init(heap, heap + sizeof(heap)); + mp_init(); + mp_hal_init(); + readline_init0(); + + // REPL loop + for (;;) { + if (pyexec_mode_kind == PYEXEC_MODE_RAW_REPL) { + if (pyexec_raw_repl() != 0) { + break; + } + } else { + if (pyexec_friendly_repl() != 0) { + break; + } + } + } + + printf("PYB: soft reboot\n"); + mp_deinit(); + goto soft_reset; +} + +void gc_collect(void) { + // TODO possibly need to trace registers + void *dummy; + gc_collect_start(); + // Node: stack is ascending + gc_collect_root(&dummy, ((mp_uint_t)&dummy - (mp_uint_t)MP_STATE_VM(stack_top)) / sizeof(mp_uint_t)); + gc_collect_end(); +} + +mp_lexer_t *mp_lexer_new_from_file(const char *filename) { + return NULL; +} + +mp_import_stat_t mp_import_stat(const char *path) { + return MP_IMPORT_STAT_NO_EXIST; +} + +mp_obj_t mp_builtin_open(uint n_args, const mp_obj_t *args, mp_map_t *kwargs) { + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_open_obj, 1, mp_builtin_open); + +void nlr_jump_fail(void *val) { +} + +void NORETURN __fatal_error(const char *msg) { + while (1); +} + +#ifndef NDEBUG +void MP_WEAK __assert_func(const char *file, int line, const char *func, const char *expr) { + printf("Assertion '%s' failed, at file %s:%d\n", expr, file, line); + __fatal_error("Assertion failed"); +} +#endif diff --git a/pic16bit/modpyb.c b/pic16bit/modpyb.c new file mode 100644 index 000000000..f632d9443 --- /dev/null +++ b/pic16bit/modpyb.c @@ -0,0 +1,71 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 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 "py/obj.h" +#include MICROPY_HAL_H +#include "modpyb.h" + +STATIC mp_obj_t pyb_millis(void) { + return MP_OBJ_NEW_SMALL_INT(mp_hal_get_milliseconds()); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_0(pyb_millis_obj, pyb_millis); + +STATIC mp_obj_t pyb_elapsed_millis(mp_obj_t start) { + uint32_t startMillis = mp_obj_get_int(start); + uint32_t currMillis = mp_hal_get_milliseconds(); + return MP_OBJ_NEW_SMALL_INT((currMillis - startMillis) & 0x1fff); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_elapsed_millis_obj, pyb_elapsed_millis); + +STATIC mp_obj_t pyb_delay(mp_obj_t ms_in) { + mp_int_t ms = mp_obj_get_int(ms_in); + if (ms >= 0) { + mp_hal_milli_delay(ms); + } + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_delay_obj, pyb_delay); + +STATIC const mp_map_elem_t pyb_module_globals_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_pyb) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_millis), (mp_obj_t)&pyb_millis_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_elapsed_millis), (mp_obj_t)&pyb_elapsed_millis_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_delay), (mp_obj_t)&pyb_delay_obj }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_LED), (mp_obj_t)&pyb_led_type }, + { MP_OBJ_NEW_QSTR(MP_QSTR_Switch), (mp_obj_t)&pyb_switch_type }, +}; + +STATIC MP_DEFINE_CONST_DICT(pyb_module_globals, pyb_module_globals_table); + +const mp_obj_module_t pyb_module = { + .base = { &mp_type_module }, + .name = MP_QSTR_pyb, + .globals = (mp_obj_dict_t*)&pyb_module_globals, +}; diff --git a/pic16bit/modpyb.h b/pic16bit/modpyb.h new file mode 100644 index 000000000..6c68cbdfd --- /dev/null +++ b/pic16bit/modpyb.h @@ -0,0 +1,33 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 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_PIC16BIT_MODPYB_H__ +#define __MICROPY_INCLUDED_PIC16BIT_MODPYB_H__ + +extern const mp_obj_type_t pyb_led_type; +extern const mp_obj_type_t pyb_switch_type; +extern const mp_obj_module_t pyb_module; + +#endif // __MICROPY_INCLUDED_PIC16BIT_MODPYB_H__ diff --git a/pic16bit/modpybled.c b/pic16bit/modpybled.c new file mode 100644 index 000000000..c44bb1d24 --- /dev/null +++ b/pic16bit/modpybled.c @@ -0,0 +1,93 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 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 "py/runtime.h" +#include "board.h" +#include "modpyb.h" + +typedef struct _pyb_led_obj_t { + mp_obj_base_t base; +} pyb_led_obj_t; + +STATIC const pyb_led_obj_t pyb_led_obj[] = { + {{&pyb_led_type}}, + {{&pyb_led_type}}, + {{&pyb_led_type}}, +}; + +#define NUM_LED MP_ARRAY_SIZE(pyb_led_obj) +#define LED_ID(obj) ((obj) - &pyb_led_obj[0] + 1) + +void pyb_led_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) { + pyb_led_obj_t *self = self_in; + print(env, "LED(%u)", LED_ID(self)); +} + +STATIC mp_obj_t pyb_led_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { + mp_arg_check_num(n_args, n_kw, 1, 1, false); + mp_int_t led_id = mp_obj_get_int(args[0]); + if (!(1 <= led_id && led_id <= NUM_LED)) { + nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "LED %d does not exist", led_id)); + } + return (mp_obj_t)&pyb_led_obj[led_id - 1]; +} + +mp_obj_t pyb_led_on(mp_obj_t self_in) { + pyb_led_obj_t *self = self_in; + led_state(LED_ID(self), 1); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_led_on_obj, pyb_led_on); + +mp_obj_t pyb_led_off(mp_obj_t self_in) { + pyb_led_obj_t *self = self_in; + led_state(LED_ID(self), 0); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_led_off_obj, pyb_led_off); + +mp_obj_t pyb_led_toggle(mp_obj_t self_in) { + pyb_led_obj_t *self = self_in; + led_toggle(LED_ID(self)); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_led_toggle_obj, pyb_led_toggle); + +STATIC const mp_map_elem_t pyb_led_locals_dict_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR_on), (mp_obj_t)&pyb_led_on_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_off), (mp_obj_t)&pyb_led_off_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_toggle), (mp_obj_t)&pyb_led_toggle_obj }, +}; + +STATIC MP_DEFINE_CONST_DICT(pyb_led_locals_dict, pyb_led_locals_dict_table); + +const mp_obj_type_t pyb_led_type = { + { &mp_type_type }, + .name = MP_QSTR_LED, + .print = pyb_led_print, + .make_new = pyb_led_make_new, + .locals_dict = (mp_obj_t)&pyb_led_locals_dict, +}; diff --git a/pic16bit/modpybswitch.c b/pic16bit/modpybswitch.c new file mode 100644 index 000000000..f5047b78f --- /dev/null +++ b/pic16bit/modpybswitch.c @@ -0,0 +1,81 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 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 "py/runtime.h" +#include "board.h" +#include "modpyb.h" + +typedef struct _pyb_switch_obj_t { + mp_obj_base_t base; +} pyb_switch_obj_t; + +STATIC const pyb_switch_obj_t pyb_switch_obj[] = { + {{&pyb_switch_type}}, + {{&pyb_switch_type}}, +}; + +#define NUM_SWITCH MP_ARRAY_SIZE(pyb_switch_obj) +#define SWITCH_ID(obj) ((obj) - &pyb_switch_obj[0] + 1) + +void pyb_switch_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) { + pyb_switch_obj_t *self = self_in; + print(env, "Switch(%u)", SWITCH_ID(self)); +} + +STATIC mp_obj_t pyb_switch_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { + mp_arg_check_num(n_args, n_kw, 1, 1, false); + mp_int_t sw_id = mp_obj_get_int(args[0]); + if (!(1 <= sw_id && sw_id <= NUM_SWITCH)) { + nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "Switch %d does not exist", sw_id)); + } + return (mp_obj_t)&pyb_switch_obj[sw_id - 1]; +} + +mp_obj_t pyb_switch_value(mp_obj_t self_in) { + pyb_switch_obj_t *self = self_in; + return switch_get(SWITCH_ID(self)) ? mp_const_true : mp_const_false; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_switch_value_obj, pyb_switch_value); + +mp_obj_t pyb_switch_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { + mp_arg_check_num(n_args, n_kw, 0, 0, false); + return pyb_switch_value(self_in); +} + +STATIC const mp_map_elem_t pyb_switch_locals_dict_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR_value), (mp_obj_t)&pyb_switch_value_obj }, +}; + +STATIC MP_DEFINE_CONST_DICT(pyb_switch_locals_dict, pyb_switch_locals_dict_table); + +const mp_obj_type_t pyb_switch_type = { + { &mp_type_type }, + .name = MP_QSTR_Switch, + .print = pyb_switch_print, + .make_new = pyb_switch_make_new, + .call = pyb_switch_call, + .locals_dict = (mp_obj_t)&pyb_switch_locals_dict, +}; diff --git a/pic16bit/mpconfigport.h b/pic16bit/mpconfigport.h new file mode 100644 index 000000000..06ed6669e --- /dev/null +++ b/pic16bit/mpconfigport.h @@ -0,0 +1,110 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 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 + +// options to control how MicroPython is built +#define MICROPY_OBJ_REPR (MICROPY_OBJ_REPR_B) +#define MICROPY_ALLOC_PATH_MAX (64) +#define MICROPY_EMIT_X64 (0) +#define MICROPY_EMIT_THUMB (0) +#define MICROPY_EMIT_INLINE_THUMB (0) +#define MICROPY_COMP_MODULE_CONST (0) +#define MICROPY_COMP_CONST (0) +#define MICROPY_MEM_STATS (0) +#define MICROPY_DEBUG_PRINTERS (0) +#define MICROPY_ENABLE_GC (1) +#define MICROPY_REPL_EVENT_DRIVEN (0) +#define MICROPY_HELPER_REPL (1) +#define MICROPY_HELPER_LEXER_UNIX (0) +#define MICROPY_ENABLE_SOURCE_LINE (0) +#define MICROPY_ENABLE_DOC_STRING (0) +#define MICROPY_ERROR_REPORTING (MICROPY_ERROR_REPORTING_TERSE) +#define MICROPY_PY_BUILTINS_BYTEARRAY (0) +#define MICROPY_PY_BUILTINS_MEMORYVIEW (0) +#define MICROPY_PY_BUILTINS_FROZENSET (0) +#define MICROPY_PY_BUILTINS_SET (0) +#define MICROPY_PY_BUILTINS_SLICE (0) +#define MICROPY_PY_BUILTINS_PROPERTY (0) +#define MICROPY_PY_MICROPYTHON_MEM_INFO (1) +#define MICROPY_PY___FILE__ (0) +#define MICROPY_PY_GC (1) +#define MICROPY_PY_ARRAY (0) +#define MICROPY_PY_COLLECTIONS (0) +#define MICROPY_PY_MATH (0) +#define MICROPY_PY_CMATH (0) +#define MICROPY_PY_IO (0) +#define MICROPY_PY_STRUCT (0) +#define MICROPY_PY_SYS (0) +#define MICROPY_MODULE_FROZEN (0) +#define MICROPY_CPYTHON_COMPAT (0) +#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_MPZ) +#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_NONE) + +// type definitions for the specific machine + +#define MP_ENDIANNESS_LITTLE (1) +#define BYTES_PER_WORD (2) +#define MPZ_DIG_SIZE (8) + +// The xc16 compiler doesn't seem to respect alignment (!!) so we +// need to use instead an object representation that allows for +// 2-byte aligned pointers (see config setting above). +//#define MICROPY_OBJ_BASE_ALIGNMENT __attribute__((aligned(4))) + +#define MICROPY_MAKE_POINTER_CALLABLE(p) ((void*)((mp_uint_t)(p))) + +#define UINT_FMT "%u" +#define INT_FMT "%d" +typedef int mp_int_t; // must be pointer size +typedef unsigned int mp_uint_t; // must be pointer size + +typedef void *machine_ptr_t; // must be pointer size +typedef const void *machine_const_ptr_t; // must be pointer size +typedef int mp_off_t; + +// extra builtin names to add to the global namespace +extern const struct _mp_obj_fun_builtin_t mp_builtin_open_obj; +#define MICROPY_PORT_BUILTINS \ + { MP_OBJ_NEW_QSTR(MP_QSTR_open), (mp_obj_t)&mp_builtin_open_obj }, + +// extra builtin modules to add to the list of known ones +extern const struct _mp_obj_module_t pyb_module; +#define MICROPY_PORT_BUILTIN_MODULES \ + { MP_OBJ_NEW_QSTR(MP_QSTR_pyb), (mp_obj_t)&pyb_module }, \ + +// We need to provide a declaration/definition of alloca() +#define alloca(x) (void*)m_new(byte, (x)) + +#define MP_STATE_PORT MP_STATE_VM + +#define MICROPY_PORT_ROOT_POINTERS \ + char *readline_hist[8]; \ + mp_obj_t keyboard_interrupt_obj; \ + +#define MICROPY_HAL_H "pic16bit_mphal.h" +#define MICROPY_HW_BOARD_NAME "dsPICSK" +#define MICROPY_HW_MCU_NAME "dsPIC33" diff --git a/pic16bit/pic16bit_mphal.c b/pic16bit/pic16bit_mphal.c new file mode 100644 index 000000000..dccea7659 --- /dev/null +++ b/pic16bit/pic16bit_mphal.c @@ -0,0 +1,79 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 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 "pic16bit_mphal.h" +#include "board.h" + +static int interrupt_char; + +void mp_hal_init(void) { + MP_STATE_PORT(keyboard_interrupt_obj) = mp_obj_new_exception(&mp_type_KeyboardInterrupt); +} + +mp_uint_t mp_hal_get_milliseconds(void) { + // TODO + return 0; +} + +void mp_hal_milli_delay(mp_uint_t ms) { + // tuned for fixed CPU frequency + for (int i = ms; i > 0; i--) { + for (volatile int j = 0; j < 5000; j++) { + } + } +} + +void mp_hal_set_interrupt_char(int c) { + interrupt_char = c; +} + +int mp_hal_stdin_rx_chr(void) { + for (;;) { + if (uart_rx_any()) { + return uart_rx_char(); + } + } +} + +void mp_hal_stdout_tx_str(const char *str) { + mp_hal_stdout_tx_strn(str, strlen(str)); +} + +void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) { + for (; len > 0; --len) { + uart_tx_char(*str++); + } +} + +void mp_hal_stdout_tx_strn_cooked(const char *str, mp_uint_t len) { + for (; len > 0; --len) { + if (*str == '\n') { + uart_tx_char('\r'); + } + uart_tx_char(*str++); + } +} diff --git a/pic16bit/pic16bit_mphal.h b/pic16bit/pic16bit_mphal.h new file mode 100644 index 000000000..8dde61f7f --- /dev/null +++ b/pic16bit/pic16bit_mphal.h @@ -0,0 +1,44 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2015 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_PIC16BIT_PIC16BIT_MPHAL_H__ +#define __MICROPY_INCLUDED_PIC16BIT_PIC16BIT_MPHAL_H__ + +#define HAL_GetTick mp_hal_get_milliseconds + +#include "py/mpstate.h" + +void mp_hal_init(void); + +mp_uint_t mp_hal_get_milliseconds(void); +void mp_hal_milli_delay(mp_uint_t ms); + +void mp_hal_set_interrupt_char(int c); +int mp_hal_stdin_rx_chr(void); +void mp_hal_stdout_tx_str(const char *str); +void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len); +void mp_hal_stdout_tx_strn_cooked(const char *str, mp_uint_t len); + +#endif // __MICROPY_INCLUDED_PIC16BIT_PIC16BIT_MPHAL_H__ diff --git a/pic16bit/qstrdefsport.h b/pic16bit/qstrdefsport.h new file mode 100644 index 000000000..1ec8843a4 --- /dev/null +++ b/pic16bit/qstrdefsport.h @@ -0,0 +1,15 @@ +// qstrs specific to this port + +Q(pyb) +Q(millis) +Q(elapsed_millis) +Q(delay) +Q(LED) +Q(on) +Q(off) +Q(toggle) +Q(Switch) +Q(value) +Q(readall) +Q(readline) +Q(FileIO)