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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值