mirror of https://github.com/ArduPilot/ardupilot
50 lines
1016 B
C++
50 lines
1016 B
C++
#include <AP_HAL/AP_HAL.h>
|
|
|
|
#if CONFIG_HAL_BOARD == HAL_BOARD_QURT
|
|
|
|
#include <assert.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include "Storage.h"
|
|
|
|
using namespace QURT;
|
|
|
|
/*
|
|
This stores 'eeprom' data on the filesystem, with a 16k size
|
|
|
|
Data is written on the ARM frontend via a RPC call
|
|
*/
|
|
|
|
extern const AP_HAL::HAL& hal;
|
|
|
|
volatile bool Storage::dirty;
|
|
uint8_t Storage::buffer[QURT_STORAGE_SIZE];
|
|
Semaphore Storage::lock;
|
|
|
|
void Storage::read_block(void *dst, uint16_t loc, size_t n)
|
|
{
|
|
if (loc >= sizeof(buffer)-(n-1)) {
|
|
return;
|
|
}
|
|
memcpy(dst, &buffer[loc], n);
|
|
}
|
|
|
|
void Storage::write_block(uint16_t loc, const void *src, size_t n)
|
|
{
|
|
if (loc >= sizeof(buffer)-(n-1)) {
|
|
return;
|
|
}
|
|
if (memcmp(src, &buffer[loc], n) != 0) {
|
|
lock.take(HAL_SEMAPHORE_BLOCK_FOREVER);
|
|
memcpy(&buffer[loc], src, n);
|
|
dirty = true;
|
|
lock.give();
|
|
}
|
|
}
|
|
|
|
#endif // CONFIG_HAL_BOARD
|