//----------------------------------------------------------------------------- bool SdioCard::writeData(const uint8_t* src) { DBG_IRQSTAT(); const uint32_t* p32 = reinterpret_cast<const uint32_t*>(src); if (!(SDHC_PRSSTAT & SDHC_PRSSTAT_WTA)) { SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; // Don't stop at block gap if last block. Allows auto CMD12. if ((SDHC_BLKATTR & 0XFFFF0000) == 0X10000) { SDHC_PROCTL |= SDHC_PROCTL_CREQ; } else { SDHC_PROCTL |= SDHC_PROCTL_CREQ; SDHC_PROCTL |= SDHC_PROCTL_SABGREQ; } } if (waitTimeout(isBusyFifoWrite)) { return sdError(SD_CARD_ERROR_WRITE_FIFO); } for (uint32_t iw = 0 ; iw < 512/(4*FIFO_WML); iw++) { while (0 == (SDHC_PRSSTAT & SDHC_PRSSTAT_BWEN)) { } for (uint32_t i = 0; i < FIFO_WML; i++) { SDHC_DATPORT = p32[i]; } p32 += FIFO_WML; } if (waitTimeout(isBusyTransferComplete)) { return sdError(SD_CARD_ERROR_WRITE_TIMEOUT); } m_irqstat = SDHC_IRQSTAT; SDHC_IRQSTAT = m_irqstat; return (m_irqstat & SDHC_IRQSTAT_TC) && !(m_irqstat & SDHC_IRQSTAT_ERROR); }
//----------------------------------------------------------------------------- bool SdioCard::readData(uint8_t *dst) { DBG_IRQSTAT(); uint32_t *p32 = reinterpret_cast<uint32_t*>(dst); if (!(SDHC_PRSSTAT & SDHC_PRSSTAT_RTA)) { SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; if ((SDHC_BLKATTR & 0XFFFF0000) == 0X10000) { // Don't stop at block gap if last block. Allows auto CMD12. SDHC_PROCTL |= SDHC_PROCTL_CREQ; } else { noInterrupts(); SDHC_PROCTL |= SDHC_PROCTL_CREQ; SDHC_PROCTL |= SDHC_PROCTL_SABGREQ; interrupts(); } } if (waitTimeout(isBusyFifoRead)) { return sdError(SD_CARD_ERROR_READ_FIFO); } for (uint32_t iw = 0 ; iw < 512/(4*FIFO_WML); iw++) { while (0 == (SDHC_PRSSTAT & SDHC_PRSSTAT_BREN)) { } for (uint32_t i = 0; i < FIFO_WML; i++) { p32[i] = SDHC_DATPORT; } p32 += FIFO_WML; } if (waitTimeout(isBusyTransferComplete)) { return sdError(SD_CARD_ERROR_READ_TIMEOUT); } m_irqstat = SDHC_IRQSTAT; SDHC_IRQSTAT = m_irqstat; return (m_irqstat & SDHC_IRQSTAT_TC) && !(m_irqstat & SDHC_IRQSTAT_ERROR); }
//----------------------------------------------------------------------------- bool SdioCard::erase(uint32_t firstBlock, uint32_t lastBlock) { // check for single block erase if (!m_csd.v1.erase_blk_en) { // erase size mask uint8_t m = (m_csd.v1.sector_size_high << 1) | m_csd.v1.sector_size_low; if ((firstBlock & m) != 0 || ((lastBlock + 1) & m) != 0) { // error card can't erase specified area return sdError(SD_CARD_ERROR_ERASE_SINGLE_BLOCK); } } if (!m_highCapacity) { firstBlock <<= 9; lastBlock <<= 9; } if (!cardCommand(CMD32_XFERTYP, firstBlock)) { return sdError(SD_CARD_ERROR_CMD32); } if (!cardCommand(CMD33_XFERTYP, lastBlock)) { return sdError(SD_CARD_ERROR_CMD33); } if (!cardCommand(CMD38_XFERTYP, 0)) { return sdError(SD_CARD_ERROR_CMD38); } if (waitTimeout(isBusyCMD13)) { return sdError(SD_CARD_ERROR_ERASE_TIMEOUT); } return true; }
//----------------------------------------------------------------------------- static bool cardCommand(uint32_t xfertyp, uint32_t arg) { DBG_IRQSTAT(); if (waitTimeout(isBusyCommandInhibit)) { return false; // Caller will set errorCode. } SDHC_CMDARG = arg; SDHC_XFERTYP = xfertyp; if (waitTimeout(isBusyCommandComplete)) { return false; // Caller will set errorCode. } m_irqstat = SDHC_IRQSTAT; SDHC_IRQSTAT = m_irqstat; return (m_irqstat & SDHC_IRQSTAT_CC) && !(m_irqstat & SDHC_IRQSTAT_CMD_ERROR); }
//----------------------------------------------------------------------------- static bool cardCMD6(uint32_t arg, uint8_t* status) { // CMD6 returns 64 bytes. if (waitTimeout(isBusyCMD13)) { return sdError(SD_CARD_ERROR_CMD13); } enableDmaIrs(); SDHC_DSADDR = (uint32_t)status; SDHC_CMDARG = arg; SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | SDHC_BLKATTR_BLKSIZE(64); SDHC_IRQSIGEN = SDHC_IRQSIGEN_MASK; SDHC_XFERTYP = CMD6_XFERTYP; if (!waitDmaStatus()) { return sdError(SD_CARD_ERROR_CMD6); } return true; }
static asynStatus writeCmd(niport *pniport,const char *buf, int cnt, double timeout,transferState_t nextState) { epicsUInt8 isr2 = pniport->isr2; writeRegister(pniport,AUXMR,AUXTCA); if(!isr2&CO) { printStatus(pniport,"writeCmd !isr2&CO\n"); return asynTimeout; } pniport->bytesRemainingCmd = cnt-1; pniport->nextByteCmd = (buf+1); pniport->transferState = transferStateCmd; pniport->nextTransferState = nextState; pniport->status = asynSuccess; writeRegister(pniport,CDOR,buf[0]); waitTimeout(pniport,timeout); return pniport->status; }
TypingTimeLord::TypingTimeLord(std::shared_ptr<AudioPlayer> player, QObject* parent) : QObject(parent), m_player(player) { QObject::connect(m_player.get(), SIGNAL(stateChanged()), this, SLOT(playerStateChanged())); // Load the timeout values QSettings settings; settings.beginGroup(CFG_GROUP); m_wait_timeout = settings.value(CFG_WAITING, m_wait_timeout).toUInt(); m_type_timeout = settings.value(CFG_TYPING, m_type_timeout).toUInt(); settings.endGroup(); // Initialize the timers to single shot timers and connect them to their // respective fallbacks; m_wait_timer.setSingleShot(true); m_type_timer.setSingleShot(true); connect(&m_wait_timer, SIGNAL(timeout()), this, SLOT(waitTimeout())); connect(&m_type_timer, SIGNAL(timeout()), this, SLOT(typeTimeout())); }