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

 
 
 
Reply to this topicStart new topic
> 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
aaarrr
сообщение Feb 17 2011, 20:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(overloaded @ Feb 17 2011, 23:15) *
Сразу скажу, что ERASE и TST оставил висячими

ИМХО, не стоит так делать. А JTAG - тоже висел?

Цитата(overloaded @ Feb 17 2011, 23:15) *
Или может есть способ программно проверить установлен ли он?

Битик соответствующий есть в FSR.
Go to the top of the page
 
+Quote Post
overloaded
сообщение Feb 17 2011, 22:16
Сообщение #3


Участник
*

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



Да, висел. С расчетом на то, что все-равно секюрити бит установлен.
Просто в ДШ написано что секюрити бит стирается только после полного стирания флэш, а выходит, что, подобрав длину импульса, выдаваемого на ERASE, можно стереть только первый сектор и сбросить его?.. (А может и вовсе ничего не стирать..)
Про битик спасибо, как-то упустил..

Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 17 2011, 22:26
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(overloaded @ Feb 18 2011, 01:16) *
Да, висел.

Нехорошо. Pull-up'ов там нет, бросать просто так нельзя.

Цитата(overloaded @ Feb 18 2011, 01:16) *
Просто в ДШ написано что секюрити бит стирается только после полного стирания флэш, а выходит, что, подобрав длину импульса, выдаваемого на ERASE, можно стереть только первый сектор и сбросить его?.. (А может и вовсе ничего не стирать..)

Длиной импульса уж точно ничего сделать нельзя - он просто запускает процесс, и не более того.
В вашем случае даже достоверно не известно, был ли бит защиты действительно установлен, так что дальнейшее расследование смысла не имеет.
Go to the top of the page
 
+Quote Post

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

 


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


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