Skip to content

Commit 3cb4938

Browse files
committed
atmel-samd: Support Digital IO pins.
Also bumps up the heap size.
1 parent dade18b commit 3cb4938

File tree

12 files changed

+911
-4
lines changed

12 files changed

+911
-4
lines changed

atmel-samd/Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,11 @@ SRC_ASF = $(addprefix asf/sam0/,\
109109

110110
SRC_C = \
111111
main.c \
112+
modmachine.c \
112113
modutime.c \
113114
mphalport.c \
115+
pin.c \
116+
pin_named_pins.c \
114117
uart.c \
115118
asf/common/services/sleepmgr/samd/sleepmgr.c \
116119
asf/common/services/usb/class/cdc/device/udi_cdc.c \
@@ -121,6 +124,7 @@ SRC_C = \
121124
asf/sam0/utils/cmsis/samd21/source/gcc/startup_samd21.c \
122125
asf/sam0/utils/cmsis/samd21/source/system_samd21.c \
123126
asf/sam0/utils/syscalls/gcc/syscalls.c \
127+
boards/$(BOARD)/pins.c \
124128
lib/utils/stdout_helpers.c \
125129
lib/utils/printf.c \
126130
lib/utils/pyexec.c \

atmel-samd/boards/arduino_zero/pins.c

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#include "pins.h"
2+
#include "asf/sam0/drivers/system/system.h"
3+
4+
#define PIN(p_name) \
5+
const pin_obj_t pin_## p_name = { \
6+
{ &pin_type }, \
7+
.name = MP_QSTR_ ## p_name, \
8+
.pin = (PIN_## p_name), \
9+
}
10+
11+
PIN(PA02);
12+
PIN(PB08);
13+
PIN(PB09);
14+
PIN(PA04);
15+
PIN(PA05);
16+
PIN(PB02);
17+
PIN(PA11);
18+
PIN(PA10);
19+
PIN(PA14);
20+
PIN(PA09);
21+
PIN(PA08);
22+
PIN(PA15);
23+
PIN(PA20);
24+
PIN(PA06);
25+
PIN(PA07);
26+
PIN(PA18);
27+
PIN(PA16);
28+
PIN(PA19);
29+
PIN(PA17);
30+
31+
STATIC const mp_map_elem_t pin_cpu_pins_locals_dict_table[] = {
32+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA02), (mp_obj_t)&pin_PA02 },
33+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PB08), (mp_obj_t)&pin_PB08 },
34+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PB09), (mp_obj_t)&pin_PB09 },
35+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA04), (mp_obj_t)&pin_PA04 },
36+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA05), (mp_obj_t)&pin_PA05 },
37+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PB02), (mp_obj_t)&pin_PB02 },
38+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA11), (mp_obj_t)&pin_PA11 },
39+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA10), (mp_obj_t)&pin_PA10 },
40+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA14), (mp_obj_t)&pin_PA14 },
41+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA09), (mp_obj_t)&pin_PA09 },
42+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA08), (mp_obj_t)&pin_PA08 },
43+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA15), (mp_obj_t)&pin_PA15 },
44+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA20), (mp_obj_t)&pin_PA20 },
45+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA06), (mp_obj_t)&pin_PA06 },
46+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA07), (mp_obj_t)&pin_PA07 },
47+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA18), (mp_obj_t)&pin_PA18 },
48+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA16), (mp_obj_t)&pin_PA16 },
49+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA19), (mp_obj_t)&pin_PA19 },
50+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA17), (mp_obj_t)&pin_PA17 },
51+
};
52+
MP_DEFINE_CONST_DICT(pin_cpu_pins_locals_dict, pin_cpu_pins_locals_dict_table);
53+
54+
STATIC const mp_map_elem_t pin_board_pins_locals_dict_table[] = {
55+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A0), (mp_obj_t)&pin_PA02 },
56+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A1), (mp_obj_t)&pin_PB08 },
57+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A2), (mp_obj_t)&pin_PB09 },
58+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A3), (mp_obj_t)&pin_PA04 },
59+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A4), (mp_obj_t)&pin_PA05 },
60+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A5), (mp_obj_t)&pin_PB02 },
61+
{ MP_OBJ_NEW_QSTR(MP_QSTR_0RX), (mp_obj_t)&pin_PA11 },
62+
{ MP_OBJ_NEW_QSTR(MP_QSTR_1TX), (mp_obj_t)&pin_PA10 },
63+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D2), (mp_obj_t)&pin_PA14 },
64+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D3), (mp_obj_t)&pin_PA09 },
65+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D4), (mp_obj_t)&pin_PA08 },
66+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D5), (mp_obj_t)&pin_PA15 },
67+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D6), (mp_obj_t)&pin_PA20 },
68+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D8), (mp_obj_t)&pin_PA06 },
69+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D9), (mp_obj_t)&pin_PA07 },
70+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D10), (mp_obj_t)&pin_PA18 },
71+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D11), (mp_obj_t)&pin_PA16 },
72+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D12), (mp_obj_t)&pin_PA19 },
73+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D13), (mp_obj_t)&pin_PA17 },
74+
};
75+
MP_DEFINE_CONST_DICT(pin_board_pins_locals_dict, pin_board_pins_locals_dict_table);

atmel-samd/boards/arduino_zero/pins.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
2+
#ifndef __MICROPY_INCLUDED_ATMEL_SAMD_BOARDS_FEATHER_M0_BLE_PINS_H__
3+
#define __MICROPY_INCLUDED_ATMEL_SAMD_BOARDS_FEATHER_M0_BLE_PINS_H__
4+
5+
#include "pin.h"
6+
7+
extern const pin_obj_t pin_PA02;
8+
extern const pin_obj_t pin_PB08;
9+
extern const pin_obj_t pin_PB09;
10+
extern const pin_obj_t pin_PA04;
11+
extern const pin_obj_t pin_PA05;
12+
extern const pin_obj_t pin_PB02;
13+
extern const pin_obj_t pin_PB11;
14+
extern const pin_obj_t pin_PB10;
15+
extern const pin_obj_t pin_PB21;
16+
extern const pin_obj_t pin_PA11;
17+
extern const pin_obj_t pin_PA10;
18+
extern const pin_obj_t pin_PA22;
19+
extern const pin_obj_t pin_PA23;
20+
extern const pin_obj_t pin_PA15;
21+
extern const pin_obj_t pin_PA20;
22+
extern const pin_obj_t pin_PA07;
23+
extern const pin_obj_t pin_PA18;
24+
extern const pin_obj_t pin_PA16;
25+
extern const pin_obj_t pin_PA19;
26+
extern const pin_obj_t pin_PA17;
27+
28+
#endif // __MICROPY_INCLUDED_ATMEL_SAMD_BOARDS_FEATHER_M0_BLE_PINS_H__
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#include "pins.h"
2+
#include "asf/sam0/drivers/system/system.h"
3+
4+
#define PIN(p_name) \
5+
const pin_obj_t pin_## p_name = { \
6+
{ &pin_type }, \
7+
.name = MP_QSTR_ ## p_name, \
8+
.pin = (PIN_## p_name), \
9+
}
10+
11+
PIN(PA02);
12+
PIN(PB08);
13+
PIN(PB09);
14+
PIN(PA04);
15+
PIN(PA05);
16+
PIN(PB02);
17+
PIN(PB11);
18+
PIN(PB10);
19+
PIN(PA12);
20+
PIN(PA11);
21+
PIN(PA10);
22+
PIN(PA22);
23+
PIN(PA23);
24+
PIN(PA15);
25+
PIN(PA20);
26+
PIN(PA07);
27+
PIN(PA18);
28+
PIN(PA16);
29+
PIN(PA19);
30+
PIN(PA17);
31+
32+
STATIC const mp_map_elem_t pin_cpu_pins_locals_dict_table[] = {
33+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA02), (mp_obj_t)&pin_PA02 },
34+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PB08), (mp_obj_t)&pin_PB08 },
35+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PB09), (mp_obj_t)&pin_PB09 },
36+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA04), (mp_obj_t)&pin_PA04 },
37+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA05), (mp_obj_t)&pin_PA05 },
38+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PB02), (mp_obj_t)&pin_PB02 },
39+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PB11), (mp_obj_t)&pin_PB11 },
40+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PB10), (mp_obj_t)&pin_PB10 },
41+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA12), (mp_obj_t)&pin_PA12 },
42+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA11), (mp_obj_t)&pin_PA11 },
43+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA10), (mp_obj_t)&pin_PA10 },
44+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA22), (mp_obj_t)&pin_PA22 },
45+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA23), (mp_obj_t)&pin_PA23 },
46+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA15), (mp_obj_t)&pin_PA15 },
47+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA20), (mp_obj_t)&pin_PA20 },
48+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA07), (mp_obj_t)&pin_PA07 },
49+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA18), (mp_obj_t)&pin_PA18 },
50+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA16), (mp_obj_t)&pin_PA16 },
51+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA19), (mp_obj_t)&pin_PA19 },
52+
{ MP_OBJ_NEW_QSTR(MP_QSTR_PA17), (mp_obj_t)&pin_PA17 },
53+
};
54+
MP_DEFINE_CONST_DICT(pin_cpu_pins_locals_dict, pin_cpu_pins_locals_dict_table);
55+
56+
STATIC const mp_map_elem_t pin_board_pins_locals_dict_table[] = {
57+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A0), (mp_obj_t)&pin_PA02 },
58+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A1), (mp_obj_t)&pin_PB08 },
59+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A2), (mp_obj_t)&pin_PB09 },
60+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A3), (mp_obj_t)&pin_PA04 },
61+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A4), (mp_obj_t)&pin_PA05 },
62+
{ MP_OBJ_NEW_QSTR(MP_QSTR_A5), (mp_obj_t)&pin_PB02 },
63+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SCK), (mp_obj_t)&pin_PB11 },
64+
{ MP_OBJ_NEW_QSTR(MP_QSTR_MOSI), (mp_obj_t)&pin_PB10 },
65+
{ MP_OBJ_NEW_QSTR(MP_QSTR_MISO), (mp_obj_t)&pin_PA12 },
66+
{ MP_OBJ_NEW_QSTR(MP_QSTR_0RX), (mp_obj_t)&pin_PA11 },
67+
{ MP_OBJ_NEW_QSTR(MP_QSTR_1TX), (mp_obj_t)&pin_PA10 },
68+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SDA), (mp_obj_t)&pin_PA22 },
69+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SCL), (mp_obj_t)&pin_PA23 },
70+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D5), (mp_obj_t)&pin_PA15 },
71+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D6), (mp_obj_t)&pin_PA20 },
72+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D9), (mp_obj_t)&pin_PA07 },
73+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D10), (mp_obj_t)&pin_PA18 },
74+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D11), (mp_obj_t)&pin_PA16 },
75+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D12), (mp_obj_t)&pin_PA19 },
76+
{ MP_OBJ_NEW_QSTR(MP_QSTR_D13), (mp_obj_t)&pin_PA17 },
77+
};
78+
MP_DEFINE_CONST_DICT(pin_board_pins_locals_dict, pin_board_pins_locals_dict_table);
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
2+
#ifndef __MICROPY_INCLUDED_ATMEL_SAMD_BOARDS_FEATHER_M0_BLE_PINS_H__
3+
#define __MICROPY_INCLUDED_ATMEL_SAMD_BOARDS_FEATHER_M0_BLE_PINS_H__
4+
5+
#include "pin.h"
6+
7+
extern const pin_obj_t pin_PA02;
8+
extern const pin_obj_t pin_PB08;
9+
extern const pin_obj_t pin_PB09;
10+
extern const pin_obj_t pin_PA04;
11+
extern const pin_obj_t pin_PA05;
12+
extern const pin_obj_t pin_PB02;
13+
extern const pin_obj_t pin_PB11;
14+
extern const pin_obj_t pin_PB10;
15+
extern const pin_obj_t pin_PB21;
16+
extern const pin_obj_t pin_PA11;
17+
extern const pin_obj_t pin_PA10;
18+
extern const pin_obj_t pin_PA22;
19+
extern const pin_obj_t pin_PA23;
20+
extern const pin_obj_t pin_PA15;
21+
extern const pin_obj_t pin_PA20;
22+
extern const pin_obj_t pin_PA07;
23+
extern const pin_obj_t pin_PA18;
24+
extern const pin_obj_t pin_PA16;
25+
extern const pin_obj_t pin_PA19;
26+
extern const pin_obj_t pin_PA17;
27+
28+
#endif // __MICROPY_INCLUDED_ATMEL_SAMD_BOARDS_FEATHER_M0_BLE_PINS_H__

atmel-samd/main.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "asf/sam0/drivers/system/system.h"
1919

2020
#include "mpconfigboard.h"
21+
#include "pin.h"
2122
#include "uart.h"
2223

2324
void do_str(const char *src, mp_parse_input_kind_t input_kind) {
@@ -41,7 +42,7 @@ void do_str(const char *src, mp_parse_input_kind_t input_kind) {
4142
}
4243

4344
static char *stack_top;
44-
static char heap[2048];
45+
static char heap[8192];
4546

4647
int main(int argc, char **argv) {
4748
// initialise the cpu and peripherals
@@ -57,6 +58,9 @@ int main(int argc, char **argv) {
5758
gc_init(heap, heap + sizeof(heap));
5859
#endif
5960
mp_init();
61+
62+
pin_init0();
63+
6064
#if MICROPY_REPL_EVENT_DRIVEN
6165
pyexec_event_repl_init();
6266
for (;;) {

atmel-samd/modmachine.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2013-2015 Damien P. George
7+
* Copyright (c) 2016 Paul Sokolovsky
8+
*
9+
* Permission is hereby granted, free of charge, to any person obtaining a copy
10+
* of this software and associated documentation files (the "Software"), to deal
11+
* in the Software without restriction, including without limitation the rights
12+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13+
* copies of the Software, and to permit persons to whom the Software is
14+
* furnished to do so, subject to the following conditions:
15+
*
16+
* The above copyright notice and this permission notice shall be included in
17+
* all copies or substantial portions of the Software.
18+
*
19+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25+
* THE SOFTWARE.
26+
*/
27+
28+
#include <stdint.h>
29+
#include <stdio.h>
30+
31+
#include "py/obj.h"
32+
#include "py/runtime.h"
33+
34+
#include "pin.h"
35+
36+
#if MICROPY_PY_MACHINE
37+
38+
STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
39+
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_umachine) },
40+
{ MP_ROM_QSTR(MP_QSTR_Pin), MP_ROM_PTR(&pin_type) },
41+
};
42+
43+
STATIC MP_DEFINE_CONST_DICT(machine_module_globals, machine_module_globals_table);
44+
45+
const mp_obj_module_t machine_module = {
46+
.base = { &mp_type_module },
47+
.name = MP_QSTR_umachine,
48+
.globals = (mp_obj_dict_t*)&machine_module_globals,
49+
};
50+
51+
#endif // MICROPY_PY_MACHINE

atmel-samd/mpconfigport.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@
5353
#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_NONE)
5454
#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_NONE)
5555

56+
#define MICROPY_PY_MACHINE (1)
5657
#define MICROPY_MODULE_WEAK_LINKS (1)
58+
#define MICROPY_REPL_AUTO_INDENT (1)
5759

5860
// type definitions for the specific machine
5961

@@ -78,17 +80,21 @@ typedef long mp_off_t;
7880
extern const struct _mp_obj_module_t machine_module;
7981
extern const struct _mp_obj_module_t utime_module;
8082

81-
//{ MP_OBJ_NEW_QSTR(MP_QSTR_umachine), (mp_obj_t)&machine_module },
8283
#define MICROPY_PORT_BUILTIN_MODULES \
84+
{ MP_OBJ_NEW_QSTR(MP_QSTR_umachine), (mp_obj_t)&machine_module }, \
8385
{ MP_OBJ_NEW_QSTR(MP_QSTR_utime), (mp_obj_t)&utime_module } \
8486

8587
#define MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS \
88+
{ MP_OBJ_NEW_QSTR(MP_QSTR_machine), (mp_obj_t)&machine_module }, \
8689
{ MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&utime_module } \
8790

88-
8991
// board specific definitions
9092
#include "mpconfigboard.h"
9193

94+
#ifndef MICROPY_PIN_DEFS_PORT_H
95+
#define MICROPY_PIN_DEFS_PORT_H "pins.h"
96+
#endif
97+
9298
// We need to provide a declaration/definition of alloca()
9399
#include <alloca.h>
94100

@@ -105,6 +111,8 @@ extern const struct _mp_obj_module_t utime_module;
105111

106112
#define MICROPY_PORT_ROOT_POINTERS \
107113
const char *readline_hist[8]; \
108-
vstr_t *repl_line;
114+
vstr_t *repl_line; \
115+
mp_obj_t pin_class_mapper; \
116+
mp_obj_t pin_class_map_dict; \
109117

110118
#endif // __INCLUDED_MPCONFIGPORT_H

0 commit comments

Comments
 (0)