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_chain_init(t_jtag *jtag) {
183 jtag_enter_shift_ir();
184 for(i=0;i<MAXIRLEN*MAXDEV;i++) jtag_clock(0,0);
185 for(i=0;i<MAXIRLEN*MAXDEV;i++) {
190 printf("ir len: %d\n",i);
192 jtag_leave_shift_ir();
194 jtag_enter_shift_dr();
195 for(i=0;i<MAXIRLEN*MAXDEV;i++) jtag_clock(0,0);
196 for(i=0;i<MAXIRLEN*MAXDEV;i++)
199 printf("number of devices: %d\n",i);
201 jtag_leave_shift_dr();
204 jtag_enter_shift_dr();
205 for(i=1;i<=jtag->nod;i++) {
206 jtag_read_data((u8 *)&(jtag->part[jtag->nod-i].idcode),32);
207 printf("idcode of part %d: %x\n",i,jtag->part[jtag->nod-i].idcode);
209 jtag_leave_shift_dr();
215 int main(int argc,char **argv) {
219 memset(&jtag,0,sizeof(t_jtag));
221 printf("parport init ...\n");
225 printf("reset test logic ...\n");
229 printf("jtag chain init ...\n");
230 jtag_chain_init(&jtag);