Skip to content

Commit

Permalink
ports/snekboard: Add snekboard port
Browse files Browse the repository at this point in the history
This is a custom SAMD21G board with 9V motor controllers designed to
operate Lego devices.

Signed-off-by: Keith Packard <keithp@keithp.com>
  • Loading branch information
keith-packard committed Jun 30, 2019
1 parent fd609b3 commit 3b80f7e
Show file tree
Hide file tree
Showing 6 changed files with 344 additions and 2 deletions.
6 changes: 6 additions & 0 deletions ports/snekboard/.gitignore
@@ -0,0 +1,6 @@
snek-board*.bin
snek-board*.map
snek-board*.uf2
snek-board*.elf
*.o
ao-product.h
58 changes: 58 additions & 0 deletions ports/snekboard/Makefile
@@ -0,0 +1,58 @@
#
# Copyright © 2019 Keith Packard <keithp@keithp.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#

SNEK_ROOT = ../..

SNEK_SAMD21 = $(SNEK_ROOT)/chips/samd21

PROGNAME=snek-board
PRODUCT_NAME=SnekBoard

BOOTLOADER_BIN=bootloader-snekboard-v3.7.0.bin

include $(SNEK_SAMD21)/snek-samd21.defs

SNEK_LOCAL_SRC = \
$(SNEK_SAMD21_SRC)

SNEK_LOCAL_INC = \
$(SNEK_SAMD21_INC)

SNEK_LOCAL_BUILTINS = \
$(SNEK_SAMD21_BUILTINS) \
snek-board.builtin

include $(SNEK_ROOT)/snek-install.defs

SRC=$(SNEK_SRC)
OBJ=$(SRC:.c=.o)

all: $(ELF) $(BIN) $(UF2)

$(PROG): Makefile $(OBJ)
$(call quiet,CC) $(LDFLAGS) -Wl,-M=$(MAP) -o $@ $(OBJ) $(LIBS)

$(OBJ): $(SNEK_INC)

distclean: clean

clean::
rm -f *.o $(PROGNAME)*.elf $(PROGNAME)*.bin $(PROGNAME)*.uf2 $(PROGNAME)*.map ao-product.h

install:
install -d $(DESTDIR)$(SHAREDIR)
install -m 0644 $(UF2) $(DESTDIR)$(SHAREDIR)
install -m 0644 $(BOOTLOADER_BIN) $(DESTDIR)$(SHAREDIR)

uninstall:
250 changes: 250 additions & 0 deletions ports/snekboard/ao-pins.h
@@ -0,0 +1,250 @@
/*
* Copyright © 2012 Keith Packard <keithp@keithp.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/

#ifndef _AO_PINS_H_
#define _AO_PINS_H_

/* Run dffl48m clock at 48MHz */
#define AO_DFLL48M 48000000

#define AO_AHB_PRESCALER 1
#define AO_APBA_PRESCALER 1

#define HAS_SERIAL_0 0
#define USE_SERIAL_0_STDIN 0
#define SERIAL_0_PA10_PA11 0

#define HAS_USB 1
#define AO_USB_OUT_HOOK 1
#define USE_USB_FIFO 1
#define HAS_BEEP 0

#define AO_SNEK_TIMER_FUNC_E 0
#define AO_SNEK_TIMER_FUNC_F 0x80
#define AO_SNEK_TIMER_FUNC_MASK 0x80
#define AO_SNEK_TIMER_DEV_TCC 0
#define AO_SNEK_TIMER_DEV_TC 0x40
#define AO_SNEK_TIMER_DEV_MASK 0x40
#define AO_SNEK_TIMER_CH_MASK 0x0f

#define AO_SNEK_TIMER_CH(ch,func,dev) ((ch) | (func) | (dev))

/*
* Available timers:
*
* TCC0.[0-7] 0-3 overlap 4-7 0,1,2,3
* TCC1.[0-3] 0-1 overlap 2-3 0,1
* TCC2.[0-1] 0,1
* TC3.[0-1] 0,1
* TC4.[0-1] 0,1
* TC5.[0-1]
*
* 1 PA00
* 2 PA01
* 3 PA02 AIN0
* 4 PA03 AIN1
* 9 PA04 AIN4 TCC0.0/E
* 10 PA05 AIN5 TCC0.1/E
* 11 PA06 AIN6 TCC1.0/E ANALOG3 TCC1.0/E
* 12 PA07 AIN7 TCC1.1/E ANALOG4 TCC1.0/E
* 13 PA08 AIN16 TCC0.0/E TCC1.2/F ANALOG5 TCC0.0/E
* 14 PA09 AIN17 TCC0.1/E TCC1.3/F ANALOG6 TCC0.1/E
* 15 PA10 AIN18 TCC1.0/E TCC0.2/F ANALOG7 TCC0.2/F
* 16 PA11 AIN19 TCC1.1/E TCC0.3/F ANALOG8 TCC0.3/F
* 21 PA12 TCC2.0/E TCC0.6/F M1_PWR TCC2.0/E
* 22 PA13 TCC2.1/E TCC0.7/F M2_PWR TCC2.1/E
* 23 PA14 XOSC
* 24 PA15 XOSC
* 25 PA16 TCC2.0/E TCC0.6/F M1_DIR
* 26 PA17 TCC2.1/E TCC0.7/F M2_DIR
* 27 PA18 TC3.0/E TCC0.2/F M3_PWR TC3.0/E
* 28 PA19 TC3.1/E TCC0.3/F M4_PWR TC3.1/E
* 29 PA20 M3_DIR
* 30 PA21 M4_DIR
* 31 PA22 DIGITAL1
* 32 PA23 DIGITAL2
* 33 PA24 TC5.0 DATA-
* 34 PA25 TC5.1 DATA+
* 39 PA27 DIGITAL3
* 41 PA28 DIGITAL4
* 45 PA30 DIGITAL5
* 46 PA31 DIGITAL6
* none AIN8
* none AIN9
* 47 PB02 AIN10 DIGITAL7
* 48 PB03 AIN11 DIGITAL8
* 7 PB08 AIN2 TC4.0/E ANALOG1 TC4.0/E
* 8 PB09 AIN3 TC4.1/E ANALOG2 TC4.1/E
* 19 PB10 TC5.0
* 20 PB11 TC5.1
* 37 PB22
* 38 PB23
* ANALOG1 PB08 AIN2 TC4.0/E 0
* ANALOG2 PB09 AIN3 TC4.1/E 1
* ANALOG3 PA06 AIN6 TCC1.0/E 2
* ANALOG4 PA07 AIN7 TCC1.1/E 3
* ANALOG5 PA08 AIN16 TCC0.0/E 4
* ANALOG6 PA09 AIN17 TCC0.1/E 5
* ANALOG7 PA10 AIN18 TCC0.2/F 6
* ANALOG8 PA11 AIN19 TCC0.3/F 7
*
* M1_PWR PA12 TCC2.0/E 8
* M1_DIR PA16 9
* M2_PWR PA13 TCC2.1/E 10
* M2_DIR PA17 11
* M3_PWR PA18 TC3.0/E 12
* M3_DIR PA20 13
* M4_PWR PA19 TC3.1/E 14
* M4_DIR PA21 15
*
* NEOPIXEL PB11 16
*
* LED PA02
*/

/* ANALOG1 */
#define AO_SNEK_GPIO_0 (&samd21_port_b)
#define AO_SNEK_PIN_0 8
#define AO_SNEK_TIMER_0 (&samd21_tc4)
#define AO_SNEK_CHANNEL_0 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC)
#define AO_SNEK_ADC_0 2

/* ANALOG2 */
#define AO_SNEK_GPIO_1 (&samd21_port_b)
#define AO_SNEK_PIN_1 9
#define AO_SNEK_TIMER_1 (&samd21_tc4)
#define AO_SNEK_CHANNEL_1 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC)
#define AO_SNEK_ADC_1 3

/* ANALOG3 */
#define AO_SNEK_GPIO_2 (&samd21_port_a)
#define AO_SNEK_PIN_2 6
#define AO_SNEK_TIMER_2 (&samd21_tcc1)
#define AO_SNEK_CHANNEL_2 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC)
#define AO_SNEK_ADC_2 6

/* ANALOG4 */
#define AO_SNEK_GPIO_3 (&samd21_port_a)
#define AO_SNEK_PIN_3 7
#define AO_SNEK_TIMER_3 (&samd21_tcc1)
#define AO_SNEK_CHANNEL_3 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC)
#define AO_SNEK_ADC_3 7

/* ANALOG5 */
#define AO_SNEK_GPIO_4 (&samd21_port_a)
#define AO_SNEK_PIN_4 8
#define AO_SNEK_TIMER_4 (&samd21_tcc0)
#define AO_SNEK_CHANNEL_4 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC)
#define AO_SNEK_ADC_4 16

/* ANALOG6 */
#define AO_SNEK_GPIO_5 (&samd21_port_a)
#define AO_SNEK_PIN_5 9
#define AO_SNEK_TIMER_5 (&samd21_tcc0)
#define AO_SNEK_CHANNEL_5 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC)
#define AO_SNEK_ADC_5 17

/* ANALOG7 */
#define AO_SNEK_GPIO_6 (&samd21_port_a)
#define AO_SNEK_PIN_6 10
#define AO_SNEK_TIMER_6 (&samd21_tcc0)
#define AO_SNEK_CHANNEL_6 AO_SNEK_TIMER_CH(2, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC)
#define AO_SNEK_ADC_6 18

/* ANALOG8 */
#define AO_SNEK_GPIO_7 (&samd21_port_a)
#define AO_SNEK_PIN_7 11
#define AO_SNEK_TIMER_7 (&samd21_tcc0)
#define AO_SNEK_CHANNEL_7 AO_SNEK_TIMER_CH(3, AO_SNEK_TIMER_FUNC_F, AO_SNEK_TIMER_DEV_TCC)
#define AO_SNEK_ADC_7 19

/* MOTOR1_POWER */
#define AO_SNEK_GPIO_8 (&samd21_port_a)
#define AO_SNEK_PIN_8 12
#define AO_SNEK_TIMER_8 (&samd21_tcc2)
#define AO_SNEK_CHANNEL_8 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC)
#define AO_SNEK_ADC_8 0xff

/* MOTOR1_DIR */
#define AO_SNEK_GPIO_9 (&samd21_port_a)
#define AO_SNEK_PIN_9 16
#define AO_SNEK_TIMER_9 NULL
#define AO_SNEK_CHANNEL_9 0
#define AO_SNEK_ADC_9 0xff

/* MOTOR2_POWER */
#define AO_SNEK_GPIO_10 (&samd21_port_a)
#define AO_SNEK_PIN_10 13
#define AO_SNEK_TIMER_10 (&samd21_tcc2)
#define AO_SNEK_CHANNEL_10 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TCC)
#define AO_SNEK_ADC_10 0xff

/* MOTOR2_DIR */
#define AO_SNEK_GPIO_11 (&samd21_port_a)
#define AO_SNEK_PIN_11 17
#define AO_SNEK_TIMER_11 NULL
#define AO_SNEK_CHANNEL_11 0
#define AO_SNEK_ADC_11 0xff

/* MOTOR3_POWER */
#define AO_SNEK_GPIO_12 (&samd21_port_a)
#define AO_SNEK_PIN_12 18
#define AO_SNEK_TIMER_12 (&samd21_tc3)
#define AO_SNEK_CHANNEL_12 AO_SNEK_TIMER_CH(0, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC)
#define AO_SNEK_ADC_12 0xff

/* MOTOR3_DIR */
#define AO_SNEK_GPIO_13 (&samd21_port_a)
#define AO_SNEK_PIN_13 20
#define AO_SNEK_TIMER_13 NULL
#define AO_SNEK_CHANNEL_13 0
#define AO_SNEK_ADC_13 0xff

/* MOTOR4_POWER */
#define AO_SNEK_GPIO_14 (&samd21_port_a)
#define AO_SNEK_PIN_14 19
#define AO_SNEK_TIMER_14 (&samd21_tc3)
#define AO_SNEK_CHANNEL_14 AO_SNEK_TIMER_CH(1, AO_SNEK_TIMER_FUNC_E, AO_SNEK_TIMER_DEV_TC)
#define AO_SNEK_ADC_14 0xff

/* MOTOR4_DIR */
#define AO_SNEK_GPIO_15 (&samd21_port_a)
#define AO_SNEK_PIN_15 21
#define AO_SNEK_TIMER_15 NULL
#define AO_SNEK_CHANNEL_15 0
#define AO_SNEK_ADC_15 0xff

/* NEOPIXEL */
#define AO_SNEK_GPIO_16 (&samd21_port_b)
#define AO_SNEK_PIN_16 11
#define AO_SNEK_TIMER_16 NULL
#define AO_SNEK_CHANNEL_16 0
#define AO_SNEK_ADC_16 0xff

#define AO_SNEK_NUM_PIN 17

#define LED_0_PORT (&samd21_port_a)
#define LED_0_PIN 2
#define LED_PIN_TX 0
#define AO_LED_TX (1 << LED_PIN_TX)
#define AO_LED_PANIC AO_LED_TX

#define LEDS_AVAILABLE (AO_LED_TX)

#endif /* _AO_PINS_H_ */
Binary file not shown.
26 changes: 26 additions & 0 deletions ports/snekboard/snek-board.builtin
@@ -0,0 +1,26 @@
#
# Copyright © 2019 Keith Packard <keithp@keithp.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
ANALOG1,-2, 0
ANALOG2,-2, 1
ANALOG3,-2, 2
ANALOG4,-2, 3
ANALOG5,-2, 4
ANALOG6,-2, 5
ANALOG7,-2, 6
ANALOG8,-2, 7
MOTOR1, -2, = snek_list_build(snek_list_tuple, 2, snek_float_to_poly(8), snek_float_to_poly(9))
MOTOR2, -2, = snek_list_build(snek_list_tuple, 2, snek_float_to_poly(10), snek_float_to_poly(11))
MOTOR3, -2, = snek_list_build(snek_list_tuple, 2, snek_float_to_poly(12), snek_float_to_poly(13))
MOTOR4, -2, = snek_list_build(snek_list_tuple, 2, snek_float_to_poly(14), snek_float_to_poly(15))
NEOPIXEL, -2, 16
6 changes: 4 additions & 2 deletions snek-install.defs
Expand Up @@ -22,8 +22,10 @@ FIRMWARE ?= \
$(SNEK_PORTS)/itsybitsym0/snek-itsybitsym0-$(SNEK_VERSION).uf2 \
$(SNEK_PORTS)/mega/snek-mega-$(SNEK_VERSION).hex \
$(SNEK_PORTS)/metrom0/snek-metrom0-$(SNEK_VERSION).uf2 \
$(SNEK_PORTS)/playground/snek-playground-$(SNEK_VERSION).uf2
$(SNEK_PORTS)/playground/snek-playground-$(SNEK_VERSION).uf2 \
$(SNEK_PORTS)/snekboard/snek-board-$(SNEK_VERSION).uf2
USBFIRMWARE ?= \
$(SNEK_PORTS)/mega/Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex
$(SNEK_PORTS)/mega/Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex \
$(SNEK_PORTS)/snekboard/bootloader-snekboard-v3.7.0.bin

include $(SNEK_ROOT)/snek.defs

0 comments on commit 3b80f7e

Please sign in to comment.