📄 chksja.c
字号:
/* chksja.c * * a tool for SJA1000 checking. * written by : Chen Zhenyong * w3wind@ustc.edu * 2004/2/12 */#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include "../driver/cangate.h"#include "colors.h"#include "chksja.h"/* * SJA1000寄存器访问 */int write_sja(int fd,unsigned char addr, unsigned char value){ int ret; struct sja_op sja_op_data; if(fd < 0) return -1; sja_op_data.sja_reg_addr = addr; sja_op_data.sja_reg_value = value; ret = ioctl(fd,QSPIIOCS_WRITESJA,&sja_op_data); return ret;}unsigned char read_sja(int fd,unsigned char addr){ int ret; struct sja_op sja_op_data; if(fd < 0) return -1; sja_op_data.sja_reg_addr = addr; ret = ioctl(fd,QSPIIOCS_READSJA,&sja_op_data); return sja_op_data.sja_reg_value;}/* * 初始化及反初始化SJA1000 */#define MAXWAIT 2000int InitializeSJA(int fd){ int i; unsigned char v; //wait until the RR bit is set to '1' for(i=0;i<MAXWAIT;i++){ write_sja(fd,MODE_REG,0x01); if(read_sja(fd,MODE_REG)&0x01) break; } if(i==MAXWAIT){ return -1; } write_sja(fd,BUSTIME0_REG,EPPmode.bustime0); //bustime0,缺省为0xa3 write_sja(fd,BUSTIME1_REG,EPPmode.bustime1); //bustime1,缺省为0xc3 write_sja(fd,OUTCTL_REG,EPPmode.outpctr); //output control write_sja(fd,CLKDIV_REG,EPPmode.clkdiv); //PeliCAN mode,bypass the input comparator write_sja(fd,ACCCODE0_REG,EPPmode.acptcode0); //设置接受地址判断,缺省为ffffffff write_sja(fd,ACCCODE1_REG,EPPmode.acptcode1); write_sja(fd,ACCCODE2_REG,EPPmode.acptcode2); write_sja(fd,ACCCODE3_REG,EPPmode.acptcode3); write_sja(fd,ACCMASK0_REG,EPPmode.acptmask0);//设置接受时不考虑的地址位,缺省为ffffffff write_sja(fd,ACCMASK1_REG,EPPmode.acptmask1); write_sja(fd,ACCMASK2_REG,EPPmode.acptmask2); write_sja(fd,ACCMASK3_REG,EPPmode.acptmask3); write_sja(fd,INTR_EN_REG,EPPmode.intrenreg); //disable interrupt read_sja(fd,INTR_REG); //clear the interrupt register(except receive interrupt bit) write_sja(fd,CMD_REG,0x04); //clear receive buffer. if no other message then clear receive interrupt bit for(i=0;i<MAXWAIT;i++){ write_sja(fd,MODE_REG,0x00); if( ! (read_sja(fd,MODE_REG)&0x01) ) break; } if(i==MAXWAIT) return -1; return 0;}//you cannot init SJA when interrupt is not cleared.//DeInitializeSJA is for this use.//so if you want re-init SJA, must call DeInitializeSJA first.void DeInitializeSJA(int fd){ write_sja(fd,CMD_REG,0x02); //cancel transmit task write_sja(fd,INTR_EN_REG,0x00); //diable all interrupts}/* * 读写SJA1000中的数据帧 */void read_frames(int fd){ unsigned char buf[11 * 20]; do{ int i,k=0; int count; count = read(fd,buf,11*20); if(count == 0){ break; } printf(FRCOLOR("read in %d frames.",YELLOW)"\n",count/11); while(count>0){ for(i=0;i<11;i++,count--,k++){ printf("%2x ",buf[k]); } printf("\n"); } }while(1);}void send_frame(int fd){ unsigned char buf[11]; printf("please input command. format is:\n8 addr 0 ch cmd d0 d1 d2 d3 d4 d5\n"); scanf("%2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x",buf+0,buf+1,buf+2,buf+3,buf+4,buf+5,buf+6,buf+7,buf+8,buf+9,buf+10); write(fd, buf, 11);}void error(char* str){ printf(FRCOLOR("error: %s",RED)"\n",str);}void myshell(int fd){ char ibuf[256]; char *p; char *sep = " ,\t\n"; printf("\n"COLORB("myshell running...""\n""you can type \"help\" to find which commands you can use.",GREEN,WHITE) "\n"); while(1){ printf(COLOR("myshell>",GREEN,YELLOW)); fflush(stdout); //get a line fgets(ibuf,256,stdin); if(ibuf[0] == '\n'){ continue; } //get command p = strtok(ibuf,sep); if(p == NULL){ continue; } //pase command if(strcmp(p,"init") == 0){ if(InitializeSJA(fd) == -1){ error("init sja failure."); } else{ printf(FRCOLOR("init sja succeeded.",GREEN)"\n"); } } else if(strcmp(p,"deinit") == 0){ DeInitializeSJA(fd); } else if(strcmp(p,"read") == 0){ unsigned char addr,val; p = strtok(NULL,sep); if( p == NULL){ error("which register?"); continue; } //now, address stored in p addr = (unsigned char) strtol(p,NULL,10); //now, execute val = read_sja(fd,addr); printf(FRCOLORB("%2x,%2x",PINK)"\n",addr,val); } else if(strcmp(p,"write") == 0){ unsigned char addr,val; p = strtok(NULL,sep); if( p == NULL ){ error("which register?"); continue; } addr = (unsigned char) strtol(p,NULL,10); p = strtok(NULL,sep); if( p == NULL){ error("what's the value?"); continue; } val = (unsigned char) strtol(p,NULL,10); write_sja(fd,addr,val); } else if(strcmp(p,"getfrm") == 0){ read_frames(fd); } else if(strcmp(p,"sendfrm") == 0){ send_frame(fd); } else if(strcmp(p,"exit") == 0){ break; } else if(strcmp(p,"quit") == 0){ break; } else if(strcmp(p,"help") == 0){ printf(COLOR("\ninit\tdeinit\tread\twrite\ngetfrm\tsendfrm\tserial\thelp\nexit\tquit",BLUE,WHITE)"\n"); } else if(strcmp(p,"serial") == 0){ int kkk; for(kkk=0;kkk<1000000;kkk++) read_sja(fd,0x55); } else{ error("opperation not support!"); } }}int main(int argc, char **argv){ int fd; fd = open("/dev/canport",O_RDWR); if(fd < 0){ error("cannot open /dev/canport!"); exit(-1); } myshell(fd); //for safety, call DeInitializeSJA DeInitializeSJA(fd); close(fd); return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -