Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Написание драйвера под USB порт
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
BlooDi
Люди помогите пожалуйста у меня проблема вышла....
Мне порекомендовали сделать драйвер USB порта. У меня скоро конференция, а на ней мне надо показать как работает этот драйвер. Мне подсказали что лучше всего работать в C++Builder6.
У меня такая цель сделать драйвер, который будет выполнять такую функцию НАПРИМЕР:
С определенное устройство поступает сигнал на компьютер. В свою очередь компьютер обрабатывает эту информацию и отправляет сигнал на много компьютеров(в виде хаба). И с этих компьютеров почтупает информация если какая-то проблема есть то ПРОИСХОДИТ сигнал что случилась ошибка. И эта программа должна работать постоянна примерно чтобы запрос поступал через каждые 2-5 сек.
Я не знаю как это сделать помогите пожалуйста.... За ранее благодарен! smile.gif
chan
В C++Builder6 стоит писать клиентское ПО, а драйвер лучше собирать в NuMega DrverStudio или Jungo WinDriver. Можно почитать http://lord-n.narod.ru/walla.html#AgurovUSB, правда мутновато, но для начала сойдет.
BlooDi
В C++Builder6 стоит писать клиентское ПО, а драйвер лучше собирать в NuMega DrverStudio или Jungo WinDriver.


А вы знаете как создавать в этих программах подобные вещи??? Ну мне можно не обязательно на USB порт, можно и на COM
chan
А на COM по большому счету драйвер вообще не нужен. Тут нужно определиться с аппаратной частью. Если цель сам драйвер под виндой то стоит для начала почитать Солдатова (Программирование драйверов Windows). Просто драйвер всегда пишется под конкретную железку, если аппаратура стандартная - дрова уже обычно есть.
Proton
Цитата(BlooDi @ Mar 18 2007, 00:01) *
В C++Builder6 стоит писать клиентское ПО, а драйвер лучше собирать в NuMega DrverStudio или Jungo WinDriver.

Только не в DriverStudio, этот проект закрыт вместе с SoftIce. Самое надёжное - это WinDDK.
BlooDi
Цитата(chan @ Mar 17 2007, 00:22) *
В C++Builder6 стоит писать клиентское ПО, а драйвер лучше собирать в NuMega DrverStudio или Jungo WinDriver. Можно почитать http://lord-n.narod.ru/walla.html#AgurovUSB, правда мутновато, но для начала сойдет.


НЕТ! Мне как раз сказали имено в этой программе! Там говорят легче и проще во много раз, чем в других программах
Demeny
Цитата(BlooDi @ Mar 16 2007, 20:27) *
Мне порекомендовали сделать драйвер USB порта.

Хм, а зачем его делать-то? Комплект драйверов для работы с USB-портами есть в Windows. Открываем "Диспетчер устройств", смотрим ... у меня вот они видны
Код
C:\WINDOWS\system32\drivers\usbhub.sys
C:\WINDOWS\system32\drivers\usbport.sys
C:\WINDOWS\system32\drivers\usbuhci.sys
C:\WINDOWS\system32\usbui.dll

Судя по той задаче, что Вы описали ...
Цитата(BlooDi @ Mar 16 2007, 20:27) *
У меня скоро конференция, а на ней мне надо показать как работает этот драйвер. Мне подсказали что лучше всего работать в C++Builder6.
У меня такая цель сделать драйвер, который будет выполнять такую функцию НАПРИМЕР:
С определенное устройство поступает сигнал на компьютер. В свою очередь компьютер обрабатывает эту информацию и отправляет сигнал на много компьютеров(в виде хаба). И с этих компьютеров почтупает информация если какая-то проблема есть то ПРОИСХОДИТ сигнал что случилась ошибка. И эта программа должна работать постоянна примерно чтобы запрос поступал через каждые 2-5 сек.

... Вам нужен и драйвер USB устройства, и пользовательская программа, решающая общую задачу коммуникации нескольких компьютеров и данного устройства. Я надеюсь, Вы соединили несколько компьютеров не через USB-порты ? biggrin.gif
Для создания пользовательского приложения C++Builder6 подойдёт. Для создания драйвера C++Builder6 нужен разве что в качестве текстового редактора, поэтому необходимо найти и установить один из пакетов, которые Вам уже советовали. Я бы порекомендовал WindowsDDK, но в принципе подойдёт и Jungo WinDriver (или KernelDriver, если Ваш драйвер будет работать в режиме ядра), и DriverStudio. Также крайне желательно установить отладчик, например, SoftIce.
Поймите простую вещь - в этих пакетах есть все заголовочные файлы и библиотеки для создания драйверов, и упрямствовать в сторону C++Builder6 просто смешно.
Если Вы раньше никогда не занимались написанием драйверов - выход практически один - взять готовый пример-шаблон драйвера USB-устройства и попытаться его "натянуть" на Ваши задачи.
ishergin
Цитата(Proton @ Mar 18 2007, 11:25) *
Только не в DriverStudio, этот проект закрыт вместе с SoftIce. Самое надёжное - это WinDDK.


Хм... с DriverStudio идут исходники на С++ smile.gif
Как раз использование DriverStudio сдесь имеет смысл, в отличии от Jungo *Driver, т.к. в последнем у меня были проблемы с лицензией. Точно не помню, но, по моему, по истечении некоторого времени драйвер, созданный в нелицензионной Jungo *Driver перестает работать. К томуже исходники библиотек они не раздают вроде. Правда со всем этим я возился 3 года назад, мож ситуация с Jungo изменилась...
Что касается DDK -- то для начинающего это лишние мороки, и использование функций ядра НТ актуально если требуется производительность или еще какие извращения =). Впрочем для DriverStudio все равно потребуется установить DDK.
mospf
Посмотри http://www.education.pcports.ru/AT89.php а также http://www.pcports.ru/Library.php
Наверняка одна из этих ссылок тебе поможет.
BlooDi
Цитата(mospf @ Mar 20 2007, 18:38) *
Посмотри http://www.education.pcports.ru/AT89.php а также http://www.pcports.ru/Library.php
Наверняка одна из этих ссылок тебе поможет.


Спасибо большое! =), только первая ссылка не работает, а вторая подошла!Очень признателен!

Цитата(Demeny @ Mar 20 2007, 09:27) *
Хм, а зачем его делать-то? Комплект драйверов для работы с USB-портами есть в Windows. Открываем "Диспетчер устройств", смотрим ... у меня вот они видны
Код
C:\WINDOWS\system32\drivers\usbhub.sys
C:\WINDOWS\system32\drivers\usbport.sys
C:\WINDOWS\system32\drivers\usbuhci.sys
C:\WINDOWS\system32\usbui.dll

Судя по той задаче, что Вы описали ...


Ну вот примерный драйвер только это для COM porta, а мне его нужно переделать для USB:
Цитата
//---------------------------------------
#include <vcl.h> #pragma hdrstop
#include "Unitl.h"
//
#pragma package(smart_init) #pragma resource "*.dfm"
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <process.h>
#include <stdlib.h> #include <winbase.h>
void a() {
}
TForml *Form1;
COMMTIMEOUTS ct;
DWORD mask;
OVERLAPPED ovr={0};
DWORD bc;
BOOL s;
//------------------------------------------------
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
{
double *sd=new double[12];
char *buf_out=new char[7];
buf_out[0]=0x01;
buf_out[1]=0x55;
buf_out[2]=0x4D;
buf_out[3]=0xFF;
buf_out[4]=0xFF;
buf_out[5]=0x00;
buf_out[6]=0x00;
unsigned char *buf=new unsigned char[50];
DCB *dcb;
HANDLE port=*new HANDLE;
char *buf_in;
FILE *F=new FILE;

//------------------------------------
z=0; dcb=(DCB*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DCB));
dcb->DCBIength=sizeof(DCB);
BuildCommDCB("baud=9600 parity=N data=8 stop=l",dcb);
dcb->fNull=TRUE;
ct. ReadlntervalTimeout=10;
ct.ReadTotarnmeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
ct.WriteTotan"imeoutMultiplier=ct.WriteTotalTimeoutConstant=0;
port=CreateFile("COMl",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISnNG,FILE_FLAG_OVERLAPPE D,NULL);
if(port==INVALID_HANDLE_VALUE) { zz=1;
Timerl-> Enabled=true;
}
s=SetCommState(port,dcb); if(s==0){
Timer1-> Enabled=true;
}
SetCommTimeouts(port,&ct); HeapFree(GetProcessHeap(),0,dcb);
memset(&ovr,0,sizeof(ovr)); ovr.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
WriteFile(port/buf_out,7,&bc,&ovr);
if(WaitForSingleObject(ovr.hEvent,10000)==WAIT_OBJECT_0){ GetOverlappedResult(port,&ovr,&bc,FALSE);
} else {
/* Обработка ошибки */ Timer1l-> Enabled=true;
}
ovr.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
buf_in=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,51);
s=ReadFile(port,buf_in,50,&bc,&ovr); if(WaitForSingleObject(ovr.hEvent, 1000)==WAIT_OBJECT_0) {
GetOverlappedResult(port,&ovr,&bc,FALSE);
} else {
/* Обработка ошибки */
Timer1-> Enabled=true; }


for(i=0;i<50;i++)
{ buf[i]=buf_in[i];
} if((F=fopen('Test.dat","wb"))==NULL)
{
ShowMessage("Файл не удается создать");
}
fwrite(&buf,sizeof(char),50,F);
CloseHandle(port);
CloseHandle(ovr.hEvent);
HeapFree(GetProcessHeap(),0,buf_in);
delete [] buf;
buf=NULL;
delete [] buf_out;
buf_out=NULL;
delete F;
x10=x10+1;
delete [] sd;
buf NULL;
}
//------------------------------------

Посмотрите вдруг что у меня неправильно, так подскажите! biggrin.gif
ishergin
Цитата(BlooDi @ Mar 20 2007, 21:37) *
Спасибо большое! =), только первая ссылка не работает, а вторая подошла!Очень признателен!
Ну вот примерный драйвер только это для COM porta, а мне его нужно переделать для USB:

Посмотрите вдруг что у меня неправильно, так подскажите! biggrin.gif


ЭТО НЕ драйвер COM порта =))
Драйвер ком порта можно найти в DDK, например, X:\WINDDK\2600\src\kernel\serial\

Тот код, что Вы привели - это открытие порта и чтение данных из него biggrin.gif
BlooDi
Цитата
Тот код, что Вы привели - это открытие порта и чтение данных из него biggrin.gif

Ну значит мне надо переделать вот эту писанину.... чтоб открывал не через COM port а USB или довезти COMP port до ума!
Если кто сможет помоч буду очень признателен!
smile.gif
ishergin
Цитата(BlooDi @ Mar 21 2007, 00:48) *
Ну значит мне надо переделать вот эту писанину.... чтоб открывал не через COM port а USB или довезти COMP port до ума!
Если кто сможет помоч буду очень признателен!
smile.gif


брррр =) USB порт это немного не то, что Вы думаете. Я сам особо не разбирался в них, но думаю что нужен будет драйвер... но все зависит от того кем "прикидывается" ваше устройство... если COM портом, то можно делать по аналогии Вашего исходника. Советую сначала вкратце посмотреть описание шины USB, в инете гдето валяется книжка (поищите хотябы на natahaus.ru). И окончательно определиться с ТЗ, в.т.ч. сказать что из себя представляют Ваши устройства.

PS. уже засыпаю, так что, возможно, подробности завтра посоветую.
вообщет Вам скорее всего надо копать примеры исходников usb из DriverStudio или DDK
BlooDi
Цитата
PS. уже засыпаю, так что, возможно, подробности завтра посоветую.
вообщет Вам скорее всего надо копать примеры исходников usb из DriverStudio или DDK

Я же говорю что мне можно и СOM port доделать то... а прибор будит на подобе МЕТРАН-900 только более легче сам тоже сделаю!
=)
ПОМОГИТЕ ПЖАЛУЙСТЯ дописать драйвер ОЧЕНЬ ПРОШУ!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.