--- uisp-20040311/src/DAPA.C 2004-02-07 15:54:06.000000000 -0300 +++ uisp-marga/src/DAPA.C 2004-09-30 12:39:29.000000000 -0300 @@ -188,7 +188,7 @@ /* Alex's Direct Avr Parallel Access */ -#define DAPA_SCK PARPORT_CONTROL_STROBE /* base + 2 */ +#define DAPA_SCK PARPORT_CONTROL_STROBE /* base + 2 - low active*/ #define DAPA_RESET PARPORT_CONTROL_INIT /* base + 2 */ #define DAPA_DIN PARPORT_STATUS_BUSY /* base + 1 */ #define DAPA_DOUT 0x1 /* base */ @@ -219,8 +219,6 @@ #define ABB_XTAL1 0x08 /* - XXX not yet supported, just documented here... - Atmel-ISP Download Cable (P/N ATDH1150VPC) (10-pin connector similar to Altera Byte Blaster, but no 3-state outputs) http://www.atmel.com/atmel/acrobat/isp_c_v5.pdf @@ -233,11 +231,11 @@ MOSI <- TDI(9) <- D0 XTAL1 <- AF(8) <- AUTOFD (optional, not yet supported) */ -#define ATDH_SCK PARPORT_CONTROL_STROBE -#define ATDH_DOUT 0x01 -#define ATDH_RESET PARPORT_CONTROL_SELECT -#define ATDH_DIN PARPORT_STATUS_ACK -#define ATDH_XTAL1 PARPORT_CONTROL_AUTOFD +#define ATDH_SCK PARPORT_CONTROL_STROBE /* low active */ +#define ATDH_DOUT 0x01 /* D0 - TDI */ +#define ATDH_RESET PARPORT_CONTROL_SELECT /* low active */ +#define ATDH_DIN PARPORT_STATUS_ACK /* ACK - TDO */ +#define ATDH_XTAL1 PARPORT_CONTROL_AUTOFD /* optional, not implemented */ /* "Atmel AVR ISP" cable (?) */ @@ -258,10 +256,10 @@ #define BSD_DOUT 0x80 /* D7 (base) - MOSI */ #define BSD_DIN PARPORT_STATUS_ACK /* ACK (base + 1) - MISO */ /* optional status LEDs, active low, not yet supported (base + 2) */ -#define BSD_LED_ERR PARPORT_CONTROL_STROBE /* error */ -#define BSD_LED_RDY PARPORT_CONTROL_AUTOFD /* ready */ +#define BSD_LED_ERR PARPORT_CONTROL_STROBE /* error - low active */ +#define BSD_LED_RDY PARPORT_CONTROL_AUTOFD /* ready - low active */ #define BSD_LED_PGM PARPORT_CONTROL_INIT /* programming */ -#define BSD_LED_VFY PARPORT_CONTROL_SELECT /* verifying */ +#define BSD_LED_VFY PARPORT_CONTROL_SELECT /* verifying - low active*/ /* FBPRG - http://ln.com.ua/~real/avreal/adapters.html @@ -286,7 +284,7 @@ #define ETT_SCK 0x01 /* DB25 Pin 2: D0 (Base + 0) -> SCK */ #define ETT_RESET 0x02 /* DB25 Pin 3: D1 (Base + 0) -> RESET */ #define ETT_DIN PARPORT_STATUS_ACK /* DB25 Pin 10: ACK (Base + 1) -> MISO */ -#define ETT_DOUT PARPORT_CONTROL_STROBE /* DB25 Pin 1: STROBE (Base + 2) -> MOSI */ +#define ETT_DOUT PARPORT_CONTROL_STROBE /* DB25 Pin 1: STROBE (Base + 2) -> MOSI (low active) */ /* ABC Maxi - just like DT006 with two pins swapped */ /* all at base, except for MAXI_DIN at base + 1 */ @@ -380,6 +378,7 @@ void TDAPA::ParportWriteCtrl() { + Info(5, "Control: %x \n", par_ctrl); if (ppdev_fd != -1) par_write_ctrl(ppdev_fd, &par_ctrl); else @@ -389,6 +388,7 @@ void TDAPA::ParportWriteData() { + Info(5, "Data: %x \n", par_data); if (ppdev_fd != -1) par_write_data(ppdev_fd, &par_data); else @@ -402,6 +402,8 @@ par_read_status(ppdev_fd, &par_status); else par_status = ioport_read(IOBASE+1); + + Info(5,"Status: %x \n", par_status); } void @@ -428,6 +430,7 @@ { if (reset_invert) b = !b; + Info(4, "Reseting: %d\n", b); switch (pa_type) { case PAT_DAPA: if (b) par_ctrl |= DAPA_RESET; else par_ctrl &= ~DAPA_RESET; @@ -444,6 +447,11 @@ ParportWriteData(); break; + case PAT_ATDH: + if (b) par_ctrl |= ATDH_RESET; else par_ctrl &= ~ATDH_RESET; + ParportWriteCtrl(); + break; + case PAT_PARAVRISP: if (b) par_data |= AISP_RESET; else par_data &= ~AISP_RESET; ParportWriteData(); @@ -520,6 +528,11 @@ ParportWriteData(); break; + case PAT_ATDH: + if (b) par_ctrl |= ATDH_SCK; else par_ctrl &= ~ATDH_SCK; + ParportWriteCtrl(); + break; + case PAT_PARAVRISP: if (b) par_data |= AISP_SCK; else par_data &= ~AISP_SCK; ParportWriteData(); @@ -580,6 +593,7 @@ switch (pa_type) { case PAT_DAPA: case PAT_FBPRG: + case PAT_ATDH: case PAT_DT006: case PAT_ETT: case PAT_MAXI: @@ -697,6 +711,7 @@ case PAT_DAPA: case PAT_ABB: + case PAT_ATDH: case PAT_PARAVRISP: case PAT_BSD: case PAT_FBPRG: @@ -706,7 +721,7 @@ case PAT_XIL: case PAT_DASA: case PAT_DASA2: - /* no separate enable for SCK nad MOSI */ + /* no separate enable for SCK and MOSI */ break; } } @@ -752,6 +767,11 @@ ParportWriteData(); break; + case PAT_ATDH: + if (b) par_data |= ATDH_DOUT; else par_data &= ~ATDH_DOUT; + ParportWriteData(); + break; + case PAT_PARAVRISP: if (b) par_data |= AISP_DOUT; else par_data &= ~AISP_DOUT; ParportWriteData(); @@ -812,6 +832,7 @@ case PAT_ABB: case PAT_DT006: ParportReadStatus(); + /* STATUS_BUSY is an inverted pin*/ b = (~par_status & PARPORT_STATUS_BUSY); break; case PAT_ETT: @@ -819,6 +840,7 @@ b = (par_status & ETT_DIN); break; case PAT_STK200: + case PAT_ATDH: case PAT_PARAVRISP: case PAT_BSD: case PAT_FBPRG: @@ -866,6 +888,11 @@ par_data = 0xFF & ~ABB_SCK; break; + case PAT_ATDH: + par_ctrl = 0; + par_data = 0xFF; + break; + case PAT_PARAVRISP: par_ctrl = 0; par_data = 0xFF & ~(AISP_ENA | AISP_SCK); @@ -924,6 +951,7 @@ { unsigned int mask, received=0; + Info(4, "Sending: %d \n", b); for (mask = 0x80; mask; mask >>= 1) { OutData(b & mask); SckDelay(); @@ -937,6 +965,7 @@ received |= mask; OutSck(0); } + Info(4, "Received: %d \n", received); return received; } @@ -980,6 +1009,17 @@ const char *ppdev_name = "/dev/parport0"; + sck_invert = 0; + mosi_invert = 0; + miso_invert = 0; + reset_invert = 0; + + at89 = 0; + if (GetCmdParam("-d89",false)) { + reset_invert = 1; + at89 = 1; + } + /* Enable Parallel Port */ val = GetCmdParam("-dprog"); if (val && strcmp(val, "dapa") == 0) @@ -988,6 +1028,12 @@ pa_type = PAT_STK200; else if (val && strcmp(val, "abb") == 0) pa_type = PAT_ABB; + else if (val && strcmp(val, "atdh") == 0) + { + pa_type = PAT_ATDH; + // The ATDH RESET pin is hardware inverted + reset_invert = !reset_invert; + } else if (val && strcmp(val, "paravrisp") == 0) pa_type = PAT_PARAVRISP; else if (val && strcmp(val, "bsd") == 0) @@ -1109,17 +1155,6 @@ if (val) t_sck = strtol(val, NULL, 0); - sck_invert = 0; - mosi_invert = 0; - miso_invert = 0; - reset_invert = 0; - - at89 = 0; - if (GetCmdParam("-d89",false)) { - reset_invert = 1; - at89 = 1; - } - if ((val=GetCmdParam("-dinvert"))) { #define MAXLINESIZE 256 @@ -1131,16 +1166,16 @@ *p=toupper(*p); Info(3, "Inverting %s\n",temp); if (strstr(temp,"SCK")) - sck_invert=1; + sck_invert=!sck_invert; if (strstr(temp,"MOSI")) - mosi_invert=1; + mosi_invert=!mosi_invert; if (strstr(temp,"MISO")) - miso_invert=1; + miso_invert=!miso_invert; if (strstr(temp,"RESET")) - reset_invert=1; + reset_invert=!reset_invert; } reset_high_time = RESET_HIGH_TIME;