diff options
| -rw-r--r-- | src/stm-vga/Makefile | 83 | ||||
| -rw-r--r-- | src/stm-vga/ao_demo.c | 233 | ||||
| -rw-r--r-- | src/stm-vga/ao_lisp_os.h | 62 | ||||
| -rw-r--r-- | src/stm-vga/ao_lisp_os_save.c | 53 | ||||
| -rw-r--r-- | src/stm-vga/ao_pins.h | 219 | 
5 files changed, 650 insertions, 0 deletions
| diff --git a/src/stm-vga/Makefile b/src/stm-vga/Makefile new file mode 100644 index 00000000..46a77272 --- /dev/null +++ b/src/stm-vga/Makefile @@ -0,0 +1,83 @@ +# +# AltOS build +# +# + +include ../stm/Makefile.defs + +INC = \ +	ao.h \ +	ao_arch.h \ +	ao_arch_funcs.h \ +	ao_boot.h \ +	ao_pins.h \ +	ao_product.h \ +	ao_vga.h \ +	ao_draw.h \ +	ao_draw_int.h \ +	ao_font.h \ +	ao_ps2.h + +# +# Common AltOS sources +# +ALTOS_SRC = \ +	ao_interrupt.c \ +	ao_boot_chain.c \ +	ao_product.c \ +	ao_romconfig.c \ +	ao_cmd.c \ +	ao_task.c \ +	ao_led.c \ +	ao_stdio.c \ +	ao_panic.c \ +	ao_timer.c \ +	ao_lcd_stm.c \ +	ao_lcd_font.c \ +	ao_vga.c \ +	ao_blt.c \ +	ao_copy.c \ +	ao_rect.c \ +	ao_text.c \ +	ao_line.c \ +	ao_mutex.c \ +	ao_dma_stm.c \ +	ao_adc_stm.c \ +	ao_data.c \ +	ao_i2c_stm.c \ +	ao_usb_stm.c \ +	ao_exti_stm.c \ +	ao_ps2.c \ +	ao_console.c + +PRODUCT=StmVga-v0.0 +IDPRODUCT=0x000a + +CFLAGS = $(STM_CFLAGS) -g -Os + +PROG=stm-vga-$(VERSION) +ELF=$(PROG).elf +IHX=$(PROG).ihx + +SRC=$(ALTOS_SRC) ao_demo.c +OBJ=$(SRC:.c=.o) + +all: $(ELF) $(IHX) + +$(ELF): Makefile $(OBJ) +	$(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $@ $(OBJ) $(LIBS) + +ao_product.h: ao-make-product.5c ../Version +	$(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@ + +$(OBJ): $(INC) + +distclean:	clean + +clean: +	rm -f *.o *.elf *.ihx +	rm -f ao_product.h + +install: + +uninstall: diff --git a/src/stm-vga/ao_demo.c b/src/stm-vga/ao_demo.c new file mode 100644 index 00000000..1b443b1f --- /dev/null +++ b/src/stm-vga/ao_demo.c @@ -0,0 +1,233 @@ +/* + * Copyright © 2011 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 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 "ao.h" +#include <ao_exti.h> +#include <ao_event.h> +#include <ao_quadrature.h> +#include <ao_button.h> +#include <ao_boot.h> +#include <ao_vga.h> +#include <ao_ps2.h> +#include <ao_console.h> + +struct ao_task ball_task; +struct ao_task ps2_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; +			} +		} +	} +} + +void +ao_ps2(void) +{ +	uint8_t	leds = 0; +	for (;;) { +		uint8_t	b = ao_ps2_get(); +		printf ("%02x\n", b); +		flush(); +		if (b == 0x14) { +			leds ^= 4; +			ao_ps2_put(0xed); +			if (ao_ps2_get() == 0xfa) +				ao_ps2_put(leds); +		} +	} +} + +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) +{ +	ao_clock_init(); + +	ao_task_init(); + +	ao_led_init(LEDS_AVAILABLE); +	ao_led_on(AO_LED_GREEN); +	ao_led_off(AO_LED_BLUE); +	ao_timer_init(); +	ao_dma_init(); +	ao_cmd_init(); +	ao_vga_init(); +	ao_usb_init(); +	ao_exti_init(); +	ao_ps2_init(); +	ao_console_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/stm-vga/ao_lisp_os.h b/src/stm-vga/ao_lisp_os.h new file mode 100644 index 00000000..1993ac44 --- /dev/null +++ b/src/stm-vga/ao_lisp_os.h @@ -0,0 +1,62 @@ +/* + * Copyright © 2016 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; 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" + +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) +{ +	ao_led_set(led); +} + +static inline void +ao_lisp_os_delay(int delay) +{ +	ao_delay(AO_MS_TO_TICKS(delay)); +} + +#endif diff --git a/src/stm-vga/ao_lisp_os_save.c b/src/stm-vga/ao_lisp_os_save.c new file mode 100644 index 00000000..7c853990 --- /dev/null +++ b/src/stm-vga/ao_lisp_os_save.c @@ -0,0 +1,53 @@ +/* + * Copyright © 2016 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 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 <ao.h> +#include <ao_lisp.h> +#include <ao_flash.h> + +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/stm-vga/ao_pins.h b/src/stm-vga/ao_pins.h new file mode 100644 index 00000000..8503c4fd --- /dev/null +++ b/src/stm-vga/ao_pins.h @@ -0,0 +1,219 @@ +/* + * 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 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_ + +/* Bridge SB17 on the board and use the MCO from the other chip */ +#define AO_HSE			8000000 +#define AO_HSE_BYPASS		1 + +/* PLLVCO = 96MHz (so that USB will work) */ +#define AO_PLLMUL		12 +#define AO_RCC_CFGR_PLLMUL	(STM_RCC_CFGR_PLLMUL_12) + +/* SYSCLK = 24MHz */ +#define AO_PLLDIV		4 +#define AO_RCC_CFGR_PLLDIV	(STM_RCC_CFGR_PLLDIV_4) + +/* HCLK = 24MHZ (CPU clock) */ +#define AO_AHB_PRESCALER	1 +#define AO_RCC_CFGR_HPRE_DIV	STM_RCC_CFGR_HPRE_DIV_1 + +/* 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 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 + +#define HAS_SERIAL_1		0 +#define USE_SERIAL_1_STDIN	0 +#define SERIAL_1_PB6_PB7	1 +#define SERIAL_1_PA9_PA10	0 + +#define HAS_SERIAL_2		0 +#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	1 +#define SERIAL_3_PB10_PB11	0 +#define SERIAL_3_PC10_PC11	0 +#define SERIAL_3_PD8_PD9	1 + +#define HAS_SPI_1		0 +#define SPI_1_PB3_PB4_PB5	1 +#define SPI_1_OSPEEDR		STM_OSPEEDR_10MHz + +#define HAS_SPI_2		0 + +#define HAS_USB			1 +#define HAS_BEEP		0 +#define PACKET_HAS_SLAVE	0 +#define HAS_TASK_QUEUE		1 + +#define CONSOLE_STDIN		1 + +#define AO_STACK_SIZE		1024 + +#define STM_DMA1_3_STOLEN	1 + +#define AO_BOOT_CHAIN		1 + +#define LOW_LEVEL_DEBUG		0 + +#define LED_PORT_ENABLE		STM_RCC_AHBENR_GPIOBEN +#define LED_PORT		(&stm_gpiob) +#define LED_PIN_GREEN		7 +#define LED_PIN_BLUE		6 +#define AO_LED_GREEN		(1 << LED_PIN_GREEN) +#define AO_LED_BLUE		(1 << LED_PIN_BLUE) +#define AO_LED_PANIC		AO_LED_BLUE + +#define LEDS_AVAILABLE		(AO_LED_BLUE | AO_LED_GREEN) + +#define AO_LCD_STM_SEG_ENABLED_0 (		\ +		(1 << 0) | /* PA1 */		\ +		(1 << 1) | /* PA2 */		\ +		(1 << 2) | /* PA3 */		\ +		(0 << 3) | /* PA6 */		\ +		(0 << 4) | /* PA7 */		\ +		(0 << 5) | /* PB0 */		\ +		(0 << 6) | /* PB1 */		\ +		(1 << 7) | /* PB3 */		\ +		(1 << 8) | /* PB4 */		\ +		(1 << 9) | /* PB5 */		\ +		(1 << 10) | /* PB10 */		\ +		(1 << 11) | /* PB11 */		\ +		(1 << 12) | /* PB12 */		\ +		(1 << 13) | /* PB13 */		\ +		(1 << 14) | /* PB14 */		\ +		(1 << 15) | /* PB15 */		\ +		(1 << 16) | /* PB8 */		\ +		(1 << 17) | /* PA15 */		\ +		(1 << 18) | /* PC0 */		\ +		(1 << 19) | /* PC1 */		\ +		(1 << 20) | /* PC2 */		\ +		(1 << 21) | /* PC3 */		\ +		(0 << 22) | /* PC4 */		\ +		(0 << 23) | /* PC5 */		\ +		(1 << 24) | /* PC6 */		\ +		(1 << 25) | /* PC7 */		\ +		(1 << 26) | /* PC8 */		\ +		(1 << 27) | /* PC9 */		\ +		(1 << 28) | /* PC10 or PD8 */	\ +		(1 << 29) | /* PC11 or PD9 */	\ +		(0 << 30) | /* PC12 or PD10 */	\ +		(0 << 31))  /* PD2 or PD11 */ + +#define AO_LCD_STM_SEG_ENABLED_1 (		\ +		(0 << 0) | /* PD12 */		\ +		(0 << 1) | /* PD13 */		\ +		(0 << 2) | /* PD14 */		\ +		(0 << 3) | /* PD15 */		\ +		(0 << 4) | /* PE0 */		\ +		(0 << 5) | /* PE1 */		\ +		(0 << 6) | /* PE2 */		\ +		(0 << 7))  /* PE3 */ + +#define AO_LCD_STM_COM_ENABLED (		\ +		(1 << 0) | /* PA8 */		\ +		(1 << 1) | /* PA9 */		\ +		(1 << 2) | /* PA10 */		\ +		(1 << 3) | /* PB9 */		\ +		(0 << 4) | /* PC10 */		\ +		(0 << 5) | /* PC11 */		\ +		(0 << 6)) /* PC12 */ + +#define AO_LCD_28_ON_C	1 + +#define AO_LCD_DUTY	STM_LCD_CR_DUTY_STATIC + +#define HAS_ADC			1 + +#define AO_ADC_RING		32 + +struct ao_adc { +	uint16_t		tick; +	int16_t			idd; +	int16_t			temp; +	int16_t			vref; +}; + +#define AO_ADC_IDD		4 +#define AO_ADC_PIN0_PORT	(&stm_gpioa) +#define AO_ADC_PIN0_PIN		4 + +#define AO_ADC_RCC_AHBENR	((1 << STM_RCC_AHBENR_GPIOAEN)) +#define AO_ADC_TEMP		16 +#define AO_ADC_VREF		17 + +#define HAS_ADC_TEMP		1 + +#define AO_DATA_RING		32 +#define AO_NUM_ADC		3 + +#define AO_ADC_SQ1		AO_ADC_IDD +#define AO_ADC_SQ2		AO_ADC_TEMP +#define AO_ADC_SQ3		AO_ADC_VREF +	 +#define HAS_I2C_1		1 +#define I2C_1_PB6_PB7		0 +#define I2C_1_PB8_PB9		1 + +#define HAS_I2C_2		0 +#define I2C_2_PB10_PB11		0 + +#define AO_EVENT		1 + +#define AO_QUADRATURE_COUNT	2 +#define AO_QUADRATURE_MODE	AO_EXTI_MODE_PULL_UP + +#define AO_QUADRATURE_0_PORT	&stm_gpioc +#define AO_QUADRATURE_0_A	1 +#define AO_QUADRATURE_0_B	0 + +#define AO_QUADRATURE_1_PORT	&stm_gpioc +#define AO_QUADRATURE_1_A	3 +#define AO_QUADRATURE_1_B	2 + +#define AO_BUTTON_COUNT		2 +#define AO_BUTTON_MODE		AO_EXTI_MODE_PULL_UP + +#define AO_BUTTON_0_PORT	&stm_gpioc +#define AO_BUTTON_0		6 + +#define AO_BUTTON_1_PORT	&stm_gpioc +#define AO_BUTTON_1		7 + +#define AO_TICK_TYPE		uint32_t +#define AO_TICK_SIGNED		int32_t + +#define AO_PS2_CLOCK_PORT	(&stm_gpioc) +#define AO_PS2_CLOCK_BIT	0 + +#define AO_PS2_DATA_PORT	(&stm_gpioc) +#define AO_PS2_DATA_BIT		1 + +#endif /* _AO_PINS_H_ */ | 
