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

📄 jp2.c

📁 嵌入式开发板连接程序源码
💻 C
📖 第 1 页 / 共 3 页
字号:
  if (crc_read != crc_generated) {    if (retry_do()) goto try_again;    else return DBG_ERR_CRC;  }  /* we should read expected status value, otherwise retry */  if (status != 0) {    if (retry_do()) goto try_again;    else return status;  }  jp2_write_JTAG(TMS); /* UPDATE_DR */  jp2_write_JTAG(0); /* IDLE */    /* reset retry counter */  retry_ok();  return DBG_ERR_OK;}/* issues a burst read/write */int dbg_go(unsigned char *data, unsigned short len, int read) {  int status, crc_generated, crc_read;  int i;try_again:  dbg_set_chain(dbg_chain);  debug("\n");  debug2("go len = %d\n", len);  jp2_write_JTAG(TMS); /* SELECT_DR SCAN */  jp2_write_JTAG(0); /* CAPTURE_DR */  jp2_write_JTAG(0); /* SHIFT_DR */          /* write data, EXIT1_DR */  crc_w = 0xffffffff;  jp2_write_stream(DI_GO | (0<<DC_SIZE), DC_SIZE + 1, 0);  if (!read) {    /* reverse byte ordering, since we must send in big endian */    for (i = 0; i < len; i++)      jp2_write_stream(data[i], 8, 0);  }  jp2_write_stream(crc_w, DBG_CRC_SIZE, 0);  crc_r = 0xffffffff;  if (read) {    /* reverse byte ordering, since we must send in big endian */    for (i = 0; i < len; i++)      data[i] = jp2_read_stream(data[i], 8, 0);  }  status = jp2_read_stream(0, DC_STATUS_SIZE, 0);  crc_generated = crc_r;  crc_read = jp2_read_stream(0, DBG_CRC_SIZE, 1);    /* CRCs must match, otherwise retry */  //printf("%x %x %x\n", status, crc_read, crc_generated);  if (crc_read != crc_generated) {    if (retry_do()) goto try_again;    else return DBG_ERR_CRC;  }  /* we should read expected status value, otherwise retry */  if (status != 0) {    if (retry_do()) goto try_again;    else return status;  }  jp2_write_JTAG(TMS); /* UPDATE_DR */  jp2_write_JTAG(0); /* IDLE */    /* reset retry counter */  retry_ok();  return DBG_ERR_OK;}/* read a word from wishbone */int dbg_wb_read32(unsigned long adr, unsigned long *data) {  int err;  if ((err = dbg_set_chain(DC_WISHBONE))) return err;  if ((err = dbg_command(0x6, adr, 4))) return err;  if ((err = dbg_go((unsigned char*)data, 4, 1))) return err;  *data = ntohl(*data);  return err;}/* write a word to wishbone */int dbg_wb_write32(unsigned long adr, unsigned long data) {  int err;  data = ntohl(data);  if ((err = dbg_set_chain(DC_WISHBONE))) return err;  if ((err = dbg_command(0x2, adr, 4))) return err;  if ((err = dbg_go((unsigned char*)&data, 4, 0))) return err;  return DBG_ERR_OK;}/* write a word to wishbone */int dbg_wb_write16(unsigned long adr, unsigned short data) {  int err;  data = ntohs(data);  if ((err = dbg_set_chain(DC_WISHBONE))) return err;  if ((err = dbg_command(0x1, adr, 2))) return err;  if ((err = dbg_go((unsigned char*)&data, 2, 0))) return err;  return DBG_ERR_OK;}/* write a word to wishbone */int dbg_wb_write8(unsigned long adr, unsigned long data) {  int err;  if ((err = dbg_set_chain(DC_WISHBONE))) return err;  if ((err = dbg_command(0x0, adr, 1))) return err;  if ((err = dbg_go((unsigned char*)&data, 1, 0))) return err;  return DBG_ERR_OK;}/* read a block from wishbone */int dbg_wb_read_block32(unsigned long adr, unsigned long *data, int len) {  int i, err;  //printf("%08x %08x\n", adr, len);  if ((err = dbg_set_chain(DC_WISHBONE))) return err;  if ((err = dbg_command(0x6, adr, len))) return err;  if ((err = dbg_go((unsigned char*)data, len, 1))) return err;  for (i = 0; i < len / 4; i ++) data[i] = ntohl(data[i]);  //printf("%08x\n", err);  return DBG_ERR_OK;}/* read a block from wishbone */int dbg_wb_read_block16(unsigned long adr, unsigned short *data, int len) {  int i, err;  //printf("%08x %08x\n", adr, len);  if ((err = dbg_set_chain(DC_WISHBONE))) return err;  if ((err = dbg_command(0x5, adr, len))) return err;  if ((err = dbg_go((unsigned char*)data, len, 1))) return err;  for (i = 0; i < len / 2; i ++) data[i] = ntohs(data[i]);  //printf("%08x\n", err);  return DBG_ERR_OK;}/* read a block from wishbone */int dbg_wb_read_block8(unsigned long adr, unsigned char *data, int len) {  int i, err;  //printf("%08x %08x\n", adr, len);  if ((err = dbg_set_chain(DC_WISHBONE))) return err;  if ((err = dbg_command(0x4, adr, len))) return err;  if ((err = dbg_go((unsigned char*)data, len, 1))) return err;  //printf("%08x\n", err);  return DBG_ERR_OK;}/* write a block to wishbone */int dbg_wb_write_block32(unsigned long adr, unsigned long *data, int len) {  int i, err;  for (i = 0; i < len / 4; i ++) data[i] = ntohl(data[i]);  if ((err = dbg_set_chain(DC_WISHBONE))) return err;  if ((err = dbg_command(0x2, adr, len))) return err;  if ((err = dbg_go((unsigned char*)data, len, 0))) return err;  return DBG_ERR_OK;}/* write a block to wishbone */int dbg_wb_write_block16(unsigned long adr, unsigned short *data, int len) {  int i, err;  for (i = 0; i < len / 2; i ++) data[i] = ntohs(data[i]);  if ((err = dbg_set_chain(DC_WISHBONE))) return err;  if ((err = dbg_command(0x1, adr, len))) return err;  if ((err = dbg_go((unsigned char*)data, len, 0))) return err;  return DBG_ERR_OK;}/* write a block to wishbone */int dbg_wb_write_block8(unsigned long adr, unsigned char *data, int len) {  int i, err;  if ((err = dbg_set_chain(DC_WISHBONE))) return err;  if ((err = dbg_command(0x0, adr, len))) return err;  if ((err = dbg_go((unsigned char*)data, len, 0))) return err;  return DBG_ERR_OK;}/* read a register from cpu */int dbg_cpu0_read(unsigned long adr, unsigned long *data) {  int err;  if ((err = dbg_set_chain(DC_CPU0))) return err;  if ((err = dbg_command(0x6, adr, 4))) return err;  if ((err = dbg_go((unsigned char*)data, 4, 1))) return err;  *data = ntohl(*data);  return DBG_ERR_OK;}/* write a cpu register */int dbg_cpu0_write(unsigned long adr, unsigned long data) {  int err;  data = ntohl(data);  if ((err = dbg_set_chain(DC_CPU0))) return err;  if ((err = dbg_command(0x2, adr, 4))) return err;  if ((err = dbg_go((unsigned char*)&data, 4, 0))) return err;  return DBG_ERR_OK;}/* read a register from cpu */int dbg_cpu1_read(unsigned long adr, unsigned long *data) {  int err;  if ((err = dbg_set_chain(DC_CPU1))) return err;  if ((err = dbg_command(0x6, adr, 4))) return err;  if ((err = dbg_go((unsigned char*)data, 4, 1))) return err;  *data = ntohl(*data);  return DBG_ERR_OK;}/* write a cpu register */int dbg_cpu1_write(unsigned long adr, unsigned long data) {  int err;  data = ntohl(data);  if ((err = dbg_set_chain(DC_CPU1))) return err;  if ((err = dbg_command(0x2, adr, 4))) return err;  if ((err = dbg_go((unsigned char*)&data, 4, 0))) return err;  return DBG_ERR_OK;}/* write a cpu module register */int dbg_cpu1_write_reg(unsigned long adr, unsigned char data) {  int err;  if ((err = dbg_set_chain(DC_CPU1))) return err;  if ((err = dbg_ctrl(data & 2, data &1))) return err;  return DBG_ERR_OK;}/* read a register from cpu module */int dbg_cpu1_read_ctrl(unsigned long adr, unsigned char *data) {  int err;  int r, s;  if ((err = dbg_set_chain(DC_CPU1))) return err;  if ((err = dbg_ctrl_read(&r, &s))) return err;  *data = (r << 1) | s;  return DBG_ERR_OK;}/* write a cpu module register */int dbg_cpu0_write_ctrl(unsigned long adr, unsigned char data) {  int err;  if ((err = dbg_set_chain(DC_CPU0))) return err;  if ((err = dbg_ctrl(data & 2, data &1))) return err;  return DBG_ERR_OK;}/* read a register from cpu module */int dbg_cpu0_read_ctrl(unsigned long adr, unsigned char *data) {  int err;  int r, s;  if ((err = dbg_set_chain(DC_CPU0))) return err;  if ((err = dbg_ctrl_read(&r, &s))) return err;  *data = (r << 1) | s;  return DBG_ERR_OK;}void check(char *fn, int l, int i) {  if (i != DBG_ERR_OK) {    fprintf(stderr, "%s:%d: Jtag error %d occured; exiting.\n", fn, l, i);    exit(1);  }}void test_sdram (void) {  unsigned long insn;  unsigned long i;  unsigned long data4_out[0x08];  unsigned long data4_in[0x08];  unsigned short data2_out[0x10];  unsigned short data2_in[0x10];  unsigned char data1_out[0x20];  unsigned char data1_in[0x20];            printf("Start SDRAM WR\n");  for (i=0x10; i<(SDRAM_SIZE+SDRAM_BASE); i=i<<1) {    //printf("0x%x: 0x%x\n", SDRAM_BASE+i, i);    CHECK(dbg_wb_write32(SDRAM_BASE+i, i));  }    printf("Start SDRAM RD\n");  for (i=0x10; i<(SDRAM_SIZE+SDRAM_BASE); i=i<<1) {    CHECK(dbg_wb_read32(SDRAM_BASE+i, &insn));    //printf("0x%x: 0x%x\n", SDRAM_BASE+i, insn);    if (i != insn) {      printf("SDRAM not OK");      exit (1);    }  }  printf("32-bit block write from %x to %x\n", SDRAM_BASE, SDRAM_BASE + 0x20);  for (i=0; i<(0x20/4); i++) {    data4_out[i] = data4_in[i] = ((4*i+3)<<24) | ((4*i+2)<<16) | ((4*i+1)<<8) | (4*i);    //printf("data_out = %0x\n", data4_out[i]);  }      //printf("Press a key for write\n"); getchar();  CHECK(dbg_wb_write_block32(SDRAM_BASE, &data4_out[0], 0x20));  // 32-bit block read is used for checking  printf("32-bit block read from %x to %x\n", SDRAM_BASE, SDRAM_BASE + 0x20);  CHECK(dbg_wb_read_block32(SDRAM_BASE, &data4_out[0], 0x20));  for (i=0; i<(0x20/4); i++) {    //printf("0x%x: 0x%x\n", SDRAM_BASE+(i*4), data_out[i]);    if (data4_in[i] != data4_out[i]) {      printf("SDRAM data differs. Expected: 0x%0x, read: 0x%0x\n", data4_in[i], data4_out[i]);      exit(1);    }  }  printf("16-bit block write from %x to %x\n", SDRAM_BASE, SDRAM_BASE + 0x20);  for (i=0; i<(0x20/2); i++) {    data2_out[i] = data2_in[i] = ((4*i+1)<<8) | (4*i);    //printf("data_out = %0x\n", data_out[i]);  }  CHECK(dbg_wb_write_block16(SDRAM_BASE, &data2_out[0], 0x20));  // 16-bit block read is used for checking  printf("16-bit block read from %x to %x\n", SDRAM_BASE, SDRAM_BASE + 0x20);  CHECK(dbg_wb_read_block16(SDRAM_BASE, &data2_out[0], 0x20));  for (i=0; i<(0x20/2); i++) {    //printf("0x%x: 0x%x\n", SDRAM_BASE+(i*4), data_out[i]);    if (data2_in[i] != data2_out[i]) {      printf("SDRAM data differs. Expected: 0x%0x, read: 0x%0x\n", data2_in[i], data2_out[i]);      exit(1);    }  }  printf("8-bit block write from %x to %x\n", SDRAM_BASE, SDRAM_BASE + 0x20);  for (i=0; i<(0x20/1); i++) {    data1_out[i] = data1_in[i] = (4*i);    //printf("data_out = %0x\n", data_out[i]);  }  CHECK(dbg_wb_write_block8(SDRAM_BASE, &data1_out[0], 0x20));  // 32-bit block read is used for checking  printf("8-bit block read from %x to %x\n", SDRAM_BASE, SDRAM_BASE + 0x20);  CHECK(dbg_wb_read_block8(SDRAM_BASE, &data1_out[0], 0x20));  for (i=0; i<(0x20/1); i++) {    //printf("0x%x: 0x%x\n", SDRAM_BASE+(i*4), data_out[i]);    if (data1_in[i] != data1_out[i]) {      printf("SDRAM data differs. Expected: 0x%0x, read: 0x%0x\n", data1_in[i], data1_out[i]);      exit(1);    }  }}void dbg_test() {  int i;  unsigned long npc, ppc, r1, insn, result;  unsigned char stalled;#if 1#define MC_BASE_ADDR     0x93000000#define FLASH_BASE_ADDR  0xf0000000#define FLASH_BAR_VAL    FLASH_BASE_ADDR#define FLASH_AMR_VAL    0xf0000000#define FLASH_WTR_VAL    0x00011009#define FLASH_RTR_VAL    0x01002009#define SDRAM_BASE_ADDR  0x00000000#define SDRAM_BAR_VAL    SDRAM_BASE_ADDR//#define SDRAM_SIZE       0x04000000  defined at the start of this program#define SDRAM_AMR_VAL    (~(SDRAM_SIZE -1))#define SDRAM_RATR_VAL   0x00000006#define SDRAM_RCDR_VAL   0x00000002#define SDRAM_RCTR_VAL   0x00000006#define SDRAM_REFCTR_VAL 0x00000006#define SDRAM_PTR_VAL    0x00000001#define SDRAM_RRDR_VAL   0x00000000#define SDRAM_RIR_VAL    0x000000C0#define MC_BAR_0         0x00#define MC_AMR_0         0x04#define MC_WTR_0         0x30#define MC_RTR_0         0x34#define MC_OSR           0xe8#define MC_BAR_1         0x08#define MC_BAR_4         0x80#define MC_AMR_1         0x0c#define MC_AMR_4         0x84#define MC_CCR_1         0x24#define MC_CCR_4         0xa0#define MC_RATR          0xb0#define MC_RCDR          0xc8#define MC_RCTR          0xb4#define MC_REFCTR        0xc4#define MC_PTR           0xbc#define MC_RRDR          0xb8#define MC_RIR           0xcc#define MC_ORR           0xe4          //usleep(1000000);  printf("Stall 8051\n");  CHECK(dbg_cpu1_write_reg(0, 0x01)); // stall 8051  printf("Stall or1k\n");  CHECK(dbg_cpu0_write_ctrl(0, 0x01));      // stall or1k  CHECK(dbg_cpu1_read_ctrl(0, &stalled));  if (!(stalled & 0x1)) {    printf("8051 should be stalled\n");   // check stall 8051    exit(1);  }  CHECK(dbg_cpu0_read_ctrl(0, &stalled));  if (!(stalled & 0x1)) {    printf("or1k should be stalled\n");   // check stall or1k    exit(1);  }  printf("Initialize Memory Controller\n");  CHECK(dbg_wb_write32(MC_BASE_ADDR + MC_BAR_0, FLASH_BAR_VAL & 0xffff0000));  CHECK(dbg_wb_write32(MC_BASE_ADDR + MC_AMR_0, FLASH_AMR_VAL & 0xffff0000));  CHECK(dbg_wb_write32(MC_BASE_ADDR + MC_WTR_0, FLASH_WTR_VAL));  CHECK(dbg_wb_write32(MC_BASE_ADDR + MC_RTR_0, FLASH_RTR_VAL));  CHECK(dbg_wb_write32(MC_BASE_ADDR + MC_OSR, 0x40000000));  CHECK(dbg_wb_write32(MC_BASE_ADDR + MC_BAR_4, SDRAM_BAR_VAL & 0xffff0000));  CHECK(dbg_wb_write32(MC_BASE_ADDR + MC_AMR_4, SDRAM_AMR_VAL & 0xffff0000));  CHECK(dbg_wb_write32(MC_BASE_ADDR + MC_CCR_4, 0x00bf0005));  CHECK(dbg_wb_write32(MC_BASE_ADDR + MC_RATR, SDRAM_RATR_VAL));

⌨️ 快捷键说明

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