X-Git-Url: https://www.hackdaworld.org/gitweb/?p=my-code%2Fpnx.git;a=blobdiff_plain;f=jtag.c;h=9d05d5f54cb3970f98f7e73d37b0463e42a796f5;hp=ca2e683995e83f5ebb238762c36786216e1a6953;hb=6c8a5ae62d740c2ca0e43f985b556453911b0880;hpb=6f15628e4735a47b9817673680d8efd2688a2923 diff --git a/jtag.c b/jtag.c index ca2e683..9d05d5f 100644 --- a/jtag.c +++ b/jtag.c @@ -1,6 +1,7 @@ /* * jtag.c - basic jtag stuff (good excercise!) * + * build: gcc -Wall jtag.c -o jtag * author: hackbard@hackdaworld.org * */ @@ -164,12 +165,34 @@ int jtag_read_data(u8 *p,int bitlen) { memset(p,0,bitlen+7/8); count=0; + printf(" <- "); while(bitlen) { in=jtag_clock(0,0); p[count/8]|=((in&1)<<(count%8)); + printf("%d",p[count/8]&(1<<(count%8))?1:0); count+=1; bitlen-=1; } + printf("\n"); + + return 0; + +} + +int jtag_write_data(u8 *p,int bitlen) { + + int count; + + count=0; + + printf(" -> "); + while(bitlen) { + jtag_clock(0,p[count/8]&(1<<(count%8))?1:0); + printf("%d",p[count/8]&(1<<(count%8))?1:0); + bitlen-=1; + count+=1; + } + printf("\n"); return 0; @@ -212,9 +235,41 @@ int jtag_chain_init(t_jtag *jtag) { } +int jtag_set_ir(char *s,int bitlen) { + + u8 ir[MAXDEV*MAXIRLEN/8]; + int count; + + if(bitlen>=MAXDEV*MAXIRLEN) { + printf("instruction register too big!\n"); + return -1; + } + + memset(ir,0,MAXDEV*MAXIRLEN/8*sizeof(u8)); + count=0; + + printf("set ir: "); + while(bitlen) { + if(s[count]=='1') + ir[count/8]|=(1<<(count%8)); + printf("%d",ir[count/8]&(1<<(count%8))?1:0); + count+=1; + bitlen-=1; + } + printf("\n"); + + jtag_enter_shift_ir(); + jtag_write_data(ir,count); + jtag_leave_shift_ir(); + + return 0; + +} + int main(int argc,char **argv) { t_jtag jtag; + u8 io[256]; memset(&jtag,0,sizeof(t_jtag)); @@ -230,6 +285,12 @@ int main(int argc,char **argv) { jtag_chain_init(&jtag); printf("done\n\n"); + printf("testing some instructions ...\n\n"); + jtag_set_ir("000001000001",12); + jtag_enter_shift_dr(); + jtag_read_data(io,64); + jtag_leave_shift_dr(); + return 0; }