⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dapa.c

📁 tinyos-2.x.rar
💻 C
📖 第 1 页 / 共 3 页
字号:

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 + -