📄 can_interrupt.c
字号:
#include "can_hardware.h"
void recv_bottom_half(void *device)
{
struct CAN_device_struct *dev=device;
int int_status=0;
do {
if (int_status)
reset_base_addr(dev->base_addr);
#ifdef LINUX_22
if (dev->recv_queue) //This type no more needed above 2.4.x
#endif
wake_up_interruptible(&dev->recv_queue);
if (dev->async_queue)
#ifdef LINUX_22
kill_fasync(dev->async_queue,SIGIO,POLL_IN);
#else
kill_fasync(&dev->async_queue,SIGIO,POLL_IN);
#endif
int_status=get_interrupt_type(dev->base_addr);
} while (int_status==0xb1);
}
void CAN_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
struct CAN_device_struct *dev=dev_id;
int int_type;
int i;
int_type=get_interrupt_type(dev->base_addr);
if (!int_type) return;
for (i=0;i<CAN_DEV_NUM;i++)
if ((dev->major==CAN_device[i]->major)&&(dev->minor==CAN_device[i]->minor) &&(dev->int_level==irq))
break;
if (i==CAN_DEV_NUM) {
printk("other shared interrupt occured\n");
return;
}
switch (int_type) {
case 0xb1:
reset_base_addr(dev->base_addr);
//writeb(0,dev->base_addr+1);
rx_message(dev);
queue_task(dev->recv_bottom_task,&tq_immediate);
mark_bh(IMMEDIATE_BH);
break;
case 0xb2:
dev->status=read_status(dev->base_addr);
reset_base_addr(dev->base_addr);
//writeb(0,dev->base_addr+1);
break;
case 0xb3:
reset_base_addr(dev->base_addr);
//writeb(0,dev->base_addr+1);
break;
case 0xb4:
dev->status|=0x8000;
reset_base_addr(dev->base_addr);
//writeb(0,dev->base_addr+1);
case 0xb5:
dev->status|=0x0080;
default :
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -