unsigned char ProgIO_Set_Get_State(unsigned char d) { /* Set state of output pins (s.a.) * then read state of input pins: * * TDO => d.0 * DATAOUT => d.1 (only #ifdef HAVE_AS_MODE) */ ProgIO_Set_State(d); return (GetASDO()<<1)|GetTDO(); }
void usb_jtag_activity(void) // Called repeatedly while the device is idle { if(!Running) return; ProgIO_Poll(); if(!(EP1INCS & bmEPBUSY)) { if(Pending > 0) { BYTE o, n; AUTOPTRH2 = MSB( EP1INBUF ); AUTOPTRL2 = LSB( EP1INBUF ); XAUTODAT2 = 0x31; XAUTODAT2 = 0x60; if(Pending > 0x3E) { n = 0x3E; Pending -= n; } else { n = Pending; Pending = 0; }; o = n; #ifdef USE_MOD256_OUTBUFFER APTR1H = MSB( OutBuffer ); APTR1L = FirstDataInOutBuffer; while(n--) { XAUTODAT2 = XAUTODAT1; APTR1H = MSB( OutBuffer ); // Stay within 256-Byte-Buffer }; FirstDataInOutBuffer = APTR1L; #else APTR1H = MSB( &(OutBuffer[FirstDataInOutBuffer]) ); APTR1L = LSB( &(OutBuffer[FirstDataInOutBuffer]) ); while(n--) { XAUTODAT2 = XAUTODAT1; if(++FirstDataInOutBuffer >= OUTBUFFER_LEN) { FirstDataInOutBuffer = 0; APTR1H = MSB( OutBuffer ); APTR1L = LSB( OutBuffer ); }; }; #endif SYNCDELAY; EP1INBC = 2 + o; TF2 = 1; // Make sure there will be a short transfer soon } else if(TF2) { EP1INBUF[0] = 0x31; EP1INBUF[1] = 0x60; SYNCDELAY; EP1INBC = 2; TF2 = 0; }; }; if(!(EP2468STAT & bmEP2EMPTY) && (Pending < OUTBUFFER_LEN-0x3F)) { WORD i, n = EP2BCL|EP2BCH<<8; APTR1H = MSB( EP2FIFOBUF ); APTR1L = LSB( EP2FIFOBUF ); for(i=0;i<n;) { if(ClockBytes > 0) { WORD m; m = n-i; if(ClockBytes < m) m = ClockBytes; ClockBytes -= m; i += m; /* Shift out 8 bits from d */ if(WriteOnly) /* Shift out 8 bits from d */ { while(m--) ProgIO_ShiftOut(XAUTODAT1); } else /* Shift in 8 bits at the other end */ { while(m--) OutputByte(ProgIO_ShiftInOut(XAUTODAT1)); } } else { BYTE d = XAUTODAT1; WriteOnly = (d & bmBIT6) ? FALSE : TRUE; if(d & bmBIT7) { /* Prepare byte transfer, do nothing else yet */ ClockBytes = d & 0x3F; } else { if(WriteOnly) ProgIO_Set_State(d); else OutputByte(ProgIO_Set_Get_State(d)); }; i++; }; }; SYNCDELAY; EP2BCL = 0x80; // Re-arm endpoint 2 }; }