diff options
| -rw-r--r-- | src/drivers/ao_lco_cmd.c | 113 | ||||
| -rw-r--r-- | src/drivers/ao_lco_func.c | 70 | ||||
| -rw-r--r-- | src/drivers/ao_lco_func.h | 32 | ||||
| -rw-r--r-- | src/telelco-v0.1/Makefile | 97 | ||||
| -rw-r--r-- | src/telelco-v0.1/ao_lco.c | 231 | ||||
| -rw-r--r-- | src/telelco-v0.1/ao_lco.h | 24 | ||||
| -rw-r--r-- | src/telelco-v0.1/ao_pins.h | 224 | ||||
| -rw-r--r-- | src/telelco-v0.1/ao_telelco.c | 69 | 
8 files changed, 799 insertions, 61 deletions
diff --git a/src/drivers/ao_lco_cmd.c b/src/drivers/ao_lco_cmd.c index b49c9dba..9c35b324 100644 --- a/src/drivers/ao_lco_cmd.c +++ b/src/drivers/ao_lco_cmd.c @@ -18,70 +18,81 @@  #include <ao.h>  #include <ao_pad.h>  #include <ao_lco_cmd.h> +#include <ao_lco_func.h>  #include <ao_radio_cmac.h> -static __xdata struct ao_pad_command	command; -static __xdata struct ao_pad_query	query; -static __pdata uint16_t	launch_box; -static __pdata uint8_t	launch_channels; +static __pdata uint16_t	lco_box; +static __pdata uint8_t	lco_channels;  static __pdata uint16_t	tick_offset;  static void -launch_args(void) __reentrant +lco_args(void) __reentrant  {  	ao_cmd_decimal(); -	launch_box = ao_cmd_lex_i; +	lco_box = ao_cmd_lex_i;  	ao_cmd_hex(); -	launch_channels = ao_cmd_lex_i; +	lco_channels = ao_cmd_lex_i;  } +static struct ao_pad_query	ao_pad_query; +static uint16_t			tick_offset; +  static int8_t -launch_query(void) +lco_query(void)  {  	uint8_t	i;  	int8_t	r = AO_RADIO_CMAC_OK; -	tick_offset = ao_time();  	for (i = 0; i < 10; i++) {  		printf ("."); flush(); -		command.tick = ao_time(); -		command.box = launch_box; -		command.cmd = AO_LAUNCH_QUERY; -		command.channels = launch_channels; -		ao_radio_cmac_send(&command, sizeof (command)); -		r = ao_radio_cmac_recv(&query, sizeof (query), AO_MS_TO_TICKS(500)); +		r = ao_lco_query(lco_box, &ao_pad_query, &tick_offset);  		if (r == AO_RADIO_CMAC_OK)  			break;  	} -	tick_offset -= query.tick;  	printf("\n"); flush();  	return r;  }  static void -launch_report_cmd(void) __reentrant +lco_arm(void) +{ +	ao_lco_arm(lco_box, lco_channels, tick_offset); +} + +static void +lco_ignite(void) +{ +	ao_lco_ignite(lco_box, lco_channels, tick_offset); +} + +static void +lco_report_cmd(void) __reentrant  {  	int8_t		r;  	uint8_t		c; -	launch_args(); +	lco_args();  	if (ao_cmd_status != ao_cmd_success)  		return; -	r = launch_query(); +	r = lco_query();  	switch (r) {  	case AO_RADIO_CMAC_OK: -		switch (query.arm_status) { -		case ao_igniter_ready: -		case ao_igniter_active: +		switch (ao_pad_query.arm_status) { +		case AO_PAD_ARM_STATUS_ARMED:  			printf ("Armed: ");  			break; -		default: +		case AO_PAD_ARM_STATUS_DISARMED:  			printf("Disarmed: "); +			break; +		case AO_PAD_ARM_STATUS_UNKNOWN: +		default: +			printf("Unknown: "); +			break;  		}  		for (c = 0; c < AO_PAD_MAX_CHANNELS; c++) { -			if (query.channels & (1 << c)) { +			if (ao_pad_query.channels & (1 << c)) {  				printf (" pad %d ", c); -				switch (query.igniter_status[c]) { +				switch (ao_pad_query.igniter_status[c]) {  				default:  					printf("unknown, ");  					break; @@ -106,39 +117,19 @@ launch_report_cmd(void) __reentrant  }  static void -launch_arm(void) __reentrant -{ -	command.tick = ao_time() - tick_offset; -	command.box = launch_box; -	command.cmd = AO_LAUNCH_ARM; -	command.channels = launch_channels; -	ao_radio_cmac_send(&command, sizeof (command)); -} - -static void -launch_ignite(void) __reentrant -{ -	command.tick = ao_time() - tick_offset; -	command.box = launch_box; -	command.cmd = AO_LAUNCH_FIRE; -	command.channels = 0; -	ao_radio_cmac_send(&command, sizeof (command)); -} - -static void -launch_fire_cmd(void) __reentrant +lco_fire_cmd(void) __reentrant  {  	static __xdata struct ao_pad_command	command;  	uint8_t		secs;  	uint8_t		i;  	int8_t		r; -	launch_args(); +	lco_args();  	ao_cmd_decimal();  	secs = ao_cmd_lex_i;  	if (ao_cmd_status != ao_cmd_success)  		return; -	r = launch_query(); +	r = lco_query();  	if (r != AO_RADIO_CMAC_OK) {  		printf("query failed %d\n", r);  		return; @@ -146,7 +137,7 @@ launch_fire_cmd(void) __reentrant  	for (i = 0; i < 4; i++) {  		printf("arm %d\n", i); flush(); -		launch_arm(); +		lco_arm();  	}  	secs = secs * 10 - 5; @@ -154,40 +145,40 @@ launch_fire_cmd(void) __reentrant  		secs = 100;  	for (i = 0; i < secs; i++) {  		printf("fire %d\n", i); flush(); -		launch_ignite(); +		lco_ignite();  		ao_delay(AO_MS_TO_TICKS(100));  	}  }  static void -launch_arm_cmd(void) __reentrant +lco_arm_cmd(void) __reentrant  {  	uint8_t	i;  	int8_t  r; -	launch_args(); -	r = launch_query(); +	lco_args(); +	r = lco_query();  	if (r != AO_RADIO_CMAC_OK) {  		printf("query failed %d\n", r);  		return;  	}  	for (i = 0; i < 4; i++) -		launch_arm(); +		lco_arm();  }  static void -launch_ignite_cmd(void) __reentrant +lco_ignite_cmd(void) __reentrant  {  	uint8_t i; -	launch_args(); +	lco_args();  	for (i = 0; i < 4; i++) -		launch_ignite(); +		lco_ignite();  }  static __code struct ao_cmds ao_lco_cmds[] = { -	{ launch_report_cmd,    "l <box> <channel>\0Get remote launch status" }, -	{ launch_fire_cmd,	"F <box> <channel> <secs>\0Fire remote igniter" }, -	{ launch_arm_cmd,	"a <box> <channel>\0Arm remote igniter" }, -	{ launch_ignite_cmd,	"i <box> <channel>\0Pulse remote igniter" }, +	{ lco_report_cmd,	"l <box> <channel>\0Get remote status" }, +	{ lco_fire_cmd,		"F <box> <channel> <secs>\0Fire remote igniters" }, +	{ lco_arm_cmd,		"a <box> <channel>\0Arm remote igniter" }, +	{ lco_ignite_cmd,	"i <box> <channel>\0Pulse remote igniter" },  	{ 0, NULL },  }; diff --git a/src/drivers/ao_lco_func.c b/src/drivers/ao_lco_func.c new file mode 100644 index 00000000..152b5d1b --- /dev/null +++ b/src/drivers/ao_lco_func.c @@ -0,0 +1,70 @@ +/* + * 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; 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. + */ + +#include <ao.h> +#include <ao_pad.h> +#include <ao_radio_cmac.h> +#include <ao_lco_func.h> + +static __xdata struct ao_pad_command	command; +static __xdata uint8_t			ao_lco_mutex; + +int8_t +ao_lco_query(uint16_t box, struct ao_pad_query *query, uint16_t *tick_offset) +{ +	uint8_t		i; +	int8_t		r; +	uint16_t	time; + +	ao_mutex_get(&ao_lco_mutex); +	time = ao_time(); +	command.tick = time; +	command.box = box; +	command.cmd = AO_LAUNCH_QUERY; +	command.channels = 0; +	ao_radio_cmac_send(&command, sizeof (command)); +	r = ao_radio_cmac_recv(query, sizeof (*query), AO_MS_TO_TICKS(500)); +	if (r == AO_RADIO_CMAC_OK) +		*tick_offset = time - query->tick; +	ao_mutex_put(&ao_lco_mutex); +	return r; +} + +void +ao_lco_arm(uint16_t box, uint8_t channels, uint16_t tick_offset) +{ +	ao_mutex_get(&ao_lco_mutex); +	command.tick = ao_time() - tick_offset; +	command.box = box; +	command.cmd = AO_LAUNCH_ARM; +	command.channels = channels; +	ao_radio_cmac_send(&command, sizeof (command)); +	ao_mutex_put(&ao_lco_mutex); +} + +void +ao_lco_ignite(uint16_t box, uint8_t channels, uint16_t tick_offset) +{ +	ao_mutex_get(&ao_lco_mutex); +	command.tick = ao_time() - tick_offset; +	command.box = box; +	command.cmd = AO_LAUNCH_FIRE; +	command.channels = channels; +	ao_radio_cmac_send(&command, sizeof (command)); +	ao_mutex_put(&ao_lco_mutex); +} + diff --git a/src/drivers/ao_lco_func.h b/src/drivers/ao_lco_func.h new file mode 100644 index 00000000..dccf602a --- /dev/null +++ b/src/drivers/ao_lco_func.h @@ -0,0 +1,32 @@ +/* + * 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; 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_LCO_FUNC_H_ +#define _AO_LCO_FUNC_H_ + +#include <ao_pad.h> + +int8_t +ao_lco_query(uint16_t box, struct ao_pad_query *query, uint16_t *tick_offset); + +void +ao_lco_arm(uint16_t box, uint8_t channels, uint16_t tick_offset); + +void +ao_lco_ignite(uint16_t box, uint8_t channels, uint16_t tick_offset); + +#endif /* _AO_LCO_FUNC_H_ */ diff --git a/src/telelco-v0.1/Makefile b/src/telelco-v0.1/Makefile new file mode 100644 index 00000000..32115c42 --- /dev/null +++ b/src/telelco-v0.1/Makefile @@ -0,0 +1,97 @@ +# +# AltOS build for TeleLCO +# +# + +include ../stm/Makefile.defs + +INC = \ +	ao.h \ +	ao_arch.h \ +	ao_arch_funcs.h \ +	ao_companion.h \ +	ao_data.h \ +	ao_sample.h \ +	ao_pins.h \ +	ao_product.h \ +	ao_cc_spi.h \ +	ao_seven_segment.h \ +	ao_lco.h \ +	ao_lco_cmd.h \ +	ao_lco_func.h \ +	ao_radio_spi.h \ +	ao_radio_cmac.h \ +	stm32l.h + +# +# Common AltOS sources +# + +#PROFILE=ao_profile.c +#PROFILE_DEF=-DAO_PROFILE=1 + +ALTOS_SRC = \ +	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_freq.c \ +	ao_dma_stm.c \ +	ao_spi_stm.c \ +	ao_beep_stm.c \ +	ao_storage.c \ +	ao_eeprom_stm.c \ +	ao_lcd_stm.c \ +	ao_usb_stm.c \ +	ao_exti_stm.c \ +	ao_radio_master.c \ +	ao_seven_segment.c \ +	ao_quadrature.c \ +	ao_button.c \ +	ao_event.c \ +	ao_lco.c \ +	ao_lco_cmd.c \ +	ao_lco_func.c \ +	ao_radio_cmac_cmd.c + +PRODUCT=TeleLCO-v0.1 +PRODUCT_DEF=-DMEGAMETRUM +IDPRODUCT=0x0023 + +CFLAGS = $(PRODUCT_DEF) $(STM_CFLAGS) $(PROFILE_DEF) -Os -g + +PROGNAME=telelco-v0.1 +PROG=$(PROGNAME)-$(VERSION).elf + +SRC=$(ALTOS_SRC) ao_telelco.c +OBJ=$(SRC:.c=.o) + +all: $(PROG) + +$(PROG): Makefile $(OBJ) altos.ld +	$(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(OBJ) $(SAT_CLIB) -lgcc + +../altitude.h: make-altitude +	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 +	rm -f ao_product.h + +install: + +uninstall: diff --git a/src/telelco-v0.1/ao_lco.c b/src/telelco-v0.1/ao_lco.c new file mode 100644 index 00000000..7ecee192 --- /dev/null +++ b/src/telelco-v0.1/ao_lco.c @@ -0,0 +1,231 @@ +/* + * 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; 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. + */ + +#include <ao.h> +#include <ao_lco.h> +#include <ao_event.h> +#include <ao_seven_segment.h> +#include <ao_quadrature.h> +#include <ao_lco_func.h> +#include <ao_radio_cmac.h> + +#if 1 +#define PRINTD(...) do { printf ("\r%5u %s: ", ao_tick_count, __func__); printf(__VA_ARGS__); flush(); } while(0) +#else +#define PRINTD(...)  +#endif + +#define AO_LCO_PAD_DIGIT	0 +#define AO_LCO_BOX_DIGIT_1	1 +#define AO_LCO_BOX_DIGIT_10	2 + +#define AO_NUM_BOX		10 + +static uint8_t	ao_lco_mutex; +static uint8_t	ao_lco_pad; +static uint8_t	ao_lco_box; +static uint8_t	ao_lco_armed; +static uint8_t	ao_lco_firing; +static uint8_t	ao_lco_valid; + +static void +ao_lco_set_pad(void) +{ +	ao_seven_segment_set(AO_LCO_PAD_DIGIT, ao_lco_pad); +} + +static void +ao_lco_set_box(void) +{ +	ao_seven_segment_set(AO_LCO_BOX_DIGIT_1, ao_lco_box % 10); +	ao_seven_segment_set(AO_LCO_BOX_DIGIT_10, ao_lco_box / 10); +} + +static void +ao_lco_input(void) +{ +	static struct ao_event	event; + +	ao_lco_set_pad(); +	ao_lco_set_box(); +	for (;;) { +		ao_event_get(&event); +		PRINTD("event type %d unit %d value %d\n", +		       event.type, event.unit, event.value); +		switch (event.type) { +		case AO_EVENT_QUADRATURE: +			switch (event.unit) { +			case AO_QUADRATURE_PAD: +				if (!ao_lco_armed) { +					ao_lco_pad = event.value & 3; +					ao_lco_valid = 0; +					ao_quadrature_count[AO_QUADRATURE_PAD] = ao_lco_pad; +					ao_lco_set_pad(); +				} +				break; +			case AO_QUADRATURE_BOX: +				if (!ao_lco_armed) { +					ao_lco_box = event.value; +					ao_lco_valid = 0; +					while (ao_lco_box >= AO_NUM_BOX) +						ao_lco_box -= AO_NUM_BOX; +					while (ao_lco_box < 0) +						ao_lco_box += AO_NUM_BOX; +					ao_quadrature_count[AO_QUADRATURE_PAD] = ao_lco_box; +					ao_lco_set_box(); +				} +				break; +			} +			break; +		case AO_EVENT_BUTTON: +			switch (event.unit) { +			case AO_BUTTON_ARM: +				ao_lco_armed = event.value; +				PRINTD("Armed %d\n", ao_lco_armed); +				ao_wakeup(&ao_lco_armed); +				break; +			case AO_BUTTON_FIRE: +				if (ao_lco_armed) { +					ao_lco_firing = event.value; +					PRINTD("Firing %d\n", ao_lco_firing); +					ao_wakeup(&ao_lco_armed); +				} +				break; +			} +			break; +		} +	} +} + +static AO_LED_TYPE	continuity_led[AO_LED_CONTINUITY_NUM] = { +#ifdef AO_LED_CONTINUITY_0 +	AO_LED_CONTINUITY_0, +#endif +#ifdef AO_LED_CONTINUITY_1 +	AO_LED_CONTINUITY_1, +#endif +#ifdef AO_LED_CONTINUITY_2 +	AO_LED_CONTINUITY_2, +#endif +#ifdef AO_LED_CONTINUITY_3 +	AO_LED_CONTINUITY_3, +#endif +#ifdef AO_LED_CONTINUITY_4 +	AO_LED_CONTINUITY_4, +#endif +#ifdef AO_LED_CONTINUITY_5 +	AO_LED_CONTINUITY_5, +#endif +#ifdef AO_LED_CONTINUITY_6 +	AO_LED_CONTINUITY_6, +#endif +#ifdef AO_LED_CONTINUITY_7 +	AO_LED_CONTINUITY_7, +#endif +}; + +static uint16_t	ao_lco_tick_offset; + +static void +ao_lco_update(void) +{ +	int8_t			r; +	uint8_t			c; +	struct ao_pad_query	query; + +	r = ao_lco_query(ao_lco_box, &query, &ao_lco_tick_offset); +	if (r != AO_RADIO_CMAC_OK) { +		PRINTD("lco_query return %d\n", r); +		return; +	} + +#if 0 +	PRINTD("lco_query success arm_status %d i0 %d i1 %d i2 %d i3 %d\n", +	       query.arm_status, +	       query.igniter_status[0], +	       query.igniter_status[1], +	       query.igniter_status[2], +	       query.igniter_status[3]); +#endif + +	ao_lco_valid = 1; +	if (query.arm_status) +		ao_led_on(AO_LED_REMOTE_ARM); +	else +		ao_led_off(AO_LED_REMOTE_ARM); +	for (c = 0; c < AO_LED_CONTINUITY_NUM; c++) { +		uint8_t	status; + +		if (query.channels & (1 << c)) +			status = query.igniter_status[c]; +		else +			status = AO_PAD_IGNITER_STATUS_NO_IGNITER_RELAY_OPEN; +		if (status == AO_PAD_IGNITER_STATUS_GOOD_IGNITER_RELAY_OPEN) +			ao_led_on(continuity_led[c]); +		else +			ao_led_off(continuity_led[c]); +	} +} + +static void +ao_lco_monitor(void) +{ +	uint16_t		delay; + +	for (;;) { +		if (ao_lco_armed && ao_lco_firing) { +			PRINTD("Firing box %d pad %d: valid %d\n", +			       ao_lco_box, ao_lco_pad, ao_lco_valid); +			if (!ao_lco_valid) +				ao_lco_update(); +			if (ao_lco_valid) +				ao_lco_ignite(ao_lco_box, ao_lco_pad, ao_lco_tick_offset); +		} else { +			ao_lco_update(); +		} +		if (ao_lco_armed && ao_lco_firing) +			delay = AO_MS_TO_TICKS(100); +		else +			delay = AO_SEC_TO_TICKS(1); +		ao_alarm(delay); +		ao_sleep(&ao_lco_armed); +		ao_clear_alarm(); +	} +} + +static void +ao_lco_arm_warn(void) +{ +	for (;;) { +		while (!ao_lco_armed) +			ao_sleep(&ao_lco_armed); +		ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(200)); +		ao_delay(AO_MS_TO_TICKS(200)); +	} +} + +static struct ao_task ao_lco_input_task; +static struct ao_task ao_lco_monitor_task; +static struct ao_task ao_lco_arm_warn_task; + +void +ao_lco_init(void) +{ +	ao_add_task(&ao_lco_input_task, ao_lco_input, "lco input"); +	ao_add_task(&ao_lco_monitor_task, ao_lco_monitor, "lco monitor"); +	ao_add_task(&ao_lco_arm_warn_task, ao_lco_arm_warn, "lco arm warn"); +} diff --git a/src/telelco-v0.1/ao_lco.h b/src/telelco-v0.1/ao_lco.h new file mode 100644 index 00000000..253f9702 --- /dev/null +++ b/src/telelco-v0.1/ao_lco.h @@ -0,0 +1,24 @@ +/* + * 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; 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_LCO_H_ +#define _AO_LCO_H_ + +void +ao_lco_init(void); + +#endif /* _AO_LCO_H_ */ diff --git a/src/telelco-v0.1/ao_pins.h b/src/telelco-v0.1/ao_pins.h new file mode 100644 index 00000000..60cf018f --- /dev/null +++ b/src/telelco-v0.1/ao_pins.h @@ -0,0 +1,224 @@ +/* + * 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; 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_PINS_H_ +#define _AO_PINS_H_ + +/* 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_EEPROM		1 +#define USE_INTERNAL_FLASH	1 +#define HAS_USB			1 +#define HAS_BEEP		1 +#define HAS_RADIO		1 +#define HAS_TELEMETRY		0 +#define HAS_AES			1 + +#define HAS_SPI_1		1 +#define SPI_1_PA5_PA6_PA7	1 +#define SPI_1_PB3_PB4_PB5	0 +#define SPI_1_PE13_PE14_PE15	0 + +#define HAS_SPI_2		1 +#define SPI_2_PB13_PB14_PB15	1 +#define SPI_2_PD1_PD3_PD4	0 +#define SPI_2_GPIO		(&stm_gpiob) +#define SPI_2_SCK		13 +#define SPI_2_MISO		14 +#define SPI_2_MOSI		15 + +#define HAS_I2C_1		0 + +#define HAS_I2C_2		0 + +#define PACKET_HAS_SLAVE	0 +#define PACKET_HAS_MASTER	0 + +/* + * Radio is a cc1111 connected via SPI + */ +#define AO_RADIO_CAL_DEFAULT	1186611 + +#define AO_RADIO_SPI_BUS	AO_SPI_2_PB13_PB14_PB15 +#define AO_RADIO_CS_PORT	(&stm_gpiob) +#define AO_RADIO_CS_PIN		12 + +#define AO_RADIO_INT_PORT	(&stm_gpioc) +#define AO_RADIO_INT_PIN	14 + +#define LOW_LEVEL_DEBUG		0 + +#define LED_PORT_ENABLE		STM_RCC_AHBENR_GPIOCEN +#define LED_PORT		(&stm_gpioc) +#define LED_PIN_RED		7 +#define LED_PIN_GREEN		8 +#define LED_PIN_CONTINUITY_3	9 +#define LED_PIN_CONTINUITY_2	10 +#define LED_PIN_CONTINUITY_1	11 +#define LED_PIN_CONTINUITY_0	12 +#define LED_PIN_REMOTE_ARM	13 +#define AO_LED_RED		(1 << LED_PIN_RED) +#define AO_LED_GREEN		(1 << LED_PIN_GREEN) +#define AO_LED_CONTINUITY_3	(1 << LED_PIN_CONTINUITY_3) +#define AO_LED_CONTINUITY_2	(1 << LED_PIN_CONTINUITY_2) +#define AO_LED_CONTINUITY_1	(1 << LED_PIN_CONTINUITY_1) +#define AO_LED_CONTINUITY_0	(1 << LED_PIN_CONTINUITY_0) + +#define AO_LED_CONTINUITY_NUM	4 + +#define AO_LED_REMOTE_ARM	(1 << LED_PIN_REMOTE_ARM) + +#define LEDS_AVAILABLE		(AO_LED_RED |		\ +				 AO_LED_GREEN |		\ +				 AO_LED_CONTINUITY_3 |	\ +				 AO_LED_CONTINUITY_2 |	\ +				 AO_LED_CONTINUITY_1 |	\ +				 AO_LED_CONTINUITY_0 |	\ +				 AO_LED_REMOTE_ARM) + +/* LCD displays */ + +#define AO_LCD_STM_SEG_ENABLED_0 (		\ +		(1 << 0) | /* PA1 */		\ +		(1 << 1) | /* PA2 */		\ +		(1 << 2) | /* PA3 */		\ +		(1 << 3) | /* PA6 */		\ +		(1 << 4) | /* PA7 */		\ +		(1 << 5) | /* PB0 */		\ +		(1 << 6) | /* PB1 */		\ +		(1 << 7) | /* PB3 */		\ +		(0 << 8) | /* PB4 */		\ +		(0 << 9) | /* PB5 */		\ +		(0 << 10) | /* PB10 */		\ +		(0 << 11) | /* PB11 */		\ +		(0 << 12) | /* PB12 */		\ +		(0 << 13) | /* PB13 */		\ +		(0 << 14) | /* PB14 */		\ +		(0 << 15) | /* PB15 */		\ +		(0 << 16) | /* PB8 */		\ +		(0 << 17) | /* PA15 */		\ +		(0 << 18) | /* PC0 */		\ +		(0 << 19) | /* PC1 */		\ +		(0 << 20) | /* PC2 */		\ +		(0 << 21) | /* PC3 */		\ +		(0 << 22) | /* PC4 */		\ +		(0 << 23) | /* PC5 */		\ +		(0 << 24) | /* PC6 */		\ +		(0 << 25) | /* PC7 */		\ +		(0 << 26) | /* PC8 */		\ +		(0 << 27) | /* PC9 */		\ +		(0 << 28) | /* PC10 or PD8 */	\ +		(0 << 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 */		\ +		(0 << 3) | /* PB9 */		\ +		(0 << 4) | /* PC10 */		\ +		(0 << 5) | /* PC11 */		\ +		(0 << 6)) /* PC12 */ + +#define AO_LCD_28_ON_C	0 + +#define AO_LCD_DUTY	STM_LCD_CR_DUTY_1_4 + +#define AO_SEGMENT_0		0 +#define AO_SEGMENT_1		5 +#define AO_SEGMENT_2		1 +#define AO_SEGMENT_3		6 +#define AO_SEGMENT_4		4 +#define AO_SEGMENT_5		2 +#define AO_SEGMENT_6		3 +#define AO_SEGMENT_7		7 + +/* + * Use event queue for input devices + */ + +#define AO_EVENT		1 + +/* + * Knobs + */ + +#define AO_QUADRATURE_COUNT	2 +#define AO_QUADRATURE_MODE	0 + +#define AO_QUADRATURE_0_PORT	&stm_gpioc +#define AO_QUADRATURE_0_A	3 +#define AO_QUADRATURE_0_B	2 + +#define AO_QUADRATURE_PAD	0 + +#define AO_QUADRATURE_1_PORT	&stm_gpioc +#define AO_QUADRATURE_1_A	1 +#define AO_QUADRATURE_1_B	0 + +#define AO_QUADRATURE_BOX	1 + +/* + * Buttons + */ + +#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		4 + +#define AO_BUTTON_ARM		0 + +#define AO_BUTTON_1_PORT	&stm_gpioc +#define AO_BUTTON_1		5 + +#define AO_BUTTON_FIRE		1 + +#endif /* _AO_PINS_H_ */ diff --git a/src/telelco-v0.1/ao_telelco.c b/src/telelco-v0.1/ao_telelco.c new file mode 100644 index 00000000..080a140b --- /dev/null +++ b/src/telelco-v0.1/ao_telelco.c @@ -0,0 +1,69 @@ +/* + * 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; 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. + */ + +#include <ao.h> +#include <ao_exti.h> +#include <ao_packet.h> +#include <ao_companion.h> +#include <ao_profile.h> +#include <ao_pyro.h> +#include <ao_aes.h> +#include <ao_seven_segment.h> +#include <ao_quadrature.h> +#include <ao_button.h> +#include <ao_lco.h> +#include <ao_lco_cmd.h> +#include <ao_radio_cmac_cmd.h> + +int +main(void) +{ +	ao_clock_init(); +	 +	ao_led_init(LEDS_AVAILABLE); +	ao_led_on(AO_LED_GREEN); +	ao_timer_init(); + +	ao_spi_init(); +	ao_dma_init(); +	ao_exti_init(); + +	ao_beep_init(); +	ao_cmd_init(); + +	ao_lcd_stm_init(); +	ao_seven_segment_init(); +	ao_quadrature_init(); +	ao_button_init(); + +	ao_storage_init(); +	 +	ao_radio_init(); + +	ao_usb_init(); + +	ao_config_init(); +	 +	ao_quadrature_init(); +	ao_button_init(); +	ao_lco_init(); +	ao_lco_cmd_init(); +//	ao_radio_cmac_cmd_init(); +	 +	ao_start_scheduler(); +	return 0; +}  | 
