//return false if there was not enough space left BOOL LPC24XX_DAC_Driver::AddFrame(short const * const Samples, UINT32 const SamplesNum) { if(g_LPC24XX_DAC_Driver.SampleTimeInCycles == 0) return FALSE; if(g_LPC24XX_DAC_Driver.FrameCount >= DAC_FRAME_BUFFERS_NUM) return FALSE; if(SamplesNum > DAC_FRAME_BUFFER_SIZE_SAMPLES) return FALSE; if(g_LPC24XX_DAC_Driver.nextFrameWrite==DAC_FRAME_BUFFERS_NUM) g_LPC24XX_DAC_Driver.nextFrameWrite = 0; UINT32 nextFrameWriteOffset = g_LPC24XX_DAC_Driver.nextFrameWrite*DAC_FRAME_BUFFER_SIZE_SAMPLES; for(int i=0; i < SamplesNum; i++) { g_LPC24XX_DAC_Driver.SamplesBuffer[nextFrameWriteOffset+i] = Samples[i]; } g_LPC24XX_DAC_Driver.SamplesInFrame[g_LPC24XX_DAC_Driver.nextFrameWrite] = SamplesNum; g_LPC24XX_DAC_Driver.nextFrameWrite++; //disable output timer IRQ BOOL wasEnabled = CPU_INTC_InterruptDisable( LPC24XX_TIMER::getIntNo(LPC24XX_DAC::Timer)); g_LPC24XX_DAC_Driver.FrameCount++; g_LPC24XX_DAC_Driver.SampleCount+=SamplesNum; //re-enable output timer IRQ if(wasEnabled) CPU_INTC_InterruptEnable( LPC24XX_TIMER::getIntNo(LPC24XX_DAC::Timer)); //debug_printf("SampleCount: %d\r\n", g_LPC24XX_DAC_Driver.SampleCount); //debug_printf("FrameCount: %d\r\n", g_LPC24XX_DAC_Driver.FrameCount); //debug_printf("nextFrameWrite: %d\r\n", g_LPC24XX_DAC_Driver.nextFrameWrite); //debug_printf("nextFrameRead: %d\r\n", g_LPC24XX_DAC_Driver.nextFrameRead); //for (int i = 0 ; i < DAC_FRAME_BUFFERS_NUM; i++) //{ // debug_printf("SamplesInFrame[%d]: %d\r\n", i, g_LPC24XX_DAC_Driver.SamplesInFrame[i]); //} return TRUE; }
BOOL SD_BS_Driver::ChipInitialize(void *context) { SD_BLOCK_CONFIG *config = (SD_BLOCK_CONFIG*)context; if(!config || !config->BlockDeviceInformation) { return FALSE; } BlockDeviceInfo *pDevInfo = config->BlockDeviceInformation; UINT32 alternate = 0x1C2; CPU_GPIO_DisablePin(PC8_SD_D0, RESISTOR_PULLUP, 0, (GPIO_ALT_MODE)alternate); CPU_GPIO_DisablePin(PC9_SD_D1, RESISTOR_PULLUP, 0, (GPIO_ALT_MODE)alternate); CPU_GPIO_DisablePin(PC10_SD_D2, RESISTOR_PULLUP, 0, (GPIO_ALT_MODE)alternate); CPU_GPIO_DisablePin(PC11_SD_D3, RESISTOR_PULLUP, 0, (GPIO_ALT_MODE)alternate); CPU_GPIO_DisablePin(PC12_SD_CLK, RESISTOR_DISABLED, 0, (GPIO_ALT_MODE)alternate); CPU_GPIO_DisablePin(PD2_SD_CMD, RESISTOR_PULLUP, 0, (GPIO_ALT_MODE)alternate); CPU_GPIO_ReservePin( PC8_SD_D0, TRUE ); CPU_GPIO_ReservePin( PC9_SD_D1, TRUE ); CPU_GPIO_ReservePin( PC10_SD_D2, TRUE ); CPU_GPIO_ReservePin( PC11_SD_D3, TRUE ); CPU_GPIO_ReservePin( PC12_SD_CLK, TRUE ); CPU_GPIO_ReservePin( PD2_SD_CMD, TRUE ); RCC->APB2ENR |= (1 << 11); CPU_INTC_ActivateInterrupt( /*UINT32 Irq_Index*/SDIO_IRQn, /*HAL_CALLBACK_FPN ISR*/SDIO_IRQHandler, /*void* ISR_Param*/0 ); __IO SD_Error errorstatus = SD_OK; //errorstatus = SD_PowerON(); errorstatus = SD_Init(); CPU_INTC_InterruptEnable( /*UINT32 Irq_Index*/SDIO_IRQn ); memset(pBuffer, 0xFF, 512); errorstatus = SD_ReadBlock(pBuffer, 0, 512); //errorstatus = SD_WaitReadOperation(); //while(SD_GetStatus() != SD_TRANSFER_OK); if (SD_GetStatus() != SD_TRANSFER_OK) { if (SD_GetStatus_WithTimeOut(SD_INITIALIZE_TIMEOUT)== FALSE) return FALSE; } //CPU_FlushCaches(); // // Variables to setup SD Card Dynamically. // //BYTE regCSD[16]; <-- Not used because we have better register access. BYTE C_SIZE_MULT = 0; BYTE TAAC, NSAC, MAX_RAN_SPEED, READ_BL_LEN, SECTOR_SIZE; BOOL ERASE_BL_EN; UINT32 C_SIZE; UINT64 MemCapacity = 0; //total memory size, in unit of byte TAAC = SDCardInfo.SD_csd.TAAC; // regCSD[1]; /* STM // Original */ NSAC = SDCardInfo.SD_csd.NSAC; // regCSD[2]; /* STM // Original */ MAX_RAN_SPEED = SDCardInfo.SD_csd.MaxBusClkFrec; // regCSD[3]; /* STM // Original */ READ_BL_LEN = SDCardInfo.SD_csd.RdBlockLen; // regCSD[5] &0x0F; /* STM // Original */ // Checks to see if the SD card is Version 1.0: Standard or Version 2.0: High Capacity if(SDCardInfo.SD_csd.CSDStruct == 0x00) /*if(regCSD[0] == 0x00)*/ // SD Version1.0 { C_SIZE = SDCardInfo.SD_csd.DeviceSize; // ((regCSD[6] &0x3) << 10) | (regCSD[7] << 2) | ((regCSD[8] &0xC0) >> 6); /* STM // Original */ C_SIZE_MULT = SDCardInfo.SD_csd.DeviceSizeMul; // ((regCSD[9] &0x03) << 1) | ((regCSD[10] &0x80) >> 7); /* STM // Original */ ERASE_BL_EN = (SDCardInfo.SD_csd.EraseGrSize == 0x00) ? FALSE : TRUE; // ((regCSD[10] &0x40) == 0x00) ? FALSE : TRUE; /* STM // Original */ SECTOR_SIZE = SDCardInfo.SD_csd.EraseGrMul; // ((regCSD[10] &0x3F) << 1) | ((regCSD[11] &0x80) >> 7); /* STM // Original */ MemCapacity = SDCardInfo.CardCapacity; // (C_SIZE + 1) * (0x1 << (C_SIZE_MULT + 2)) * (0x1 << READ_BL_LEN); /* STM // Original */ IsSDCardHC = FALSE; } else // SD Version2.0 { C_SIZE = SDCardInfo.SD_csd.DeviceSize; // ((regCSD[7] &0x3F) << 16) | (regCSD[8] << 8) | regCSD[9]; /* STM // Original */ ERASE_BL_EN = (SDCardInfo.SD_csd.EraseGrSize == 0x00) ? FALSE : TRUE; // ((regCSD[10] &0x40) == 0x00) ? FALSE : TRUE; /* STM // Original */ SECTOR_SIZE = SDCardInfo.SD_csd.EraseGrMul; // ((regCSD[10] &0x3F) << 1) | ((regCSD[11] &0x80) >> 7); /* STM // Original */ MemCapacity = SDCardInfo.CardCapacity; // (C_SIZE + 1) * 512 * 1024; /* STM // Original */ IsSDCardHC = TRUE; } //Update SD config according to CSD register UINT32 SectorsPerBlock = (ERASE_BL_EN == TRUE) ? 1 : (SECTOR_SIZE + 1); pDevInfo->BytesPerSector = 512; // data bytes per sector is always 512 pDevInfo->Size = (ByteAddress)MemCapacity; BlockRegionInfo* pRegions = (BlockRegionInfo*)&pDevInfo->Regions[0]; pRegions[0].BytesPerBlock = SectorsPerBlock * pDevInfo->BytesPerSector; pRegions[0].NumBlocks = (UINT32)(MemCapacity / pRegions[0].BytesPerBlock); BlockRange* pRanges = (BlockRange*)&pRegions[0].BlockRanges[0]; pRanges[0].StartBlock = 0; pRanges[0].EndBlock = pRegions[0].NumBlocks-1; return TRUE; }