worklog: развожу тут одну небольшую платку самого что ни на есть встраиваемого компьютера

Aug 26, 2017 21:23

На freescale, который теперь nxp, который ещё не qualcomm, но скоро будет (впрочем, мобыть, и подавится) iMX младшеньком, но сказ не об том.

Сказ вот об этом:


(проводочки - это багфикс, перепутал два пина в схеме...)

Помучившись преизрядно с QSPI и DMA (о результатах я уже тут ранее писал), добился таки того, что FatFs заработала нормально на этой микросхеме - N25Q128. Она не слишком хорошо подходит для FAT из-за двух особенностей:
1) гигантский, по меркам FAT, размер "единицы стирания" - 64 килобайта. Меньшая гранулярность достигается только либо в нескольких верхних, либо в нескольких нижних секторах и только если сам чип особой модификации. У нас продаются обычные, без суб-секторного формата вообще, т.е. стирать можно лишь этими крупными кусками.
2) мелкий, по меркам FAT же, размер страницы - 256 байт.

Терминология "от микросхемы" и "от файловой системы" разная - у микросхемы один сектор это вышеупомянутый 64-килобайтный фрагмент, у файловой системы это 512 байт (это, например, единица адресации для LBA).

Чтобы одно натянуть на другое, пришлось ввести дополнительный слой управления данными, заодно работающий как небольшой кэш: в памяти выделил массив на 64Кб, и чтение-запись идёт сначала туда. Т.е. если нужно прочитать какой-то сектор ФС, то вычисляется физический адрес сектора микросхемы, он считывается в кэш весь целиком и далее потребителю выдаётся указатель на определённое смещение внутри этого кэша. Когда данные записываются, то они пишутся в кэш. И вот только если нужно считать или записать данные, выходящие за его пределы, тогда содержимое кэша целиком записывается на микросхему, а кэш заполняется новыми данными. Нужно ещё прикрутить простенький таймер, чтобы он сбрасывал содержимое кэша автоматически, если к нему нет обращения в течении N секунд (чтобы не дёргать sync каждый раз).

И вот это, собсно, позволило таки запустить FatFs - ибо когда она создаёт том, то пишет в каждый свой 512-байтный сектор нули, что противоречит механике записи на NOR-флэш (кроме всего прочего, NOR считается стёртой, если в неё записаны единицы). Когда-то я уже это делал на другой плате и с другой микросхемой, но те наработки пришлось, скажем так, забросить.

А мораль истории в том, что информационный объём этой микрушки - 16 мегабайт. У моего первого винта (очень похожего на МС5401, но точное название я уже не помню) ёмкость была хоть и повыше - 20 мегабайт - но и размеры были весьма внушительными. Ессно, я знаю, что существуют микросхемы флэш-памяти с куда как бОльшей плотностью данных, но одно дело какие-то абстрактные числа, а другое дело, когда берёшь чип-восьминожку, а там внутри шестнадцать миллионов, семьсот семьдесят семь тысяч, двести шестнадцать байт.

Надо ещё бенчмарк на чтение снять (запись заведомо медленная, т.к. стирание одного микросхемного сектора это почти 3 миллисекунды).

радио

Previous post Next post
Up