2 * jtag.c - basic jtag stuff (good excercise!)
4 * build: gcc -Wall jtag.c -o jtag
5 * author: hackbard@hackdaworld.org
17 #define u16 unsigned short
18 #define u8 unsigned char
19 #define u32 unsigned int
21 // max devices and ir chain len
25 typedef struct s_jtdrv {
27 //int *init(t_jtag *jtag);
30 typedef struct s_part {
35 typedef struct s_jtag {
41 // only parallel III cable by now
50 int parport_init(unsigned long ppaddr) {
52 if(ioperm(ppaddr,1,1)||ioperm(ppaddr+1,1,1)) {
53 perror("parport init");
61 int parport_out(u8 data) {
69 int parport_in(u8 *data) {
77 // jtag low level functions
79 u8 jtag_clock(u8 tms,u8 tdi) {
102 // jtag mid level functions
119 int jtag_enter_shift_ir() {
130 int jtag_leave_shift_ir() {
140 int jtag_enter_shift_dr() {
150 int jtag_leave_shift_dr() {
160 int jtag_read_data(u8 *p,int bitlen) {
165 memset(p,0,bitlen+7/8);
171 p[count/8]|=((in&1)<<(count%8));
172 printf("%d",p[count/8]&(1<<(count%8))?1:0);
182 int jtag_write_data(u8 *p,int bitlen) {
190 jtag_clock(0,p[count/8]&(1<<(count%8))?1:0);
191 printf("%d",p[count/8]&(1<<(count%8))?1:0);
201 int jtag_chain_init(t_jtag *jtag) {
206 jtag_enter_shift_ir();
207 for(i=0;i<MAXIRLEN*MAXDEV;i++) jtag_clock(0,0);
208 for(i=0;i<MAXIRLEN*MAXDEV;i++) {
213 printf("ir len: %d\n",i);
215 jtag_leave_shift_ir();
217 jtag_enter_shift_dr();
218 for(i=0;i<MAXIRLEN*MAXDEV;i++) jtag_clock(0,0);
219 for(i=0;i<MAXIRLEN*MAXDEV;i++)
222 printf("number of devices: %d\n",i);
224 jtag_leave_shift_dr();
227 jtag_enter_shift_dr();
228 for(i=1;i<=jtag->nod;i++) {
229 jtag_read_data((u8 *)&(jtag->part[jtag->nod-i].idcode),32);
230 printf("idcode of part %d: %x\n",i,jtag->part[jtag->nod-i].idcode);
232 jtag_leave_shift_dr();
238 int jtag_set_ir(char *s,int bitlen) {
240 u8 ir[MAXDEV*MAXIRLEN/8];
243 if(bitlen>=MAXDEV*MAXIRLEN) {
244 printf("instruction register too big!\n");
248 memset(ir,0,MAXDEV*MAXIRLEN/8*sizeof(u8));
254 ir[count/8]|=(1<<(count%8));
255 printf("%d",ir[count/8]&(1<<(count%8))?1:0);
261 jtag_enter_shift_ir();
262 jtag_write_data(ir,count);
263 jtag_leave_shift_ir();
269 int main(int argc,char **argv) {
274 memset(&jtag,0,sizeof(t_jtag));
276 printf("parport init ...\n");
280 printf("reset test logic ...\n");
284 printf("jtag chain init ...\n");
285 jtag_chain_init(&jtag);
288 printf("testing some instructions ...\n\n");
289 jtag_set_ir("000001000001",12);
290 jtag_enter_shift_dr();
291 jtag_read_data(io,64);
292 jtag_leave_shift_dr();