“Hello, LED!” и плата FriendlyARM mini2440

Все, что ниже – мои собственные ИМХО, эмоции, впечатления и выводы. [и по лицу не бейте, пацаны..:D]

Каждый, кто предоставляет какой-либо материал по этой доске, норовит воткнуть ее фотографию. Я тоже так хочу.
На плате установлен микроконтроллер от Samsung, S3C2440A, максимальная тактовая которого заявлена в размере 533 МГц (это, кстати, повергло в неописуемое удивление одного моего коллегу, тяжело подползающего к семейству STM32). Этот камень не имеет встроенной программируемой флэш-памяти (только «Steppingstone» – внутренний SRAM-буфер на 4 кБ, служащий для загрузки), посему грузится извне. Для этого на плате установлено две микросхемы флэш, выбор которых осуществляется специальным переключателем: NOR-флэш (2 Мб) и NAND (128 Мб на моей плате). Современные платы, кстати, выпускаются с NAND объемом 256 Мб, а вообще за дополнительные 20$ можно заказать плату с 1 Гб флэш (но, думаю, тут таких извращенцев не имеется =)). В NAND в недалеком будущем я планирую загрузить android (сейчас там windows CE), а в NOR с завода прошит BIOS (supervivi). Я этого не знал и затер NOR в первый же вечер.
Собственно, разводка платы позволяет нарастить до 8 Мб NOR. Неплохо, правда? :)
Светодиодов для юзверей на плате предусмотрено четыре, и все зеленые. Печалька.
Подсоединены они к выводам порта B под номерами 5, 6, 7 и 8. Вот так:

К выводам S3C2440A светики подсоединены катодами, а аноды подтянуты к питанию. Этот фактор и моя невнимательность явились причинами того, что первая попытка помигать ими провалилась с треском. Собственно, всеми четырьмя я и буду сейчас самозабвенно моргать. (А таки в будущем сдую я пару зеленых и поставлю разноцветные).
Система тактирования довольно сильно отличается от мне полюбившихся STM32. Встроенный генератор отсутствует. То есть, S3C2440 работает или от кварца, или при наличии внешнего такта. А иначе – не работает.
Весьма интересной мне показалась возможность тактирования USB от отдельного источника (отличного от источника тактовых импульсов для процессора и периферии). Таким образом, тактовый сигнал FCLK (для ядра), HCLK (для периферии шины AHB) и PCLK (для периферии шины APB) генерирует блок MPLL, а такт UCLK (для USB) может генерироваться отдельно блоком UPLL.
Настройка коэффициентов для выбора вышеуказанных частот производится с помощью специального регистра MPLLCON, и тут есть интересная деталь. Система стартует непосредственно от кварца или внешнего источника колебаний. И пока в регистр MPLLCON не будут записаны значения коэффициентов m, p и s, блок генерации MPLL не запустится, и системная частота будет равна частоте кварцевого генератора или внешнего такта. Даже если мы не хотим менять настройки генератора, перезаписать значения по умолчанию нам придется. Надо, Федя, надо…
Дополнительная плюшка в виде вывода тактового сигнала наружу с настраиваемым источником присутствует. Правда, азиатские наши друзья из Samsung не рекомендуют нам использовать этот вывод в качестве источника PLL для других девайсов в нашей системе.
А вот настройка портов ввода-вывода S3C2440A мне такой интересной уже не показалась. Не густо, мягко говоря. Регистр GPnCON (control) позволяет нам настроить любой вывод порта в одном из трех режимов: вход, выход и режим альтернативной функции. Можно включить подтяжку к питанию с помощью регистра GPnUP. Подтяжку к «земле» включить нельзя – это вам не STM32. =)
Включаются порты все разом. В регистре контроля распределения тактирования есть лишь один бит, названный просто: CLKON_GPIO. И не волнует.
Итак, кратко по необходимому пробежался – приступаем к написанию собственно программы для микроконтроллера.
Прежде всего – в качестве стартовой площадки использовалась программа, идущая на диске к mini2440. Написать «с нуля» можно было без проблем, но так – быстрей, и вероятность скорого успешного запуска повышается.
В качестве IDE использовалась Metrowerks CodeWarrior for ARM Developer Suite. Свой любимый IAR я использовать не стал в виду различий в синтаксисе асма IAR и CodeWarrior. Проще говоря, IAR неистово ругался на некоторые команды и макросы стартап-файлов проекта, и пришлось лезть в CodeWarrior. Хотя паяльником я сделал себе зарубку на подоконнике вернуться к этому вопросу в недалеком будущем.
Пробегусь по настройкам проекта. Открываем вкладку настроек в главном окне проекта.

Да, за красным кружочком именно нужная нам кнопка.
Щелкаем по вкладке «Target settings», обращаем внимание на строку в окне «Post-linker»:

ARM fromELF (Executable and Linkable Format) – в двух словах, утилита, позволяющая нам получать исполняемый формат прошивки: .bin, .m32, .i32, .vhx
Далее спускаемся ниже и щелкаем по вкладке «ARM Assembler». Обращаем внимание на окошко «Architecture or Processor» — там стоит «ARM920T» — именно на базе этого процессора собран наш S3C2440A. В двух оставшихся выделенных окнах – настройки порядка байт (Little Endian) и рабочий режим процессора (32-разрядный ARM).

В окне «ARM C Compiler» особо интересного тоже ничего нет.

И – самое интересное – вкладка «ARM Linker»

В окне «RO Base» мы должны указать начальный адрес SDRAM для загрузки кода в оперативную память. В соответствии с картой памяти S3C2440A, адрес 0x30000000 является начальным адресом 6-го банка (SROM/SDRAM). Оперативной памяти у нас на борту 64 МБ, что дает нам возможность оперировать в пространстве 0x4000000, то есть 0x30000000..0x34000000.
Теперь заглянем в состав проекта (кстати, его название – 2440test).
Проект содержит стартап-файлы «2440init.s» (инициализация стека, памяти, тестовые процедуры режимов Stop и Sleep) и «2440Slib.s» (служебные процедуры MMU – memory management unit). Кроме привычного «main.c» файла находим также файлы «mmu.c» (инициализация MMU), «nand.c» (функции для оперирования флэш-памятью), и «2440lib.c» (служебные функции вроде инициализации портов, настройки коэффициентов блоков MPLL и UPLL, и т.д.). Ну и кроме прочего, мне пришлось создать хидер «s3c2440a.h», в котором я начал присваивать имена битам тех или иных регистров, которые я использовал в проекте (там не все, конечно же – придется дописывать по ходу процесса изучения платы). Как кому не знаю, а мне с именованными константами работать проще, нежели с записями вида: «rGPBCON = 0x155555».
Погружаемся в «main.c». Хотя чего там «погружаемся» — так, пятки намочим.
Смотрим код основной функции «main()»:
void Main (void)
{
MPLL_Init();
rCLKCON |= CLKON_GPIOEN;
Port_Init();
MMU_Init();
rGPBDAT &= ~(GPIO_GPB5 | GPIO_GPB7);
while(1)
{
rGPBDAT &= ~GPIO_GPB6;
rGPBDAT |= GPIO_GPB8;
Delay(500);
rGPBDAT |= GPIO_GPB6;
rGPBDAT &= ~GPIO_GPB8;
Delay(500);
}
}
В самом начале, как я и писал выше, мы настраиваем и запускаем генератор MPLL, иначе ничего у нас не получится. Далее разрешаем тактирование портов ввода-вывода и вызываем функцию инициализации этих самых портов (на деле, настраиваем только нужный нам Port B). Далее – вызов функции инициализации MMU (без этого никак). И, собственно, все готово для организации безудержного и развеселого перемигивания светодиодов. Как я писал выше, к выводам порта светодиоды подсоединены катодами – то есть для того, чтобы зажечь светодиод, на соответствующем выводе порта необходимо установить низкий уровень. Что первым делом я и устроил со светодиодами LED1 и LED3. А далее – в вечном цикле перемаргиваются светодиоды LED2 и LED4. Задержка реализована с помощью функции Delay(ms), для реализации которой используется ШИМ-таймер 3. Нечто подобное есть в библиотеке у ST (для STM32 точно), но там расчет строится на частоте SysTick, а здесь – на PCLK. Функцию можно доработать для микросекундных задержек, уменьшив величину, загружаемую в буфер таймера, в 1000 раз.
Вот и все. Остается нажать «Compile», а затем – «Make», и получим отчет об удачной генерации .bin файла прошивки.
Заталкивать прошивку в контроллер буду с помощью шедшего в комплекте LPT-программатора. Вот он:

Аццкий зверь на одной буферной микросхеме неудобен тем, что требуется железный LPT-порт. У меня в ноутбуке его нет (говаривают, что PCMCIA->LPT помогает в этих случаях, но я не рисковал покупать). Зато у меня есть древний как гомно мамонта второй ноутбук «Gateway Solo9000» с LPT-портом. Я его покупал когда-то для программирования ПЛИС Xilinx (покупать USB-программатор не разгонишься, ага).
Для собственно вталкивания прошивки во флэш воспользуемся программулиной «H-JTAG», которая, опять-таки, идет на диске в комплекте…ну и в сети ее достать не проблема.
После установки появится 5 разных иконок – нас в основном интересуют только «H-JTAG» и «H-Flasher».
Запускаем «H-JTAG». Появляется окно, которое сразу же деликатно и ненавязчиво предлагает нам поискать обновление. Тот древнейший ноутбук, на котором я работал, сроду сети не видел, а без Интернета искать обновления «H-JTAG» почему-то наотрез отказался. Капризный…
Зато для автоматического определения тарджет-контроллера сеть «H-JTAG-у» не нужна.

Подумал и определился:

Первым делом лезем во вкладку «Settings» -> «USB/LPT Selection». В появившемся окошке делаем выбор: «LPT(Parallel Port)». Кстати, автор программы одну букву «l» в слове «Parallel» в первом случае пропустил. Далее идем «Settings» -> «LPT JTAG Setting» и в возникшем окошке с кучкой вкладочек и галочек устанавливаем такие настройки:

Жмем «OK», а затем на основной панели инструментов нажимаем кнопочку «H-Flasher»

Возникает совершенно иное с виду окошко. Слева – пункты настроек от 1 до 5, справа – собственно само окно настроек. Смотрим:

Сначала выбираем нашу микросхему флэш-памяти, которую намерены прошить. Список относительно большой, но особо потеть не придется. Справа от списка, как видно, отображаются, кроме названия, основные характеристики и объем памяти.
Во вкладке «Configuration» нужно произвести настройки адресов: с какого адреса прошивать флэш и куда грузить программу в оперативной памяти.

Самое сложное и трудно объяснимое – это те Содом и Гоморра, которые творятся во вкладке «Init Scripts». Вначале я вообще проехал мимо этой вкладки, однако…после первого программирования прошиваться во второй раз флэшка отказалась, и определяться тоже не определялась. Я уж думал, что нахомутал по-крупному – однако вдумчивое изучение документации и материалов на форумах ясно указали на недостатки в настройках программы, связанных именно со скриптами инициализации. Суть в том, что данные скрипты выполняют полезные функции – например, системный сброс или инициализацию памяти. Вначале я пытался сочинить и слепить собственные скрипты, однако потом забил и нашел рабочий файл настроек «H-Flasher» с рабочими скриптами инициализации.

Впрочем, нет – один скрипт («SoftReset») я таки добавил самостоятельно. Ошибки записи периодически возникали, и оказалось, что это связано с тем, что программа в памяти осуществляет настройку MMU. А скрипт «SoftReset» перед осуществлением прошивки запрещает MMU, что делает возможным перепрошивку памяти.

В общем, ну их, эти скрипты… к такой-то бабушке. Дальше – собственно окошко программирования, «Programming».

В строке «Type» выбираем «Plain Binary Format», в окне «Dst Addr» — начальный адрес флэш (мы его уже указывали, но зачем-то он понадобился снова). Ставим «0».
За красным пятном на самом деле скрывается кнопка выбора файла прошивки. Нажимаем, в выскочившем окне выбираем этот самый файл.
Жмем «Program».

Дожидаемся окончания программирования, закрываем окно.
Нажимаем на плате «Reset», и вот оно, вот оно… Таки работает.


Видео я снимать, конечно же, не стал – незачем. Надеюсь, мне поверят на слово.
Таким образом, было потрачено немерено времени, зачем — неизвестно, польза результата тоже неизвестна. Главное, что все работает и мигает.=)
- +5
- 12 августа 2012, 04:04
- SubDia
- 2
Файлы в топике:
2440test.zip, H-Flasher_mini2440.zip
а ничего в нем нет. www.friendlyarm.net/products/mini2440
эти платы где-то района 2008-9 года, их уже даже не производят. где, а главное, зачем автор выкопал ее, это еще вопрос.
сейчас проще купить это www.hardkernel.com/renewal_2011/products/prdt_info.php?g_code=G133999328931 $150 за борду с современным SoCом я считаю вполне достойно.
эти платы где-то района 2008-9 года, их уже даже не производят. где, а главное, зачем автор выкопал ее, это еще вопрос.
сейчас проще купить это www.hardkernel.com/renewal_2011/products/prdt_info.php?g_code=G133999328931 $150 за борду с современным SoCом я считаю вполне достойно.
А это SoC? По-моему, нет же.
Ядро ARM920T, никаких дополнительных ништяков в нем нет. Ничего удивительного, в общем.))
Ядро ARM920T, никаких дополнительных ништяков в нем нет. Ничего удивительного, в общем.))
Ну вокруг него же не приходится городить чипсет, видеоадаптер и так далее. Так что вполне себе SoC.
Более-менее чистапроц — атом. Сам посмотри, сколько вокруг него обвязки. И сколько тут.
Более-менее чистапроц — атом. Сам посмотри, сколько вокруг него обвязки. И сколько тут.
Относительно — не спорю.
Но все же придерживаюсь мнения, что SoC — нечто более емкое, нежели данный камень.
Но все же придерживаюсь мнения, что SoC — нечто более емкое, нежели данный камень.
Я бы так не сказал. Из начинки более современных SoC'ов ему разве что видеоускорителя не хватает, но они появились недавно.
Их отродясь не было в SoC'ах аналогичного назначения. И сейчас нет. Типичный состав SoC'а для подобных задач — проц, видеоадаптер (LCD RGB и опционально другие интерфейсы), GPU или DSP (опционально), интерфейс внешней памяти (RAM, Flash), звук (опционально внутренний аудиокодек, т.е. ЦАП/АЦП), USB (девайс, опционально хост), поддержка карт памяти, набор интерфейсов (Ethernet, камера, SPI, I2C, UART, etc) и прочая МК-образная периферия.
Практически все это в сабже есть.
Практически все это в сабже есть.
Такие платы лучше под Linux использовать, а писать мелкие програмки под неё (без соответствующей OS) дело малоперспективное.
- jk_edesign
- 12 августа 2012, 14:17
- ↓
Я бы даже сказал, бесперспективное. В конце концов, можно слепить малюсенькую плату на том же STM32, которая обойдется в 10 раз дешевле, и под нее писать без ОСи.
Тут дело такое… любознательность. =)
Тут дело такое… любознательность. =)
Тогда да. Но кстати любознательность можно направить по например такому варианту — поставить Linux, разобраться в нем, запустить интересные поделки — например интернет радио, например как тут )) Ссылка Ссылка Аудио выход на плате я понимаю есть… )
- jk_edesign
- 12 августа 2012, 18:31
- ↑
- ↓
Кстати я себе такойже роутер заказал TP-WR703N )) И память для его апгрейда… 8 FLASH + 64 RAM
- jk_edesign
- 12 августа 2012, 19:04
- ↑
- ↓
Где флешку брали и по чем? А то из нормального только оптом (5-10 штук и более). поштучно по $5+ продают, что делает покупку вр703н несколько неоправданной.
MX25L6445EM2I-10G, на ebay 4.81$. Но кстати можно и на 16 поставить MX25L12845 формфактор немного другой на плату не встанет, но можно подпаять, подороже на пару зеленых будет. Цена вопроса наверное не существенна, интерес важнее.
Я кстати заказал еще Raspberry Pi, так мне выставили 16 недель ожидания!!! Я чуть не о… ел )) А на аукционе на ebay цена не менее 80-100, по сравнению с TP-WR703N за 20$ это конечно впечатляет…
Я кстати заказал еще Raspberry Pi, так мне выставили 16 недель ожидания!!! Я чуть не о… ел )) А на аукционе на ebay цена не менее 80-100, по сравнению с TP-WR703N за 20$ это конечно впечатляет…
- jk_edesign
- 12 августа 2012, 19:24
- ↑
- ↓
Мне в середине июня выставили 6 недель, и все еще не шипнули.
А где ты подходящее ОЗУ нашел? Оно довольно редкое.
Алсо, заменить память не так просто, как кажется. Плата (по крайней мере в моем 1043) хорошо отводит тепло и прогреть память до отлипания от платы весьма сложно. К тому же, если чутка недогреть — микра снимется с дорожками.
А где ты подходящее ОЗУ нашел? Оно довольно редкое.
Алсо, заменить память не так просто, как кажется. Плата (по крайней мере в моем 1043) хорошо отводит тепло и прогреть память до отлипания от платы весьма сложно. К тому же, если чутка недогреть — микра снимется с дорожками.
Да нет, это уже все делали Ссылка, прописать после загрузки надо в конфигах и все будет работать. С лишней RAM памятью можно например виртуальный диск сделать, лишним точно не будет.
- jk_edesign
- 12 августа 2012, 19:42
- ↑
- ↓
А, он мелкий. С такого память сдуть будет проще. А вот с TL-WR1043ND я наебался на отличненько, еще и одну площадку с платы содрал. К счастью, это был NC. И еще несколько площадок полусодраны (т.е. сама площадка отвалилась, но дорожка ее кое-как удержала до момента припаивания новых мозгов).
А память туда нужна, AFAIK, 32Mx16. Это довольно редкие чипы, но востребованные для подобных модов (в роутеры, в вогоплеер, в некоторые КПК...). Мне повезло найти подходящую планочку дешевой памяти с четырьмя чипами.
А память туда нужна, AFAIK, 32Mx16. Это довольно редкие чипы, но востребованные для подобных модов (в роутеры, в вогоплеер, в некоторые КПК...). Мне повезло найти подходящую планочку дешевой памяти с четырьмя чипами.
Я решил взять непаянное HY5DU121622CTP-D43, на ebay 6.94$ с доставкой, про планку тоже думал, но возиться с феном сильно не хочется и побаялся вдруг битую подсунут… китайса они такие, шлют как на картинке, а дальше их не волнует… )
- jk_edesign
- 12 августа 2012, 20:06
- ↑
- ↓
Кстати подскажите чем serial flash 8Мбайт прошивали? Вроде пишут что просто (даже lpt вариант есть), но пока не нашел…?
- jk_edesign
- 12 августа 2012, 21:40
- ↑
- ↓
Ага ну вот вроде нашелся кандидат, MX25L поддерживает Ссылка. Может кому пригодится…
- jk_edesign
- 12 августа 2012, 22:25
- ↑
- ↓
Я для аналогичной SPI-флэшки использовал SPIPGM. Работает через LPT-порт, требуется адаптер (простейший — просто запитать микросхему памяти от 3.3В и подключить к линиям порта через резисторы 470 ом, распиновка подключения указана в самой программе, да и гуглится без проблем). Можно сделать адаптер как по твоей ссылке.
А они поддерживают SPI Flash? Хотя по идее физический интерфейс тот же, да. Но достоинство конкретно этого метода в простоте аппаратной части — если нужно прошить одну микросхему, как это требовалось мне, то такой путь самый простой.
LPT конечно минус, но радиолюбителям он нужен часто и потому есть смысл поискать себе в лабораторию комп с ЛПТ. Сам не так давно собрал подобный, найдя в магазине дешевую старую материнку с набортными аудио, видео и процем (VIA C3 800МГц плюс VIA UniChrome 3 — тот еще слоупок, но ведь не крусис же на нем запускать).
LPT конечно минус, но радиолюбителям он нужен часто и потому есть смысл поискать себе в лабораторию комп с ЛПТ. Сам не так давно собрал подобный, найдя в магазине дешевую старую материнку с набортными аудио, видео и процем (VIA C3 800МГц плюс VIA UniChrome 3 — тот еще слоупок, но ведь не крусис же на нем запускать).
Есть подтверждения что 16МБ мод работает? Я не встречал что-то.
Интересно пропатчить оперативку до 128метров. Дилемма у меня такая сейчас, брать ещё один роутер только ради проверки, или ну его, один фиг столько оперы не надо.
Цена вопроса наверное не существенна, интерес важнее.Тогда зачем было брать самый дешёвый и относительно дохлый роутер? :)
Интересно пропатчить оперативку до 128метров. Дилемма у меня такая сейчас, брать ещё один роутер только ради проверки, или ну его, один фиг столько оперы не надо.
Я тоже не встречал ..., просто память искал по сайтам производителям (И потом в описании программатора spipgm увидел) что поддержка программирования 16 Мб Flash присутствует и соответственно предположил что можно попробывать… Но кстати думаю что идея может не так хороша, потомучто всеравно мало — Python наверное все равно не влезет, ему говорят под 20 надо (но я пока сам не проверил точно), я как раз для Python и хотел добавить. Скорее всего обойдусь просто внешней Гиговой флэшкой и поставлю на нее, там же и все остальные данные буду хранить.
- jk_edesign
- 13 августа 2012, 05:32
- ↑
- ↓
Тогда зачем было брать самый дешёвый и относительно дохлый роутер? :)Размер как раз понравился, и он не такой уж и дохлый )), 400МГц всетаки, по сравнению с моими WL-520gU и WL-HDD, за такую цену и размеры очень даже хорошо…
- jk_edesign
- 13 августа 2012, 05:36
- ↑
- ↓
Однако с OpenWRT роутер кушает больше и больше тормозит, чем тот же DIR-320 с прошивкой от Олега (Vampik'ом адаптированная под дир). Только что flashfs не удобен, хотя порой это плюс, т.к. не забъется встроенная память при сбое (отвалился диск когда например).
Размер — да, плюс несомненный. его и встроить можно в девайс какой. И порты для встраивания удобнее расположены, не надо дорожки резать от юсб и пр.
Размер — да, плюс несомненный. его и встроить можно в девайс какой. И порты для встраивания удобнее расположены, не надо дорожки резать от юсб и пр.
Умельцы… откуда у народа идеи берутся? =)
Аудио есть, да. I2S, кодек на плате.
Было интересно поковырять железо; однако одно другому не мешает — два вида флэш на плате способствуют всяко-разным экспериментам…
Аудио есть, да. I2S, кодек на плате.
Было интересно поковырять железо; однако одно другому не мешает — два вида флэш на плате способствуют всяко-разным экспериментам…
ФрэндлиАрм помоему поставляет даже образ готовый со всеми драйаерами для данной платы… тогда прикрутить радио и например IR (LIRC) будет вполне возможно за пару деньков, если на плате USB HOST, то можно например вот такое добавить Ссылка, это точно под Linux заработает (ссылка как подключать есть у продавца если что)
- jk_edesign
- 12 августа 2012, 21:46
- ↑
- ↓
Комментарии (52)
RSS свернуть / развернуть