2 * jtag.c - basic jtag stuff (good excercise!)
4 * author: hackbard@hackdaworld.org
16 #define u16 unsigned short
17 #define u8 unsigned char
18 #define u32 unsigned int
20 // max devices and ir chain len
24 typedef struct s_jtdrv {
26 //int *init(t_jtag *jtag);
29 typedef struct s_part {
34 typedef struct s_jtag {
40 // only parallel III cable by now
49 int parport_init(unsigned long ppaddr) {
51 if(ioperm(ppaddr,1,1)||ioperm(ppaddr+1,1,1)) {
52 perror("parport init");
60 int parport_out(u8 data) {
68 int parport_in(u8 *data) {
76 // jtag low level functions
78 u8 jtag_clock(u8 tms,u8 tdi) {
101 // jtag mid level functions
118 int jtag_enter_shift_ir() {
129 int jtag_leave_shift_ir() {
139 int jtag_enter_shift_dr() {
149 int jtag_leave_shift_dr() {
159 int jtag_read_data(u8 *p,int bitlen) {
164 memset(p,0,bitlen+7/8);
169 p[count/8]|=((in&1)<<(count%8));
178 int jtag_write_data(u8 *p,int bitlen) {
185 jtag_clock(0,p[count/8]&(1<<count)?1:0);
194 int jtag_chain_init(t_jtag *jtag) {
199 jtag_enter_shift_ir();
200 for(i=0;i<MAXIRLEN*MAXDEV;i++) jtag_clock(0,0);
201 for(i=0;i<MAXIRLEN*MAXDEV;i++) {
206 printf("ir len: %d\n",i);
208 jtag_leave_shift_ir();
210 jtag_enter_shift_dr();
211 for(i=0;i<MAXIRLEN*MAXDEV;i++) jtag_clock(0,0);
212 for(i=0;i<MAXIRLEN*MAXDEV;i++)
215 printf("number of devices: %d\n",i);
217 jtag_leave_shift_dr();
220 jtag_enter_shift_dr();
221 for(i=1;i<=jtag->nod;i++) {
222 jtag_read_data((u8 *)&(jtag->part[jtag->nod-i].idcode),32);
223 printf("idcode of part %d: %x\n",i,jtag->part[jtag->nod-i].idcode);
225 jtag_leave_shift_dr();
231 int jtag_set_ir(char *s,int bitlen) {
233 u8 ir[MAXDEV*MAXIRLEN/8];
236 if(bitlen>=MAXDEV*MAXIRLEN) {
237 printf("instruction register too big!\n");
241 memset(ir,0,MAXDEV*MAXIRLEN/8*sizeof(u8));
243 printf("ir to set: ");
245 ir[count/8]|=(s[count]<<(count%8));
246 printf("%d",ir[count/8]&(1<<count%8)?1:0);
252 jtag_enter_shift_ir();
253 jtag_write_data(ir,bitlen);
254 jtag_leave_shift_ir();
260 int main(int argc,char **argv) {
266 memset(&jtag,0,sizeof(t_jtag));
268 printf("parport init ...\n");
272 printf("reset test logic ...\n");
276 printf("jtag chain init ...\n");
277 jtag_chain_init(&jtag);
280 printf("testing some instructions ...\n\n");
281 jtag_set_ir("000001000001",12);
282 jtag_enter_shift_dr();
283 jtag_read_data(io,64);
285 printf("%d",io[i/8]&(1<<(i%8))?1:0);
288 jtag_leave_shift_dr();