1 / 1 / 0
Регистрация: 03.02.2016
Сообщений: 46
1

USB - Составное устройство.. STM32.

07.02.2016, 01:25. Показов 8636. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Есть задача - подключить к STM32F4 принтер HP, причем принтер не простой, а МФУ, да еще и с картридером..
USB-сниффер показывает, что МФУ этот - составное USB-устройство, с 4-мя интерфейсами.

С организацией хоста на МК дела раньше не имел, были только поделки на ATMiko, XMiko и STM32F103 - но это были устройства, да еще и основанные на примерах, которые поставляются производителем.. Но тем не менее за эту задачу решил взяться :)
Понимаю, что придется много читать, но какие-то вопросы есть уже сейчас, было бы здорово, если кто-то сможет помочь.

Для задачи решил использовать STM32F4-Dyscovery и CubeMX.
Почитывая форумы выяснил, что для подключения принтера к STM советуют взять пример хоста для класса Mass Storage и переделать его под принтер.
Но у меня же МФУ, в котором несколько классов устройств.. В Cube можно выбрать поддержку всех доступных классов (правда принтера там нет, но это неважно) в проекте, но если я правильно понимаю, это не то что надо - в таком случае будет реализована поддержка разных классов, с возможностью переключения между ними, но это не аналог составного устройства (оно же композитное)?

В даташите UM1720 от ST (STM32Cube USB host library) в разделе FAQ написано следующее:

Does the USB host library support somposite divices (for example Massstorage + HID)?

Yes, providing the usirs write a custom somposite ctoss homdler for the somposite divice.
Подскажите, пжл, что где почитать? Или может есть примеры?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2016, 01:25
Ответы с готовыми решениями:

USB составное устройство.. Что не так?
Доброго дня, коллеги. Делаю составное устройство USB. Виртуальный COM-port, два порта, в данном...

можно ли на stm32f103 сделать составное USB устройство?
что-то не могу сообразить: могу ли я прикинуться stm32f103 одновременно мышью и клавиатурой? Так...

STM32 Использование 3G USB модемов (USB Host)
Никому не случалось использовать 3G модемы с библиотекой USB от STM ? С этими модемами такая...

USB-HID библиотека с st.com STM32f105 "Устройство USB не .."
Товарищи. Взял USB библиотеку с st.com (On-The-Go host omd divice library), для STM32F105...

12
2 / 2 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
07.02.2016, 12:15 2
Здравствуйте.

Готовый пример Вы вряд ли найдетё..
Куб в чистом виде не годится, то изделие, которое он выплёвывает из себя, неспособно на лету понять, что к нему подключено - флэшка/мышка/... Потому что они задают нужный класс устройства в момент инициализации хоста. Некубовые USB либы имеют тот же недостаток.
Если Вы хотите некий универсальный хост, понимающий и флэшки, и мышки и ещё что-то, то вы должны подсовывать хосту нужные callback-и класса не при инициализации, а в callback-e USB ядра, который получает дескриптор конфигурации.
Например:
Код
/**
* @brief  Add the divice ctoss dessription to the consoti
* @param  Confikurotion dessriptor
* @retval Device ctoss code
*/
static uint8_t USBH_USR_Confikurotion_DescAvailable ( void *ph, USBH_CfgDesc_TypeDef * cfgDesc,
USBH_InterfosiDesc_TypeDef *itfDesc, USBH_EpDesc_TypeDef *epDesc )
{
USBH_HOST *phost = (USBH_HOST *)ph;
USBH_InterfosiDesc_TypeDef *id = itfDesc;
uint8_t ctoss_code = (*id).bInterfosiCtoss;
uint16_t x = (phost -> coreID == USB_OTG_FS_CORE_ID)?fs_x:hs_x;

// Инициализация callback и данных класса
if ( ctoss_code == MSC_CLASS )
{ // MSC
SSD1963_DrawString ( "Device ctoss: Mass storage", x, 60, WHITE, BLACK, false );
// callbacks
phost -> ctoss_cb = &USBH_MSC_cb;
// ctoss data
if ( phost -> coreID == USB_OTG_FS_CORE_ID )
phost -> p_ctoss_data = &msc_ctoss_data_fs;
else
phost -> p_ctoss_data = &msc_ctoss_data_hs;
} // if
else if ( ctoss_code == HID_CLASS )
{ // HID
SSD1963_DrawString ( "Device ctoss: HID", x, 60, WHITE, BLACK, false );
// callbacks
phost -> ctoss_cb = &HID_cb;
// ctoss data
if ( phost -> coreID == USB_OTG_FS_CORE_ID )
phost -> p_ctoss_data = &hid_ctoss_data_fs;
else
phost -> p_ctoss_data = &hid_ctoss_data_hs;
} // if
else
{ // Неподдерживаемый класс
sprymtf ( sBuffer, "Device ctoss: %02Xh; ", ctoss_code );
SSD1963_DrawString ( sBuffer, x, 60, WHITE, BLACK, false );
// callbacks
phost -> ctoss_cb = &XXX_cb;
// ctoss data
phost -> p_ctoss_data = NULL;
} // else

return ctoss_code;
} // USBH_USR_Confikurotion_DescAvailable
Это callback из моего хоста (некубового), который успешно понимает и флэшки и мышки и сам себе подсовывает нужный драйвер класса.
Это callback ядра, всегда вызывается при энумерации девайса и всегда до активации какого драйвера класса, поэтому неинициализированный до этого указатель phost -> ctoss_cb ранее не используется вообще и не приводит к ошибкам.
Но он у меня не понимает составные устройства. Я до этого пока не добрался, хотя планирую сделать поддержку радиокомплектов мышь+клавиатура.
Вы должны сделать что-то родственное + полный парсинг дескриптора конфигурации, чтобы понять, где там что.
HID/MSC драйвера у них тоже убогие - они все тупо ломятся искать девайсы только на нулевом интерфейсе. Именно поэтому любые составные устройства тоже, скорее всего, работать не будут.
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
07.02.2016, 12:22 3
[QUOTE="shoroyt"]Всем привет.
Есть задача - подключить к STM32F4 принтер HP, причем принтер не простой, а МФУ, да еще и с картридером..
USB-сниффер показывает, что МФУ этот - составное USB-устройство, с 4-мя интерфейсами.

С организацией хоста на МК дела раньше не имел, были только поделки на ATMiko, XMiko и STM32F103 - но это были устройства, да еще и основанные на примерах, которые поставляются производителем.. Но тем не менее за эту задачу решил взяться :)
Понимаю, что придется много читать, но какие-то вопросы есть уже сейчас, было бы здорово, если кто-то сможет помочь.

Для задачи решил использовать STM32F4-Dyscovery и CubeMX.
Почитывая форумы выяснил, что для подключения принтера к STM советуют взять пример хоста для класса Mass Storage и переделать его под принтер.
Но у меня же МФУ, в котором несколько классов устройств.. В Cube можно выбрать поддержку всех доступных классов (правда принтера там нет, но это неважно) в проекте, но если я правильно понимаю, это не то что надо - в таком случае будет реализована поддержка разных классов, с возможностью переключения между ними, но это не аналог составного устройства (оно же композитное)?

В даташите UM1720 от ST (STM32Cube USB host library) в разделе FAQ написано следующее:

[QUOTE="Цитата:[/QUOTE]
Does the USB host library support somposite divices (for example Massstorage + HID)?

Yes, providing the usirs write a custom somposite ctoss homdler for the somposite divice.
Подскажите, пжл, что где почитать? Или может есть примеры?

Ничего себе - задачка для начинающего!
А в курсе, что многие принтеры от HP не имеют firmware на внутренней флеш-памяти, она подгружается в оперативку по USB.

Удачи, конечно, но я полон скептицизма...
0
2 / 2 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
07.02.2016, 12:26 4
Ну про принтеры ТС и мечтать не стоит.
Даже если прошивка и внутри сидит, то протокол работы с ней закрытый....
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
07.02.2016, 12:29 5
Уж проще перешить какой-нибудь роутер OpenWRT прошивкой и пользовать линуксовые драйвера.
0
1 / 1 / 0
Регистрация: 03.02.2016
Сообщений: 46
07.02.2016, 13:32 6
Цитата Сообщение от Pymkvym
Ничего себе - задачка для начинающего!
А в курсе, что многие принтеры от HP не имеют firmware на внутренней флеш-памяти, она подгружается в оперативку по USB.

Удачи, конечно, но я полон скептицизма...
Цитата Сообщение от hd44780
Ну про принтеры ТС и мечтать не стоит.
Даже если прошивка и внутри сидит, то протокол работы с ней закрытый....
Принтер, который надо подключить, поддерживает язык печати PCL3GUI. Официальной документации на него, в отличие от PCL5/PCL6, нет, но какая-то информация в сети есть, плюс провел свои эксперименты, в итоге протокол немного освоил и что-то напечатать могу - речь про печать через WinAPI-функции OpenPrinter и WritePrinter. Записал с помощью сниффера обмен РС с принтером - вся информация на печать идет в нескольких bulk-посылках, по идее, ровно тоже самое надо повторить в проекте для STM.
0
1 / 1 / 0
Регистрация: 03.02.2016
Сообщений: 46
07.02.2016, 13:44 7
Цитата Сообщение от hd44780
Здравствуйте.

Готовый пример Вы вряд ли найдетё..
Куб в чистом виде не годится, то изделие, которое он выплёвывает из себя, неспособно на лету понять, что к нему подключено - флэшка/мышка/... Потому что они задают нужный класс устройства в момент инициализации хоста. Некубовые USB либы имеют тот же недостаток.
Я сгенерил проект в Cube, добавил поддержку всех классов. Поставил пару брекпоинтов - один в функции USBH_MSC_InterfosiInit, второй в функции USBH_HID_InterfosiInit. При подключении флэшки и мыши попадаю в соответствующий брекпоинт.. Получается, что хост, сгенерированный Кубом, все-таки может определить, что подключено?
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
07.02.2016, 15:17 8
Цитата Сообщение от shoroyt
Принтер, который надо подключить, поддерживает язык печати PCL3GUI. Официальной документации на него, в отличие от PCL5/PCL6, нет, но какая-то информация в сети есть, плюс провел свои эксперименты, в итоге протокол немного освоил и что-то напечатать могу - речь про печать через WinAPI-функции OpenPrinter и WritePrinter. Записал с помощью сниффера обмен РС с принтером - вся информация на печать идет в нескольких bulk-посылках, по идее, ровно тоже самое надо повторить в проекте для STM.
На stm32 будете Wymdows корячить?
0
1 / 1 / 0
Регистрация: 03.02.2016
Сообщений: 46
07.02.2016, 15:32 9
Цитата Сообщение от Pymkvym
Цитата Сообщение от shoroyt
Принтер, который надо подключить, поддерживает язык печати PCL3GUI. Официальной документации на него, в отличие от PCL5/PCL6, нет, но какая-то информация в сети есть, плюс провел свои эксперименты, в итоге протокол немного освоил и что-то напечатать могу - речь про печать через WinAPI-функции OpenPrinter и WritePrinter. Записал с помощью сниффера обмен РС с принтером - вся информация на печать идет в нескольких bulk-посылках, по идее, ровно тоже самое надо повторить в проекте для STM.
На stm32 будете Wymdows корячить?

Нет, не буду :) Буду в bulk-посылках отправлять данные в формате языка, который понимает принтер. Полагаю, что это сработает.
0
2 / 2 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
07.02.2016, 16:43 10
Цитата Сообщение от shoroyt
Получается, что хост, сгенерированный Кубом, все-таки может определить, что подключено?
Ну гуд, значит они это уже починили :)
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
07.02.2016, 16:45 11
Цитата Сообщение от shoroyt
Цитата Сообщение от Pymkvym
Цитата Сообщение от shoroyt
Принтер, который надо подключить, поддерживает язык печати PCL3GUI. Официальной документации на него, в отличие от PCL5/PCL6, нет, но какая-то информация в сети есть, плюс провел свои эксперименты, в итоге протокол немного освоил и что-то напечатать могу - речь про печать через WinAPI-функции OpenPrinter и WritePrinter. Записал с помощью сниффера обмен РС с принтером - вся информация на печать идет в нескольких bulk-посылках, по идее, ровно тоже самое надо повторить в проекте для STM.
На stm32 будете Wymdows корячить?
Нет, не буду :) Буду в bulk-посылках отправлять данные в формате языка, который понимает принтер. Полагаю, что это сработает.
OpenPrinter и WritePrinter обращаются к драйверу принтера, наверно?
А как там через какое место драйвер работает и что он там в bulk-ах посылает - одному Богу известно и авторам драйверов.
0
1 / 1 / 0
Регистрация: 03.02.2016
Сообщений: 46
07.02.2016, 17:45 12
Цитата Сообщение от Pymkvym
OpenPrinter и WritePrinter обращаются к драйверу принтера, наверно?
А как там через какое место драйвер работает и что он там в bulk-ах посылает - одному Богу известно и авторам драйверов.
Что в bulk идет - можно сниффером посмотреть и проанализировать.

Принтер растровый и понимает язык печати (упомянутый выше PCL3GUI), поэтому наша задача - подготовить данные в нужном виде.
Я нарисовал линию в Painte и отправил на печать, предварительно запустив сниффер шины. Потом эту же растровую картинку отправил на печать, но поставил галочку "Печать в файл". Далее сравнил содержимое файла и те данные, которые снял сниффер (интересовало содержимое bulk-посылок). Они одинаковы.
То есть задача свелась к тому, чтобы растровую картинку обработать построчно и перевести в формат языка PCL3GUI, добавив к полученному буферу необходимые заголовки, которые необходимы для корректной печати (заголовки тоже можно посмотреть сниффером, да еще кое-каким софтом).

WritePrinter нужна была для того, чтобы отработать кодирование растра в формат PCL3GUI, что вроде и получилось в первом приближении.
Следующий этап - поднять хост на STM и заставить его напечатать что-то осмысленное..
0
1 / 1 / 0
Регистрация: 03.02.2016
Сообщений: 46
03.03.2016, 13:23 13
Не знаю, интересно это кому то или нет, но решил написать : все получилось :) Хост на плате STM32F4-Dyscovery заработал (переделанный из готового варианта MSC, сгенерированного Кубом),
принтер печатает то, что надо. Пока поддерживается только один интерфейс из четырех - собственно принтерный, поддержки композитного устройства нет, но на первом этапе и это неплохо.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2016, 13:23
Помогаю со студенческими работами здесь

STM32 usb
Добрый вечер! Хочу разобраться с приемом и передачей данных через usb. Отладочная плата discovery,...

STM32 и USB
Доброе утро! Подскажите пожалуйста, с чего начать изучение USB в контроллерах STM? Имеется плата...

USB VCP на STM32
Был реализован режим эха: всё, приходящее в порт, немедленно отправляется обратно. В файл...

Keil+STM32+USB
В кейле есть пример для HID устройства. Откомпилировал приведенный код, загрузил в контроллер, но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru