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

📄 agdi.cpp

📁 Cypress公司的CH372EVT芯片基于的USB1。1的驱动
💻 CPP
📖 第 1 页 / 共 4 页
字号:
}

/*
 * Read 'nMany' sfr values out of sfr-data space into buffer 'pB'
 *  return: 0:=Ok, else 'ErrorAddress | (amDATA << 24)'
 */

UL32 ReadSFR (BYTE *pB, DWORD nAdr, DWORD nMany)  {
  if (CacheValid (pB, nAdr, nMany))  {   // use cache, if possible
    return (0);
  }

//---TODO:
//---if Ok, then return 0, else error-address
//   adr |= (amDATA << 24);   // make address uVision2 conforming
  return (0);                 // say Ok.
}

/*
 * Read 'nMany' bytes out of the xdata space into buffer 'pB'
 *  return: 0:=Ok, else 'ErrorAddress | (amXDATA << 24)'
 */

UL32 ReadXdata (BYTE *pB, DWORD nAdr, DWORD nMany)  {
  if (CacheValid (pB, nAdr, nMany))  {   // use cache, if possible
    return (0);
  }
//---TODO:
//---if Ok, then return 0, else error-address
//   adr |= (amIDATA << 24);  // make address uVision2 conforming
  return (0);                 // say Ok.
}

/*
 * Read 'nMany' bytes out of the code space into buffer 'pB'
 *  return: 0:=Ok, else 'ErrorAddress | (amCODE << 24)'
 */

UL32 ReadCode (BYTE *pB, DWORD nAdr, DWORD nMany)  {
  if (CacheValid (pB, nAdr, nMany))  {   // use cache, if possible
    return (0);
  }
  else  {
    memset (pB, 0, nMany);    // for now, we return 0 bytes (NOP's)
  }

//---TODO:
//---if Ok, then return 0, else error-address
//   adr |= (amCODE << 24);   // make address uVision2 conforming
  return (0);                 // say Ok.
}

/*
 * Write 'nMany' bytes of code into target
 *  return: 0:=Ok, else 'ErrorAddress | (amCODE << 24)'
 */

UL32 WriteCode (BYTE *pB, DWORD nAdr, DWORD nMany)  {
//---TODO:
//---if Ok, then return 0, else error-address
//   adr |= (amCODE << 24);   // make address uVision2 conforming
  return (0);                 // say Ok.
}

/*
 * Write 'nMany' bytes of xdata into target
 *  return: 0:=Ok, else 'ErrorAddress | (amXDATA << 24)'
 */

UL32 WriteXdata (BYTE *pB, DWORD nAdr, DWORD nMany)  {
//---TODO:
//---if Ok, then return 0, else error-address
//   adr |= (amXDATA << 24);  // make address uVision2 conforming
  return (0);                 // say Ok.
}

/*
 * Write 'nMany' bytes of idata into target
 *  return: 0:=Ok, else 'ErrorAddress | (amIDATA << 24)'
 */

UL32 WriteIdata (BYTE *pB, DWORD nAdr, DWORD nMany)  {
//---TODO:
//---if Ok, then return 0, else error-address
//   adr |= (amIDATA << 24);  // make address uVision2 conforming
  return (0);                 // say Ok.
}

/*
 * Write 'nMany' bytes of data into target
 *  return: 0:=Ok, else 'ErrorAddress | (amDATA << 24)'
 */

UL32 WriteData (BYTE *pB, DWORD nAdr, DWORD nMany)  {
//---TODO:
//---if Ok, then return 0, else error-address
//   adr |= (amDATA << 24);   // make address uVision2 conforming
  return (0);                 // say Ok.
}

/*
 * Write 'nMany' sfr's to target
 *  return: 0:=Ok, else 'ErrorAddress | (amDATA << 24)'
 */

UL32 WriteSFR (BYTE *pB, DWORD nAdr, DWORD nMany)  {
//---TODO:
//---if Ok, then return 0, else error-address
//   adr |= (amDATA << 24);   // make address uVision2 conforming
  return (0);                 // say Ok.
}



/*
 * Initialize your target communication
 * Return 0 if Ok, 1 if failed.
 */

U32 InitTarget (void)  {
//---TODO:
  return (0);            // say 'Ok.'
}


/*
 * Target settings have changed (Baudrate or ComPort for example)
 * Return 0 if Ok, 1 if failed.
 */

U32 ReInitTarget (void)  {
//---TODO: shutdown target
//---      reinit communication with current 'MonConf' values
  return (0);            // say 'Ok.'
}

/*
 * Stop your target communication
 * Free all resources (dynamic memory, ...)
 */

void StopTarget (void)  {
  FreeCache();                 // free allocated cache memory.
//---TODO: add code for cleanup
}

/*
 * Reset your target. Set PC to whatever required value
 */

void ResetTarget (void)  {
//---TODO: add code for target reset
}


/*
 * Read PC out of target
 */

UL32 ReadPC (void)  {
  UL32   nPC;

//---TODO: read PC out of target

  nPC  = REG51.nPC & 0xFFFF;     // we use shadow PC for now...
  nPC |= (amCODE << 24);         // C:0xnnnn
  return (nPC);
}


/*
 * Write PC out to target
 */

void WritePC (UL32 nPC)  {
//---TODO: write PC to target
  REG51.nPC = nPC;                // keep in shadow registers
}



/*
 * Read all registers out of target and fill the REG51 structure
 */

void GetRegs (void)  {
  if (RegUpToDate) return;        // already up to date
  if (iRun) return;               // currently executing, can't access
  curPC = REG51.nPC = ReadPC();
 
//---TODO: fetch regs from target and put them into REG51
//---if connection is broken for some reason, then set PlayDead:=1 !
}


/*
 * Write all registers to target
 */

void SetRegs (RG51 *pR)  {
//--- write pR->Rn[0] ... pR->Rn[7]
//--- write pR->sp, pR->psw, pR->b, pR->acc, pR->dpl, pR->dph, pR->nPC
  WritePC (pR->nPC);
  REG51 = *pR;
//---if connection is broken for some reason, then set PlayDead:=1 !
}


/*
 * Stop execution of user program
 */

U32 StopExec (void)  {
  if (iRun)  {                  // if currently executing
//---TODO: Stop exec
//---if successful, return (1), else (0)
  }
  return (1);                   // 'Stopped'
}

/*
 * Invalidate everything which may be invalid after Go or Step
 *  (Registers, Caches, etc.)
 */

void Invalidate (void)  {
  RegUpToDate = 0;                    // invalidate Registers
  InvalCache();                       // invalidate cached memory
}


/*
 * Execute a single instruction, return 1 if ok, else 0
 */

UL32 Step (void)  {
  return (1);
}


/*
 * Start execution.  Stop when a Bp is reached
 */

void GoCmd (void)  {
}


/*
 * Set/Clear Breakpoint at address pB->Adr
 */

int SetClrBp (int set, AG_BP *pB)  {
  int       nR;

  nR = 1;
  if (set)  {                   // set address break
//---TODO: give target a message about Set-Bp at address 'pB->Adr'
//---      if ok, then return (1), else (0)
//  if (failed)  {
//    MessageBeep (MB_OK);
//    txtout ((char *) szNBP, pB->Adr);
//    nR = 0;
//  }
  }
  else  {                       // clear address break
//---TODO: give target a message about Clear-Bp at address 'pB->Adr'
//---      if ok, then return (1), else (0)
  }
  return (nR);
}




/*
 *----------- AGDI Basic Functions -----------------
 */


/*
 * AGDI-Init Function
 */

U32 _EXPO_ AG_Init (U16 nCode, void *vp)  {
  U32     nE;

  nE = 0;
  switch (nCode & 0xFF00)  {
    case AG_INITFEATURES:     // Initialize & start the target
      PlayDead = 0;           // clear some variables...

//---We don't have special features here, so all variables are cleared.
//---uVision2 will query these features lateron.
//---Note: the 'supp' structure is defined in 'AGDI.H'

      supp.MemAccR  = 0;      // memory-access while running
      supp.RegAccR  = 0;      // register-access while running
      supp.hTrace   = 0;      // trace support
      supp.hCover   = 0;      // code coverage support
      supp.hPaLyze  = 0;      // Performance-Analyzer support
      supp.hMemMap  = 0;      // Memory-Map support
      supp.ResetR   = 0;      // Reset while running support

//---Note: if InitTarget() fails, then set nE=1, else nE=0.
//         if 1 is returned, then uVision will cancel using this driver

      InitCache();               // init Cache

//----------------------------------------------------------
//--- get a copy of all memory slots from uVision/s8051.dll:
      pCbFunc (AG_CB_GETSLOTS, (void *) &mslots[0]);
//----------------------------------------------------------

      bootflag = 1;
      nE       = InitTarget();   // Initialize your target...
      bootflag = 0;
      if (nE == 0)  {            // initialization was Ok.
        InitRegs();              // define register layout for RegWindow
      }

      if (nE == 0)  {            // everything is ok so far
        pCbFunc (AG_CB_EXECCMD, "U $\n");  // force disassemble @curPC
      }
      break;

    case AG_INITITEM:             // init item
      switch (nCode & 0x00FF)  {
        case AG_INITMENU:         // init extension menu
          *((DYMENU **) vp) = (DYMENU *) Menu;
          break;
        case AG_INITEXTDLGUPD:    // init modeless extesion dlg update function
          *((UC8 **) vp) = (UC8 *) DlgUpdate;
          break;
        case AG_INITMHANDLEP:     // setup ptr to HWND of active modeless dlg
          pHwnd = (HWND *) vp;
          break;
        case AG_INITPHANDLEP:     // pointer to parent handle (MainFrame)
          hMfrm = (HWND) vp;
          break;
        case AG_INITINSTHANDLE:   // pointer to Agdi-instance handle
          hInst = (HMODULE) vp;
          break;
        case AG_INITBPHEAD:       // pointer to head of Bp-List
          pBhead = (AG_BP **) vp;
          break;
        case AG_INITCURPC:        // pointer to program counter
          pCURPC = (UL32 *) vp;
          break;
        case AG_INITDOEVENTS:     // DoEvents function pointer
//--- this is no longer relevant due to uVision's threading.
          break;
        case AG_INITUSRMSG:       // Registered Message for SendMessage
          Uv2Msg = (DWORD) vp;    // (Serial-Window, TextOut messages)
          break;
        case AG_INITCALLBACK:     // pointer to callback function
          pCbFunc = (pCBF) vp;    // call-back function of s166
          break;
      }
      break;

    case AG_GETFEATURE:           // uVision2 want's details about features...
      switch (nCode & 0x00FF)  {
        case AG_F_MEMACCR:    nE = supp.MemAccR; break;
        case AG_F_REGACCR:    nE = supp.RegAccR; break;
        case AG_F_TRACE:      nE = supp.hTrace;  break;
        case AG_F_COVERAGE:   nE = supp.hCover;  break;
        case AG_F_PALYZE:     nE = supp.hPaLyze; break;
        case AG_F_MEMMAP:     nE = supp.hMemMap; break;
        case AG_F_RESETR:     nE = supp.ResetR;  break;
      }
      break;

    case AG_EXECITEM:             // execute various commands
      switch (nCode & 0x00FF)  {
        case AG_UNINIT:           // Clean up target system settings
          PlayDead = 1;           // mark target as disconnected.
          CloseAllDlg();          // close all open dialogs
          StopTarget();           // shutdown target & communication
          WriteMonParms (pdbg->TargArgs);  // update argument string
          break;

        case AG_RESET:            // perform a reset on the target system
          if (PlayDead || hMfrm == NULL) break;  // target is disconnected
          ResetTarget();          // reset the target
          pCbFunc (AG_CB_EXECCMD, "U $\n");      // dasm $
          break;
      }
      break;
  }

  if (PlayDead)  {       // driver is disconnected
    StopTarget();        // shut down driver
    PostMessage (hMfrm, Uv2Msg, MSG_UV2_TERMINATE, 0);  // unload this driver
  }

  return (nE);
}



/*
 * Memory Interface functions
 */

static DWORD ReadMem (DWORD nAdr, BYTE *pB, DWORD nMany)  {
  DWORD     n1, n, ErrAdr;
  DWORD     nA, nM;
  BYTE     *p1;

  nA = nAdr;                    // save values for caching...
  p1 = pB;
  nM = nMany;

  while (nMany != 0)  {
    n = (nMany > 256) ? 256 : nMany;
    nMany -= n;
    switch (nAdr >> 24)  {      // extract mSpace from address.
      case amDATA:
        if ((nAdr & 0xFF) >= 0x80)  {  // Sfr-area: D:0x80...D:0xFF
          if (((nAdr & 0xFF) + n) > 0x100) n1 = 0x100 - (nAdr & 0xFF);
          else                             n1 = n;
          ErrAdr = ReadSFR (pB, nAdr & 0xFF0000FF, n1);
        }
        else  {                     // Data-area: D:0x00...D:0x7F
          if (((nAdr & 0xFF) + n) > 0x100) n1 = 0x100 - (nAdr & 0xFF);
          else                             n1 = n;
          ErrAdr = ReadData (pB, nAdr & 0xFF0000FF, n1);
        }
        break;

      case amIDATA:                 // Idata
        if (((nAdr & 0xFF) + n) > 0x100) n1 = 0x100 - (nAdr & 0xFF);
        else                             n1 = n;
        ErrAdr = ReadIdata (pB, nAdr & 0xFF0000FF, n1);
        break;

      case amXDATA:                 // Xdata
      case amPDATA:
        ErrAdr = ReadXdata (pB, nAdr, n);
        break;

//    case amCODE:                  // Code
      default:                      // anything else assumed to be c-address
        ErrAdr = ReadCode (pB, nAdr, n);
        break;
    }
    pB   += n;
    nAdr += n;
  }

#if 0  // Remove '#if 0' if Memory interface is running...
  if (ErrAdr == 0)  {                 // read was Ok.
    CacheData (p1, nA, nM);           // put write data into cache
  }
  else  {                             // write failed...
    ClearCaR (nA, nM);                // invalidate cache range
  }

#endif

  return (ErrAdr);
}


static DWORD WriteMem (DWORD nAdr, BYTE *pB, DWORD nMany)  {
  DWORD     n1, n, ErrAdr;
  BYTE     *p1;
  DWORD     nA, nM;

  nA = nAdr;                           // save values for caching...
  p1 = pB;
  nM = nMany;

  n = nAdr >> 24;
  if (n == amDATA || n == amIDATA)  {  // write to data/idata
    if ((nAdr & 0xFF) < 0x20)  {       // register bank area
      RegUpToDate = 0;                 // regs might be written...
    }
  }

  while (nMany != 0)  {
    n = (nMany > 256) ? 256 : nMany;
    nMany -= n;
    switch (nAdr >> 24)  {
      case amDATA:
        if ((nAdr & 0xFF) >= 0x80)  {
          if (((nAdr & 0xFF) + n) > 0x100) n1 = 0x100 - (nAdr & 0xFF);
          else                             n1 = n;
          ErrAdr = WriteSFR (pB, nAdr & 0xFF0000FF, n1);
        }
        else  {
          if (((nAdr & 0xFF) + n) > 0x100) n1 = 0x100 - (nAdr & 0xFF);
          else                             n1 = n;
          ErrAdr = WriteData (pB, nAdr & 0xFF0000FF, n1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -