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

📄 can_gener.c

📁 盛博can驱动程序功能很全
💻 C
字号:

#include "can_hardvalue.h"

extern int read_tx_counter0(int);
extern int read_tx_counter1(int);
extern int read_rx_counter1(int);
extern int read_rx_counter0(int);


int change_frame_format(struct CAN_frame *message,int io)
{
	 int mess_len,frame_type;
	  u8 *ptr;
	   int i;
	    frame_type=message->ff & 0xc0;
	     switch (frame_type) {
	             case 0x40:
		     case 0xc0:
	                       break;
                     case 0x80:
	                    ptr=&message->id3;
	                    mess_len=message->ff&0x0f;
		        if ((mess_len<1)||(mess_len>8)) {
			        printk("error mess len %d \n",mess_len);
		                       return -EFRAME;
										             }
	                   break;

        case 0x00:
             ptr=&message->id3;
             mess_len=message->ff&0x0f;
             if ((mess_len>8)||(mess_len<1)) {
	                 printk("type 0x00 mess len %d \n",mess_len);
	                     return -EFRAME;
	                 }

             if (io==BUFTOHARD)
	                for (i=0;i<mess_len;i++,ptr++)
		                      *ptr=message->data[i];
             else if (io==HARDTOBUF) {
	                ptr=ptr+mess_len;
		       for (i=0;i<mess_len;i++,ptr--)
		              *(ptr+1)=*(ptr-1);
             }

             break;
	     
        default:
             printk("error message type\n");
             return -EFRAME;
     }

 return 0;
}



int modify_irq(int irq,struct CAN_device_struct *dev)
{
	int result;

	if (irq==dev->int_level)  {
		   printk("current IRQ is that you will set \n");
		      return -1;
	}

	if (dev->ref_count>1) {
		  printk("device is busy, current IRQ=%d,don't modify IRQ\n",dev->int_level);
		    return -1;
	}
	//81
	free_irq(irq,dev);
	
	result=request_irq(irq,CAN_interrupt,
	                   SA_INTERRUPT|SA_SHIRQ,dev->dev_name,dev);
	                   if (result)  {
	                    printk("request_irq failed\n");
	                     result=request_irq(dev->int_level,CAN_interrupt,
	                         SA_SHIRQ|SA_INTERRUPT,dev->dev_name,dev);
	                   if (result)  printk("CAN  halt ,please insmod can.o again\n");
	                             return result;
			   }
			   else {
	  printk("request_irq succeed,irq=%d\n",irq);
  dev->int_level=irq;
			   }
			 return 0;

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -