mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
Add functionallity to find a mark in the flash buffer for dynamic HTML pages
This commit is contained in:
@@ -8,6 +8,8 @@
|
|||||||
#include "rtl837x_sfr.h"
|
#include "rtl837x_sfr.h"
|
||||||
|
|
||||||
__xdata uint8_t dio_enabled;
|
__xdata uint8_t dio_enabled;
|
||||||
|
__xdata uint8_t markbuf[16];
|
||||||
|
extern __xdata uint16_t mpos;
|
||||||
|
|
||||||
#pragma codeseg BANK1
|
#pragma codeseg BANK1
|
||||||
|
|
||||||
@@ -66,6 +68,7 @@ void flash_init(uint8_t enable_dio) __banked
|
|||||||
flash_configure_mmio();
|
flash_configure_mmio();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t flash_read_status(void)
|
uint8_t flash_read_status(void)
|
||||||
{
|
{
|
||||||
// Test Controller Busy (we might call this directly after executing a command)
|
// Test Controller Busy (we might call this directly after executing a command)
|
||||||
@@ -263,6 +266,88 @@ void flash_read_bulk(register __xdata uint8_t *dst, __xdata uint32_t src, regist
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void flash_find_mark(__xdata uint32_t src, register uint16_t len, __code uint8_t *mark) __banked
|
||||||
|
{
|
||||||
|
uint16_t status;
|
||||||
|
do {
|
||||||
|
status = flash_read_status();
|
||||||
|
} while (status & 0x1);
|
||||||
|
|
||||||
|
// Set fast read mode
|
||||||
|
if (dio_enabled) {
|
||||||
|
SFR_FLASH_MODEB = 0x18;
|
||||||
|
SFR_FLASH_CMD_R = 0xbb;
|
||||||
|
SFR_FLASH_DUMMYCICLES = 4;
|
||||||
|
} else {
|
||||||
|
SFR_FLASH_MODEB = 0x0;
|
||||||
|
SFR_FLASH_CMD_R = 0xb; // Fast read
|
||||||
|
SFR_FLASH_DUMMYCICLES = 8; // Add 8 dummy clocks after read?
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t i = 0;
|
||||||
|
uint8_t l = 0;
|
||||||
|
uint8_t k;
|
||||||
|
|
||||||
|
// Calculate the length
|
||||||
|
while (mark[i++])
|
||||||
|
l++;
|
||||||
|
|
||||||
|
if (l >= 12) {
|
||||||
|
mpos = 0xffff;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
SFR_FLASH_TCONF = 4;
|
||||||
|
while (len) {
|
||||||
|
SFR_FLASH_ADDR16 = src >> 16;
|
||||||
|
SFR_FLASH_ADDR8 = src >> 8;
|
||||||
|
SFR_FLASH_ADDR0 = src;
|
||||||
|
src += 4;
|
||||||
|
|
||||||
|
SFR_FLASH_EXEC_GO = 1;
|
||||||
|
while(SFR_FLASH_EXEC_BUSY);
|
||||||
|
markbuf[i++] = SFR_FLASH_DATA0;
|
||||||
|
if (len != 1) {
|
||||||
|
markbuf[i++] = SFR_FLASH_DATA8;
|
||||||
|
if (len != 2) {
|
||||||
|
markbuf[i++] = SFR_FLASH_DATA16;
|
||||||
|
if (len != 3) {
|
||||||
|
markbuf[i++] = SFR_FLASH_DATA24;
|
||||||
|
} else {
|
||||||
|
markbuf[i++] = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
markbuf[i++] = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
markbuf[i++] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
len -= 4;
|
||||||
|
uint8_t j = 0;
|
||||||
|
k = (i + 13 - l) & 0xf;
|
||||||
|
i &= 0xf;
|
||||||
|
while (mark[j] && (k != ((i) & 0xf))) {
|
||||||
|
if (mark[j] != markbuf[k]) {
|
||||||
|
k = k - j + 17;
|
||||||
|
j = 0;
|
||||||
|
} else {
|
||||||
|
k++;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
k &= 0xf;
|
||||||
|
}
|
||||||
|
if (!mark[j]) {
|
||||||
|
mpos = len + l + ((4 - ( k & 0x3)) & 0x3);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mpos = 0xffff;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void flash_read_security(uint32_t addr, uint8_t len) __banked
|
void flash_read_security(uint32_t addr, uint8_t len) __banked
|
||||||
{
|
{
|
||||||
while (flash_read_status() & 0x1);
|
while (flash_read_status() & 0x1);
|
||||||
|
|||||||
@@ -10,4 +10,5 @@ void flash_read_security(uint32_t addr, uint8_t len)__banked ;
|
|||||||
void flash_block_erase(uint32_t addr) __banked;
|
void flash_block_erase(uint32_t addr) __banked;
|
||||||
void flash_read_bulk(register __xdata uint8_t *dst, __xdata uint32_t src, register uint16_t len) __banked;
|
void flash_read_bulk(register __xdata uint8_t *dst, __xdata uint32_t src, register uint16_t len) __banked;
|
||||||
void flash_write_bytes(__xdata uint32_t addr, register __xdata uint8_t *ptr, register uint16_t len)__banked;
|
void flash_write_bytes(__xdata uint32_t addr, register __xdata uint8_t *ptr, register uint16_t len)__banked;
|
||||||
|
void flash_find_mark(__xdata uint32_t src, register uint16_t len, __code uint8_t *mark) __banked;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user