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

 
 
> Не могу произвести запись в драйвер 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   Не могу произвести запись в драйвер 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


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

 


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


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