Полная версия этой страницы:
scmRTOS+usb-device
Добрый день.
Как я обмолвился в соседней теме, хочу создать устройство комбинированного локатора которое взаимодействует с ПК посредством usb.
За основу взял шаблон проекта usb cdc из набора с сайта st. недостающие файлы (usbd_desc.c usbd_desc.h usbd_usr.c ) взял оттуда же, из демонстрации. Функции инициализации не менял.
Но при подключении к ПК в dmesg упоминаний нет. Грешу на то, что конфликтует инициализация, т.к. она от ОС. Подскажите в какую сторону начать отладку?
В отладчике пока не могу посмотреть, st-util не прошивает файл больше 40кб, openocd не работает с eclipse из-за ошибки в тулчейне.
Разъем исправен точно, проверял демонстрационной прошивкой. В проекте есть лишние файлы для host библиотеки, они выключены из сборки в eclipse.
А программа-то работает вообще? Лампочкой, например, мигает?
Что-то я не вижу обработчика прерывания USB (OTG_FS_IRQHandler()).
Добавил обработчик со следующим текстом
Код
void OTG_FS_IRQHandler(void)
{
USBD_OTG_ISR_Handler (&USB_OTG_dev);
}
Шим генерируется, но usb не инициализируется. в dmesg нет упоминания. и в прерывание по usb не уходит.
_Артём_
Nov 5 2012, 16:40
Цитата(Legath @ Nov 5 2012, 18:35)

Добавил обработчик со следующим текстом
Шим генерируется, но usb не инициализируется. в dmesg нет упоминания. и в прерывание по usb не уходит.
А куда уходит?
Флаги прерывания устанавливаются? Или usb совсем не проинициализирован?
На всякий случай напомню, что в cpp-файлах обработчик прерывания должен быть объявлен как
Код
extern "C" void OTG_FS_IRQHandler(void)
{
...
Сравните процедуры инициализации (init_clocks() в sysinit.cpp и SetSysClock() в system_stm32f4xx.c). Убедитесь, что частоты совпадают (что частота USB правильная).
_Артём_
Nov 5 2012, 17:13
Цитата(AHTOXA @ Nov 5 2012, 19:09)

На всякий случай напомню, что в cpp-файлах обработчик прерывания должен быть объявлен как
Код
extern "C" void OTG_FS_IRQHandler(void)
{
...
В STM-ских хидерах С++ не поддержан?
Extern не нужен, обработчик в C файле. Процедуры инициализации почти одинаковые и , насколько вижу, USB не затрагивают.
Не может быть из-за того что USB_OTG_BSP_EnableInterrupt пустая? Прерывание получается не прописано.
А слона то я и не заметил, USB_OTG_BSP_Init не перетащил из примера/
Но чего то все еще не хватает.
Получил заветную строку
usb 3-1: new full speed USB device number 11 using ohci_hcd
Дело было в void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) , ID pin неправильно инициализировал.
Но устройство в /dev не появляется. Буду разбираться дальше.
UPD: выставил гарантированно работающие VID/PID - результата нет.
П.С. заранее прошу прощения за то что превратил тему в блог
Цитата(Legath @ Nov 6 2012, 17:03)

П.С. заранее прошу прощения за то что превратил тему в блог
Ничего-ничего, нам тоже интересно, мы все за вас болеем
Legath
Nov 19 2012, 12:52
Вновь занялся проблемой, раскопал что ядро отвергает устройство с ошибкой 110 (ETIMEDOUT - Connection timed out ). Посему делаю вывод что при подключении что то не отсылается.
upd: что странно, если запускать в отладчике то все работает.
разрешил idle hook с телом __NOP() и девайс определился, вечером буду проверять на работу с данными.
AHTOXA
Nov 19 2012, 14:35
idle hook с телом __NOP() - это даже не шаманство, это чистое плацебо

Я в том смысле, что это абсолютно ничего не меняет в работе оси. Вспоминайте, что ещё поменяли вместе с этим хуком.
Legath
Nov 20 2012, 04:59
так без него то не работает. сам в шоке был когда заметил.
Legath
Nov 21 2012, 11:42
Не пойму почему еще (возможно плохо смотрел мануал), если ставлю sleep с аргументом, то все время нахожусь в первом процессе, и соответственно получаю usb timeout, а если ставлю параметр по умолчанию то выполняется один раз и все время в idle.
Точнее в отладчике все время нахожусь в цикле
Код
do
{
enable_context_switch();
DUMMY_INSTR();
disable_context_switch();
}
Поэтому, вероятно, прерывание USB игнорируется?
AHTOXA
Nov 21 2012, 17:57
Если вызвать sleep с аргументом по умолчанию (0), то процесс уснёт насовсем. Таким образом, похоже, что вы усыпили все процессы

Почему не вызывается прерывание USB - не знаю, напомню лишь, что если вы хотите использовать сервисы оси в прерывании, то вы должны объявить при входе в прерывание объект типа TISRW.
Legath
Nov 22 2012, 07:42
Объект TISRW есть. таймауты ненулевые поставил, для отладки в процессах моргаю диодом. Заметил что при подключении USB ось парализуется, при этом USB-девайс определяется, стоит выдернуть шнур и ось работает.
Нашел, кажется, частичный
ответ на свой вопрос, теперь паралич наступает чуть позже втыкания кабеля.
Legath
Nov 30 2012, 15:26
Передачу запустил, пока правда не понял как. Осталось разобраться с приемом, DataRx почему то не вызывается.
Прикладываю проект с продвижениями.
Нажмите для просмотра прикрепленного файла
Посторонним В...
Jan 17 2013, 19:09
Цитата(AHTOXA @ Nov 19 2012, 15:35)

idle hook с телом __NOP() - это даже не шаманство, это чистое плацебо

Я в том смысле, что это абсолютно ничего не меняет в работе оси. Вспоминайте, что ещё поменяли вместе с этим хуком.
бывало такое в кейле что проект не работал...
и диагноз такой же.... добавил строку - работает... убрал не работает или наоборот...
необходимо было лишь выровнять структуры данных или там код то ли по 2 то ли оп 4
demiurg_spb
Jan 18 2013, 05:47
Может быть дело в отсутствии
барьеров?
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.