概述
在驱动中,中断注册用 IRQF_ONESHOT 方式处理中断,在下半部分结束需显示处理中断屏蔽位,对屏蔽的处理还是有系统框架代码为好。建议中断请求改为 request_threaded_irq ,并替代 _ring_wk
diff --git a/rtloader/vbus/linux_driver.c b/rtloader/vbus/linux_driver.c
index a509857..2111dcb 100644
--- a/rtloader/vbus/linux_driver.c
+++ b/rtloader/vbus/linux_driver.c
@@ -999,13 +999,18 @@ static void _vbus_isr_bridge(struct work_struct *work)
static irqreturn_t _vbus_isr2(int irq, void *dev_id)
{
- if (irq != RT_VBUS_GUEST_VIRQ) return IRQ_HANDLED;
+ printk("[VBUS] irq %d raising.
", irq);
+ /*if (irq != RT_VBUS_GUEST_VIRQ) return IRQ_HANDLED;*/
+
+ rt_vmm_clear_emuint(irq);
if (IN_RING->blocked)
wake_up_interruptible_all(&_do_post_wait);
- queue_work(_ring_wkq, &_ring_wk);
- return IRQ_HANDLED;
+/* queue_work(_ring_wkq, &_ring_wk);*/
+
+ return IRQ_WAKE_THREAD;
+ /*return IRQ_HANDLED;*/
}
int driver_load(void __iomem *outr, void __iomem *inr)
@@ -1029,9 +1034,13 @@ int driver_load(void __iomem *outr, void __iomem *inr)
res = 0;
}
#else
- res = request_irq(RT_VBUS_GUEST_VIRQ + _irq_offset,
+/* res = request_irq(RT_VBUS_GUEST_VIRQ + _irq_offset,
_vbus_isr2, IRQF_ONESHOT,
"VMM-BUS", NULL);
+*/
+ res = request_threaded_irq(RT_VBUS_GUEST_VIRQ + _irq_offset,
+ _vbus_isr2, _vbus_isr, IRQF_ONESHOT,
+ "VMM-BUS", NULL);
#endif
if (res) {
pr_err("error request RTT VMM bus irq: %d
", res);
最后
以上就是潇洒水池为你收集整理的linux usb 无vbus枚举,vbus linux驱动的问题的全部内容,希望文章能够帮你解决linux usb 无vbus枚举,vbus linux驱动的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复