diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/ao_gps_report_mega.c | 2 | ||||
| -rw-r--r-- | src/drivers/ao_aprs.c | 69 | ||||
| -rw-r--r-- | src/drivers/ao_bufio.c | 2 | ||||
| -rw-r--r-- | src/drivers/ao_fat.c | 23 | ||||
| -rw-r--r-- | src/drivers/ao_gps_ublox.c | 14 | ||||
| -rw-r--r-- | src/drivers/ao_sdcard.c | 20 | ||||
| -rw-r--r-- | src/drivers/ao_watchdog.c | 62 | ||||
| -rw-r--r-- | src/drivers/ao_watchdog.h | 24 | ||||
| -rw-r--r-- | src/product/ao_flash_pins.h | 2 | ||||
| -rw-r--r-- | src/stm/ao_adc_stm.c | 133 | ||||
| -rw-r--r-- | src/stm/ao_flash_loader_stm.c | 7 | ||||
| -rw-r--r-- | src/stm/ao_flash_stm.c | 5 | ||||
| -rw-r--r-- | src/stm/ao_timer.c | 3 | ||||
| -rw-r--r-- | src/telegps-v0.1/Makefile | 6 | 
14 files changed, 320 insertions, 52 deletions
| diff --git a/src/core/ao_gps_report_mega.c b/src/core/ao_gps_report_mega.c index 07a2bc5b..5e3c71bf 100644 --- a/src/core/ao_gps_report_mega.c +++ b/src/core/ao_gps_report_mega.c @@ -70,6 +70,8 @@ ao_gps_report_mega(void)  				{  					gps_log.u.gps_sat.sats[i].c_n = gps_tracking_data.sats[c].c_n_1;  					i++; +					if (i >= 12) +						break;  				}  			gps_log.u.gps_sat.channels = i;  			ao_log_mega(&gps_log); diff --git a/src/drivers/ao_aprs.c b/src/drivers/ao_aprs.c index 56d98437..0a6c72ce 100644 --- a/src/drivers/ao_aprs.c +++ b/src/drivers/ao_aprs.c @@ -488,9 +488,29 @@ static void tncCompressInt(uint8_t *dest, int32_t value, int len) {  	}  } -#if HAS_ADC +static int ao_num_sats(void) +{ +    int i; +    int n = 0; + +    for (i = 0; i < ao_gps_tracking_data.channels; i++) { +	if (ao_gps_tracking_data.sats[i].svid) +	    n++; +    } +    return n; +} + +static char ao_gps_locked(void) +{ +    if (ao_gps_data.flags & AO_GPS_VALID) +	return 'L'; +    else +	return 'U'; +} +  static int tncComment(uint8_t *buf)  { +#if HAS_ADC  	struct ao_data packet;  	ao_arch_critical(ao_data_get(&packet);); @@ -500,61 +520,70 @@ static int tncComment(uint8_t *buf)  	int16_t main = ao_ignite_decivolt(AO_SENSE_MAIN(&packet));  	return sprintf((char *) buf, -		       "B:%d.%d A:%d.%d M:%d.%d", +		       "%c%d B%d.%d A%d.%d M%d.%d", +		       ao_gps_locked(), +		       ao_num_sats(),  		       battery/10,  		       battery % 10,  		       apogee/10,  		       apogee%10,  		       main/10,  		       main%10); -} +#else +	return sprintf((char *) buf, +		       "%c%d", +		       ao_gps_locked(), +		       ao_num_sats());  #endif +}  /**   *   Generate the plain text position packet.   */  static int tncPositionPacket(void)  { -    int32_t	latitude = ao_gps_data.latitude; -    int32_t	longitude = ao_gps_data.longitude; -    int32_t	altitude = ao_gps_data.altitude; +    static int32_t	latitude; +    static int32_t	longitude; +    static int32_t	altitude; +    int32_t		lat, lon, alt;      uint8_t	*buf; -    if (altitude < 0) -	altitude = 0; -    altitude = (altitude * (int32_t) 10000 + (3048/2)) / (int32_t) 3048; -     +    if (ao_gps_data.flags & AO_GPS_VALID) { +	latitude = ao_gps_data.latitude; +	longitude = ao_gps_data.longitude; +	altitude = ao_gps_data.altitude; +	if (altitude < 0) +	    altitude = 0; +    } +      buf = tncBuffer;      *buf++ = '!';      /* Symbol table ID */      *buf++ = '/'; -    latitude = ((uint64_t) 380926 * (900000000 - latitude)) / 10000000; -    longitude = ((uint64_t) 190463 * (1800000000 + longitude)) / 10000000; +    lat = ((uint64_t) 380926 * (900000000 - latitude)) / 10000000; +    lon = ((uint64_t) 190463 * (1800000000 + longitude)) / 10000000;  #define ALTITUDE_LOG_BASE	0.001998002662673f	/* log(1.002) */ -    altitude = logf((float) altitude) * (1/ALTITUDE_LOG_BASE); +    alt = (altitude * (int32_t) 10000 + (3048/2)) / (int32_t) 3048; +    alt = logf((float) altitude) * (1/ALTITUDE_LOG_BASE); -    tncCompressInt(buf, latitude, 4); +    tncCompressInt(buf, lat, 4);      buf += 4; -    tncCompressInt(buf, longitude, 4); +    tncCompressInt(buf, lon, 4);      buf += 4;      /* Symbol code */      *buf++ = '\''; -    tncCompressInt(buf, altitude, 2); +    tncCompressInt(buf, alt, 2);      buf += 2;      *buf++ = 33 + ((1 << 5) | (2 << 3)); -#if HAS_ADC      buf += tncComment(buf); -#else -    *buf = '\0'; -#endif      return buf - tncBuffer;  } diff --git a/src/drivers/ao_bufio.c b/src/drivers/ao_bufio.c index c0fe604a..70e30b67 100644 --- a/src/drivers/ao_bufio.c +++ b/src/drivers/ao_bufio.c @@ -45,7 +45,7 @@ static uint8_t		ao_bufio_mutex;  #if 0  #define DBG(...) printf(__VA_ARGS__)  #else -#define DBG(...) +#define DBG(...) (void) 0  #endif  static inline void diff --git a/src/drivers/ao_fat.c b/src/drivers/ao_fat.c index 1a1b8eb0..cbcd42bc 100644 --- a/src/drivers/ao_fat.c +++ b/src/drivers/ao_fat.c @@ -187,7 +187,7 @@ _ao_fat_entry_replace(cluster_t  cluster, cluster_t new_value)  	sector_t		sector;  	cluster_offset_t	offset;  	uint8_t			*buf; -	cluster_t		ret; +	cluster_t		ret = 0;  	cluster_t		old_value;  	uint8_t			fat; @@ -747,7 +747,7 @@ _ao_fat_current_sector(struct ao_file *file)  	DBG("current sector offset %d size %d\n",  	    file->offset, file->dirent->size); -	if (file->offset > file->dirent->size) { +	if (file->offset > (offset_t) file->dirent->size) {  		printf ("file offset %d larger than size %d\n",  			file->offset, file->dirent->size);  		return 0xffffffff; @@ -761,7 +761,7 @@ _ao_fat_current_sector(struct ao_file *file)  		DBG("\treset to start of file %08x\n", file->cluster);  	} -	if (file->cluster_offset + bytes_per_cluster <= file->offset) { +	if ((offset_t) (file->cluster_offset + bytes_per_cluster) <= file->offset) {  		cluster_t	cluster_distance;  		cluster_offset = sector_offset / sectors_per_cluster; @@ -804,7 +804,7 @@ _ao_fat_invalidate_cluster_offset(struct ao_fat_dirent *dirent)  		if (!file->busy)  			continue;  		if (file->dirent == dirent) { -			if (file->cluster_offset >= dirent->size) { +			if (file->cluster_offset >= (offset_t) dirent->size) {  				file->cluster_offset = 0;  				file->cluster = dirent->cluster;  			} @@ -838,7 +838,7 @@ _ao_fat_set_size(struct ao_file *file, uint32_t size)  	DBG ("\tfirst cluster %08x have %d need %d\n", first_cluster, have_clusters, need_clusters);  	if (have_clusters != need_clusters) { -		if (file->cluster && size > file->cluster_offset) { +		if (file->cluster && (offset_t) size > file->cluster_offset) {  			cluster_t	offset_clusters = (file->cluster_offset + bytes_per_cluster) / bytes_per_cluster;  			cluster_t	extra_clusters = need_clusters - offset_clusters;  			cluster_t	next_cluster; @@ -888,6 +888,7 @@ _ao_fat_set_size(struct ao_file *file, uint32_t size)  static void  _ao_fat_root_init(uint8_t *dent, char name[11], uint8_t attr)  { +	(void) attr;  	memset(dent, '\0', 0x20);  	memmove(dent, name, 11); @@ -1249,7 +1250,7 @@ ao_fat_read(int8_t fd, void *dst, int len)  		goto done;  	} -	if (file->offset + len > file->dirent->size) +	if (file->offset + len > (offset_t) file->dirent->size)  		len = file->dirent->size - file->offset;  	if (len < 0) @@ -1296,7 +1297,7 @@ ao_fat_write(int8_t fd, void *src, int len)  		goto done;  	} -	if (file->offset + len > file->dirent->size) { +	if (file->offset + len > (offset_t) file->dirent->size) {  		ret = _ao_fat_set_size(file, file->offset + len);  		if (ret < 0)  			goto done; @@ -1424,6 +1425,8 @@ done:  int8_t  ao_fat_rename(char old[11], char new[11])  { +	(void) old; +	(void) new;  	return -AO_FAT_EIO;  } @@ -1499,7 +1502,7 @@ ao_fat_list_cmd(void)  		putchar('.');  		for (; i < 11; i++)  			putchar(dirent.name[i]); -		for (i = 0; i < NUM_FAT_ATTR; i++) +		for (i = 0; i < (int) NUM_FAT_ATTR; i++)  			putchar (dirent.attr & ao_fat_attr[i].bit ? ao_fat_attr[i].label : ' ');  		printf (" @%08x %d\n", dirent.cluster, dirent.size);  	} @@ -1507,7 +1510,7 @@ ao_fat_list_cmd(void)  		printf ("readdir failed: %d\n", status);  } -static uint8_t +static void  ao_fat_parse_name(char name[11])  {  	uint8_t	c; @@ -1560,8 +1563,6 @@ ao_fat_write_cmd(void)  {  	static char	name[11];  	int8_t		fd; -	int		cnt, i; -	static char	buf[64];  	char		c;  	int		status; diff --git a/src/drivers/ao_gps_ublox.c b/src/drivers/ao_gps_ublox.c index 4fb90746..01169522 100644 --- a/src/drivers/ao_gps_ublox.c +++ b/src/drivers/ao_gps_ublox.c @@ -746,18 +746,20 @@ ao_gps(void) __reentrant  				ao_gps_tracking_data.channels = 0;  				struct ao_telemetry_satellite_info *dst = &ao_gps_tracking_data.sats[0]; +				struct nav_svinfo_sat *src = &nav_svinfo_sat[0];  				for (i = 0; i < nav_svinfo_nsat; i++) { -					struct nav_svinfo_sat *src = &nav_svinfo_sat[i]; -  					if (!(src->flags & (1 << NAV_SVINFO_SAT_FLAGS_UNHEALTHY)) &&  					    src->quality >= NAV_SVINFO_SAT_QUALITY_ACQUIRED)  					{ -						dst->svid = src->svid; -						dst->c_n_1 = src->cno; -						dst++; -						ao_gps_tracking_data.channels++; +						if (ao_gps_tracking_data.channels < AO_TELEMETRY_SATELLITE_MAX_SAT) { +							dst->svid = src->svid; +							dst->c_n_1 = src->cno; +							dst++; +							ao_gps_tracking_data.channels++; +						}  					} +					src++;  				}  				ao_mutex_put(&ao_gps_mutex); diff --git a/src/drivers/ao_sdcard.c b/src/drivers/ao_sdcard.c index 7806bc19..47188ef3 100644 --- a/src/drivers/ao_sdcard.c +++ b/src/drivers/ao_sdcard.c @@ -56,13 +56,13 @@ static enum ao_sdtype sdtype;  #if SDCARD_TRACE  #define DBG(...) printf(__VA_ARGS__)  #else -#define DBG(...) +#define DBG(...) (void) 0  #endif  #if SDCARD_WARN  #define WARN(...) printf(__VA_ARGS__)  #else -#define WARN(...) +#define WARN(...) (void) 0  #endif  #define later(x,y)	((int16_t) ((x) - (y)) >= 0) @@ -100,7 +100,6 @@ ao_sdcard_send_cmd(uint8_t cmd, uint32_t arg)  {  	uint8_t	data[6];  	uint8_t	reply; -	int i;  	uint16_t timeout;  	DBG ("\tsend_cmd %d arg %08x\n", cmd, arg); @@ -111,7 +110,7 @@ ao_sdcard_send_cmd(uint8_t cmd, uint32_t arg)  			return SDCARD_STATUS_TIMEOUT;  	} -	data[0] = cmd & 0x3f | 0x40; +	data[0] = (cmd & 0x3f) | 0x40;  	data[1] = arg >> 24;  	data[2] = arg >> 16;  	data[3] = arg >> 8; @@ -402,7 +401,7 @@ static uint8_t  _ao_sdcard_reset(void)  {  	int i; -	uint8_t	ret; +	uint8_t	ret = 0x3f;  	uint8_t	response[10];  	for (i = 0; i < SDCARD_IDLE_RETRY; i++) { @@ -419,12 +418,12 @@ _ao_sdcard_reset(void)  	 */  	if (ao_sdcard_send_if_cond(0x1aa, response) == SDCARD_STATUS_IDLE_STATE) {  		uint32_t	arg = 0; -		uint8_t		sdver2 = 0; +//		uint8_t		sdver2 = 0;  		/* Check for SD version 2 */  		if ((response[2] & 0xf) == 1 && response[3] == 0xaa) {  			arg = 0x40000000; -			sdver2 = 1; +//			sdver2 = 1;  		}  		for (i = 0; i < SDCARD_IDLE_RETRY; i++) { @@ -487,7 +486,7 @@ ao_sdcard_wait_block_start(void)  uint8_t  ao_sdcard_read_block(uint32_t block, uint8_t *data)  { -	uint8_t	ret; +	uint8_t	ret = 0x3f;  	uint8_t start_block;  	uint8_t crc[2];  	int tries; @@ -518,6 +517,7 @@ ao_sdcard_read_block(uint32_t block, uint8_t *data)  			WARN ("read block command failed %d status %02x\n", block, ret);  			status = _ao_sdcard_send_status();  			WARN ("\tstatus now %04x\n", status); +			(void) status;  			goto bail;  		} @@ -567,8 +567,6 @@ ao_sdcard_write_block(uint32_t block, uint8_t *data)  	uint8_t	response[1];  	uint8_t	start_block[8];  	uint16_t status; -	static uint8_t	check_data[512]; -	int	i;  	int	tries;  	ao_sdcard_lock(); @@ -612,7 +610,7 @@ ao_sdcard_write_block(uint32_t block, uint8_t *data)  		if ((response[0] & SDCARD_DATA_RES_MASK) != SDCARD_DATA_RES_ACCEPTED) {  			int i;  			WARN("Data not accepted, response"); -			for (i = 0; i < sizeof (response); i++) +			for (i = 0; i < (int) sizeof (response); i++)  				WARN(" %02x", response[i]);  			WARN("\n");  			ret = 0x3f; diff --git a/src/drivers/ao_watchdog.c b/src/drivers/ao_watchdog.c new file mode 100644 index 00000000..096a5564 --- /dev/null +++ b/src/drivers/ao_watchdog.c @@ -0,0 +1,62 @@ +/* + * Copyright © 2013 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> + +static int	ao_watchdog_enabled = TRUE; + +static void +ao_watchdog(void) +{ +	for (;;) { +		while (!ao_watchdog_enabled) +			ao_sleep(&ao_watchdog_enabled); +		while (ao_watchdog_enabled) { +			ao_delay(AO_WATCHDOG_INTERVAL); +			ao_gpio_set(AO_WATCHDOG_PORT, AO_WATCHDOG_BIT, AO_WATCHDOG_PIN, 1); +			ao_delay(1); +			ao_gpio_set(AO_WATCHDOG_PORT, AO_WATCHDOG_BIT, AO_WATCHDOG_PIN, 0); +		} +	} +} + +static void +ao_watchdog_set(void) +{ +	ao_cmd_hex(); +	if (ao_cmd_status == ao_cmd_success) { +		ao_watchdog_enabled = ao_cmd_lex_i != 0; +		ao_wakeup(&ao_watchdog_enabled); +	} +} +	 + +static __code struct ao_cmds ao_watchdog_cmds[] = { +	{ ao_watchdog_set,	"Q <0 off, 1 on>\0Enable or disable watchdog timer" }, +	{ 0,			NULL }, +}; + +static struct ao_task watchdog_task; + +void +ao_watchdog_init(void) +{ +	ao_enable_output(AO_WATCHDOG_PORT, AO_WATCHDOG_BIT, AO_WATCHDOG, 0); +	ao_cmd_register(&ao_watchdog_cmds[0]); +	ao_add_task(&watchdog_task, ao_watchdog, "watchdog"); +} + diff --git a/src/drivers/ao_watchdog.h b/src/drivers/ao_watchdog.h new file mode 100644 index 00000000..73e1559d --- /dev/null +++ b/src/drivers/ao_watchdog.h @@ -0,0 +1,24 @@ +/* + * Copyright © 2013 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_WATCHDOG_H_ +#define _AO_WATCHDOG_H_ + +void +ao_watchdog_init(void); + +#endif /* _AO_WATCHDOG_H_ */ diff --git a/src/product/ao_flash_pins.h b/src/product/ao_flash_pins.h index dd67d820..4917ee6f 100644 --- a/src/product/ao_flash_pins.h +++ b/src/product/ao_flash_pins.h @@ -27,7 +27,9 @@  #define HAS_BEEP		0  #define HAS_TASK		0  #define HAS_ECHO		0 +#ifndef HAS_TICK  #define HAS_TICK		0 +#endif  #define PACKET_HAS_SLAVE	0 diff --git a/src/stm/ao_adc_stm.c b/src/stm/ao_adc_stm.c index 53d4b8c3..67416a9d 100644 --- a/src/stm/ao_adc_stm.c +++ b/src/stm/ao_adc_stm.c @@ -106,6 +106,72 @@ ao_adc_get(__xdata struct ao_adc *packet)  	memcpy(packet, (void *) &ao_data_ring[i].adc, sizeof (struct ao_adc));  } +#ifdef AO_ADC_SQ1_NAME +static const char *ao_adc_name[AO_NUM_ADC] = { +	AO_ADC_SQ1_NAME, +#ifdef AO_ADC_SQ2_NAME +	AO_ADC_SQ2_NAME, +#endif +#ifdef AO_ADC_SQ3_NAME +	AO_ADC_SQ3_NAME, +#endif +#ifdef AO_ADC_SQ4_NAME +	AO_ADC_SQ4_NAME, +#endif +#ifdef AO_ADC_SQ5_NAME +	AO_ADC_SQ5_NAME, +#endif +#ifdef AO_ADC_SQ6_NAME +	AO_ADC_SQ6_NAME, +#endif +#ifdef AO_ADC_SQ7_NAME +	AO_ADC_SQ7_NAME, +#endif +#ifdef AO_ADC_SQ8_NAME +	AO_ADC_SQ8_NAME, +#endif +#ifdef AO_ADC_SQ9_NAME +	AO_ADC_SQ9_NAME, +#endif +#ifdef AO_ADC_SQ10_NAME +	AO_ADC_SQ10_NAME, +#endif +#ifdef AO_ADC_SQ11_NAME +	AO_ADC_SQ11_NAME, +#endif +#ifdef AO_ADC_SQ12_NAME +	AO_ADC_SQ12_NAME, +#endif +#ifdef AO_ADC_SQ13_NAME +	AO_ADC_SQ13_NAME, +#endif +#ifdef AO_ADC_SQ14_NAME +	AO_ADC_SQ14_NAME, +#endif +#ifdef AO_ADC_SQ15_NAME +	AO_ADC_SQ15_NAME, +#endif +#ifdef AO_ADC_SQ16_NAME +	AO_ADC_SQ16_NAME, +#endif +#ifdef AO_ADC_SQ17_NAME +	AO_ADC_SQ17_NAME, +#endif +#ifdef AO_ADC_SQ18_NAME +	AO_ADC_SQ18_NAME, +#endif +#ifdef AO_ADC_SQ19_NAME +	AO_ADC_SQ19_NAME, +#endif +#ifdef AO_ADC_SQ20_NAME +	AO_ADC_SQ20_NAME, +#endif +#ifdef AO_ADC_SQ21_NAME +	#error "too many ADC names" +#endif +}; +#endif +  static void  ao_adc_dump(void) __reentrant  { @@ -121,8 +187,14 @@ ao_adc_dump(void) __reentrant  #else  	printf("tick: %5u",  packet.tick);  	d = (int16_t *) (&packet.adc); -	for (i = 0; i < AO_NUM_ADC; i++) -		printf (" %2d: %5d", i, d[i]); +	for (i = 0; i < AO_NUM_ADC; i++) { +#ifdef AO_ADC_SQ1_NAME +		if (ao_adc_name[i]) +			printf (" %s: %5d", ao_adc_name[i], d[i]); +		else		 +#endif +			printf (" %2d: %5d", i, d[i]); +	}  	printf("\n");  #endif  } @@ -178,6 +250,42 @@ ao_adc_init(void)  #ifdef AO_ADC_PIN12_PORT  	stm_moder_set(AO_ADC_PIN12_PORT, AO_ADC_PIN12_PIN, STM_MODER_ANALOG);  #endif +#ifdef AO_ADC_PIN13_PORT +	stm_moder_set(AO_ADC_PIN13_PORT, AO_ADC_PIN13_PIN, STM_MODER_ANALOG); +#endif +#ifdef AO_ADC_PIN14_PORT +	stm_moder_set(AO_ADC_PIN14_PORT, AO_ADC_PIN14_PIN, STM_MODER_ANALOG); +#endif +#ifdef AO_ADC_PIN15_PORT +	stm_moder_set(AO_ADC_PIN15_PORT, AO_ADC_PIN15_PIN, STM_MODER_ANALOG); +#endif +#ifdef AO_ADC_PIN16_PORT +	stm_moder_set(AO_ADC_PIN16_PORT, AO_ADC_PIN16_PIN, STM_MODER_ANALOG); +#endif +#ifdef AO_ADC_PIN17_PORT +	stm_moder_set(AO_ADC_PIN17_PORT, AO_ADC_PIN17_PIN, STM_MODER_ANALOG); +#endif +#ifdef AO_ADC_PIN18_PORT +	stm_moder_set(AO_ADC_PIN18_PORT, AO_ADC_PIN18_PIN, STM_MODER_ANALOG); +#endif +#ifdef AO_ADC_PIN19_PORT +	stm_moder_set(AO_ADC_PIN19_PORT, AO_ADC_PIN19_PIN, STM_MODER_ANALOG); +#endif +#ifdef AO_ADC_PIN20_PORT +	stm_moder_set(AO_ADC_PIN20_PORT, AO_ADC_PIN20_PIN, STM_MODER_ANALOG); +#endif +#ifdef AO_ADC_PIN21_PORT +	stm_moder_set(AO_ADC_PIN21_PORT, AO_ADC_PIN21_PIN, STM_MODER_ANALOG); +#endif +#ifdef AO_ADC_PIN22_PORT +	stm_moder_set(AO_ADC_PIN22_PORT, AO_ADC_PIN22_PIN, STM_MODER_ANALOG); +#endif +#ifdef AO_ADC_PIN23_PORT +	stm_moder_set(AO_ADC_PIN23_PORT, AO_ADC_PIN23_PIN, STM_MODER_ANALOG); +#endif +#ifdef AO_ADC_PIN24_PORT +	#error "Too many ADC ports" +#endif  	stm_rcc.apb2enr |= (1 << STM_RCC_APB2ENR_ADC1EN); @@ -248,6 +356,24 @@ ao_adc_init(void)  	stm_adc.sqr4 |= (AO_ADC_SQ12 << 25);  #endif  #if AO_NUM_ADC > 12 +	stm_adc.sqr3 |= (AO_ADC_SQ13 << 0); +#endif +#if AO_NUM_ADC > 13 +	stm_adc.sqr3 |= (AO_ADC_SQ14 << 5); +#endif +#if AO_NUM_ADC > 14 +	stm_adc.sqr3 |= (AO_ADC_SQ15 << 10); +#endif +#if AO_NUM_ADC > 15 +	stm_adc.sqr3 |= (AO_ADC_SQ16 << 15); +#endif +#if AO_NUM_ADC > 16 +	stm_adc.sqr3 |= (AO_ADC_SQ17 << 20); +#endif +#if AO_NUM_ADC > 17 +	stm_adc.sqr3 |= (AO_ADC_SQ18 << 25); +#endif +#if AO_NUM_ADC > 18  #error "need to finish stm_adc.sqr settings"  #endif @@ -258,6 +384,9 @@ ao_adc_init(void)  	while (!(stm_adc.sr & (1 << STM_ADC_SR_ADONS)))  		; +#ifndef HAS_ADC_TEMP +#error Please define HAS_ADC_TEMP +#endif  #if HAS_ADC_TEMP  	stm_adc.ccr = ((1 << STM_ADC_CCR_TSVREFE));  #else diff --git a/src/stm/ao_flash_loader_stm.c b/src/stm/ao_flash_loader_stm.c index 2ab548cf..6bf89234 100644 --- a/src/stm/ao_flash_loader_stm.c +++ b/src/stm/ao_flash_loader_stm.c @@ -27,6 +27,13 @@ main(void)  	ao_usb_init(); +#if HAS_TICK +	ao_timer_init(); +#endif + +#ifdef AO_FLASH_LOADER_INIT +	AO_FLASH_LOADER_INIT; +#endif	  	ao_flash_task();  	return 0;  } diff --git a/src/stm/ao_flash_stm.c b/src/stm/ao_flash_stm.c index 38b1c2d8..39dc8144 100644 --- a/src/stm/ao_flash_stm.c +++ b/src/stm/ao_flash_stm.c @@ -83,12 +83,14 @@ _ao_flash_erase_page(uint32_t *page)  void  ao_flash_erase_page(uint32_t *page)  { +	ao_arch_block_interrupts();  	ao_flash_pecr_unlock();  	ao_flash_pgr_unlock();  	_ao_flash_erase_page(page);  	ao_flash_lock(); +	ao_arch_release_interrupts();  }  static void __attribute__ ((section(".ramtext"), noinline)) @@ -116,6 +118,8 @@ ao_flash_page(uint32_t *page, uint32_t *src)  	uint8_t		h;  	ao_flash_erase_page(page); + +	ao_arch_block_interrupts();  	ao_flash_pecr_unlock();  	ao_flash_pgr_unlock();  	for (h = 0; h < 2; h++) { @@ -124,4 +128,5 @@ ao_flash_page(uint32_t *page, uint32_t *src)  		src += 32;  	}  	ao_flash_lock(); +	ao_arch_release_interrupts();  } diff --git a/src/stm/ao_timer.c b/src/stm/ao_timer.c index 34f9edb9..d93531fc 100644 --- a/src/stm/ao_timer.c +++ b/src/stm/ao_timer.c @@ -53,6 +53,9 @@ void stm_systick_isr(void)  #endif  		}  #endif +#ifdef AO_TIMER_HOOK +		AO_TIMER_HOOK; +#endif  	}  } diff --git a/src/telegps-v0.1/Makefile b/src/telegps-v0.1/Makefile index 49e325ac..77ef9c4a 100644 --- a/src/telegps-v0.1/Makefile +++ b/src/telegps-v0.1/Makefile @@ -32,6 +32,9 @@ INC = \  #STACK_GUARD=ao_mpu_stm.c  #STACK_GUARD_DEF=-DHAS_STACK_GUARD=1 +MATH_SRC=\ +	ef_log.c +  ALTOS_SRC = \  	ao_boot_chain.c \  	ao_interrupt.c \ @@ -64,7 +67,8 @@ ALTOS_SRC = \  	ao_log_fat.c \  	ao_gps_report_mega.c \  	ao_telemetry.c \ -	$(SAMPLE_PROFILE) +	$(SAMPLE_PROFILE) \ +	$(MATH_SRC)  PRODUCT=TeleGPS-v0.1  PRODUCT_DEF=-DTELEGPS | 
