реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> FatFS и 3 физических диска одновременно!, Как настроить сие чудо?
mantech
сообщение Sep 14 2013, 18:01
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



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

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

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

Сообщение отредактировал mantech - Sep 14 2013, 18:06
Go to the top of the page
 
+Quote Post
megajohn
сообщение Sep 16 2013, 06:42
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



вот пример совмещеной работы на два физических носителя.
Код
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


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Intel4004
сообщение Sep 16 2013, 06:54
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 7-09-07
Из: Наб.Челны
Пользователь №: 30 364



в ffconf.h указать не забыли?
Код
/*---------------------------------------------------------------------------/
/ Physical Drive Configurations
/----------------------------------------------------------------------------*/

#define _VOLUMES    3
/* Number of volumes (logical drives) to be used. */
Go to the top of the page
 
+Quote Post
mantech
сообщение Sep 16 2013, 18:04
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(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
Go to the top of the page
 
+Quote Post
Intel4004
сообщение Sep 17 2013, 07:03
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 7-09-07
Из: Наб.Челны
Пользователь №: 30 364



Все работает по умолчанию. только подправить _VOLUMES и все. Вот простейший пример.
Прикрепленный файл  fftest.rar ( 694.81 килобайт ) Кол-во скачиваний: 150


Сообщение отредактировал Intel4004 - Sep 17 2013, 07:04
Go to the top of the page
 
+Quote Post
mantech
сообщение Sep 17 2013, 16:49
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Intel4004 @ Sep 17 2013, 10:03) *
Все работает по умолчанию. только подправить _VOLUMES и все. Вот простейший пример.
Прикрепленный файл  fftest.rar ( 694.81 килобайт ) Кол-во скачиваний: 150


Диски физические или один с тремя лог. разделами?
Go to the top of the page
 
+Quote Post
Intel4004
сообщение Sep 17 2013, 17:14
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 7-09-07
Из: Наб.Челны
Пользователь №: 30 364



Цитата(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
Кстати, именно таким способом я делаю первоначальный дамп для заливки на носитель.

Сообщение отредактировал Intel4004 - Sep 17 2013, 17:24
Go to the top of the page
 
+Quote Post
mantech
сообщение Sep 17 2013, 17:30
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Intel4004 @ Sep 17 2013, 20:14) *
После первого запуска получим три файла (disk0.bin, disk1.bin, disk2.bin) - три виртуальных физических диска.

#define _VOLUMES 3 //1


Вот и дело-то в том, что он с реальными физ дисками не работает! Т.е. в качестве параметра для disk_read выдает 0 при обращении к различным дискам, #define _VOLUMES 3 поставлено.
Go to the top of the page
 
+Quote Post
Intel4004
сообщение Sep 17 2013, 17:50
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 7-09-07
Из: Наб.Челны
Пользователь №: 30 364



Цитата(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) при обращении к различным дискам. Посмотрите в свои исходники. Сравните. Определите чем отличаются и почему у вас этот параметр всегда равен нулю.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 07:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01449 секунд с 7
ELECTRONIX ©2004-2016