-Музыка

Прошлые

Воскресенье, 07 Мая 2017 г. 03:42 + в цитатник

выхи посвятил очень насыщенной социалочке, так что эти дни хочется посвятить производству и задротству с паяльником, программатором и шпинделем. Поскольку я к электронным игрушкам подхожу довольно олдскульно - с программатором типа STK200 (пять проводков из LPT) и все Arduino-подобные упрощалки мне чужды, потому моя ардуина отладочная плата для AVR, NAND-флешки на 1ГБ и дисплея от Nokia 1616 LCD выглядит следующим образом:


PCB_LCD_Nokia_1616_NAND_FLASH (654x700, 233Kb)

Уже в заделе, чтобы можно было внедрить в 5.25" отсек компьютера и выводить на дисплей всяческую моддерскую ересь модными BITMAP-шрифтами (что там моддеры выводят? Температуры, загрузку ЦП, ОЗУ, ну то, что ни разу в жизни знать не полезно). Также есть две кнопки, у которых схема подключения настолько несовершенна, что лучше про них забыть. Они ввиду нехватки свободных пинов ATMega328 подключены параллельно к линиям #WE и ALE флешки. Для индексации, на плате есть:


• ATMega328 в DIP-исполнении
• MCP42010 - переменный резистор/потенциометр с SPI-управлением для регулировки яркости
• CH340G - мост USB-UART, который я искренне полюбил, однажды доставшись мне от одного конченного наркомана, я заказал ещё 25 штук и сую куда ни попади теперь.
• SAMSUNG K9K8G08U0B PIB0 - NAND-флеш память на 1ГБ, изъятая то ли из плеера, то ли откуда ещё.
• К142ЕН3Б - винрарный ☭ стабилизатор в золоте, на 3,3В для флешки.

Такая вот геттообразная ардуино отладочная плата. Она умеет общаться по программному SPI с дисплеем от Nokia 1616 (рекомендую всем паялам, в Art-GSM стоит копейки, лярвочка привезла 10 штук и я их распихиваю по устройствам), код вывода оптимизирован на ассемблер так, что инверсия бита порта CLK происходит в 1 такт, а значит заливка белым или чёрным экрана это не посылка двух байт на пиксел, а лишь ~16...20 тактов (+циклы с 8-битными счётчиками), что означает LCD CLS менее, чем за 400 мс при кварце 16 МГц. Плата также умеет выводить картинку прямо из UART (тот самый USB дисплей, но быстрее всего получается выводить картинку на LCD из флеш-памяти NAND. Заранее оптимизированная картинка о двух байтах на пиксел (RGB 5-6-5) залита постранично на флешку, остаётся только дёргать #RE (2 раз) и CLK (16 раз) и преобразовывать параллельную шину флешки в последовательную DATA дисплея. Никаких SD-карт! А также на этой плате можно вылизать методы низкоуровневого доступа к TSSOP-чипам памяти, алгоритмы шифрования, контрольные суммы и файловую систему для AVR.


И разумеется, после смены компа мне стало острейше не хватать LPT-порта на Winbond-чипе, не PCI-LPT, который с Win7x64 не то, что через InpOut, и DLPortIO плохо работает через CVAVR. Приходилось для заливки прошивки пользовать старую машину по RDP, а это лишний шум и геморрой. Вот тут бы и обратиться к идеологии прошивки по USB Arduino, только без дикой для белого человека Arduino IDE. А чтобы в нормальном таком ассемблероподобном BASCOM-AVR от MCS Electronics.


Написано много слов в интернетах, что BASCOM-AVR умеет программировать как через STK200, также как и через USB ASP (руки дойдут однажды:)), так и через их AVR USB-загрузчик MCS Bootloader. Но вот же в чём беда, что по схеме аппаратная UART пара RX-TX висит у меня на шине данных к NAND флешке, и общение ATMega с CH340G происходит через Software UART, а загрузчик для компактности написан под аппаратный UART. Ну, MCS приложили исходник загрузчика BootLoader_m328.bas, который нагуглить та ещё проблема.


Как выяснилось из чтения мануалов и форумов, загрузчик ни что иное, как кусок кода, который при использовании метауказаний компилятору $loader $loadersize размещается в конце области памяти контроллера по дальним адресам типа $3c00, $3800, $3f00, $3e00 (для ATMega328) и при помощи фьюзов BOOTRST, BOOTSZ0...BOOTSZ1 выставляется первичное действие контроллера (адрес прыжка) к этому загрузчику, который, например, ожидает по UART байт 123 или иной другой, чтобы начать запись прошивки, побайтно SPM-LPM командами принимая её из UART. Если же байт 123 или иной другой не приходит, прыгаем на адрес $0000, где по идее лежит основная программа. Размер основной программы, при наличии загрузчика в контроллере, ограничивается 30КБ, на 2КБ меньше.


Мой модифицированный загрузчик MCS для ATMega328 занял порядка 1024 слова (2 КБ), это много по меркам памяти контроллера, однако что поделать (жертвы), посему шить его надо по адресу $3c00, соответсвенно ему и выставляем фьюзы в CVAVR.


Бац, и ниxyя не работает. Ну, загрузчик прошивается в конец, даже работает, соединяется с BASCOM на скорости 115200, пишет отладочное приветствие "LDR", происходит запись принятой прошивки (основная программа на BASCOM-AVR или AVR-ASM, где метадирективой $loadersize=1024 указывается размер загрузчика, который не затереть бы...), прошивка стартует, выполняется цикл (общение по UART с прогой на ПК), но... Жмём RESET, и нет приветствия "LDR", что говорит о том, что загрузчик не запустился повторно с $3c00, а происходит запуск основного куска кода с $0000.


Фьюзы загрузчика в CVAVR, которые не влияют на результат по неведомым причинам

Проебшись 4 месяца набегами, перебрав все возможные комбинации фьюзов, таки наступил прогресс: сначала нажав кнопку Program All, зашил через CVAVR какие-то ещё ЗАПОВЕДНЫЕ БАЙТЫ, о которых в диалоговом окне ни слова, и загрузчик перестал шить SPM-ом вообще, и это были не LOCK-биты, а какая-то неведомая хepь. Хотя визуально всё оставалось на местах (зашитые фьюзы читались и чекбоксы ставились), это не был глюк CVAVR или битый чип Atmel. Просто фьюзы не зашивались, и на адресе $0000 были значения FFFF, которые пропускались как NOP контроллером и в итоге первый раз всегда запускался загрузчик, когда счётчик команд доходил до $3c00.


Корректные фьюзы в BASCOM-AVR

И только прочитав, что иногда PonyProg шьёт неверно фьюзы, я решил попробовать шить фьюзы не CVAVR, а STK200 BASCOM-AVR. И вуаля, вот оно счастье! CodeVision AVR тоже в помойку, как и PonyProg, за неправильные фьюзы! Надо выставлять в BASCOM-AVR следующие биты:


• Fusebit High DE 01:Bootsize 1024 words
• Fusebit F 0:Select BOOT vector

Ну, умный разберётся, дурак не полезет, короче из всех программаторов наибольшую верность заслуживает BASCOM-AVR.


Также была реализована следующая фича: любой Arduino просит жать RESET чтобы войти в загрузчик ручками, хотя люди с AVRProject пишут, что можно сигнал квитирования DTR (который COM-мыши пользовали для питания) подключить к ноге RESET контроллера, и перезагружать контроллер без участия кнопки. Проверено - RESET via DTR работает и штатно поддерживается MCS Bootloader / Programmer даже через мост CH340G.


Днём и ночью Nokia 1616 (640x621, 105Kb)

Это означает, что теперь я смогу зашить таким образом контроллер станка и апдейтить прошивку онлайн. Также, что я таки рожу более портативный девайс, который без геморроя прошивать можно будет.


Из минусов прошивки по USB/UART:


- нет возможности шить фьюзы и локбиты, что ограничивает манипуляции с частотами и делителями частот, watchdog и т.д., но и нет возможности сделать контроллер кирпичём.


- вероятность сбоя ввиду бросков питания и наводок на линии UART повышаются. То есть случайность может передать "123" контроллеру, он войдёт в режим прошивки, а вместо байтов прошивки на ножку UART будет прилетать эфирный мусор, и контроллер зашьёт его. А вы думали, как так может быть, чтобы в телефонах и иных устройствах от падения слетает прошивка? Да очень просто: BGA-шарик перестаёт контачить или замыкается в 0 с дребезгом, что приводит устройство в неработоспосоность.




А теперь несколько мыслей около.


Раз уж AVR на гарвардской архитектуре, обладает малым объёмом ОЗУ, и приниципиально не хочет выполнять код, взятый из ОЗУ, а люди иссохшишь по свободе 8085 и Z80 изгаляются, вляпывая в эти немощные контроллеры интерпретатор бейсика TinyBasic и вообще Linux запускают, то почему бы свой вариант изврата не предложить?


Да, все эти интерпретаторы недоязыков это здорово, но сразу же встаёт вопрос аппаратной платформы, терминала, ввода-вывода, а это уже ограничение возможностей вплоть до превращения многоногого ATMega в интерпретатор ему-же-подобного ассемблера... GW-BASIC. Это не наш путь. Так вот, волшебная штука этот ваш SPM - LDM, самопрограммирование AVR открывает широчайшие возможности по кастомизации кода во флеше, разве что вместо ОЗУ будет использоваться ФЛЕШ (ага, с его ограниченным ресурсом в 10000 циклов перезаписи). Для начала рисуем ОС, операционку в виде менюшки с возможностью выбора программы для заливки. Эту ОС запихиваем во внешний SPI Flash (3...4 ноги), как BIOS, затем рисуем загрузчик размером в 1024 слова, который при включении контроллера сначала шьёт в контроллер программу менюшки из SPI Flash, а уже менюшка может обращаться куда угодно, в т.ч. и к внешней памяти, SD-карте, UART и т.д., откуда можно взять прошивку любой кастомной программы, тетрис и иные утилитки, и уже вот эта менюшка шьёт на своё место или даёт указание загрузчику через EEPROM или состоянием физического переключателя зашить не себя (менюшку), а вот эту кастомную прогу. Опять же, кастомный переключатель, отвечающий за то, чтобы в контроллере не поселилась навсегда игрушка вместо менюшки, должен быть аппаратным, как кнопка RESET на персональных компьютерах эпохи IBM PC XT, ибо из DIGGER и ALLEY CAT нет другого выхода.


А ещё загрузчиком можно реализовать ликвидацию как прошивки в контроллере для защиты от вскрытия устройства, так и самого устройства, подав питание через умножитель напряжения...


Да вообще полезная возможность.

Рубрики:  этот удивительный мир вокруг нас
Метки:  



 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку