我是靠谱客的博主 潇洒水池,最近开发中收集的这篇文章主要介绍linux usb 无vbus枚举,vbus linux驱动的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在驱动中,中断注册用 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驱动的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部