|
Не могу произвести запись в драйвер atm6124.sys из BasicUSB, at91sam7s. |
|
|
|
Sep 17 2008, 03:46
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Прошивка контролера на основе BasicUSB, с драйвером atm6124ser работает все нормально, но мне не хватает скорости. Пытаюсь открыть драйвер atm6124.sys, CreateFile выполняется нормально, но далее при попытке произвести запись WriteFile возвращает ошибку! Так я открываю драйвер в VC++ 8: Код HDEVINFO hDevInfo; // {A5DCBF10-6530-11D2-901F-00C04FB951ED} GUID Nguid = { 0xA5DCBF10, 0x6530, 0x11d2, { 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed } }; GUID *guid = &Nguid; hDevInfo = SetupDiGetClassDevs (guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); /*Мы попросили вернуть нам описатель для устройств, предоставляющих интерфейс с guid и присутствующих в данный момент в системе получаем краткую информацию для интерфейсов (в данном случае, для первого интерфейса в списке с подходящим guid)*/
PSP_DEVICE_INTERFACE_DATA devInfoData = (PSP_DEVICE_INTERFACE_DATA)malloc(sizeof(SP_DEVICE_INTERFACE_DATA)); devInfoData->cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); SetupDiEnumDeviceInterfaces(hDevInfo, NULL, guid, 0, devInfoData); //Определим необходимую для хранения символического имени устройства длину буфера unsigned long requiredlength; SetupDiGetDeviceInterfaceDetail(hDevInfo, devInfoData, NULL, 0, &requiredlength, NULL);
//Узнаем символическое имя для устройства с заданным интерфейсом PSP_DEVICE_INTERFACE_DETAIL_DATA DevInfoDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredlength); DevInfoDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); SetupDiGetInterfaceDeviceDetail (hDevInfo, devInfoData, DevInfoDetail, requiredlength, &requiredlength, NULL); //открытие порта HANDLE port = CreateFile(DevInfoDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //проверка результата открытия порта if (port == INVALID_HANDLE_VALUE) {pDoc->StringData1 = "failed opening";} else {pDoc->StringData1 = "cool opening";}
BOOLEAN Success; unsigned char com_buf[28];//буфер ком. слов и слова режима //заполнение буфера com_buf com_buf[0]=0x30; //команда для командного процессора девайса: запрос подтверждения приема данных com_buf[1]=mTMode[0]; com_buf[2]=mTMode[1]; for(int i=3;i<27;i++) { com_buf[i]=mCWord[i-3]; } com_buf[27]=0x0; //Запись в файл ULONG nBytes=28; Success = WriteFile(port, &com_buf, 28, &nBytes, NULL);//Запись слова режима, ком. слова //ожидание окончания записи в файл if(!Success ) //|| ( nBytes != sizeof(VENDORPACKET) ) ) { pDoc->StringData1 += " failed to write"; } else { pDoc->StringData1 += " write successful"; } Код возвращат " failed to write". Кто-нибудь сталкивался с такой проблемой?
|
|
|
|
|
 |
Ответов
|
Sep 22 2008, 07:51
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Цитата(Aurochs @ Sep 20 2008, 05:28)  Драйвер at6124 хитро скроен. Для него нужно открывать 2 устройства - отдельно для чтения и записи. Для получения имени устройства для записи нужно к уже полученному Вами имени дописать "\\PIPE00", а для чтения "\\PIPE01" После добавления к имени устройства "\\PIPE00" всеравно WriteFile возвращает ошибку, но уже друную: "Неверный дескриптор". Дескрипторы у atm6124 и atm6124ser разные?
|
|
|
|
|
Sep 22 2008, 11:19
|
Ортодокс
  
Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775

|
Цитата(Bulat @ Sep 22 2008, 10:51)  После добавления к имени устройства "\\PIPE00" всеравно WriteFile возвращает ошибку, но уже друную: "Неверный дескриптор". Дескрипторы у atm6124 и atm6124ser разные? Похоже, наши переводчики суют термин "дескриптор" во все места, где нет соответствующего русскоязычного термина  Поэтому непонятно, о каком дескрипторе речь. Скорее всего имеется в виду хендл открытого или созданного устройства, который возвращает ф-ция CreateFile. Эти хендлы могут быть разные даже от вызова к вызову. Что тут делать? 1. Попробовать изменить GUID. Для драйвера из пакета AT91-ISP я задаю его так: DEFINE_GUID( guidAtmel6124, 0xE6EF7DCD, 0x1795, 0x4A08, 0x9F, 0xBF, 0xAA, 0x78, 0x42, 0x3C, 0x26, 0xF0 );2. Попробовать убрать GENERIC_READ из вызова CreateFile3. Если первые 2 пункта не помогут, то сообщить код ошибки, который возвращает GetLastError после вызова WriteFile
|
|
|
|
|
Sep 23 2008, 02:48
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Цитата(Aurochs @ Sep 22 2008, 17:19)  Похоже, наши переводчики суют термин "дескриптор" во все места, где нет соответствующего русскоязычного термина  Поэтому непонятно, о каком дескрипторе речь. Скорее всего имеется в виду хендл открытого или созданного устройства, который возвращает ф-ция CreateFile. Эти хендлы могут быть разные даже от вызова к вызову. Что тут делать? 1. Попробовать изменить GUID. Для драйвера из пакета AT91-ISP я задаю его так: DEFINE_GUID( guidAtmel6124, 0xE6EF7DCD, 0x1795, 0x4A08, 0x9F, 0xBF, 0xAA, 0x78, 0x42, 0x3C, 0x26, 0xF0 );2. Попробовать убрать GENERIC_READ из вызова CreateFile3. Если первые 2 пункта не помогут, то сообщить код ошибки, который возвращает GetLastError после вызова WriteFile1. Я этот гуид и использую, только записываю по-другому, у меня VС++8: Код GUID Nguid = {0xe6ef7dcd, 0x1795, 0x4a08, { 0x9f, 0xbf, 0xaa, 0x78, 0x42, 0x3c, 0x26, 0xf0} }; GUID *guid = &Nguid; 2.Убрал GENERIC_READ из вызова CreateFile, всеравно пишет: Неверный дескриптор. В BasicUSB для открывания, записи и чтения используют свои функции: Код short Open(char *sDeviceName); // Open pipe short Close(); // Close pipe virtual short ReadPipe(LPVOID pBuffer, ULONG ulBufferSize); // Read data virtual short WritePipe(LPVOID pBuffer, ULONG ulBufferSize, ULONG *pBytesWritten); // Write data Может в этом дело?
|
|
|
|
|
Sep 23 2008, 05:15
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Да и еще вопрос!) Я похоже неправильно приписываю "\\PIPE00" к имени устройства? Код HANDLE port = CreateFile(DevInfoDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
WriteFile("port\\PIPE00", &com_buf, 28, &nBytes, NULL); Не подскажете как это правильно сделать?
|
|
|
|
|
Sep 23 2008, 07:21
|
Ортодокс
  
Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775

|
Цитата(Bulat @ Sep 23 2008, 08:15)  Да и еще вопрос!) Я похоже неправильно приписываю "\\PIPE00" к имени устройства? Код HANDLE port = CreateFile(DevInfoDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
WriteFile("port\\PIPE00", &com_buf, 28, &nBytes, NULL); Не подскажете как это правильно сделать? Ну, дык конечно Нужно так Код TCHAR devName[MAX_PATH]; strcpy( devName, DevInfoDetail->DevicePath ); strcat( devName, _T( "\\PIPE00" ) ); А затем для devName вызывать CreateFile
|
|
|
|
Сообщений в этой теме
Bulat Не могу произвести запись в драйвер atm6124.sys из BasicUSB Sep 17 2008, 03:46 prottoss Цитата(Bulat @ Sep 17 2008, 11:46) Пытаюс... Sep 17 2008, 04:02 zhevak Цитата(prottoss @ Sep 17 2008, 10:02) как... Sep 17 2008, 04:53  prottoss Цитата(zhevak @ Sep 17 2008, 12:53) Я не ... Sep 17 2008, 05:19   Bulat Цитата(prottoss @ Sep 17 2008, 11:19) . В... Sep 18 2008, 07:24    SergeiCh Цитата(Bulat @ Sep 18 2008, 14:24) О како... Sep 18 2008, 07:34     Bulat Цитата(SergeiCh @ Sep 18 2008, 13:34) Вид... Sep 18 2008, 08:10      SergeiCh Цитата(Bulat @ Sep 18 2008, 15:10) А я ду... Sep 18 2008, 08:36      Bulat Цитата(Bulat @ Sep 18 2008, 14:10) А я ду... Sep 18 2008, 08:50       SergeiCh Цитата(Bulat @ Sep 18 2008, 15:50) Поэтом... Sep 18 2008, 09:59      Bulat Цитата(Aurochs @ Sep 23 2008, 13:21) Ну, ... Sep 23 2008, 17:01       Bulat Извиняюсь, что опять поднял тему, но у меня пробле... Sep 24 2008, 17:27        Aurochs Цитата(Bulat @ Sep 24 2008, 20:27) Так во... Sep 24 2008, 21:13
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|