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

 
 
> Ресет USB устройства хостом
Паф
сообщение Jun 23 2009, 05:20
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 21-02-08
Из: Тула
Пользователь №: 35 244



Разработано CDC USB устройство с питанием от шины. Пишется PC программа для настройки и апгрейда устройства.
Из PC программы необходимо сделать ресет устройства для перехода в наш бутлодер.
Пробуем DeviceIoControl(), но что-то не выходит. Кто-нибудь делал такую вещь??? Помогите плиз.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Паф
сообщение Jun 24 2009, 07:18
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 21-02-08
Из: Тула
Пользователь №: 35 244



Получилось! smile.gif
Кому интересно: код функции, которая реализует посылку хостом команды Reset устройству.
В качестве параметра в нее передается USB product string descriptor устройства.

/////////////////////////////////////////////////////////////////////////////
#include "SetupApi.h"
#pragma comment(lib, "SetupApi")
bool ResetPortDevice(const char *Name);

// Name - USB product string descriptor

/////////////////////////////////////////////////////////////////////////////
bool ResetPortDevice(const char *Name) {
BOOL bRes;
LPGUID pClassGuidList, piClassGuidList;
DWORD i, j, need_size;
HDEVINFO DeviceInfoSet;
SP_DEVINFO_DATA DeviceInfoData;
SP_PROPCHANGE_PARAMS PropChange;
BYTE *pData;

pData = new BYTE[1+strlen(Name)];
if (!pData) return false;

// Request number of 'Ports' items
need_size = 0;
pClassGuidList = NULL;
SetupDiClassGuidsFromName("Ports", pClassGuidList, need_size, &need_size);
if (!need_size) {
delete [] pData;
return false;
}

// Request all 'Ports' items
piClassGuidList = pClassGuidList = new GUID[need_size];
if (!pClassGuidList) {
delete [] pData;
return false;
}
bRes = SetupDiClassGuidsFromName("Ports", pClassGuidList, need_size, &need_size);
if (!bRes) {
delete [] pData;
delete [] pClassGuidList;
return false;
}

// Loop by all GUIDs
for (i = 0; i < need_size; i++, pClassGuidList++) {

// Get list of devices
DeviceInfoSet = SetupDiGetClassDevs(pClassGuidList, NULL, NULL, DIGCF_PRESENT);
if (DeviceInfoSet == INVALID_HANDLE_VALUE) continue;

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
PropChange.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
PropChange.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
PropChange.StateChange = DICS_PROPCHANGE; // For reset !!!
PropChange.Scope = DICS_FLAG_CONFIGSPECIFIC;
PropChange.HwProfile = 0;

// Loop by all devices by given GUID
for (j = 0; SetupDiEnumDeviceInfo(DeviceInfoSet, j, &DeviceInfoData); j++) {
if (GetLastError() == ERROR_NO_MORE_ITEMS) break;

// Try get extended information
bRes = SetupDiGetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_LOCATION_INFORMATION, NULL, pData, 1+strlen(Name), NULL);
if (!bRes) continue;
if (strstr((const char *)pData, Name) == NULL) continue;

// Apply function for the found device (i.e. Reset)
bRes = SetupDiSetClassInstallParams(DeviceInfoSet, &DeviceInfoData, &PropChange.ClassInstallHeader, sizeof(PropChange));
if (!bRes) break;
bRes = SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, DeviceInfoSet, &DeviceInfoData);
if (!bRes) break;
}

// Clear list of devices
bRes = SetupDiDestroyDeviceInfoList(DeviceInfoSet);

if (!bRes) break;
}

// Clear arrays
delete [] piClassGuidList;
delete [] pData;

if (!bRes) return false;

return true;
}
/////////////////////////////////////////////////////////////////////////////
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jun 24 2009, 08:46
Сообщение #3


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Паф @ Jun 24 2009, 11:18) *
Получилось! smile.gif
Кому интересно: код функции, которая реализует посылку хостом команды Reset устройству.


Ресет USB-устройства и ресет удаленного микропроцессора - вещи совершенно разные! Reset USB-устройства это разрыв логического соединения, а затем его новое соединение с повторным чтением всех дескрипторов и присвоением нового адреса (SET_ADDRESS). Эта процедура происходит на уровне протоколов. Напротив, ресет микроконтроллера означает его физический перезапуск, вследствие чего он имеет возможность запуститься с загрузчика.
Никаким ресетом порта вам не заставить перезапусться микроконтроллер!

Цитата(Паф @ Jun 24 2009, 11:18) *
А если SetCommBreak пошлет не моя программа, а какая-нибудь тулза юзера??


Отвечу вам в тон: а что если тулза юзера сделает то же самое, что делает код вашей функции?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Паф   Ресет USB устройства хостом   Jun 23 2009, 05:20
- - Alex11   Мы делали в системе команд, передаваемых по CDC (в...   Jun 23 2009, 06:45
- - Паф   To Alex11: Девайс работает под 1С по CAS протоколу...   Jun 23 2009, 07:47
- - Xenia   Цитата(Паф @ Jun 23 2009, 09:20) Из PC пр...   Jun 23 2009, 08:06
|- - HARMHARM   Цитата(Xenia @ Jun 23 2009, 11:06) Только...   Jun 28 2009, 05:55
- - Паф   Вот есть интересная ссылочка USB Developers FAQ: h...   Jun 23 2009, 08:21
- - Паф   Может я не совсем точно сформулировал сабж. То что...   Jun 24 2009, 10:43
|- - Седой   Цитата(Паф @ Jun 24 2009, 16:43) Может я ...   Jun 26 2009, 18:37
|- - Паф   Цитата(Седой @ Jun 26 2009, 22:37) Вы сде...   Jun 29 2009, 05:17
|- - Седой   Цитата(Паф @ Jun 29 2009, 11:17) Юзер мож...   Jun 29 2009, 16:07
- - Паф   Спасибо. Это то что нужно.   Jun 30 2009, 05:59
|- - Седой   Цитата(Паф @ Jun 30 2009, 11:59) Спасибо....   Jun 30 2009, 13:21
- - Паф   Мы уже реализовали наш подход. Тестируем на пилотн...   Jun 30 2009, 14:02


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

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 21:16
Рейтинг@Mail.ru


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