You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.9 KiB
75 lines
1.9 KiB
#include "zhdb.hpp"
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "apphardware\apphardware.hpp"
|
|
#include "ucomponents\eeprom\m24m02_i2c_eeprom.hpp"
|
|
|
|
uint8_t cache[50 * 1024] __attribute__((section(".ccmram")));
|
|
// uint8_t cache[40 * 1024] ;
|
|
|
|
using namespace iflytop;
|
|
|
|
static zhdb_table_t tablecache[MAX_TABLE_NUM];
|
|
static uint32_t table_num = 0;
|
|
static uint32_t table_add_off = 0;
|
|
static zmutex lock("ZHDB");
|
|
|
|
static void read_from_eeprom(uint32_t add, uint8_t* data, size_t size) { //
|
|
for (size_t i = 0; i < size; i += 256) {
|
|
AppHardware::ins()->eeprom.read(add + i, data + i, 256);
|
|
|
|
// static uint8_t buf[256];
|
|
// AppHardware::ins()->eeprom.read(add + i, buf, 256);
|
|
// memcpy(data + i, buf, 256);
|
|
}
|
|
}
|
|
|
|
static void write_to_eeprom(uint32_t add, uint8_t* data, size_t size) { //
|
|
for (size_t i = 0; i < size; i += 256) {
|
|
AppHardware::ins()->eeprom.write(add + i, data + i, 256);
|
|
// static uint8_t buf[256];
|
|
// memcpy(buf, data + i, 256);
|
|
// AppHardware::ins()->eeprom.write(add + i, buf, 256);
|
|
}
|
|
}
|
|
|
|
void ZHDB::init() { lock.init(); }
|
|
|
|
zhdb_table_t* ZHDB::allocTable(const char* name, size_t size) {
|
|
if (table_num >= MAX_TABLE_NUM) {
|
|
return NULL;
|
|
}
|
|
|
|
if (size % 256 != 0) {
|
|
size = (size / 256 + 1) * 256;
|
|
}
|
|
|
|
//
|
|
zhdb_table_t* table = &tablecache[table_num];
|
|
|
|
table->add = &cache[table_add_off];
|
|
table->size = size;
|
|
table->name = name;
|
|
|
|
// read from eeprom
|
|
read_from_eeprom(table_add_off, table->add, size);
|
|
|
|
//
|
|
table_add_off += size;
|
|
table_num++;
|
|
|
|
ZLOGI("ZHDB", "alloc table %s add %p size %d", name, table->add, size);
|
|
|
|
return table;
|
|
}
|
|
void ZHDB::storageData(uint8_t* data, size_t size) {
|
|
zlock_guard guard(lock);
|
|
|
|
//
|
|
uint32_t off = data - cache;
|
|
uint32_t align_off = (off / 256) * 256;
|
|
uint32_t real_size = (size / 256 + 1) * 256;
|
|
|
|
write_to_eeprom(align_off, &cache[align_off], real_size);
|
|
}
|