repstosw 18 26 марта, 2023 Опубликовано 26 марта, 2023 (изменено) · Жалоба Есть 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). Изменено 26 марта, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 27 марта, 2023 Опубликовано 27 марта, 2023 · Жалоба Сделал FatFs с размером сектора 4096 байт: диск форматируется, файловая система монтирруется, задаётся метка диска, создаётся файл для записи, файл записывается и закрывается. Работает в микроконтроллере и в Линуксе на ПК (через USB). Но винда неправильно видит этот диск и требует его отформатировать. В DiskImager показываются только первые 512 байт каждого сектора SPI NOR (из 4096 байт). Есть ли способ заставить винду работать с сектором 4096 байт? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlanDrakes 1 27 марта, 2023 Опубликовано 27 марта, 2023 (изменено) · Жалоба 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-байтных секторах. Изменено 27 марта, 2023 пользователем AlanDrakes Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 27 марта, 2023 Опубликовано 27 марта, 2023 (изменено) · Жалоба Пока проблему решил следующим образом: размер сектора принимается за 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 виндовых секторов вперёд. Изменено 27 марта, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться