Есть устройство выполненное на AT91SAM7S - подробнее на http://prottoss.com/projects/ucGoZilla/ucGoZilla.htm.
Для РС обозначено как СОМ-порт.
Из драйверов только INF-файл, указывающий на штатный для Windows драйвер usbser.sys
Проблема в том что, при работе с внутренним загрузчиком SAM-BA, на некоторых материнских платах, с не-INTEL чипсетами обмен между ПО на РС и устройством может прерываться.
Т.е. первый запрос в устройство через WriteFile проходит (2 байта), далее чтение через ReadFile (2 байта) тоже отлично.
Далее новый запрос. Но функция ReadFile вылетает по таймауту.
Т.е. в микроконтроллере инициализирован штатный внутренний загрузчик и я пытаюсь через самописную утилиту с ним связаться.
Утилита работает с устройством не как с СОМ-портом, а как с USB устройством.
Т.е через "SetupDiEnumDeviceInterfaces" находится устройство с нужным VID/PID затем извлекается хэндл и, далее, уже стандартно, открывается через CreateFile. Далее все как обычно - ReadFile/WriteFile
Ниже функции ввода-вывода
CODE
/*******************************************************************************
Write data to device
*******************************************************************************/
IO_RES WriteData(PVOID Data, ULONG Size)
{
OVERLAPPED sync = {0,};
ULONG xfer, err;
IO_RES res = RES_OK;
/* Create event */
sync.hEvent = CreateEvent(0, FALSE, FALSE, NULL);
if(sync.hEvent == NULL)
return WR_FAIL_CREATE_SYNC;
/* Write data */
if(!WriteFile(g_hWritePipe, Data, Size, &xfer, &sync))
{
/* Check error */
err = GetLastError();
if(ERROR_IO_PENDING == err)
{
/* Pending write operation */
err = WaitForSingleObject(sync.hEvent, CFG_IO_TIMEOUT);
switch(err)
{
case WAIT_OBJECT_0:
if(!GetOverlappedResult(g_hWritePipe, &sync, &xfer, TRUE))
return WR_FAIL_GET_OVERLAPPED_RESULT;
break;
case WAIT_TIMEOUT:
CancelIo(g_hWritePipe); /* Cancelled IO operation */
ResetEvent(sync.hEvent);
res = WRITE_TIMEOUT;
break;
case WAIT_ABANDONED:
default:
res = WR_FAIL_WAIT_FOR_SINGLE_OBJECT;
}
}
else
res = WR_FAIL_WRITE_OPERATION;
}
ResetEvent(sync.hEvent);
CloseHandle(sync.hEvent);
return res;
}
/*******************************************************************************
Read data from device
*******************************************************************************/
IO_RES ReadData(PVOID Data, ULONG Size)
{
OVERLAPPED sync = {0,};
ULONG xfer, err;
IO_RES res = RES_OK;
/* Create event */
sync.hEvent = CreateEvent(0, TRUE, FALSE, NULL);
if(sync.hEvent == NULL)
return RD_FAIL_CREATE_SYNC;
/* Read data */
if(!ReadFile(g_hWritePipe, Data, Size, &xfer, &sync))
{
/* Check error */
err = GetLastError();
if(ERROR_IO_PENDING == err)
{
/* Set pending operation */
err = WaitForSingleObject(sync.hEvent, CFG_IO_TIMEOUT);
switch(err)
{
case WAIT_OBJECT_0: /* Wait read operation complete */
if(!GetOverlappedResult(g_hWritePipe, &sync, &xfer, TRUE))
res = RD_FAIL_GET_OVERLAPPED_RESULT;
break;
case WAIT_TIMEOUT:
CancelIo(g_hWritePipe); /* Cancelled IO operation */
ResetEvent(sync.hEvent);
res = READ_TIMEOUT;
break;
case WAIT_ABANDONED:
default:
res = RD_FAIL_WAIT_FOR_SINGLE_OBJECT;
}
}
else
res = RD_FAIL_WRITE_OPERATION;
}
CloseHandle(sync.hEvent);
return res;
}