Большинство современных CPU позволяют производить начальную загрузку с разных источников (media booting), одним из которых может быть SPI NOR Flash. Микросхемы энергонезависимой памяти NOR Flash с последовательным интерфейсом SPI используются на материнских платах для хранения образов BIOS, BMC, а так же данных различного назначения. Если же речь идет о популярных платах, постороенных на различных SoCs, таких как Raspberry Pi, Orange Pi и так далее, то на них SPI-интерфейс может быть выведен на контактые площадки для того, чтобы пользователь мог самостоятельно подключить ту или иную микросхему в качестве внешнего носителя.
Для разработки и отладки, как самих устройств, так и програмного обеспечения, возникает необходимость макетирования, то есть создания макетной платы, на которой распаяна микросхема SPI NOR Flash, служащая для подключения к основной плате устройства.
Требования к качеству такой макетной платы не велики и ее можно создать используя, так называемые, слепыши и платы для, непосредственной распайки микросхемы, например, такой как Winbond W25Q256JV.
На следующем рисунке показан пример подобной макетной платы.
![](https://habrastorage.org/webt/pn/d3/os/pnd3osbsbgaa8hjfqmp1tswiboa.png)
Здесь распаяно два разъема: один для подключения программатора, например, CH341A, другой для подключения к основному устройству.
Разумеется такая плата весьма неудобна и ненадежна, особенно, если речь идет о многократных подключениях и перепрошивке памяти. Кроме того, если работа ведется коллективом разработчиков, то ручное макетирование может отнимать много времени.
Наилучшим решением в таких случаях является создание макетной платы, на которой уже распаяны все пассивные элементы и имеется контактная площадка для напайки NOR Flash в различных исполнениях (SOP-16, SOP-8, 8-pad WSON 8x6-mm, 16-pin SOIC 300-mil).
Если распаять все пассивные элементы и разъемы, то пользователю останется только монтажная площадка для выбранной им микросхемы, монтаж которой будет удобен даже без использования дорогостоящей паяльной станции.
![](https://habrastorage.org/webt/oj/yt/zf/ojytzfdumklyofhwfhdhoyq7toy.png)
Электрическая принципиальная схема макетной платы показана на следующем рисунке.
![](https://habrastorage.org/webt/9o/qn/_d/9oqn_dnn-bq061f_rzjkjwalyw8.png)
Плата расчитана на NOR Flash c питающим напряжением 3.3V и пригодна для работы с таким микросхемами, как Winbond W25Q256JV, Infinion S25FL512S и т.д. и т.п.
Разъем J1 предназначен для подключения программатора. В случае использования программатора CH341A, достаточно использовать обычный шлейф (Flat Ribbon Cable) 1.27mm и два разъема IDC (2X4 8 Pins 2.54mm Dual Row Socket), как показано на следующем рисунке.
![](https://habrastorage.org/webt/cq/rt/mw/cqrtmwtmteuie7zsfb80ssd2zx8.png)
Разъем J2 предназначен для подключения к устройству, в качестве которого может выступать одноплатный компьютер.
Для примера, рассмотрим подключение микросхемы Winbond W25Q256JVFIQ к одноплатной машине Lenovo Leez P710. На плате имеется 40-контактный блок, где SPI-интерфейс выведен на контакты 19, 21, 23, 24.
![](https://habrastorage.org/webt/y7/gn/km/y7gnkm8f6tpwzyig5vw5s1vrsvs.png)
Следующая таблица показывает схему подключения контактов разъема J2 макетной платы к контактам Leez P710.
![](https://habrastorage.org/webt/2o/mc/-n/2omc-nmalskmhdnaw4iseqn_vky.png)
Для того, чтобы ядро Linux могло определить подключеную таким образом микросхему, необходимо добавить в описание dts (arch/arm64/boot/dts/rockchip/rk3399-leez-p710.dts) следующие строки.
&spi1 {
status = "okay";
spiflash: flash@0 {
compatible = "winbond,w25q256", "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <1000000>; // 1MHz
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
spi-flash@0 {
reg = <0x0 0x2000000>; // 32MiB (Full flash)
label = "spi-flash";
};
};
};
};
Здесь определен только один раздел, занимающий весь объем памяти, которому будет соответствовать устройство /dev/mtd0. Разумеется, в разделе partitions можно определить и другие разделы. Следует только помнить, что выравнивания и размеры разделов NOR Flash должны быть кратны размеру Erase Block.
Оригинал статьи можно найти в блоге Radix cross Linux.
dlinyj
Я уж думал, что SPI NOR Flash — это рудимент, который канул в лету. Ан нет, всё ещё используют. А какой практический толк в использовании этого мамонта?
rcl Автор
Ну что Вы, еще как используется. Например вы можете на ARM-борде использовать в качестве загрузчика EDK II, записав его в SPI флешку. Тогда вы будете иметь возможность загружаться с дисков GPT/UEFI. Как, например, Baikal M1000.
Да и нельзя забывать про BIOS и BMC.
dlinyj
Просто на смену ему пришла eMMC, которая не имеет тех проблем, которая имеет NOR Flash. Там надо ФС иметь соответствующие, типа jffs2, и прочие грабли и гемморои. Вспомнить ещё всякие области расширения. В общем, я не вижу смысла в её использовании.
Я про загрузчик, который вы описываете, ничего не знаю. Знаю u-boot, но что мешает спроектировать схемотехнику так, чтобы использовать eMMC?
rcl Автор
eMMC лучше использовать как системный диск, ведь eMMC теперь впаивают большого объема. И при наличии EDK в SPI, еММС станет для пользователя обычным диском, как HDD на его лаптопе, куда он может инсталлировать OS (и ему не надо будет думать о Flash Layout и по каким адресам писать u-boot).
dlinyj
А какая религия мешает всё разместить на одной микросхеме? Просто я пока не понимаю преимуществ NOR Flash, кроме явных недостатков.
maquefel
Вот неплохая обзорная статья по верхам:
https://embeddedcomputing.com/technology/storage/a-comparison-of-flash-devices-for-embedded-system-booting
EOL (цикл жизни)
SPI NOR может быть реально быстрее eMMC
Как я уже говорил XIP
Сильно проще разводка на плате
dlinyj
Вновь возвращаемся к вопросу, что это вымирающий мамонт. Ибо дорого.
maquefel
Да ну ? :)
https://www.xilinx.com/products/intellectual-property/1-ii2qo3.html#productspecs
Как бы гляньте сколько места на кристалле съест, а если не на кристале, то опять же ножки и разводка тоже денег стоят.
maquefel
Вот если бы вопрос был NAND vs eMMC вот тогда я бы согласился с каждым тезисом, а так нет неправда.
dlinyj
Ой, всё. Правда ваша.
r0mik
недостатки скорей у EMMC, нежели у SPI NOR Flash - старо, медленно, ненадежно, принципиально не нужно в ноутбуках, материнках и микрокомпьютерах (тенденция повсеместного внедрения NVME накопителей в качестве "взрослого диска", а для SPI NOR остается UEFI и прочие "начальные инициализации").
maquefel
Тут вопрос сильно сложнее:
1) eMMC еще надо настроить (включить тактирование)
2) После включения доступна не вся память (основную еще надо настроить)
и т.д.
Это делает ZSBL (Zero-stage bootloader), который опять же надо откуда-то загрузить, а настроенной памяти может не хватать для всего функционала.
Тогда грузиться загручик следующего уровня (условно First stage bootloader) который настраивает память и допустим eMMC и т.д.
Получаеться, что SPI NOR настроить сильно проще это раз, во-вторых, как правило они обладают свойством XIP (Execute In Place), что вообще позволяет исполнять код прямо из флэшки.
Нет не нужно, для u-boot, kernel, initrd не нужно, там поиск и метка badblock's происходит при erase.
Для rootfs раздела - да нужно, если он не RO.
dlinyj
Тут согласен, предзагрузчик надо куда-то записать. Но разве современные камни не имеют на борту памяти для такого старта?
Впрочем, когда ковырялся с калькулятором, то там тоже была NOR. Но мне эта битва с бедблоками изрядно подпортила нервов.
maquefel
Зависит от... eMMC контроллер стоит всего бакс, но бакс это бакс =) Так же и с памятью.
А еще вопрос ножек остро стоит, SPI условно 4ре ножки - а eMMC ?
Так что скорее не "старые", "современные", а hight-end, low-end, мне так кажется.
corvuscorax
У многих современных SoC есть встроенный bootloader для загрузки из eMMC. И тогда U-Boot и rootfs можно разместить на одном eMMC или SD-карте. Иногда так делают.
Но первичная загрузка из SPI-флэш распространена больше. Как минимум из-за большей надёжности и "дуракостойкости". Если eMMC откажет, будет перетёрта по ошибке и т.д., загрузчик в SPI останется и поможет восстановить устройство или хотя бы диагностировать проблему.
rcl Автор
https://www.tianocore.org/ TianoCore EDK II
Sergey_datex
Срок жизни современных еммц на тлц памяти - полтора-три года. NOR живут десятилетиями без питания.
Karlson_rwa
Кому мамонт, а кому насущная необходимость. Есть системы на основе ПЛИС, где нужна скорость загрузки и важен объем флешки. Вот там-то NOR и работает. И поверьте, таких задач очень много, где нужно работать сразу после подачи питания. С процессорами то же самое.