Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Дайте совет: USB+sam7x+flash
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Freeuser
В общем задача такая: записать на SD-карту данные, без всякой файловой системы, сплошным потоком. Данных ~ 200 метров, и находятся они на компе. Собственно вопрос: как реализовать сие??? Моё видение - организовать передачу через USB в контроллер (at91sam7x256), который будет запихивать их на карту памяти. Но дело в том что с ARM'ми я знаком недавно, с USB - тоже. На данный момент реализовано чтение и запись на карту памяти. Поделитесь мнениями, может быть данную задачу можно решить другим путем.
ataradov
Загрузиться в Linux и сделать dd if=file.name of=/dev/sda (или как там карта назовется)

По остальным параметрам man dd.
vmp
Записать обязательно через SAM7X или просто записать?
Если просто записать, то берем подходящий кардридер и (если винды) WinHex. В винхексе меню tools -> clone disk. Если линукс - уже рассказали.

Если именно через SAM7X, то берем за основу пример USB Mass Storage от Атмела, подключаем к нему работу с SD и получаем тот же кардридер. Что делать далее - уже написал.
Freeuser
Да, писать наверное желательно через контроллер. Потому как по мере надобности данные должны записываться на карту с компа небольшими порциями на конкретный адрес. А если делать через Линукс/Винхекс такое возможно? С mass storage поиграюсь обязательно...
vmp
Из-под виндов есть как минимум 2 способа:
Прямой доступ к устройству (читать MSDN на тему CreateFile):
Код
sprintf(path, "\\\\.\\PhysicalDrive%d", devno);

hDisk =   CreateFile(path,
           GENERIC_READ | GENERIC_WRITE,
           FILE_SHARE_READ | FILE_SHARE_WRITE,
           NULL,
           OPEN_EXISTING,
           FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH,
           NULL);
if (hDisk == INVALID_HANDLE_VALUE)
  {
   return 1;
  }

if (!DeviceIoControl(hDisk,
  FSCTL_LOCK_VOLUME,           // dwIoControlCode
  NULL,                        // lpInBuffer
  0,                           // nInBufferSize
  NULL,                        // lpOutBuffer
  0,                           // nOutBufferSize
  &BytesReturned,              // number of bytes returned
  NULL))                       // OVERLAPPED structure
  {
   CloseHandle(hDisk);
   return 2;
  }
return 0;

int WriteSect(int sect, void *buf)
{
DWORD NumberOfBytesWritten;

if (SetFilePointer(hDisk,      //  HANDLE hFile,
   sect * 512,                  //  LONG lDistanceToMove,
   NULL,                        //  PLONG lpDistanceToMoveHigh,
   FILE_BEGIN)                  //  DWORD dwMoveMethod
    == -1)
  {
    return 1;
  }
if (!WriteFile(hDisk,     //  HANDLE hFile,
   buf,                    //  LPVOID lpBuffer,
   512,                    //  DWORD nNumberOfBytesToRead,
   &NumberOfBytesWritten,  //  LPDWORD lpNumberOfBytesRead,
   NULL))                  //  LPOVERLAPPED lpOverlapped
  {
   return 2;
  }
if (NumberOfBytesWritten != 512)
  {
    return 3;
  }
return 0;
}



И более хитрый способ для работы с файловой системой без файловой системы.
Берем карту памяти, форматируем на писишке в FAT, создаем один большой файл во всю свободную область. В этом случае файл получается непрерывный. В начало файла пишем какую-нибудь уникальную сигнатуру + доп информацию типа размера файла.
В устройстве при запуске сканируем карту в поисках сигнатуры. Найдя ее - имеем начало файла и размер. Далее просто читаем или пишем данные, не трогая заголовок.
В итоге устройство ничего не знает о файловой системе, а на писюке можно работать с файлами стандартными способами.
KAlex
С помощю FileStream делается намного проще.
Для Дельфи:

fs:=TFileStream.Create('\\.\E:',fmOpenWrite);
fs.Position := position;
fs.Write(Buffer,Size);
fs.Free;

Ну и проверочку перед этим, чтоб на хард не писать
if GetDriveType(Pchar('\E:')) = DRIVE_removable then ...
Freeuser
Спасибо, попробую использовать эти способы. Решил таки разобраться с подключением контроллера к ПК через USB, имхо лишним не будет.
Сейчас на стадии деланья HID-девайса, ковыряю пример от кейла.
Freeuser
Пробовал вариант записи, предложенный KAlex'ом, но строчка
CODE
fs:=TFileStream.Create('F:',fmOpenWrite);
не прокатывает. вылазиет ошибка 'Отказано в доступе' sad.gif.
Я как понял, использование FileStream подразумевает наличие файловой системы
KAlex
Цитата(Freeuser @ Nov 23 2009, 16:13) *
строчка
CODE
fs:=TFileStream.Create('F:',fmOpenWrite);
не прокатывает.

И не прокатит.
fs:=TFileStream.Create('\\.\F:',fmOpenWrite);
Freeuser
Да, да...сорри за невнимательность, все заработало! Спасибо! Кстати, ВинХекс тоже здорово подсобил!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.