1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-20 10:54:14 +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);
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);

View File

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

View File

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

View File

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

View File

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

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

View File

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

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

View File

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

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];
//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:"<<result;
if(result<1)