Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.44.108] |
|
Сообщ.
#1
,
|
|
|
Есть USB прибор, сконфигурированный под USB 1.0. Из программы можно его переконфигурировать под USB 2.0 (загрузить новое firmware).
КАК получить информацию о HOSTе, к которому он подключен в данный момент? Конкретно нужна инфо о возможности может ли HOST работать с USB 2.0. USB 1.0 HOST отказывается понимать USB 2.0 прибор, не дает к нему доспут, поэтому нужно знать возможности HOST заранее, до загрузки нового firmware. Ответы можно на e-mail sikolenko@bsu.by |
Сообщ.
#2
,
|
|
|
Если ты работаешь через DOS или Win9x то можно просто прочитав регистр HOST контроллера и тем самым узнать версию USB.
|
Сообщ.
#3
,
|
|
|
Проблема в том, что нужно работать с USB 2.0 под Win XP или 2000.
Какие могут быть проблемы с этими Виндами? Может есть живой пример? Заранее спасибо. |
Сообщ.
#4
,
|
|
|
Я когдатоть писал функциёвину...вот завалялась
<br>#include <windows.h><br>#pragma warning( disable : 4200 )<br><br>// DDK headers...<br>#include <devioctl.h><br>#include <usbioctl.h><br><br>int GetUSB2Capability( int controller_num = 0)<br>{<br> int iRetCode = -1; // Error opening USB_ROOT_HUB<br> BOOL bRet = FALSE;<br> char controller_name[64];<br> sprintf( controller_name, "\\\\.\\HCD\%d", controller_num);<br> HANDLE controller = CreateFile( controller_name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);<br> if( controller != INVALID_HANDLE_VALUE)<br> {<br> USB_ROOT_HUB_NAME root_name = { 0 };<br> DWORD bytes_returned = 0;<br> DeviceIoControl(controller, IOCTL_USB_GET_ROOT_HUB_NAME, 0, 0, &root_name, sizeof(root_name), &bytes_returned, NULL);<br> if( bytes_returned && root_name.ActualLength)<br> {<br> const int actual_len = root_name.ActualLength;<br> unsigned char* key_raw = new unsigned char[root_name.ActualLength];<br> USB_ROOT_HUB_NAME* root_name_W = reinterpret_cast<USB_ROOT_HUB_NAME*>(key_raw);<br> bRet = DeviceIoControl(controller, IOCTL_USB_GET_ROOT_HUB_NAME, NULL, 0, root_name_W, root_name.ActualLength, &bytes_returned, NULL);<br> //root_name_W - в юникоде (под NT)<br> if( bRet)<br> {<br> char hub_name[MAX_PATH];<br> WideCharToMultiByte( CP_ACP, 0, root_name_W->RootHubName, -1, hub_name, sizeof(hub_name), NULL, NULL);<br> char device_name[MAX_PATH];<br> wsprintf( device_name, "\\\\.\\\%s", hub_name);<br> HANDLE hub_device = CreateFile( device_name, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);<br> if( hub_device != INVALID_HANDLE_VALUE)<br> {<br> USB_HUB_CAPABILITIES cap;<br> bytes_returned = 0;<br> bRet = DeviceIoControl( hub_device, IOCTL_USB_GET_HUB_CAPABILITIES, 0, 0, &cap, sizeof(cap), &bytes_returned, NULL);<br> if( bRet && bytes_returned == sizeof(cap))<br> {<br> iRetCode = cap.HubIs2xCapable ? 1 : 0;<br> }<br> CloseHandle( hub_device);<br> }<br> }<br> delete[] key_raw;<br> }<br> CloseHandle( controller);<br> }<br> return iRetCode;<br>}<br>#pragma warning( default : 4200 )<br><br>int main(int argc, char* argv[])<br>{<br><br> int iRet = GetUSB2Capability( 0);<br> printf( "USB 2.0 capability: \"\%s\"", iRet == -1 ? "Error USB controller request!" : iRet == 0 ? "NO!" : "YES");<br> return 0;<br>}<br> |
Сообщ.
#5
,
|
|
|
AlexSm,
может подскажешь, где объявлены USB_HUB_CAPABILITIES и IOCTL_USB_GET_HUB_CAPABILITIES? Мой NTDDK и MSDN об этом молчит. |
Сообщ.
#6
,
|
|
|
В "usbioctl.h". Если нету исползуй просто:
<br>IOCTL_USB_GET_HUB_CAPABILITIES = 0x0022043C<br><br>typedef struct _USB_HUB_CAPABILITIES {<br> ULONG HubIs2xCapable:1;<br>} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES;<br> |
Сообщ.
#7
,
|
|
|
Я нашел в своем компьютере 4 HUBа.
Ни один из них не отвечает на IOCTL_USB_GET_HUB_CAPABILITIES. Я нашел usbioctl.h, но в ем не объявлен IOCTL_USB_GET_HUB_CAPABILITIES. Возможна ли ошибка? Какой у вас DDK? |
Сообщ.
#8
,
|
|
|
У меня все Это из XP DDK.
Не отвечает на каком шаге выполнения? Какие винды? У меня этот код под XP работает на ура...И если дрова не отвечают на этот запрос - значит и не поддерживают работу с 2.0 |
Сообщ.
#9
,
|
|
|
DDK 2000.
Прибор и программа под USB 2.0 в общем работает. Есть жедание облегчить жизнь пользователю. Запускаю под Win 2000. Функция bRet = DeviceIoControl( hub_device, IOCTL_USB_GET_HUB_CAPABILITIES, 0, 0, &cap, sizeof(cap), &bytes_returned, NULL); возвращает 0. |
Сообщ.
#10
,
|
|
|
Хммм...А что в bytes_returned ? И что возвращает GetLastError() ?
|
Сообщ.
#11
,
|
|
|
bytes_returned = 0
GetLastError() = 5Запустил под XP, нет проблем. ??? |
Сообщ.
#12
,
|
|
|
bytes_returned = 0
GetLastError() = 50. Запустил под XP, нет проблем. |
Сообщ.
#13
,
|
|
|
Дрова не поддерживают данный IOCTL...тут ничего не поделаешь ;)
Счас посмотрю как можно ещё достать инфу под 2000..... |