реклама на сайте
подробности

 
 
> flash сам полу-стерся, at91sam7s64
overloaded
сообщение Feb 17 2011, 20:15
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 73
Регистрация: 17-10-07
Из: Киев
Пользователь №: 31 422



Устройство на 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, или ему станет плохо от "установки"
при каждом включении контроллера? Или может есть способ программно проверить установлен ли он?
Спасибо за внимание =)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01329 секунд с 7
ELECTRONIX ©2004-2016