LINUX.ORG.RU

usb2serial драйвер

 , ,


0

1

Пытаюсь разобраться с кодом https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/dri... есть pl2303_read_int_callback я так понимаю, эта функция должна вызываться по прерыванию, когда был получен urb от девайса, и просто проверять статус urb-a.

Зачем внутри нее usb_submit_urb(urb, GFP_ATOMIC); usb_submit_urb отправляет urb на девайс? Т.е. мы получили urb от девайса и сразу же его обратно оправляем?

Можете разъяснить, что происходит в этой функции?

В код не вникал, но вангую, что если это обработчик прерывания, то ему нужно подтвердить прерывание (acknowledge) иначе уходишь в бесконечный цикл поскольку прерывание будет всё время срабатывать.

UVV ★★★★★
()
Ответ на: комментарий от UVV

Если обрабатывается прерывание можно просто вернуть IRQ_HANDLED; и ОС узнает, что прерывание обработано, но эта функция не является handler-ом прерывния, но handler как-то ее вызывает и передает urb в качестве аргумента, насколько я понимаю.

mythCreator
() автор топика
Ответ на: комментарий от mythCreator

Если обрабатывается прерывание можно просто вернуть IRQ_HANDLED

Нет, этого недостаточно. Ты должен уведомить CPU/устройство о том, что прерывание обработано. Обычно это делается записью в регистр, известный устройству или каким-либо другим, специфичным для устройства образом.

P.S.: код всё ещё не смотрел =)

UVV ★★★★★
()

Зачем внутри нее usb_submit_urb(urb, GFP_ATOMIC); usb_submit_urb отправляет urb на девайс? Т.е. мы получили urb от девайса и сразу же его обратно оправляем?

А это действительно urb полученный от девайса ? Может это все-таки сгенеренный ответ ?

alx777 ★★
()
Ответ на: комментарий от UVV

Ты должен уведомить CPU/устройство о том, что прерывание обработано. Обычно это делается записью в регистр, известный устройству или каким-либо другим, специфичным для устройства образом.

Где можно про это подробнее прочитать? Я для gpio так прерывания обрабатывал:

irqreturn_t irq_handler(int irq, void *notused) {
	printk("IRQ Handled\n");
	return IRQ_HANDLED;
}
все работало и не зацикливалось.

mythCreator
() автор топика
Ответ на: комментарий от alx777

А это действительно urb полученный от девайса ? Может это все-таки сгенеренный ответ ?

Я точно не знаю откуда этот urb, но в драйвере нигде urb не создаются. Насколько я понимаю urb получен от usb core, а откуда usb core берет urb я не знаю. Я расставил везде pr_debug pl2303_read_int_callback вызывается, когда мы подключили девайс, а больше не используется. При работе (уже после того, как драйвер запущен, minicom подключился к tty, настроил все параметны какие хотел) используются 3 функции ioctl, tiocmget и process_read_urb. Первые 2 запускаются с определенной периодичностью для того, чтобы мониторить состояние tty, а последняя ловит urb и выплевывает его в tty если я что-то передаю(я передаю сам себе с другого терминала). Ни одна из этих трех функций urb не передает, кто забирает данные из tty, формирует urb и передает его на девайс остается загадкой.

mythCreator
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.