SFF, The

Single File FAT, оно же LoggerFS.
Всех, кто гадал о назначении платы из прошлого поста, сегодня ждёт праздник. Вы дождались ответа, эта маленькая плата — демонстратор технологии. С одной стороны у неё термометр ds1820, с другой микроэсдэ карточка, посередине тиня. Этакий безумный гаджет, цель создания которого — показать владение кунг-фу хакерством.



Всем хороша SD-карточка, и стоит недорого, и объём большой, и скорость приличная. Один у неё недостаток — запись и чтение производятся только посекторно. Собственно, что в плане отдельно записи, что отдельно чтения, такое поведение флешек не представляет особых проблем — дал ей команду на запись, и сохраняй хоть по байту в час, время на транзакцию не лимитируется. Но это же свойство флешек затрудняет использование конкурирующих процессов записи-чтения (которое ещё иногда называют многозадачностью) Кроме того, полноценная работа с файловой системой требует операций чтение-модификация-запись, а это, в свою очередь накладывает ограничения на используемый объём памяти, так как 512 байт требуется только на буфер обмена с картой. А помимо буфера обмена надо хранить данные и стек.
Таким образом, получается, что работа с FAT на запись невозможна для младших семейств AVR, также и для старших, при условии значительного заполнения оперативной памяти данными.
Ай-яй-яй, какие противные ограничения. Но они вполне преодолимы, если требуется записывать всего один файл, а это как раз таки самая распространённая операция. Для записи единственного файла при минимуме доступных ресурсов и предназначен драйвер loggerFS.

Немного технических подробностей: программа работает с логической структурой диска, а именно с разделами FAT16. При монтировании файловой системы считывается таблица разделов флешки. Если первый раздел FAT16, то считываются его параметры, и дальнейшая работа происходит с ним. Если там другой раздел — накопитель считается неподходящим и не монтируется.
При считывании раздела производится также поиск нашего файла. Если он там есть, то считывается его размер, выравнивается по границе сектора, и дальнейшая запись данных будет добавлена к имеющейся. Единственный недостаток — в результате повторного монтирования файл будет содержать блок нулей для выравнивания по границе сектора. Это потому что без буфера для хранения содержимого сектора дописать новые данные «впритык» к старым не получится.

После монтирования накопителя можно писать данные, до тех пор пока раздел не исчерпается, в этом случае флешка автоматически размонтируется. Алгоритм записи данных сделан так, чтобы использовать флешку в максимально щадящем режиме — запись структур FAT производится только при размонтировании диска, чтобы сохранять ресурс карточки. Это означает, что если вы извлечёте флешку не размонтировав её, данные будут потеряны.

Если на карточке были другие файлы, в ходе записи данных они будут уничтожены.

Как использовать SFF?
Подключить файл с исходным текстом к вашей программе.
.include "loggerfs.asm"	; Исходник драйвера  LoggerFS
.include "math.asm"	; содержит "div32u"


Кроме того, в области ОЗУ должны быть объявлены переменные:

SDCmd:		.byte 	4	; Буфер для команды SDкарточки
SPC:		.byte 	1	; Секторов на кластер (40)
FFAT:		.byte 	2	; Первая копия fat 
SPF:		.byte 	2	; Секторов на fat
SD_FirstFilSct:	.byte 	3	; Указатель на первый сектор файла
SD_LastSct:	.byte	3	; Последний сектор раздела.
SDFileTime:	.byte	2	; Время создания файла
SDFileDate:	.byte	2	; дата создания файла
SDFileSize:	.byte 	4	; Размер файла.


Переменные SDFileTime и SDFileDate можно изменять из программы, если у вас есть источник времени. Их формат аналогичен стандартным полям файловой системы.

Два байта, отвечающие отметке времени, распределяются так:
биты 0-4 — счетчик секунд (по две), допустимы значения 0-29, то есть 0-58 секунд;
биты 5-10 — минуты, допустимы значения 0-59;
биты 11-15 — часы, допустимы значения 0-23.
Двухбайтовая отметка даты имеет следующий формат:
биты 0-4 — день месяца, допускаются значения 1-31;
биты 5-8 — месяц года, допускаются значения 1-12;
биты 9-15 — год, считая от 1980 г. («эпоха MS-DOS»), возможны значения от 0 до 127 включительно, то есть 1980—2107 гг.

Среди кода должно найтись место для шаблонов имени файла и структуры FAT

SzRootTemplate: 	.db	"DATAFILETXT",0,0,0,0,0,0,0,0,0,0,0 	; Имя файла и 11 нулей.
FAT16Template:		.db	0xf8,0xff,0xff,0xff		; первый элемент FAT


Имя файла должно соответствовать стандарту 8+3, то есть 8 символов имя, три символа расширение. Если имя должно быть короче, недостающие симводы заменяются на пробелы.

Интерфейс с железкой: Для облегчения портирования, взаимодействие с карточкой вынесено из исходника драйвера в основную программу. Оно включает в себя макросы для управления сигналом CS карточки, признаком монтирования, признаком активности и проверки контакта вставленной карточки.

Управление сигналом CS состоит из трёх макросов: cshigh, cslow и CheckCS — соответственно содержащие команды для установки высокого и низкого уровней сигнала, и для его проверки.

.macro		cshigh
		sbi	PortB,2	; CS карты
.endm
.macro		cslow
		cbi	PortB,2	; CS карты
.endm
.macro		CheckCS
		sbic	PortB,2	; CS карты
.endm


Сигнал «Признак монтирования» (GreenLight) — бит, может содержаться в порту или в регистре. Его устанавливает драйвер при успешном монтировании карточки, и сбрасывает при ошибках. В данном случае, это бит 7 регистра r22


.macro		GreenOn
		sbr	r22,0x80
.endm
.macro		GreenOff
		cbr	r22,0x80
.endm
.macro		ifnogreen
		sbrs	r22,7
		rjmp	@0
.endm


Сигнал «Признак активности» (OrangeLight) — бит, служит для визуализации записи в карту. Драйвер включает его на время доступа к карточке. Прикольная моргалка, совершенно необязательная. Если не используется, макрос надо оставить пустым.

.macro		OrangeOn
		sbi	PortB,1
.endm
.macro		OrangeOff
		cbi	PortB,1
.endm


Сигнал «контакт карточки» — необязательный контроль наличия карточки, содержит команду проверки бита в порту, подключенному к контакту присутствия карты. Если используется, предотвращает возможное «зависание» драйвера при извлечении карты во время записи. Если не используется, может быть пустым.

.macro		ifnocard
;		sbic	PinB,0
;		rjmp	@0
.endm


Кроме того, основной текст должен содержать процедуру для работы с SPI, две подпрограммы — SpiRead и SpiSend. Входные и выходные данные в регистре r16, остальные регистры не должны изменяться. Флаги не должны изменяться.
Пример для устройств, имеющих аппаратный SPI:

SpiRead:	ser	r16
SpiSend:	out	spdr,r16
		sbis	spsr,spif
		rjmp	pc-1
		in	r16,spdr
		ret
 

В аттаче есть пример реализации программного SPI с индикатором на той же ножке.

Драйвер содержит 4 вызова, при посредстве которых происходит работа с картой:
  • SDInit
  • SDRreadParam
  • FileWrite
  • EmergencyFlush

SDInit — запуск карточки. Портит регистры r16 r17 r18. Входных параметров нет, выходной: r16=0 — успешно, r16=FF — карта дохлая или отсутствует, r16=1 — карта думает о смысле жизни.
В зависимости от того, как давно на карточку подали питание, и насколько карточка тормозная, может потребоваться вызвать SDInit 10-20 раз подряд, пока не вернётся ноль, свидетельствующий о готовности карты.

SDRreadParam — Монтирование карточки. Портит регистры r16 r17 r18 r19 r23 r24 r25. Возвращает «Признак монтирования», если карта успешно смонтировалась. Работа с файлом возможна только при успешном монтировании.

FileWrite — Побайтовая запись файла. Входной параметр — r16, его же и портит.

EmergencyFlush — Актуализация файловой системы. Входных параметров нет. После вызова этой функции на карточке создаётся актуальный образ файловой системы, то есть карточку можно извлекать без риска потери данных. Но как такового размонтирования не происходит, карточка доступна для продолжения записи. Для полного размонтирования нужно вызвать EmergencyFlush и деактивировать «Признак монтирования» вызовом макроса GreenOff.

В прилагаемом аттаче код логгера, который каждые 10 секунд опрашивает термометр и пишет в файл значение температуры. При подаче питания, если карточка смонтировалась, зажигает светодиод, и начинает работать. Чтобы извлечь карточку, надо нажать кнопку, и удерживать до погасания светодиода. И вся эта красота умещается в двухкилобайтную тиню, и там ещё остаётся навалом места.


Хотел было сделать прошивку, превращающую гаджет в файловый сопроцессор — фигню с ком-портом, которая пишет на диск всё, что поступает в порт.
Но поленился.
Обойдётесь пока.
Может будет настроение — сделаю.


Венды кагбэ одобряют содержимое раздела.

На всякий случай, схема шайтан-девайса. Питание, LDO стабилизатор, преобразователь уровня на полевике, камешек и слот для карточки. Ну и лампочка, как без неё?
Схема содержит в себе три хацкерских финта: Кнопка размонтирования подключена параллельно датчику. И в те моменты, когда программа не опрашивает датчик, она реагирует на кнопку.
Второй финт — это сигнал присутствия карты подключен параллельно её же тактированию. Для опроса применяется финт в программе, пляски с бубном и перенастройка порта.
Третий финт — лампочка состояния подключена к выходу данных SPI. Управление лампочкой осуществляется путём установки нужного уровня в порту в промежутках между байтами, отправляемыми карточке…

В схеме есть нехорошая ошибка — при вставлении карты происходит провал питающего напряжения, и контроллер сбрасывается. Потом, конечно, заводится, опознаёт карту и работает штатно, но все ж таки это косяк. Нужен либо более мощный LDO стабилизатор, либо просто питать карту от отдельного стабилизатора. Или питать пониженным напряжением только карту, а контроллер пятью вольтами, и сделать делитель. Есть место для полёта фантазии.
  • +14
  • 20 июня 2012, 21:39
  • Gornist
  • 1
Файлы в топике: sff.zip

Комментарии (16)

RSS свернуть / развернуть
Лол, а распиновку microSD проверить не догадался. А ведь первая мысль была правильная :D
0
  • avatar
  • Vga
  • 20 июня 2012, 22:11
Наверное потому, что и предположить не могли, что для микросд будет использован разъем, размером с обычную сд. )

0
Респект за фонарик с логгером температуры, не перестаешь удивлять :)
0
Есть идея. Можно запаять дополнительно еще микруху флэш памяти, например, с i2c интерфейсом, и размером с сектор карточки.
И писать не на карточку напрямую, а в эту флэху. Как только объем данных на флэхе достиг размера сектора, сбрасывать содержимое флэхи на карту.
0
угу. теперь нужно два буфера. просто замечательно.
0
ага, только оба они находятся во внешней памяти
+2
А почему не SRAM?
И с буфером проблем не вижу, сделать в контроллере небольшое скользящее по внешнему озу/пзу окно (на случай, если надо модифицировать рядом лежащие данные и не тратить время на их подгрузку в момент вычислений), а уже через него гонять данные с microSD на микруху памяти и обратно.
0
Дак а я что, против что ли? спи-срамка имеются в продаже. Вопрос один только. вывод селекта куда присобачить? инвертор ставить/ресет юзать? В прочем этот вариант всё равно лучше получится.
0
Если она только в одном режиме слейва, то просто на землю.
0
Про карточку вы явно подзабыли.
0
Ништяк!
Я так понял, в коде можно изменить интервал и пересобрать прошивку. А BOM, разводка платы существует?
Еще интересно, какое у нее потребление? Прошивка в сон, случайно, не уходит в промежутках между измерениями? (чтобы запустить это безобразие от пары таблеток). Один чувак из Австралии нечто подобное сделал. В качестве датчика температуры — термистор, и писал логи во внутреннюю память микроконтроллера (потом — кажется в отдельный чип FRAM?). Вместо слота для карты памяти — USB стек, и при подключении к компу оно просто вываливает содержимое в файл (эксель или текстовый редактор) — концепция мне понравилась, реализация в части АЦП — не очень (после прочтения рекомендаций и сравнения с тем, что он там наваял — собственно, ничего не наваял и никак не соблюдал этих рекомендаций, но наверное в том применении это и пофигу по большому счету), но вроде бы испытания показали стабильную и правдоподобную работу и высокую автономность.
0
Не могу сказать что мне понравилось. Как «презентация» о проблемах одновременного чтения и записи с последующим описанием только записи, так и раализация «убивания» всех файлов на флешке. Такое поведение считаю недопустимым.
Имхо в данном случае правильнее будет ту же PetitFS использовать. «Не весь объем флешки может использоваться и размер файла не изменяется» — не аргумент, ибо: файл так же можно зарание сделать под весь объем флешки и что самое главное — остальные файлы останутся целыми (а это вполне может быть програмка для подготовки файла данных).
0
SMD 0604? Однако…
0
да хоть 0402. если дорожку тащить под ним не надо :)
+1
Спасибо за классное устройство!
Давно хочу карточку приручить, чтобы с нее в СПЕКТРУМ игрушки загонять.
+1
через магнитофон?
вообще, уже давно прикручены и винты с компактфлешью, и сд. zx.pk.ru в помощь.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.