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

📄 s3c2410-can.c

📁 2410 spi 外接2515 can转换 驱动代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

#include <linux/miscdevice.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/spinlock.h>
#include <linux/irq.h>
#include <linux/delay.h>
#include <linux/vmalloc.h>#include <linux/2410.h>#include <linux/spi.h>#include <linux/MCP2515.h>
#include <asm/system.h>#include <asm/uaccess.h>
#include <asm/hardware.h>
#include <asm/arch/cpu_s3c2410.h>


#ifdef CONFIG_PM
#include <linux/pm.h>
#endif

#define CAN_MAJOR 198 
#define DEVICE_NAME	"can"
devfs_handle_t devfs_can;
int opencount=0 , clearcan1=0 , clearcan2=0 , clearcan3=0 , resetcan1=0 , resetcan2=0 , resetcan3=0 ;//, fsid3=0 , fsid4=0;//  ,fs = 0; U8 qflag=0 , dflag=0;// , fsflag = 0;U8 revbuf [200][11];U32 msk;static void can1_irq_isr(int irq, void *dev_id, struct pt_regs *regs){    U8 qbyte ,readbuf[8];    //U32 m , m1;
    int i , flags , clear = 0 , old = 0;    old = rwflag;		//rwflag defined in 2515.h can select flag    rwflag = 1;    printk("can1 ok\n");    clearcan1 = 0;	    resetcan1 = 0;		    local_irq_save (flags);  //关闭所有的中断 并保存当前的状态
    qbyte = MCP2515_Read(CANINTF);	//obtain interrupt source    MCP2515_Write(TEC, 0x00);    MCP2515_Write(REC, 0x00);    MCP2515_Write(EFLG, 0x00);
    MCP2515_WriteBits(CANINTF, 0xfc , 0x00);    EINTPEND = 0x040000;
    ClearPending(0x00040000);
	
    if(qbyte & RX0INT)    {      clear = 1;	//int Can_Read(int n,U32* id, U8 *pdata,  U8*dlc, int* rxRTR, int *isExt)
      Can_Read (0,&id1, readbuf,  &dlc1, &rxRTR1, &isExt1);	//idn:sid<10:0>--eid<17:0>      if (qflag<200)			//qflag?????        {         qflag = qflag+1;         revbuf[qflag][0] = (U8) (id1>>16);	//revbuf[qflag][0]=sid<5:0>--eid<17:16>         revbuf[qflag][1] = (U8) (id1>>8);	//revbuf[qflag][1]=eid<15:8>         revbuf[qflag][2] = (U8) (id1);	//revbuf[qflag][2]=eid<7:0>         for (i=0;i<8;i++)          revbuf[qflag][i+3]=readbuf[i];	//RX data        }      else        {         qflag = 1;         revbuf[qflag][0] = (U8) (id1>>16);         revbuf[qflag][1] = (U8) (id1>>8);         revbuf[qflag][2] = (U8) (id1);         for (i=0;i<8;i++)          revbuf[qflag][i+3]=readbuf[i];        }        printk("can1_1 ok\n");        //CanWrite(id1, readbuf, dlc1, isExt1, rxRTR1);    }
    else     if(qbyte & RX1INT)    {     clear  = 2;
     Can_Read (1,&id2, readbuf,  &dlc2, &rxRTR2, &isExt2);       if (qflag<200)        {         qflag = qflag+1;         revbuf[qflag][0] = (U8) (id2>>16);         revbuf[qflag][1] = (U8) (id2>>8);         revbuf[qflag][2] = (U8) (id2);         for (i=0;i<8;i++)          revbuf[qflag][i+3]=readbuf[i];        }        else        {         qflag = 1;         revbuf[qflag][0] = (U8) (id2>>16);         revbuf[qflag][1] = (U8) (id2>>8);         revbuf[qflag][2] = (U8) (id2);         for (i=0;i<8;i++)          revbuf[qflag][i+3]=readbuf[i];        }        printk("can1_2 ok\n");           //CanWrite(id2, readbuf, dlc2, isExt2, rxRTR2);     }    rwflag = 1;    MCP2515_Write(TEC, 0x00);    MCP2515_Write(REC, 0x00);    MCP2515_Write(EFLG, 0x00);
    //MCP2515_Write(CANINTF,0x00);    MCP2515_WriteBits(CANINTF, 0xfc , 0x00);    if (clear == 1)	//RX0      MCP2515_WriteBits(CANINTF, RX0INT, (U8)(~(RX0INT)));    else     if (clear == 2)	//RX1       MCP2515_WriteBits(CANINTF, RX1INT, (U8)(~(RX1INT)));
    rwflag = old;    local_irq_restore(flags);  //打开中断,并恢复状态}static void can2_irq_isr(int irq, void *dev_id, struct pt_regs *regs){    U8 qbyte ,readbuf[8];    //U32 m , m1;
    int i , flags , clear = 0 ,old = 0;    old = rwflag;    rwflag = 2;    clearcan2 = 0;    resetcan2 = 0;    printk("can2 ok\n");        local_irq_save (flags);  //关闭所有的中断 并保存当前的状态
    qbyte = MCP2515_Read(CANINTF);    MCP2515_Write(TEC, 0x00);    MCP2515_Write(REC, 0x00);    MCP2515_Write(EFLG, 0x00);
    MCP2515_WriteBits(CANINTF, 0xfc , 0x00);
    if(qbyte & RX0INT)    {      clear = 1 ;      //fsid3 = fsid3+1;
      Can_Read (0,&id3, readbuf,  &dlc3, &rxRTR3, &isExt3);      if (qflag<200)        {         qflag = qflag+1;         revbuf[qflag][0] = (U8) (id3>>16);         revbuf[qflag][1] = (U8) (id3>>8);         revbuf[qflag][2] = (U8) (id3);         for (i=0;i<8;i++)          revbuf[qflag][i+3]=readbuf[i];        }      else        {         qflag = 1;         revbuf[qflag][0] = (U8) (id3>>16);         revbuf[qflag][1] = (U8) (id3>>8);         revbuf[qflag][2] = (U8) (id3);         for (i=0;i<8;i++)          revbuf[qflag][i+3]=readbuf[i];        }        printk("can2_1 ok\n");        /*printk("fsid3 = %d \n" , fsid3 );      if (fsid3  <= 10 )        {          rwflag = 1;  //从can1发送数据          CanWrite(id3, readbuf, dlc3, isExt3, rxRTR3);        }      if (fsid3 >= 210)        {          fsid3 = 0;          }*/    }
    else     if(qbyte & RX1INT)    {     clear = 2 ;     //fsid4 = fsid4 +1;
     Can_Read (1,&id4, readbuf,  &dlc4, &rxRTR4, &isExt4);       if (qflag<200)        {         qflag = qflag+1;         revbuf[qflag][0] = (U8) (id4>>16);         revbuf[qflag][1] = (U8) (id4>>8);         revbuf[qflag][2] = (U8) (id4);         for (i=0;i<8;i++)          revbuf[qflag][i+3]=readbuf[i];        }        else        {         qflag = 1;         revbuf[qflag][0] = (U8) (id4>>16);         revbuf[qflag][1] = (U8) (id4>>8);         revbuf[qflag][2] = (U8) (id4);         for (i=0;i<8;i++)          revbuf[qflag][i+3]=readbuf[i];        }        printk("can2_2 ok\n");        /*printk("fsid4 = %d \n" , fsid4 );      if (fsid4 <= 10)        {          rwflag = 1;  //从can1发送数据          CanWrite(id4, readbuf, dlc4, isExt4, rxRTR4);        }      else        if (fsid4 >= 210)          {            fsid4 = 0;           }*/    }    rwflag = 2;    MCP2515_Write(TEC, 0x00);    MCP2515_Write(REC, 0x00);    MCP2515_Write(EFLG, 0x00);
    //MCP2515_Write(CANINTF,0x00);    MCP2515_WriteBits(CANINTF, 0xfc , 0x00);    if (clear == 1)      MCP2515_WriteBits(CANINTF, RX0INT, (U8)(~(RX0INT)));    else     if (clear == 2)       MCP2515_WriteBits(CANINTF, RX1INT, (U8)(~(RX1INT)));
    rwflag = old;    local_irq_restore(flags);  //打开中断,并恢复状态}
static void can3_irq_isr(int irq, void *dev_id, struct pt_regs *regs){    U8 qbyte ,readbuf[8];    //U32 m , m1;
    int i , flags;    rwflag = 3;    clearcan3 = 0;    //resetcan3 = 0;    printk("can3 ok\n");        local_irq_save (flags);  //关闭所有的中断 并保存当前的状态    qbyte = MCP2515_Read(CANINTF);    MCP2515_Write(TEC, 0x00);    MCP2515_Write(REC, 0x00);    MCP2515_Write(EFLG, 0x00);
    MCP2515_WriteBits(CANINTF, 0xfc , 0x00);    EINTPEND = 0x00000800;
    ClearPending(0x00000800);
    if(qbyte & RX0INT)    {
      Can_Read (0,&id1, readbuf,  &dlc1, &rxRTR1, &isExt1);      if (qflag<200)        {         qflag = qflag+1;         revbuf[qflag][0] = (U8) (id1>>16);         revbuf[qflag][1] = (U8) (id1>>8);         revbuf[qflag][2] = (U8) (id1);         for (i=0;i<8;i++)          revbuf[qflag][i+3]=readbuf[i];        }      else        {         qflag = 1;         revbuf[qflag][0] = (U8) (id1>>16);         revbuf[qflag][1] = (U8) (id1>>8);         revbuf[qflag][2] = (U8) (id1);         for (i=0;i<8;i++)          revbuf[qflag][i+3]=readbuf[i];        }       printk("can3_1 ok\n");    }
    else     if(qbyte & RX1INT)    {
     Can_Read (1,&id2, readbuf,  &dlc2, &rxRTR2, &isExt2);       if (qflag<200)        {         qflag = qflag+1;         revbuf[qflag][0] = (U8) (id2>>16);         revbuf[qflag][1] = (U8) (id2>>8);         revbuf[qflag][2] = (U8) (id2);         for (i=0;i<8;i++)          revbuf[qflag][i+3]=readbuf[i];        }        else        {         qflag = 1;         revbuf[qflag][0] = (U8) (id2>>16);         revbuf[qflag][1] = (U8) (id2>>8);         revbuf[qflag][2] = (U8) (id2);         for (i=0;i<8;i++)          revbuf[qflag][i+3]=readbuf[i];        }        printk("can3_2 ok\n");        }    rwflag = 3;    MCP2515_Write(TEC, 0x00);    MCP2515_Write(REC, 0x00);    MCP2515_Write(EFLG, 0x00);
    MCP2515_Write(CANINTF,0x00);
    rwflag = 0;    local_irq_restore(flags);  //打开中断,并恢复状态}static int can_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg){
	
	return 0;
}
static ssize_t can_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{     int i , can1=0, can2=0 , can3=0;     U8 copybuf[13], ReadBackCNT,  inte1 ,inte2 , value=0;      if (qflag>0)                         //qflag>0,代表can总线上接收到数据了     {       if (qflag==dflag)			//dflag???         {          //for (i=0;i<10;i++)            //copybuf[i]= revbuf[dflag][i];          copybuf[0] = revbuf[dflag][0];          copybuf[1] = revbuf[dflag][1];          for (i=0;i<8;i++)            copybuf[i+2]= revbuf[dflag][i+3];          copybuf[10] = qflag;          copybuf[11] = dflag;          copybuf[12] = revbuf[dflag][2];                  copy_to_user(buffer,copybuf,13);         }       else         {                    if (dflag<200)            dflag = dflag+1;          else            dflag = 1;                    //for (i=0;i<10;i++)            //copybuf[i]= revbuf[dflag][i];          copybuf[0] = revbuf[dflag][0];          copybuf[1] = revbuf[dflag][1];          for (i=0;i<8;i++)            copybuf[i+2]= revbuf[dflag][i+3];          copybuf[10] = qflag;          copybuf[11] = dflag;          copybuf[12] = revbuf[dflag][2];          copy_to_user(buffer,copybuf,13);         }      }      //return 0;     clearcan1 = clearcan1 + 1;     clearcan2 = clearcan2 + 1;     //clearcan3 = clearcan3 + 1;          if (clearcan1 >=200)           {         //INTMSK |= 0x00000004;         //fsid3=0 ;         //fsid4=0 ;         rwflag = 1;         resetcan1 = resetcan1 +1;         can1 = MCP2515_Read (EFLG);         printk ("can1 = %d \n" , can1);        if ( resetcan1 >= 4 )          {           INTMSK |= 0x00000004;  //屏蔽2号can

⌨️ 快捷键说明

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