From 66b06332dadd83c309bbfe02240b7a071fd57ff2 Mon Sep 17 00:00:00 2001 From: Bdale Garbee Date: Sun, 2 Apr 2017 15:41:56 -0600 Subject: initial skeleton of CortexELF support --- src/cortexelf-v1/ao_cortexelf.c | 51 +++++++++ src/cortexelf-v1/ao_pins.h | 182 ++++++++++++++++++++++++++++++++ src/cortexelf-v1/flash-loader/ao_pins.h | 35 ++++++ 3 files changed, 268 insertions(+) create mode 100644 src/cortexelf-v1/ao_cortexelf.c create mode 100644 src/cortexelf-v1/ao_pins.h create mode 100644 src/cortexelf-v1/flash-loader/ao_pins.h (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/ao_cortexelf.c b/src/cortexelf-v1/ao_cortexelf.c new file mode 100644 index 00000000..01c5165b --- /dev/null +++ b/src/cortexelf-v1/ao_cortexelf.c @@ -0,0 +1,51 @@ +/* + * Copyright © 2011 Keith Packard + * + * 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 2 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. + */ + +#include +#include +#include +#if HAS_STACK_GUARD +#include +#endif + +int +main(void) +{ + ao_clock_init(); + +#if HAS_STACK_GUARD + ao_mpu_init(); +#endif + + ao_task_init(); + ao_serial_init(); + ao_timer_init(); + + ao_spi_init(); + ao_dma_init(); + ao_exti_init(); + + ao_cmd_init(); + + ao_usb_init(); + + ao_config_init(); + + ao_start_scheduler(); + return 0; +} diff --git a/src/cortexelf-v1/ao_pins.h b/src/cortexelf-v1/ao_pins.h new file mode 100644 index 00000000..2c960a6b --- /dev/null +++ b/src/cortexelf-v1/ao_pins.h @@ -0,0 +1,182 @@ +/* + * Copyright © 2012 Keith Packard + * + * 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 2 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_ + +#define HAS_TASK_QUEUE 1 + +/* 8MHz High speed external crystal */ +#define AO_HSE 8000000 + +/* PLLVCO = 96MHz (so that USB will work) */ +#define AO_PLLMUL 12 +#define AO_RCC_CFGR_PLLMUL (STM_RCC_CFGR_PLLMUL_12) + +/* SYSCLK = 32MHz (no need to go faster than CPU) */ +#define AO_PLLDIV 3 +#define AO_RCC_CFGR_PLLDIV (STM_RCC_CFGR_PLLDIV_3) + +/* HCLK = 32MHz (CPU clock) */ +#define AO_AHB_PRESCALER 1 +#define AO_RCC_CFGR_HPRE_DIV STM_RCC_CFGR_HPRE_DIV_1 + +/* Run APB1 at 16MHz (HCLK/2) */ +#define AO_APB1_PRESCALER 2 +#define AO_RCC_CFGR_PPRE1_DIV STM_RCC_CFGR_PPRE2_DIV_2 + +/* Run APB2 at 16MHz (HCLK/2) */ +#define AO_APB2_PRESCALER 2 +#define AO_RCC_CFGR_PPRE2_DIV STM_RCC_CFGR_PPRE2_DIV_2 + +#define HAS_SERIAL_1 1 +#define USE_SERIAL_1_STDIN 0 +#define SERIAL_1_PB6_PB7 1 +#define SERIAL_1_PA9_PA10 0 + +#define HAS_SERIAL_2 1 +#define USE_SERIAL_2_STDIN 0 +#define SERIAL_2_PA2_PA3 0 +#define SERIAL_2_PD5_PD6 1 + +#define HAS_SERIAL_3 0 +#define USE_SERIAL_3_STDIN 0 +#define SERIAL_3_PB10_PB11 0 +#define SERIAL_3_PC10_PC11 0 +#define SERIAL_3_PD8_PD9 0 + +#define HAS_EEPROM 0 +#define USE_INTERNAL_FLASH 0 +#define USE_EEPROM_CONFIG 0 +#define USE_STORAGE_CONFIG 0 +#define HAS_USB 1 +#define HAS_BEEP 0 +#define HAS_BATTERY_REPORT 0 +#define HAS_RADIO 0 +#define HAS_TELEMETRY 0 +#define HAS_APRS 0 +#define HAS_COMPANION 0 + +#define HAS_SPI_1 0 +#define SPI_1_PA5_PA6_PA7 0 +#define SPI_1_PB3_PB4_PB5 0 +#define SPI_1_PE13_PE14_PE15 0 +#define SPI_1_OSPEEDR STM_OSPEEDR_10MHz + +#define HAS_SPI_2 1 +#define SPI_2_PB13_PB14_PB15 0 +#define SPI_2_PD1_PD3_PD4 1 /* LED displays, microSD */ +#define SPI_2_OSPEEDR STM_OSPEEDR_10MHz + +#define SPI_2_PORT (&stm_gpiod) +#define SPI_2_SCK_PIN 1 +#define SPI_2_MISO_PIN 3 +#define SPI_2_MOSI_PIN 4 + +#define HAS_I2C_1 0 +#define I2C_1_PB8_PB9 0 + +#define HAS_I2C_2 0 +#define I2C_2_PB10_PB11 0 + +#define PACKET_HAS_SLAVE 0 +#define PACKET_HAS_MASTER 0 + +#define LOW_LEVEL_DEBUG 0 + +#define LED_PORT_ENABLE STM_RCC_AHBENR_GPIOCEN +#define LED_PORT (&stm_gpioc) +#define LED_PIN_RED 0 +#define LED_PIN_GREEN 0 +#define AO_LED_RED (1 << LED_PIN_RED) +#define AO_LED_GREEN (1 << LED_PIN_GREEN) + +#define LEDS_AVAILABLE 0 + +#define HAS_GPS 0 +#define HAS_FLIGHT 0 +#define HAS_ADC 0 +#define HAS_ADC_TEMP 0 +#define HAS_LOG 0 + +/* + * Pressure sensor settings + */ +#define HAS_MS5607 0 +#define HAS_MS5611 0 +#define AO_MS5607_PRIVATE_PINS 0 +#define AO_MS5607_CS_PORT (&stm_gpioc) +#define AO_MS5607_CS_PIN 4 +#define AO_MS5607_CS_MASK (1 << AO_MS5607_CS) +#define AO_MS5607_MISO_PORT (&stm_gpioa) +#define AO_MS5607_MISO_PIN 6 +#define AO_MS5607_MISO_MASK (1 << AO_MS5607_MISO) +#define AO_MS5607_SPI_INDEX AO_SPI_1_PA5_PA6_PA7 + +/* + * SPI Flash memory + */ + +#define M25_MAX_CHIPS 0 +#define AO_M25_SPI_CS_PORT (&stm_gpiod) +#define AO_M25_SPI_CS_MASK (1 << 3) +#define AO_M25_SPI_BUS AO_SPI_2_PB13_PB14_PB15 + +#define NUM_CMDS 16 + +/* + * Monitor + */ + +#define HAS_MONITOR 0 +#define LEGACY_MONITOR 0 +#define HAS_MONITOR_PUT 0 +#define AO_MONITOR_LED 0 +#define HAS_RSSI 0 + +/* + * Profiling Viterbi decoding + */ + +#ifndef AO_PROFILE +#define AO_PROFILE 0 +#endif + +/* + * PWM output + */ + +#define NUM_PWM 0 +#define PWM_MAX 20000 +#define AO_PWM_TIMER stm_tim4 +#define AO_PWM_TIMER_ENABLE STM_RCC_APB1ENR_TIM4EN +#define AO_PWM_TIMER_SCALE 32 + +#define AO_PWM_0_GPIO (&stm_gpiod) +#define AO_PWM_0_PIN 12 + +#define AO_PWM_1_GPIO (&stm_gpiod) +#define AO_PWM_1_PIN 13 + +#define AO_PWM_2_GPIO (&stm_gpiod) +#define AO_PWM_2_PIN 14 + +#define AO_PWM_3_GPIO (&stm_gpiod) +#define AO_PWM_3_PIN 15 + +#endif /* _AO_PINS_H_ */ diff --git a/src/cortexelf-v1/flash-loader/ao_pins.h b/src/cortexelf-v1/flash-loader/ao_pins.h new file mode 100644 index 00000000..a34bcb6c --- /dev/null +++ b/src/cortexelf-v1/flash-loader/ao_pins.h @@ -0,0 +1,35 @@ +/* + * Copyright © 2013 Keith Packard + * + * 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 2 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_ + +/* External crystal at 8MHz */ +#define AO_HSE 8000000 + +#include + +/* Companion port cs_companion0 PB6 */ + +#define AO_BOOT_PIN 1 +#define AO_BOOT_APPLICATION_GPIO stm_gpiob +#define AO_BOOT_APPLICATION_PIN 0 +#define AO_BOOT_APPLICATION_VALUE 1 +#define AO_BOOT_APPLICATION_MODE AO_EXTI_MODE_PULL_UP + +#endif /* _AO_PINS_H_ */ -- cgit v1.2.3 From bc150497de8539827177805c7f4430c67ca6762f Mon Sep 17 00:00:00 2001 From: Bdale Garbee Date: Sun, 2 Apr 2017 15:47:14 -0600 Subject: makefiles too --- src/cortexelf-v1/Makefile | 115 +++++++++++++++++++++++++++++++++ src/cortexelf-v1/flash-loader/Makefile | 8 +++ 2 files changed, 123 insertions(+) create mode 100644 src/cortexelf-v1/Makefile create mode 100644 src/cortexelf-v1/flash-loader/Makefile (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/Makefile b/src/cortexelf-v1/Makefile new file mode 100644 index 00000000..a645d222 --- /dev/null +++ b/src/cortexelf-v1/Makefile @@ -0,0 +1,115 @@ +# +# AltOS build +# +# + +include ../stm/Makefile.defs + +INC = \ + ao.h \ + ao_arch.h \ + ao_arch_funcs.h \ + ao_boot.h \ + ao_pins.h \ + ao_kalman.h \ + ao_product.h \ + ao_profile.h \ + ao_task.h \ + ao_whiten.h \ + ao_quaternion.h \ + math.h \ + ao_mpu.h \ + stm32l.h \ + math.h \ + Makefile + +# +# Common AltOS sources +# +# ao_hmc5883.c + +#PROFILE=ao_profile.c +#PROFILE_DEF=-DAO_PROFILE=1 + +#STACK_GUARD=ao_mpu_stm.c +#STACK_GUARD_DEF=-DHAS_STACK_GUARD=1 + +MATH_SRC=\ + ef_acos.c \ + ef_sqrt.c \ + ef_rem_pio2.c \ + kf_cos.c \ + kf_sin.c \ + kf_rem_pio2.c \ + sf_copysign.c \ + sf_cos.c \ + sf_fabs.c \ + sf_floor.c \ + sf_scalbn.c \ + sf_sin.c \ + ef_log.c + +ALTOS_SRC = \ + ao_boot_chain.c \ + ao_interrupt.c \ + ao_product.c \ + ao_romconfig.c \ + ao_cmd.c \ + ao_config.c \ + ao_task.c \ + ao_led.c \ + ao_stdio.c \ + ao_panic.c \ + ao_timer.c \ + ao_mutex.c \ + ao_serial_stm.c \ + ao_ignite.c \ + ao_freq.c \ + ao_dma_stm.c \ + ao_spi_stm.c \ + ao_storage.c \ + ao_m25.c \ + ao_usb_stm.c \ + ao_exti_stm.c \ + ao_i2c_stm.c \ + ao_convert_volt.c \ + $(MATH_SRC) \ + $(PROFILE) \ + $(SAMPLE_PROFILE) \ + $(STACK_GUARD) + +PRODUCT=CortexELF-v1 +PRODUCT_DEF=-DCORTEXELF +IDPRODUCT=0x000a + +CFLAGS = $(PRODUCT_DEF) $(STM_CFLAGS) $(PROFILE_DEF) $(SAMPLE_PROFILE_DEF) $(STACK_GUARD_DEF) -Os -g + +PROGNAME=cortexelf-v1 +PROG=$(PROGNAME)-$(VERSION).elf +HEX=$(PROGNAME)-$(VERSION).ihx + +SRC=$(ALTOS_SRC) ao_cortexelf.c +OBJ=$(SRC:.c=.o) + +all: $(PROG) $(HEX) + +$(PROG): Makefile $(OBJ) altos.ld + $(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(OBJ) $(LIBS) + +../altitude-pa.h: make-altitude-pa + nickle $< > $@ + +$(OBJ): $(INC) + +ao_product.h: ao-make-product.5c ../Version + $(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@ + +distclean: clean + +clean: + rm -f *.o $(PROGNAME)-*.elf $(PROGNAME)-*.ihx + rm -f ao_product.h + +install: + +uninstall: diff --git a/src/cortexelf-v1/flash-loader/Makefile b/src/cortexelf-v1/flash-loader/Makefile new file mode 100644 index 00000000..19cf84e4 --- /dev/null +++ b/src/cortexelf-v1/flash-loader/Makefile @@ -0,0 +1,8 @@ +# +# AltOS flash loader build +# +# + +TOPDIR=../.. +HARDWARE=cortexelf-v1 +include $(TOPDIR)/stm/Makefile-flash.defs -- cgit v1.2.3 From 637d522c6a15b47051103ccc3626be3206a7a2df Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 2 Apr 2017 15:04:09 -0700 Subject: cortexelf-v1: Add ps/2 and vga with graphics Start hooking up devices with known drivers. Signed-off-by: Keith Packard --- src/cortexelf-v1/Makefile | 37 +++------ src/cortexelf-v1/ao_cortexelf.c | 172 ++++++++++++++++++++++++++++++++++++++++ src/cortexelf-v1/ao_pins.h | 9 +++ 3 files changed, 194 insertions(+), 24 deletions(-) (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/Makefile b/src/cortexelf-v1/Makefile index a645d222..e0fdc8fd 100644 --- a/src/cortexelf-v1/Makefile +++ b/src/cortexelf-v1/Makefile @@ -15,18 +15,17 @@ INC = \ ao_product.h \ ao_profile.h \ ao_task.h \ - ao_whiten.h \ - ao_quaternion.h \ math.h \ ao_mpu.h \ stm32l.h \ math.h \ + ao_vga.h \ + ao_draw.h \ + ao_draw_int.h \ + ao_font.h \ + ao_ps2.h \ Makefile -# -# Common AltOS sources -# -# ao_hmc5883.c #PROFILE=ao_profile.c #PROFILE_DEF=-DAO_PROFILE=1 @@ -34,20 +33,6 @@ INC = \ #STACK_GUARD=ao_mpu_stm.c #STACK_GUARD_DEF=-DHAS_STACK_GUARD=1 -MATH_SRC=\ - ef_acos.c \ - ef_sqrt.c \ - ef_rem_pio2.c \ - kf_cos.c \ - kf_sin.c \ - kf_rem_pio2.c \ - sf_copysign.c \ - sf_cos.c \ - sf_fabs.c \ - sf_floor.c \ - sf_scalbn.c \ - sf_sin.c \ - ef_log.c ALTOS_SRC = \ ao_boot_chain.c \ @@ -63,8 +48,6 @@ ALTOS_SRC = \ ao_timer.c \ ao_mutex.c \ ao_serial_stm.c \ - ao_ignite.c \ - ao_freq.c \ ao_dma_stm.c \ ao_spi_stm.c \ ao_storage.c \ @@ -72,8 +55,14 @@ ALTOS_SRC = \ ao_usb_stm.c \ ao_exti_stm.c \ ao_i2c_stm.c \ - ao_convert_volt.c \ - $(MATH_SRC) \ + ao_vga.c \ + ao_blt.c \ + ao_copy.c \ + ao_rect.c \ + ao_text.c \ + ao_line.c \ + ao_ps2.c \ + ao_console.c \ $(PROFILE) \ $(SAMPLE_PROFILE) \ $(STACK_GUARD) diff --git a/src/cortexelf-v1/ao_cortexelf.c b/src/cortexelf-v1/ao_cortexelf.c index 01c5165b..776530e0 100644 --- a/src/cortexelf-v1/ao_cortexelf.c +++ b/src/cortexelf-v1/ao_cortexelf.c @@ -22,6 +22,171 @@ #if HAS_STACK_GUARD #include #endif +#include +#include +#include + +struct ao_task ball_task; + +#define BALL_WIDTH 5 +#define BALL_HEIGHT 5 + +static int ball_x; +static int ball_y; +static int ball_dx, ball_dy; + +uint8_t ball_enable; + +void +ao_ball(void) +{ + ball_dx = 1; + ball_dy = 1; + ball_x = 0; + ball_y = 0; + for (;;) { + while (!ball_enable) + ao_sleep(&ball_enable); + for (;;) { + ao_line(&ao_vga_bitmap, + -100, -100, ball_x*2, ball_y*2, + 1, AO_XOR); + ao_text(&ao_vga_bitmap, + ball_x, ball_y - 10, + "Hello, Bdale!", + 1, AO_XOR); + ao_rect(&ao_vga_bitmap, + ball_x, ball_y, + BALL_WIDTH, + BALL_HEIGHT, + 1, + AO_XOR); + ao_delay(AO_MS_TO_TICKS(10)); + ao_rect(&ao_vga_bitmap, + ball_x, ball_y, + BALL_WIDTH, + BALL_HEIGHT, + 1, + AO_XOR); + ao_text(&ao_vga_bitmap, + ball_x, ball_y - 10, + "Hello, Bdale!", + 1, AO_XOR); + ao_line(&ao_vga_bitmap, + -100, -100, ball_x*2, ball_y*2, + 1, AO_XOR); + if (!ball_enable) + break; + ball_x += ball_dx; + ball_y += ball_dy; + if (ball_x + BALL_WIDTH > AO_VGA_WIDTH) { + ball_x = AO_VGA_WIDTH - BALL_WIDTH; + ball_dx = -ball_dx; + } + if (ball_x < 0) { + ball_x = -ball_x; + ball_dx = -ball_dx; + } + if (ball_y + BALL_HEIGHT > AO_VGA_HEIGHT) { + ball_y = AO_VGA_HEIGHT - BALL_HEIGHT; + ball_dy = -ball_dy; + } + if (ball_y < 0) { + ball_y = -ball_y; + ball_dy = -ball_dy; + } + } + } +} + +static void +ao_fb_init(void) +{ + ao_rect(&ao_vga_bitmap, + 0, 0, AO_VGA_WIDTH, AO_VGA_HEIGHT, + 1, AO_COPY); + + ao_rect(&ao_vga_bitmap, + 10, 10, 10, 10, + 0, AO_COPY); + + ao_rect(&ao_vga_bitmap, + AO_VGA_WIDTH - 20, 10, 10, 10, + 0, AO_COPY); + + ao_rect(&ao_vga_bitmap, + 10, AO_VGA_HEIGHT - 20, 10, 10, + 0, AO_COPY); + + ao_rect(&ao_vga_bitmap, + AO_VGA_WIDTH - 20, AO_VGA_HEIGHT - 20, 10, 10, + 0, AO_COPY); + + ao_text(&ao_vga_bitmap, + 20, 100, + "Hello, Bdale!", + 0, AO_COPY); + + ao_text(&ao_vga_bitmap, + 1, ao_font.ascent, + "UL", + 0, AO_COPY); + + ao_text(&ao_vga_bitmap, + 1, AO_VGA_HEIGHT - ao_font.descent, + "BL", + 0, AO_COPY); +} + +static void +ao_video_toggle(void) +{ + ao_cmd_decimal(); + if (ao_cmd_lex_i) + ao_fb_init(); + ao_vga_enable(ao_cmd_lex_i); +} + +static void +ao_ball_toggle(void) +{ + ao_cmd_decimal(); + ball_enable = ao_cmd_lex_i; + ao_wakeup(&ball_enable); +} + +static void +ao_ps2_read_keys(void) +{ + char c; + + for (;;) { + c = ao_ps2_getchar(); + printf("%02x %c\n", c, ' ' <= c && c < 0x7f ? c : '.'); + flush(); + if (c == ' ') + break; + } +} + +static void +ao_console_send(void) +{ + char c; + + while ((c = getchar()) != '~') { + ao_console_putchar(c); + flush(); + } +} + +__code struct ao_cmds ao_demo_cmds[] = { + { ao_video_toggle, "V\0Toggle video" }, + { ao_ball_toggle, "B\0Toggle ball" }, + { ao_ps2_read_keys, "K\0Read keys from keyboard" }, + { ao_console_send, "C\0Send data to console, end with ~" }, + { 0, NULL } +}; int main(void) @@ -40,12 +205,19 @@ main(void) ao_dma_init(); ao_exti_init(); + ao_ps2_init(); + ao_vga_init(); + ao_console_init(); + ao_cmd_init(); ao_usb_init(); ao_config_init(); + ao_add_task(&ball_task, ao_ball, "ball"); + ao_cmd_register(&ao_demo_cmds[0]); + ao_start_scheduler(); return 0; } diff --git a/src/cortexelf-v1/ao_pins.h b/src/cortexelf-v1/ao_pins.h index 2c960a6b..e486038a 100644 --- a/src/cortexelf-v1/ao_pins.h +++ b/src/cortexelf-v1/ao_pins.h @@ -44,6 +44,15 @@ #define AO_APB2_PRESCALER 2 #define AO_RCC_CFGR_PPRE2_DIV STM_RCC_CFGR_PPRE2_DIV_2 +/* Allow for non-maskable interrupts at priority 0 */ +#define AO_NONMASK_INTERRUPT 1 + +/* PS/2 keyboard connection */ +#define AO_PS2_CLOCK_PORT (&stm_gpiod) +#define AO_PS2_CLOCK_BIT 9 +#define AO_PS2_DATA_PORT (&stm_gpiod) +#define AO_PS2_DATA_BIT 8 + #define HAS_SERIAL_1 1 #define USE_SERIAL_1_STDIN 0 #define SERIAL_1_PB6_PB7 1 -- cgit v1.2.3 From 62b0228aed5191c8d769f9f34143a13036e210a7 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 2 Apr 2017 15:18:34 -0700 Subject: cortexelf-v1: Fix clock to drive VGA at 640/480. Add sdcard, remove others VGA requires the CPU to run at 24MHz. Signed-off-by: Keith Packard --- src/cortexelf-v1/Makefile | 4 +- src/cortexelf-v1/ao_cortexelf.c | 3 ++ src/cortexelf-v1/ao_pins.h | 99 ++++++++--------------------------------- 3 files changed, 22 insertions(+), 84 deletions(-) (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/Makefile b/src/cortexelf-v1/Makefile index e0fdc8fd..c74b0cce 100644 --- a/src/cortexelf-v1/Makefile +++ b/src/cortexelf-v1/Makefile @@ -42,7 +42,6 @@ ALTOS_SRC = \ ao_cmd.c \ ao_config.c \ ao_task.c \ - ao_led.c \ ao_stdio.c \ ao_panic.c \ ao_timer.c \ @@ -50,8 +49,6 @@ ALTOS_SRC = \ ao_serial_stm.c \ ao_dma_stm.c \ ao_spi_stm.c \ - ao_storage.c \ - ao_m25.c \ ao_usb_stm.c \ ao_exti_stm.c \ ao_i2c_stm.c \ @@ -63,6 +60,7 @@ ALTOS_SRC = \ ao_line.c \ ao_ps2.c \ ao_console.c \ + ao_sdcard.c \ $(PROFILE) \ $(SAMPLE_PROFILE) \ $(STACK_GUARD) diff --git a/src/cortexelf-v1/ao_cortexelf.c b/src/cortexelf-v1/ao_cortexelf.c index 776530e0..67062c85 100644 --- a/src/cortexelf-v1/ao_cortexelf.c +++ b/src/cortexelf-v1/ao_cortexelf.c @@ -25,6 +25,7 @@ #include #include #include +#include struct ao_task ball_task; @@ -205,6 +206,8 @@ main(void) ao_dma_init(); ao_exti_init(); + ao_sdcard_init(); + ao_ps2_init(); ao_vga_init(); ao_console_init(); diff --git a/src/cortexelf-v1/ao_pins.h b/src/cortexelf-v1/ao_pins.h index e486038a..91555cd4 100644 --- a/src/cortexelf-v1/ao_pins.h +++ b/src/cortexelf-v1/ao_pins.h @@ -28,21 +28,21 @@ #define AO_PLLMUL 12 #define AO_RCC_CFGR_PLLMUL (STM_RCC_CFGR_PLLMUL_12) -/* SYSCLK = 32MHz (no need to go faster than CPU) */ -#define AO_PLLDIV 3 -#define AO_RCC_CFGR_PLLDIV (STM_RCC_CFGR_PLLDIV_3) +/* SYSCLK = 24MHz */ +#define AO_PLLDIV 4 +#define AO_RCC_CFGR_PLLDIV (STM_RCC_CFGR_PLLDIV_4) -/* HCLK = 32MHz (CPU clock) */ +/* HCLK = 24MHz (CPU clock) */ #define AO_AHB_PRESCALER 1 #define AO_RCC_CFGR_HPRE_DIV STM_RCC_CFGR_HPRE_DIV_1 -/* Run APB1 at 16MHz (HCLK/2) */ -#define AO_APB1_PRESCALER 2 -#define AO_RCC_CFGR_PPRE1_DIV STM_RCC_CFGR_PPRE2_DIV_2 +/* Run APB1 at HCLK/1 */ +#define AO_APB1_PRESCALER 1 +#define AO_RCC_CFGR_PPRE1_DIV STM_RCC_CFGR_PPRE2_DIV_1 -/* Run APB2 at 16MHz (HCLK/2) */ -#define AO_APB2_PRESCALER 2 -#define AO_RCC_CFGR_PPRE2_DIV STM_RCC_CFGR_PPRE2_DIV_2 +/* Run APB2 at HCLK/1 */ +#define AO_APB2_PRESCALER 1 +#define AO_RCC_CFGR_PPRE2_DIV STM_RCC_CFGR_PPRE2_DIV_1 /* Allow for non-maskable interrupts at priority 0 */ #define AO_NONMASK_INTERRUPT 1 @@ -108,84 +108,21 @@ #define LOW_LEVEL_DEBUG 0 -#define LED_PORT_ENABLE STM_RCC_AHBENR_GPIOCEN -#define LED_PORT (&stm_gpioc) -#define LED_PIN_RED 0 -#define LED_PIN_GREEN 0 -#define AO_LED_RED (1 << LED_PIN_RED) -#define AO_LED_GREEN (1 << LED_PIN_GREEN) - -#define LEDS_AVAILABLE 0 - #define HAS_GPS 0 #define HAS_FLIGHT 0 #define HAS_ADC 0 #define HAS_ADC_TEMP 0 #define HAS_LOG 0 -/* - * Pressure sensor settings - */ -#define HAS_MS5607 0 -#define HAS_MS5611 0 -#define AO_MS5607_PRIVATE_PINS 0 -#define AO_MS5607_CS_PORT (&stm_gpioc) -#define AO_MS5607_CS_PIN 4 -#define AO_MS5607_CS_MASK (1 << AO_MS5607_CS) -#define AO_MS5607_MISO_PORT (&stm_gpioa) -#define AO_MS5607_MISO_PIN 6 -#define AO_MS5607_MISO_MASK (1 << AO_MS5607_MISO) -#define AO_MS5607_SPI_INDEX AO_SPI_1_PA5_PA6_PA7 - -/* - * SPI Flash memory - */ - -#define M25_MAX_CHIPS 0 -#define AO_M25_SPI_CS_PORT (&stm_gpiod) -#define AO_M25_SPI_CS_MASK (1 << 3) -#define AO_M25_SPI_BUS AO_SPI_2_PB13_PB14_PB15 - #define NUM_CMDS 16 -/* - * Monitor - */ - -#define HAS_MONITOR 0 -#define LEGACY_MONITOR 0 -#define HAS_MONITOR_PUT 0 -#define AO_MONITOR_LED 0 -#define HAS_RSSI 0 - -/* - * Profiling Viterbi decoding - */ - -#ifndef AO_PROFILE -#define AO_PROFILE 0 -#endif - -/* - * PWM output - */ - -#define NUM_PWM 0 -#define PWM_MAX 20000 -#define AO_PWM_TIMER stm_tim4 -#define AO_PWM_TIMER_ENABLE STM_RCC_APB1ENR_TIM4EN -#define AO_PWM_TIMER_SCALE 32 - -#define AO_PWM_0_GPIO (&stm_gpiod) -#define AO_PWM_0_PIN 12 - -#define AO_PWM_1_GPIO (&stm_gpiod) -#define AO_PWM_1_PIN 13 - -#define AO_PWM_2_GPIO (&stm_gpiod) -#define AO_PWM_2_PIN 14 - -#define AO_PWM_3_GPIO (&stm_gpiod) -#define AO_PWM_3_PIN 15 +/* SD card */ +#define AO_SDCARD_SPI_BUS AO_SPI_2_PD1_PD3_PD4 +#define AO_SDCARD_SPI_CS_PORT (&stm_gpiod) +#define AO_SDCARD_SPI_CS_PIN 2 +#define AO_SDCARD_SPI_PORT (&stm_gpiod) +#define AO_SDCARD_SPI_SCK_PIN 1 +#define AO_SDCARD_SPI_MISO_PIN 3 +#define AO_SDCARD_SPI_MOSI_PIN 4 #endif /* _AO_PINS_H_ */ -- cgit v1.2.3 From 7b031d5a86213364196b67f7e3f92865da8adbf9 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 2 Apr 2017 15:28:45 -0700 Subject: cortexelf-v1: Hook up serial consoles for debugging This will make playing with serial ports easier for now. Signed-off-by: Keith Packard --- src/cortexelf-v1/ao_pins.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/ao_pins.h b/src/cortexelf-v1/ao_pins.h index 91555cd4..bc8288cf 100644 --- a/src/cortexelf-v1/ao_pins.h +++ b/src/cortexelf-v1/ao_pins.h @@ -54,12 +54,12 @@ #define AO_PS2_DATA_BIT 8 #define HAS_SERIAL_1 1 -#define USE_SERIAL_1_STDIN 0 +#define USE_SERIAL_1_STDIN 1 #define SERIAL_1_PB6_PB7 1 #define SERIAL_1_PA9_PA10 0 #define HAS_SERIAL_2 1 -#define USE_SERIAL_2_STDIN 0 +#define USE_SERIAL_2_STDIN 1 #define SERIAL_2_PA2_PA3 0 #define SERIAL_2_PD5_PD6 1 -- cgit v1.2.3 From 54c76d48924fecc2aeabbc352c553822a87f9d19 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 2 Apr 2017 15:40:03 -0700 Subject: cortexelf-v1: Use new memory map to access all flash and ram. Add fat. Signed-off-by: Keith Packard --- src/cortexelf-v1/Makefile | 5 ++- src/cortexelf-v1/ao_cortexelf.c | 2 + src/stm/altos-512.ld | 98 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 src/stm/altos-512.ld (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/Makefile b/src/cortexelf-v1/Makefile index c74b0cce..02ef817e 100644 --- a/src/cortexelf-v1/Makefile +++ b/src/cortexelf-v1/Makefile @@ -4,6 +4,7 @@ # include ../stm/Makefile.defs +LDFLAGS=-L../stm -Wl,-Taltos-512.ld INC = \ ao.h \ @@ -61,6 +62,8 @@ ALTOS_SRC = \ ao_ps2.c \ ao_console.c \ ao_sdcard.c \ + ao_bufio.c \ + ao_fat.c \ $(PROFILE) \ $(SAMPLE_PROFILE) \ $(STACK_GUARD) @@ -80,7 +83,7 @@ OBJ=$(SRC:.c=.o) all: $(PROG) $(HEX) -$(PROG): Makefile $(OBJ) altos.ld +$(PROG): Makefile $(OBJ) altos-512.ld $(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(OBJ) $(LIBS) ../altitude-pa.h: make-altitude-pa diff --git a/src/cortexelf-v1/ao_cortexelf.c b/src/cortexelf-v1/ao_cortexelf.c index 67062c85..0c6852d9 100644 --- a/src/cortexelf-v1/ao_cortexelf.c +++ b/src/cortexelf-v1/ao_cortexelf.c @@ -26,6 +26,7 @@ #include #include #include +#include struct ao_task ball_task; @@ -207,6 +208,7 @@ main(void) ao_exti_init(); ao_sdcard_init(); + ao_fat_init(); ao_ps2_init(); ao_vga_init(); diff --git a/src/stm/altos-512.ld b/src/stm/altos-512.ld new file mode 100644 index 00000000..78c41685 --- /dev/null +++ b/src/stm/altos-512.ld @@ -0,0 +1,98 @@ +/* + * Copyright © 2017 Keith Packard + * + * 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 2 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. + */ + +MEMORY { + rom (rx) : ORIGIN = 0x08001000, LENGTH = 508K + ram (!w) : ORIGIN = 0x20000000, LENGTH = 81408 + stack (!w) : ORIGIN = 0x20013e00, LENGTH = 512 +} + +INCLUDE registers.ld + +EXTERN (stm_interrupt_vector) + +SECTIONS { + /* + * Rom contents + */ + + .text ORIGIN(rom) : { + __text_start__ = .; + *(.interrupt) /* Interrupt vectors */ + + . = ORIGIN(rom) + 0x100; + + + /* Ick. What I want is to specify the + * addresses of some global constants so + * that I can find them across versions + * of the application. I can't figure out + * how to make gnu ld do that, so instead + * we just load the two files that include + * these defines in the right order here and + * expect things to 'just work'. Don't change + * the contents of those files, ok? + */ + ao_romconfig.o(.romconfig*) + ao_product.o(.romconfig*) + *(.text*) /* Executable code */ + *(.rodata*) /* Constants */ + + } > rom + + .ARM.exidx : { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > rom + __text_end__ = .; + + /* Boot data which must live at the start of ram so that + * the application and bootloader share the same addresses. + * This must be all uninitialized data + */ + .boot (NOLOAD) : { + __boot_start__ = .; + *(.boot) + . = ALIGN(4); + __boot_end__ = .; + } >ram + + /* Data -- relocated to RAM, but written to ROM + */ + .data : { + __data_start__ = .; + *(.data) /* initialized data */ + . = ALIGN(4); + __data_end__ = .; + } >ram AT>rom + + .bss : { + __bss_start__ = .; + *(.bss) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } >ram + + PROVIDE(end = .); + + PROVIDE(__stack__ = ORIGIN(stack) + LENGTH(stack)); +} + +ENTRY(start); + + -- cgit v1.2.3 From 1f5f0638f283fbb784021873c649109d4ed0257c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 2 Apr 2017 15:53:17 -0700 Subject: cortexelf: Add lisp interpreter Signed-off-by: Keith Packard --- src/cortexelf-v1/Makefile | 25 ++++++++- src/cortexelf-v1/ao_cortexelf.c | 6 +++ src/cortexelf-v1/ao_lisp_os.h | 65 ++++++++++++++++++++++++ src/cortexelf-v1/ao_lisp_os_save.c | 53 +++++++++++++++++++ src/cortexelf-v1/cortexelf.ld | 101 +++++++++++++++++++++++++++++++++++++ 5 files changed, 248 insertions(+), 2 deletions(-) create mode 100644 src/cortexelf-v1/ao_lisp_os.h create mode 100644 src/cortexelf-v1/ao_lisp_os_save.c create mode 100644 src/cortexelf-v1/cortexelf.ld (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/Makefile b/src/cortexelf-v1/Makefile index 02ef817e..66f18045 100644 --- a/src/cortexelf-v1/Makefile +++ b/src/cortexelf-v1/Makefile @@ -4,7 +4,7 @@ # include ../stm/Makefile.defs -LDFLAGS=-L../stm -Wl,-Taltos-512.ld +LDFLAGS=-L../stm -Wl,-Tcortexelf.ld INC = \ ao.h \ @@ -25,6 +25,9 @@ INC = \ ao_draw_int.h \ ao_font.h \ ao_ps2.h \ + ao_lisp.h \ + ao_lisp_const.h \ + ao_lisp_os.h \ Makefile @@ -64,6 +67,24 @@ ALTOS_SRC = \ ao_sdcard.c \ ao_bufio.c \ ao_fat.c \ + ao_flash_stm.c \ + ao_lisp_lex.c \ + ao_lisp_mem.c \ + ao_lisp_cons.c \ + ao_lisp_eval.c \ + ao_lisp_string.c \ + ao_lisp_atom.c \ + ao_lisp_int.c \ + ao_lisp_poly.c \ + ao_lisp_builtin.c \ + ao_lisp_read.c \ + ao_lisp_rep.c \ + ao_lisp_frame.c \ + ao_lisp_error.c \ + ao_lisp_lambda.c \ + ao_lisp_save.c \ + ao_lisp_stack.c \ + ao_lisp_os_save.c \ $(PROFILE) \ $(SAMPLE_PROFILE) \ $(STACK_GUARD) @@ -83,7 +104,7 @@ OBJ=$(SRC:.c=.o) all: $(PROG) $(HEX) -$(PROG): Makefile $(OBJ) altos-512.ld +$(PROG): Makefile $(OBJ) cortexelf.ld $(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(OBJ) $(LIBS) ../altitude-pa.h: make-altitude-pa diff --git a/src/cortexelf-v1/ao_cortexelf.c b/src/cortexelf-v1/ao_cortexelf.c index 0c6852d9..1dc0a4be 100644 --- a/src/cortexelf-v1/ao_cortexelf.c +++ b/src/cortexelf-v1/ao_cortexelf.c @@ -27,6 +27,7 @@ #include #include #include +#include struct ao_task ball_task; @@ -182,11 +183,16 @@ ao_console_send(void) } } +static void lisp_cmd() { + ao_lisp_read_eval_print(); +} + __code struct ao_cmds ao_demo_cmds[] = { { ao_video_toggle, "V\0Toggle video" }, { ao_ball_toggle, "B\0Toggle ball" }, { ao_ps2_read_keys, "K\0Read keys from keyboard" }, { ao_console_send, "C\0Send data to console, end with ~" }, + { lisp_cmd, "l\0Run lisp interpreter" }, { 0, NULL } }; diff --git a/src/cortexelf-v1/ao_lisp_os.h b/src/cortexelf-v1/ao_lisp_os.h new file mode 100644 index 00000000..d0c1f7b7 --- /dev/null +++ b/src/cortexelf-v1/ao_lisp_os.h @@ -0,0 +1,65 @@ +/* + * Copyright © 2016 Keith Packard + * + * 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; version 2 of the License. + * + * 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_LISP_OS_H_ +#define _AO_LISP_OS_H_ + +#include "ao.h" + +#define AO_LISP_POOL_TOTAL 16384 +#define AO_LISP_SAVE 1 + +static inline int +ao_lisp_getc() { + static uint8_t at_eol; + int c; + + if (at_eol) { + ao_cmd_readline(); + at_eol = 0; + } + c = ao_cmd_lex(); + if (c == '\n') + at_eol = 1; + return c; +} + +static inline void +ao_lisp_os_flush(void) +{ + flush(); +} + +static inline void +ao_lisp_abort(void) +{ + ao_panic(1); +} + +static inline void +ao_lisp_os_led(int led) +{ + (void) led; +} + +static inline void +ao_lisp_os_delay(int delay) +{ + ao_delay(AO_MS_TO_TICKS(delay)); +} + +#endif diff --git a/src/cortexelf-v1/ao_lisp_os_save.c b/src/cortexelf-v1/ao_lisp_os_save.c new file mode 100644 index 00000000..7c853990 --- /dev/null +++ b/src/cortexelf-v1/ao_lisp_os_save.c @@ -0,0 +1,53 @@ +/* + * Copyright © 2016 Keith Packard + * + * 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 2 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. + */ + +#include +#include +#include + +extern uint8_t __flash__[]; + +/* saved variables to rebuild the heap + + ao_lisp_atoms + ao_lisp_frame_global + */ + +int +ao_lisp_os_save(void) +{ + int i; + + for (i = 0; i < AO_LISP_POOL_TOTAL; i += 256) { + uint32_t *dst = (uint32_t *) (void *) &__flash__[i]; + uint32_t *src = (uint32_t *) (void *) &ao_lisp_pool[i]; + + ao_flash_page(dst, src); + } + return 1; +} + +int +ao_lisp_os_restore_save(struct ao_lisp_os_save *save, int offset) +{ + memcpy(save, &__flash__[offset], sizeof (struct ao_lisp_os_save)); + return 1; +} + +int +ao_lisp_os_restore(void) +{ + memcpy(ao_lisp_pool, __flash__, AO_LISP_POOL_TOTAL); + return 1; +} diff --git a/src/cortexelf-v1/cortexelf.ld b/src/cortexelf-v1/cortexelf.ld new file mode 100644 index 00000000..6ad2a679 --- /dev/null +++ b/src/cortexelf-v1/cortexelf.ld @@ -0,0 +1,101 @@ +/* + * Copyright © 2017 Keith Packard + * + * 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 2 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. + */ + +MEMORY { + rom (rx) : ORIGIN = 0x08001000, LENGTH = 492K + flash (r) : ORIGIN = 0x0807c000, LENGTH = 16K + ram (!w) : ORIGIN = 0x20000000, LENGTH = 81408 + stack (!w) : ORIGIN = 0x20013e00, LENGTH = 512 +} + +INCLUDE registers.ld + +EXTERN (stm_interrupt_vector) + +SECTIONS { + /* + * Rom contents + */ + + .text ORIGIN(rom) : { + __text_start__ = .; + *(.interrupt) /* Interrupt vectors */ + + . = ORIGIN(rom) + 0x100; + + + /* Ick. What I want is to specify the + * addresses of some global constants so + * that I can find them across versions + * of the application. I can't figure out + * how to make gnu ld do that, so instead + * we just load the two files that include + * these defines in the right order here and + * expect things to 'just work'. Don't change + * the contents of those files, ok? + */ + ao_romconfig.o(.romconfig*) + ao_product.o(.romconfig*) + *(.text*) /* Executable code */ + *(.rodata*) /* Constants */ + + } > rom + + .ARM.exidx : { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > rom + __text_end__ = .; + + /* Boot data which must live at the start of ram so that + * the application and bootloader share the same addresses. + * This must be all uninitialized data + */ + .boot (NOLOAD) : { + __boot_start__ = .; + *(.boot) + . = ALIGN(4); + __boot_end__ = .; + } >ram + + /* Data -- relocated to RAM, but written to ROM + */ + .data : { + __data_start__ = .; + *(.data) /* initialized data */ + . = ALIGN(4); + __data_end__ = .; + } >ram AT>rom + + .bss : { + __bss_start__ = .; + *(.bss) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } >ram + + PROVIDE(end = .); + + PROVIDE(__stack__ = ORIGIN(stack) + LENGTH(stack)); + + __flash__ = ORIGIN(flash); +} + +ENTRY(start); + + -- cgit v1.2.3 From 6fb817f218a69b28973b0d059d71809717b1e2d1 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 2 Apr 2017 16:17:33 -0700 Subject: lisp: Fix up lisp build so projects can get ao_lisp_const.h built as needed Signed-off-by: Keith Packard --- src/cortexelf-v1/Makefile | 6 ++++-- src/lisp/Makefile | 25 ++++--------------------- src/lisp/Makefile-inc | 22 ++++++++++++++++++++++ src/lisp/Makefile-lisp | 4 ++++ 4 files changed, 34 insertions(+), 23 deletions(-) create mode 100644 src/lisp/Makefile-inc create mode 100644 src/lisp/Makefile-lisp (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/Makefile b/src/cortexelf-v1/Makefile index 66f18045..cea75ddf 100644 --- a/src/cortexelf-v1/Makefile +++ b/src/cortexelf-v1/Makefile @@ -102,7 +102,7 @@ HEX=$(PROGNAME)-$(VERSION).ihx SRC=$(ALTOS_SRC) ao_cortexelf.c OBJ=$(SRC:.c=.o) -all: $(PROG) $(HEX) +all:: $(PROG) $(HEX) $(PROG): Makefile $(OBJ) cortexelf.ld $(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(OBJ) $(LIBS) @@ -117,10 +117,12 @@ ao_product.h: ao-make-product.5c ../Version distclean: clean -clean: +clean:: rm -f *.o $(PROGNAME)-*.elf $(PROGNAME)-*.ihx rm -f ao_product.h +include ../lisp/Makefile-lisp + install: uninstall: diff --git a/src/lisp/Makefile b/src/lisp/Makefile index dd5a0cb4..25796ec5 100644 --- a/src/lisp/Makefile +++ b/src/lisp/Makefile @@ -6,32 +6,15 @@ clean: ao_lisp_const.h: ao_lisp_const.lisp ao_lisp_make_const ./ao_lisp_make_const -o $@ ao_lisp_const.lisp -SRCS=\ - ao_lisp_make_const.c\ - ao_lisp_mem.c \ - ao_lisp_cons.c \ - ao_lisp_string.c \ - ao_lisp_atom.c \ - ao_lisp_int.c \ - ao_lisp_poly.c \ - ao_lisp_builtin.c \ - ao_lisp_read.c \ - ao_lisp_frame.c \ - ao_lisp_lambda.c \ - ao_lisp_eval.c \ - ao_lisp_rep.c \ - ao_lisp_save.c \ - ao_lisp_stack.c \ - ao_lisp_error.c +include Makefile-inc +SRCS=$(LISP_SRCS) + +HDRS=$(LISP_HDRS) OBJS=$(SRCS:.c=.o) CFLAGS=-DAO_LISP_MAKE_CONST -O0 -g -I. -Wall -Wextra -no-pie -HDRS=\ - ao_lisp.h \ - ao_lisp_os.h \ - ao_lisp_read.h ao_lisp_make_const: $(OBJS) $(CC) $(CFLAGS) -o $@ $(OBJS) diff --git a/src/lisp/Makefile-inc b/src/lisp/Makefile-inc new file mode 100644 index 00000000..126deeb0 --- /dev/null +++ b/src/lisp/Makefile-inc @@ -0,0 +1,22 @@ +LISP_SRCS=\ + ao_lisp_make_const.c\ + ao_lisp_mem.c \ + ao_lisp_cons.c \ + ao_lisp_string.c \ + ao_lisp_atom.c \ + ao_lisp_int.c \ + ao_lisp_poly.c \ + ao_lisp_builtin.c \ + ao_lisp_read.c \ + ao_lisp_frame.c \ + ao_lisp_lambda.c \ + ao_lisp_eval.c \ + ao_lisp_rep.c \ + ao_lisp_save.c \ + ao_lisp_stack.c \ + ao_lisp_error.c + +LISP_HDRS=\ + ao_lisp.h \ + ao_lisp_os.h \ + ao_lisp_read.h diff --git a/src/lisp/Makefile-lisp b/src/lisp/Makefile-lisp new file mode 100644 index 00000000..998c7673 --- /dev/null +++ b/src/lisp/Makefile-lisp @@ -0,0 +1,4 @@ +include ../lisp/Makefile-inc + +ao_lisp_const.h: $(LISP_SRCS) $(LISP_HDRS) + +cd ../lisp && make $@ -- cgit v1.2.3 From 8284d3639cd24e2fa0faf1e35e7276ba35a24f8f Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 2 Apr 2017 16:22:28 -0700 Subject: cortexelf-v1: Add serialblather command. This reads from stdin and dumps it to both serial ports until you type ~ Signed-off-by: Keith Packard --- src/cortexelf-v1/ao_cortexelf.c | 12 ++++++++++++ src/cortexelf-v1/ao_pins.h | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/ao_cortexelf.c b/src/cortexelf-v1/ao_cortexelf.c index 1dc0a4be..f9be59e8 100644 --- a/src/cortexelf-v1/ao_cortexelf.c +++ b/src/cortexelf-v1/ao_cortexelf.c @@ -187,11 +187,23 @@ static void lisp_cmd() { ao_lisp_read_eval_print(); } +static void +ao_serial_blather(void) +{ + char c; + + while ((c = getchar()) != '~') { + ao_serial1_putchar(c); + ao_serial2_putchar(c); + } +} + __code struct ao_cmds ao_demo_cmds[] = { { ao_video_toggle, "V\0Toggle video" }, { ao_ball_toggle, "B\0Toggle ball" }, { ao_ps2_read_keys, "K\0Read keys from keyboard" }, { ao_console_send, "C\0Send data to console, end with ~" }, + { ao_serial_blather, "S\0Blather on serial ports briefly" }, { lisp_cmd, "l\0Run lisp interpreter" }, { 0, NULL } }; diff --git a/src/cortexelf-v1/ao_pins.h b/src/cortexelf-v1/ao_pins.h index bc8288cf..e9c9deb3 100644 --- a/src/cortexelf-v1/ao_pins.h +++ b/src/cortexelf-v1/ao_pins.h @@ -38,7 +38,7 @@ /* Run APB1 at HCLK/1 */ #define AO_APB1_PRESCALER 1 -#define AO_RCC_CFGR_PPRE1_DIV STM_RCC_CFGR_PPRE2_DIV_1 +#define AO_RCC_CFGR_PPRE1_DIV STM_RCC_CFGR_PPRE1_DIV_1 /* Run APB2 at HCLK/1 */ #define AO_APB2_PRESCALER 1 -- cgit v1.2.3 From 1bc48b075f76bfef258f516549573429b24f284c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 2 Apr 2017 16:37:42 -0700 Subject: cortexelf-v1: Add buttons Signed-off-by: Keith Packard --- src/cortexelf-v1/Makefile | 2 ++ src/cortexelf-v1/ao_cortexelf.c | 20 ++++++++++++++++++++ src/cortexelf-v1/ao_pins.h | 24 ++++++++++++++++++++++++ 3 files changed, 46 insertions(+) (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/Makefile b/src/cortexelf-v1/Makefile index cea75ddf..f7c892bc 100644 --- a/src/cortexelf-v1/Makefile +++ b/src/cortexelf-v1/Makefile @@ -68,6 +68,8 @@ ALTOS_SRC = \ ao_bufio.c \ ao_fat.c \ ao_flash_stm.c \ + ao_button.c \ + ao_event.c \ ao_lisp_lex.c \ ao_lisp_mem.c \ ao_lisp_cons.c \ diff --git a/src/cortexelf-v1/ao_cortexelf.c b/src/cortexelf-v1/ao_cortexelf.c index f9be59e8..8be7ef15 100644 --- a/src/cortexelf-v1/ao_cortexelf.c +++ b/src/cortexelf-v1/ao_cortexelf.c @@ -28,6 +28,8 @@ #include #include #include +#include +#include struct ao_task ball_task; @@ -208,6 +210,21 @@ __code struct ao_cmds ao_demo_cmds[] = { { 0, NULL } }; +static struct ao_task event_task; + +static void +ao_event_loop(void) +{ + for (;;) { + struct ao_event ev; + + ao_event_get(&ev); + printf("type %d uint %d tick %d value %d\n", + ev.type, ev.unit, ev.tick, ev.value); + flush(); + } +} + int main(void) { @@ -236,9 +253,12 @@ main(void) ao_usb_init(); + ao_button_init(); + ao_config_init(); ao_add_task(&ball_task, ao_ball, "ball"); + ao_add_task(&event_task, ao_event_loop, "events"); ao_cmd_register(&ao_demo_cmds[0]); ao_start_scheduler(); diff --git a/src/cortexelf-v1/ao_pins.h b/src/cortexelf-v1/ao_pins.h index e9c9deb3..d39f4022 100644 --- a/src/cortexelf-v1/ao_pins.h +++ b/src/cortexelf-v1/ao_pins.h @@ -125,4 +125,28 @@ #define AO_SDCARD_SPI_MISO_PIN 3 #define AO_SDCARD_SPI_MOSI_PIN 4 +/* Buttons */ + +#define AO_EVENT 1 + +#define AO_BUTTON_COUNT 4 +#define AO_BUTTON_MODE AO_EXTI_MODE_PULL_DOWN + +/* INPUT */ +#define AO_BUTTON_0_PORT (&stm_gpioc) +#define AO_BUTTON_0 8 + +/* MP */ +#define AO_BUTTON_1_PORT (&stm_gpioc) +#define AO_BUTTON_1 9 + +/* RUN */ +#define AO_BUTTON_2_PORT (&stm_gpioc) +#define AO_BUTTON_2 10 + +/* LOAD */ +#define AO_BUTTON_3_PORT (&stm_gpioc) +#define AO_BUTTON_3 11 + + #endif /* _AO_PINS_H_ */ -- cgit v1.2.3 From 17ec1c510ccc42bbc387940b5805f452697f78d6 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 2 Apr 2017 17:39:26 -0700 Subject: cortexelf-v1: Hook up AS1107 in test mode Provide a 'L' command to display values Signed-off-by: Keith Packard --- src/cortexelf-v1/Makefile | 1 + src/cortexelf-v1/ao_cortexelf.c | 19 +++++++++++++++++++ src/cortexelf-v1/ao_pins.h | 16 ++++++++++++++++ 3 files changed, 36 insertions(+) (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/Makefile b/src/cortexelf-v1/Makefile index f7c892bc..65f16c2c 100644 --- a/src/cortexelf-v1/Makefile +++ b/src/cortexelf-v1/Makefile @@ -56,6 +56,7 @@ ALTOS_SRC = \ ao_usb_stm.c \ ao_exti_stm.c \ ao_i2c_stm.c \ + ao_as1107.c \ ao_vga.c \ ao_blt.c \ ao_copy.c \ diff --git a/src/cortexelf-v1/ao_cortexelf.c b/src/cortexelf-v1/ao_cortexelf.c index 8be7ef15..77fbd0c0 100644 --- a/src/cortexelf-v1/ao_cortexelf.c +++ b/src/cortexelf-v1/ao_cortexelf.c @@ -30,6 +30,7 @@ #include #include #include +#include struct ao_task ball_task; @@ -200,6 +201,21 @@ ao_serial_blather(void) } } +static void +led_cmd(void) +{ + uint8_t start; + uint8_t value; + ao_cmd_decimal(); + + start = ao_cmd_lex_i; + ao_cmd_hex(); + value = ao_cmd_lex_i; + if (ao_cmd_status != ao_cmd_success) + return; + ao_as1107_write_8(start, value); +} + __code struct ao_cmds ao_demo_cmds[] = { { ao_video_toggle, "V\0Toggle video" }, { ao_ball_toggle, "B\0Toggle ball" }, @@ -207,6 +223,7 @@ __code struct ao_cmds ao_demo_cmds[] = { { ao_console_send, "C\0Send data to console, end with ~" }, { ao_serial_blather, "S\0Blather on serial ports briefly" }, { lisp_cmd, "l\0Run lisp interpreter" }, + { led_cmd, "L start value\0Show value (byte) at digit start" }, { 0, NULL } }; @@ -255,6 +272,8 @@ main(void) ao_button_init(); + ao_as1107_init(); + ao_config_init(); ao_add_task(&ball_task, ao_ball, "ball"); diff --git a/src/cortexelf-v1/ao_pins.h b/src/cortexelf-v1/ao_pins.h index d39f4022..9721c56d 100644 --- a/src/cortexelf-v1/ao_pins.h +++ b/src/cortexelf-v1/ao_pins.h @@ -148,5 +148,21 @@ #define AO_BUTTON_3_PORT (&stm_gpioc) #define AO_BUTTON_3 11 +/* AS1107 */ +#define AO_AS1107_NUM_DIGITS 8 + +/* Set the hex digits up for decode, leave the extra leds alone */ + +#define AO_AS1107_DECODE ((1 << 7) | \ + (1 << 6) | \ + (1 << 4) | \ + (1 << 3) | \ + (1 << 1) | \ + (1 << 0)) + +#define AO_AS1107_SPI_INDEX AO_SPI_2_PD1_PD3_PD4 +#define AO_AS1107_SPI_SPEED AO_SPI_SPEED_8MHz +#define AO_AS1107_CS_PORT (&stm_gpiod) +#define AO_AS1107_CS_PIN 0 #endif /* _AO_PINS_H_ */ -- cgit v1.2.3 From 8c1478b55f5dbe9711b31a34d4f5e3563f1f42d2 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 2 Apr 2017 19:32:17 -0700 Subject: cortexelf-v1: Hook up hex keypad using matrix input driver Signed-off-by: Keith Packard --- src/cortexelf-v1/Makefile | 1 + src/cortexelf-v1/ao_pins.h | 53 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 48 insertions(+), 6 deletions(-) (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/Makefile b/src/cortexelf-v1/Makefile index 65f16c2c..b491c2e4 100644 --- a/src/cortexelf-v1/Makefile +++ b/src/cortexelf-v1/Makefile @@ -57,6 +57,7 @@ ALTOS_SRC = \ ao_exti_stm.c \ ao_i2c_stm.c \ ao_as1107.c \ + ao_matrix.c \ ao_vga.c \ ao_blt.c \ ao_copy.c \ diff --git a/src/cortexelf-v1/ao_pins.h b/src/cortexelf-v1/ao_pins.h index 9721c56d..034c2d5a 100644 --- a/src/cortexelf-v1/ao_pins.h +++ b/src/cortexelf-v1/ao_pins.h @@ -127,10 +127,11 @@ /* Buttons */ -#define AO_EVENT 1 +#define AO_EVENT 1 #define AO_BUTTON_COUNT 4 #define AO_BUTTON_MODE AO_EXTI_MODE_PULL_DOWN +#define AO_BUTTON_INVERTED 0 /* INPUT */ #define AO_BUTTON_0_PORT (&stm_gpioc) @@ -153,11 +154,11 @@ /* Set the hex digits up for decode, leave the extra leds alone */ -#define AO_AS1107_DECODE ((1 << 7) | \ - (1 << 6) | \ - (1 << 4) | \ - (1 << 3) | \ - (1 << 1) | \ +#define AO_AS1107_DECODE ((1 << 7) | \ + (1 << 6) | \ + (1 << 4) | \ + (1 << 3) | \ + (1 << 1) | \ (1 << 0)) #define AO_AS1107_SPI_INDEX AO_SPI_2_PD1_PD3_PD4 @@ -165,4 +166,44 @@ #define AO_AS1107_CS_PORT (&stm_gpiod) #define AO_AS1107_CS_PIN 0 +/* Hex keypad */ + +#define AO_MATRIX_ROWS 4 +#define AO_MATRIX_COLS 4 + +#define AO_MATRIX_KEYCODES { \ + { 0x0, 0x1, 0x2, 0x3 }, \ + { 0x4, 0x5, 0x6, 0x7 }, \ + { 0x8, 0x9, 0xa, 0xb }, \ + { 0xc, 0xd, 0xe, 0xf } \ + } + +#include + +#define AO_TIMER_HOOK ao_matrix_poll() + +#define AO_MATRIX_ROW_0_PORT (&stm_gpioc) +#define AO_MATRIX_ROW_0_PIN 4 + +#define AO_MATRIX_ROW_1_PORT (&stm_gpioc) +#define AO_MATRIX_ROW_1_PIN 1 + +#define AO_MATRIX_ROW_2_PORT (&stm_gpioc) +#define AO_MATRIX_ROW_2_PIN 7 + +#define AO_MATRIX_ROW_3_PORT (&stm_gpioc) +#define AO_MATRIX_ROW_3_PIN 0 + +#define AO_MATRIX_COL_0_PORT (&stm_gpioc) +#define AO_MATRIX_COL_0_PIN 2 + +#define AO_MATRIX_COL_1_PORT (&stm_gpioc) +#define AO_MATRIX_COL_1_PIN 3 + +#define AO_MATRIX_COL_2_PORT (&stm_gpioc) +#define AO_MATRIX_COL_2_PIN 5 + +#define AO_MATRIX_COL_3_PORT (&stm_gpioc) +#define AO_MATRIX_COL_3_PIN 6 + #endif /* _AO_PINS_H_ */ -- cgit v1.2.3 From 5bb9cf38c84663713c178f54b684d40b6c00b11d Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 2 Apr 2017 20:33:49 -0700 Subject: cortexelf-v1: Add bit flipping array generator Someone hooked up the data lines between the systems backwards, so we get to swizzle the bits in software. Signed-off-by: Keith Packard --- src/cortexelf-v1/Makefile | 7 +++++-- src/cortexelf-v1/ao_flip_bits.5c | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/cortexelf-v1/ao_flip_bits.5c (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/Makefile b/src/cortexelf-v1/Makefile index b491c2e4..77598dda 100644 --- a/src/cortexelf-v1/Makefile +++ b/src/cortexelf-v1/Makefile @@ -28,9 +28,9 @@ INC = \ ao_lisp.h \ ao_lisp_const.h \ ao_lisp_os.h \ + ao_flip_bits.h \ Makefile - #PROFILE=ao_profile.c #PROFILE_DEF=-DAO_PROFILE=1 @@ -123,7 +123,10 @@ distclean: clean clean:: rm -f *.o $(PROGNAME)-*.elf $(PROGNAME)-*.ihx - rm -f ao_product.h + rm -f ao_product.h ao_flip_bits.h + +ao_flip_bits.h: ao_flip_bits.5c + nickle ao_flip_bits.5c > $@ include ../lisp/Makefile-lisp diff --git a/src/cortexelf-v1/ao_flip_bits.5c b/src/cortexelf-v1/ao_flip_bits.5c new file mode 100644 index 00000000..26900893 --- /dev/null +++ b/src/cortexelf-v1/ao_flip_bits.5c @@ -0,0 +1,19 @@ +#!/usr/bin/nickle + +int flip_bits(int a) +{ + int result = 0; + for (int pos = 0; pos < 8; pos++) + if ((a & (1 << pos)) != 0) + result |= (1 << (7 - pos)); + return result; +} + +printf ("static uint8_t ao_flip_bits[256] = {\n"); + +for (int i = 0; i < 256; i++) { + printf (" 0x%02x,", flip_bits(i)); + if ((i & 0xf) == 0xf) + printf("\n"); +} +printf("};\n"); -- cgit v1.2.3 From 47004dfe8ee8c8b31085b066d3d0fd5142fd49da Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 3 Apr 2017 09:36:00 -0700 Subject: cortexelf-v1: doodling with 1802 bits Just some random ideas about how to manage the 1802 Signed-off-by: Keith Packard --- src/cortexelf-v1/Makefile | 1 + src/cortexelf-v1/ao_1802.c | 170 +++++++++++++++++++++++++++++++++++++++++++++ src/cortexelf-v1/ao_1802.h | 34 +++++++++ 3 files changed, 205 insertions(+) create mode 100644 src/cortexelf-v1/ao_1802.c create mode 100644 src/cortexelf-v1/ao_1802.h (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/Makefile b/src/cortexelf-v1/Makefile index 77598dda..d7157521 100644 --- a/src/cortexelf-v1/Makefile +++ b/src/cortexelf-v1/Makefile @@ -72,6 +72,7 @@ ALTOS_SRC = \ ao_flash_stm.c \ ao_button.c \ ao_event.c \ + ao_1802.c \ ao_lisp_lex.c \ ao_lisp_mem.c \ ao_lisp_cons.c \ diff --git a/src/cortexelf-v1/ao_1802.c b/src/cortexelf-v1/ao_1802.c new file mode 100644 index 00000000..55e778df --- /dev/null +++ b/src/cortexelf-v1/ao_1802.c @@ -0,0 +1,170 @@ +/* + * Copyright © 2017 Keith Packard + * + * 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 2 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. + */ + +#include +#include +#include +#include + +/* Signals muxed between 1802 and STM */ +uint8_t MRD, TPB, TPA, MWR; + +/* Decoded address driven by TPA/TPB signals */ +uint16_t ADDRESS; + +/* Decoded data, driven by TPB signal */ +uint8_t DATA; + +/* Mux control */ +#define MUX_1802 0 +#define MUX_STM 1 + +uint8_t MUX_CONTROL; + +/* Signals driven by 1802 only */ +uint8_t WAIT, CLEAR, Q, SC, N; +uint8_t DMA_IN, DMA_OUT, INTERRUPT; +uint8_t EF; + +static uint8_t ma_stm; + +uint8_t +MA(void) { + if (MUX_CONTROL == MUX_1802) + return (ao_gpio_get_all(MA_PORT) >> MA_SHIFT) & 0xff; + else + return ma_stm; +} + +static void +MA_set(uint8_t ma) { + ao_gpio_set_mask(MA_PORT, ((uint16_t) ma) << MA_SHIFT, 0xff << MA_SHIFT); + ma_stm = ma; +} + +static uint8_t data_stm; + +static uint8_t +DATA_get(void) { + if (MUX_CONTROL == MUX_1802) + return ao_flip_bits[(ao_gpio_get_all(DATA_PORT) >> DATA_SHIFT) & 0xff]; + else + return data_stm; +} + +static void +DATA_set(uint8_t data) { + ao_gpio_set_mask(DATA_PORT, ((uint16_t) ao_flip_bits[data]) << DATA_SHIFT, 0xff << DATA_SHIFT); + data_stm = data; +} + +static uint8_t +N_get(void) { + return (ao_gpio_get_all(N_PORT) >> N_SHIFT) & 0x7; +} + +static uint8_t +EF_get(void) { + return (ao_gpio_get_all(EF_PORT) >> EF_SHIFT) & 0xf; +} + +static uint8_t +Q_get(void) { + return ao_gpio_get(Q_PORT, Q_BIT, Q_PIN); +} + +static uint8_t +SC_get(void) { + static const uint8_t flip_sc[4] = { 0, 2, 1, 3 }; + return flip_sc[(ao_gpio_get_all(SC_PORT) >> SC_SHIFT) & 3]; +} + +void +mrd(uint8_t value) { MRD = value; } + +void +mwr(uint8_t value) { MWR = value; } + +void +tpb(uint8_t value) { + TPB = value; + + /* Latch low address and data on rising edge of TPB */ + if (TPB) { + ADDRESS = (ADDRESS & 0xff00) | MA(); + DATA = DATA_get(); + N = N_get(); + ao_wakeup(&ADDRESS); + } +} + +void +tpa(uint8_t value) { + TPA = value; + + /* Latch high address on rising edge of TPA */ + if (TPA) { + ADDRESS = (ADDRESS & 0x00ff) | ((uint16_t) MA() << 8); + SC = SC_get(); + if (SC == SC_EXECUTE) + EF = EF_get(); + ao_wakeup(&ADDRESS); + } +} + +#define ao_1802_in(port, bit, callback) do { \ + ao_enable_input(port, bit, 0); \ + ao_exti_enable(port, bit); \ + ao_exti_set_callback(port, bit, callback); \ + (*callback)(); \ + } while (0) + +static void mrd_isr(void) { mrd(ao_gpio_get(MRD_PORT, MRD_BIT, MRD_PIN)); } +static void mwr_isr(void) { mwr(ao_gpio_get(MWR_PORT, MWR_BIT, MWR_PIN)); } +static void tpb_isr(void) { tpb(ao_gpio_get(TPB_PORT, TPB_BIT, TPB_PIN)); } +static void tpa_isr(void) { tpa(ao_gpio_get(TPA_PORT, TPA_BIT, TPA_PIN)); } +static void q_isr(void) { Q = Q_get(); } + +static void +ao_set_1802(void) +{ + ao_gpio_set(MUX_PORT, MUX_BIT, MUX_PIN, 0); + ao_1802_in(MRD_PORT, MRD_BIT, mrd_isr); + ao_1802_in(MWR_PORT, MWR_BIT, mwr_isr); + ao_1802_in(TPB_PORT, TPB_BIT, tpb_isr); + ao_1802_in(TPA_PORT, TPA_BIT, tpa_isr); + MUX_CONTROL = MUX_1802; +} + +static void +ao_set_arm(void) +{ + ao_enable_output(MRD_PORT, MRD_BIT, MRD_PIN, 1); + ao_enable_output(MWR_PORT, MWR_BIT, MWR_PIN, 1); + ao_enable_output(TPB_PORT, TPB_BIT, TPB_PIN, 0); + ao_enable_output(TPA_PORT, TPA_BIT, TPA_PIN, 0); + ao_gpio_set(MUX_PORT, MUX_BIT, MUX_PIN, 1); + MUX_CONTROL = MUX_STM; +} + +void +ao_1802_control_init(void) +{ + ao_set_1802(); + + ao_1802_in(Q_PORT, Q_BIT, q_isr); + (void) MA_set; + (void) DATA_set; + (void) ao_set_arm; +} diff --git a/src/cortexelf-v1/ao_1802.h b/src/cortexelf-v1/ao_1802.h new file mode 100644 index 00000000..daa49f66 --- /dev/null +++ b/src/cortexelf-v1/ao_1802.h @@ -0,0 +1,34 @@ +/* + * Copyright © 2017 Keith Packard + * + * 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 2 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. + */ + +#ifndef _AO_1802_H_ +#define _AO_1802_H_ + +/* Signals muxed between 1802 and STM */ +extern uint8_t MRD, TPB, TPA, MWR; + +/* Decoded address driven by TPA/TPB signals */ +extern uint16_t ADDRESS; + +/* Decoded data, driven by TPB signal */ +extern uint8_t DATA; + +extern uint8_t SC; + +#define SC_FETCH 0 +#define SC_EXECUTE 1 +#define SC_DMA 2 +#define SC_INTERRUPT 3 + +#endif /* _AO_1802_H_ */ -- cgit v1.2.3 From 89c8e0299504e66fc416a778055958cff467e008 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 3 Apr 2017 11:36:52 -0700 Subject: cortexelf-v1: Make bit flipping array constant Signed-off-by: Keith Packard --- src/cortexelf-v1/ao_flip_bits.5c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/ao_flip_bits.5c b/src/cortexelf-v1/ao_flip_bits.5c index 26900893..055d5299 100644 --- a/src/cortexelf-v1/ao_flip_bits.5c +++ b/src/cortexelf-v1/ao_flip_bits.5c @@ -9,7 +9,7 @@ int flip_bits(int a) return result; } -printf ("static uint8_t ao_flip_bits[256] = {\n"); +printf ("static const uint8_t ao_flip_bits[256] = {\n"); for (int i = 0; i < 256; i++) { printf (" 0x%02x,", flip_bits(i)); -- cgit v1.2.3 From 280eefc8f86e90e742c536a074d7284cce03af15 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 3 Apr 2017 11:41:51 -0700 Subject: cortexelf-v1: Add pin definitions for 1802 connections Signed-off-by: Keith Packard --- src/cortexelf-v1/ao_pins.h | 49 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/ao_pins.h b/src/cortexelf-v1/ao_pins.h index 034c2d5a..d580ce3d 100644 --- a/src/cortexelf-v1/ao_pins.h +++ b/src/cortexelf-v1/ao_pins.h @@ -206,4 +206,53 @@ #define AO_MATRIX_COL_3_PORT (&stm_gpioc) #define AO_MATRIX_COL_3_PIN 6 +/* 1802 connections */ +#define MA_PORT (&stm_gpioe) +#define MA_SHIFT 0 + +#define DATA_PORT (&stm_gpioe) +#define DATA_SHIFT 8 + +#define MRD_PORT (&stm_gpiob) +#define MRD_BIT 15 + +#define MWR_PORT (&stm_gpioa) +#define MWR_BIT 3 + +#define TPB_PORT (&stm_gpioa) +#define TPB_BIT 7 + +#define TPA_PORT (&stm_gpioa) +#define TPA_BIT 6 + +#define MUX_PORT (&stm_gpiob) +#define MUX_BIT 1 + +#define WAIT_PORT (&stm_gpioa) +#define WAIT_PIN 4 + +#define CLEAR_PORT (&stm_gpioa) +#define CLEAR_PIN 10 + +#define Q_PORT (&stm_gpiob) +#define Q_BIT 12 + +#define SC_PORT (&stm_gpiob) +#define SC_SHIFT 13 + +#define N_PORT (&stm_gpiod) +#define N_SHIFT 13 + +#define DMA_IN_PORT (&stm_gpioa) +#define DMA_IN_PIN 0 + +#define DMA_OUT_PORT (&stm_gpioa) +#define DMA_OUT_PIN 9 + +#define INTERRUPT_PORT (&stm_gpioa) +#define INTERRUPT_PIN 2 + +#define EF_PORT (&stm_gpiob) +#define EF_SHIFT 8 + #endif /* _AO_PINS_H_ */ -- cgit v1.2.3 From 86d5119f19b5f3131d224982e011fd233b48aa22 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 4 Apr 2017 16:05:15 -0700 Subject: cortexelf-v1: More 1802 noodling Add code to track the address and data displays, change how 1802 pin tracking works Signed-off-by: Keith Packard --- src/cortexelf-v1/Makefile | 1 + src/cortexelf-v1/ao_1802.c | 342 ++++++++++++++++++++++++++++----------- src/cortexelf-v1/ao_1802.h | 103 +++++++++++- src/cortexelf-v1/ao_cortexelf.c | 6 + src/cortexelf-v1/ao_flip_bits.5c | 23 +-- src/cortexelf-v1/ao_hex.c | 36 +++++ src/cortexelf-v1/ao_hex.h | 21 +++ src/cortexelf-v1/ao_pins.h | 47 +++--- 8 files changed, 453 insertions(+), 126 deletions(-) create mode 100644 src/cortexelf-v1/ao_hex.c create mode 100644 src/cortexelf-v1/ao_hex.h (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/Makefile b/src/cortexelf-v1/Makefile index d7157521..8cc6ce31 100644 --- a/src/cortexelf-v1/Makefile +++ b/src/cortexelf-v1/Makefile @@ -73,6 +73,7 @@ ALTOS_SRC = \ ao_button.c \ ao_event.c \ ao_1802.c \ + ao_hex.c \ ao_lisp_lex.c \ ao_lisp_mem.c \ ao_lisp_cons.c \ diff --git a/src/cortexelf-v1/ao_1802.c b/src/cortexelf-v1/ao_1802.c index 55e778df..b7e11637 100644 --- a/src/cortexelf-v1/ao_1802.c +++ b/src/cortexelf-v1/ao_1802.c @@ -17,9 +17,6 @@ #include #include -/* Signals muxed between 1802 and STM */ -uint8_t MRD, TPB, TPA, MWR; - /* Decoded address driven by TPA/TPB signals */ uint16_t ADDRESS; @@ -27,144 +24,305 @@ uint16_t ADDRESS; uint8_t DATA; /* Mux control */ -#define MUX_1802 0 -#define MUX_STM 1 +#define _MUX_1802 0 +#define _MUX_STM 1 uint8_t MUX_CONTROL; -/* Signals driven by 1802 only */ -uint8_t WAIT, CLEAR, Q, SC, N; -uint8_t DMA_IN, DMA_OUT, INTERRUPT; -uint8_t EF; +/* Signals muxed between 1802 and STM */ +uint8_t +MRD(void) { + return ao_gpio_get(MRD_PORT, MRD_BIT, MRD_PIN); +} -static uint8_t ma_stm; +void +MRD_set(uint8_t value) { + ao_gpio_set(MRD_PORT, MRD_BIT, MRD_PIN, value); +} uint8_t -MA(void) { - if (MUX_CONTROL == MUX_1802) - return (ao_gpio_get_all(MA_PORT) >> MA_SHIFT) & 0xff; - else - return ma_stm; +MWR(void) { + return ao_gpio_get(MWR_PORT, MWR_BIT, MWR_PIN); +} + +void +MWR_set(uint8_t value) { + ao_gpio_set(MWR_PORT, MWR_BIT, MWR_PIN, value); } static void -MA_set(uint8_t ma) { - ao_gpio_set_mask(MA_PORT, ((uint16_t) ma) << MA_SHIFT, 0xff << MA_SHIFT); - ma_stm = ma; +TPA_rising(void) +{ + ADDRESS = (ADDRESS & 0x00ff) | ((uint16_t) MA() << 8); + ao_wakeup(&ADDRESS); } -static uint8_t data_stm; +uint8_t +TPA(void) { + return ao_gpio_get(TPA_PORT, TPA_BIT, TPA_PIN); +} -static uint8_t -DATA_get(void) { - if (MUX_CONTROL == MUX_1802) - return ao_flip_bits[(ao_gpio_get_all(DATA_PORT) >> DATA_SHIFT) & 0xff]; - else - return data_stm; +void +TPA_set(uint8_t tpa) { + ao_gpio_set(TPA_PORT, TPA_BIT, TPA_PIN, tpa); + if (tpa) + TPA_rising(); +} + +static void +TPB_rising(void) +{ + ADDRESS = (ADDRESS & 0xff00) | MA(); + ao_wakeup(&ADDRESS); } static void -DATA_set(uint8_t data) { - ao_gpio_set_mask(DATA_PORT, ((uint16_t) ao_flip_bits[data]) << DATA_SHIFT, 0xff << DATA_SHIFT); - data_stm = data; +TPB_falling(void) +{ + DATA = BUS(); + ao_wakeup(&ADDRESS); } -static uint8_t -N_get(void) { - return (ao_gpio_get_all(N_PORT) >> N_SHIFT) & 0x7; +uint8_t +TPB(void) { + return ao_gpio_get(TPB_PORT, TPB_BIT, TPB_PIN); } -static uint8_t -EF_get(void) { - return (ao_gpio_get_all(EF_PORT) >> EF_SHIFT) & 0xf; +void +TPB_set(uint8_t tpb) { + ao_gpio_set(TPB_PORT, TPB_BIT, TPB_PIN, tpb); + if (tpb) + TPB_rising(); + else + TPB_falling(); } -static uint8_t -Q_get(void) { +uint8_t +MA(void) { + return (ao_gpio_get_all(MA_PORT) >> MA_SHIFT) & MA_MASK; +} + +void +MA_set(uint8_t ma) { + ao_gpio_set_mask(MA_PORT, ((uint16_t) ma) << MA_SHIFT, MA_MASK << MA_SHIFT); +} + +/* Tri-state data bus */ + +uint8_t +BUS(void) { + return ao_flip_bits_8[(ao_gpio_get_all(BUS_PORT) >> BUS_SHIFT) & BUS_MASK]; +} + +void +BUS_set(uint8_t bus) { + ao_gpio_set_mask(BUS_PORT, ao_flip_bits_8[bus] << BUS_SHIFT, BUS_MASK << BUS_SHIFT); +} + +void +BUS_stm(void) +{ + ao_set_output_mask(BUS_PORT, BUS_MASK << BUS_SHIFT); +} + +void +BUS_1802(void) +{ + ao_set_input_mask(BUS_PORT, BUS_MASK << BUS_SHIFT); +} + +/* Pins controlled by 1802 */ +uint8_t +SC(void) { + return ao_flip_bits_2[(ao_gpio_get_all(SC_PORT) >> SC_SHIFT) & SC_MASK]; +} + +uint8_t +Q(void) { return ao_gpio_get(Q_PORT, Q_BIT, Q_PIN); } -static uint8_t -SC_get(void) { - static const uint8_t flip_sc[4] = { 0, 2, 1, 3 }; - return flip_sc[(ao_gpio_get_all(SC_PORT) >> SC_SHIFT) & 3]; +uint8_t +N(void) { + return (ao_gpio_get_all(N_PORT) >> N_SHIFT) & N_MASK; +} + +/* Pins controlled by STM */ +uint8_t +EF(void) { + return (ao_gpio_get_all(EF_PORT) >> EF_SHIFT) & EF_MASK; } void -mrd(uint8_t value) { MRD = value; } +EF_set(uint8_t ef) { + ao_gpio_set_mask(EF_PORT, ef << EF_SHIFT, EF_MASK << EF_SHIFT); +} + +uint8_t +DMA_IN(void) { + return ao_gpio_get(DMA_IN_PORT, DMA_IN_BIT, DMA_IN_PIN); +} void -mwr(uint8_t value) { MWR = value; } +DMA_IN_set(uint8_t dma_in) { + ao_gpio_set(DMA_IN_PORT, DMA_IN_BIT, DMA_IN_PIN, dma_in); +} + +uint8_t +DMA_OUT(void) { + return ao_gpio_get(DMA_OUT_PORT, DMA_OUT_BIT, DMA_OUT_PIN); +} void -tpb(uint8_t value) { - TPB = value; +DMA_OUT_set(uint8_t dma_out) { + ao_gpio_set(DMA_OUT_PORT, DMA_OUT_BIT, DMA_OUT_PIN, dma_out); +} - /* Latch low address and data on rising edge of TPB */ - if (TPB) { - ADDRESS = (ADDRESS & 0xff00) | MA(); - DATA = DATA_get(); - N = N_get(); - ao_wakeup(&ADDRESS); - } +uint8_t +INT(void) { + return ao_gpio_get(INT_PORT, INT_BIT, INT_PIN); } void -tpa(uint8_t value) { - TPA = value; +INT_set(uint8_t dma_out) { + ao_gpio_set(INT_PORT, INT_BIT, INT_PIN, dma_out); +} + +uint8_t +CLEAR(void) { + return ao_gpio_get(CLEAR_PORT, CLEAR_BIT, CLEAR_PIN); +} + +void +CLEAR_set(uint8_t dma_out) { + ao_gpio_set(CLEAR_PORT, CLEAR_BIT, CLEAR_PIN, dma_out); +} +uint8_t +WAIT(void) { + return ao_gpio_get(WAIT_PORT, WAIT_BIT, WAIT_PIN); +} + +void +WAIT_set(uint8_t dma_out) { + ao_gpio_set(WAIT_PORT, WAIT_BIT, WAIT_PIN, dma_out); +} + +void +tpb_isr(void) { + /* Latch low address and data on rising edge of TPB */ + if (TPB()) + TPB_rising(); + else + TPB_falling(); +} + +void +tpa_isr(void) { /* Latch high address on rising edge of TPA */ - if (TPA) { - ADDRESS = (ADDRESS & 0x00ff) | ((uint16_t) MA() << 8); - SC = SC_get(); - if (SC == SC_EXECUTE) - EF = EF_get(); - ao_wakeup(&ADDRESS); - } + if (TPA()) + TPA_rising(); } -#define ao_1802_in(port, bit, callback) do { \ - ao_enable_input(port, bit, 0); \ - ao_exti_enable(port, bit); \ - ao_exti_set_callback(port, bit, callback); \ - (*callback)(); \ +#define ao_1802_in(port, bit, mode) do { \ + ao_gpio_set_mode(port, bit, mode); \ + ao_set_input(port, bit); \ + } while (0) + +#define ao_1802_in_isr(port, bit, mode) do { \ + ao_gpio_set_mode(port, bit, mode); \ + ao_set_input(port, bit); \ + ao_exti_enable(port, bit); \ } while (0) -static void mrd_isr(void) { mrd(ao_gpio_get(MRD_PORT, MRD_BIT, MRD_PIN)); } -static void mwr_isr(void) { mwr(ao_gpio_get(MWR_PORT, MWR_BIT, MWR_PIN)); } -static void tpb_isr(void) { tpb(ao_gpio_get(TPB_PORT, TPB_BIT, TPB_PIN)); } -static void tpa_isr(void) { tpa(ao_gpio_get(TPA_PORT, TPA_BIT, TPA_PIN)); } -static void q_isr(void) { Q = Q_get(); } +#define ao_1802_out_isr(port, bit) do { \ + ao_exti_disable(port, bit); \ + ao_set_output(port, bit); \ + } while (0) -static void -ao_set_1802(void) +void +MUX_1802(void) { - ao_gpio_set(MUX_PORT, MUX_BIT, MUX_PIN, 0); - ao_1802_in(MRD_PORT, MRD_BIT, mrd_isr); - ao_1802_in(MWR_PORT, MWR_BIT, mwr_isr); - ao_1802_in(TPB_PORT, TPB_BIT, tpb_isr); - ao_1802_in(TPA_PORT, TPA_BIT, tpa_isr); - MUX_CONTROL = MUX_1802; + if (MUX_CONTROL != _MUX_1802) { + /* Set pins to input, but pulled to idle value */ + ao_1802_in(MRD_PORT, MRD_BIT, AO_EXTI_MODE_PULL_UP); + ao_1802_in(MWR_PORT, MWR_BIT, AO_EXTI_MODE_PULL_UP); + ao_1802_in_isr(TPB_PORT, TPB_BIT, AO_EXTI_MODE_PULL_DOWN); + ao_1802_in_isr(TPA_PORT, TPA_BIT, AO_EXTI_MODE_PULL_DOWN); + ao_set_input_mask(MA_PORT, MA_MASK << MA_SHIFT); + + ao_gpio_set(MUX_PORT, MUX_BIT, MUX_PIN, 0); + + /* Now change the pins to eliminate the pull up/down */ + ao_gpio_set_mode(MRD_PORT, MRD_BIT, 0); + ao_gpio_set_mode(MWR_PORT, MWR_BIT, 0); + ao_gpio_set_mode(TPB_PORT, TPB_BIT, 0); + ao_gpio_set_mode(TPA_PORT, TPA_BIT, 0); + + MUX_CONTROL = _MUX_1802; + } } -static void -ao_set_arm(void) +void +MUX_stm(void) { - ao_enable_output(MRD_PORT, MRD_BIT, MRD_PIN, 1); - ao_enable_output(MWR_PORT, MWR_BIT, MWR_PIN, 1); - ao_enable_output(TPB_PORT, TPB_BIT, TPB_PIN, 0); - ao_enable_output(TPA_PORT, TPA_BIT, TPA_PIN, 0); - ao_gpio_set(MUX_PORT, MUX_BIT, MUX_PIN, 1); - MUX_CONTROL = MUX_STM; + if (MUX_CONTROL != _MUX_STM) { + /* Set the pins back to pull to the idle value */ + ao_gpio_set_mode(MRD_PORT, MRD_BIT, AO_EXTI_MODE_PULL_UP); + ao_gpio_set_mode(MWR_PORT, MWR_BIT, AO_EXTI_MODE_PULL_UP); + ao_gpio_set_mode(TPB_PORT, TPB_BIT, AO_EXTI_MODE_PULL_DOWN); + ao_gpio_set_mode(TPA_PORT, TPA_BIT, AO_EXTI_MODE_PULL_DOWN); + + ao_gpio_set(MUX_PORT, MUX_BIT, MUX_PIN, 1); + + /* Now set the pins as output, driven to the idle value */ + ao_set_output(MRD_PORT, MRD_BIT, MRD_PIN, 1); + ao_set_output(MWR_PORT, MWR_BIT, MWR_PIN, 1); + ao_set_output(TPB_PORT, TPB_BIT, TPB_PIN, 0); + ao_set_output(TPA_PORT, TPA_BIT, TPA_PIN, 0); + ao_set_output_mask(MA_PORT, MA_MASK << MA_SHIFT); + MUX_CONTROL = _MUX_STM; + } } void -ao_1802_control_init(void) +ao_1802_init(void) { - ao_set_1802(); + /* Multiplexed signals*/ + + /* active low signals */ + ao_enable_input(MRD_PORT, MRD_BIT, AO_EXTI_MODE_PULL_UP); + ao_enable_input(MWR_PORT, MWR_BIT, AO_EXTI_MODE_PULL_UP); + + /* active high signals with interrupts */ + ao_exti_setup(TPA_PORT, TPA_BIT, + AO_EXTI_MODE_PULL_DOWN | AO_EXTI_MODE_RISING | AO_EXTI_MODE_FALLING, + tpa_isr); + ao_exti_setup(TPB_PORT, TPB_BIT, + AO_EXTI_MODE_PULL_DOWN | AO_EXTI_MODE_RISING | AO_EXTI_MODE_FALLING, + tpb_isr); + + /* multiplexed address bus */ + ao_enable_input_mask(MA_PORT, MA_MASK << MA_SHIFT, 0); + + /* Data bus */ + + ao_enable_input_mask(BUS_PORT, BUS_MASK << BUS_SHIFT, 0); + + /* Pins controlled by 1802 */ + ao_enable_input_mask(SC_PORT, SC_MASK << SC_SHIFT, 0); + ao_enable_input(Q_PORT, Q_BIT, 0); + ao_enable_input_mask(N_PORT, N_MASK << N_SHIFT, 0); + + /* Pins controlled by STM */ + ao_enable_output_mask(EF_PORT, 0, EF_MASK << EF_SHIFT); + ao_enable_output(DMA_IN_PORT, DMA_IN_BIT, DMA_IN_PIN, 1); + ao_enable_output(DMA_OUT_PORT, DMA_OUT_BIT, DMA_OUT_PIN, 1); + ao_enable_output(INT_PORT, INT_BIT, INT_PIN, 1); + ao_enable_output(CLEAR_PORT, CLEAR_BIT, CLEAR_PIN, 1); + ao_enable_output(WAIT_PORT, WAIT_BIT, WAIT_PIN, 1); - ao_1802_in(Q_PORT, Q_BIT, q_isr); - (void) MA_set; - (void) DATA_set; - (void) ao_set_arm; + /* Force configuration to STM so that MUX_1802 will do something */ + MUX_CONTROL = _MUX_STM; + MUX_1802(); } diff --git a/src/cortexelf-v1/ao_1802.h b/src/cortexelf-v1/ao_1802.h index daa49f66..5ea89fee 100644 --- a/src/cortexelf-v1/ao_1802.h +++ b/src/cortexelf-v1/ao_1802.h @@ -15,20 +15,115 @@ #ifndef _AO_1802_H_ #define _AO_1802_H_ -/* Signals muxed between 1802 and STM */ -extern uint8_t MRD, TPB, TPA, MWR; - /* Decoded address driven by TPA/TPB signals */ extern uint16_t ADDRESS; /* Decoded data, driven by TPB signal */ extern uint8_t DATA; -extern uint8_t SC; +uint8_t +MRD(void); + +void +MRD_set(uint8_t value); + +uint8_t +MWR(void); + +void +MWR_set(uint8_t value); + +uint8_t +TPA(void); + +void +TPA_set(uint8_t tpa); + +uint8_t +TPB(void); + +void +TPB_set(uint8_t tpb); + +uint8_t +MA(void); + +void +MA_set(uint8_t ma); + +/* Tri-state data bus */ + +uint8_t +BUS(void); + +void +BUS_set(uint8_t bus); + +void +BUS_stm(void); + +void +BUS_1802(void); + +/* Pins controlled by 1802 */ +uint8_t +SC(void); + +uint8_t +Q(void); + +uint8_t +N(void); + +/* Pins controlled by STM */ +uint8_t +EF(void); + +void +EF_set(uint8_t ef); + +uint8_t +DMA_IN(void); + +void +DMA_IN_set(uint8_t dma_in); + +uint8_t +DMA_OUT(void); + +void +DMA_OUT_set(uint8_t dma_out); + +uint8_t +INT(void); + +void +INT_set(uint8_t dma_out); + +uint8_t +CLEAR(void); + +void +CLEAR_set(uint8_t dma_out); + +uint8_t +WAIT(void); + +void +WAIT_set(uint8_t dma_out); #define SC_FETCH 0 #define SC_EXECUTE 1 #define SC_DMA 2 #define SC_INTERRUPT 3 +void +MUX_1802(void); + +void +MUX_stm(void); + +void +ao_1802_init(void); + #endif /* _AO_1802_H_ */ diff --git a/src/cortexelf-v1/ao_cortexelf.c b/src/cortexelf-v1/ao_cortexelf.c index 77fbd0c0..decd6ef5 100644 --- a/src/cortexelf-v1/ao_cortexelf.c +++ b/src/cortexelf-v1/ao_cortexelf.c @@ -31,6 +31,8 @@ #include #include #include +#include +#include struct ao_task ball_task; @@ -274,6 +276,10 @@ main(void) ao_as1107_init(); + ao_1802_init(); + + ao_hex_init(); + ao_config_init(); ao_add_task(&ball_task, ao_ball, "ball"); diff --git a/src/cortexelf-v1/ao_flip_bits.5c b/src/cortexelf-v1/ao_flip_bits.5c index 055d5299..cd5507cc 100644 --- a/src/cortexelf-v1/ao_flip_bits.5c +++ b/src/cortexelf-v1/ao_flip_bits.5c @@ -1,19 +1,24 @@ #!/usr/bin/nickle -int flip_bits(int a) +int flip_bits(int a, int n) { int result = 0; - for (int pos = 0; pos < 8; pos++) + for (int pos = 0; pos < n; pos++) if ((a & (1 << pos)) != 0) - result |= (1 << (7 - pos)); + result |= (1 << (n - 1 - pos)); return result; } -printf ("static const uint8_t ao_flip_bits[256] = {\n"); +void print_flip_bits(string name, int n) { + printf ("static const uint8_t %s_%d[%d] = {\n", name, n, 1 << n); -for (int i = 0; i < 256; i++) { - printf (" 0x%02x,", flip_bits(i)); - if ((i & 0xf) == 0xf) - printf("\n"); + for (int i = 0; i < 1 << n; i++) { + printf (" 0x%02x,", flip_bits(i, n)); + if ((i & 0xf) == 0xf) + printf("\n"); + } + printf("};\n"); } -printf("};\n"); + +print_flip_bits("ao_flip_bits", 8); +print_flip_bits("ao_flip_bits", 2); diff --git a/src/cortexelf-v1/ao_hex.c b/src/cortexelf-v1/ao_hex.c new file mode 100644 index 00000000..1507407b --- /dev/null +++ b/src/cortexelf-v1/ao_hex.c @@ -0,0 +1,36 @@ +/* + * Copyright © 2017 Keith Packard + * + * 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 2 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. + */ + +#include +#include "ao_hex.h" +#include "ao_as1107.h" +#include "ao_1802.h" + +static struct ao_task ao_hex_task; + +static void +ao_hex(void) +{ + for (;;) { + ao_as1107_write_16(0, ADDRESS); + ao_as1107_write_8(6, DATA); + ao_sleep(&ADDRESS); + } +} + +void +ao_hex_init(void) +{ + ao_add_task(&ao_hex_task, ao_hex, "hex"); +} diff --git a/src/cortexelf-v1/ao_hex.h b/src/cortexelf-v1/ao_hex.h new file mode 100644 index 00000000..674c1eee --- /dev/null +++ b/src/cortexelf-v1/ao_hex.h @@ -0,0 +1,21 @@ +/* + * Copyright © 2017 Keith Packard + * + * 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 2 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. + */ + +#ifndef _AO_HEX_H_ +#define _AO_HEX_H_ + +void +ao_hex_init(void); + +#endif /* _AO_HEX_H_ */ diff --git a/src/cortexelf-v1/ao_pins.h b/src/cortexelf-v1/ao_pins.h index d580ce3d..50add5d3 100644 --- a/src/cortexelf-v1/ao_pins.h +++ b/src/cortexelf-v1/ao_pins.h @@ -207,12 +207,6 @@ #define AO_MATRIX_COL_3_PIN 6 /* 1802 connections */ -#define MA_PORT (&stm_gpioe) -#define MA_SHIFT 0 - -#define DATA_PORT (&stm_gpioe) -#define DATA_SHIFT 8 - #define MRD_PORT (&stm_gpiob) #define MRD_BIT 15 @@ -225,34 +219,45 @@ #define TPA_PORT (&stm_gpioa) #define TPA_BIT 6 -#define MUX_PORT (&stm_gpiob) -#define MUX_BIT 1 +#define MA_PORT (&stm_gpioe) +#define MA_SHIFT 0 +#define MA_MASK 0xff -#define WAIT_PORT (&stm_gpioa) -#define WAIT_PIN 4 +#define BUS_PORT (&stm_gpioe) +#define BUS_SHIFT 8 +#define BUS_MASK 0xff -#define CLEAR_PORT (&stm_gpioa) -#define CLEAR_PIN 10 +#define SC_PORT (&stm_gpiob) +#define SC_SHIFT 13 +#define SC_MASK 3 #define Q_PORT (&stm_gpiob) #define Q_BIT 12 -#define SC_PORT (&stm_gpiob) -#define SC_SHIFT 13 - #define N_PORT (&stm_gpiod) #define N_SHIFT 13 +#define N_MASK 7 + +#define EF_PORT (&stm_gpiob) +#define EF_SHIFT 8 +#define EF_MASK 0xf #define DMA_IN_PORT (&stm_gpioa) -#define DMA_IN_PIN 0 +#define DMA_IN_BIT 0 #define DMA_OUT_PORT (&stm_gpioa) -#define DMA_OUT_PIN 9 +#define DMA_OUT_BIT 9 -#define INTERRUPT_PORT (&stm_gpioa) -#define INTERRUPT_PIN 2 +#define INT_PORT (&stm_gpioa) +#define INT_BIT 2 -#define EF_PORT (&stm_gpiob) -#define EF_SHIFT 8 +#define CLEAR_PORT (&stm_gpioa) +#define CLEAR_BIT 10 + +#define WAIT_PORT (&stm_gpioa) +#define WAIT_BIT 4 + +#define MUX_PORT (&stm_gpiob) +#define MUX_BIT 1 #endif /* _AO_PINS_H_ */ -- cgit v1.2.3 From c97b4c65d66078a4e187b782669e6b36ee92d30c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 9 Apr 2017 12:56:59 -0700 Subject: altos: Use MP switch in cortexelf boot loader for force loader mode Provide a way to get to the boot loader on the cortexelf board by turning the MP switch on. Signed-off-by: Keith Packard --- src/cortexelf-v1/flash-loader/ao_pins.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/flash-loader/ao_pins.h b/src/cortexelf-v1/flash-loader/ao_pins.h index a34bcb6c..5d63dc2c 100644 --- a/src/cortexelf-v1/flash-loader/ao_pins.h +++ b/src/cortexelf-v1/flash-loader/ao_pins.h @@ -24,12 +24,12 @@ #include -/* Companion port cs_companion0 PB6 */ +/* MP switch, gpioc 9 */ #define AO_BOOT_PIN 1 -#define AO_BOOT_APPLICATION_GPIO stm_gpiob -#define AO_BOOT_APPLICATION_PIN 0 +#define AO_BOOT_APPLICATION_GPIO stm_gpioc +#define AO_BOOT_APPLICATION_PIN 9 #define AO_BOOT_APPLICATION_VALUE 1 -#define AO_BOOT_APPLICATION_MODE AO_EXTI_MODE_PULL_UP +#define AO_BOOT_APPLICATION_MODE 0 #endif /* _AO_PINS_H_ */ -- cgit v1.2.3 From 6efa53bafda18313742849a6c4992f09c3e403c3 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 9 Apr 2017 12:59:07 -0700 Subject: cortexelf-v1: Bump SPI pin speed to 40MHz to for sdcard. Fix VGA DMA. Tell the DMA code to leave the DMA engine enabled so the VGA output can use it. Signed-off-by: Keith Packard --- src/cortexelf-v1/ao_pins.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/ao_pins.h b/src/cortexelf-v1/ao_pins.h index 50add5d3..258ffe31 100644 --- a/src/cortexelf-v1/ao_pins.h +++ b/src/cortexelf-v1/ao_pins.h @@ -90,12 +90,12 @@ #define HAS_SPI_2 1 #define SPI_2_PB13_PB14_PB15 0 #define SPI_2_PD1_PD3_PD4 1 /* LED displays, microSD */ -#define SPI_2_OSPEEDR STM_OSPEEDR_10MHz +#define SPI_2_OSPEEDR STM_OSPEEDR_40MHz #define SPI_2_PORT (&stm_gpiod) -#define SPI_2_SCK_PIN 1 -#define SPI_2_MISO_PIN 3 -#define SPI_2_MOSI_PIN 4 +//#define SPI_2_SCK_PIN 1 +//#define SPI_2_MISO_PIN 3 +//#define SPI_2_MOSI_PIN 4 #define HAS_I2C_1 0 #define I2C_1_PB8_PB9 0 @@ -125,6 +125,8 @@ #define AO_SDCARD_SPI_MISO_PIN 3 #define AO_SDCARD_SPI_MOSI_PIN 4 +/* VGA */ +#define STM_DMA1_3_STOLEN 1 /* Buttons */ #define AO_EVENT 1 -- cgit v1.2.3 From eb0b2b4e9f56d1d6fc2b06e39c8372dfcdf3b1f5 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 9 Apr 2017 13:03:50 -0700 Subject: cortexelf-v1: Initialize key matrix code This gets the hex keypad working. Signed-off-by: Keith Packard --- src/cortexelf-v1/ao_cortexelf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/ao_cortexelf.c b/src/cortexelf-v1/ao_cortexelf.c index decd6ef5..61a9d219 100644 --- a/src/cortexelf-v1/ao_cortexelf.c +++ b/src/cortexelf-v1/ao_cortexelf.c @@ -275,7 +275,7 @@ main(void) ao_button_init(); ao_as1107_init(); - + ao_matrix_init(); ao_1802_init(); ao_hex_init(); -- cgit v1.2.3 From a5c8b8c59f99108233d99ceceb6f85315694e4b1 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 13 Apr 2017 21:18:58 -0600 Subject: cortexelf-v1: Fetch data at TPB rising when MWR or MRD are low This should get the right value at least. Signed-off-by: Keith Packard --- src/cortexelf-v1/ao_1802.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/cortexelf-v1') diff --git a/src/cortexelf-v1/ao_1802.c b/src/cortexelf-v1/ao_1802.c index b7e11637..9fb36595 100644 --- a/src/cortexelf-v1/ao_1802.c +++ b/src/cortexelf-v1/ao_1802.c @@ -73,14 +73,14 @@ static void TPB_rising(void) { ADDRESS = (ADDRESS & 0xff00) | MA(); + if (MWR() == 0 || MRD() == 0) + DATA = BUS(); ao_wakeup(&ADDRESS); } static void TPB_falling(void) { - DATA = BUS(); - ao_wakeup(&ADDRESS); } uint8_t -- cgit v1.2.3