mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-02-23 00:04:02 -04:00
HAL_PX4: added a signature to FRAM
this makes for more reliable update
This commit is contained in:
parent
33acce71c8
commit
626086063e
@ -24,6 +24,7 @@ using namespace PX4;
|
|||||||
#define OLD_STORAGE_FILE STORAGE_DIR "/" SKETCHNAME ".stg"
|
#define OLD_STORAGE_FILE STORAGE_DIR "/" SKETCHNAME ".stg"
|
||||||
#define OLD_STORAGE_FILE_BAK STORAGE_DIR "/" SKETCHNAME ".bak"
|
#define OLD_STORAGE_FILE_BAK STORAGE_DIR "/" SKETCHNAME ".bak"
|
||||||
#define MTD_PARAMS_FILE "/fs/mtd_params"
|
#define MTD_PARAMS_FILE "/fs/mtd_params"
|
||||||
|
#define MTD_SIGNATURE 0x14012014
|
||||||
|
|
||||||
extern const AP_HAL::HAL& hal;
|
extern const AP_HAL::HAL& hal;
|
||||||
|
|
||||||
@ -54,25 +55,49 @@ void PX4Storage::_storage_create(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
upgrade from microSD to MTD (FRAM)
|
get signature from bytes at offset 8192-4
|
||||||
*/
|
*/
|
||||||
void PX4Storage::_upgrade_to_mtd(void)
|
uint32_t PX4Storage::_mtd_signature(void)
|
||||||
{
|
{
|
||||||
int mtd_fd = open(_storage_name, O_RDONLY);
|
int mtd_fd = open(_storage_name, O_RDONLY);
|
||||||
if (mtd_fd == -1) {
|
if (mtd_fd == -1) {
|
||||||
hal.scheduler->panic("Failed to open " MTD_PARAMS_FILE);
|
hal.scheduler->panic("Failed to open " MTD_PARAMS_FILE);
|
||||||
}
|
}
|
||||||
uint32_t v;
|
uint32_t v;
|
||||||
|
if (lseek(mtd_fd, 8192-4, SEEK_SET) != 8192-4) {
|
||||||
|
hal.scheduler->panic("Failed to seek in " MTD_PARAMS_FILE);
|
||||||
|
}
|
||||||
if (read(mtd_fd, &v, sizeof(v)) != sizeof(v)) {
|
if (read(mtd_fd, &v, sizeof(v)) != sizeof(v)) {
|
||||||
hal.scheduler->panic("Failed to read header of " MTD_PARAMS_FILE);
|
hal.scheduler->panic("Failed to read signature from " MTD_PARAMS_FILE);
|
||||||
}
|
}
|
||||||
close(mtd_fd);
|
close(mtd_fd);
|
||||||
if (v != 0xFFFFFFFF) {
|
return v;
|
||||||
// it has some data in it, don't upgrade
|
}
|
||||||
rename(OLD_STORAGE_FILE, OLD_STORAGE_FILE_BAK);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
put signature bytes at offset 8192-4
|
||||||
|
*/
|
||||||
|
void PX4Storage::_mtd_write_signature(void)
|
||||||
|
{
|
||||||
|
int mtd_fd = open(_storage_name, O_WRONLY);
|
||||||
|
if (mtd_fd == -1) {
|
||||||
|
hal.scheduler->panic("Failed to open " MTD_PARAMS_FILE);
|
||||||
|
}
|
||||||
|
uint32_t v = MTD_SIGNATURE;
|
||||||
|
if (lseek(mtd_fd, 8192-4, SEEK_SET) != 8192-4) {
|
||||||
|
hal.scheduler->panic("Failed to seek in " MTD_PARAMS_FILE);
|
||||||
|
}
|
||||||
|
if (write(mtd_fd, &v, sizeof(v)) != sizeof(v)) {
|
||||||
|
hal.scheduler->panic("Failed to write signature in " MTD_PARAMS_FILE);
|
||||||
|
}
|
||||||
|
close(mtd_fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
upgrade from microSD to MTD (FRAM)
|
||||||
|
*/
|
||||||
|
void PX4Storage::_upgrade_to_mtd(void)
|
||||||
|
{
|
||||||
// the MTD is completely uninitialised - try to get a
|
// the MTD is completely uninitialised - try to get a
|
||||||
// copy from OLD_STORAGE_FILE
|
// copy from OLD_STORAGE_FILE
|
||||||
int old_fd = open(OLD_STORAGE_FILE, O_RDONLY);
|
int old_fd = open(OLD_STORAGE_FILE, O_RDONLY);
|
||||||
@ -81,7 +106,7 @@ void PX4Storage::_upgrade_to_mtd(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mtd_fd = open(_storage_name, O_WRONLY);
|
int mtd_fd = open(_storage_name, O_WRONLY);
|
||||||
if (mtd_fd == -1) {
|
if (mtd_fd == -1) {
|
||||||
hal.scheduler->panic("Unable to open MTD for upgrade");
|
hal.scheduler->panic("Unable to open MTD for upgrade");
|
||||||
}
|
}
|
||||||
@ -98,6 +123,7 @@ void PX4Storage::_upgrade_to_mtd(void)
|
|||||||
}
|
}
|
||||||
close(mtd_fd);
|
close(mtd_fd);
|
||||||
rename(OLD_STORAGE_FILE, OLD_STORAGE_FILE_BAK);
|
rename(OLD_STORAGE_FILE, OLD_STORAGE_FILE_BAK);
|
||||||
|
::printf("Upgraded MTD from %s\n", OLD_STORAGE_FILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -138,8 +164,18 @@ void PX4Storage::_storage_open(void)
|
|||||||
/*
|
/*
|
||||||
cope with upgrading from OLD_STORAGE_FILE to MTD
|
cope with upgrading from OLD_STORAGE_FILE to MTD
|
||||||
*/
|
*/
|
||||||
if (_have_mtd && stat(OLD_STORAGE_FILE, &st) == 0) {
|
if (_have_mtd) {
|
||||||
_upgrade_to_mtd();
|
bool good_signature = (_mtd_signature() == MTD_SIGNATURE);
|
||||||
|
if (stat(OLD_STORAGE_FILE, &st) == 0) {
|
||||||
|
if (good_signature) {
|
||||||
|
rename(OLD_STORAGE_FILE, OLD_STORAGE_FILE_BAK);
|
||||||
|
} else {
|
||||||
|
_upgrade_to_mtd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!good_signature) {
|
||||||
|
_mtd_write_signature();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -43,6 +43,8 @@ private:
|
|||||||
perf_counter_t _perf_errors;
|
perf_counter_t _perf_errors;
|
||||||
bool _have_mtd;
|
bool _have_mtd;
|
||||||
void _upgrade_to_mtd(void);
|
void _upgrade_to_mtd(void);
|
||||||
|
uint32_t _mtd_signature(void);
|
||||||
|
void _mtd_write_signature(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __AP_HAL_PX4_STORAGE_H__
|
#endif // __AP_HAL_PX4_STORAGE_H__
|
||||||
|
Loading…
Reference in New Issue
Block a user