⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can_interrupt.c

📁 盛博can驱动程序功能很全
💻 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 + -