can_interrupt.c

来自「盛博can驱动程序功能很全」· C语言 代码 · 共 69 行

C
69
字号
#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 + =
减小字号Ctrl + -
显示快捷键?