📄 s3c2410-can.c
字号:
#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 + -