Большинство современных 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/cf/2c/xr/cf2cxrnwhdusfnowgtnwiwionmu.png)
Электрическая принципиальная схема макетной платы показана на следующем рисунке.
![](https://habrastorage.org/webt/vn/up/_p/vnup_ptn0-cudgyec3gatagalpw.png)
Плата расчитана на NOR Flash c питающим напряжением 3.3V и пригодна для работы с таким микросхемами, как Winbond W25Q256JV, Infineon 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.