mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-02-18 08:54:15 +01:00
OP-21/Flight Bootloader - Various fixes.
git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@1678 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
parent
35c36da060
commit
97b44ffb04
@ -56,6 +56,12 @@ int main() {
|
|||||||
uint8_t GO_dfu = false;
|
uint8_t GO_dfu = false;
|
||||||
/* Brings up System using CMSIS functions, enables the LEDs. */
|
/* Brings up System using CMSIS functions, enables the LEDs. */
|
||||||
PIOS_SYS_Init();
|
PIOS_SYS_Init();
|
||||||
|
/* Enable Prefetch Buffer */
|
||||||
|
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
|
||||||
|
|
||||||
|
/* Flash 2 wait state */
|
||||||
|
FLASH_SetLatency(FLASH_Latency_2);
|
||||||
|
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
|
||||||
/* Delay system */
|
/* Delay system */
|
||||||
PIOS_DELAY_Init();
|
PIOS_DELAY_Init();
|
||||||
for (uint32_t t = 0; t < 20000000; ++t) {
|
for (uint32_t t = 0; t < 20000000; ++t) {
|
||||||
@ -66,6 +72,7 @@ int main() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
GO_dfu=TRUE;
|
||||||
GO_dfu = GO_dfu;// OR with app boot request
|
GO_dfu = GO_dfu;// OR with app boot request
|
||||||
if (GO_dfu == FALSE) {
|
if (GO_dfu == FALSE) {
|
||||||
jump_to_app();
|
jump_to_app();
|
||||||
@ -119,12 +126,14 @@ void process_spi_request(void) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
switch (user_rx_v0.payload.user.t) {
|
switch (user_rx_v0.payload.user.t) {
|
||||||
|
|
||||||
case OPAHRS_MSG_V0_REQ_FWUP_VERIFY:
|
case OPAHRS_MSG_V0_REQ_FWUP_VERIFY:
|
||||||
opahrs_msg_v0_init_user_tx(&user_tx_v0, OPAHRS_MSG_V0_RSP_FWUP_STATUS);
|
opahrs_msg_v0_init_user_tx(&user_tx_v0, OPAHRS_MSG_V0_RSP_FWUP_STATUS);
|
||||||
Fw_crc = crc_memory_calc();
|
Fw_crc = crc_memory_calc();
|
||||||
lfsm_user_set_tx_v0(&user_tx_v0);
|
lfsm_user_set_tx_v0(&user_tx_v0);
|
||||||
|
//boot_status=idle;
|
||||||
user_tx_v0.payload.user.v.rsp.fwup_status.status = boot_status;
|
user_tx_v0.payload.user.v.rsp.fwup_status.status = boot_status;
|
||||||
break;
|
break;
|
||||||
case OPAHRS_MSG_V0_REQ_RESET:
|
case OPAHRS_MSG_V0_REQ_RESET:
|
||||||
@ -132,7 +141,7 @@ void process_spi_request(void) {
|
|||||||
PIOS_SYS_Reset();
|
PIOS_SYS_Reset();
|
||||||
break;
|
break;
|
||||||
case OPAHRS_MSG_V0_REQ_VERSIONS:
|
case OPAHRS_MSG_V0_REQ_VERSIONS:
|
||||||
PIOS_LED_Toggle(LED1);
|
//PIOS_LED_Toggle(LED1);
|
||||||
opahrs_msg_v0_init_user_tx(&user_tx_v0, OPAHRS_MSG_V0_RSP_VERSIONS);
|
opahrs_msg_v0_init_user_tx(&user_tx_v0, OPAHRS_MSG_V0_RSP_VERSIONS);
|
||||||
user_tx_v0.payload.user.v.rsp.versions.bl_version = BOOTLOADER_VERSION;
|
user_tx_v0.payload.user.v.rsp.versions.bl_version = BOOTLOADER_VERSION;
|
||||||
user_tx_v0.payload.user.v.rsp.versions.hw_version = HW_VERSION;
|
user_tx_v0.payload.user.v.rsp.versions.hw_version = HW_VERSION;
|
||||||
@ -162,8 +171,14 @@ void process_spi_request(void) {
|
|||||||
lfsm_user_set_tx_v0(&user_tx_v0);
|
lfsm_user_set_tx_v0(&user_tx_v0);
|
||||||
//PIOS_LED_Toggle(LED1);
|
//PIOS_LED_Toggle(LED1);
|
||||||
break;
|
break;
|
||||||
|
case OPAHRS_MSG_V0_REQ_FWUP_STATUS:
|
||||||
|
opahrs_msg_v0_init_user_tx(&user_tx_v0, OPAHRS_MSG_V0_RSP_FWUP_STATUS);
|
||||||
|
user_tx_v0.payload.user.v.rsp.fwup_status.status=boot_status;
|
||||||
|
lfsm_user_set_tx_v0(&user_tx_v0);
|
||||||
|
PIOS_LED_Toggle(LED1);
|
||||||
|
break;
|
||||||
case OPAHRS_MSG_V0_REQ_FWUP_DATA:
|
case OPAHRS_MSG_V0_REQ_FWUP_DATA:
|
||||||
opahrs_msg_v0_init_user_tx(&user_tx_v0, OPAHRS_MSG_V0_REQ_FWUP_DATA);
|
opahrs_msg_v0_init_user_tx(&user_tx_v0, OPAHRS_MSG_V0_RSP_FWUP_STATUS);
|
||||||
if (!(user_rx_v0.payload.user.v.req.fwup_data.adress
|
if (!(user_rx_v0.payload.user.v.req.fwup_data.adress
|
||||||
< START_OF_USER_CODE)) {
|
< START_OF_USER_CODE)) {
|
||||||
if (FLASH_ProgramWord(
|
if (FLASH_ProgramWord(
|
||||||
@ -180,16 +195,20 @@ void process_spi_request(void) {
|
|||||||
lfsm_user_set_tx_v0(&user_tx_v0);
|
lfsm_user_set_tx_v0(&user_tx_v0);
|
||||||
break;
|
break;
|
||||||
case OPAHRS_MSG_V0_REQ_FWUP_START:
|
case OPAHRS_MSG_V0_REQ_FWUP_START:
|
||||||
|
FLASH_Unlock();
|
||||||
opahrs_msg_v0_init_user_tx(&user_tx_v0, OPAHRS_MSG_V0_RSP_FWUP_STATUS);
|
opahrs_msg_v0_init_user_tx(&user_tx_v0, OPAHRS_MSG_V0_RSP_FWUP_STATUS);
|
||||||
|
user_tx_v0.payload.user.v.rsp.fwup_status.status = boot_status;
|
||||||
|
lfsm_user_set_tx_v0(&user_tx_v0);
|
||||||
|
PIOS_LED_On(LED1);
|
||||||
if (FLASH_Start() == TRUE) {
|
if (FLASH_Start() == TRUE) {
|
||||||
boot_status = started;
|
boot_status = started;
|
||||||
|
PIOS_LED_Off(LED1);
|
||||||
} else {
|
} else {
|
||||||
boot_status = start_failed;
|
boot_status = start_failed;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
user_tx_v0.payload.user.v.rsp.fwup_status.status = boot_status;
|
|
||||||
lfsm_user_set_tx_v0(&user_tx_v0);
|
|
||||||
break;
|
break;
|
||||||
case OPAHRS_MSG_V0_REQ_BOOT:
|
case OPAHRS_MSG_V0_REQ_BOOT:
|
||||||
PIOS_DELAY_WaitmS(user_rx_v0.payload.user.v.req.boot.boot_delay_in_ms);
|
PIOS_DELAY_WaitmS(user_rx_v0.payload.user.v.req.boot.boot_delay_in_ms);
|
||||||
@ -203,6 +222,7 @@ void process_spi_request(void) {
|
|||||||
/* Finished processing the received message, requeue it */
|
/* Finished processing the received message, requeue it */
|
||||||
lfsm_user_set_rx_v0(&user_rx_v0);
|
lfsm_user_set_rx_v0(&user_rx_v0);
|
||||||
lfsm_user_done();
|
lfsm_user_done();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
void jump_to_app() {
|
void jump_to_app() {
|
||||||
if (((*(__IO uint32_t*) START_OF_USER_CODE) & 0x2FFE0000) == 0x20000000) { /* Jump to user application */
|
if (((*(__IO uint32_t*) START_OF_USER_CODE) & 0x2FFE0000) == 0x20000000) { /* Jump to user application */
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
#include <pios_spi_priv.h>
|
#include <pios_spi_priv.h>
|
||||||
|
|
||||||
|
|
||||||
/* OP Interface
|
/* OP Interface
|
||||||
*
|
*
|
||||||
* NOTE: Leave this declared as const data so that it ends up in the
|
* NOTE: Leave this declared as const data so that it ends up in the
|
||||||
|
@ -93,6 +93,7 @@ PIOS = ../../PiOS
|
|||||||
PIOSINC = $(PIOS)/inc
|
PIOSINC = $(PIOS)/inc
|
||||||
PIOSSTM32F10X = $(PIOS)/STM32F10x
|
PIOSSTM32F10X = $(PIOS)/STM32F10x
|
||||||
PIOSCOMMON = $(PIOS)/Common
|
PIOSCOMMON = $(PIOS)/Common
|
||||||
|
PIOSBOARDS = $(PIOS)/Boards
|
||||||
APPLIBDIR = $(PIOSSTM32F10X)/Libraries
|
APPLIBDIR = $(PIOSSTM32F10X)/Libraries
|
||||||
STMLIBDIR = $(APPLIBDIR)
|
STMLIBDIR = $(APPLIBDIR)
|
||||||
STMSPDDIR = $(STMLIBDIR)/STM32F10x_StdPeriph_Driver
|
STMSPDDIR = $(STMLIBDIR)/STM32F10x_StdPeriph_Driver
|
||||||
@ -137,7 +138,7 @@ SRC += $(PIOSSTM32F10X)/pios_spi.c
|
|||||||
SRC += $(PIOSSTM32F10X)/pios_debug.c
|
SRC += $(PIOSSTM32F10X)/pios_debug.c
|
||||||
SRC += $(PIOSSTM32F10X)/pios_gpio.c
|
SRC += $(PIOSSTM32F10X)/pios_gpio.c
|
||||||
#SRC += $(PIOSSTM32F10X)/pios_exti.c
|
#SRC += $(PIOSSTM32F10X)/pios_exti.c
|
||||||
SRC += $(PIOSSTM32F10X)/pios_wdg.c
|
#SRC += $(PIOSSTM32F10X)/pios_wdg.c
|
||||||
|
|
||||||
|
|
||||||
# PIOS USB related files (seperated to make code maintenance more easy)
|
# PIOS USB related files (seperated to make code maintenance more easy)
|
||||||
@ -151,7 +152,7 @@ SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c
|
|||||||
## PIOS Hardware (Common)
|
## PIOS Hardware (Common)
|
||||||
#SRC += $(PIOSCOMMON)/pios_sdcard.c
|
#SRC += $(PIOSCOMMON)/pios_sdcard.c
|
||||||
SRC += $(PIOSCOMMON)/pios_com.c
|
SRC += $(PIOSCOMMON)/pios_com.c
|
||||||
SRC += $(PIOSCOMMON)/pios_bmp085.c
|
#SRC += $(PIOSCOMMON)/pios_bmp085.c
|
||||||
SRC += $(PIOSCOMMON)/pios_opahrs_v0.c
|
SRC += $(PIOSCOMMON)/pios_opahrs_v0.c
|
||||||
SRC += $(PIOSCOMMON)/pios_bl_helper.c
|
SRC += $(PIOSCOMMON)/pios_bl_helper.c
|
||||||
|
|
||||||
@ -160,23 +161,21 @@ SRC += $(PIOSCOMMON)/printf-stdarg.c
|
|||||||
|
|
||||||
## Libraries for flight calculations
|
## Libraries for flight calculations
|
||||||
SRC += $(FLIGHTLIB)/buffer.c
|
SRC += $(FLIGHTLIB)/buffer.c
|
||||||
#SRC += $(FLIGHTLIB)/WorldMagModel.c
|
|
||||||
#SRC += $(FLIGHTLIB)/CoordinateConversions.c
|
|
||||||
|
|
||||||
## CMSIS for STM32
|
## CMSIS for STM32
|
||||||
SRC += $(CMSISDIR)/core_cm3.c
|
SRC += $(CMSISDIR)/core_cm3.c
|
||||||
SRC += $(CMSISDIR)/system_stm32f10x.c
|
SRC += $(CMSISDIR)/system_stm32f10x.c
|
||||||
|
|
||||||
## Used parts of the STM-Library
|
## Used parts of the STM-Library
|
||||||
SRC += $(STMSPDSRCDIR)/stm32f10x_adc.c
|
#SRC += $(STMSPDSRCDIR)/stm32f10x_adc.c
|
||||||
SRC += $(STMSPDSRCDIR)/stm32f10x_bkp.c
|
SRC += $(STMSPDSRCDIR)/stm32f10x_bkp.c
|
||||||
SRC += $(STMSPDSRCDIR)/stm32f10x_crc.c
|
SRC += $(STMSPDSRCDIR)/stm32f10x_crc.c
|
||||||
SRC += $(STMSPDSRCDIR)/stm32f10x_dac.c
|
#SRC += $(STMSPDSRCDIR)/stm32f10x_dac.c
|
||||||
SRC += $(STMSPDSRCDIR)/stm32f10x_dma.c
|
SRC += $(STMSPDSRCDIR)/stm32f10x_dma.c
|
||||||
SRC += $(STMSPDSRCDIR)/stm32f10x_exti.c
|
SRC += $(STMSPDSRCDIR)/stm32f10x_exti.c
|
||||||
SRC += $(STMSPDSRCDIR)/stm32f10x_flash.c
|
SRC += $(STMSPDSRCDIR)/stm32f10x_flash.c
|
||||||
SRC += $(STMSPDSRCDIR)/stm32f10x_gpio.c
|
SRC += $(STMSPDSRCDIR)/stm32f10x_gpio.c
|
||||||
SRC += $(STMSPDSRCDIR)/stm32f10x_i2c.c
|
#SRC += $(STMSPDSRCDIR)/stm32f10x_i2c.c
|
||||||
SRC += $(STMSPDSRCDIR)/stm32f10x_pwr.c
|
SRC += $(STMSPDSRCDIR)/stm32f10x_pwr.c
|
||||||
SRC += $(STMSPDSRCDIR)/stm32f10x_rcc.c
|
SRC += $(STMSPDSRCDIR)/stm32f10x_rcc.c
|
||||||
SRC += $(STMSPDSRCDIR)/stm32f10x_rtc.c
|
SRC += $(STMSPDSRCDIR)/stm32f10x_rtc.c
|
||||||
@ -195,27 +194,6 @@ SRC += $(STMUSBSRCDIR)/usb_mem.c
|
|||||||
SRC += $(STMUSBSRCDIR)/usb_regs.c
|
SRC += $(STMUSBSRCDIR)/usb_regs.c
|
||||||
SRC += $(STMUSBSRCDIR)/usb_sil.c
|
SRC += $(STMUSBSRCDIR)/usb_sil.c
|
||||||
|
|
||||||
## RTOS
|
|
||||||
#SRC += $(RTOSSRCDIR)/list.c
|
|
||||||
#SRC += $(RTOSSRCDIR)/queue.c
|
|
||||||
#SRC += $(RTOSSRCDIR)/tasks.c
|
|
||||||
|
|
||||||
## RTOS Portable
|
|
||||||
#SRC += $(RTOSSRCDIR)/portable/GCC/ARM_CM3/port.c
|
|
||||||
#SRC += $(RTOSSRCDIR)/portable/MemMang/heap_2.c
|
|
||||||
|
|
||||||
## Dosfs file system
|
|
||||||
#SRC += $(DOSFSDIR)/dosfs.c
|
|
||||||
#SRC += $(DOSFSDIR)/dfs_sdcard.c
|
|
||||||
|
|
||||||
## Mass Storage Device
|
|
||||||
#SRC += $(MSDDIR)/msd.c
|
|
||||||
#SRC += $(MSDDIR)/msd_bot.c
|
|
||||||
#SRC += $(MSDDIR)/msd_desc.c
|
|
||||||
#SRC += $(MSDDIR)/msd_memory.c
|
|
||||||
#SRC += $(MSDDIR)/msd_scsi.c
|
|
||||||
#SRC += $(MSDDIR)/msd_scsi_data.c
|
|
||||||
|
|
||||||
# List C source files here which must be compiled in ARM-Mode (no -mthumb).
|
# List C source files here which must be compiled in ARM-Mode (no -mthumb).
|
||||||
# use file-extension c for "c-only"-files
|
# use file-extension c for "c-only"-files
|
||||||
## just for testing, timer.c could be compiled in thumb-mode too
|
## just for testing, timer.c could be compiled in thumb-mode too
|
||||||
@ -255,6 +233,7 @@ EXTRAINCDIRS += $(PIOSINC)
|
|||||||
EXTRAINCDIRS += $(FLIGHTLIBINC)
|
EXTRAINCDIRS += $(FLIGHTLIBINC)
|
||||||
EXTRAINCDIRS += $(PIOSSTM32F10X)
|
EXTRAINCDIRS += $(PIOSSTM32F10X)
|
||||||
EXTRAINCDIRS += $(PIOSCOMMON)
|
EXTRAINCDIRS += $(PIOSCOMMON)
|
||||||
|
EXTRAINCDIRS += $(PIOSBOARDS)
|
||||||
EXTRAINCDIRS += $(STMSPDINCDIR)
|
EXTRAINCDIRS += $(STMSPDINCDIR)
|
||||||
EXTRAINCDIRS += $(STMUSBINCDIR)
|
EXTRAINCDIRS += $(STMUSBINCDIR)
|
||||||
EXTRAINCDIRS += $(CMSISDIR)
|
EXTRAINCDIRS += $(CMSISDIR)
|
||||||
@ -403,9 +382,9 @@ OOCD_CL=-d0
|
|||||||
# interface and board/target settings (using the OOCD target-library here)
|
# interface and board/target settings (using the OOCD target-library here)
|
||||||
UNAME := $(shell uname)
|
UNAME := $(shell uname)
|
||||||
ifeq ($(UNAME), Darwin)
|
ifeq ($(UNAME), Darwin)
|
||||||
OOCD_CL+=-f ../Project/OpenOCD/floss-jtag.openpilot.osx.cfg -f ../Project/OpenOCD/stm32.cfg
|
OOCD_CL+=-f ../../Project/OpenOCD/floss-jtag.openpilot.osx.cfg -f ../../Project/OpenOCD/stm32.cfg
|
||||||
else
|
else
|
||||||
OOCD_CL+=-f ../Project/OpenOCD/floss-jtag.openpilot.cfg -f ../Project/OpenOCD/stm32.cfg
|
OOCD_CL+=-f ../../Project/OpenOCD/floss-jtag.openpilot.cfg -f ../../Project/OpenOCD/stm32.cfg
|
||||||
endif
|
endif
|
||||||
# initialize
|
# initialize
|
||||||
OOCD_CL+=-c init
|
OOCD_CL+=-c init
|
||||||
|
@ -30,8 +30,8 @@ typedef enum {
|
|||||||
Last_operation_failed, //8
|
Last_operation_failed, //8
|
||||||
uploadingStarting, //9
|
uploadingStarting, //9
|
||||||
outsideDevCapabilities, //10
|
outsideDevCapabilities, //10
|
||||||
CRC_Fail,
|
CRC_Fail,//11
|
||||||
failed_jump,
|
failed_jump,//12
|
||||||
} DFUStates;
|
} DFUStates;
|
||||||
/**************************************************/
|
/**************************************************/
|
||||||
/* OP_DFU commands */
|
/* OP_DFU commands */
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
#define PIOS_INCLUDE_OPAHRS
|
#define PIOS_INCLUDE_OPAHRS
|
||||||
#define PIOS_INCLUDE_COM
|
#define PIOS_INCLUDE_COM
|
||||||
//#define PIOS_INCLUDE_SDCARD
|
//#define PIOS_INCLUDE_SDCARD
|
||||||
#define PIOS_INCLUDE_SETTINGS
|
//#define PIOS_INCLUDE_SETTINGS
|
||||||
//#define PIOS_INCLUDE_FREERTOS
|
//#define PIOS_INCLUDE_FREERTOS
|
||||||
#define PIOS_INCLUDE_GPIO
|
#define PIOS_INCLUDE_GPIO
|
||||||
//#define PIOS_INCLUDE_EXTI
|
//#define PIOS_INCLUDE_EXTI
|
||||||
|
@ -60,10 +60,10 @@ uint32_t sweep_steps2 = 100; // * 5 mS -> 500 mS
|
|||||||
/* Extern variables ----------------------------------------------------------*/
|
/* Extern variables ----------------------------------------------------------*/
|
||||||
DFUStates DeviceState;
|
DFUStates DeviceState;
|
||||||
uint8_t JumpToApp = FALSE;
|
uint8_t JumpToApp = FALSE;
|
||||||
uint8_t GO_dfu = false;
|
uint8_t GO_dfu = FALSE;
|
||||||
uint8_t USB_connected = false;
|
uint8_t USB_connected = FALSE;
|
||||||
uint8_t User_DFU_request = false;
|
uint8_t User_DFU_request = FALSE;
|
||||||
uint8_t Receive_Buffer[64];
|
static uint8_t mReceive_Buffer[64];
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count);
|
uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count);
|
||||||
uint8_t processRX();
|
uint8_t processRX();
|
||||||
@ -81,7 +81,7 @@ int main() {
|
|||||||
if (BSL_HOLD_STATE == 0)
|
if (BSL_HOLD_STATE == 0)
|
||||||
USB_connected = TRUE;
|
USB_connected = TRUE;
|
||||||
|
|
||||||
GO_dfu = USB_connected | User_DFU_request;
|
GO_dfu = USB_connected || User_DFU_request;
|
||||||
if (GO_dfu == TRUE) {
|
if (GO_dfu == TRUE) {
|
||||||
PIOS_Board_Init();
|
PIOS_Board_Init();
|
||||||
PIOS_OPAHRS_Init();
|
PIOS_OPAHRS_Init();
|
||||||
@ -89,14 +89,14 @@ int main() {
|
|||||||
STOPWATCH_Init(100);
|
STOPWATCH_Init(100);
|
||||||
USB_connected = TRUE;
|
USB_connected = TRUE;
|
||||||
PIOS_SPI_RC_PinSet(PIOS_OPAHRS_SPI, 0);
|
PIOS_SPI_RC_PinSet(PIOS_OPAHRS_SPI, 0);
|
||||||
OPDfuIni(false);
|
//OPDfuIni(false);
|
||||||
|
|
||||||
} else
|
} else
|
||||||
JumpToApp = TRUE;
|
JumpToApp = TRUE;
|
||||||
|
|
||||||
STOPWATCH_Reset();
|
STOPWATCH_Reset();
|
||||||
|
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
|
|
||||||
if (JumpToApp == TRUE)
|
if (JumpToApp == TRUE)
|
||||||
jump_to_app();
|
jump_to_app();
|
||||||
//pwm_period = 50; // *100 uS -> 5 mS
|
//pwm_period = 50; // *100 uS -> 5 mS
|
||||||
@ -193,17 +193,13 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t processRX() {
|
uint8_t processRX() {
|
||||||
uint32_t n = 0;
|
while(PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB)>=63)
|
||||||
|
{
|
||||||
n = PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB);
|
for (int32_t x = 0; x < 63; ++x) {
|
||||||
if (n != 0) {
|
mReceive_Buffer[x] = PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB);
|
||||||
n = (n > 63) ? 63 : n;
|
|
||||||
|
|
||||||
for (int32_t x = 0; x < n; ++x) {
|
|
||||||
Receive_Buffer[x] = PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB);
|
|
||||||
}
|
}
|
||||||
processComand(Receive_Buffer);
|
//PIOS_IRQ_Enable();
|
||||||
return TRUE;
|
processComand(mReceive_Buffer);
|
||||||
}
|
}
|
||||||
return FALSE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ uint8_t Data2;
|
|||||||
uint8_t Data3;
|
uint8_t Data3;
|
||||||
uint8_t offset = 0;
|
uint8_t offset = 0;
|
||||||
uint32_t aux;
|
uint32_t aux;
|
||||||
uint8_t spi_dev_desc[200];
|
uint8_t spi_dev_desc[200]={0};
|
||||||
//Download vars
|
//Download vars
|
||||||
uint32_t downSizeOfLastPacket = 0;
|
uint32_t downSizeOfLastPacket = 0;
|
||||||
uint32_t downPacketTotal = 0;
|
uint32_t downPacketTotal = 0;
|
||||||
@ -81,6 +81,7 @@ void DataDownload(DownloadAction action) {
|
|||||||
|
|
||||||
uint8_t packetSize;
|
uint8_t packetSize;
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
|
uint32_t partoffset;
|
||||||
SendBuffer[0] = 0x01;
|
SendBuffer[0] = 0x01;
|
||||||
SendBuffer[1] = Download;
|
SendBuffer[1] = Download;
|
||||||
SendBuffer[2] = downPacketCurrent >> 24;
|
SendBuffer[2] = downPacketCurrent >> 24;
|
||||||
@ -93,23 +94,23 @@ void DataDownload(DownloadAction action) {
|
|||||||
packetSize = 14;
|
packetSize = 14;
|
||||||
}
|
}
|
||||||
for (uint8_t x = 0; x < packetSize; ++x) {
|
for (uint8_t x = 0; x < packetSize; ++x) {
|
||||||
offset = baseOfAdressType(downType) + (downPacketCurrent * 14 * 4)
|
partoffset = (downPacketCurrent * 14 * 4) + (x * 4);
|
||||||
+ (x * 4);
|
offset = baseOfAdressType(downType) + partoffset;
|
||||||
switch (currentProgrammingDestination) {
|
switch (currentProgrammingDestination) {
|
||||||
case Self_flash:
|
|
||||||
SendBuffer[6 + (x * 4)] = spi_dev_desc[offset];
|
|
||||||
SendBuffer[7 + (x * 4)] = spi_dev_desc[offset + 1];
|
|
||||||
SendBuffer[8 + (x * 4)] = spi_dev_desc[offset + 2];
|
|
||||||
SendBuffer[9 + (x * 4)] = spi_dev_desc[offset + 3];
|
|
||||||
break;
|
|
||||||
case Remote_flash_via_spi:
|
case Remote_flash_via_spi:
|
||||||
if (downType == Descript) {
|
if (downType == Descript) {
|
||||||
SendBuffer[6 + (x * 4)] = *FLASH_If_Read(offset);
|
SendBuffer[6 + (x * 4)] = spi_dev_desc[(uint8_t)partoffset];
|
||||||
SendBuffer[7 + (x * 4)] = *FLASH_If_Read(offset + 1);
|
SendBuffer[7 + (x * 4)] = spi_dev_desc[(uint8_t)partoffset + 1];
|
||||||
SendBuffer[8 + (x * 4)] = *FLASH_If_Read(offset + 2);
|
SendBuffer[8 + (x * 4)] = spi_dev_desc[(uint8_t)partoffset + 2];
|
||||||
SendBuffer[9 + (x * 4)] = *FLASH_If_Read(offset + 3);
|
SendBuffer[9 + (x * 4)] = spi_dev_desc[(uint8_t)partoffset + 3];
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case Self_flash:
|
||||||
|
SendBuffer[6 + (x * 4)] = *FLASH_If_Read(offset);
|
||||||
|
SendBuffer[7 + (x * 4)] = *FLASH_If_Read(offset + 1);
|
||||||
|
SendBuffer[8 + (x * 4)] = *FLASH_If_Read(offset + 2);
|
||||||
|
SendBuffer[9 + (x * 4)] = *FLASH_If_Read(offset + 3);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -125,24 +126,25 @@ void DataDownload(DownloadAction action) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void processComand(uint8_t *Receive_Buffer) {
|
void processComand(uint8_t *xReceive_Buffer) {
|
||||||
|
|
||||||
Command = Receive_Buffer[COMMAND];
|
Command = xReceive_Buffer[COMMAND];
|
||||||
EchoReqFlag = (Command >> 7);
|
EchoReqFlag = (Command >> 7);
|
||||||
EchoAnsFlag = (Command >> 6) & 0x01;
|
EchoAnsFlag = (Command >> 6) & 0x01;
|
||||||
StartFlag = (Command >> 5) & 0x01;
|
StartFlag = (Command >> 5) & 0x01;
|
||||||
Count = Receive_Buffer[COUNT] << 24;
|
Count = xReceive_Buffer[COUNT] << 24;
|
||||||
Count += Receive_Buffer[COUNT + 1] << 16;
|
Count += xReceive_Buffer[COUNT + 1] << 16;
|
||||||
Count += Receive_Buffer[COUNT + 2] << 8;
|
Count += xReceive_Buffer[COUNT + 2] << 8;
|
||||||
Count += Receive_Buffer[COUNT + 3];
|
Count += xReceive_Buffer[COUNT + 3];
|
||||||
Data = Receive_Buffer[DATA] << 24;
|
|
||||||
Data += Receive_Buffer[DATA + 1] << 16;
|
Data = xReceive_Buffer[DATA] << 24;
|
||||||
Data += Receive_Buffer[DATA + 2] << 8;
|
Data += xReceive_Buffer[DATA + 1] << 16;
|
||||||
Data += Receive_Buffer[DATA + 3];
|
Data += xReceive_Buffer[DATA + 2] << 8;
|
||||||
Data0 = Receive_Buffer[DATA];
|
Data += xReceive_Buffer[DATA + 3];
|
||||||
Data1 = Receive_Buffer[DATA + 1];
|
Data0 = xReceive_Buffer[DATA];
|
||||||
Data2 = Receive_Buffer[DATA + 2];
|
Data1 = xReceive_Buffer[DATA + 1];
|
||||||
Data3 = Receive_Buffer[DATA + 3];
|
Data2 = xReceive_Buffer[DATA + 2];
|
||||||
|
Data3 = xReceive_Buffer[DATA + 3];
|
||||||
Command = Command & 0b00011111;
|
Command = Command & 0b00011111;
|
||||||
|
|
||||||
if (EchoReqFlag == 1) {
|
if (EchoReqFlag == 1) {
|
||||||
@ -152,7 +154,7 @@ void processComand(uint8_t *Receive_Buffer) {
|
|||||||
case EnterDFU:
|
case EnterDFU:
|
||||||
if (((DeviceState == BLidle) && (Data0 < numberOfDevices))
|
if (((DeviceState == BLidle) && (Data0 < numberOfDevices))
|
||||||
|| (DeviceState == DFUidle)) {
|
|| (DeviceState == DFUidle)) {
|
||||||
if(Data0>0)
|
if (Data0 > 0)
|
||||||
OPDfuIni(TRUE);
|
OPDfuIni(TRUE);
|
||||||
DeviceState = DFUidle;
|
DeviceState = DFUidle;
|
||||||
currentProgrammingDestination = devicesTable[Data0].programmingType;
|
currentProgrammingDestination = devicesTable[Data0].programmingType;
|
||||||
@ -166,7 +168,7 @@ void processComand(uint8_t *Receive_Buffer) {
|
|||||||
result = FLASH_Ini();
|
result = FLASH_Ini();
|
||||||
break;
|
break;
|
||||||
case Remote_flash_via_spi:
|
case Remote_flash_via_spi:
|
||||||
//TODO result=SPI_FLASH();
|
result = TRUE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DeviceState = Last_operation_failed;
|
DeviceState = Last_operation_failed;
|
||||||
@ -176,9 +178,6 @@ void processComand(uint8_t *Receive_Buffer) {
|
|||||||
DeviceState = Last_operation_failed;
|
DeviceState = Last_operation_failed;
|
||||||
Aditionals = (uint32_t) Command;
|
Aditionals = (uint32_t) Command;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
DeviceState = outsideDevCapabilities;
|
|
||||||
Aditionals = (uint32_t) Command;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Upload:
|
case Upload:
|
||||||
@ -189,8 +188,8 @@ void processComand(uint8_t *Receive_Buffer) {
|
|||||||
Next_Packet = 1;
|
Next_Packet = 1;
|
||||||
Expected_CRC = Data2 << 24;
|
Expected_CRC = Data2 << 24;
|
||||||
Expected_CRC += Data3 << 16;
|
Expected_CRC += Data3 << 16;
|
||||||
Expected_CRC += Receive_Buffer[DATA + 4] << 8;
|
Expected_CRC += xReceive_Buffer[DATA + 4] << 8;
|
||||||
Expected_CRC += Receive_Buffer[DATA + 5];
|
Expected_CRC += xReceive_Buffer[DATA + 5];
|
||||||
SizeOfLastPacket = Data1;
|
SizeOfLastPacket = Data1;
|
||||||
|
|
||||||
if (isBiggerThanAvailable(TransferType, (SizeOfTransfer - 1)
|
if (isBiggerThanAvailable(TransferType, (SizeOfTransfer - 1)
|
||||||
@ -206,15 +205,23 @@ void processComand(uint8_t *Receive_Buffer) {
|
|||||||
result = FLASH_Start();
|
result = FLASH_Start();
|
||||||
break;
|
break;
|
||||||
case Remote_flash_via_spi:
|
case Remote_flash_via_spi:
|
||||||
if (PIOS_OPAHRS_bl_FwupVerify(&rsp)
|
PIOS_OPAHRS_bl_FwupStart(&rsp);
|
||||||
== OPAHRS_RESULT_OK) {
|
result = FALSE;
|
||||||
if (rsp.payload.user.v.rsp.fwup_status.status
|
for (int i = 0; i < 5; ++i) {
|
||||||
== started) {
|
PIOS_DELAY_WaitmS(1000);
|
||||||
result = TRUE;
|
PIOS_OPAHRS_bl_resync();
|
||||||
} else
|
if (PIOS_OPAHRS_bl_FwupStatus(&rsp)
|
||||||
result = FALSE;
|
== OPAHRS_RESULT_OK) {
|
||||||
} else
|
if (rsp.payload.user.v.rsp.fwup_status.status
|
||||||
result = FALSE;
|
== started) {
|
||||||
|
result = TRUE;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
result = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
||||||
@ -241,15 +248,15 @@ void processComand(uint8_t *Receive_Buffer) {
|
|||||||
}
|
}
|
||||||
for (uint8_t x = 0; x < numberOfWords; ++x) {
|
for (uint8_t x = 0; x < numberOfWords; ++x) {
|
||||||
offset = 4 * x;
|
offset = 4 * x;
|
||||||
Data = Receive_Buffer[DATA + offset] << 24;
|
Data = xReceive_Buffer[DATA + offset] << 24;
|
||||||
Data += Receive_Buffer[DATA + 1 + offset] << 16;
|
Data += xReceive_Buffer[DATA + 1 + offset] << 16;
|
||||||
Data += Receive_Buffer[DATA + 2 + offset] << 8;
|
Data += xReceive_Buffer[DATA + 2 + offset] << 8;
|
||||||
Data += Receive_Buffer[DATA + 3 + offset];
|
Data += xReceive_Buffer[DATA + 3 + offset];
|
||||||
aux = baseOfAdressType(TransferType) + (uint32_t)(Count
|
aux = baseOfAdressType(TransferType) + (uint32_t)(Count
|
||||||
* 14 * 4 + x * 4);
|
* 14 * 4 + x * 4);
|
||||||
uint8_t result = 0;
|
uint8_t result = 0;
|
||||||
struct opahrs_msg_v0 rsp;
|
struct opahrs_msg_v0 rsp;
|
||||||
struct opahrs_msg_v0 req;
|
struct opahrs_msg_v0 req;
|
||||||
switch (currentProgrammingDestination) {
|
switch (currentProgrammingDestination) {
|
||||||
case Self_flash:
|
case Self_flash:
|
||||||
for (int retry = 0; retry < MAX_WRI_RETRYS; ++retry) {
|
for (int retry = 0; retry < MAX_WRI_RETRYS; ++retry) {
|
||||||
@ -372,9 +379,10 @@ void processComand(uint8_t *Receive_Buffer) {
|
|||||||
DeviceState = outsideDevCapabilities;
|
DeviceState = outsideDevCapabilities;
|
||||||
Aditionals = (uint32_t) Command;
|
Aditionals = (uint32_t) Command;
|
||||||
|
|
||||||
} else
|
} else {
|
||||||
downPacketCurrent = 0;
|
downPacketCurrent = 0;
|
||||||
DeviceState = downloading;
|
DeviceState = downloading;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
DeviceState = Last_operation_failed;
|
DeviceState = Last_operation_failed;
|
||||||
Aditionals = (uint32_t) Command;
|
Aditionals = (uint32_t) Command;
|
||||||
@ -441,7 +449,7 @@ void OPDfuIni(uint8_t discover) {
|
|||||||
dev.FW_Crc = 0;
|
dev.FW_Crc = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
PIOS_DELAY_WaitmS(500);
|
PIOS_DELAY_WaitmS(50);
|
||||||
}
|
}
|
||||||
if (found_spi_device == TRUE) {
|
if (found_spi_device == TRUE) {
|
||||||
struct opahrs_msg_v0 rsp;
|
struct opahrs_msg_v0 rsp;
|
||||||
@ -450,9 +458,11 @@ void OPDfuIni(uint8_t discover) {
|
|||||||
dev.BL_Version = rsp.payload.user.v.rsp.versions.bl_version;
|
dev.BL_Version = rsp.payload.user.v.rsp.versions.bl_version;
|
||||||
dev.FW_Crc = rsp.payload.user.v.rsp.versions.fw_version;
|
dev.FW_Crc = rsp.payload.user.v.rsp.versions.fw_version;
|
||||||
dev.devID = rsp.payload.user.v.rsp.versions.hw_version;
|
dev.devID = rsp.payload.user.v.rsp.versions.hw_version;
|
||||||
memcpy(spi_dev_desc,
|
for(int x=0;x<200;++x)
|
||||||
rsp.payload.user.v.rsp.versions.description,
|
{
|
||||||
sizeof(rsp.payload.user.v.rsp.versions.description));
|
spi_dev_desc[x]=(uint8_t)rsp.payload.user.v.rsp.versions.description[x];
|
||||||
|
|
||||||
|
}
|
||||||
if (PIOS_OPAHRS_bl_GetMemMap(&rsp) == OPAHRS_RESULT_OK) {
|
if (PIOS_OPAHRS_bl_GetMemMap(&rsp) == OPAHRS_RESULT_OK) {
|
||||||
dev.readWriteFlags
|
dev.readWriteFlags
|
||||||
= rsp.payload.user.v.rsp.mem_map.rw_flags;
|
= rsp.payload.user.v.rsp.mem_map.rw_flags;
|
||||||
@ -503,11 +513,15 @@ uint32_t CalcFirmCRC() {
|
|||||||
return crc_memory_calc();
|
return crc_memory_calc();
|
||||||
break;
|
break;
|
||||||
case Remote_flash_via_spi:
|
case Remote_flash_via_spi:
|
||||||
if (PIOS_OPAHRS_bl_FwupVerify(&rsp) == OPAHRS_RESULT_OK) {
|
PIOS_OPAHRS_bl_FwupVerify(&rsp);
|
||||||
|
for (int i = 0; i < 5; ++i) {
|
||||||
|
PIOS_DELAY_WaitmS(1000);
|
||||||
|
PIOS_OPAHRS_bl_resync();
|
||||||
if (PIOS_OPAHRS_bl_GetVersions(&rsp) == OPAHRS_RESULT_OK) {
|
if (PIOS_OPAHRS_bl_GetVersions(&rsp) == OPAHRS_RESULT_OK) {
|
||||||
return rsp.payload.user.v.rsp.versions.fw_version;
|
return rsp.payload.user.v.rsp.versions.fw_version;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user