|
|
  |
Самопрограммирование mega640. |
|
|
|
Jul 21 2008, 17:32
|
Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340

|
Необходимо обновлять загрузчик, есть ли возможность прошить загрузчик(NRWW область) из памяти программ (NWW область) ? Код взял из примеров Atmel, страница памяти программ остается не тронутой, не стирается .... Если код располагается в NRWW областе то страница стирается, вне ее нечего не просиходит... код: ldi ZL,0x00 ldi ZH,0x70 ldi temp,(1 << PGERS | 1<< SPMEN) ; Page Erase call Do_spmF ldi temp,(1 << RWWSRE | 1<< SPMEN) call Do_spmF Do_spmF: push temp1 Do_spmF1: in temp1,SPMCSR sbrc temp1,SPMEN rjmp Do_spmF1 in temp1,SREG cli Wait_eeF: sbic EECR,EEPE rjmp Wait_eeF out SPMCSR,temp spm out SREG,temp1 pop temp1 ret
|
|
|
|
|
Jul 22 2008, 13:31
|
Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340

|
Цитата(arttab @ Jul 22 2008, 17:26)  обновлялка загрузчика должна быть в NRWW. Хотя может для новых камней чего поменялось Все также осталось, специально смотрел.... у меня так и реализовано, хотел обновлять загрузчик целиком, но значит увы нельзя ....
|
|
|
|
|
Jul 23 2008, 08:05
|

Местный
  
Группа: Свой
Сообщений: 232
Регистрация: 26-02-07
Из: г. Зеленоград
Пользователь №: 25 669

|
Цитата(_Pasha @ Jul 23 2008, 11:51)  Иными словами, во время записи происходит какая-то чехарда с фьюзами? Затрудняюсь ответить что реально происходит, но при отладке в симуляторе AVR STUDIO - все пишется, а реально в контроллере запись не происходит а сам контроллер куда то "улетает". Приведенной выше способ надежно работает.
--------------------
Вяжешь - вой, а поедешь - песни пой. Между "хочу" и "можно" всегда есть дистанция
|
|
|
|
|
Jul 23 2008, 08:21
|
Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340

|
Цитата(oran-be @ Jul 22 2008, 20:15)  Совершенно непонятно - в чем проблема. Если зашарить битами защиты область NRWW то все будет читаться и писаться, только при организации потока записи необходимо учитывать, что при записи области NRWW проц будет подвисать на момент записи. все расшарино, на 128L номер не прошел.... только из области загрузчика работает. Цитата(IJAR @ Jul 23 2008, 11:43)  Сталкивался с подобной проблемой - решил ее так: Загрузчик размещен в области BootLoader, при этом функция непосредственной записи во Flash занимает строго 1 страницу в 256 байт (хотя сама она короче) Перед заменой загрузчика, во Flash для Application, пишется промежуточный загрузчик, но он использует функцию записи страницы Flash из основного загрузчика. Далее - управление передается на промежуточный загрузчик, который производит обновление основного, при этом страница с функцией записи Flash пропускается. Все отлично работает. Нечто подобное и сделано, только все сразу прошито, в последнем секторе содержиться подпрограмма перепрошивки всего. Вообще моглибы сделать и пропроще единую область для перепрошивки, с логическим разделением на боот и все остальное(надо посмотреть как там у арм7 с этим делом), лучше подождать во время перепрощивки с подвисанием, чем так изголяться с загрузчиком... Цитата(IJAR @ Jul 23 2008, 12:05)  Затрудняюсь ответить что реально происходит, но при отладке в симуляторе AVR STUDIO - все пишется, а реально в контроллере запись не происходит а сам контроллер куда то "улетает". Приведенной выше способ надежно работает. Одним словом симулятор не больше и не меньше..... в нем поначалу пробовал все ок в реальном железе область закрывается на чтение все 0xff и проц неподвисая выполняет эти 0xff .... да еще при последующем считывании flash оказывается что страница так и не стерта ! все как было так и осталось На мой взгляд перемудрил атмел....
|
|
|
|
|
Jul 23 2008, 12:36
|
Местный
  
Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017

|
Цитата Иными словами, во время записи происходит какая-то чехарда с фьюзами? Никакой чехарды нет. Из Application-секции команда SPM не работает ни при каких фьюзах(вернее, локах  ). SPM может выполнятся только из секции бутлоадера. А может и не выполнятся: 1. если делается попытка записи в секцию Application при выставленом [SPM prohibit in Application section] (иными словами, запрет обновления секции приложения) 2. если делается попытка записи в секцию bootloader'а при выставленом [SPM prohibit in Bootloader section] (запрет обновления секции загрузчика) То есть, сам загрузчик (реализация его алгоритма) может размещаться где угодно (Application или Bootloader, RWW или NRWW), но непосредственно функция записи или, если еще точнее, команда spm, должна размещаться в секции Bootloader'а. Там же должен размещаться код ожидания окончания записи, если мы вызвали ее из секции приложения и пишем в секцию приложения (сорри за тавтологию) Цитата обновлялка загрузчика должна быть в NRWW Позвольте уточнить - должна быть в секции bootloader'а. Граница между NRWW и RWW - фиксированная, а Application/Boolloader section - может изменятся фьюзами. Cекция Bootloder'a всегда находится в области NRWW. При определенных фьюзах (BOOTSZ != 0) в область NRWW попадает конец секции Application (в которой spm не работает) Как писал IJAR, Вам нужно в секции бутлоадера зарезервировать одну страничку, которая никогда не будет обновлятся (в т.ч. и при обновлении кода загрузчика) и в ней разместить функцию непосредственной записи + ожидания окончания записи странички (при необходимости). Еще в ней можно сделать дополнительную проверку ZH:ZL, чтобы не стереть саму себя.
|
|
|
|
|
Aug 25 2008, 12:55
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801

|
Цитата(Александр Куличок @ Jul 23 2008, 15:36)  Вам нужно в секции бутлоадера зарезервировать одну страничку, которая никогда не будет обновлятся (в т.ч. и при обновлении кода загрузчика) и в ней разместить функцию непосредственной записи + ожидания окончания записи странички (при необходимости). Я делаю ни одну, а несколько, в которой размещаю обновлялку самого загрузчика и набор самых необходимых подпрограмм
|
|
|
|
|
Aug 26 2008, 04:27
|
Участник

Группа: Свой
Сообщений: 68
Регистрация: 29-12-06
Из: Омск
Пользователь №: 23 999

|
Не знаю, как насчет 640-й, но некоторые Меги не поддерживают побайтную запись флеш. Т.е. с каждым байтом будет переписываться вся страница из почти пустого буфера, т.е. 0хFF. В итоге мы увидим полностью затертую память. Делал на 644 самопрограммирование по COM-порту из стандартного набора на асме постранично, и все работало! Размещается прога в секторе smallboot. Чтобы перешить сам загрузчик, надо исполнять подобную программу из общей памяти. Вот и все  Код .equ PAGESIZEB = 256;PAGESIZEB is page size in BYTES, not words .org SMALLBOOTSTART
.equ spm_pagebuf=$110; 256bytex .equ spm_numpages=$10A .equ spm_crc1=$10B .equ spm_crc2=$10C .equ spm_crc3=$10D .equ spm_crc4=$10E
com_spi: cli rcall com__read cpi tmp,'F' breq spi_flsh jmp 0; suxxxxxxxxxxxxxx!!!!!!!!
spi_flsh: rcall com__read sts spm_numpages,tmp clr zh clr zl
lds cnt1,spm_numpages
spm_rdda1: push cnt1 ldiy spm_pagebuf ldi tmp,0xCB rcall com__write clr cnt spm_rdda: rcall com__read st y+,tmp djnz cnt,spm_rdda ldiy spm_pagebuf rcall Write_page inc zh pop cnt1 djnz cnt1,spm_rdda1
ldi tmp,0xCB rcall com__write jmp 0
Write_page: ; Page Erase ldi tmp, (1<<PGERS) | (1<<SPMEN) rcall Do_spm ; re-enable the RWW section ldi tmp, (1<<RWWSRE) | (1<<SPMEN) rcall Do_spm ; transfer data from RAM to Flash page buffer ldi cnt, 0 ;init loop variable 256
Wrloop: ld r0, Y+ ld r1, Y+ ldi tmp, (1<<SPMEN) rcall Do_spm adiw ZH:ZL, 2 subi cnt, 2;use subi for PAGESIZEB<=256 brne Wrloop
dec zh ; execute Page Write ldi tmp, (1<<PGWRT) | (1<<SPMEN) call Do_spm ; re-enable the RWW section ldi tmp, (1<<RWWSRE) | (1<<SPMEN) call Do_spm ; read back and check, optional
Return: in tmp, SPMCSR sbrs tmp, RWWSB; If RWWSB is set, the RWW section is not ready yet ret rjmp Return
Do_spm: ; check for previous HW ops complete Wait_spm: in tmp1, SPMCSR sbrc tmp1, SPMEN rjmp Wait_spm Wait_ee: sbic EECR, EEPE rjmp Wait_ee ; SPM timed sequence out SPMCSR, tmp spm ret
com__write: lds tmp1,ucsr0a sbrs tmp1,udre0 rjmp com__write sts udr0,tmp ret com__read: lds tmp1,ucsr0a sbrs tmp1,rxc0 rjmp com__read lds tmp,udr0 ret
|
|
|
|
|
Aug 26 2008, 08:47
|
Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340

|
Цитата(Syberian @ Aug 26 2008, 08:27)  Чтобы перешить сам загрузчик, надо исполнять подобную программу из общей памяти. Вот и все  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Вы сами то пробовали таким образом перешивать загрузчик из основной области ? В теории все сходится да на практике расходится... Повторюсь еще раз в симуляторе ВСЕ перешивается.... на стендах мега 128 и 640 порепрошить загрузчик получилось только из загрузочной области, при перепрошивке из основной области проц неодекватен тк процессор не останавливается в момент прошивки а продолжает исполнять код в данном случаии FF по всей памяти. вот теперь все
|
|
|
|
|
Aug 26 2008, 19:26
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801

|
Цитата(cpl @ Aug 26 2008, 12:47)  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Вы сами то пробовали таким образом перешивать загрузчик из основной области ? В теории все сходится да на практике расходится... Повторюсь еще раз в симуляторе ВСЕ перешивается.... на стендах мега 128 и 640 порепрошить загрузчик получилось только из загрузочной области, при перепрошивке из основной области проц неодекватен тк процессор не останавливается в момент прошивки а продолжает исполнять код в данном случаии FF по всей памяти. вот теперь все  Команда SPM может выполняться только из секции загрузчика... Это центральная идея вокруг которой крутятся все методики перепрошивки FLASH.
|
|
|
|
|
Aug 26 2008, 20:01
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(Боинг749 @ Aug 26 2008, 22:26)  Команда SPM может выполняться только из секции загрузчика... Это центральная идея вокруг которой крутятся все методики перепрошивки FLASH. Ну, чего нового Вы здесь добавили? автор и сам в курсе а Александр Куличок и так довольно подробно обяснил. ОФФ: Действительно, складывается впечатление, что Вы топик не читаете а проглядываете на скорую руку. ПС: Ничего личного.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Aug 26 2008, 20:19
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801

|
Цитата(sKWO @ Aug 27 2008, 00:01)  Ну, чего нового Вы здесь добавили? автор и сам в курсе а Александр Куличок и так довольно подробно обяснил. ОФФ: Действительно, складывается впечатление, что Вы топик не читаете а проглядываете на скорую руку. ПС: Ничего личного. Может я и правда ничего нового не добавил... Каюсь.. Я просто хотел сакцентрировать внимание топикстартера на главном моменте... Потому что судя по его последнему топику он так и не понял, что SPM может выполняться только из загрузчика, расположенного в секции NRWW. И что при самопрограммировании секции NRWW проц останавливается до окончания SPM. А при самопрограммировании RWW проц может читать и выполнять код только из NRWW. И что после окончания операции программировании RWW нужно разрешить доступ к RWW иначе все ячейки RWW будут читаться как $FF
Сообщение отредактировал Боинг749 - Aug 26 2008, 20:21
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|