1
0
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:
zedamota 2010-09-18 00:46:34 +00:00 committed by zedamota
parent 35c36da060
commit 97b44ffb04
7 changed files with 121 additions and 111 deletions

View File

@ -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 */

View File

@ -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

View File

@ -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

View File

@ -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 */

View File

@ -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

View File

@ -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;
} }

View File

@ -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: