Jump to content

    
Sign in to follow this  
mantech

FatFS и 3 физических диска одновременно!

Recommended Posts

Собственно вопрос к светилам в особенности по fatfs, есть 3 физ. диска - sd-карта, усб флешка и флеш контроллера, который используется как диск на 512Кбайт.

 

Нижний уровень работает исправно, т.е. по "отдельности" доступ к дискам есть, все читает и записывает,

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

 

Смотрел доки, там что-то мутное по поводу одновременной работы дисков, макросы типа LD2PD и тп. Я не использую логические диски в пределах одного физического. Как настроить фатфс для такого режима работы?

Edited by mantech

Share this post


Link to post
Share on other sites

вот пример совмещеной работы на два физических носителя.

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

Share this post


Link to post
Share on other sites

в ffconf.h указать не забыли?

/*---------------------------------------------------------------------------/
/ Physical Drive Configurations
/----------------------------------------------------------------------------*/

#define _VOLUMES    3
/* Number of volumes (logical drives) to be used. */

Share this post


Link to post
Share on other sites
вот пример совмещеной работы на два физических носителя.

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:

Share this post


Link to post
Share on other sites
Все работает по умолчанию. только подправить _VOLUMES и все. Вот простейший пример.

fftest.rar

 

Диски физические или один с тремя лог. разделами?

Share this post


Link to post
Share on other sites
Диски физические или один с тремя лог. разделами?

 

После первого запуска получим три файла (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

Кстати, именно таким способом я делаю первоначальный дамп для заливки на носитель.

Edited by Intel4004

Share this post


Link to post
Share on other sites
После первого запуска получим три файла (disk0.bin, disk1.bin, disk2.bin) - три виртуальных физических диска.

 

#define _VOLUMES 3 //1

 

Вот и дело-то в том, что он с реальными физ дисками не работает! Т.е. в качестве параметра для disk_read выдает 0 при обращении к различным дискам, #define _VOLUMES 3 поставлено.

Share this post


Link to post
Share on other sites
Вот и дело-то в том, что он с реальными физ дисками не работает! Т.е. в качестве параметра для 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) при обращении к различным дискам. Посмотрите в свои исходники. Сравните. Определите чем отличаются и почему у вас этот параметр всегда равен нулю.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this