Устройство на at91sam7s64B, прошитое самбой с установкой Security Bit.
После возвращения мне("перестало работать"), прочитал JTAG-ом флэш(еще раз обращаю внимание на то, что секюрити бит был установлен, ну или по крайней мере должен был установиться при программировании через sam-prog, галка стояла).
Считанное содержание идентично прошивке за исключением того, что нулевая страница (первые 128 байт) стерта в FF.
Что бы это могло быть?
Сразу скажу, что ERASE и TST оставил висячими, но даже, допустим, если ERASE дернулся, с Security Bit ситуация совсем неясна.
На всякий случай привожу листинг функции для записи внутренней флэш (запись во флеш используется при работе, но, по идее, нулевая страница записаться никак не могла).
Код
#define NVMEM_MCU_FLASH_BASE 0x00100000
#if (NVMEM_TYPE==AT91SAM7S64)
#define NVMEM_MCU_FLASH_SIZE 0x10000
#define NVMEM_PAGE_SZ 128
#define NVMEM_CAP_PAGES 384
#define NVMEM_CAP (NVMEM_PAGE_SZ * NVMEM_CAP_PAGES)
#define NVMEM_BASE (NVMEM_MCU_FLASH_BASE + (NVMEM_MCU_FLASH_SIZE - NVMEM_CAP))//for linker: program in flash start = 0, end = (NVMEM_MCU_FLASH_SIZE - NVMEM_CAP) -1
#define NVMEM_BASE_PA ((NVMEM_BASE - NVMEM_MCU_FLASH_BASE) / NVMEM_PAGE_SZ)
__ramfunc void NVMemWaitReadyStatus()
{
while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
}
__ramfunc int NVMemPageWrite(int PA, int BA, unsigned char* buf, int len, int verify)
{
unsigned int *pbuf = (unsigned int *)buf;
unsigned int *pflash = (unsigned int *)(NVMEM_BASE + NVMEM_PAGE_SZ * PA);
int i;
if((len != NVMEM_PAGE_SZ)||(BA!= 0))
while(1);//dbg
if((PA < 0)||(PA >= NVMEM_CAP_PAGES))
while(1);//dbg
len/= 4;//len in int
__istate_t istate = __get_interrupt_state();
__disable_interrupt();
for (i = 0; i < len; i++)
pflash[i] = pbuf[i];
NVMemWaitReadyStatus();
AT91C_BASE_MC->MC_FCR = (0x5A << 24) | ((NVMEM_BASE_PA + PA) << 8) | AT91C_MC_FCMD_START_PROG;
NVMemWaitReadyStatus();
__set_interrupt_state(istate);
if(verify)
{
for (i = 0; i < len; i++)
if(pflash[i] != pbuf[i])
return 0;
}
return 1;
}
И заодно еще вопрос - можно ли в финальную так сказать прошивку вставить код установки Security Bit, или ему станет плохо от "установки"
при каждом включении контроллера? Или может есть способ программно проверить установлен ли он?
Спасибо за внимание =)