altos/easymega-v3.0: Switch to STM32F103
authorKeith Packard <keithp@keithp.com>
Thu, 30 Mar 2023 07:46:36 +0000 (00:46 -0700)
committerKeith Packard <keithp@keithp.com>
Thu, 1 Feb 2024 01:50:19 +0000 (17:50 -0800)
For some reason, there was easymega v3.0 firmware sitting here, but
it was mostly a copy of easymega v2.0 bits. Fix that to support the
current design based on the STM32F103 SoC.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/easymega-v3.0/Makefile
src/easymega-v3.0/ao_easymega.c
src/easymega-v3.0/ao_pins.h
src/easymega-v3.0/flash-loader/Makefile
src/easymega-v3.0/flash-loader/ao_pins.h
src/kernel/ao_log.h

index 51c517558fff12442fae7b3853b03c8e46141fe9..c145b83b2a8557990416a6e64393e4c0fde40a56 100644 (file)
@@ -3,7 +3,7 @@
 #
 #
 
-include ../stm/Makefile.defs
+include ../stm32f1/Makefile.defs
 
 INC = \
        ao.h \
@@ -20,38 +20,27 @@ INC = \
        ao_ms5607.h \
        ao_bmx160.h \
        ao_adxl375.h \
-       ao_profile.h \
        ao_task.h \
        ao_whiten.h \
        ao_sample_profile.h \
        ao_quaternion.h \
-       ao_mpu.h \
-       stm32l.h \
+       stm32f1.h \
        Makefile
 
 #
 # Common AltOS sources
 #
 
-#PROFILE=ao_profile.c
-#PROFILE_DEF=-DAO_PROFILE=1
-
-#SAMPLE_PROFILE=ao_sample_profile.c \
-#      ao_sample_profile_timer.c
-#SAMPLE_PROFILE_DEF=-DHAS_SAMPLE_PROFILE=1
-
-#STACK_GUARD=ao_mpu_stm.c
-#STACK_GUARD_DEF=-DHAS_STACK_GUARD=1
-
 ALTOS_SRC = \
        ao_boot_chain.c \
        ao_interrupt.c \
+       ao_clock.c \
        ao_product.c \
        ao_romconfig.c \
        ao_cmd.c \
        ao_config.c \
        ao_task.c \
-       ao_led_stm.c \
+       ao_led.c \
        ao_stdio.c \
        ao_panic.c \
        ao_timer.c \
@@ -60,19 +49,19 @@ ALTOS_SRC = \
        ao_freq.c \
        ao_dma_stm.c \
        ao_spi_stm.c \
+       ao_i2c_stm.c \
        ao_data.c \
        ao_ms5607.c \
-       ao_bmx160.c \
+       ao_bmi088.c \
+       ao_mmc5983.c \
        ao_adxl375.c \
        ao_adc_stm.c \
        ao_beep_stm.c \
-       ao_eeprom_stm.c \
        ao_storage.c \
        ao_m25.c \
        ao_usb_stm.c \
        ao_exti_stm.c \
        ao_report.c \
-       ao_i2c_stm.c \
        ao_convert_pa.c \
        ao_convert_volt.c \
        ao_log.c \
@@ -90,7 +79,7 @@ PRODUCT=EasyMega-v3.0
 PRODUCT_DEF=-DEASYMEGA
 IDPRODUCT=0x0028
 
-CFLAGS = $(PRODUCT_DEF) $(STM_CFLAGS) $(PROFILE_DEF) $(SAMPLE_PROFILE_DEF) $(STACK_GUARD_DEF)
+CFLAGS = $(PRODUCT_DEF) $(STM32F1_CFLAGS)
 
 PROGNAME=easymega-v3.0
 PROG=$(PROGNAME)-$(VERSION).elf
index 70a6e4095dc2231e33e6775bdf2fc994dc0512d3..de666c65170033d0583f47adc3190743aeca878b 100644 (file)
 
 #include <ao.h>
 #include <ao_ms5607.h>
-#include <ao_bmx160.h>
+#include <ao_bmi088.h>
+#include <ao_mmc5983.h>
 #include <ao_adxl375.h>
 #include <ao_log.h>
 #include <ao_exti.h>
 #include <ao_companion.h>
-#include <ao_profile.h>
 #include <ao_eeprom.h>
-#if HAS_SAMPLE_PROFILE
-#include <ao_sample_profile.h>
-#endif
 #include <ao_pyro.h>
-#if HAS_STACK_GUARD
-#include <ao_mpu.h>
-#endif
 
 int
 main(void)
@@ -57,10 +51,10 @@ main(void)
        ao_cmd_init();
 
        ao_ms5607_init();
-       ao_bmx160_init();
+       ao_bmi088_init();
+       ao_mmc5983_init();
        ao_adxl375_init();
 
-       ao_eeprom_init();
        ao_storage_init();
 
        ao_flight_init();
index 79a2a59a35764bfebda67d7453e757bd825abe7c..1aea7b212bf40d4b2c20fa8d9c5bb7b43d4ab386 100644 (file)
 #ifndef _AO_PINS_H_
 #define _AO_PINS_H_
 
+/* 16MHz crystal */
 
-/* 16MHz High speed external crystal */
-#define AO_HSE                 16000000
+#define AO_HSE         1
+#define AO_HSE_BYPASS  0
 
-/* PLLVCO = 96MHz (so that USB will work) */
-#define AO_PLLMUL              6
-#define AO_RCC_CFGR_PLLMUL     (STM_RCC_CFGR_PLLMUL_6)
+#define AO_SYSCLK      72000000
+#define AO_HCLK                72000000
+#define AO_APB1CLK     36000000
+#define AO_APB2CLK     72000000
+#define AO_ADCCLK      12000000
 
-/* SYSCLK = 32MHz (no need to go faster than CPU) */
-#define AO_PLLDIV              3
-#define AO_RCC_CFGR_PLLDIV     (STM_RCC_CFGR_PLLDIV_3)
+/* PLLMUL is 9, PLLXTPRE (pre divider) is 2, so the
+ * overall PLLCLK is 16 * 9/2 = 72MHz (used as SYSCLK)
+ *
+ * HCLK is SYSCLK / 1 (HPRE_DIV) = 72MHz (72MHz max)
+ * USB is PLLCLK / 1.5 (USBPRE)= 48MHz (must be 48MHz)
+ * APB2 is HCLK / 1 (PPRE2_DIV) = 72MHz (72MHz max)
+ * APB1 is HCLK / 2 (PPRE1_DIV) = 36MHz (36MHz max)
+ * ADC is APB2 / 6 (ADCPRE) = 12MHz (14MHz max)
+ */
 
-/* HCLK = 32MHz (CPU clock) */
-#define AO_AHB_PRESCALER       1
+#define AO_RCC_CFGR_USBPRE     STM_RCC_CFGR_USBPRE_1_5
+#define AO_RCC_CFGR_PLLMUL     STM_RCC_CFGR_PLLMUL_9
+#define AO_RCC_CFGR_PLLXTPRE   STM_RCC_CFGR_PLLXTPRE_2
+#define AO_RCC_CFGR_PPRE2_DIV  STM_RCC_CFGR_PPRE2_DIV_1
+#define AO_RCC_CFGR_PPRE1_DIV  STM_RCC_CFGR_PPRE1_DIV_2
 #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           0
-#define USE_SERIAL_1_STDIN     0
-#define SERIAL_1_PB6_PB7       0
-#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       0
-
-#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 ao_gps_getchar         ao_serial1_getchar
-#define ao_gps_putchar         ao_serial1_putchar
-#define ao_gps_set_speed       ao_serial1_set_speed
-#define ao_gps_fifo            (ao_stm_usart1.rx_fifo)
+#define AO_RCC_CFGR_ADCPRE     STM_RCC_CFGR_ADCPRE_6
 
 #define AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX       (1024 * 1024)
 #define AO_CONFIG_MAX_SIZE                     1024
 #define LOG_ERASE_MARK                         0x55
 #define LOG_MAX_ERASE                          128
-#define AO_LOG_FORMAT                          AO_LOG_FORMAT_EASYMEGA_2
+#define AO_LOG_FORMAT                          AO_LOG_FORMAT_EASYMEGA_3
+#define AO_LOG_NORMALIZED                      1
 
 #define HAS_EEPROM             1
 #define USE_INTERNAL_FLASH     0
-#define USE_EEPROM_CONFIG      1
-#define USE_STORAGE_CONFIG     0
+#define USE_EEPROM_CONFIG      0
+#define USE_STORAGE_CONFIG     1
 #define HAS_USB                        1
 #define HAS_BEEP               1
 #define BEEPER_TIMER           2
 #define HAS_APRS               0
 #define HAS_COMPANION          1
 
+#define HAS_USB_PULLUP 1
+#define AO_USB_PULLUP_PORT     (&stm_gpioa)
+#define AO_USB_PULLUP_PIN      8
+
 #define HAS_SPI_1              1
 #define SPI_1_PA5_PA6_PA7      1       /* Barometer */
 #define SPI_1_PB3_PB4_PB5      1       /* Accelerometer */
 #define SPI_1_PE13_PE14_PE15   0
-#define SPI_1_OSPEEDR          STM_OSPEEDR_10MHz
+#define SPI_1_MODE_OUTPUT      STM_GPIO_CR_MODE_OUTPUT_10MHZ
 
 #define HAS_SPI_2              1
 #define SPI_2_PB13_PB14_PB15   1       /* Flash, IMU, Companion */
-#define SPI_2_PD1_PD3_PD4      0
-#define SPI_2_OSPEEDR          STM_OSPEEDR_10MHz
+#define SPI_2_MODE_OUTPUT      STM_GPIO_CR_MODE_OUTPUT_50MHZ
 
 #define HAS_I2C_1              1
 #define I2C_1_PB8_PB9          1
 
 #define LOW_LEVEL_DEBUG                0
 
-#define LED_PORT_ENABLE                STM_RCC_AHBENR_GPIOAEN
-#define LED_PORT               (&stm_gpioa)
-#define LED_PIN_RED            9
-#define LED_PIN_GREEN          10
-#define AO_LED_RED             (1 << LED_PIN_RED)
-#define AO_LED_GREEN           (1 << LED_PIN_GREEN)
+#define LED_0_PORT             (&stm_gpioa)
+#define LED_0_PIN              9
+#define LED_1_PORT             (&stm_gpioa)
+#define LED_1_PIN              10
+#define AO_LED_RED             (1 << LED_0_PIN)
+#define AO_LED_GREEN           (1 << LED_1_PIN)
 
 #define LEDS_AVAILABLE         (AO_LED_RED | AO_LED_GREEN)
 
@@ -217,10 +205,6 @@ struct ao_adc {
 
 #define AO_ADC_TEMP            16
 
-#define AO_ADC_RCC_AHBENR      ((1 << STM_RCC_AHBENR_GPIOAEN) | \
-                                (1 << STM_RCC_AHBENR_GPIOEEN) | \
-                                (1 << STM_RCC_AHBENR_GPIOBEN))
-
 #define AO_NUM_ADC_PIN         (AO_ADC_NUM_SENSE + 2)
 
 #define AO_ADC_PIN0_PORT       AO_ADC_SENSE_A_PORT
@@ -299,29 +283,53 @@ struct ao_adc {
 #define AO_M25_SPI_CS_MASK     (1 << AO_M25_SPI_CS_PIN)
 #define AO_M25_SPI_BUS         AO_SPI_2_PB13_PB14_PB15
 
-/*
- * bmx160
- */
+/* BMI088 */
 
-#define HAS_BMX160             1
-#define AO_BMX160_INT_PORT     (&stm_gpioc)
-#define AO_BMX160_INT_PIN      15
-#define AO_BMX160_SPI_BUS      (AO_SPI_2_PB13_PB14_PB15 | AO_SPI_MODE_0)
-#define AO_BMX160_SPI_CS_PORT  (&stm_gpioc)
-#define AO_BMX160_SPI_CS_PIN   13
+#define HAS_BMI088             1
+#define AO_BMI088_SPI_BUS      (AO_SPI_2_PB13_PB14_PB15 | AO_SPI_MODE_0)
+#define AO_BMI088_ACC_CS_PORT  (&stm_gpioc)
+#define AO_BMI088_ACC_CS_PIN   14
+#define AO_BMI088_GYR_CS_PORT  (&stm_gpioc)
+#define AO_BMI088_GYR_CS_PIN   13
 #define HAS_IMU                        1
 
-#define ao_data_along(packet)  ((packet)->bmx160.acc_x)
-#define ao_data_across(packet) (-(packet)->bmx160.acc_y)
-#define ao_data_through(packet)        ((packet)->bmx160.acc_z)
+#define ao_bmi088_along(m)     ((m)->acc.x)
+#define ao_bmi088_across(m)    (-(m)->acc.y)
+#define ao_bmi088_through(m)   ((m)->acc.z)
+
+#define ao_bmi088_roll(m)      ((m)->gyr.x)
+#define ao_bmi088_pitch(m)     (-(m)->gyr.y)
+#define ao_bmi088_yaw(m)       ((m)->gyr.z)
+
+#define ao_data_along(packet)  ao_bmi088_along(&(packet)->bmi088)
+#define ao_data_across(packet) ao_bmi088_across(&(packet)->bmi088)
+#define ao_data_through(packet)        ao_bmi088_through(&(packet)->bmi088)
+
+#define ao_data_roll(packet)   ao_bmi088_roll(&(packet)->bmi088)
+#define ao_data_pitch(packet)  ao_bmi088_pitch(&(packet)->bmi088)
+#define ao_data_yaw(packet)    ao_bmi088_yaw(&(packet)->bmi088)
+
+/*
+ * MMC5983
+ *
+ *     pin 1 NE corner of chip
+ *
+ *     +along          -Y
+ *     +across         +X
+ *     +through        -Z
+ */
+
+#define HAS_MMC5983            1
+#define MMC5983_I2C            1
+#define AO_MMC5983_I2C_INDEX   STM_I2C_INDEX(1)
 
-#define ao_data_roll(packet)   ((packet)->bmx160.gyr_x)
-#define ao_data_pitch(packet)  (-(packet)->bmx160.gyr_y)
-#define ao_data_yaw(packet)    ((packet)->bmx160.gyr_z)
+#define ao_mmc5983_along(m)            (-(m)->y)
+#define ao_mmc5983_across(m)           ((m)->x)
+#define ao_mmc5983_through(m)          (-(m)->z)
 
-#define ao_data_mag_along(packet)      ((packet)->bmx160.mag_x)
-#define ao_data_mag_across(packet)     (-(packet)->bmx160.mag_y)
-#define ao_data_mag_through(packet)    ((packet)->bmx160.mag_z)
+#define ao_data_mag_along(packet)      ao_mmc5983_along(&(packet)->mmc5983)
+#define ao_data_mag_across(packet)     ao_mmc5983_across(&(packet)->mmc5983)
+#define ao_data_mag_through(packet)    ao_mmc5983_through(&(packet)->mmc5983)
 
 /* ADXL375 */
 
index 2b715caf8b385a5166705a938d5740433b806257..e441b0a6d7da481ca8fefda62371dd6f0d75c719 100644 (file)
@@ -5,4 +5,4 @@
 
 TOPDIR=../..
 HARDWARE=easymega-v3.0
-include $(TOPDIR)/stm/Makefile-flash.defs
+include $(TOPDIR)/stm32f1/Makefile-flash.defs
index 324b0eb9d406c5342b73e63dfe214b02ecbf2077..c60f620762b9cec061ae6b6a21484e77628b5e61 100644 (file)
 #ifndef _AO_PINS_H_
 #define _AO_PINS_H_
 
-/* External crystal at 16MHz */
-#define AO_HSE         16000000
+/* 16MHz crystal */
+
+#define AO_HSE         1
+#define AO_HSE_BYPASS  0
+
+#define AO_SYSCLK      72000000
+#define AO_HCLK                72000000
+#define AO_APB1CLK     36000000
+#define AO_APB2CLK     72000000
+#define AO_ADCCLK      12000000
+
+/* PLLMUL is 9, PLLXTPRE (pre divider) is 2, so the
+ * overall PLLCLK is 16 * 9/2 = 72MHz (used as SYSCLK)
+ *
+ * HCLK is SYSCLK / 1 (HPRE_DIV) = 72MHz (72MHz max)
+ * USB is PLLCLK / 1.5 (USBPRE)= 48MHz (must be 48MHz)
+ * APB2 is HCLK / 1 (PPRE2_DIV) = 72MHz (72MHz max)
+ * APB1 is HCLK / 2 (PPRE1_DIV) = 36MHz (36MHz max)
+ * ADC is APB2 / 6 (ADCPRE) = 12MHz (14MHz max)
+ */
+
+#define AO_RCC_CFGR_USBPRE     STM_RCC_CFGR_USBPRE_1_5
+#define AO_RCC_CFGR_PLLMUL     STM_RCC_CFGR_PLLMUL_9
+#define AO_RCC_CFGR_PLLXTPRE   STM_RCC_CFGR_PLLXTPRE_2
+#define AO_RCC_CFGR_PPRE2_DIV  STM_RCC_CFGR_PPRE2_DIV_1
+#define AO_RCC_CFGR_PPRE1_DIV  STM_RCC_CFGR_PPRE1_DIV_2
+#define AO_RCC_CFGR_HPRE_DIV   STM_RCC_CFGR_HPRE_DIV_1
+#define AO_RCC_CFGR_ADCPRE     STM_RCC_CFGR_ADCPRE_6
 
 #include <ao_flash_stm_pins.h>
 
@@ -32,4 +58,8 @@
 #define AO_BOOT_APPLICATION_VALUE      1
 #define AO_BOOT_APPLICATION_MODE       AO_EXTI_MODE_PULL_UP
 
+#define HAS_USB_PULLUP 1
+#define AO_USB_PULLUP_PORT     (&stm_gpioa)
+#define AO_USB_PULLUP_PIN      8
+
 #endif /* _AO_PINS_H_ */
index de1156e1066eaad539bc8ab43ab9bb584c64c83e..b8aa6a8c589541759f50a34885cff2edf53897e5 100644 (file)
@@ -63,6 +63,7 @@ extern enum ao_flight_state ao_log_state;
 #define AO_LOG_FORMAT_TELEMEGA_5       21      /* 32 byte typed telemega records with 32 bit gyro cal, mpu6000 and mmc5983 */
 #define AO_LOG_FORMAT_TELEMEGA_6       22      /* 32 byte typed telemega records with 32 bit gyro cal, bmi088 and mmc5983 */
 #define AO_LOG_FORMAT_EASYTIMER_2      23      /* 32 byte typed easytimer records with 32 bit gyro cal, bmi088 and mmc5983 */
+#define AO_LOG_FORMAT_EASYMEGA_3       24      /* 32 byte typed telemega records with 32 bit gyro cal, bmi088 and mmc5983 */
 #define AO_LOG_FORMAT_NONE             127     /* No log at all */
 
 /* Return the flight number from the given log slot, 0 if none, -slot on failure */
@@ -592,7 +593,7 @@ struct ao_log_timer {
        } u;
 };
 
-#if AO_LOG_FORMAT == AO_LOG_FOMAT_TELEMEGA_OLD || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA_3 || AO_LOG_FORMAT == AO_LOG_FORMAT_EASYMEGA_2 || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA_4 || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA_5 || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA_6
+#if AO_LOG_FORMAT == AO_LOG_FOMAT_TELEMEGA_OLD || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA_3 || AO_LOG_FORMAT == AO_LOG_FORMAT_EASYMEGA_2 || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA_4 || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA_5 || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA_6 || AO_LOG_FORMAT == AO_LOG_FORMAT_EASYMEGA_3
 typedef struct ao_log_mega ao_log_type;
 #endif