From 14ef24a3de382304e84933eb275df15a55788b9d Mon Sep 17 00:00:00 2001 From: zedamota Date: Tue, 21 Dec 2010 17:25:24 +0000 Subject: [PATCH] OP-21/Bootloader - Maximize flash space available for user code. Bring back delay on HID send (board->pc) it still hangs when blasted with data. AHRS is now Readable. git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@2263 ebee16cc-31ac-478f-84a7-5cbb03baadba --- flight/Bootloaders/AHRS/main.c | 13 +++-- flight/Bootloaders/OpenPilot/inc/op_dfu.h | 1 + flight/Bootloaders/OpenPilot/op_dfu.c | 47 +++++++++++++++---- flight/PiOS/Boards/STM32103CB_AHRS.h | 2 +- flight/PiOS/Boards/STM3210E_OP.h | 3 +- flight/PiOS/Common/pios_opahrs_v0.c | 18 +++++++ flight/PiOS/STM32F10x/link_stm32f10x_HD_BL.ld | 2 +- flight/PiOS/inc/pios_opahrs.h | 1 + flight/PiOS/inc/pios_opahrs_proto.h | 19 ++++++-- .../experimental/USB_UPLOAD_TOOL/op_dfu.cpp | 2 +- 10 files changed, 86 insertions(+), 22 deletions(-) diff --git a/flight/Bootloaders/AHRS/main.c b/flight/Bootloaders/AHRS/main.c index 401c2762f..bc0a3e00d 100644 --- a/flight/Bootloaders/AHRS/main.c +++ b/flight/Bootloaders/AHRS/main.c @@ -161,9 +161,7 @@ void process_spi_request(void) { 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; - user_tx_v0.payload.user.v.rsp.versions.fw_version = Fw_crc; - read_description( - (uint8_t *) &(user_tx_v0.payload.user.v.rsp.versions.description)); + user_tx_v0.payload.user.v.rsp.versions.fw_crc = Fw_crc; lfsm_user_set_tx_v0(&user_tx_v0); break; case OPAHRS_MSG_V0_REQ_MEM_MAP: @@ -213,6 +211,15 @@ void process_spi_request(void) { 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_FWDN_DATA: + opahrs_msg_v0_init_user_tx(&user_tx_v0, OPAHRS_MSG_V0_RSP_FWDN_DATA); + uint32_t adr=user_rx_v0.payload.user.v.req.fwdn_data.adress; + for(uint8_t x=0;x<4;++x) + { + user_tx_v0.payload.user.v.rsp.fw_dn.data[x]=*FLASH_If_Read(adr+x); + } + 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); diff --git a/flight/Bootloaders/OpenPilot/inc/op_dfu.h b/flight/Bootloaders/OpenPilot/inc/op_dfu.h index e7e4faa06..fd77afa03 100644 --- a/flight/Bootloaders/OpenPilot/inc/op_dfu.h +++ b/flight/Bootloaders/OpenPilot/inc/op_dfu.h @@ -55,6 +55,7 @@ uint32_t baseOfAdressType(uint8_t type); uint8_t isBiggerThanAvailable(uint8_t type, uint32_t size); void OPDfuIni(uint8_t discover); void DataDownload(DownloadAction); +bool flash_read(uint8_t * buffer, uint32_t adr, DFUProgType type); #endif /* __OP_DFU_H */ /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/flight/Bootloaders/OpenPilot/op_dfu.c b/flight/Bootloaders/OpenPilot/op_dfu.c index 97fa59386..5e9b01eb6 100644 --- a/flight/Bootloaders/OpenPilot/op_dfu.c +++ b/flight/Bootloaders/OpenPilot/op_dfu.c @@ -66,7 +66,6 @@ uint8_t Data2; uint8_t Data3; uint8_t offset = 0; uint32_t aux; -uint8_t spi_dev_desc[200] = { 0 }; //Download vars uint32_t downSizeOfLastPacket = 0; uint32_t downPacketTotal = 0; @@ -102,6 +101,11 @@ void DataDownload(DownloadAction action) { for (uint8_t x = 0; x < packetSize; ++x) { partoffset = (downPacketCurrent * 14 * 4) + (x * 4); offset = baseOfAdressType(downType) + partoffset; + if(!flash_read(SendBuffer+(6+x*4),offset,currentProgrammingDestination)) + { + DeviceState = Last_operation_failed; + } + /* switch (currentProgrammingDestination) { case Remote_flash_via_spi: if (downType == Descript) { @@ -122,7 +126,7 @@ void DataDownload(DownloadAction action) { SendBuffer[9 + (x * 4)] = *FLASH_If_Read(offset + 3); break; } - +*/ } //PIOS USB_SIL_Write(EP1_IN, (uint8_t*) SendBuffer, 64); downPacketCurrent = downPacketCurrent + 1; @@ -495,13 +499,8 @@ void OPDfuIni(uint8_t discover) { if (PIOS_OPAHRS_bl_GetVersions(&rsp) == OPAHRS_RESULT_OK) { dev.programmingType = Remote_flash_via_spi; 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_crc; dev.devID = rsp.payload.user.v.rsp.versions.hw_version; - 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; @@ -558,7 +557,7 @@ uint32_t CalcFirmCRC() { 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 rsp.payload.user.v.rsp.versions.fw_crc; } } @@ -574,8 +573,36 @@ void sendData(uint8_t * buf,uint16_t size) { if (ProgPort == Usb) { - PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, buf, size);//FIX+1 + PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, buf, size); + if(DeviceState == downloading) + PIOS_DELAY_WaitmS(10); + } else if (ProgPort == Serial) { ssp_SendData(&ssp_port, buf, size); } } + +bool flash_read(uint8_t * buffer, uint32_t adr, DFUProgType type) { + struct opahrs_msg_v0 rsp; + struct opahrs_msg_v0 req; + switch (type) { + case Remote_flash_via_spi: + req.payload.user.v.req.fwdn_data.adress = adr; + if (PIOS_OPAHRS_bl_FwDlData(&req, &rsp) == OPAHRS_RESULT_OK) { + for (uint8_t x = 0; x < 4; ++x) { + buffer[x] = rsp.payload.user.v.rsp.fw_dn.data[x]; + } + return TRUE; + } + return FALSE; + break; + case Self_flash: + for (uint8_t x = 0; x < 4; ++x) { + buffer[x] = *FLASH_If_Read(adr + x); + } + return TRUE; + break; + default: + return FALSE; + } +} diff --git a/flight/PiOS/Boards/STM32103CB_AHRS.h b/flight/PiOS/Boards/STM32103CB_AHRS.h index 1fd9ee5f4..074c11983 100644 --- a/flight/PiOS/Boards/STM32103CB_AHRS.h +++ b/flight/PiOS/Boards/STM32103CB_AHRS.h @@ -76,7 +76,7 @@ TIM8 | | | | #elif STM32F10X_MD #define HW_TYPE 1 //0=high_density 1=medium_density; #endif -#define BOARD_READABLE FALSE +#define BOARD_READABLE TRUE #define BOARD_WRITABLA TRUE #define MAX_DEL_RETRYS 3 diff --git a/flight/PiOS/Boards/STM3210E_OP.h b/flight/PiOS/Boards/STM3210E_OP.h index 8560891b0..038f2271f 100644 --- a/flight/PiOS/Boards/STM3210E_OP.h +++ b/flight/PiOS/Boards/STM3210E_OP.h @@ -74,8 +74,9 @@ TIM8 | Servo 5 | Servo 6 | Servo 7 | Servo 8 #define BOOTLOADER_VERSION 0 #define MEM_SIZE 524288 //512K #define SIZE_OF_DESCRIPTION (uint8_t) 100 +#define START_OF_USER_CODE (uint32_t)0x08005000//REMEMBER SET ALSO IN link_stm32f10x_HD_BL.ld #define SIZE_OF_CODE (uint32_t) (MEM_SIZE-(START_OF_USER_CODE-0x08000000)-SIZE_OF_DESCRIPTION) -#define START_OF_USER_CODE (uint32_t)0x08007800//FF00 + #ifdef STM32F10X_HD #define HW_TYPE 0 //0=high_density 1=medium_density; #elif STM32F10X_MD diff --git a/flight/PiOS/Common/pios_opahrs_v0.c b/flight/PiOS/Common/pios_opahrs_v0.c index 3a744ace9..94e013021 100644 --- a/flight/PiOS/Common/pios_opahrs_v0.c +++ b/flight/PiOS/Common/pios_opahrs_v0.c @@ -230,6 +230,24 @@ enum opahrs_result PIOS_OPAHRS_bl_FwupData(struct opahrs_msg_v0 *req, struct opa return opahrs_msg_v0_recv_rsp(OPAHRS_MSG_V0_RSP_FWUP_STATUS, rsp); } +enum opahrs_result PIOS_OPAHRS_bl_FwDlData(struct opahrs_msg_v0 *req, struct opahrs_msg_v0 *rsp) +{ + if (!req || !rsp) + return OPAHRS_RESULT_FAILED; + + /* Make up an attituderaw request */ + opahrs_msg_v0_init_user_tx(req, OPAHRS_MSG_V0_REQ_FWDN_DATA); + enum opahrs_result rc; + /* Send the message until it is received */ + rc = opahrs_msg_v0_send_req(req); + if (rc != OPAHRS_RESULT_OK) { + /* Failed to send the request, bail out */ + return rc; + } + + return opahrs_msg_v0_recv_rsp(OPAHRS_MSG_V0_RSP_FWDN_DATA, rsp); +} + enum opahrs_result PIOS_OPAHRS_bl_FwupVerify(struct opahrs_msg_v0 *rsp) { if (!rsp) diff --git a/flight/PiOS/STM32F10x/link_stm32f10x_HD_BL.ld b/flight/PiOS/STM32F10x/link_stm32f10x_HD_BL.ld index 74ddbbe9b..d7b1d965f 100644 --- a/flight/PiOS/STM32F10x/link_stm32f10x_HD_BL.ld +++ b/flight/PiOS/STM32F10x/link_stm32f10x_HD_BL.ld @@ -28,7 +28,7 @@ MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K - FLASH (rx) : ORIGIN = 0x08007800, LENGTH = 482K + FLASH (rx) : ORIGIN = 0x08005000, LENGTH = 492K FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0 EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0 EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0 diff --git a/flight/PiOS/inc/pios_opahrs.h b/flight/PiOS/inc/pios_opahrs.h index 6ac12b620..f0193c8c0 100644 --- a/flight/PiOS/inc/pios_opahrs.h +++ b/flight/PiOS/inc/pios_opahrs.h @@ -54,6 +54,7 @@ extern enum opahrs_result PIOS_OPAHRS_bl_resync(void); extern enum opahrs_result PIOS_OPAHRS_bl_GetMemMap(struct opahrs_msg_v0 *rsp); extern enum opahrs_result PIOS_OPAHRS_bl_reset(uint32_t delay); extern enum opahrs_result PIOS_OPAHRS_bl_boot(uint32_t delay); +extern enum opahrs_result PIOS_OPAHRS_bl_FwDlData(struct opahrs_msg_v0 *req, struct opahrs_msg_v0 *rsp); /* * Protocol V1 messages used by application */ diff --git a/flight/PiOS/inc/pios_opahrs_proto.h b/flight/PiOS/inc/pios_opahrs_proto.h index 5945699dd..236c218ef 100644 --- a/flight/PiOS/inc/pios_opahrs_proto.h +++ b/flight/PiOS/inc/pios_opahrs_proto.h @@ -93,6 +93,10 @@ struct opahrs_msg_v0_req_fwup_data { uint8_t size; } __attribute__ ((__packed__)); +struct opahrs_msg_v0_req_fwdn_data { + uint32_t adress; +} __attribute__ ((__packed__)); + struct opahrs_msg_v0_req_mem_map { } __attribute__ ((__packed__)); @@ -106,17 +110,21 @@ union opahrs_msg_v0_req { struct opahrs_msg_v0_req_boot boot; struct opahrs_msg_v0_req_serial serial; struct opahrs_msg_v0_req_fwup_status status_req; + struct opahrs_msg_v0_req_fwdn_data fwdn_data; struct opahrs_msg_v0_req_mem_map mem_map; struct opahrs_msg_v0_req_fwup_start fwup_start; struct opahrs_msg_v0_req_fwup_data fwup_data; struct opahrs_msg_v0_req_fwup_verify fwup_verify; } __attribute__ ((__packed__)); +struct opahrs_msg_v0_rsp_fwdn_data { + uint8_t data[4]; +} __attribute__ ((__packed__)); + struct opahrs_msg_v0_rsp_versions { uint8_t hw_version; uint16_t bl_version; - uint32_t fw_version; - uint8_t description[100]; + uint32_t fw_crc; } __attribute__ ((__packed__)); struct opahrs_msg_v0_rsp_serial { @@ -142,6 +150,7 @@ union opahrs_msg_v0_rsp { struct opahrs_msg_v0_rsp_serial serial; struct opahrs_msg_v0_rsp_fwup_status fwup_status; struct opahrs_msg_v0_rsp_mem_map mem_map; + struct opahrs_msg_v0_rsp_fwdn_data fw_dn; } __attribute__ ((__packed__)); enum opahrs_msg_v0_tag { @@ -150,7 +159,7 @@ enum opahrs_msg_v0_tag { OPAHRS_MSG_V0_REQ_RESET, OPAHRS_MSG_V0_REQ_BOOT, OPAHRS_MSG_V0_REQ_SERIAL, - + OPAHRS_MSG_V0_REQ_FWDN_DATA, OPAHRS_MSG_V0_REQ_MEM_MAP, OPAHRS_MSG_V0_REQ_FWUP_START, @@ -161,7 +170,7 @@ enum opahrs_msg_v0_tag { OPAHRS_MSG_V0_RSP_VERSIONS, OPAHRS_MSG_V0_RSP_SERIAL, OPAHRS_MSG_V0_RSP_FWUP_STATUS, - + OPAHRS_MSG_V0_RSP_FWDN_DATA, OPAHRS_MSG_V0_RSP_MEM_MAP, }; @@ -263,7 +272,7 @@ union opahrs_msg_v1_req { struct opahrs_msg_v1_rsp_versions { uint8_t hw_version; uint16_t bl_version; - uint32_t fw_version; + uint32_t fw_crc; } __attribute__ ((__packed__)); struct opahrs_msg_v1_rsp_serial { diff --git a/ground/src/experimental/USB_UPLOAD_TOOL/op_dfu.cpp b/ground/src/experimental/USB_UPLOAD_TOOL/op_dfu.cpp index d1ad76df2..b3ccfbcd4 100644 --- a/ground/src/experimental/USB_UPLOAD_TOOL/op_dfu.cpp +++ b/ground/src/experimental/USB_UPLOAD_TOOL/op_dfu.cpp @@ -249,7 +249,7 @@ bool OP_DFU::UploadData(qint32 const & numberOfBytes, QByteArray & data) // } // qDebug()<<" Data0="<<(int)data[0]<<" Data0="<<(int)data[1]<<" Data0="<<(int)data[2]<<" Data0="<<(int)data[3]<<" buf6="<<(int)buf[6]<<" buf7="<<(int)buf[7]<<" buf8="<<(int)buf[8]<<" buf9="<<(int)buf[9]; //delay::msleep(send_delay); - if(int ret=StatusRequest()!=OP_DFU::uploading) return false; + // if(int ret=StatusRequest()!=OP_DFU::uploading) return false; int result = sendData(buf, BUF_LEN); // qDebug()<<"sent:"<