1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-21 11:54:15 +01:00

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
This commit is contained in:
zedamota 2010-12-21 17:25:24 +00:00 committed by zedamota
parent 5748fe0e90
commit 14ef24a3de
10 changed files with 86 additions and 22 deletions

View File

@ -161,9 +161,7 @@ void process_spi_request(void) {
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;
user_tx_v0.payload.user.v.rsp.versions.fw_version = Fw_crc; user_tx_v0.payload.user.v.rsp.versions.fw_crc = Fw_crc;
read_description(
(uint8_t *) &(user_tx_v0.payload.user.v.rsp.versions.description));
lfsm_user_set_tx_v0(&user_tx_v0); lfsm_user_set_tx_v0(&user_tx_v0);
break; break;
case OPAHRS_MSG_V0_REQ_MEM_MAP: 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; user_tx_v0.payload.user.v.rsp.fwup_status.status = boot_status;
lfsm_user_set_tx_v0(&user_tx_v0); lfsm_user_set_tx_v0(&user_tx_v0);
break; 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: case OPAHRS_MSG_V0_REQ_FWUP_START:
FLASH_Unlock(); 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);

View File

@ -55,6 +55,7 @@ uint32_t baseOfAdressType(uint8_t type);
uint8_t isBiggerThanAvailable(uint8_t type, uint32_t size); uint8_t isBiggerThanAvailable(uint8_t type, uint32_t size);
void OPDfuIni(uint8_t discover); void OPDfuIni(uint8_t discover);
void DataDownload(DownloadAction); void DataDownload(DownloadAction);
bool flash_read(uint8_t * buffer, uint32_t adr, DFUProgType type);
#endif /* __OP_DFU_H */ #endif /* __OP_DFU_H */
/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/

View File

@ -66,7 +66,6 @@ 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] = { 0 };
//Download vars //Download vars
uint32_t downSizeOfLastPacket = 0; uint32_t downSizeOfLastPacket = 0;
uint32_t downPacketTotal = 0; uint32_t downPacketTotal = 0;
@ -102,6 +101,11 @@ void DataDownload(DownloadAction action) {
for (uint8_t x = 0; x < packetSize; ++x) { for (uint8_t x = 0; x < packetSize; ++x) {
partoffset = (downPacketCurrent * 14 * 4) + (x * 4); partoffset = (downPacketCurrent * 14 * 4) + (x * 4);
offset = baseOfAdressType(downType) + partoffset; offset = baseOfAdressType(downType) + partoffset;
if(!flash_read(SendBuffer+(6+x*4),offset,currentProgrammingDestination))
{
DeviceState = Last_operation_failed;
}
/*
switch (currentProgrammingDestination) { switch (currentProgrammingDestination) {
case Remote_flash_via_spi: case Remote_flash_via_spi:
if (downType == Descript) { if (downType == Descript) {
@ -122,7 +126,7 @@ void DataDownload(DownloadAction action) {
SendBuffer[9 + (x * 4)] = *FLASH_If_Read(offset + 3); SendBuffer[9 + (x * 4)] = *FLASH_If_Read(offset + 3);
break; break;
} }
*/
} }
//PIOS USB_SIL_Write(EP1_IN, (uint8_t*) SendBuffer, 64); //PIOS USB_SIL_Write(EP1_IN, (uint8_t*) SendBuffer, 64);
downPacketCurrent = downPacketCurrent + 1; downPacketCurrent = downPacketCurrent + 1;
@ -495,13 +499,8 @@ void OPDfuIni(uint8_t discover) {
if (PIOS_OPAHRS_bl_GetVersions(&rsp) == OPAHRS_RESULT_OK) { if (PIOS_OPAHRS_bl_GetVersions(&rsp) == OPAHRS_RESULT_OK) {
dev.programmingType = Remote_flash_via_spi; dev.programmingType = Remote_flash_via_spi;
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_crc;
dev.devID = rsp.payload.user.v.rsp.versions.hw_version; 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) { 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;
@ -558,7 +557,7 @@ uint32_t CalcFirmCRC() {
PIOS_DELAY_WaitmS(1000); PIOS_DELAY_WaitmS(1000);
PIOS_OPAHRS_bl_resync(); 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_crc;
} }
} }
@ -574,8 +573,36 @@ void sendData(uint8_t * buf,uint16_t size)
{ {
if (ProgPort == Usb) { 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) { } else if (ProgPort == Serial) {
ssp_SendData(&ssp_port, buf, size); 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;
}
}

View File

@ -76,7 +76,7 @@ TIM8 | | | |
#elif STM32F10X_MD #elif STM32F10X_MD
#define HW_TYPE 1 //0=high_density 1=medium_density; #define HW_TYPE 1 //0=high_density 1=medium_density;
#endif #endif
#define BOARD_READABLE FALSE #define BOARD_READABLE TRUE
#define BOARD_WRITABLA TRUE #define BOARD_WRITABLA TRUE
#define MAX_DEL_RETRYS 3 #define MAX_DEL_RETRYS 3

View File

@ -74,8 +74,9 @@ TIM8 | Servo 5 | Servo 6 | Servo 7 | Servo 8
#define BOOTLOADER_VERSION 0 #define BOOTLOADER_VERSION 0
#define MEM_SIZE 524288 //512K #define MEM_SIZE 524288 //512K
#define SIZE_OF_DESCRIPTION (uint8_t) 100 #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 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 #ifdef STM32F10X_HD
#define HW_TYPE 0 //0=high_density 1=medium_density; #define HW_TYPE 0 //0=high_density 1=medium_density;
#elif STM32F10X_MD #elif STM32F10X_MD

View File

@ -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); 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) enum opahrs_result PIOS_OPAHRS_bl_FwupVerify(struct opahrs_msg_v0 *rsp)
{ {
if (!rsp) if (!rsp)

View File

@ -28,7 +28,7 @@
MEMORY MEMORY
{ {
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x08007800, LENGTH = 482K FLASH (rx) : ORIGIN = 0x08005000, LENGTH = 492K
FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0 FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0 EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0 EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0

View File

@ -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_GetMemMap(struct opahrs_msg_v0 *rsp);
extern enum opahrs_result PIOS_OPAHRS_bl_reset(uint32_t delay); 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_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 * Protocol V1 messages used by application
*/ */

View File

@ -93,6 +93,10 @@ struct opahrs_msg_v0_req_fwup_data {
uint8_t size; uint8_t size;
} __attribute__ ((__packed__)); } __attribute__ ((__packed__));
struct opahrs_msg_v0_req_fwdn_data {
uint32_t adress;
} __attribute__ ((__packed__));
struct opahrs_msg_v0_req_mem_map { struct opahrs_msg_v0_req_mem_map {
} __attribute__ ((__packed__)); } __attribute__ ((__packed__));
@ -106,17 +110,21 @@ union opahrs_msg_v0_req {
struct opahrs_msg_v0_req_boot boot; struct opahrs_msg_v0_req_boot boot;
struct opahrs_msg_v0_req_serial serial; struct opahrs_msg_v0_req_serial serial;
struct opahrs_msg_v0_req_fwup_status status_req; 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_mem_map mem_map;
struct opahrs_msg_v0_req_fwup_start fwup_start; struct opahrs_msg_v0_req_fwup_start fwup_start;
struct opahrs_msg_v0_req_fwup_data fwup_data; struct opahrs_msg_v0_req_fwup_data fwup_data;
struct opahrs_msg_v0_req_fwup_verify fwup_verify; struct opahrs_msg_v0_req_fwup_verify fwup_verify;
} __attribute__ ((__packed__)); } __attribute__ ((__packed__));
struct opahrs_msg_v0_rsp_fwdn_data {
uint8_t data[4];
} __attribute__ ((__packed__));
struct opahrs_msg_v0_rsp_versions { struct opahrs_msg_v0_rsp_versions {
uint8_t hw_version; uint8_t hw_version;
uint16_t bl_version; uint16_t bl_version;
uint32_t fw_version; uint32_t fw_crc;
uint8_t description[100];
} __attribute__ ((__packed__)); } __attribute__ ((__packed__));
struct opahrs_msg_v0_rsp_serial { 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_serial serial;
struct opahrs_msg_v0_rsp_fwup_status fwup_status; struct opahrs_msg_v0_rsp_fwup_status fwup_status;
struct opahrs_msg_v0_rsp_mem_map mem_map; struct opahrs_msg_v0_rsp_mem_map mem_map;
struct opahrs_msg_v0_rsp_fwdn_data fw_dn;
} __attribute__ ((__packed__)); } __attribute__ ((__packed__));
enum opahrs_msg_v0_tag { enum opahrs_msg_v0_tag {
@ -150,7 +159,7 @@ enum opahrs_msg_v0_tag {
OPAHRS_MSG_V0_REQ_RESET, OPAHRS_MSG_V0_REQ_RESET,
OPAHRS_MSG_V0_REQ_BOOT, OPAHRS_MSG_V0_REQ_BOOT,
OPAHRS_MSG_V0_REQ_SERIAL, OPAHRS_MSG_V0_REQ_SERIAL,
OPAHRS_MSG_V0_REQ_FWDN_DATA,
OPAHRS_MSG_V0_REQ_MEM_MAP, OPAHRS_MSG_V0_REQ_MEM_MAP,
OPAHRS_MSG_V0_REQ_FWUP_START, OPAHRS_MSG_V0_REQ_FWUP_START,
@ -161,7 +170,7 @@ enum opahrs_msg_v0_tag {
OPAHRS_MSG_V0_RSP_VERSIONS, OPAHRS_MSG_V0_RSP_VERSIONS,
OPAHRS_MSG_V0_RSP_SERIAL, OPAHRS_MSG_V0_RSP_SERIAL,
OPAHRS_MSG_V0_RSP_FWUP_STATUS, OPAHRS_MSG_V0_RSP_FWUP_STATUS,
OPAHRS_MSG_V0_RSP_FWDN_DATA,
OPAHRS_MSG_V0_RSP_MEM_MAP, OPAHRS_MSG_V0_RSP_MEM_MAP,
}; };
@ -263,7 +272,7 @@ union opahrs_msg_v1_req {
struct opahrs_msg_v1_rsp_versions { struct opahrs_msg_v1_rsp_versions {
uint8_t hw_version; uint8_t hw_version;
uint16_t bl_version; uint16_t bl_version;
uint32_t fw_version; uint32_t fw_crc;
} __attribute__ ((__packed__)); } __attribute__ ((__packed__));
struct opahrs_msg_v1_rsp_serial { struct opahrs_msg_v1_rsp_serial {

View File

@ -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]; // 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); //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); int result = sendData(buf, BUF_LEN);
// qDebug()<<"sent:"<<result; // qDebug()<<"sent:"<<result;
if(result<1) if(result<1)