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

 
 
> Не могу произвести запись в драйвер atm6124.sys из BasicUSB, at91sam7s.
Bulat
сообщение Sep 17 2008, 03:46
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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".
Кто-нибудь сталкивался с такой проблемой?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Aurochs
сообщение Sep 19 2008, 23:28
Сообщение #2


Ортодокс
***

Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775



Драйвер at6124 хитро скроен.
Для него нужно открывать 2 устройства - отдельно для чтения и записи. Для получения имени устройства для записи нужно к уже полученному Вами имени дописать "\\PIPE00", а для чтения "\\PIPE01"
Go to the top of the page
 
+Quote Post
Bulat
сообщение Sep 22 2008, 07:51
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Цитата(Aurochs @ Sep 20 2008, 05:28) *
Драйвер at6124 хитро скроен.
Для него нужно открывать 2 устройства - отдельно для чтения и записи. Для получения имени устройства для записи нужно к уже полученному Вами имени дописать "\\PIPE00", а для чтения "\\PIPE01"

После добавления к имени устройства "\\PIPE00" всеравно WriteFile возвращает ошибку, но уже друную: "Неверный дескриптор". Дескрипторы у atm6124 и atm6124ser разные?
Go to the top of the page
 
+Quote Post
Aurochs
сообщение Sep 22 2008, 11:19
Сообщение #4


Ортодокс
***

Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775



Цитата(Bulat @ Sep 22 2008, 10:51) *
После добавления к имени устройства "\\PIPE00" всеравно WriteFile возвращает ошибку, но уже друную: "Неверный дескриптор". Дескрипторы у atm6124 и atm6124ser разные?

Похоже, наши переводчики суют термин "дескриптор" во все места, где нет соответствующего русскоязычного термина smile.gif Поэтому непонятно, о каком дескрипторе речь. Скорее всего имеется в виду хендл открытого или созданного устройства, который возвращает ф-ция CreateFile. Эти хендлы могут быть разные даже от вызова к вызову.
Что тут делать?
1. Попробовать изменить GUID. Для драйвера из пакета AT91-ISP я задаю его так:
DEFINE_GUID( guidAtmel6124, 0xE6EF7DCD, 0x1795, 0x4A08, 0x9F, 0xBF, 0xAA, 0x78, 0x42, 0x3C, 0x26, 0xF0 );
2. Попробовать убрать GENERIC_READ из вызова CreateFile
3. Если первые 2 пункта не помогут, то сообщить код ошибки, который возвращает GetLastError после вызова WriteFile
Go to the top of the page
 
+Quote Post
Bulat
сообщение Sep 23 2008, 02:48
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Цитата(Aurochs @ Sep 22 2008, 17:19) *
Похоже, наши переводчики суют термин "дескриптор" во все места, где нет соответствующего русскоязычного термина smile.gif Поэтому непонятно, о каком дескрипторе речь. Скорее всего имеется в виду хендл открытого или созданного устройства, который возвращает ф-ция CreateFile. Эти хендлы могут быть разные даже от вызова к вызову.
Что тут делать?
1. Попробовать изменить GUID. Для драйвера из пакета AT91-ISP я задаю его так:
DEFINE_GUID( guidAtmel6124, 0xE6EF7DCD, 0x1795, 0x4A08, 0x9F, 0xBF, 0xAA, 0x78, 0x42, 0x3C, 0x26, 0xF0 );
2. Попробовать убрать GENERIC_READ из вызова CreateFile
3. Если первые 2 пункта не помогут, то сообщить код ошибки, который возвращает GetLastError после вызова WriteFile

1. Я этот гуид и использую, только записываю по-другому, у меня 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


Может в этом дело?
Go to the top of the page
 
+Quote Post
Bulat
сообщение Sep 23 2008, 05:15
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 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);


Не подскажете как это правильно сделать?
Go to the top of the page
 
+Quote Post
Aurochs
сообщение Sep 23 2008, 07:21
Сообщение #7


Ортодокс
***

Группа: Свой
Сообщений: 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);


Не подскажете как это правильно сделать?

Ну, дык конечно smile.gif
Нужно так
Код
TCHAR devName[MAX_PATH];
strcpy( devName, DevInfoDetail->DevicePath );
strcat( devName, _T( "\\PIPE00" ) );

А затем для devName вызывать CreateFile
Go to the top of the page
 
+Quote Post
Bulat
сообщение Sep 23 2008, 17:01
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Цитата(Aurochs @ Sep 23 2008, 13:21) *
Ну, дык конечно smile.gif
Нужно так
Код
TCHAR devName[MAX_PATH];
strcpy( devName, DevInfoDetail->DevicePath );
strcat( devName, _T( "\\PIPE00" ) );

А затем для devName вызывать CreateFile

Спасибо! Все получилось)
Go to the top of the page
 
+Quote Post
Bulat
сообщение Sep 24 2008, 17:27
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Извиняюсь, что опять поднял тему, но у меня проблема всплыла непонятная(
Проблема возникает при чтении. С драйвером atm6124ser чтение я осуществлял следующим образом:
Код
AvaibleBytes = 0;
while(AvaibleBytes<32)
{
    AvaibleBytes = comstat.cbInQue;
    Success = ClearCommError(port, &lpErr, &comstat);
}
Success = ReadFile(port, &CommandW, 34, &RealRead, NULL);

Все отлично работало.
Так вот, с драйвером atm6124 ClearCommError(PipeIn, &lpErr, &comstat) возвращает ошибку (Параметр задан неверно). Т.е. имя устройства я исправил, но всеравно ошибка. Я решил отказаться от этой функции и записал просто:
Код
while(!Success)
{
    Success = ReadFile(PipeIn, &CommandW, 34, &RealRead, NULL);
}

В итоге не дожидаясь 34 байт от моего девайса приложение выходит из этого цикла и в буфер CommandW записывается всякая ерунда! Почему такое происходит??? Я конечно поставил перед этим циклом Sleep(10000), чтобы успеть отправить девайсу (не по USB) то, что он потом должен вернуть по USB, но это же не выход...
Go to the top of the page
 
+Quote Post
Aurochs
сообщение Sep 24 2008, 21:13
Сообщение #10


Ортодокс
***

Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775



Цитата(Bulat @ Sep 24 2008, 20:27) *
Так вот, с драйвером atm6124 ClearCommError(PipeIn, &lpErr, &comstat) возвращает ошибку (Параметр задан неверно). Т.е. имя устройства я исправил, но всеравно ошибка.

Вызов ClearCommError драйвер atm6124 не поддерживает вообще.

Цитата(Bulat @ Sep 24 2008, 20:27) *
В итоге не дожидаясь 34 байт от моего девайса приложение выходит из этого цикла и в буфер CommandW записывается всякая ерунда! Почему такое происходит???

Да, есть такие причуды. Драйвер этот вообще, мягко говоря, далек от совершенства...
Нужно анализировать значение, которое возвращается в параметре реально прочитанных байт и, если оно =0, то повторять вызов ReadFile
У меня встречный вопрос по поводу драйвера atm6124ser. Это полноценный драйвер или только надстройка над майкрософтовским usbser.sys? Если Вас не затруднит, то вышлите мне этот драйвер почтой, пользуясь ссылкой на этой странице
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 15:05
Рейтинг@Mail.ru


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