Перейти к содержанию
    

SPI NOR и Allwinner SoC

Есть SPI NOR, которая подключена через SPI к Allwinner T113-s3.   Функционал записи, чтения, стирания работает.

Запись - блок до 256 байт

Стирание - блок 4096 байт

Необходимо прикрутить FatFs к SPI NOR и отобразить диск через USB для ПК.  ПК тоже должен уметь читать и писать файлы в SPI NOR.

 

Есть проблема:  ПК видит только съёмные диски с размером сектора 512 байт.   Если записать такой кусок я ещё смогу - 2 раза по 256 байт для SPI NOR.  То как быть со стиранием? Стираются сразу 4096 байт.

В идеале, заставить FatFs работать с размером сектора 4096 байт, но Windows в ПК такой диск не распознаёт и требует форматирования.

Что можно сделать?  Как избежать лишнего стирания? (копировать все 8 блоков по 512 байт каждый, менять один и записывать все 8  - это сильно уменьшит ресурс по стиранию SPI NOR).

 

 

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал FatFs с размером сектора 4096 байт:  диск форматируется, файловая система монтирруется, задаётся метка диска, создаётся файл для записи, файл записывается и закрывается.

Работает в микроконтроллере и в Линуксе на ПК (через USB).

Но винда неправильно видит этот диск и требует его отформатировать.  В DiskImager показываются только первые 512 байт каждого сектора SPI NOR (из 4096 байт).

Есть ли способ заставить винду работать с сектором 4096 байт?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ChaN пишет, что в самой FAT прописывается размер сектора и Windows* системы его поддерживают, но некоторые драйверы используют зашитое значение в 512.

http://elm-chan.org/docs/fat_e.html

А тут пробуют отформатировать обычную карту памяти под сектор с размером 4к. Вроди бы даже успешно. Но имеются ограничения - минимальное количество кластеров для файловой системы.

https://askubuntu.com/questions/983546/trying-to-format-a-64gb-microsdxc-card-with-4096-bytes-per-sector

 

Плюс, дескрипторы USB - нужно сообщать, что размер сектора не 512 байт, а 4к. Но вам это виднее - я только пару раз прикрутил пример от ST к проекту и оно даже заработало... как-то. Ужасно медленно и в режиме только чтения. И естественно, на 512-байтных секторах.

Изменено пользователем AlanDrakes

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пока проблему решил  следующим образом:   размер сектора принимается за 512 байт. 

В функциях чтения и записи секторов проделываются необходимые вычисления и пересчёт на то что и сколько нужно прочесть-стереть-записать.

Размер сектора = 512 байт (Винда)

Максимальный размер блока записи = 256 байт

Размер блока для стирания = 4096 байт

Размер блока чтения - произвольный

 

Чтение секторов делается просто:

void NOR_ReadSector(u32 sector,u8 *buf,u32 count)
{
 NOR_read(sector*512,buf,count*512);
}

 

С записью секторов - сложно + стирание:

void NOR_EraseWriteSector(u32 sector,u8 *buf,u32 count)
{
 u32 LBA=sector*512;
 u32 Bytes=count*512;

 u32 LBAs=(LBA/4096)*4096;

 u32 Add=LBA-LBAs;

 u32 Bytess=Bytes+Add;

 u32 Count=Bytess/4096;
 if(Bytess%4096)Count++;

 u32 Count4=Count*4096;

 u8 *save=malloc(Count4);

 NOR_read(LBAs,save,Count4);

 for(int i=0;i<Count;i++)NOR_erase(LBAs+(i*4096));

 memcpy(&save[LBA-LBAs],buf,Bytes);

 for(int i=0;i<Count4/256;i++)NOR_write(LBAs+(i*256),&save[i*256],256);

 free(save);
}

 

Всё работает: форматирование, метка диска, чтение и запись файлов: как на стороне МК, так и на стороне ПК через USB Mass Storage.

 

Из минусов: приходится тереть 8 виндовых секторов вперёд.

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...