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

Вопрос по FatFs от мистера ChaN'а

Кто, что скажет?

 

Надо задать

#define _CODE_PAGE    866

, и в терминалке выставить шрифт TERMINAL, тоже в DOS-кодировке.

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


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

Надо задать

#define _CODE_PAGE    866

, и в терминалке выставить шрифт TERMINAL, тоже в DOS-кодировке.

Да, действительно, так работает. осталось только перекодировку клавиш как-то осуществить - в моих терминалках этого нет (terminal v1.9 by Br@y++, в ZOC как-то коряво), но в целом проблема ясна:

У русских, как всегда, особенный путь :) : короткие имена Windows хранит в 866-й кодировке, длинные - в 1251-й, путаница ещё та.

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


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

ZOC как-то коряво..

Да ну? Совершенно нормальная реализация. Причем у подавляющего большинства и мыслей о других кодировках нет.

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


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

Да ну?

Согласен, у подавляющего большинства мыслей становится всё меньше и меньше...:)

Лично мне не удалось нормально настроить этот самый ZOC и больше на это время тратить не буду.

Что касается локализации файловой системы, то дело это оказалось нетривиальным и ресурсоемким - всё зависит от конкретной задачи.

 

Просто я хотел бы узнать как другие решали эти проблемы в своих разработках.

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


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

Вопрос по Petit FatFs.

 

Для отладки использую Proteus VSM 8.4 с виртуальной CD/MMC картой. На карте есть единственный файл 7 с хвостиком килобайт, к которому осуществляется доступ в разные произвольные места. Поначалу все работает: файл открывается, из него читаются данные (все верно читается), функция pf_lseek отрабатывает разные смещения. Но потом по неизвестным причинам pf_lseek начинает выдавать ошибку FR_DISK_ERR, и все, разумеется, перестает работать.

 

При пошаговой отладке добрался до функции send_cmd(CMD17, sector), которая и вызывает эту ошибку. В начале эта функция вызывается многократно успешно, а ошибку возвращает, если sector == 512 (просто обратил внимание, не факт, что именно это значение играет роль).

 

Что-то никак не могу понять, куда копать... подскажите, пожалуйста, если не сложно...

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


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

А в железе пробовали отлаживать?

Симулятор, конечно, хорошо, но не всегда помогает разобраться в причинах.

Так же, можете добавить в обработчике ошибок (кстати, у себя в коде не нашёл такового - похоже, функции писались с бодуна, но работают почти без сбоев) сделать вывод ответа карты - так проще разобраться в ошибках.

На ARM - такое крайне желательно.

Предполагаю, что используете SPI?

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


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

Делал и в железе - результат 100% тот же самый. И вывод всех статусов карты и т.п. делал, т.е. из Chan-овской библиотеки в нужных местах выводил, что возвращается... толку ноль - не понимаю, что не так. Когда сектор равен 512 в функции lseek, в конце функции карта просто не отвечает - приходит 0xFF и точка... хоть убей...

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


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

Обработчики функций библиотеки дописывали сами?

 

Попробую привести пример своих, может поможет чем.

Сразу поясню: сталкивался с какими-то весёлыми косяками при работе с несколькими картами (всеми имевшимися на тот момент в наличии), код привёл к тому виду, в котором он сейчас. На тот момент всё работало стабильно, читалось, писалось.

Попробуйте, может и заработает.

 

DRESULT disk_read (
uint8_t pdrv,		/* Physical drive nmuber to identify the drive */
uint8_t *buff,		/* Data buffer to store read data */
DWORD sector,		/* Sector address in LBA */
UINT count		/* Number of sectors to read */
)
{
<...>
//case MMC :
	//// translate the arguments here

	//result = MMC_disk_read(buff, sector, count);
	result = 0;
	if (count == 1) {
		result = SPI_SD_READ_SECTOR_buf(sector, m_buf);
	} else {
		while (count>0)
		{
			result = SPI_SD_READ_SECTOR_buf(sector, m_buf);
			count--;
			sector++;
		};			
	};
	return result;
<...>


uint8_t SPI_SD_READ_SECTOR_buf(uint32_t Sector, uint8_t* buff) {
uint16_t i;
uint32_t calc_Addr;
SPI_Select_CARD();
if (!(sd_raw_card_type & (1 << SD_RAW_SPEC_SDHC)))	// Если карта НЕ является SDHC - добавляем 9 бит к адресу.
{
	// !SDHC
	calc_Addr = ((Sector+249) << 9);		// DaFaq?! But will not work in other case.
} else {
	// SDHC
	calc_Addr = (Sector+2048);			// And one more DAFAQ!
};
i = SPI_SD_SendCMD(CMD_READ_SINGLE_BLOCK, calc_Addr);	// Передаём вычисленный адрес карте
card_answ_at_read = i;					// DEBUUUUUG!
if(i)
{
	SPI_UnSelect_CARD();				// Отпускаем карту
	return R_ERR;					// Возвращаем ошибку. =(
};
while (SPI_Rd_Byte() != 0xFE);			// Ждём начала блока. Чаще всего до 30-40 итераций.
for (i=0; i<512; i++)					// Читаем байт и заносим его в буфер (512 байт)
{
	*buff = SPI_Rd_Byte();
	buff++;
};
SPI_Rd_Byte();					// CRC
SPI_Rd_Byte();					// CRC (2) // IGNORED T_T
/* deaddress card */
SPI_UnSelect_CARD();					// Отпускаем карту (шину)
SPI_Rd_Byte();					// Тактирование.
return R_OK;
};

 

ЗЫ: Обратите внимание на комментарии около странных переводов значений секторов. Особенно, +249

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


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

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

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

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

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

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

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

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

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

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