📄 dapa.c
字号:
void
TDAPA::ParportReadStatus()
{
if (ppdev_fd != -1)
par_read_status(ppdev_fd, &par_status);
else
par_status = ioport_read(IOBASE+1);
}
void
TDAPA::SerialReadCtrl()
{
#ifdef TIOCMGET
ioctl(ppdev_fd, TIOCMGET, &ser_ctrl);
#else
ser_ctrl = 0;
#endif
}
void
TDAPA::SerialWriteCtrl()
{
#ifdef TIOCMGET
ioctl(ppdev_fd, TIOCMSET, &ser_ctrl);
#endif
}
void
TDAPA::OutReset(int b)
/* FALSE means active Reset at the AVR */
{
if (reset_invert)
b = !b;
switch (pa_type) {
case PAT_DAPA:
case PAT_DAPA_2:
if (b) par_ctrl |= DAPA_RESET; else par_ctrl &= ~DAPA_RESET;
ParportWriteCtrl();
break;
case PAT_STK200:
if (b) par_data |= STK2_RESET; else par_data &= ~STK2_RESET;
ParportWriteData();
break;
case PAT_ABB:
if (b) par_data |= ABB_RESET; else par_data &= ~ABB_RESET;
ParportWriteData();
break;
case PAT_AVRISP:
if (b) par_data |= AISP_RESET; else par_data &= ~AISP_RESET;
ParportWriteData();
break;
case PAT_BSD:
if (b) par_data |= BSD_RESET; else par_data &= ~BSD_RESET;
ParportWriteData();
break;
case PAT_FBPRG:
if (b) par_data |= FBPRG_RESET; else par_data &= ~FBPRG_RESET;
ParportWriteData();
break;
case PAT_DT006:
if (b) par_data |= DT006_RESET; else par_data &= ~DT006_RESET;
ParportWriteData();
break;
case PAT_ETT:
if (b) par_data |= ETT_RESET; else par_data &= ~ETT_RESET;
ParportWriteData();
break;
case PAT_MAXI:
if (b) par_data |= MAXI_RESET; else par_data &= ~MAXI_RESET;
ParportWriteData();
break;
case PAT_XIL:
if (b) par_data |= XIL_RESET; else par_data &= ~XIL_RESET;
ParportWriteData();
break;
case PAT_DASA:
#ifdef TIOCMGET
SerialReadCtrl();
if (b) ser_ctrl |= TIOCM_RTS; else ser_ctrl &= ~TIOCM_RTS;
SerialWriteCtrl();
#endif /* TIOCMGET */
break;
case PAT_DASA2:
#if defined(TIOCMGET) && defined(TIOCCBRK)
ioctl(ppdev_fd, b ? TIOCCBRK : TIOCSBRK, 0);
#endif /* TIOCMGET */
break;
}
Delay_usec(b ? reset_high_time : RESET_LOW_TIME );
}
void
TDAPA::OutSck(int b)
{
if (sck_invert)
b = !b;
#ifdef DEBUG1
printf("%c",(b)?'S':'s');
#endif
switch (pa_type) {
case PAT_DAPA:
case PAT_DAPA_2:
if (b) par_ctrl &= ~DAPA_SCK; else par_ctrl |= DAPA_SCK;
ParportWriteCtrl();
break;
case PAT_STK200:
if (b) par_data |= STK2_SCK; else par_data &= ~STK2_SCK;
ParportWriteData();
break;
case PAT_ABB:
if (b) par_data |= ABB_SCK; else par_data &= ~ABB_SCK;
ParportWriteData();
break;
case PAT_AVRISP:
if (b) par_data |= AISP_SCK; else par_data &= ~AISP_SCK;
ParportWriteData();
break;
case PAT_BSD:
if (b) par_data |= BSD_SCK; else par_data &= ~BSD_SCK;
ParportWriteData();
break;
case PAT_FBPRG:
if (b) par_data |= FBPRG_SCK; else par_data &= ~FBPRG_SCK;
ParportWriteData();
break;
case PAT_DT006:
if (b) par_data |= DT006_SCK; else par_data &= ~DT006_SCK;
ParportWriteData();
break;
case PAT_ETT:
if (b) par_data |= ETT_SCK; else par_data &= ~ETT_SCK;
ParportWriteData();
break;
case PAT_MAXI:
if (b) par_data |= MAXI_SCK; else par_data &= ~MAXI_SCK;
ParportWriteData();
break;
case PAT_XIL:
if (b) par_data |= XIL_SCK; else par_data &= ~XIL_SCK;
ParportWriteData();
break;
case PAT_DASA:
#if defined(TIOCMGET)
SerialReadCtrl();
if (b) ser_ctrl |= TIOCM_DTR; else ser_ctrl &= ~TIOCM_DTR;
SerialWriteCtrl();
#endif /* TIOCMGET */
break;
case PAT_DASA2:
#if defined(TIOCMGET)
if (b) ser_ctrl |= TIOCM_RTS; else ser_ctrl &= ~TIOCM_RTS;
SerialWriteCtrl();
#endif /* TIOCMGET */
break;
}
}
void
TDAPA::OutEnaReset(int b)
{
bool no_ps2_hack = GetCmdParam("-dno-ps2-hack", false);
switch (pa_type) {
case PAT_DAPA:
case PAT_DAPA_2:
case PAT_FBPRG:
case PAT_DT006:
case PAT_ETT:
case PAT_MAXI:
if (b) {
ParportSetDir(0);
} else if (!no_ps2_hack) {
/* No special enable line on these interfaces, for PAT_DAPA
this only disables the data line (MOSI) and not SCK. */
ParportSetDir(1);
}
break;
case PAT_STK200:
if (b) {
/* Make sure outputs are enabled. */
ParportSetDir(0);
SckDelay();
par_data &= ~STK2_ENA1;
ParportWriteData();
} else {
par_data |= STK2_ENA1;
ParportWriteData();
if (!no_ps2_hack) {
/* Experimental: disable outputs (PS/2 parallel port), for cheap
STK200-like cable without the '244. Should work with the real
STK200 too (disabled outputs should still have pull-up resistors,
ENA1 and ENA2 are high, and the '244 remains disabled).
This way the SPI pins can be used by the application too.
Please report if it doesn't work on some parallel ports. */
SckDelay();
ParportSetDir(1);
}
}
break;
case PAT_ABB:
if (b) {
ParportSetDir(0);
par_ctrl |= ABB_EN;
ParportWriteCtrl();
} else {
par_ctrl &= ~ABB_EN;
ParportWriteCtrl();
if (!no_ps2_hack) {
SckDelay();
ParportSetDir(1);
}
}
break;
case PAT_AVRISP:
if (b) {
ParportSetDir(0);
SckDelay();
par_data &= ~AISP_ENA;
ParportWriteData();
} else {
par_data |= AISP_ENA;
ParportWriteData();
if (!no_ps2_hack) {
SckDelay();
ParportSetDir(1);
}
}
break;
case PAT_BSD:
if (b) {
ParportSetDir(0);
SckDelay();
par_data &= ~BSD_ENA;
ParportWriteData();
} else {
par_data |= BSD_ENA;
ParportWriteData();
if (!no_ps2_hack) {
SckDelay();
ParportSetDir(1);
}
}
break;
case PAT_XIL:
if (b) {
ParportSetDir(0);
par_data &= ~XIL_ENA;
ParportWriteData();
} else {
par_data |= XIL_ENA;
ParportWriteData();
if (!no_ps2_hack) {
SckDelay();
ParportSetDir(1);
}
}
break;
case PAT_DASA:
case PAT_DASA2:
break;
}
}
void
TDAPA::OutEnaSck(int b)
{
switch (pa_type) {
case PAT_STK200:
if (b)
par_data &= ~(STK2_ENA2 | STK2_LED);
else
par_data |= (STK2_ENA2 | STK2_LED);
ParportWriteData();
break;
case PAT_DAPA:
case PAT_DAPA_2:
case PAT_ABB:
case PAT_AVRISP:
case PAT_BSD:
case PAT_FBPRG:
case PAT_DT006:
case PAT_ETT:
case PAT_MAXI:
case PAT_XIL:
case PAT_DASA:
case PAT_DASA2:
/* no separate enable for SCK nad MOSI */
break;
}
}
void
TDAPA::PulseSck()
{
SckDelay();
OutSck(1);
SckDelay();
OutSck(0);
}
void
TDAPA::PulseReset()
{
printf("pulse\n");
/* necessary delays already included in these methods */
OutReset(1);
Delay_usec(1000);
OutReset(0);
}
void
TDAPA::OutData(int b)
{
if (mosi_invert)
b = !b;
#ifdef DEBUG1
printf("%c",(b)?'D':'d');
#endif
switch (pa_type) {
case PAT_DAPA:
if (b) par_data |= DAPA_DOUT; else par_data &= ~DAPA_DOUT;
par_data &= ~0x6; //0x6
par_data |= 0x0; //0x6
ParportWriteData();
break;
case PAT_DAPA_2:
if (b) par_data |= DAPA_DOUT; else par_data &= ~DAPA_DOUT;
par_data &= ~0x6; //0x6
par_data |= 0x4; //0x6
ParportWriteData();
break;
case PAT_STK200:
if (b) par_data |= STK2_DOUT; else par_data &= ~STK2_DOUT;
ParportWriteData();
break;
case PAT_ABB:
if (b) par_data |= ABB_DOUT; else par_data &= ~ABB_DOUT;
ParportWriteData();
break;
case PAT_AVRISP:
if (b) par_data |= AISP_DOUT; else par_data &= ~AISP_DOUT;
ParportWriteData();
break;
case PAT_BSD:
if (b) par_data |= BSD_DOUT; else par_data &= ~BSD_DOUT;
ParportWriteData();
break;
case PAT_FBPRG:
if (b) par_data |= FBPRG_DOUT; else par_data &= ~FBPRG_DOUT;
ParportWriteData();
break;
case PAT_DT006:
if (b) par_data |= DT006_DOUT; else par_data &= ~DT006_DOUT;
ParportWriteData();
break;
case PAT_ETT:
if (b) par_ctrl |= ETT_DOUT; else par_ctrl &= ~ETT_DOUT;
ParportWriteCtrl();
break;
case PAT_MAXI:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -