From dff43d5156bd593e959e314aea721b1feda12461 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Tue, 22 May 2012 21:50:53 -0400 Subject: [PATCH 1/6] board_info: add guard for multiple includes of .h file --- flight/PiOS/inc/pios_board_info.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/flight/PiOS/inc/pios_board_info.h b/flight/PiOS/inc/pios_board_info.h index f2ff58fb4..3ff7aa886 100644 --- a/flight/PiOS/inc/pios_board_info.h +++ b/flight/PiOS/inc/pios_board_info.h @@ -1,3 +1,8 @@ +#ifndef PIOS_BOARD_INFO_H +#define PIOS_BOARD_INFO_H + +#include /* uint* */ + #define PIOS_BOARD_INFO_BLOB_MAGIC 0xBDBDBDBD struct pios_board_info { @@ -15,3 +20,5 @@ struct pios_board_info { } __attribute__((packed)); extern const struct pios_board_info pios_board_info_blob; + +#endif /* PIOS_BOARD_INFO_H */ From b97aba834a49b05f28783b9e7fb68a8896e86d3c Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 23 May 2012 00:12:51 -0400 Subject: [PATCH 2/6] cc3d leds: move pin remapping into led definition The LED driver supports GPIO remapping. No need to do the remapping outside of the LED definition. --- flight/Bootloaders/CopterControl/pios_board.c | 1 - flight/CopterControl/System/pios_board.c | 1 - flight/board_hw_defs/coptercontrol/board_hw_defs.c | 1 + 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/flight/Bootloaders/CopterControl/pios_board.c b/flight/Bootloaders/CopterControl/pios_board.c index 844670a6e..245f78297 100644 --- a/flight/Bootloaders/CopterControl/pios_board.c +++ b/flight/Bootloaders/CopterControl/pios_board.c @@ -67,7 +67,6 @@ void PIOS_Board_Init(void) { PIOS_LED_Init(&pios_led_cfg_cc); break; case 0x02: // Revision 2 - GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); PIOS_LED_Init(&pios_led_cfg_cc3d); break; default: diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index 11a6c4386..4102bd195 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -161,7 +161,6 @@ void PIOS_Board_Init(void) { PIOS_LED_Init(&pios_led_cfg_cc); break; case 0x02: // Revision 2 - GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); PIOS_LED_Init(&pios_led_cfg_cc3d); break; default: diff --git a/flight/board_hw_defs/coptercontrol/board_hw_defs.c b/flight/board_hw_defs/coptercontrol/board_hw_defs.c index 43f9360b8..0ac796b88 100644 --- a/flight/board_hw_defs/coptercontrol/board_hw_defs.c +++ b/flight/board_hw_defs/coptercontrol/board_hw_defs.c @@ -59,6 +59,7 @@ static const struct pios_led pios_leds_cc3d[] = { .GPIO_Speed = GPIO_Speed_50MHz, }, }, + .remap = GPIO_Remap_SWJ_JTAGDisable, }, }; From d2615cac96fd72de4309f681707cee78b38e641b Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 23 May 2012 00:22:11 -0400 Subject: [PATCH 3/6] hw_defs: hide board-rev differences in LED definitions Every board has at least one LED (HEARTBEAT). Not all users of LEDs need to be directly aware of which LED configuration to choose when there may be more than one possible configuration. Hide the details of the differences between LEDs used in the different HW revs for CC. This will allow generic code to run on CC and CC3D without being exposed to the details of the different pins used for the LEDs. --- flight/Bootloaders/CopterControl/pios_board.c | 13 +++---------- flight/CopterControl/System/pios_board.c | 13 +++---------- flight/board_hw_defs/coptercontrol/board_hw_defs.c | 13 +++++++++++++ 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/flight/Bootloaders/CopterControl/pios_board.c b/flight/Bootloaders/CopterControl/pios_board.c index 245f78297..92092a5ff 100644 --- a/flight/Bootloaders/CopterControl/pios_board.c +++ b/flight/Bootloaders/CopterControl/pios_board.c @@ -62,16 +62,9 @@ void PIOS_Board_Init(void) { const struct pios_board_info * bdinfo = &pios_board_info_blob; #if defined(PIOS_INCLUDE_LED) - switch(bdinfo->board_rev) { - case 0x01: // Revision 1 - PIOS_LED_Init(&pios_led_cfg_cc); - break; - case 0x02: // Revision 2 - PIOS_LED_Init(&pios_led_cfg_cc3d); - break; - default: - PIOS_Assert(0); - } + const struct pios_led_cfg * led_cfg = PIOS_BOARD_HW_DEFS_GetLedCfg(bdinfo->board_rev); + PIOS_Assert(led_cfg); + PIOS_LED_Init(led_cfg); #endif /* PIOS_INCLUDE_LED */ #if defined(PIOS_INCLUDE_USB) diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index 4102bd195..e050d3f08 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -156,16 +156,9 @@ void PIOS_Board_Init(void) { const struct pios_board_info * bdinfo = &pios_board_info_blob; #if defined(PIOS_INCLUDE_LED) - switch(bdinfo->board_rev) { - case 0x01: // Revision 1 - PIOS_LED_Init(&pios_led_cfg_cc); - break; - case 0x02: // Revision 2 - PIOS_LED_Init(&pios_led_cfg_cc3d); - break; - default: - PIOS_Assert(0); - } + const struct pios_led_cfg * led_cfg = PIOS_BOARD_HW_DEFS_GetLedCfg(bdinfo->board_rev); + PIOS_Assert(led_cfg); + PIOS_LED_Init(led_cfg); #endif /* PIOS_INCLUDE_LED */ #if defined(PIOS_INCLUDE_SPI) diff --git a/flight/board_hw_defs/coptercontrol/board_hw_defs.c b/flight/board_hw_defs/coptercontrol/board_hw_defs.c index 0ac796b88..328fd44ce 100644 --- a/flight/board_hw_defs/coptercontrol/board_hw_defs.c +++ b/flight/board_hw_defs/coptercontrol/board_hw_defs.c @@ -27,6 +27,10 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include +#include + +#define BOARD_REVISION_CC 1 +#define BOARD_REVISION_CC3D 2 #if defined(PIOS_INCLUDE_LED) @@ -68,6 +72,15 @@ static const struct pios_led_cfg pios_led_cfg_cc3d = { .num_leds = NELEMENTS(pios_leds_cc3d), }; +const struct pios_led_cfg * PIOS_BOARD_HW_DEFS_GetLedCfg (uint32_t board_revision) +{ + switch (board_revision) { + case BOARD_REVISION_CC: return &pios_led_cfg_cc; + case BOARD_REVISION_CC3D: return &pios_led_cfg_cc3d; + default: return NULL; + } +} + #endif /* PIOS_INCLUDE_LED */ #if defined(PIOS_INCLUDE_SPI) From 56dddee56cc3120151468b867864c61ed1abc613 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 23 May 2012 00:29:12 -0400 Subject: [PATCH 4/6] cc: use defines for board revisions instead of hard-coded numbers --- flight/Bootloaders/CopterControl/pios_board.c | 4 ++-- flight/CopterControl/System/pios_board.c | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/flight/Bootloaders/CopterControl/pios_board.c b/flight/Bootloaders/CopterControl/pios_board.c index 92092a5ff..4104c4028 100644 --- a/flight/Bootloaders/CopterControl/pios_board.c +++ b/flight/Bootloaders/CopterControl/pios_board.c @@ -76,10 +76,10 @@ void PIOS_Board_Init(void) { uint32_t pios_usb_id; switch(bdinfo->board_rev) { - case 0x01: // Revision 1 + case BOARD_REVISION_CC: PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg_cc); break; - case 0x02: // Revision 2 + case BOARD_REVISION_CC3D: PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg_cc3d); break; default: diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index e050d3f08..2db478a07 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -165,12 +165,12 @@ void PIOS_Board_Init(void) { /* Set up the SPI interface to the serial flash */ switch(bdinfo->board_rev) { - case 0x01: // Revision 1 + case BOARD_REVISION_CC: if (PIOS_SPI_Init(&pios_spi_flash_accel_id, &pios_spi_flash_accel_cfg_cc)) { PIOS_Assert(0); } break; - case 0x02: // Revision 2 + case BOARD_REVISION_CC3D: if (PIOS_SPI_Init(&pios_spi_flash_accel_id, &pios_spi_flash_accel_cfg_cc3d)) { PIOS_Assert(0); } @@ -182,11 +182,11 @@ void PIOS_Board_Init(void) { #endif switch(bdinfo->board_rev) { - case 0x01: // Revision 1 + case BOARD_REVISION_CC: PIOS_Flash_Jedec_Init(pios_spi_flash_accel_id, 1, &flash_w25x_cfg); PIOS_FLASHFS_Init(&flashfs_w25x_cfg); break; - case 0x02: // Revision 2 + case BOARD_REVISION_CC3D: PIOS_Flash_Jedec_Init(pios_spi_flash_accel_id, 0, &flash_m25p_cfg); PIOS_FLASHFS_Init(&flashfs_m25p_cfg); break; @@ -259,10 +259,10 @@ void PIOS_Board_Init(void) { uint32_t pios_usb_id; switch(bdinfo->board_rev) { - case 0x01: // Revision 1 + case BOARD_REVISION_CC: PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg_cc); break; - case 0x02: // Revision 2 + case BOARD_REVISION_CC3D: PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg_cc3d); break; default: @@ -682,7 +682,7 @@ void PIOS_Board_Init(void) { #endif /* PIOS_DEBUG_ENABLE_DEBUG_PINS */ switch(bdinfo->board_rev) { - case 0x01: + case BOARD_REVISION_CC: // Revision 1 with invensense gyros, start the ADC #if defined(PIOS_INCLUDE_ADC) PIOS_ADC_Init(&pios_adc_cfg); @@ -691,7 +691,7 @@ void PIOS_Board_Init(void) { PIOS_ADXL345_Init(pios_spi_flash_accel_id, 0); #endif break; - case 0x02: + case BOARD_REVISION_CC3D: // Revision 2 with L3GD20 gyros, start a SPI interface and connect to it GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); From 400e529703ea4846267d63d9d9b4b67bf1cea094 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 23 May 2012 00:31:08 -0400 Subject: [PATCH 5/6] bu: add back LED feedback LED support was dropped from the BU images due to a lack of proper abstraction for LED definitions between CC and CC3D HW variants in the CopterControl board family. Use the new LED abstraction to hide board revision details from the BU image so it can once again flash some LEDs. --- flight/Bootloaders/BootloaderUpdater/pios_board.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/flight/Bootloaders/BootloaderUpdater/pios_board.c b/flight/Bootloaders/BootloaderUpdater/pios_board.c index 93973b470..0b7cb9efc 100644 --- a/flight/Bootloaders/BootloaderUpdater/pios_board.c +++ b/flight/Bootloaders/BootloaderUpdater/pios_board.c @@ -35,6 +35,8 @@ #include void PIOS_Board_Init(void) { + const struct pios_board_info * bdinfo = &pios_board_info_blob; + /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); @@ -42,8 +44,15 @@ void PIOS_Board_Init(void) { FLASH_SetLatency(FLASH_Latency_2); /* Delay system */ - PIOS_DELAY_Init(); - + PIOS_DELAY_Init(); + + /* LEDs */ +#if defined(PIOS_INCLUDE_LED) + const struct pios_led_cfg * led_cfg = PIOS_BOARD_HW_DEFS_GetLedCfg(bdinfo->board_rev); + PIOS_Assert(led_cfg); + PIOS_LED_Init(led_cfg); +#endif /* PIOS_INCLUDE_LED */ + /* Initialize the PiOS library */ PIOS_GPIO_Init(); } From ac75dd7be1ba35cefe797431905eb2621e239f69 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 23 May 2012 00:46:19 -0400 Subject: [PATCH 6/6] Revert "bu: remove LED support from bootloader updaters" This reverts commit 7f03a7749219dcb5e6eb0deafe0fd19db030f4e1. --- flight/Bootloaders/BootloaderUpdater/main.c | 26 ++++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/flight/Bootloaders/BootloaderUpdater/main.c b/flight/Bootloaders/BootloaderUpdater/main.c index b7cef6a65..b7348dac4 100644 --- a/flight/Bootloaders/BootloaderUpdater/main.c +++ b/flight/Bootloaders/BootloaderUpdater/main.c @@ -34,7 +34,7 @@ /* Prototype of PIOS_Board_Init() function */ extern void PIOS_Board_Init(void); extern void FLASH_Download(); -void error(void); +void error(int); /* The ADDRESSES of the _binary_* symbols are the important * data. This is non-intuitive for _binary_size where you @@ -51,11 +51,14 @@ int main() { PIOS_SYS_Init(); PIOS_Board_Init(); + PIOS_LED_On(PIOS_LED_HEARTBEAT); + PIOS_DELAY_WaitmS(3000); + PIOS_LED_Off(PIOS_LED_HEARTBEAT); /// Self overwrite check uint32_t base_address = SCB->VTOR; if ((0x08000000 + embedded_image_size) > base_address) - error(); + error(PIOS_LED_HEARTBEAT); /// /* @@ -77,7 +80,7 @@ int main() { if ((pios_board_info_blob.magic != new_board_info_blob->magic) || (pios_board_info_blob.board_type != new_board_info_blob->board_type) || (pios_board_info_blob.board_rev != new_board_info_blob->board_rev)) { - error(); + error(PIOS_LED_HEARTBEAT); } /* Embedded bootloader looks like it's the right one for this HW, proceed... */ @@ -105,7 +108,7 @@ int main() { } if (fail == true) - error(); + error(PIOS_LED_HEARTBEAT); /// @@ -113,6 +116,7 @@ int main() { /// Bootloader programing for (uint32_t offset = 0; offset < embedded_image_size/sizeof(uint32_t); ++offset) { bool result = false; + PIOS_LED_Toggle(PIOS_LED_HEARTBEAT); for (uint8_t retry = 0; retry < MAX_WRI_RETRYS; ++retry) { if (result == false) { result = (FLASH_ProgramWord(0x08000000 + (offset * 4), embedded_image_start[offset]) @@ -120,9 +124,15 @@ int main() { } } if (result == false) - error(); + error(PIOS_LED_HEARTBEAT); } /// + for (uint8_t x = 0; x < 3; ++x) { + PIOS_LED_On(PIOS_LED_HEARTBEAT); + PIOS_DELAY_WaitmS(1000); + PIOS_LED_Off(PIOS_LED_HEARTBEAT); + PIOS_DELAY_WaitmS(1000); + } /// Invalidate the bootloader updater so we won't run /// the update again on the next power cycle. @@ -135,7 +145,11 @@ int main() { } -void error(void) { +void error(int led) { for (;;) { + PIOS_LED_On(led); + PIOS_DELAY_WaitmS(500); + PIOS_LED_Off(led); + PIOS_DELAY_WaitmS(500); } }