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;
/* Brings up System using CMSIS functions, enables the LEDs. */
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 */
PIOS_DELAY_Init();
for (uint32_t t = 0; t < 20000000; ++t) {
@ -66,6 +72,7 @@ int main() {
break;
}
}
GO_dfu=TRUE;
GO_dfu = GO_dfu;// OR with app boot request
if (GO_dfu == FALSE) {
jump_to_app();
@ -119,12 +126,14 @@ void process_spi_request(void) {
return;
}
switch (user_rx_v0.payload.user.t) {
case OPAHRS_MSG_V0_REQ_FWUP_VERIFY:
opahrs_msg_v0_init_user_tx(&user_tx_v0, OPAHRS_MSG_V0_RSP_FWUP_STATUS);
Fw_crc = crc_memory_calc();
lfsm_user_set_tx_v0(&user_tx_v0);
//boot_status=idle;
user_tx_v0.payload.user.v.rsp.fwup_status.status = boot_status;
break;
case OPAHRS_MSG_V0_REQ_RESET:
@ -132,7 +141,7 @@ void process_spi_request(void) {
PIOS_SYS_Reset();
break;
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);
user_tx_v0.payload.user.v.rsp.versions.bl_version = BOOTLOADER_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);
//PIOS_LED_Toggle(LED1);
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:
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
< START_OF_USER_CODE)) {
if (FLASH_ProgramWord(
@ -180,16 +195,20 @@ void process_spi_request(void) {
lfsm_user_set_tx_v0(&user_tx_v0);
break;
case OPAHRS_MSG_V0_REQ_FWUP_START:
FLASH_Unlock();
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) {
boot_status = started;
PIOS_LED_Off(LED1);
} else {
boot_status = start_failed;
break;
}
user_tx_v0.payload.user.v.rsp.fwup_status.status = boot_status;
lfsm_user_set_tx_v0(&user_tx_v0);
break;
case OPAHRS_MSG_V0_REQ_BOOT:
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 */
lfsm_user_set_rx_v0(&user_rx_v0);
lfsm_user_done();
return;
}
void jump_to_app() {
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>
/* OP Interface
*
* 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
PIOSSTM32F10X = $(PIOS)/STM32F10x
PIOSCOMMON = $(PIOS)/Common
PIOSBOARDS = $(PIOS)/Boards
APPLIBDIR = $(PIOSSTM32F10X)/Libraries
STMLIBDIR = $(APPLIBDIR)
STMSPDDIR = $(STMLIBDIR)/STM32F10x_StdPeriph_Driver
@ -137,7 +138,7 @@ SRC += $(PIOSSTM32F10X)/pios_spi.c
SRC += $(PIOSSTM32F10X)/pios_debug.c
SRC += $(PIOSSTM32F10X)/pios_gpio.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)
@ -151,7 +152,7 @@ SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c
## PIOS Hardware (Common)
#SRC += $(PIOSCOMMON)/pios_sdcard.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_bl_helper.c
@ -160,23 +161,21 @@ SRC += $(PIOSCOMMON)/printf-stdarg.c
## Libraries for flight calculations
SRC += $(FLIGHTLIB)/buffer.c
#SRC += $(FLIGHTLIB)/WorldMagModel.c
#SRC += $(FLIGHTLIB)/CoordinateConversions.c
## CMSIS for STM32
SRC += $(CMSISDIR)/core_cm3.c
SRC += $(CMSISDIR)/system_stm32f10x.c
## Used parts of the STM-Library
SRC += $(STMSPDSRCDIR)/stm32f10x_adc.c
#SRC += $(STMSPDSRCDIR)/stm32f10x_adc.c
SRC += $(STMSPDSRCDIR)/stm32f10x_bkp.c
SRC += $(STMSPDSRCDIR)/stm32f10x_crc.c
SRC += $(STMSPDSRCDIR)/stm32f10x_dac.c
#SRC += $(STMSPDSRCDIR)/stm32f10x_dac.c
SRC += $(STMSPDSRCDIR)/stm32f10x_dma.c
SRC += $(STMSPDSRCDIR)/stm32f10x_exti.c
SRC += $(STMSPDSRCDIR)/stm32f10x_flash.c
SRC += $(STMSPDSRCDIR)/stm32f10x_gpio.c
SRC += $(STMSPDSRCDIR)/stm32f10x_i2c.c
#SRC += $(STMSPDSRCDIR)/stm32f10x_i2c.c
SRC += $(STMSPDSRCDIR)/stm32f10x_pwr.c
SRC += $(STMSPDSRCDIR)/stm32f10x_rcc.c
SRC += $(STMSPDSRCDIR)/stm32f10x_rtc.c
@ -195,27 +194,6 @@ SRC += $(STMUSBSRCDIR)/usb_mem.c
SRC += $(STMUSBSRCDIR)/usb_regs.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).
# use file-extension c for "c-only"-files
## just for testing, timer.c could be compiled in thumb-mode too
@ -255,6 +233,7 @@ EXTRAINCDIRS += $(PIOSINC)
EXTRAINCDIRS += $(FLIGHTLIBINC)
EXTRAINCDIRS += $(PIOSSTM32F10X)
EXTRAINCDIRS += $(PIOSCOMMON)
EXTRAINCDIRS += $(PIOSBOARDS)
EXTRAINCDIRS += $(STMSPDINCDIR)
EXTRAINCDIRS += $(STMUSBINCDIR)
EXTRAINCDIRS += $(CMSISDIR)
@ -403,9 +382,9 @@ OOCD_CL=-d0
# interface and board/target settings (using the OOCD target-library here)
UNAME := $(shell uname)
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
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
# initialize
OOCD_CL+=-c init

View File

@ -30,8 +30,8 @@ typedef enum {
Last_operation_failed, //8
uploadingStarting, //9
outsideDevCapabilities, //10
CRC_Fail,
failed_jump,
CRC_Fail,//11
failed_jump,//12
} DFUStates;
/**************************************************/
/* OP_DFU commands */

View File

@ -53,7 +53,7 @@
#define PIOS_INCLUDE_OPAHRS
#define PIOS_INCLUDE_COM
//#define PIOS_INCLUDE_SDCARD
#define PIOS_INCLUDE_SETTINGS
//#define PIOS_INCLUDE_SETTINGS
//#define PIOS_INCLUDE_FREERTOS
#define PIOS_INCLUDE_GPIO
//#define PIOS_INCLUDE_EXTI

View File

@ -60,10 +60,10 @@ uint32_t sweep_steps2 = 100; // * 5 mS -> 500 mS
/* Extern variables ----------------------------------------------------------*/
DFUStates DeviceState;
uint8_t JumpToApp = FALSE;
uint8_t GO_dfu = false;
uint8_t USB_connected = false;
uint8_t User_DFU_request = false;
uint8_t Receive_Buffer[64];
uint8_t GO_dfu = FALSE;
uint8_t USB_connected = FALSE;
uint8_t User_DFU_request = FALSE;
static uint8_t mReceive_Buffer[64];
/* Private function prototypes -----------------------------------------------*/
uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count);
uint8_t processRX();
@ -81,7 +81,7 @@ int main() {
if (BSL_HOLD_STATE == 0)
USB_connected = TRUE;
GO_dfu = USB_connected | User_DFU_request;
GO_dfu = USB_connected || User_DFU_request;
if (GO_dfu == TRUE) {
PIOS_Board_Init();
PIOS_OPAHRS_Init();
@ -89,14 +89,14 @@ int main() {
STOPWATCH_Init(100);
USB_connected = TRUE;
PIOS_SPI_RC_PinSet(PIOS_OPAHRS_SPI, 0);
OPDfuIni(false);
//OPDfuIni(false);
} else
JumpToApp = TRUE;
STOPWATCH_Reset();
while (TRUE) {
if (JumpToApp == TRUE)
jump_to_app();
//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() {
uint32_t n = 0;
n = PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB);
if (n != 0) {
n = (n > 63) ? 63 : n;
for (int32_t x = 0; x < n; ++x) {
Receive_Buffer[x] = PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB);
while(PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB)>=63)
{
for (int32_t x = 0; x < 63; ++x) {
mReceive_Buffer[x] = PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB);
}
processComand(Receive_Buffer);
return TRUE;
//PIOS_IRQ_Enable();
processComand(mReceive_Buffer);
}
return FALSE;
return TRUE;
}

View File

@ -62,7 +62,7 @@ uint8_t Data2;
uint8_t Data3;
uint8_t offset = 0;
uint32_t aux;
uint8_t spi_dev_desc[200];
uint8_t spi_dev_desc[200]={0};
//Download vars
uint32_t downSizeOfLastPacket = 0;
uint32_t downPacketTotal = 0;
@ -81,6 +81,7 @@ void DataDownload(DownloadAction action) {
uint8_t packetSize;
uint32_t offset;
uint32_t partoffset;
SendBuffer[0] = 0x01;
SendBuffer[1] = Download;
SendBuffer[2] = downPacketCurrent >> 24;
@ -93,23 +94,23 @@ void DataDownload(DownloadAction action) {
packetSize = 14;
}
for (uint8_t x = 0; x < packetSize; ++x) {
offset = baseOfAdressType(downType) + (downPacketCurrent * 14 * 4)
+ (x * 4);
partoffset = (downPacketCurrent * 14 * 4) + (x * 4);
offset = baseOfAdressType(downType) + partoffset;
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:
if (downType == Descript) {
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;
SendBuffer[6 + (x * 4)] = spi_dev_desc[(uint8_t)partoffset];
SendBuffer[7 + (x * 4)] = spi_dev_desc[(uint8_t)partoffset + 1];
SendBuffer[8 + (x * 4)] = spi_dev_desc[(uint8_t)partoffset + 2];
SendBuffer[9 + (x * 4)] = spi_dev_desc[(uint8_t)partoffset + 3];
}
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);
EchoAnsFlag = (Command >> 6) & 0x01;
StartFlag = (Command >> 5) & 0x01;
Count = Receive_Buffer[COUNT] << 24;
Count += Receive_Buffer[COUNT + 1] << 16;
Count += Receive_Buffer[COUNT + 2] << 8;
Count += Receive_Buffer[COUNT + 3];
Data = Receive_Buffer[DATA] << 24;
Data += Receive_Buffer[DATA + 1] << 16;
Data += Receive_Buffer[DATA + 2] << 8;
Data += Receive_Buffer[DATA + 3];
Data0 = Receive_Buffer[DATA];
Data1 = Receive_Buffer[DATA + 1];
Data2 = Receive_Buffer[DATA + 2];
Data3 = Receive_Buffer[DATA + 3];
Count = xReceive_Buffer[COUNT] << 24;
Count += xReceive_Buffer[COUNT + 1] << 16;
Count += xReceive_Buffer[COUNT + 2] << 8;
Count += xReceive_Buffer[COUNT + 3];
Data = xReceive_Buffer[DATA] << 24;
Data += xReceive_Buffer[DATA + 1] << 16;
Data += xReceive_Buffer[DATA + 2] << 8;
Data += xReceive_Buffer[DATA + 3];
Data0 = xReceive_Buffer[DATA];
Data1 = xReceive_Buffer[DATA + 1];
Data2 = xReceive_Buffer[DATA + 2];
Data3 = xReceive_Buffer[DATA + 3];
Command = Command & 0b00011111;
if (EchoReqFlag == 1) {
@ -152,7 +154,7 @@ void processComand(uint8_t *Receive_Buffer) {
case EnterDFU:
if (((DeviceState == BLidle) && (Data0 < numberOfDevices))
|| (DeviceState == DFUidle)) {
if(Data0>0)
if (Data0 > 0)
OPDfuIni(TRUE);
DeviceState = DFUidle;
currentProgrammingDestination = devicesTable[Data0].programmingType;
@ -166,7 +168,7 @@ void processComand(uint8_t *Receive_Buffer) {
result = FLASH_Ini();
break;
case Remote_flash_via_spi:
//TODO result=SPI_FLASH();
result = TRUE;
break;
default:
DeviceState = Last_operation_failed;
@ -176,9 +178,6 @@ void processComand(uint8_t *Receive_Buffer) {
DeviceState = Last_operation_failed;
Aditionals = (uint32_t) Command;
}
} else {
DeviceState = outsideDevCapabilities;
Aditionals = (uint32_t) Command;
}
break;
case Upload:
@ -189,8 +188,8 @@ void processComand(uint8_t *Receive_Buffer) {
Next_Packet = 1;
Expected_CRC = Data2 << 24;
Expected_CRC += Data3 << 16;
Expected_CRC += Receive_Buffer[DATA + 4] << 8;
Expected_CRC += Receive_Buffer[DATA + 5];
Expected_CRC += xReceive_Buffer[DATA + 4] << 8;
Expected_CRC += xReceive_Buffer[DATA + 5];
SizeOfLastPacket = Data1;
if (isBiggerThanAvailable(TransferType, (SizeOfTransfer - 1)
@ -206,15 +205,23 @@ void processComand(uint8_t *Receive_Buffer) {
result = FLASH_Start();
break;
case Remote_flash_via_spi:
if (PIOS_OPAHRS_bl_FwupVerify(&rsp)
== OPAHRS_RESULT_OK) {
if (rsp.payload.user.v.rsp.fwup_status.status
== started) {
result = TRUE;
} else
result = FALSE;
} else
result = FALSE;
PIOS_OPAHRS_bl_FwupStart(&rsp);
result = FALSE;
for (int i = 0; i < 5; ++i) {
PIOS_DELAY_WaitmS(1000);
PIOS_OPAHRS_bl_resync();
if (PIOS_OPAHRS_bl_FwupStatus(&rsp)
== OPAHRS_RESULT_OK) {
if (rsp.payload.user.v.rsp.fwup_status.status
== started) {
result = TRUE;
break;
} else {
result = FALSE;
break;
}
}
}
break;
default:
@ -241,15 +248,15 @@ void processComand(uint8_t *Receive_Buffer) {
}
for (uint8_t x = 0; x < numberOfWords; ++x) {
offset = 4 * x;
Data = Receive_Buffer[DATA + offset] << 24;
Data += Receive_Buffer[DATA + 1 + offset] << 16;
Data += Receive_Buffer[DATA + 2 + offset] << 8;
Data += Receive_Buffer[DATA + 3 + offset];
Data = xReceive_Buffer[DATA + offset] << 24;
Data += xReceive_Buffer[DATA + 1 + offset] << 16;
Data += xReceive_Buffer[DATA + 2 + offset] << 8;
Data += xReceive_Buffer[DATA + 3 + offset];
aux = baseOfAdressType(TransferType) + (uint32_t)(Count
* 14 * 4 + x * 4);
uint8_t result = 0;
struct opahrs_msg_v0 rsp;
struct opahrs_msg_v0 req;
struct opahrs_msg_v0 req;
switch (currentProgrammingDestination) {
case Self_flash:
for (int retry = 0; retry < MAX_WRI_RETRYS; ++retry) {
@ -372,9 +379,10 @@ void processComand(uint8_t *Receive_Buffer) {
DeviceState = outsideDevCapabilities;
Aditionals = (uint32_t) Command;
} else
} else {
downPacketCurrent = 0;
DeviceState = downloading;
DeviceState = downloading;
}
} else {
DeviceState = Last_operation_failed;
Aditionals = (uint32_t) Command;
@ -441,7 +449,7 @@ void OPDfuIni(uint8_t discover) {
dev.FW_Crc = 0;
break;
}
PIOS_DELAY_WaitmS(500);
PIOS_DELAY_WaitmS(50);
}
if (found_spi_device == TRUE) {
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.FW_Crc = rsp.payload.user.v.rsp.versions.fw_version;
dev.devID = rsp.payload.user.v.rsp.versions.hw_version;
memcpy(spi_dev_desc,
rsp.payload.user.v.rsp.versions.description,
sizeof(rsp.payload.user.v.rsp.versions.description));
for(int x=0;x<200;++x)
{
spi_dev_desc[x]=(uint8_t)rsp.payload.user.v.rsp.versions.description[x];
}
if (PIOS_OPAHRS_bl_GetMemMap(&rsp) == OPAHRS_RESULT_OK) {
dev.readWriteFlags
= rsp.payload.user.v.rsp.mem_map.rw_flags;
@ -503,11 +513,15 @@ uint32_t CalcFirmCRC() {
return crc_memory_calc();
break;
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) {
return rsp.payload.user.v.rsp.versions.fw_version;
}
}
return 0;
break;
default: