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 |