Не буду утверждать стопроцентно, поскольку вглубь не лазил, удовлетворился фактом работы, но
basicUSB уже предсталяет из себя CDC-устройство т.е. в файле main мы уже имеем верхний уровень
отвязаный от режимов передачи, endpoint-ов и прочей USB специфики.
У меня основной цикл выглядел так:
Код
//--------------------------------------------------------------------------
for(;;)
{
// Check enumeration
if (pCDC.IsConfigured(&pCDC))
{
ProcessCmd();
}
}
}
//--------------------------------------------------------------------------
void ProcessCmd()
{
//AT91F_PIO_ForceOutput(AT91C_BASE_PIOA,~(1<<4));
pCDC.Read(&pCDC,(char*)&ask, sizeof(CMD_S));
Execute(ask.cmd);
pCDC.Write(&pCDC,(char*)&resp, sizeof(DAT_S));
//AT91F_PIO_ForceOutput(AT91C_BASE_PIOA,(1<<4));
}
//--------------------------------------------------------------------------
где ask и resp соответственно буфера приема и передачи команды типа CMD_S - структуры в которой описан формат буферов.
Execute(ask.cmd) соответсвенно парсер команды.
Другими словами мы работаем так же как с обычным UARTом.
Со стороны хост-машины существуют исходники USBLibrary dll
Поскольку пользуюсь MInGW надо было перепиливать экспорт функций, я поленился и просто копи-пастом перенес в проект.
Суть от этого не изменилась, имеем класс CFCPipeUSB который создает два пайпа на чтение и запись.
Снаружи мы обращаемся к ним как к обычным функциям Read/Write внутри старые добрые Create-Read-Write-CloseFile т.е опять таки все хорошо известное по СОМ-портам
Отличие в том что вместо файла мы открываем пайпы и имеем не предопределенное имя порта а то что нашла энумерация USB.
Со стороны хоста получилось следующее
Код
if (pipe.Open(devname))
{
WxMemo->AppendText("Can't open device \n");
return 1;
}
WxMemo->AppendText("Opened... \n");
//----------------------------------
//there is exchange
//--------------------------------
WxMemo->AppendText("Write \n");
for(int block = 0; block < 9; block ++)
{
if(pipe.WritePipe((char*)&ask, sizeof(CMD_S), &msgWritten))
{
WxMemo->AppendText("Write error 1\n");
pipe.Close();
return 1;
}
if(sizeof(CMD_S) != msgWritten)
{
WxMemo->AppendText("Write error2\n" + s);
pipe.Close();
return 1;
}
//s.Printf("%ud-%ld",sizeof(CMD_S),msgWritten);
//WxMemo->AppendText(s);
if (pipe.ReadPipe ((char*)&resp, sizeof(DAT_S)))
{
WxMemo->AppendText("Read error\n");
pipe.Close();
return 1;
}
}//for pipe
WxMemo->AppendText("Read\n");
Оба фрагмента уже не из теста, а реального кода, хотя возможно промежуточной версии.