📄 jp1.c
字号:
/* Initialize a new connection to the or1k board, and make sure we are really connected. */static intjtag_init () { int tmp, i; unsigned int npc, ppc, r1, insn, result; current_chain = -1; jp1_reset_JTAG ();#if 0#define MC_BASE_ADD 0x60000000#define MC_CSR_VAL 0x0f300300#define MC_MASK_VAL 0x000000e0#define FLASH_BASE_ADD 0x04000000#define FLASH_TMS_VAL 0x0010a10a#define SDRAM_BASE_ADD 0x00000000#define SDRAM_TMS_VAL 0x07248230 jtag_set_chain (SC_REGISTER); jtag_write_reg (4, 0x00000001); jtag_set_chain (SC_WISHBONE); jtag_write_reg (MC_BASE_ADD + MC_CSC(0), (((FLASH_BASE_ADD & 0xffff0000) >> 5) | 0x25)); jtag_write_reg (MC_BASE_ADD + MC_TMS(0), FLASH_TMS_VAL); jtag_write_reg (MC_BASE_ADD + MC_BA_MASK, MC_MASK_VAL); jtag_write_reg (MC_BASE_ADD + MC_CSR, MC_CSR_VAL); jtag_write_reg (MC_BASE_ADD + MC_TMS(1), SDRAM_TMS_VAL); jtag_write_reg (MC_BASE_ADD + MC_CSC(1), (((SDRAM_BASE_ADD & 0xffff0000) >> 5) | 0x0411)); sleep(1);#endif#if 1#define RAM_BASE 0x00000000 /* Stall risc */ jtag_set_chain (SC_REGISTER); jtag_write_reg (4, 0x00000001); jtag_set_chain (SC_WISHBONE); jtag_write_reg (RAM_BASE + 0x00, 0x9c200000); /* l.addi r1,r0,0x0 */ jtag_write_reg (RAM_BASE + 0x04, 0x18400000 + (RAM_BASE >> 16)); /* l.movhi r2,0x4000 */ jtag_write_reg (RAM_BASE + 0x08, 0xa8420000 + ((RAM_BASE + 0x30) & 0xffff)); /* l.ori r2,r2,0x0000 */ jtag_write_reg (RAM_BASE + 0x0c, 0x9c210001); /* l.addi r1,r1,1 */ jtag_write_reg (RAM_BASE + 0x10, 0x9c210001); /* l.addi r1,r1,1 */ jtag_write_reg (RAM_BASE + 0x14, 0xd4020800); /* l.sw 0(r2),r1 */ jtag_write_reg (RAM_BASE + 0x18, 0x9c210001); /* l.addi r1,r1,1 */ jtag_write_reg (RAM_BASE + 0x1c, 0x84620000); /* l.lwz r3,0(r2) */ jtag_write_reg (RAM_BASE + 0x20, 0x03fffffb); /* l.j loop2 */ jtag_write_reg (RAM_BASE + 0x24, 0xe0211800); /* l.add r1,r1,r3 */ jtag_write_reg (RAM_BASE + 0x24, 0xe0211800); /* l.add r1,r1,r3 */ /* Enable exceptions */ jtag_set_chain (SC_RISC_DEBUG); jtag_write_reg ((0 << 11) + 17, 0x01); /* Trap causes stall */ jtag_set_chain (SC_RISC_DEBUG); jtag_write_reg ((6 << 11) + 20, 0x2000); /* Set PC */ jtag_set_chain (SC_RISC_DEBUG); jtag_write_reg ((0 << 11) + 16, RAM_BASE); /* Set step bit */ jtag_set_chain (SC_RISC_DEBUG); jtag_write_reg ((6 << 11) + 16, 1 << 22); for (i = 0; i < 10; i++) { /* Unstall */ jtag_set_chain (SC_REGISTER); jtag_write_reg (4, 0x00000000); jtag_set_chain (SC_RISC_DEBUG); } /* Read NPC */ jtag_set_chain (SC_RISC_DEBUG); npc = jtag_read_reg ((0 << 11) + 16); npc = jtag_read_reg ((0 << 11) + 16); /* Read PPC */ jtag_set_chain (SC_RISC_DEBUG); ppc = jtag_read_reg ((0 << 11) + 18); ppc = jtag_read_reg ((0 << 11) + 18); /* Read R1 */ jtag_set_chain (SC_RISC_DEBUG); r1 = jtag_read_reg (0x401); r1 = jtag_read_reg (0x401); printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1); printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000000c, 0x40000024, 5); result = npc + ppc + r1; /* Reset step bit */ jtag_set_chain (SC_RISC_DEBUG); jtag_write_reg ((6 << 11) + 16, 0); /* Set trap insn in delay slot */ jtag_set_chain (SC_WISHBONE); insn = jtag_read_reg (RAM_BASE + 0x24); insn = jtag_read_reg (RAM_BASE + 0x24); jtag_write_reg (RAM_BASE + 0x24, 0x21000001); /* Unstall */ jtag_set_chain (SC_REGISTER); jtag_write_reg (4, 0x00000000); jtag_set_chain (SC_RISC_DEBUG); /* Read NPC */ jtag_set_chain (SC_RISC_DEBUG); npc = jtag_read_reg ((0 << 11) + 16); npc = jtag_read_reg ((0 << 11) + 16); /* Read PPC */ jtag_set_chain (SC_RISC_DEBUG); ppc = jtag_read_reg ((0 << 11) + 18); ppc = jtag_read_reg ((0 << 11) + 18); /* Read R1 */ jtag_set_chain (SC_RISC_DEBUG); r1 = jtag_read_reg (0x401); r1 = jtag_read_reg (0x401); /* Set back original insn */ jtag_set_chain (SC_WISHBONE); jtag_write_reg (RAM_BASE + 0x24, insn); printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1); printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000000c, 0x40000024, 8); result = npc + ppc + r1 + result; /* Set trap insn in place of branch insn */ jtag_set_chain (SC_WISHBONE); insn = jtag_read_reg (RAM_BASE + 0x20); insn = jtag_read_reg (RAM_BASE + 0x20); jtag_write_reg (RAM_BASE + 0x20, 0x21000001); /* Set PC */ jtag_set_chain (SC_RISC_DEBUG); jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x0c); /* Unstall */ jtag_set_chain (SC_REGISTER); jtag_write_reg (4, 0x00000000); jtag_set_chain (SC_RISC_DEBUG); /* Read NPC */ jtag_set_chain (SC_RISC_DEBUG); npc = jtag_read_reg ((0 << 11) + 16); npc = jtag_read_reg ((0 << 11) + 16); /* Read PPC */ jtag_set_chain (SC_RISC_DEBUG); ppc = jtag_read_reg ((0 << 11) + 18); ppc = jtag_read_reg ((0 << 11) + 18); /* Read R1 */ jtag_set_chain (SC_RISC_DEBUG); r1 = jtag_read_reg (0x401); r1 = jtag_read_reg (0x401); /* Set back original insn */ jtag_set_chain (SC_WISHBONE); jtag_write_reg (RAM_BASE + 0x20, insn); printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1); printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000024, 0x40000020, 11); result = npc + ppc + r1 + result; /* Set trap insn before branch insn */ jtag_set_chain (SC_WISHBONE); insn = jtag_read_reg (RAM_BASE + 0x1c); insn = jtag_read_reg (RAM_BASE + 0x1c); jtag_write_reg (RAM_BASE + 0x1c, 0x21000001); /* Set PC */ jtag_set_chain (SC_RISC_DEBUG); jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x20); /* Unstall */ jtag_set_chain (SC_REGISTER); jtag_write_reg (4, 0x00000000); jtag_set_chain (SC_RISC_DEBUG); /* Read NPC */ jtag_set_chain (SC_RISC_DEBUG); npc = jtag_read_reg ((0 << 11) + 16); npc = jtag_read_reg ((0 << 11) + 16); /* Read PPC */ jtag_set_chain (SC_RISC_DEBUG); ppc = jtag_read_reg ((0 << 11) + 18); ppc = jtag_read_reg ((0 << 11) + 18); /* Read R1 */ jtag_set_chain (SC_RISC_DEBUG); r1 = jtag_read_reg (0x401); r1 = jtag_read_reg (0x401); /* Set back original insn */ jtag_set_chain (SC_WISHBONE); jtag_write_reg (RAM_BASE + 0x1c, insn); printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1); printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000020, 0x4000001c, 24); result = npc + ppc + r1 + result; /* Set trap insn behind lsu insn */ jtag_set_chain (SC_WISHBONE); insn = jtag_read_reg (RAM_BASE + 0x18); insn = jtag_read_reg (RAM_BASE + 0x18); jtag_write_reg (RAM_BASE + 0x18, 0x21000001); /* Set PC */ jtag_set_chain (SC_RISC_DEBUG); jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x1c); /* Unstall */ jtag_set_chain (SC_REGISTER); jtag_write_reg (4, 0x00000000); jtag_set_chain (SC_RISC_DEBUG); /* Read NPC */ jtag_set_chain (SC_RISC_DEBUG); npc = jtag_read_reg ((0 << 11) + 16); npc = jtag_read_reg ((0 << 11) + 16); /* Read PPC */ jtag_set_chain (SC_RISC_DEBUG); ppc = jtag_read_reg ((0 << 11) + 18); ppc = jtag_read_reg ((0 << 11) + 18); /* Read R1 */ jtag_set_chain (SC_RISC_DEBUG); r1 = jtag_read_reg (0x401); r1 = jtag_read_reg (0x401); /* Set back original insn */ jtag_set_chain (SC_WISHBONE); jtag_write_reg (RAM_BASE + 0x18, insn); printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1); printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000001c, 0x40000018, 49); result = npc + ppc + r1 + result; /* Set trap insn very near previous one */ jtag_set_chain (SC_WISHBONE); insn = jtag_read_reg (RAM_BASE + 0x1c); insn = jtag_read_reg (RAM_BASE + 0x1c); jtag_write_reg (RAM_BASE + 0x1c, 0x21000001); /* Set PC */ jtag_set_chain (SC_RISC_DEBUG); jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x18); /* Unstall */ jtag_set_chain (SC_REGISTER); jtag_write_reg (4, 0x00000000); jtag_set_chain (SC_RISC_DEBUG); /* Read NPC */ jtag_set_chain (SC_RISC_DEBUG); npc = jtag_read_reg ((0 << 11) + 16); npc = jtag_read_reg ((0 << 11) + 16); /* Read PPC */ jtag_set_chain (SC_RISC_DEBUG); ppc = jtag_read_reg ((0 << 11) + 18); ppc = jtag_read_reg ((0 << 11) + 18); /* Read R1 */ jtag_set_chain (SC_RISC_DEBUG); r1 = jtag_read_reg (0x401); r1 = jtag_read_reg (0x401); /* Set back original insn */ jtag_set_chain (SC_WISHBONE); jtag_write_reg (RAM_BASE + 0x1c, insn); printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1); printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000020, 0x4000001c, 50); result = npc + ppc + r1 + result; /* Set trap insn to the start */ jtag_set_chain (SC_WISHBONE); insn = jtag_read_reg (RAM_BASE + 0x0c); insn = jtag_read_reg (RAM_BASE + 0x0c); jtag_write_reg (RAM_BASE + 0x0c, 0x21000001); /* Set PC */ jtag_set_chain (SC_RISC_DEBUG); jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x1c); /* Unstall */ jtag_set_chain (SC_REGISTER); jtag_write_reg (4, 0x00000000); jtag_set_chain (SC_RISC_DEBUG); /* Read NPC */ jtag_set_chain (SC_RISC_DEBUG); npc = jtag_read_reg ((0 << 11) + 16); npc = jtag_read_reg ((0 << 11) + 16); /* Read PPC */ jtag_set_chain (SC_RISC_DEBUG); ppc = jtag_read_reg ((0 << 11) + 18); ppc = jtag_read_reg ((0 << 11) + 18); /* Read R1 */ jtag_set_chain (SC_RISC_DEBUG); r1 = jtag_read_reg (0x401); r1 = jtag_read_reg (0x401); /* Set back original insn */ jtag_set_chain (SC_WISHBONE); jtag_write_reg (RAM_BASE + 0x0c, insn); printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1); printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000010, 0x4000000c, 99); result = npc + ppc + r1 + result; /* Set step bit */ jtag_set_chain (SC_RISC_DEBUG); jtag_write_reg ((6 << 11) + 16, 1 << 22); for (i = 0; i < 5; i++) { /* Unstall */ jtag_set_chain (SC_REGISTER); jtag_write_reg (4, 0x00000000); jtag_set_chain (SC_RISC_DEBUG); } /* Read NPC */ jtag_set_chain (SC_RISC_DEBUG); npc = jtag_read_reg ((0 << 11) + 16); npc = jtag_read_reg ((0 << 11) + 16); /* Read PPC */ jtag_set_chain (SC_RISC_DEBUG); ppc = jtag_read_reg ((0 << 11) + 18); ppc = jtag_read_reg ((0 << 11) + 18); /* Read R1 */ jtag_set_chain (SC_RISC_DEBUG); r1 = jtag_read_reg (0x401); r1 = jtag_read_reg (0x401); printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1); printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000024, 0x40000020, 101); result = npc + ppc + r1 + result; /* Set PC */ jtag_set_chain (SC_RISC_DEBUG); jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x20); for (i = 0; i < 2; i++) { /* Unstall */ jtag_set_chain (SC_REGISTER); jtag_write_reg (4, 0x00000000); jtag_set_chain (SC_RISC_DEBUG); } /* Read NPC */ jtag_set_chain (SC_RISC_DEBUG); npc = jtag_read_reg ((0 << 11) + 16); npc = jtag_read_reg ((0 << 11) + 16); /* Read PPC */ jtag_set_chain (SC_RISC_DEBUG); ppc = jtag_read_reg ((0 << 11) + 18); ppc = jtag_read_reg ((0 << 11) + 18); /* Read R1 */ jtag_set_chain (SC_RISC_DEBUG); r1 = jtag_read_reg (0x401); r1 = jtag_read_reg (0x401); printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1); printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000000c, 0x40000024, 201); result = npc + ppc + r1 + result; printf("result = %.8lx\n", result + 0x5eaddaa9);#endif return err;}main(argc, argv) int argc; char *argv[];{ char *redirstr; int trace_fd = 0; char *s; int c; const char *args; char *port; char *cable; srand(getpid()); if ((argc < 3) || (argv[1][0] == '-') || (argv[2][0] == '-')) { printf("JTAG protocol via parallel port for linux.\n"); printf("Copyright (C) 2001 Marko Mlinar, markom@opencores.org\n\n"); printf("Usage: %s [cable] [JTAG port_number]\n", argv[0]); jp_print_cable_help(); return -1; } cable = argv[1]; port = argv[2]; if (!jp_select_cable(cable)) { fprintf(stderr,"Error selecting cable %s\n", cable); return -1; } /* Get the cable-arguments */ args = jp_get_cable_args(); /* Parse the cable arguments (if-any) */ for(;;) { c = getopt(argc, argv, args); if(c == -1) break; if(c == '?') return 1; if(!jp_cable_opt(c, optarg)) return 1; } if(!jp_init_cable()) return 1; /* Test the connection. */ if (jtag_init()) { fprintf(stderr,"Connection with jtag via %s failed.\n", cable); exit(-1); } /* We have a connection. Establish server. */ printf ("Dropping root privileges.\n"); serverPort = strtol(port,&s,10); if(*s) return -1; if(server_fd = GetServerSocket("or1ksim","tcp", serverPort)) { printf("JTAG Proxy server started on port %d\n", serverPort); printf("Press CTRL+c to exit.\n"); } else { fprintf(stderr,"Cannot start JTAG Proxy server on port %d\n", serverPort); exit(-1); } /* Do endless loop of checking and handle GDB requests. Ctrl-c exits. */ HandleServerSocket(true);}/************************ JTAG Server Routines ************************/static int tcp_level = 0;/* Added by CZ 24/05/01 */int GetServerSocket(const char* name,const char* proto,int port){ struct servent *service; struct protoent *protocol; struct sockaddr_in sa; struct hostent *hp; int sockfd; char myname[256]; int flags; char sTemp[256]; /* First, get the protocol number of TCP */ if(!(protocol = getprotobyname(proto))) { sprintf(sTemp,"Unable to load protocol \"%s\"",proto); perror(sTemp); return 0; } tcp_level = protocol->p_proto; /* Save for later */ /* If we weren't passed a non standard port, get the port from the services directory. */ if(!port) { if(service = getservbyname(name,protocol->p_name)) port = ntohs(service->s_port); } /* Create the socket using the TCP protocol */ if((sockfd = socket(PF_INET,SOCK_STREAM,protocol->p_proto)) < 0) { perror("Unable to create socket"); return 0; } flags = 1; if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(const char*)&flags,sizeof(int)) < 0) { sprintf(sTemp,"Can not set SO_REUSEADDR option on socket %d",sockfd); perror(sTemp); close(sockfd); return 0; } /* The server should also be non blocking. Get the current flags. */ if((flags = fcntl(sockfd,F_GETFL,0)) < 0) { sprintf(sTemp,"Unable to get flags for socket %d",sockfd); perror(sTemp); close(sockfd); return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -