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

 
 
> Дайте совет: USB+sam7x+flash
Freeuser
сообщение Nov 18 2009, 11:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



В общем задача такая: записать на SD-карту данные, без всякой файловой системы, сплошным потоком. Данных ~ 200 метров, и находятся они на компе. Собственно вопрос: как реализовать сие??? Моё видение - организовать передачу через USB в контроллер (at91sam7x256), который будет запихивать их на карту памяти. Но дело в том что с ARM'ми я знаком недавно, с USB - тоже. На данный момент реализовано чтение и запись на карту памяти. Поделитесь мнениями, может быть данную задачу можно решить другим путем.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
ataradov
сообщение Nov 18 2009, 12:04
Сообщение #2


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

Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



Загрузиться в Linux и сделать dd if=file.name of=/dev/sda (или как там карта назовется)

По остальным параметрам man dd.
Go to the top of the page
 
+Quote Post
vmp
сообщение Nov 18 2009, 13:32
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



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

Если именно через SAM7X, то берем за основу пример USB Mass Storage от Атмела, подключаем к нему работу с SD и получаем тот же кардридер. Что делать далее - уже написал.
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Nov 19 2009, 07:53
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



Да, писать наверное желательно через контроллер. Потому как по мере надобности данные должны записываться на карту с компа небольшими порциями на конкретный адрес. А если делать через Линукс/Винхекс такое возможно? С mass storage поиграюсь обязательно...
Go to the top of the page
 
+Quote Post
vmp
сообщение Nov 19 2009, 08:22
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Из-под виндов есть как минимум 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, создаем один большой файл во всю свободную область. В этом случае файл получается непрерывный. В начало файла пишем какую-нибудь уникальную сигнатуру + доп информацию типа размера файла.
В устройстве при запуске сканируем карту в поисках сигнатуры. Найдя ее - имеем начало файла и размер. Далее просто читаем или пишем данные, не трогая заголовок.
В итоге устройство ничего не знает о файловой системе, а на писюке можно работать с файлами стандартными способами.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Nov 19 2009, 09:56
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



С помощю FileStream делается намного проще.
Для Дельфи:

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

Ну и проверочку перед этим, чтоб на хард не писать
if GetDriveType(Pchar('\E:')) = DRIVE_removable then ...
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Nov 19 2009, 12:00
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



Спасибо, попробую использовать эти способы. Решил таки разобраться с подключением контроллера к ПК через USB, имхо лишним не будет.
Сейчас на стадии деланья HID-девайса, ковыряю пример от кейла.
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Nov 23 2009, 13:13
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



Пробовал вариант записи, предложенный KAlex'ом, но строчка
CODE
fs:=TFileStream.Create('F:',fmOpenWrite);
не прокатывает. вылазиет ошибка 'Отказано в доступе' sad.gif.
Я как понял, использование FileStream подразумевает наличие файловой системы

Сообщение отредактировал Freeuser - Nov 23 2009, 13:40
Go to the top of the page
 
+Quote Post
KAlex
сообщение Nov 24 2009, 08:05
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(Freeuser @ Nov 23 2009, 16:13) *
строчка
CODE
fs:=TFileStream.Create('F:',fmOpenWrite);
не прокатывает.

И не прокатит.
fs:=TFileStream.Create('\\.\F:',fmOpenWrite);
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Nov 26 2009, 07:38
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



Да, да...сорри за невнимательность, все заработало! Спасибо! Кстати, ВинХекс тоже здорово подсобил!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:56
Рейтинг@Mail.ru


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