Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FatFS и 3 физических диска одновременно!
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
mantech
Собственно вопрос к светилам в особенности по fatfs, есть 3 физ. диска - sd-карта, усб флешка и флеш контроллера, который используется как диск на 512Кбайт.

Нижний уровень работает исправно, т.е. по "отдельности" доступ к дискам есть, все читает и записывает,
но вместе (например копирование с диска на диск) не работает, причем отследил, что фатфс просто не обращается к процедурам чтения-записи соотв диска. Предполагаю, что фатфс не запоминает, к какому из дисков нужно обратиться, хотя в f_mount четко определяю номер 0,1 или 2 и открываю файл, где перед именем тоже указываю соотв диск - "1:filename.ext"

Смотрел доки, там что-то мутное по поводу одновременной работы дисков, макросы типа LD2PD и тп. Я не использую логические диски в пределах одного физического. Как настроить фатфс для такого режима работы?
megajohn
вот пример совмещеной работы на два физических носителя.
Код
DRESULT disk_read (
    BYTE drv,
    BYTE* buff,
    DWORD lba,
    BYTE count
)
{
    switch (drv) {
    case DN_NAND:
        return NAND_read(buff, lba, count);
    case DN_MCI:
        return MCI_read(buff, lba, count);
    }
    return RES_PARERR;
}


Более полную информацию можте подчерпнуть из примеров чана ffsample для lpc23xx
Intel4004
в ffconf.h указать не забыли?
Код
/*---------------------------------------------------------------------------/
/ Physical Drive Configurations
/----------------------------------------------------------------------------*/

#define _VOLUMES    3
/* Number of volumes (logical drives) to be used. */
mantech
Цитата(megajohn @ Sep 16 2013, 09:42) *
вот пример совмещеной работы на два физических носителя.
Код
DRESULT disk_read (
    BYTE drv,
    BYTE* buff,
    DWORD lba,
    BYTE count
)
{
    switch (drv) {
    case DN_NAND:
        return NAND_read(buff, lba, count);
    case DN_MCI:
        return MCI_read(buff, lba, count);
    }
    return RES_PARERR;
}


Более полную информацию можте подчерпнуть из примеров чана ffsample для lpc23xx



Это все у меня работает, я написал, что нижний уровень читает и записывает.
Мне интересна настройка самой фатфс, для одновременной работы с несколькими дисками...
Нужно-ли использовать для этого настройки partition или еще что...

"в ffconf.h указать не забыли?" нет, нге забыл rolleyes.gif
Intel4004
Все работает по умолчанию. только подправить _VOLUMES и все. Вот простейший пример.
Нажмите для просмотра прикрепленного файла
mantech
Цитата(Intel4004 @ Sep 17 2013, 10:03) *
Все работает по умолчанию. только подправить _VOLUMES и все. Вот простейший пример.
Нажмите для просмотра прикрепленного файла


Диски физические или один с тремя лог. разделами?
Intel4004
Цитата(mantech @ Sep 17 2013, 20:49) *
Диски физические или один с тремя лог. разделами?


После первого запуска получим три файла (disk0.bin, disk1.bin, disk2.bin) - три виртуальных физических диска.
Это пример. Компиляется обычным bcc32.
Там исходников - пара десятков строчек в test\, разобраться - 5 минут.
doc\ и src\ - это собственно последний ff и есть. Всех изменений в ffconf.h:
#define _USE_MKFS 1 //0
#define _CODE_PAGE 866 //932
#define _VOLUMES 3 //1
Кстати, именно таким способом я делаю первоначальный дамп для заливки на носитель.
mantech
Цитата(Intel4004 @ Sep 17 2013, 20:14) *
После первого запуска получим три файла (disk0.bin, disk1.bin, disk2.bin) - три виртуальных физических диска.

#define _VOLUMES 3 //1


Вот и дело-то в том, что он с реальными физ дисками не работает! Т.е. в качестве параметра для disk_read выдает 0 при обращении к различным дискам, #define _VOLUMES 3 поставлено.
Intel4004
Цитата(mantech @ Sep 17 2013, 21:30) *
Вот и дело-то в том, что он с реальными физ дисками не работает! Т.е. в качестве параметра для disk_read выдает 0 при обращении к различным дискам, #define _VOLUMES 3 поставлено.

Скачайте. Скомпиляйте. Запустите. Посмотрите на экран. Увидите что то вроде:
disk 0: read: 00000000[00000001]
disk 1: read: 00000000[00000001]
disk 2: read: 00000000[00000001]
disk 0: write: 000001e0[00000001]
disk 1: write: 000001e0[00000001]
disk 2: write: 000001e0[00000001]
Посмотрите в test\diskio.c. Убедитесь, что цифры 0,1,2 после слова disk - это на самом деле параметр BYTE pdrv. Т.е. в качестве параметра для disk_read выдает номер диска(а не 0) при обращении к различным дискам. Посмотрите в свои исходники. Сравните. Определите чем отличаются и почему у вас этот параметр всегда равен нулю.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.