Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прошивка NOR-FLASH
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ST_Senya
Разбираясь с прошивкой NAND flash на плате SMDK6410 (содержащей процессор S3C6410 c ядром ARM1176), похерел NOR флэш. Теперь вот не фига не могу прошить загрузчик в NOR флэш. NOR AM29LV800BB. Загружаю свой скрипт в OpenOCD. Вот его код

Код
#*******************************************************************************
***********************************
#*********************************************OPENOCD.CFG***********************
***********************************
#*******************************************************************************
***********************************
#Вешаем и настраиваем JTAG на параллельный порт LPT1
interface parport
parport_port 0x378
parport_cable arm-jtag

#Настраиваем плату
source samsung_s3c6410.cfg
set  _CHIPNAME s3c6410
set  _ENDIAN little
set _ETBTAPID 0x2b900f0f
set _CPUTAPID 0x07b76f0f
jtag newtap $_CHIPNAME etb -irlen 4 -expected-id $_ETBTAPID
jtag newtap $_CHIPNAME cpu -irlen 5 -ircapture 0x1 -irmask 0x1f -expected-id $_CPUTAPID
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME arm11 -endian $_ENDIAN  -chain-position $_TARGETNAME -variant arm1176

jtag_nsrst_delay 500
jtag_ntrst_delay 500

arm11 memwrite burst disable
reset_config trst_and_srst

etm config $_TARGETNAME 16 normal full etb
etb config $_TARGETNAME $_CHIPNAME.etb

$_TARGETNAME configure -work-area-phys 0x00000000 -work-area-size 0x00100000

#Настраиваем NOR FLASH
set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME cfi 0x00000000 0x00100000 2 2 $_TARGETNAME

#Делаем настройки памяти SDRAM через проц
$_TARGETNAME configure -event reset-init {
    puts "Halting target"
    poll
    sleep 1
    halt
    wait_halt
    puts "Clock/Timer settings"

    reg cpsr 0x600001D3

    arm mcr 15 0 15 2 4 0x70000003

    mww 0x7e004000 0x00000000

    mww 0x7e00f120 0x00000003

    puts "Operating Mode Change to Sync Mode"
    mww 0x7e00f900 0x0000805E
    sleep 1000

    mww 0x7e00f900 0x000080DE
    sleep 1000

    mww 0x7e00f000 0x0000ffff
    mww 0x7e00f004 0x0000ffff
    
    mww 0x7e00f020 0x01047310
    
    mww 0x7e00f00c 0x81900302
    mww 0x7e00f010 0x81900303
    
    mww 0x7e00f01c 0x00000003
    
    puts "DRAM Initialization"
    mww 0x7e001004 0x00000004
    
    mww 0x7e001010 0x0000030c
    
    mww 0x7e001014 0x00000006
    mww 0x7e001018 0x00000001
    mww 0x7e00101c 0x00000002
    mww 0x7e001020 0x00000007
    mww 0x7e001024 0x0000000A
    mww 0x7e001028 0x0000000C
    mww 0x7e00102C 0x0000010B
    mww 0x7e001030 0x0000000C
    mww 0x7e001034 0x00000003
    mww 0x7e001038 0x00000003
    mww 0x7e00103C 0x00000002
    mww 0x7e001040 0x00000002
    mww 0x7e001044 0x00000011
    mww 0x7e001048 0x00000011
    
    puts "Memory Configuration Register"
    mww 0x7e00100C 0x00010012
    puts "Memory Configuration Register 2"
    mww 0x7e00104C 0x00000B41
    
    puts "Chip 0 Configuration"
    mww 0x7e001200 0x000150F8
    
    puts "Memory Direct Command"
    mww 0x7e001008 0xc0000000
    mww 0x7e001008 0x00000000
    mww 0x7e001008 0x40000000
    mww 0x7e001008 0x40000000
    mww 0x7e001008 0x000A0000
    mww 0x7e001008 0x00080032
    mww 0x7e001004 0x00000000    
}

#*******************************************************************************
***********************************
#*******************************************************************************
***********************************
#*******************************************************************************
***********************************

Запускаю в терминале openocd.exe
получаю рис.1

Далее набираю в другом терминале telnet localhost 4444
В нём набираю reset init
получаю рис.2

Затем последовательно набираю команды flash banks, flash probe 0, flash protect 0 0 18 off, flash protect_check 0, flash info
рис.3 (Причём когда выполняется команда flash protect там пишется что команда не поддерживается. Т.е. не получится не установить не снять защиту так???)

Далее я сделал следующие вещи. Набрал команду dump_image NOR.bin 0x00000000 65536 т.е. якобы считал область где лежит загрузчик. Получил файл NOR.bin
рис.4 (Приведён фрагмент загрузчика. С помощью него программа DNW подключалась к плате и выдавала сообщения в COM порт с возможностью настройки разных параметров... Теперь эта возможнасть исчезла))))

После этого на радостях я решил проверить прошивку в NOR (эксперементировать на NOR из платы не хотел, но начальник настаял))
и так набрал команды flash erase_sector 0 0 18, а потом что бы убедиться что я с стёр память опять набираю команду dump_image NOR.bin 0x00000000 65536 и получаю следующую картину
рис.5 (вроде как всё получилось, всё стёрлось, причём команда flash erase_adress тоже имела такой же эффект).

А вот команды прошивки не сработали!!!!!!!!!! все до единой выдают ошибки. Вот пример команды flash write_bank 0 NOR.BIN 0 (причём сначала вроде она как пытается грузить, потому что ошибка вылетает не сразу). При этом если потом попробывать повторить команду (я взял уже flash write_image NOR.bin), то типо пишет что проц не остановлен и приходиться набирать halt, что бы дальше работать.
рис.6

что я делаю не так??? Где ошибка. Почему не прошивается NOR. На защиту и адресацию я думаю не имеет смысла валить? Ведь нор то потёрся, значит уже защита там наверное отключена, а насчёт адресации, параметры то теже что и при считывании. Но не фига не прошивается...( Да кстати при прошивке прога ругалась что типо нужно указать -work-area-phys. Без этого команды прошивки вообще не запускались (А вот на чтение работали!). Я добавил вот эту строчку, правдо не знаю всё ли я правильно сделал...
$_TARGETNAME configure -work-area-phys 0x00000000 -work-area-size 0x01000000

Dron_Gus
-work-area-phys указывает адрес РАМ памяти для временного расположения необходимых данных. Если вы проинициализировали внешнюю память, то указывайте ее адрес. Кажется у 6410 она не с 0х0.
А вообще проще собрать u-boot, загрузить его сразу в РАМ и самим себя прошить.
load_image ...
resume ...
ST_Senya
Цитата(Dron_Gus @ Oct 2 2010, 16:17) *
-work-area-phys указывает адрес РАМ памяти для временного расположения необходимых данных. Если вы проинициализировали внешнюю память, то указывайте ее адрес. Кажется у 6410 она не с 0х0.
А вообще проще собрать u-boot, загрузить его сразу в РАМ и самим себя прошить.
load_image ...
resume ...


А как собрать нужный мне u-boot???
Dron_Gus
В сети много инструкций. Поддержка smdk6400 есть в u-boot'е из git'а.
ST_Senya
Цитата(Dron_Gus @ Oct 5 2010, 17:55) *
В сети много инструкций. Поддержка smdk6400 есть в u-boot'е из git'а.



Проблема с прошивкой NAND и NOR частично решилась. Полуилось прошить и считать и NOR и NAND c помощью OpenOCD. Но после того как мы перепрошили NOR. А потом с помощью DNW прошили NAND и попытались с него загрузится, вылетает ошибка Ethernt controller. Вы с такой проблемой не сталкивались? или быть может можете предположить из-за чего такое могло возникнуть? перемычки на плате не переставлял. Прошил тот же загрузчик в NOR..

Да и кстати ЕСЛИ проршить образ просто в оперативо то запускается и всё работает!
Dron_Gus
Откуда вылетает эта ошибка? На какой стадии загрузки? В каком состоянии остается процессор? Куда указывает PC?
ST_Senya
Цитата(Dron_Gus @ Oct 8 2010, 12:48) *
Откуда вылетает эта ошибка? На какой стадии загрузки? В каком состоянии остается процессор? Куда указывает PC?


Всё проблема решилась. Теперь можно свободно читать стирать и записывать в NOR (AM29LV800) и NAND (K9F2G08) с помощью программы OpenOCD и программатора ARM-JTAG.
Ниже представлена папка с конфигурационными файлами для SMDK6410. Естественно если NAND и NOR будут другими то придётся править конфигурационный файл openocd.cfg

Однако скорость с которой происходит запись и чтение flash оставляет желать лучшего. Если загрузка в NOR ещё терпима (т.к. загрузочник всего весит около 65 Кбайт), то загрузка более чем 100 мегабайтного образа WinCE в NAND через JTAG при такой скорости загрузки просто невозможна. Поэтому нами был преобретён программатор J-Link for ARM, от IAR Systems. Данный программатор позволяет загружать данные со скоростью около 700 Кбайт/c. Что является решением выше описанной проблемы. Однако при "подключении" данного программатора к OpenOCD вылетает ошибка (рис.1). Хотя сам файл конфигурации я изменил минимально. А именно заменил строчку:

#****************************************************
#Вешаем и настраиваем JTAG на параллельный порт LPT1
interface parport
parport_port 0x378
parport_cable arm-jtag
#****************************************************


на строку вида:

#****************************************************
#Вешаем и настраиваем JTAG на программатор J-Link
interface jlink
#****************************************************

Кто-нибудь сталкивался с такой проблемой??? или быть может знает в чём она заключается и как её решить???
Dron_Gus
Я им пользуюсь под Linux'ом. Там, для поддержки j-link, надо собирать openocd с соответствующим ключом. Плюс в конфиге надо указать "source jlink.cfg". Плюс где-то (может и в jlink.cfg) надо указать VID и PID Вашего j-link (хотя они там должны быть).
ST_Senya
Цитата(Dron_Gus @ Oct 12 2010, 09:39) *
Я им пользуюсь под Linux'ом. Там, для поддержки j-link, надо собирать openocd с соответствующим ключом. Плюс в конфиге надо указать "source jlink.cfg". Плюс где-то (может и в jlink.cfg) надо указать VID и PID Вашего j-link (хотя они там должны быть).


А не омгли бы вы дать ссылку на сборку OpenOCD??? Т.е. что геде я должен взять и как собирать с каким ключом? Я то свой OpenOCD просто инсталятором установил под Windows и всё, походу в этом и есть причина.

"source jlink.cfg" это и есть interface jlink. Просто команда source подключает файл jlink.cfg в котором только одна коммандная строчка "interface jlink". Т.е. настройки то минимальны.
Dron_Gus
Я брал отсюда http://openocd.berlios.de/web/ через git. Там же подробная инструкция как собирать. Как собрать под win не знаю smile.gif
ST_Senya
Кстати я так понял вы поднимаете на SMDK6410 Linux? а ене поделитесь информацией что для этого нужно? Это уже чисто для моего кругозора. Хотелось бы тоже поднять Linux на ней и попробывать запустить тестовую програмку. В отделе то у нас стоит на ней WinCE 6.0. Там стуию ставить надо, патчить её,BSP к плате нужно. А какие средства нужны для однятия Linux? Если можно то конкретнее какой компилятор среда, и т.д. Спаибо.
Dron_Gus
Не совсем. На s3c2416. Но суть та же. smile.gif Поднимать почти ничего не надо. Поддержка есть в мэйнлайновом ядре. Правда, как часто бывает, немного поломанная. Ну и под свою периферию надо подтачивать.
Что надо:
1) линукс машина. удобней, если не виртуальная (из-под виртуалки у меня не заработал j-link)
2) кросс gcc компилятор. например (http://www.codesourcery.com/)
3) загрузчик (u-boot)
4) ядро (http://www.kernel.org/)
5) как только заработает загрузчик и ядро можно переходить к созданию/скачиванию rootfs. Тут вариантов тьма.
Если плата популярная и/или не пугают трудности можно освоить сборку пунктов 2-5 с помощью OpenEmbedded (http://wiki.openembedded.org/index.php/Main_Page)
ST_Senya
Спсибо. Сейчас вот WinCE 6.0.подниму на плате, она уже прадвдо поднята нами давно, но я хочу попробывать QT в написании графической оболчки для программы... и буду разбираться с Linux.

yuray
Jlink подключается как
source [find interface/jlink.cfg]
в моём случае (клон) потребовалось прописать ещё и скорость. При чём гадски маленькую
adapter_khz 1
В противном случае валились ошибки либо про usb, либо про лишние данные в цепочке.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.