//! 2.2.6.2 Read Value from Register //! //! @param dnRegNumber //! @param drvValue //! USBDM_GDI_API DiReturnT DiRegisterRead ( DiUInt32T dnRegNumber, pDiRegisterValueT drvValue ) { unsigned long dataValue = 0xDEADBEEF; USBDM_ErrorCode rc = BDM_RC_OK; Logging::print("DiRegisterRead(0x%X(%d))\n", dnRegNumber, dnRegNumber); CHECK_ERROR_STATE(); if (dnRegNumber>=cfv234regID_FIRST_DEBUG_REG) { dnRegNumber -= cfv234regID_FIRST_DEBUG_REG; rc = USBDM_ReadDReg(dnRegNumber,&dataValue); Logging::print("DiRegisterRead(0x%X(%s) => 0x%08X)\n", dnRegNumber, getCFVxDebugRegName(dnRegNumber), (uint32_t)dataValue); } else if (dnRegNumber >= cfv234regID_FIRST_CONTROL_REG) { dnRegNumber -= cfv234regID_FIRST_CONTROL_REG; rc = USBDM_ReadCReg(dnRegNumber,&dataValue); Logging::print("DiRegisterRead(0x%X(%s) => 0x%08X)\n", dnRegNumber, getCFVxControlRegName(dnRegNumber), (uint32_t)dataValue); } else { switch (dnRegNumber) { case cfv234regID_pc : rc = USBDM_ReadCReg(CFVx_CRegPC,&dataValue); Logging::print("DiRegisterRead(0x%X(%s) => 0x%08X)\n", CFVx_CRegPC, getCFVxControlRegName(CFVx_CRegPC), (uint32_t)dataValue); break; case cfv234regID_sr : rc = USBDM_ReadCReg(CFVx_CRegSR,&dataValue); Logging::print("DiRegisterRead(0x%X(%s) => 0x%08X)\n", CFVx_CRegSR, getCFVxControlRegName(CFVx_CRegSR), (uint32_t)dataValue); break; default : // D0-7, A0-7 if (dnRegNumber<=cfv234regID_a7) { rc = USBDM_ReadReg(dnRegNumber,&dataValue); Logging::print("DiRegisterRead(0x%X(%s) => 0x%08X)\n", dnRegNumber, getCFVxRegName(dnRegNumber), (uint32_t)dataValue); } else { Logging::print("DiRegisterRead(Illegal reg# = 0x%X (%d)\n", dnRegNumber, dnRegNumber); rc = BDM_RC_ILLEGAL_PARAMS; } break; } } if (rc != BDM_RC_OK) { Logging::print("DiRegisterRead(0x%X) => error\n", dnRegNumber); return setErrorState(DI_ERR_NONFATAL, rc); } *drvValue = (U32c)dataValue; Logging::print("0x%X(%d) => 0x%08X\n", dnRegNumber, dnRegNumber, dataValue); return setErrorState(DI_OK); }
//! 2.2.8.6 Get DI Execution/Exit Status //! //! @param pdesExitStatus //! //! @return \n //! DI_OK => OK \n //! DI_ERR_FATAL => Error see \ref currentErrorString //! USBDM_GDI_DECLSPEC DiReturnT DiExecGetStatus ( pDiExitStatusT pdesExitStatus ) { LOGGING; USBDM_ErrorCode BDMrc; static DiExitCauseT lastStatus = DI_WAIT_USER; // Defaults pdesExitStatus->dscCause = DI_WAIT_UNKNOWN; pdesExitStatus->dwBpId = 0; // bkpt ID? pdesExitStatus->szReason = (DiStringT)"unknown state"; if (bdmOptions.autoReconnect) { USBDM_ErrorCode bdmRc = bdmInterface->targetConnectWithRetry(softConnectOptions); if (bdmRc != BDM_RC_OK) { log.print("=> DI_ERR_COMMUNICATION\n"); return setErrorState(DI_ERR_COMMUNICATION, bdmRc); } } log.print("Calling USBDM_GetBDMStatus()\n"); USBDMStatus_t USBDMStatus; USBDM_GetBDMStatus(&USBDMStatus); // pdesExitStatus->szReason = (DiStringT)getBDMStatusName(&USBDMStatus); if (USBDMStatus.connection_state == SPEED_NO_INFO) { log.print("=> NO_INFO\n"); return setErrorState(DI_OK); // log.print("DiExecGetStatus()=>DI_ERR_COMMUNICATION\n"); // return setErrorState(DI_ERR_NONFATAL, "Connection with target lost"); } if (USBDMStatus.reset_recent == RESET_DETECTED) { log.print("=> Target has been reset\n"); mtwksDisplayLine("Target RESET detected\n"); } unsigned long status; BDMrc = USBDM_ReadStatusReg(&status); if (BDMrc != BDM_RC_OK) { log.print("=> Status read failed\n"); return setErrorState(DI_OK); // return setErrorState(DI_ERR_NONFATAL, BDMrc); } if ((status&CFV1_XCSR_ENBDM) == 0) { log.print("=> ENBDM=0\n"); return setErrorState(DI_OK); // log.print("DiExecGetStatus()=>DI_ERR_NONFATAL\n"); // return setErrorState(DI_ERR_NONFATAL, "Connection with target lost"); } if ((status&CFV1_XCSR_STOP) != 0) { // Stopped - low power sleep, treated as running // pdesExitStatus->dscCause = DI_WAIT_EXTERNAL|DI_WAIT_MISCELLANEOUS; pdesExitStatus->dscCause = DI_WAIT_RUNNING; pdesExitStatus->szReason = (DiStringT)"Target Stopped (Low power)..."; if (lastStatus != pdesExitStatus->dscCause) { // log.print("DiExecGetStatus() status change => DI_WAIT_EXTERNAL|DI_WAIT_MISCELLANEOUS, (%s)\n", log.print("DiExecGetStatus() status change => DI_WAIT_RUNNING, (%s)\n", pdesExitStatus->szReason); } } else if ((status&CFV1_XCSR_HALT) != 0) { // Halted - in debug halted mode pdesExitStatus->dscCause = DI_WAIT_MISCELLANEOUS; pdesExitStatus->szReason = (DiStringT)"Debug Halted"; if (lastStatus != pdesExitStatus->dscCause) { log.print("Status change => DI_WAIT_MISCELLANEOUS, (%s)\n", pdesExitStatus->szReason); #if (TARGET==CFV1) && defined(CONVERT_RESETS_TO_EXCEPTIONS) // Read-write PC on halt // This causes Illegal Operand and Address Errors to be converted from // Resets to Exceptions. // Without this code the debugger is a bit misleading as it halts at the // start of the exception handler but then does the reset on resume! unsigned long PCValue; USBDM_ReadCReg(CFV1_CRegPC, &PCValue); USBDM_WriteCReg(CFV1_CRegPC, PCValue); #endif } } else { // Processor executing pdesExitStatus->dscCause = DI_WAIT_RUNNING; pdesExitStatus->szReason = (DiStringT)"Running"; if (lastStatus != pdesExitStatus->dscCause) { log.print("Status change => DI_WAIT_RUNNING, (%s)\n", pdesExitStatus->szReason); } } log.print("Reason = %s\n", pdesExitStatus->szReason); lastStatus = pdesExitStatus->dscCause; return setErrorState(DI_OK); }
//! 2.2.6.2 Read Value from Register //! //! @param dnRegNumber //! @param drvValue //! USBDM_GDI_DECLSPEC DiReturnT DiRegisterRead ( DiUInt32T dnRegNumber, pDiRegisterValueT drvValue ) { LOGGING; log.print("0x%X(%d)\n", dnRegNumber, dnRegNumber); unsigned long dataValue = 0xDEADBEEF; USBDM_ErrorCode rc = BDM_RC_OK; log.print("0x%X(%d)\n", dnRegNumber, dnRegNumber); if (forceMassErase) { // Dummy register reads until device in unsecured *drvValue = (U32c)dataValue; return setErrorState(DI_OK); } CHECK_ERROR_STATE(); if (dnRegNumber>cfv1regID_FIRST_DEBUG_regID_BYTE) switch (dnRegNumber) { case cfv1regID_xcsr_byte : rc = USBDM_ReadStatusReg(&dataValue); break; case cfv1regID_csr2_byte : rc = USBDM_ReadDReg(CFV1_DRegCSR2byte,&dataValue); break; case cfv1regID_csr3_byte : rc = USBDM_ReadDReg(CFV1_DRegCSR3byte,&dataValue); break; default : log.print("DiRegisterRead(Illegal Reg# 0x%X(%d)\n", dnRegNumber, dnRegNumber); rc = BDM_RC_ILLEGAL_PARAMS; break; } else if (dnRegNumber>cfv1regID_FIRST_DEBUG_REG) rc = USBDM_ReadDReg(dnRegNumber-cfv1regID_FIRST_DEBUG_REG,&dataValue); else if (dnRegNumber > cfv1regID_FIRST_CONTROL_REG) rc = USBDM_ReadCReg(dnRegNumber-cfv1regID_FIRST_CONTROL_REG,&dataValue); else { switch (dnRegNumber) { case cfv1regID_pc : rc = USBDM_ReadCReg(CFV1_CRegPC,&dataValue); break; case cfv1regID_sr : rc = USBDM_ReadCReg(CFV1_CRegSR,&dataValue); break; default : // D0-7, A0-7 if (dnRegNumber>15) { log.print("DiRegisterRead(Illegal Reg# 0x%X(%d)\n", dnRegNumber, dnRegNumber); rc = BDM_RC_ILLEGAL_PARAMS; } else rc = USBDM_ReadReg(dnRegNumber,&dataValue); break; } } if (rc != BDM_RC_OK) { log.print("DiRegisterRead(0x%X) => error\n", dnRegNumber); return setErrorState(DI_ERR_NONFATAL, rc); } *drvValue = (U32c)dataValue; log.print("0x%lX(%ld) => 0x%08lX\n", (unsigned long)dnRegNumber, (unsigned long)dnRegNumber, (unsigned long)dataValue); return setErrorState(DI_OK); }
//! (CFv1) Read Control register //! //! @param regNo Register # //! //! @return 32-bit number //! OSBDM_API unsigned int _opensourcebdm_read_creg(unsigned char regNo) { unsigned long value; USBDM_ReadCReg(regNo, &value); return value; }
USBDM_ErrorCode BdmInterface_CFV1::readPC(unsigned long *regValue) { return USBDM_ReadCReg(CFV1_CRegPC, regValue); };