#include #include #include #include #include #include #include #include "bdm.h" #include "bdmlib.h" char* TestSW(int argc,char *argv[],char swch); #define swap_l(x) (x>>24) | ((x>>8)&0xff00) | ((x<<8)&0xff0000) | ((x&0xff)<<24) /* for BDMLIB to work */ char hashmark; int bdm_autoreset; int bdm_ttcu; int bdm_step_chip() { int ret; u_int32_t rpc; if (!bdmlib_isopen()) return BDM_ERR_NOT_OPEN; if (!(bdmlib_getstatus()&BDM_TARGETSTOPPED)) if((ret=bdmlib_ioctl(BDM_STOP_CHIP)<0)) {return ret;}; if((ret=bdmlib_get_sys_reg(BDM_REG_RPC, &rpc))<0) return ret; printf("RPC=%x\n",swap_l(rpc)); ret=bdmlib_ioctl(BDM_STEP_CHIP); if((ret=bdmlib_get_sys_reg(BDM_REG_RPC, &rpc))<0) return ret; printf("RPC=%x\n",swap_l(rpc)); return ret; } int bdm_show_regs(void) { u_int reg; if (!bdmlib_isopen()) return BDM_ERR_NOT_OPEN; bdmlib_get_reg(BDM_REG_D0, ®); return 0; }; int rd_test(void) { u_int16_t val; caddr_t adr=(caddr_t)0xFFAA; int counter=0; if (!bdmlib_isopen()) return BDM_ERR_NOT_OPEN; while(1){ if(bdmlib_read_var(adr,BDM_SIZE_WORD,&val)<0) goto mem_op_error; //usleep(1); if(counter++>=10000){ printf("."); fflush(stdout); counter=0; } } return 0; mem_op_error: printf("Memory read error\n"); return -1; }; int wr_test(void) { u_int16_t val=0xAAAA; caddr_t adr=(caddr_t)0xFFAA; int counter=0; if (!bdmlib_isopen()) return BDM_ERR_NOT_OPEN; while(1){ if(bdmlib_write_var(adr,BDM_SIZE_WORD,val)<0) goto mem_op_error; //usleep(1); if(counter++>=10000){ printf("."); fflush(stdout); counter=0; } } return 0; mem_op_error: printf("Memory write error\n"); return -1; }; int step_test(void) { int counter=0; if (!bdmlib_isopen()) return BDM_ERR_NOT_OPEN; while(1){ if(bdmlib_ioctl(BDM_STEP_CHIP)<0) goto step_op_error; usleep(1); if(counter++>=10000){ printf("."); fflush(stdout); counter=0; } } return 0; step_op_error: printf("Stepping error\n"); return -1; }; int main(int argc, char *argv[]) { int quit_fl=0; int ret; char c; char *p; char file_name[100]=""; char bdm_dev_name[100]="/dev/bdm"; unsigned long entry_pt=0; bdmlib_setdebug(1); if((p=TestSW(argc,argv,'D'))!=NULL) strncpy(bdm_dev_name,p,sizeof(bdm_dev_name)); if((ret=bdmlib_open(bdm_dev_name))<0) { printf("bdmlib_open : %s\n",bdmlib_geterror_str(ret)); return 1; }; bdmlib_setioctl(BDM_SPEED,0); if((p=TestSW(argc,argv,'F'))!=NULL) { strncpy(file_name,p,sizeof(file_name)); bdmlib_setioctl(BDM_SPEED,100); bdmlib_reset(); bdmlib_setioctl(BDM_SPEED,10); bdmlib_go(); sleep(2); bdm_step_chip(); ret=bdmlib_load(file_name, NULL, &entry_pt); if(ret<0) printf("bdmlib_load : %s\n",bdmlib_geterror_str(ret)); bdmlib_set_sys_reg(BDM_REG_RPC, entry_pt); ret=bdmlib_go(); }; do { c=getchar(); ret=bdmlib_getstatus(); if(ret<0) printf("bdmlib_go : %s\n",bdmlib_geterror_str(ret)); else { printf("MCU "); if(ret&BDM_TARGETRESET) printf("Reset "); if(ret&BDM_TARGETSTOPPED) printf("Stopped "); if(ret&BDM_TARGETPOWER) printf("NoPower "); if(ret&BDM_TARGETNC) printf("NoConnect "); printf("\n"); }; c=toupper(c); switch(c) { case 'B': case 'D': bdmlib_showpc(); break; case 'S': ret=bdm_step_chip(); if(ret<0) printf("bdmlib_go : %s\n",bdmlib_geterror_str(ret)); break; case 'G': ret=bdmlib_go(); if(ret<0) printf("bdmlib_go : %s\n",bdmlib_geterror_str(ret)); break; case 'R': bdmlib_setioctl(BDM_SPEED,100); ret=bdmlib_reset(); bdmlib_setioctl(BDM_SPEED,0); if(ret<0) printf("bdmlib_reset : %s\n",bdmlib_geterror_str(ret)); break; case 'Q': quit_fl=1; break; case 'X': wr_test(); break; case 'Y': rd_test(); break; case 'Z': step_test(); break; case 'L': printf("Enter file name : "); scanf("%s",file_name); printf("\n"); ret=bdmlib_load(file_name, NULL, &entry_pt); if(ret<0) printf("bdmlib_load : %s\n",bdmlib_geterror_str(ret)); else {printf("loaded OK, entrypoint %lx\n",entry_pt); if((ret=bdmlib_set_sys_reg(BDM_REG_RPC, entry_pt))<0) printf("set PC error : %s\n",bdmlib_geterror_str(ret)); } break; case '\n': break; default: printf ("Help for BDM_TEST\n" "B: Begin Program Execution from Reset\n" "D: Dump Target MCU Registers\n" "H: Print This Help Summary\n" "L: Load S-Record or Object File into Target\n" "M: Memory Hex/ASCII Display\n" "R: Hardware Reset Target MCU\n" "S: Single Step Target MCU\n" "G: Go Full Speed Target MCU\n" "Q: Quit back to DOS\n"); }; } while(!quit_fl); bdmlib_close(1); return(0); }; char* TestSW(int argc,char *argv[],char swch) { int i; char *p; for(i=1;i