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 написано следующее:
0
|
|
07.02.2016, 01:25 | |
Ответы с готовыми решениями:
12
USB составное устройство.. Что не так? можно ли на stm32f103 сделать составное USB устройство? STM32 Использование 3G USB модемов (USB Host) USB-HID библиотека с st.com STM32f105 "Устройство USB не .." |
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 ядра, всегда вызывается при энумерации девайса и всегда до активации какого драйвера класса, поэтому неинициализированный до этого указатель 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] Ничего себе - задачка для начинающего! А в курсе, что многие принтеры от 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 |
![]() ![]()
0
|
1 / 1 / 0
Регистрация: 03.02.2016
Сообщений: 46
|
|
07.02.2016, 13:44 | 7 |
![]()
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
|
|
07.02.2016, 15:17 | 8 |
![]()
0
|
1 / 1 / 0
Регистрация: 03.02.2016
Сообщений: 46
|
|
07.02.2016, 15:32 | 9 |
![]() Нет, не буду :) Буду в bulk-посылках отправлять данные в формате языка, который понимает принтер. Полагаю, что это сработает.
0
|
2 / 2 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
|
|
07.02.2016, 16:43 | 10 |
![]()
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
|
|
07.02.2016, 16:45 | 11 |
![]() OpenPrinter и WritePrinter обращаются к драйверу принтера, наверно? А как там через какое место драйвер работает и что он там в bulk-ах посылает - одному Богу известно и авторам драйверов.
0
|
1 / 1 / 0
Регистрация: 03.02.2016
Сообщений: 46
|
|
07.02.2016, 17:45 | 12 |
![]() Принтер растровый и понимает язык печати (упомянутый выше 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
|
03.03.2016, 13:23 | |
Помогаю со студенческими работами здесь
13
STM32 usb STM32 и USB USB VCP на STM32 Keil+STM32+USB Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |