- Процессор и ПК своими руками: проект BMOW 1
- Как собрать компьютер самому из комплектующих: пошаговая инструкция
- Что нужно, чтобы собрать компьютер самому?
- Устанавливаем блок питания
- Устанавливаем материнскую плату
- Устанавливаем ЦПУ и систему охлаждения
- Разработка одноплатного компьютера с нуля. Пособие для начинающих
- Проектирование
- SoC bringup
- U-Boot
- SD/MMC
- Linux kernel
- Debian
- Заключение
Процессор и ПК своими руками: проект BMOW 1
Никому не известный инженер Стив Чемберлин (Steve Chamberlin) решил изменить общепринятое мнение о том, что процессор своими руками создать невозможно. Точнее, процессор достаточно сложного ПК, который смог бы дублировать функции 8-битных вычислительных устройств, получивших распространение в начале 80-х. Вначале это было небольшой проект, который со временем вырос в нечто большее. Сейчас BMOW 1 представляет собой полноценный ПК на основе самодельного процессора, который запускает программы, имеет клавиатуру, VGA-видео, аудио-систему. Программная среда для BMOW 1 — Basic.
Процессор, созданный Стивом Чемберлином, состоит из десятков простейших логических чипов, так что не все в этом ПК — проволока и текстолит. Однако собиралось все это вручную, на что у Стива ушло несколько лет. Как уже говорилось выше, вначале он хотел просто создать процессор, собранный самостоятельно, но в конце-концов было принято решение создать рабочий ПК, который смог бы выполнять определенные задачи.
Стив поставил перед собой несколько целей, все из которых были выполнены:
— создать процессор из простых элементов, были использованы чипы 7400 серии, без компонентов серий 6502, Z-80 и т.д.;
— свести сложность аппаратной части к минимуму;
— компьютер должен был запускать «реальные» программы, не являясь чисто «игрушкой»;
— процессор должен стать элементом системы полноценного ПК;
— система должна быть достаточно быстрой для интерактивного запуска и работы программ.
Сама идея возникла у Стива в ноябре 2007, а к реализации инженер приступил в феврале 2008 года. В апреле 2008 система BMOW 1 запустилась в первый раз, чему наш создатель был несказанно рад. Постепенно были добавлены VGA-видео, аудио-система, BASIC, бутлоадер, который позволял взаимодействовать с подключенным ПК. Через некоторое время BMOW 1 стал достаточно сложным, чтобы обеспечивать работу непростых программ. Основные работы по созданию BMOW 1 были завершены в феврале 2009 года, ПК дорабатывался до настоящего времени.
Вот некоторые подробности о конфигурации устройства:
— текущая частота работы процессора около 2 МГц. Процессор может быть «разогнан» до 3 МГц (теоретически, пока не проверено);
— 512 КБ RAM, 512 КБ ROM;
— потребление энергии 10 Ватт, 2А при 5В;
— картинка на «выходе» имеет разрешение 512*480, два цвета, или же 128*240 — 256 цветов;
— аудио — трехканальный звуковой генератор;
— обычная клавиатура с PS\2-коннектором;
— дополнительный дисплей для вывода текста, 24*2 символа;
— 1250 проволочных проводника, т.е. около 2500 соединений;
Источник
Как собрать компьютер самому из комплектующих: пошаговая инструкция
Со сборкой компьютера может справиться даже ребенок. Не верите? В статье мы рассказываем базовые принципы домашней сборки. А также делимся информацией, которая поможет избежать проблем с совместимостью комплектующих.
Если вы до сих пор гадаете, что же лучше, собрать компьютер самому или купить готовый, то, на наш взгляд, ответ очевиден. ПК, собранный своими руками не только сэкономит вам кучу денег, но и принесет намного больше эстетического удовольствия. Да, это займет больше времени, чем просто прийти в магазин и купить готовое решение, зато вы сможете подобрать комплектующие исключительно под ваши нужды. В отдельной статье мы уже сравнивали готовые решения и компьютеры, собранные самостоятельно. Сегодня же мы расскажем, как собрать игровой компьютер самостоятельно.
Что нужно, чтобы собрать компьютер самому?
В каждом системном блоке может быть разное количество комплектующих. Но, как ни крути, есть основные компоненты, которые присутствуют в каждой сборке. Это материнская плата, блок питания, процессор с кулером, видеокарта, оперативная память, корпус и накопитель. Из этого списка в некоторых случаях можно убрать, разве что, видеокарту, которая может быть встроенной в процессор. Такое решение вполне логично для офисного компьютера, но для игрового наличие графического акселератора обязательно.
Для того чтобы всё железо заработало, необходимо подбирать его таким образом чтобы оно было полностью совместимо друг с другом. При соблюдении этого правила ваш ПК гарантированно заведется после сборки, ведь многие параметры компьютерного железа строго регламентированы. Поэтому у вас не получится, например, воткнуть ОЗУ типа DDR4 в разъемы типа DDR3 на материнской плате. Ниже мы расскажем подробнее про каждую комплектующую, а пока давайте разберемся с порядком подбора компонентов.
В целом, сборка с нуля подразумевает следующий порядок выбора комплектующих.
- Процессор
- Система охлаждения, если не планируется боксовый вариант ЦПУ, который поставляется вместе с кулером в комплекте.
- Материнская плата
- Оперативная память под материнскую плату.
- Видеокарта (если не устраивает встроенное решение).
- Блок питания, который по мощности потянет основные комплектующие.
- Корпус, в который всё вместится.
- Накопители.
Нельзя сказать, что это единственно верный план, которого стоит придерживаться. В большинстве случаев, какие-то компоненты переносятся из старой сборки в новую, поэтому порядок действий может варьироваться от случая к случаю.
После того, как вы подобрали все комплектующие, можно приступать, собственно, к сборке.
Устанавливаем блок питания
Хотя блок питания в большинстве случаев выбирается в последнюю очередь (потому что нужно знать, сколько будут суммарно потреблять все комплектующие, и от этого отталкиваться), мы рекомендуем начинать сборку компьютера именно с его установки внутрь корпуса. Почему БП следует ставить первым? Потому что из всех комплектующих он самый большой по размерам. Если устанавливать его на финальном этапе, можно случайно повредить остальные компоненты. Тем более что блок питания довольно тяжелый, и его легко выронить из рук.
Вторая причина — кабель-менеджмент. Если вы не хотите, чтобы ваши провода торчали во все стороны, нужно аккуратно протянуть их под задней крышкой корпуса. Это не только обезопасит остальное железо от нежелательного контакта с кабелями, но и придаст вашему компьютеру более ухоженный вид, пусть и изнутри.
Для того чтобы установить БП внутрь корпуса, вам понадобится 4 винтика, которые всегда идут в комплекте. Их нужно закрутить в соответствующие отверстия на тыльной стороне комплектующей, где находится разъем для кабеля, который питает блок от сети. В зависимости от вашего корпуса, БП может устанавливаться, как сверху, так и снизу.
При выборе блока питания следует ориентироваться на несколько основных (если мы говорим только о совместимости компонентов) параметров. Во-первых, это форм-фактор. Он должен соответствовать форм-фактору вашего корпуса, иначе блок просто не влезет внутрь корпуса. Во-вторых, это номинальная мощность. Она должна превышать пиковое потребление всего вашего железа на 20-30%. В-третьих, это количество и тип разъемов. Блок питания питает практически все комплектующие: процессор, материнскую плату, видеокарту, накопители. Все кабели должны иметь соответствующий тип. Если видеокарте нужен 6-pin коннектор, то и на блоке такой должен быть. И так со всем остальным железом.
Вот, например, одна из самых популярных моделей на рынке, которая подойдет практически в любую сборку:
Устанавливаем материнскую плату
После установки блока питания желательно максимально оснастить материнскую плату и установить ее внутрь корпуса. Под максимальным оснащением мы подразумеваем: установку процессора в сокет, установку кулера на процессор, установку всех планок оперативной памяти. И только видеокарту следует отложить в конец списка. Почему именно так? Сейчас объясним специально для тех, кто в первый раз решает задачу собрать ПК самому с нуля:.
Намного проще установить всё железо на материнскую плату снаружи корпуса, когда ваши руки не скованы пространством. И очень сложно сделать всё это внутри корпуса, когда пространство ограничено. А видеокарту мы не советуем устанавливать сразу вместе со всеми остальными комплектующими по причине того, что современные GPU очень громоздкие и способны закрывать сразу несколько слотов. Отсюда возникает проблема подключения корпусных проводов, которые отвечают за USB-разъемы, аудио, перезагрузку и включение компьютера. А они всегда, как и видеокарта, находятся в нижней части материнской платы.
Сама установка материнской платы очень проста. Достаточно просто закрутить шурупы в соответствующие разъемы. Намного сложнее выбрать материнку. Во-первых, она должна иметь сокет, который поддерживает процессор. Также слоты под оперативную память должны иметь такой же тип, как сама ОЗУ. Не забудьте проверить количество слотов и максимально поддерживаемый объем памяти. Ко всему прочему форм-фактор материнской платы, как и в случае с блоком питания, должен быть совместим с корпусом.
Пример материнской платы, которая хорошо зарекомендовала себя на рынке для процессоров AMD на сокете B450:
Устанавливаем ЦПУ и систему охлаждения
Один из самых простых шагов во всей сборке. У каждого процессора в левом нижнем углу есть маркировка в виде треугольника. Такой же значок имеется и на сокете на материнской плате. Они должны совпасть таким образом, чтобы оба находились в одном углу. Перед установкой не забудьте отогнуть соответствующую защелку на месте установки ЦПУ. После того, как «камень» установлен в сокет, защелку необходимо вернуть в изначальное положение. Таким образом, вы зафиксируете комплектующую. Будьте предельно аккуратны, чтобы не погнуть ножки процессора.
Источник
Разработка одноплатного компьютера с нуля. Пособие для начинающих
Я занимаюсь разработкой электроники. Начал сравнительно недавно — когда микроконтроллеры от Atmel стали известны благодаря платформе Arduino. Тогда меня это не особо заинтересовало — на тот момент я уже программировал их из AVR Studio, читал истории DiHalt и мечтал о разработке собственного автопилота. 3 курс, Новосибирск, НГУ — это было увлекательно…
Но я с интересом наблюдаю за развитием и ростом индустрии встраиваемых и портативных систем: появление RaspberryPI, многообразия SoC и плат на их основах, системы умного дома, интернет вещей, смартфоны с растущей вычислительной мощностью — все это фантастический простор для деятельности. Результатом наблюдения стало желание поучаствовать: попробовать себя в разработке простой платформы, с целью изучения и накопления опыта.
Проекты на микроконтроллерах мне порядком поднадоели — подводных граблей очень мало, ошибки допустить достаточно сложно, все запускается «из коробки» — ни гибкости, ни сложности. С системами на кристалле — SoC (System on Chip) до этого я дела особо не имел — разве что ядро собрать, да Debian запустить. Поэтому я решил запустить простенький SoC, а именно пройти путь от схемы до рабочего Linux на борту. Да, в последующем я буду не совсем корректно называть SoC процессором, надеюсь, никого это не смутит.
Выбор у меня был небольшой, и определялся сложностью изготовления платы — только выводные корпуса, никаких BGA, максимум четырехслойный дизайн, а все потому, что я собирался прилепить свою платку к одному сравнительно простому рабочему проекту. Еще это означало, что в последующем я получу с производства уже спаянную плату, готовую к экспериментам.
Проектирование
В результате обзора доступных SoC я остановил свой выбор на iMX233 от Freescale. Выводной корпус, 454 МГц, контроллер DDR памяти, интерфейс к карте памяти SD/MMC, отладочный порт — отличный набор новичка. В придачу — композитный видеовыход («тюльпан»), аудио вход/выход, SPI, I2C, UART, USB, LCD. Будет чем заняться на досуге.
После чтения статей о платформе BlackSwift в потенциальных кандидатах появился Qualcom Atheros AR9331, но смутило отсутствие подробной информации в открытом доступе. Жаль, занимательный кандидат.
Меня интересовала минимальная конфигурация, достаточная, чтобы запустить на ней Linux. Соответственно к процессору была выбрана микросхема памяти на 32 МБ (256 МБит) (по тому простому принципу, что она у нас была в наличии). На тот момент я еще не вычитал на десятках форумов о существовании сложностей с этим процессором, только изучил рекомендации производителя по трассировке и, довольный как слон, делал все по рекомендациям.
Вообще, процессор (или SoC, так правильнее) интереснее с той точки зрения, что при его запуске значительно дороже выходят ошибки проектирования. Например, некорректная разводка DDR памяти может выразиться как минимум в последующих ошибках чтения-записи, как максимум — в невозможности инициализации памяти вообще. Цепи питания процессора — ошибка сожжет процессор при первом включении, интерфейсы — потеря периферии на этих интерфейсах, и так далее.
Поэтому начинать проще с изучения готовых отладочных комплектов, например официальной платы и ее документации. Платы у меня не было, но документация доступна всем желающим. В придачу полезно изучить все инструкции по применению, почитать форумы (это уже жизненный опыт :)) — в общем, изучить всю доступную информацию о жертве. После изучения начинается механическая работа — нарисовать схему, а затем и плату. Четыре слоя, минимальная ширина проводника 0.2мм, зазора 0.2мм, отверстия 0.3мм.
Подключил все, что можно подключить безболезненно – аудио входы и выходы, вывел видеосигнал на контактные площадки, всякую простую периферию — микросхему памяти с I2C интерфейсом, еще одну с SPI, держатель для uSD карты, конфигурационные перемычки, обязательно отладочный порт, и потом на свободное место все что осталось. Плата получилась небольшая — 70х40мм, с минимумом компонентов. Для NAND памяти места не осталось, но я планировал запускаться с SD/MMC. Работы на одну ночь.
Получилось страшненько. Слева направо: верхний слой, два внутренних, нижний. Процессор на верхнем слое, память на нижнем; на каждый сигнальный проводник DDR интерфейса по одному переходному отверстию; длины проводников выровнены, их средняя длина в пределах рекомендуемой, полигон земли между процессором и памятью почти без разрывов, и т.д.
Итак, плата спроектирована, документация на нее оформлена, все это передано в производство, и можно начинать готовиться к поступлению плат с производства. Начинаю изучать материалы на предмет нюансов запуска процессора, и натыкаюсь на стостраничные форумы, с описанием проблем и сложностей в запуске.
Становится не по себе — проблемы у людей вплоть до третьей переработки платы, процессор не работает с некоторыми модулями памяти, встроенная подсистема питания очень нестабильна, процессор очень придирчив к питанию, errata (документ, описывающий ошибки на процессор) на многие проблемы отвечает «ничем помочь не можем», софт в открытом доступе кривой, даже внутренний загрузчик нуждается в патче от производителя, в общем, проблемы намечаются серьезные. Выкачиваю BSP (board support package) от производителя — там каша из сотен скриптов и пакетов. Веселье начинается.
Спустя месяц приходят платы, и я начинаю эксперименты. Что-то в уголке подсознания всплывает, связанное с проблемами у монтажного производства.
SoC bringup
Прочь сомнения, подать питание!
И никаких признаков жизни. Это хорошо, хорошо потому, что без дыма. Подпаиваю кнопку «Power», смотрю осциллографом на ножку кварцевого резонатора, запускаю — есть генерация на кварце. 24 МГц, страшненькие, но есть. Щуп осциллографа с делителем, пассивный, спишем на него. «Дедушка старый, ему все равно»
Начинается самое интересное — bringup. Как этот термин лаконично перевести на русский в данном контексте? Попытка вдохнуть жизнь? Не звучит.
В процессоре есть свой первоначальный загрузчик, который при включении проверяет условия старта — откуда и что грузить. Он же отвечает на запросы по шине USB. Его можно сконфигурировать перемычками на плате, или однократно прошиваемой OTP-памятью. Если перемычки перепаять я еще смогу, то перепрошить неперепрошиваемое вряд ли. Распаиваю перемычки, подаю питание, и о чудо — с отладочного порта приходят первые байты данных! Это значит, что процессор доволен питанием, самые базовые его узлы запустились, и можно что-то делать дальше. Что значат эти коды, я узнал из кривоватого заголовочного файла, в виде PDF документа, с невнятными пояснениям, пропусками и за авторством huashan. Все ясно.
Хорошо, чтобы максимально оперативно работать с платой, оптимальнее будет подключить ее по проводам, и загружать исполняемый код по нажатию одной кнопки. Ок, подключаю по USB к компу. И ничего.
Никаких транзакций по шине USB, даже генерации на кварце. Плохо. Начинаю думать, изучаю плату, вспоминаю все тонкие моменты. Например, на этой плате рядом с процессором я поставил свой DC/DC преобразователь, с расчетом на питание какой-либо потребляющей нагрузки, подключил его к шине питания USB 5V, и ничем не нагрузил. Промеряю осциллографом — на входе 5 вольт, на выходе 5 вольт. Всплывают слова с производства, что-то по поводу резистора. Да, так и есть — в цепи обратной связи нет резистора. (- Капитан, капитан, якорь всплыл! — Хммм, скверная примета…)
Паяю резистор, и о чудо! Плата определяется по USB! До этого я смотрел на уровень напряжения шины питания — 5.1 вольт, никаких существенных помех, никаких пульсаций. Но процессору виднее. После запайки резистора заработал и DC/DC источник, пока без нагрузки, но, по крайней мере, перестал мешать процессору. Хорошо, что дальше.
Дальше надо разобраться с первоначальным запуском процессора и проверить работу DDR. Начинаю копать, и в процессе поисков собираю набор утилит и «бутлетов» — исходных кодов, позволяющих проинициализировать подсистемы питания, связку DDR контроллер-память и подготовить систему к дальнейшей работе. То, что надо — максимально простые исходники, с обилием индусского кода, но главное, они работают.
Утилиты позволяют загрузить эти бутлеты в память процессора и запустить их на исполнение. Все так сложно, потому что после включения встроенный загрузчик ничего не знает про внешнюю оперативную память, а поскольку нет памяти – некуда загружать, к примеру, ядро Linux. Получается цепочка из нескольких звеньев, где на каждом этапе выполняется незначительный шаг вперед.
Для подключения к последовательным портам, для реализации всяких внутрисхемных JTAG отладчиков, программаторов и аналогичных задач в другом проекте был реализован USB-UART мост на FT2232. Двухслойный дизайн, выведены оба порта на гребенку с шагом 2 мм. В этом проекте другая история – USB-UART мост + платка сбора данных размещается в центре основной платы, и конструктив прибора предполагает ее удаление.
Т.е. в прибор плата без дырки в центре встать просто не сможет. Мне показалось нерациональным выбрасывать текстолит, и я внес свои творческие правки – собственно вышеописанный мост USB-UART(поменьше), и контроллер (MSP430FR5738) с датчиком тока, напряжения, электромеханическим реле, источником тока и термометром. Вся эта «горячая» часть гальванически изолирована от интерфейса RS485 через пару ADuM1281 и развязанный DC/DC (на плате еще не установлен). В контроллере крутится Modbus стек, т.е. десяток таких плат можно объединить в сеть, завести данные с плат в SCADA систему, и автоматизировать произвольные процессы. В частности у нас эти платки будут использоваться для испытания приборов на -40/+60 в термокамере. Налепил их на проверяемый прибор, и сиди@наблюдай как меняются токи, напряжения и температуры на ответственных узлах.
Все эти платы проектировались параллельно, поэтому я сразу заложил идентичные размеры и возможности гибкого соединения. Не зря 🙂
Отлично, компилирую исходники, собираю этот конструктор, загружаю, и получаю первые строчки из отладочного порта! Подсистема питания запустилась!
PowerPrep start initialize power…
Battery Voltage = 0.65V
No battery or bad battery detected. Disabling battery voltage measurements.
EMI_CTRL 0x1C084040
FRAC 0x92926152
power 0x00820710
Frac 0x92926152
start change cpu freq
hbus 0x00000003
cpu 0x00010002
Заглядываю в исходники инициализации памяти, разрешаю простейший тест, правлю ручками процедуру инициализации под мою конфигурацию платы, запускаю вновь:
PowerPrep start initialize power…
Battery Voltage = 1.74V
No battery or bad battery detected. Disabling battery voltage measurements.
EMI_CTRL 0x1C084040
FRAC 0x92926152
power 0x00820710
Frac 0x92926152
start change cpu freq
hbus 0x00000003
cpu 0x00010002
start memory test, at 0x40000000
end memory test, at 0x41FFFFFC
Замечательно! Тест памяти пройден! Это очень хорошо, теперь туда можно загрузить что-то посерьезнее.
U-Boot
Посерьезнее у меня это U-Boot. Я знаком с этой системой, мне она кажется вполне адекватной и функциональной. Позволяет работать с периферией — актуальные версии работают с USB, SD/MMC, Ethernet, загружать образы c FAT/ext2 разделов, передавать управление, и главное — моргать светодиодиком — все то, что нужно для счастья и более гибкой отладки на первоначальном этапе.
Поэтому не долго думая выкачиваю актуальную версию из официального репозитория, беру самую близкую конфигурацию, компилирую, собираю с индусскими бутлетами в один файл, и загружаю в процессор:
PowerPrep start initialize power…
Battery Voltage = 1.74V
No battery or bad battery detected. Disabling battery voltage measurements.
EMI_CTRL 0x1C084040
FRAC 0x92926152
power 0x00820710
Frac 0x92926152
start change cpu freq
hbus 0x00000003
cpu 0x00010002
start memory test, at 0x40000000
end memory test, at 0x41FFFFFC
U-Boot 2015.04-rc3-00209-ga74ef40 (Mar 16 2015 — 12:47:34)
CPU: Freescale i.MX23 rev1.4 at 227 MHz
BOOT: USB
DRAM: 32 MiB
MMC: MXS MMC: 0
MMC0: Bus busy timeout!
MMC0: Bus busy timeout!
MMC0: Bus busy timeout!
MMC0: Bus busy timeout!
Card did not respond to voltage select!
MMC init failed
Using default environment
In: serial
Out: serial
Err: serial
Net: Net Initialization Skipped
No ethernet found.
Hit any key to stop autoboot: 0
=>
И U-Boot запустился! Отлично, но плата запускается все еще по проводам. Надо разбираться с картой памяти. Хорошо, перепаиваю резисторы выбора загрузки, втыкаю карту — в терминале от процессора приходит ошибка. Вытаскиваю карту — другая. Вот это поворот! ©
SD/MMC
Начинаю искать, поиски выводят на русскоязычный форум, на полезные и интересные 380 страниц обсуждения. Боюсь, ребята до сих пор вспоминают этот SoC крепким словцом.
Выясняется, что для загрузки с SD/MMC карты нужно обязательно прошить OTP биты, тогда еще что-то может быть и получится. В частности надо перенастроить в регистре OTP Register: 24 биты SD MBR Boot[3] — прошить в единицу, и SD_POWER_GATE_GPIO[21:20] — выбрать NO_GATE — в моем дизайне управление питанием карточки не предусмотрено.
«Неудобненько как-то получается». Это означает, что нельзя сделать загрузочную карту памяти, которой можно будет прошивать готовые приборы в партии, вместо этого придется подключать каждый прибор, и вручную прошивать эти злосчастные OTP биты. Разумеется, этот процессор я не буду использовать в сколько-нибудь серьезном проекте, но про такой момент забывать не стоит. Скачиваю виндовую утилитку, прошиваю эти биты, вставляю карту памяти, аккумулятор… Система стартует, и циклически перезагружается. Блин!
PowerPrep start initialize power…
Battery Voltage = 3.75V
Boot from battery. 5v input not detected
PowerPrep start initialize power…
Battery Voltage = 3.75V
Boot from battery. 5v input not detected
PowerPrep start initialize power…
Battery Voltage = 3.75V
Boot from battery. 5v input not detected
.
Правлю исходники бутлетов, в частности добавлю дополнительные отладочные сообщения, и выхожу на проблемный участок кода:
PowerPrep start initialize power…
Battery Voltage = 3.75V
Boot from battery. 5v input not detected
Try poweron_pll
Try turnon_mem_rail
Падает при подаче питания на DDR память. Хм. Где-то я уже читал об этом. А как до этого работало? Ладно, нестабильность найдена, надо разбираться.
Вокруг микросхемы памяти расположены ее законные развязывающие конденсаторы, 8 шт. по 100 nF. Но на выходе встроенного в SoC источника питания для памяти я поставил 2×10 uF, хотя производителем рекомендовано всего 1uF (инструкции читаю, если ничего другое уже не помогает, да). Ломать, не строить: отпаиваю один конденсатор, подключаю аккумулятор, и система стартует!
На самом первом фото виден этот конденсатор — вокруг него грязь, и он припаян только одним контактом.
PowerPrep start initialize power…
Battery Voltage = 3.75V
Boot from battery. 5v input not detected
Try poweron_pll
Try turnon_mem_rail
Try init_clock
EMI_CTRL 0x1C084040
FRAC 0x92926192
Try init_ddr_mt46v32m16_133Mhz
power 0x00820710
Frac 0x92926192
start change cpu freq
hbus 0x00000003
cpu 0x00010001
initcall: 3e09f908 (relocated to 40002908)
initcall: 3e0a013c (relocated to 4000313c)
initcall: 3e0a2ec0 (relocated to 40005ec0)
initcall: 3e0a2ea8 (relocated to 40005ea8)
initcall: 3e0a2e88 (relocated to 40005e88)
initcall: 3e0a2e68 (relocated to 40005e68)
Net: Net Initialization Skipped
No ethernet found.
initcall: 3e0a2e5c (relocated to 40005e5c)
Initial value for argc=3
Final value for argc=3
### main_loop entered: bootdelay=3
### main_loop: bootcmd=«mmc dev $
Hit any key to stop autoboot: 0
=>
=>
Хе-хе, работает! Ок, запишу этот факт как причину потенциальных нестабильностей в будущем, ибо остался еще один 10uF, который тоже может усложнять жизнь. Теперь пробую с внешним питанием.
PowerPrep start initialize power…
Battery Voltage = 3.74V
5v source detected.Valid battery voltage detected.Booting from battery voltage source.
Mar 18 2015
07:59:13
Try poweron_pll
Try turnon_mem_rail
Try init_clock
EMI_CTRL 0x1C084040
FRAC 0x92926192
Try init_ddr_mt46v32m16_133Mhz
power 0x00820710
Frac 0x92926192
start change cpu freq
Теперь начались зависания. Более того, ситуация не регулярная, периодически проявляется при питании от аккумулятора, периодически от внешних 5В, периодически стартует и работает. Опять правлю код, отключаю переключение процессора на PLL, ядро остается работать на 24МГц. Все стабильно. Меняю делитель PLL, скручиваю частоту, и плата успешно запускается на 320 МГц. Надо попробовать рекомендацию производителя — конденсатор на 100 pF в цепи импульсного DC/DC. Место на печатной плате под конденсатор я заложил. Позже вернусь к этому вопросу.
Linux kernel
Итак, на текущий момент есть плата, стартующая с карты памяти, и загружающая U-Boot. Дальше по плану надо загружать ядро.
Выкачиваю актуальные исходники ядра с kernel.org, распаковываю и в три клика собираю ядро.
make ARCH=arm CROSS_COMPILE=$
mxs_defconfig
make ARCH=arm CROSS_COMPILE=$menuconfig
make ARCH=arm CROSS_COMPILE=$-j4 zImage modules
Boot options —> Use appended device tree blob to zImage —-> Supplement the appended DTB with traditional ATAG information
Надо включить Kernel low-level debugging functions вместе с early printk
И еще enable dynamic printk() support
И еще видеоподсистему отключить
И еще половину лишних и не очень драйверов
И еще собрать dtb — device tree blob, структуру, описывающую ядру базовые вещи — количество памяти, периферию SoC, и т.д.
make ARCH=arm CROSS_COMPILE=$
imx23-olinuxino.dtb
cat arch/arm/boot/zImage arch/arm/boot/dts/imx23-olinuxino.dtb > arch/arm/boot/zImage_dtb
После чего можно копировать ядро на флешь.
Запускаю, и получаю kernel panic. Логично, корневой файловой системы еще нет.
Debian
В качестве собственно операционной системы я выбираю Debian. По-моему, отличный дистрибутив — простой и надежный, как деревянная палка. Беру готовую сборку, распаковываю на раздел карточки, и указываю при загрузке ядра, где искать его законную корневую.
PowerPrep start initialize power…
Battery Voltage = 3.68V
Boot from battery. 5v input not detected
poweron_pll
turnon_mem_rail
init_clock
EMI_CTRL 0x1C084040
FRAC 0x92925E92
init_ddr_mt46v16m16_96Mhz
power 0x00820710
Frac 0x92925E92
start change cpu freq
Try now
hbus 0x00000003
cpu 0x00010001
U-Boot 2015.04-rc3-00209-ga74ef40-dirty (Mar 18 2015 — 14:26:18)
CPU: Freescale i.MX23 rev1.4 at 320 MHz
BOOT: USB
DRAM: 32 MiB
MMC: MXS MMC: 0
In: serial
Out: serial
Err: serial
Net: Net Initialization Skipped
No ethernet found.
Hit any key to stop autoboot: 0
2650994 bytes read in 906 ms (2.8 MiB/s)
Kernel image @ 0x41000000 [ 0x000000 — 0x284e60 ]
Uncompressing Linux… done, booting the kernel.
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 3.19.2 (freeman@freeman-PC) (gcc version 4.9.2 20140904 (prerelease) (crosstool-NG linaro-1.13.1-4.9-2014.09 — Linaro GCC 4.5
[ 0.000000] CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=0005317f
[ 0.000000] CPU: VIVT data cache, VIVT instruction cache
[ 0.000000] Machine model: i.MX23 Olinuxino Low Cost Board
[ 0.000000] Memory policy: Data cache writeback
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 8128
[ 0.000000] Kernel command line: console=ttyAMA0,115200 root=/dev/mmcblk0p3 rw rootwait
[ 0.000000] PID hash table entries: 128 (order: -3, 512 bytes)
[ 0.000000] Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
[ 0.000000] Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
[ 0.000000] Memory: 18972K/32768K available (3475K kernel code, 244K rwdata, 1372K rodata, 188K init, 8096K bss, 13796K reserved, 0K cma-reserved)
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector: 0xffff0000 — 0xffff1000 ( 4 kB)
[ 0.000000] fixmap: 0xffc00000 — 0xfff00000 (3072 kB)
[ 0.000000] vmalloc: 0xc2800000 — 0xff000000 ( 968 MB)
[ 0.000000] lowmem: 0xc0000000 — 0xc2000000 ( 32 MB)
[ 0.000000] modules: 0xbf000000 — 0xc0000000 ( 16 MB)
[ 0.000000] .text: 0xc0008000 — 0xc04c42ac (4849 kB)
[ 0.000000] .init: 0xc04c5000 — 0xc04f4000 ( 188 kB)
[ 0.000000] .data: 0xc04f4000 — 0xc0531018 ( 245 kB)
[ 0.000000] .bss: 0xc0531018 — 0xc0d19264 (8097 kB)
[ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] NR_IRQS:16 nr_irqs:16 16
[ 0.000000] sched_clock: 32 bits at 100 Hz, resolution 10000000ns, wraps every 21474836480000000ns
[ 0.000000] Console: colour dummy device 80×30
[ 0.000000] Lock dependency validator: Copyright © 2006 Red Hat, Inc., Ingo Molnar
[ 0.000000]… MAX_LOCKDEP_SUBCLASSES: 8
[ 0.000000]… MAX_LOCK_DEPTH: 48
[ 0.000000]… MAX_LOCKDEP_KEYS: 8191
[ 0.000000]… CLASSHASH_SIZE: 4096
[ 0.000000]… MAX_LOCKDEP_ENTRIES: 32768
[ 0.000000]… MAX_LOCKDEP_CHAINS: 65536
[ 0.000000]… CHAINHASH_SIZE: 32768
[ 0.000000] memory used by lock dependency info: 5167 kB
[ 0.000000] per task-struct memory footprint: 1152 bytes
[ 0.060000] Calibrating delay loop… 159.12 BogoMIPS (lpj=795648)
[ 0.070000] pid_max: default: 32768 minimum: 301
[ 0.070000] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.070000] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.080000] CPU: Testing write buffer coherency: ok
[ 0.080000] Setting up static identity map for 0x40353070 — 0x403530c8
[ 0.110000] devtmpfs: initialized
[ 0.130000] pinctrl core: initialized pinctrl subsystem
[ 0.180000] DMA: preallocated 256 KiB pool for atomic coherent allocations
[ 0.290000] Serial: AMBA PL011 UART driver
[ 0.290000] 80070000.serial: ttyAMA0 at MMIO 0x80070000 (irq = 17, base_baud = 0) is a PL011 rev2
[ 0.480000] console [ttyAMA0] enabled
[ 0.560000] mxs-dma 80004000.dma-apbh: initialized
[ 0.590000] mxs-dma 80024000.dma-apbx: initialized
[ 0.600000] SCSI subsystem initialized
[ 0.610000] pps_core: LinuxPPS API ver. 1 registered
[ 0.610000] pps_core: Software ver. 5.3.6 — Copyright 2005-2007 Rodolfo Giometti
[ 0.620000] Switched to clocksource mxs_timer
[ 1.130000] futex hash table entries: 256 (order: 1, 11264 bytes)
[ 1.290000] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
[ 1.320000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 250)
[ 1.330000] io scheduler noop registered (default)
[ 1.340000] of_dma_request_slave_channel: dma-names property of node ‘/apb@80000000/apbx@80040000/serial@80070000’ missing or empty
[ 1.360000] uart-pl011 80070000.serial: no DMA platform data
[ 1.360000] 8006c000.serial: ttyAPP0 at MMIO 0x8006c000 (irq = 146, base_baud = 1500000) is a 8006c000.serial
[ 1.380000] mxs-auart 8006c000.serial: Found APPUART 3.0.0
[ 1.410000] mousedev: PS/2 mouse device common for all mice
[ 1.430000] stmp3xxx-rtc 8005c000.rtc: rtc core: registered 8005c000.rtc as rtc0
[ 1.440000] i2c /dev entries driver
[ 1.450000] stmp3xxx_rtc_wdt stmp3xxx_rtc_wdt: initialized watchdog with heartbeat 19s
[ 1.460000] softdog: Software Watchdog Timer: 0.08 initialized. soft_noboot=0 soft_margin=60 sec soft_panic=0 (nowayout=0)
[ 1.470000] Driver ‘mmcblk’ needs updating — please use bus_type methods
[ 1.480000] 80010000.ssp supply vmmc not found, using dummy regulator
[ 1.540000] mxs-mmc 80010000.ssp: initialized
[ 1.630000] mmc0: host does not support reading read-only switch, assuming write-enable
[ 1.640000] stmp3xxx-rtc 8005c000.rtc: setting system clock to 1970-01-01 00:27:21 UTC (1641)
[ 1.660000] mmc0: new high speed SD card at address e624
[ 1.680000] mmcblk0: mmc0:e624 SU02G 1.84 GiB
[ 1.730000] mmcblk0: p1 p2 p3
[ 1.740000] usb0_vbus: disabling
[ 1.780000] EXT3-fs (mmcblk0p3): error: couldn’t mount because of unsupported optional features (240)
[ 1.800000] EXT2-fs (mmcblk0p3): error: couldn’t mount because of unsupported optional features (240)
[ 1.870000] EXT4-fs (mmcblk0p3): mounted filesystem with ordered data mode. Opts: (null)
[ 1.880000] VFS: Mounted root (ext4 filesystem) on device 179:3.
[ 1.910000] devtmpfs: mounted
[ 1.920000] Freeing unused kernel memory: 188K (c04c5000 — c04f4000)
INIT: version 2.88 booting
Using makefile-style concurrent boot in runlevel S.
Starting the hotplug events dispatcher: udevdudevd[78]: error getting socket: Function not implemented
error initializing control socketudevd[78]: error initializing udevd socket
failed!
Setting the system clock.
Activating swap. done.
[ 6.410000] EXT4-fs (mmcblk0p3): re-mounted. Opts: (null)
Checking root file system. fsck from util-linux-ng 2.17.2
rootfs: clean, 10152/115920 files, 89453/462839 blocks
done.
[ 6.870000] EXT4-fs (mmcblk0p3): re-mounted. Opts: (null)
Setting the system clock.
Cleaning up ifupdown…
Setting up networking…
Loading kernel modules. done.
Activating lvm and md swap. done.
Mounting local filesystems. done.
Activating swapfile swap. done.
Cleaning up temporary files…
Setting kernel variables . done.
INIT: Entering runlevel: 2
Using makefile-style concurrent boot in runlevel 2.
Starting NTP server: ntpd.
Starting OpenBSD Secure Shell server: sshd.
Debian GNU/Linux 6.0 debian ttyAMA0
debian login: root
Password:
Last login: Thu Jan 1 02:00:41 EET 1970 on ttyAM0
Linux debian 3.19.2 #5 Thu Mar 19 10:58:08 EDT 2015 armv5tejl
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@debian:
# free
total used free shared buffers cached
Mem: 19160 18292 868 0 1496 9756
-/+ buffers/cache: 7040 12120
Swap: 0 0 0
root@debian:
# cat /proc/cpuinfo
processor: 0
model name: ARM926EJ-S rev 5 (v5l)
BogoMIPS: 159.12
Features: swp half fastmult edsp java
CPU implementer: 0x41
CPU architecture: 5TEJ
CPU variant: 0x0
CPU part: 0x926
CPU revision: 5
Hardware: Freescale MXS (Device Tree)
Revision: 0000
Serial: 0000000000000000
root@debian:
# df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 1789440 295900 1384592 18% /
tmpfs 9580 0 9580 0% /lib/init/rw
udev 10240 0 10240 0% /dev
tmpfs 9580 0 9580 0% /dev/shm
tmpfs 9580 0 9580 0% /var/volatile
tmpfs 9580 0 9580 0% /media/ram
root@debian:
# mount
rootfs on / type auto (rw)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
tmpfs on /var/volatile type tmpfs (rw)
tmpfs on /media/ram type tmpfs (rw)
Дааа, есть над чем поработать.
Но, тем не менее, система работает, грузится с карточки памяти, размещается во всем диапазоне DDR памяти, и по праву может называться одноплатным компьютером! Это от схемы в голове до реализации в железе.
Итого, ошибок дизайна пока что не обнаружено, хотя нарекания уже есть. Что-ж, для начала, я считаю, достаточно.
Заключение
На самом деле это только начало. Еще есть над чем поработать — разобраться с периферией, в частности интересен аудио и видеовыход, протестировать SoC на штатных частотах, а еще лучше разогнать, измерить потребляемый ток, проверить при минусовых и плюсовых температурах (интересна устойчивость DDR контроллера), проверить на ресурсоемких задачах (например, видеотрансляция с веб камеры по USB WIFI), и в результате сделать на платке WiFi-управляемый танк с камерой и направленным микрофоном. Но не сейчас. Сейчас у меня есть деловое предложение 🙂
Есть три платы, которые я могу отдать. Все что нужно для получения — озвучить в комментариях идею, как можно применить получившуюся систему. Лучшие предложения получат по экземпляру даром, с надеждой, что вы реализуете свою идею, и расскажете, что у вас получилось. Раздачу слонов осуществлю 30 марта 2015 года, т.е. через неделю.
Для меня это будет обратной связью: мне нужно знать как поведет себя система в реальных условиях, насколько надежно себя покажет, какие проблемы возникнут, и т.д.
На этом пожалуй все, жду ваших комментариев.
UPD: по заявкам: первый экземпляр достается neochapay за идею с положительным рейтингом
второй экземпляр уйдет r00tGER, третий REPISOT
«Кто раньше встал, того и тапки».
Источник