From c8a29d8802f436115664cc640faa8389cb4beb19 Mon Sep 17 00:00:00 2001 From: areviu Date: Mon, 15 Jan 2018 21:08:56 +0000 Subject: removed legacy code for pmc git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11288 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc.c | 6 +- os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc.h | 1 - os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_device.c | 142 +--- os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_pmc.c | 835 ----------------------- os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_pmc.h | 50 -- os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_sama5d2.h | 44 -- os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_tc.c | 258 ------- os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_tc.h | 21 - os/hal/ports/SAMA/LLD/SDMMCv1/driver.mk | 4 +- os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_conf.h | 3 - os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_lld.c | 6 +- os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_lld.h | 12 +- 12 files changed, 42 insertions(+), 1340 deletions(-) delete mode 100644 os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_pmc.c delete mode 100644 os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_pmc.h delete mode 100644 os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_tc.c delete mode 100644 os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_tc.h (limited to 'os/hal/ports/SAMA/LLD') diff --git a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc.c b/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc.c index aabf0d153..e8bf714ce 100644 --- a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc.c +++ b/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc.c @@ -98,7 +98,7 @@ void SdMmcUpdateInformation(SdmmcDriver *drv, bool csd, bool extData) uint8_t SDMMC_Lib_SdStart(SdmmcDriver *drv, bool * retry) { uint64_t mem_size; - //uint32_t freq; + uint32_t freq; uint32_t drv_err, status; uint8_t error; bool flag; @@ -272,7 +272,7 @@ uint8_t SDMMC_Lib_SdStart(SdmmcDriver *drv, bool * retry) error = HwSetClock(drv, &freq); drv->card.dwCurrSpeed = freq; if (error != SDMMC_OK && error != SDMMC_CHANGED) { - TRACE_ERROR_1("clk %s\n\r", SD_StringifyRetCode(error)); + TRACE_ERROR_1("error clk %s\n\r", SD_StringifyRetCode(error)); return error; } #endif @@ -286,7 +286,7 @@ uint8_t SDMMC_Lib_SdStart(SdmmcDriver *drv, bool * retry) //warning if (status) { - TRACE_WARNING_1("st %lx\n\r", status); + TRACE_WARNING_1("warning st %lx\n\r", status); } return SDMMC_OK; diff --git a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc.h b/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc.h index f675996e4..29f1119da 100644 --- a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc.h +++ b/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc.h @@ -164,7 +164,6 @@ typedef enum { #define CARD_SDHCCOMBO (CARD_TYPE_bmSDIO|CARD_SDHC) #include "ch_sdmmc_macros.h" -#include "ch_sdmmc_pmc.h" #include "ch_sdmmc_trace.h" extern const uint16_t sdmmcTransUnits[8]; diff --git a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_device.c b/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_device.c index 9c1163d95..3f1ad6852 100644 --- a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_device.c +++ b/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_device.c @@ -6,8 +6,6 @@ #include "sama_sdmmc_lld.h" #include "ch_sdmmc_device.h" #include "ch_sdmmc_cmds.h" -#include "ch_sdmmc_pmc.h" -#include "ch_sdmmc_tc.h" #include "ch_sdmmc_sdio.h" #include "ch_sdmmc_sd.h" #include "ch_sdmmc_mmc.h" @@ -67,16 +65,8 @@ uint8_t sdmmc_device_lowlevelcfg(SdmmcDriver *driver) uint8_t res; - pmc_set_main_oscillator_freq(BOARD_MAIN_CLOCK_EXT_OSC); - - TRACE_INFO_1("Processor clock: %u MHz\r\n", ((unsigned)(pmc_get_processor_clock() / 1000000) )); - TRACE_INFO_1("Master clock: %u MHz\r\n", ((unsigned)(pmc_get_master_clock() / 1000000)) ); - -#if SDMMC_USE_TC == 1 - driver->tctimer_id = get_tc_id_from_addr(driver->config->tctimer,driver->config->tc_chan); - pmc_configure_peripheral(driver->tctimer_id, NULL, true); -#endif - + TRACE_INFO_1("Processor clock: %u MHz\r\n", ((unsigned)(SAMA_PCK / 1000000) )); + TRACE_INFO_1("Master clock: %u MHz\r\n", ((unsigned)(SAMA_MCK / 1000000)) ); if (driver->config->slot_id == SDMMC_SLOT0) { driver->regs = SDMMC0; @@ -88,18 +78,6 @@ uint8_t sdmmc_device_lowlevelcfg(SdmmcDriver *driver) ; } - pmc_configure_peripheral((SDMMC_SLOT0 + driver->config->slot_id), NULL, true); - - if (driver->config->use_fastest_clock) { - - pmc_enable_upll_clock(); - pmc_enable_upll_bias(); - } - - pmc_configure_peripheral((SDMMC_SLOT0 + driver->config->slot_id), - &driver->config->pmccfg, true); - - switch (driver->config->slot_id) { case SDMMC_SLOT0: { @@ -112,31 +90,25 @@ uint8_t sdmmc_device_lowlevelcfg(SdmmcDriver *driver) /* Configure SDMMC0 pins */ /** SDMMC0 pin Card Detect (CD) */ - //#define PIN_SDMMC0_CD_IOS1 { PIO_GROUP_A, PIO_PA13A_SDMMC0_CD, PIO_PERIPH_A, PIO_PULLUP } - palSetGroupMode(PIOA, PIO_PA13A_SDMMC0_CD, 0U, + palSetGroupMode(PIOA, (1u << PIOA_PIN13), 0U, PAL_SAMA_FUNC_PERIPH_A | PAL_MODE_INPUT_PULLUP); /** SDMMC0 pin Card Clock (CK) */ - //#define PIN_SDMMC0_CK_IOS1 { PIO_GROUP_A, PIO_PA0A_SDMMC0_CK, PIO_PERIPH_A, PIO_DEFAULT } - palSetGroupMode(PIOA, PIO_PA0A_SDMMC0_CK, 0U, PAL_SAMA_FUNC_PERIPH_A); + palSetGroupMode(PIOA, (1u << 0), 0U, PAL_SAMA_FUNC_PERIPH_A); /** SDMMC0 pin Card Command (CMD) */ - //#define PIN_SDMMC0_CMD_IOS1 { PIO_GROUP_A, PIO_PA1A_SDMMC0_CMD, PIO_PERIPH_A, PIO_PULLUP } - palSetGroupMode(PIOA, PIO_PA1A_SDMMC0_CMD, 0U, + palSetGroupMode(PIOA, (1u << PIOA_PIN1), 0U, PAL_SAMA_FUNC_PERIPH_A | PAL_MODE_INPUT_PULLUP); /** SDMMC0 pin Card Reset (RSTN) */ - //#define PIN_SDMMC0_RSTN_IOS1 { PIO_GROUP_A, PIO_PA10A_SDMMC0_RSTN, PIO_PERIPH_A, PIO_PULLUP } - palSetGroupMode(PIOA, PIO_PA10A_SDMMC0_RSTN, 0U, + palSetGroupMode(PIOA, (1u << PIOA_PIN10), 0U, PAL_SAMA_FUNC_PERIPH_A | PAL_MODE_INPUT_PULLUP); /** SDMMC0 pin VDD Selection (VDDSEL) */ - //#define PIN_SDMMC0_VDDSEL_IOS1 { PIO_GROUP_A, PIO_PA11A_SDMMC0_VDDSEL, PIO_PERIPH_A, PIO_DEFAULT } - palSetGroupMode(PIOA, PIO_PA11A_SDMMC0_VDDSEL, 0U, + palSetGroupMode(PIOA, (1u << PIOA_PIN11), 0U, PAL_SAMA_FUNC_PERIPH_A); /** SDMMC0 pin 8-bit Data (DA0-7) */ - //#define PINS_SDMMC0_DATA8B_IOS1 { PIO_GROUP_A, 0x000003fc, PIO_PERIPH_A, PIO_PULLUP } palSetGroupMode(PIOA, 0x000003fc, 0U, PAL_SAMA_FUNC_PERIPH_A | PAL_MODE_INPUT_PULLUP); @@ -152,22 +124,18 @@ uint8_t sdmmc_device_lowlevelcfg(SdmmcDriver *driver) sdmmc_set_capabilities(SDMMC1, caps0, CAPS0_MASK, 0, 0); /* Configure SDMMC1 pins */ - /** SDMMC1 pin Card Detect (CD) */ - palSetGroupMode(PIOA, PIO_PA30E_SDMMC1_CD, 0U, + palSetGroupMode(PIOA, (1u << PIOA_PIN30), 0U, PAL_SAMA_FUNC_PERIPH_E | PAL_MODE_INPUT_PULLUP); /** SDMMC1 pin Card Clock (CK) */ - // #define PIN_SDMMC1_CK_IOS1 { PIO_GROUP_A, PIO_PA22E_SDMMC1_CK, PIO_PERIPH_E, PIO_DEFAULT } - palSetGroupMode(PIOA, PIO_PA22E_SDMMC1_CK, 0U, PAL_SAMA_FUNC_PERIPH_E); + palSetGroupMode(PIOA, (1u << PIOA_PIN22), 0U, PAL_SAMA_FUNC_PERIPH_E); /** SDMMC1 pin Card Command (CMD) */ - //#define PIN_SDMMC1_CMD_IOS1 { PIO_GROUP_A, PIO_PA28E_SDMMC1_CMD, PIO_PERIPH_E, PIO_PULLUP } - palSetGroupMode(PIOA, PIO_PA28E_SDMMC1_CMD, 0U, + palSetGroupMode(PIOA, (1u << PIOA_PIN28), 0U, PAL_SAMA_FUNC_PERIPH_E | PAL_MODE_INPUT_PULLUP); /** SDMMC1 pin 4-bit Data (DA0-3) */ - //#define PINS_SDMMC1_DATA4B_IOS1 { PIO_GROUP_A, 0x003c0000, PIO_PERIPH_E, PIO_PULLUP } palSetGroupMode(PIOA, 0x003c0000, 0U, PAL_SAMA_FUNC_PERIPH_E | PAL_MODE_INPUT_PULLUP); @@ -189,8 +157,7 @@ uint8_t sdmmc_device_lowlevelcfg(SdmmcDriver *driver) driver->config->data_buf_size); res &= IS_CACHE_ALIGNED(driver->card.EXT); TRACE_DEBUG_2("check libExt %d %08x\r\n", res, driver->card.EXT); - //res &= IS_CACHE_ALIGNED(sizeof(driver->card.EXT)); - //TRACE_2("check size libExt %d %08x\r\n",rc,sizeof(driver->card.EXT)); + if (!res) { TRACE_WARNING("WARNING: buffers are not aligned on data cache lines. Please fix this before enabling DMA.\n\r"); @@ -218,16 +185,10 @@ bool sdmmc_device_initialize(SdmmcDriver *driver) driver->blk_size = (val <= 0x2 ? (512 << val) : 512); - //Configure the TC Timer -#if SDMMC_USE_TC == 1 - pmc_configure_peripheral(driver->tctimer_id, NULL, true); - tc_configure(driver->config->tctimer, driver->config->tc_chan, TC_CMR_WAVE | TC_CMR_WAVSEL_UP | TC_CMR_CPCDIS | TC_CMR_BURST_NONE | TC_CMR_TCCLKS_TIMER_CLOCK2); - driver->config->tctimer->TC_CHANNEL[driver->config->tc_chan].TC_EMR |= TC_EMR_NODIVCLK; -#endif /* Perform the initial I/O calibration sequence, manually. * Allow tSTARTUP = 2 usec for the analog circuitry to start up. * CNTVAL = fHCLOCK / (4 * (1 / tSTARTUP)) */ - val = pmc_get_peripheral_clock(ID_SDMMC0+driver->config->slot_id); + val = SAMA_MCK; val = ROUND_INT_DIV(val, 4 * 500000UL); @@ -247,7 +208,7 @@ bool sdmmc_device_initialize(SdmmcDriver *driver) for (exp = 31, power = 1UL << 31; !(val & power) && power != 0; exp--, power >>= 1) ; if (power == 0) { - //trace_warning("FTEOCLK is unknown\n\r"); + TRACE_DEBUG("FTEOCLK is unknown\n\r"); exp = max_exp; } else { @@ -304,10 +265,6 @@ uint8_t sdmmc_device_start(SdmmcDriver *drv) return error; } - //if (SD_GetStatus(drv) == SDMMC_NOT_SUPPORTED) { - // TRACE("Device not detected.\n\r"); - // return SDMMC_NOT_SUPPORTED; - // } /* Initialization delay: The maximum of 1 msec, 74 clock cycles and supply * ramp up time. Supply ramp up time provides the time that the power is @@ -425,23 +382,6 @@ void sdmmc_device_deInit(SdmmcDriver *drv) Fetch: /* Fetch normal events */ events = regs->SDMMC_NISTR; -#if SDMMC_USE_TC == 1 - if (driver->use_polling) { - - if ( - driver->expect_auto_end - && !(driver->config->tctimer->TC_CHANNEL[driver->config->tc_chan].TC_SR & TC_SR_CLKSTA) - ) - events |= SDMMC_NISTR_CUSTOM_EVT; - - - } else { - if (driver->expect_auto_end) { - while (driver->config->tctimer->TC_CHANNEL[driver->config->tc_chan].TC_SR & TC_SR_CLKSTA); - events |= SDMMC_NISTR_CUSTOM_EVT; - } - } -#else if (driver->expect_auto_end) { @@ -449,8 +389,6 @@ void sdmmc_device_deInit(SdmmcDriver *drv) events |= SDMMC_NISTR_CUSTOM_EVT; } - -#endif if (!events) return; //TRACE_1("events %08x\n\r",events); @@ -669,9 +607,7 @@ void sdmmc_device_deInit(SdmmcDriver *drv) * Counter for this purpose. */ if (has_data && (cmd->bCmd == 18 || cmd->bCmd == 25) && !driver->use_set_blk_cnt) { -#if SDMMC_USE_TC == 1 - driver->config->tctimer->TC_CHANNEL[driver->config->tc_chan].TC_CCR = TC_CCR_CLKEN | TC_CCR_SWTRG; -#endif + driver->expect_auto_end = true; //#ifndef NDEBUG // if (!set->cmd_line_released) @@ -742,12 +678,9 @@ void sdmmc_device_deInit(SdmmcDriver *drv) && cmd->dwArg & 1ul << 31 && !cmd->cmdOp.bmBits.checkBsy)) { /* Currently in the function switching period, wait for the * delay preconfigured in sdmmc_send_command(). */ -#if SDMMC_USE_TC == 1 - driver->config->tctimer->TC_CHANNEL[driver->config->tc_chan].TC_CCR = TC_CCR_CLKEN | TC_CCR_SWTRG; - while (driver->config->tctimer->TC_CHANNEL[driver->config->tc_chan].TC_SR & TC_SR_CLKSTA) ; -#else + while ( chSysIsCounterWithinX(chSysGetRealtimeCounterX(),driver->start_cycles ,driver->start_cycles+driver->timeout_cycles) ); -#endif + } /* Release this command */ @@ -799,7 +732,7 @@ void sdmmc_device_deInit(SdmmcDriver *drv) * is 32 whereas the real value is 40.5 */ mult_freq = (regs->SDMMC_CA1R & SDMMC_CA1R_CLKMULT_Msk) >> SDMMC_CA1R_CLKMULT_Pos; if (mult_freq != 0) - #if 0 + #if 1 mult_freq = base_freq * (mult_freq + 1); #else mult_freq = pmc_get_gck_clock(ID_SDMMC0+driver->config->slot_id); @@ -888,9 +821,6 @@ void sdmmc_device_deInit(SdmmcDriver *drv) uint32_t eister; uint32_t mask; uint32_t len; -#if SDMMC_USE_TC == 1 - uint32_t cycles; -#endif uint16_t cr; uint16_t tmr; @@ -1113,16 +1043,10 @@ void sdmmc_device_deInit(SdmmcDriver *drv) * bits, hence 48 device clock cycles. * The sum of the above timings is the maximum time CMD12 will * take to complete. */ -#if SDMMC_USE_TC == 1 - cycles = pmc_get_peripheral_clock(driver->tctimer_id) / (driver->dev_freq / (2ul + 64ul + 48ul)); - TRACE_DEBUG_1("[command] has_data wait %d cycles\r\n",cycles); - /* The Timer operates with RC >= 1 */ - driver->config->tctimer->TC_CHANNEL[driver->config->tc_chan].TC_RC = max_u32(cycles, 1); -#else driver->timeout_cycles = 2+64+48; driver->start_cycles = chSysGetRealtimeCounterX(); -#endif + } /* With SD devices, the 8-cycle function switching period will apply, @@ -1130,14 +1054,10 @@ void sdmmc_device_deInit(SdmmcDriver *drv) * Note that MMC devices don't require this fixed delay, but regarding * GO_IDLE_STATE we have no mean to filter the MMC requests out. */ else if (wait_switch) { -#if SDMMC_USE_TC == 1 - cycles = pmc_get_peripheral_clock(driver->tctimer_id) / (driver->dev_freq / 8ul); - TRACE_DEBUG_1("[command] wait_switch %d cycles\r\n",cycles); - driver->config->tctimer->TC_CHANNEL[driver->config->tc_chan].TC_RC = max_u32(cycles, 1); -#else + driver->timeout_ticks = 8; driver->start_cycles = chSysGetRealtimeCounterX(); -#endif + } if (!driver->use_polling) { regs->SDMMC_NISIER |= SDMMC_NISIER_BRDRDY | SDMMC_NISIER_BWRRDY | SDMMC_NISIER_TRFC | SDMMC_NISIER_CMDC | SDMMC_NISIER_CINT; @@ -1160,18 +1080,16 @@ void sdmmc_device_deInit(SdmmcDriver *drv) */ uint32_t sdmmc_device_control(SdmmcDriver *driver, uint32_t bCtl) { - //osalDbgCheck(driver); - //struct sdmmc_set *set = (struct sdmmc_set *)_set; uint32_t rc = SDMMC_OK; - //uint32_t*param_u32 = (uint32_t *)param; + uint8_t byte; - //#if TRACE_LEVEL >= TRACE_LEVEL_DEBUG + if (bCtl != SDMMC_IOCTL_BUSY_CHECK && bCtl != SDMMC_IOCTL_GET_DEVICE) { TRACE_DEBUG_2("SDMMC_IOCTL_%s(%lu)\n\r", SD_StringifyIOCtrl(bCtl),driver->control_param ); } - //#endif + switch (bCtl) { case SDMMC_IOCTL_GET_DEVICE: @@ -1361,12 +1279,12 @@ void sdmmc_device_deInit(SdmmcDriver *drv) rc = SDMMC_NOT_SUPPORTED; break; } - //#if TRACE_LEVEL >= TRACE_LEVEL_ERROR + if (rc != SDMMC_OK && rc != SDMMC_CHANGED && bCtl != SDMMC_IOCTL_BUSY_CHECK) { TRACE_ERROR_2("SDMMC_IOCTL_%s ended with %s\n\r",SD_StringifyIOCtrl(bCtl), SD_StringifyRetCode(rc)); } - //#endif + return rc; } @@ -1387,9 +1305,9 @@ void sdmmc_device_deInit(SdmmcDriver *drv) end = time + (systime_t)t; do { - //chSysLock(); + now = chVTTimeElapsedSinceX(time); - //chSysUnlock(); + if (now >= end) { f = 1; } @@ -1409,13 +1327,13 @@ void sdmmc_device_deInit(SdmmcDriver *drv) void sdmmc_device_checkTimeCount(SdmmcDriver *driver) { if (driver->timeout_elapsed != -1) { - // chSysLock(); + driver->timeout_elapsed = 0; driver->now = chVTTimeElapsedSinceX( driver->time); if (driver->now >= driver->timeout_ticks ) { driver->timeout_elapsed = 1; } - //chSysUnlock(); + } } @@ -2012,4 +1930,6 @@ static uint8_t sdmmc_set_bus_width(SdmmcDriver *driver, uint8_t bits) return rc; } + + #endif diff --git a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_pmc.c b/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_pmc.c deleted file mode 100644 index 0d4c2616b..000000000 --- a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_pmc.c +++ /dev/null @@ -1,835 +0,0 @@ -#include "hal.h" - -#if (HAL_USE_SDMMC == TRUE) - -#include "sama_sdmmc_lld.h" -#include "ch_sdmmc_pmc.h" - - -struct _pmc_main_osc { - uint32_t rc_freq; - uint32_t crystal_freq; -}; - - - -enum _slowclock_domain { - SLOWCLOCK_DOMAIN_DEFAULT, /* Default slow clock, used as input for peripherals */ -#ifdef CONFIG_HAVE_SLOWCLOCK_TIMING_DOMAIN - SLOWCLOCK_DOMAIN_TIMING, /* Timing Domain slow clock (RTC, RTT) */ -#endif -}; - -static uint32_t _pmc_mck = 0; -static struct _pmc_main_osc _pmc_main_oscillators = { - .rc_freq = MAIN_CLOCK_INT_OSC, -}; - -uint32_t pmc_get_slow_clock(void); -void pmc_disable_gck(uint32_t id); -int pmc_select_external_osc(bool bypass); -void pmc_enable_internal_osc(void); -void pmc_switch_mck_to_slck(void); -void pmc_select_internal_osc(void); -void pmc_disable_external_osc(void); -void pmc_disable_internal_osc(void); - -static uint16_t _pmc_measure_main_osc_freq(bool external_xt) -{ - volatile uint32_t timeout = MAINFRDY_TIMEOUT; - -#ifdef CKGR_MCFR_CCSS - PMC->CKGR_MCFR = external_xt ? CKGR_MCFR_CCSS : 0; -#endif - -#ifdef CKGR_MCFR_RCMEAS - PMC->CKGR_MCFR |= CKGR_MCFR_RCMEAS; -#endif - timeout = MAINFRDY_TIMEOUT; - while (!(PMC->CKGR_MCFR & CKGR_MCFR_MAINFRDY) && --timeout > 0); - - return (timeout ? - ((PMC->CKGR_MCFR & CKGR_MCFR_MAINF_Msk) >> CKGR_MCFR_MAINF_Pos) : - 0u); -} - -void pmc_switch_mck_to_new_source(uint32_t mckr_css) -{ - uint32_t mckr = PMC->PMC_MCKR; - uint32_t mask = PMC_MCKR_CSS_Msk; - - if ((mckr ^ mckr_css) & mask) { - PMC->PMC_MCKR = (mckr & ~mask) | (mckr_css & mask); - while (!(PMC->PMC_SR & PMC_SR_MCKRDY)); - } - - _pmc_mck = 0; -} - - -uint32_t pmc_set_main_oscillator_freq(uint32_t freq) -{ - uint32_t mor, mckr, mckr_mask; - uint16_t mainf_rc, mainf_xt = 0; - - _pmc_main_oscillators.crystal_freq = freq; - - if (freq > 0) - return freq; -#if 1 - /* - * Save the current value of the CKGR_MCKR register then swith to - * the slow clock. - */ - mckr = PMC->PMC_MCKR; - pmc_switch_mck_to_slck(); - mckr_mask = PMC_MCKR_MDIV_Msk | PMC_MCKR_PRES_Msk; - PMC->PMC_MCKR &= ~mckr_mask; - - /* Save the current value of the CKGR_MOR register. */ - mor = PMC->CKGR_MOR; - - /* Measure the 12MHz RC frequency. */ - pmc_select_internal_osc(); - mainf_rc = _pmc_measure_main_osc_freq(false); - - /* Measure the crystal or by-pass frequency. */ - - /* Try by-pass first. */ - if (pmc_select_external_osc(true) == 0) - mainf_xt = _pmc_measure_main_osc_freq(true); - - /* Then try external crytal if no by-pass. */ - if (!mainf_xt) { - if (pmc_select_external_osc(false) == 0) - mainf_xt = _pmc_measure_main_osc_freq(true); - } - - /* Switch back to internal 12MHz RC if it was selected initially */ - if (!(mor & CKGR_MOR_MOSCSEL)) - pmc_select_internal_osc(); - -#ifdef CKGR_MOR_MOSCRCEN - /* Disable internal oscillator if it wasn't enabled initially */ - if (!(mor & CKGR_MOR_MOSCRCEN)) - pmc_disable_internal_osc(); -#endif - - /* Switch back to the former MCK source. */ - PMC->PMC_MCKR = (PMC->PMC_MCKR & ~mckr_mask) | (mckr & mckr_mask); - pmc_switch_mck_to_new_source(mckr & PMC_MCKR_CSS_Msk); - - /* Guess the external crystal frequency, if available. */ - if (mainf_rc && mainf_xt) { - uint32_t ratio = (mainf_xt * 1000) / mainf_rc; - - // Use 10% low and high margins - if (1800 <= ratio && ratio <= 2200) { - // 24/12 => ratio = 2000 - _pmc_main_oscillators.crystal_freq = 24000000u; - } else if (1200 <= ratio && ratio <= 1467) { - // 16/12 => ratio = 1333 - _pmc_main_oscillators.crystal_freq = 16000000u; - } else if (900 <= ratio && ratio <= 1100) { - // 12/12 => ratio = 1000 - _pmc_main_oscillators.crystal_freq = 12000000u; - } else if (600 <= ratio && ratio <= 733) { - // 8/12 => ratio = 667 - _pmc_main_oscillators.crystal_freq = 8000000u; - } - } -#endif - return _pmc_main_oscillators.crystal_freq; -} - -bool pmc_is_peripheral_enabled(uint32_t id) -{ -// assert(id < ID_PERIPH_COUNT); - -#ifdef PMC_CSR_PID0 - return (PMC->PMC_CSR[(id >> 5) & 3] & (1 << (id & 31))) != 0; -#else - PMC->PMC_PCR = PMC_PCR_PID(id); - volatile uint32_t pcr = PMC->PMC_PCR; - - return (pcr & PMC_PCR_EN) != 0; -#endif -} - -void pmc_enable_peripheral(uint32_t id) -{ - osalDbgCheck(id < ID_PERIPH_COUNT); - - // select peripheral - PMC->PMC_PCR = PMC_PCR_PID(id); - - volatile uint32_t pcr = PMC->PMC_PCR; - PMC->PMC_PCR = pcr | PMC_PCR_CMD | PMC_PCR_EN; -} - -void pmc_disable_peripheral(uint32_t id) -{ - osalDbgCheck(id < ID_PERIPH_COUNT); - - // select peripheral - PMC->PMC_PCR = PMC_PCR_PID(id); - - // disable it but keep previous configuration - PMC->PMC_PCR = (PMC->PMC_PCR & ~PMC_PCR_EN) | PMC_PCR_CMD; -} - -Matrix* get_peripheral_matrix(uint32_t id) -{ - //int i; - switch(id) - { - case ID_ARM_PMU: /* 2: Performance Monitor Unit (PMU) (ARM_PMU) */ - case ID_XDMAC0: /* 6: DMA Controller 0 (XDMAC0) */ - case ID_XDMAC1: /* 7: DMA Controller 1 (XDMAC1) */ - case ID_AES: /* 9: Advanced Enion Standard (AES) */ - case ID_AESB: /* 10: AES bridge (AESB) */ - case ID_SHA: /* 12: SHA Signature (SHA) */ - case ID_MPDDRC: /* 13: MPDDR controller (MPDDRC) */ - case ID_MATRIX0: /* 15: H64MX: 64-bit AHB Matrix (MATRIX0) */ - case ID_SDMMC0: /* 31: Secure Digital Multimedia Card Controller 0 (SDMMC0) */ - case ID_SDMMC1: /* 32: Secure Digital Multimedia Card Controller 1 (SDMMC1) */ - case ID_LCDC: /* 45: LCD Controller (LCDC) */ - case ID_ISC: /* 46: Camera Interface (ISC) */ - case ID_QSPI0: /* 52: QSPI 0 (QSPI0) */ - case ID_QSPI1: /* 53: QSPI 1 (QSPI1) */ - case ID_L2CC: /* 63: L2 Cache Controller (L2CC) */ - return MATRIX0; // AHB 64-bit matrix - default: - return MATRIX1; // AHB 32-bit matrix - }; - -} - -uint32_t get_peripheral_clock_matrix_div(uint32_t id) -{ - Matrix* matrix = get_peripheral_matrix(id); - - if (matrix == MATRIX1) { - if (PMC->PMC_MCKR & PMC_MCKR_H32MXDIV_H32MXDIV2) - return 2; - else - return 1; - } - - return 1; -} - - -uint32_t pmc_get_peripheral_clock(uint32_t id) -{ - osalDbgCheck(id < ID_PERIPH_COUNT); - - uint32_t div = get_peripheral_clock_matrix_div(id); -#ifdef CONFIG_HAVE_PMC_PERIPH_DIV - PMC->PMC_PCR = PMC_PCR_PID(id); - volatile uint32_t pcr = PMC->PMC_PCR; - div *= 1 << ((pcr & PMC_PCR_DIV_Msk) >> PMC_PCR_DIV_Pos); -#endif - - return pmc_get_master_clock() / div; -} - -bool slowclock_is_internal(enum _slowclock_domain domain) -{ - (void)domain; - return (SCKC->SCKC_CR & SCKC_CR_OSCSEL) != SCKC_CR_OSCSEL; -} - -uint32_t slowclock_get_clock(enum _slowclock_domain domain) -{ - if (slowclock_is_internal(domain)) - return 32000; - else - return 32768; -} - -uint32_t pmc_get_slow_clock(void) -{ - return slowclock_get_clock(SLOWCLOCK_DOMAIN_DEFAULT); -} - -uint32_t pmc_get_upll_clock(void) -{ - uint32_t upllclk; - -#if defined(SFR_UTMICKTRIM_FREQ_Msk) - uint32_t clktrim = SFR->SFR_UTMICKTRIM & SFR_UTMICKTRIM_FREQ_Msk; - switch (clktrim) { -#ifdef SFR_UTMICKTRIM_FREQ_48 - case SFR_UTMICKTRIM_FREQ_48: - upllclk = 10 * _pmc_main_oscillators.crystal_freq; - break; -#endif - case SFR_UTMICKTRIM_FREQ_24: - upllclk = 20 * _pmc_main_oscillators.crystal_freq; - break; - case SFR_UTMICKTRIM_FREQ_16: - upllclk = 30 * _pmc_main_oscillators.crystal_freq; - break; - default: - upllclk = 40 * _pmc_main_oscillators.crystal_freq; - break; - } -#elif defined(UTMI_CKTRIM_FREQ_Msk) - uint32_t clktrim = UTMI->UTMI_CKTRIM & UTMI_CKTRIM_FREQ_Msk; - switch (clktrim) { - case UTMI_CKTRIM_FREQ_XTAL16: - upllclk = 30 * _pmc_main_oscillators.crystal_freq; - break; - default: - upllclk = 40 * _pmc_main_oscillators.crystal_freq; - break; - } -#else - upllclk = 40 * _pmc_main_oscillators.crystal_freq; -#endif - -#ifdef CONFIG_HAVE_PMC_UPLLDIV2 - if (PMC->PMC_MCKR & PMC_MCKR_UPLLDIV2) - upllclk >>= 1; -#endif - - return upllclk; -} - -uint32_t pmc_get_main_clock(void) -{ - if (PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) - return _pmc_main_oscillators.crystal_freq; /* external crystal */ - else - return _pmc_main_oscillators.rc_freq; /* on-chip main clock RC */ -} - -uint32_t pmc_get_plla_clock(void) -{ - uint32_t pllaclk, pllar, pllmula, plldiva; - - pllar = PMC->CKGR_PLLAR; - pllmula = (pllar & CKGR_PLLAR_MULA_Msk) >> CKGR_PLLAR_MULA_Pos; - plldiva = (pllar & CKGR_PLLAR_DIVA_Msk) >> CKGR_PLLAR_DIVA_Pos; - if (plldiva == 0 || pllmula == 0) - return 0; - - pllaclk = pmc_get_main_clock(); - pllaclk = pllaclk * (pllmula + 1) / plldiva; -#ifdef CONFIG_HAVE_PMC_PLLADIV2 - if (PMC->PMC_MCKR & PMC_MCKR_PLLADIV2) - pllaclk >>= 1; -#endif - return pllaclk; -} - -uint32_t pmc_get_processor_clock(void) -{ - uint32_t procclk, mdiv; - - procclk = pmc_get_master_clock(); - - mdiv = PMC->PMC_MCKR & PMC_MCKR_MDIV_Msk; - switch (mdiv) { - case PMC_MCKR_MDIV_EQ_PCK: - break; - case PMC_MCKR_MDIV_PCK_DIV2: - procclk <<= 1; // multiply by 2 - break; - case PMC_MCKR_MDIV_PCK_DIV3: - procclk *= 3; // multiply by 3 - break; - case PMC_MCKR_MDIV_PCK_DIV4: - procclk <<= 2; // multiply by 4 - break; - default: - /* should never get here... */ - break; - } - - return procclk; -} - - - -static void _pmc_compute_mck(void) -{ - uint32_t clk = 0; - uint32_t mckr = PMC->PMC_MCKR; - - uint32_t css = mckr & PMC_MCKR_CSS_Msk; - switch (css) { - case PMC_MCKR_CSS_SLOW_CLK: - clk = pmc_get_slow_clock(); - break; - case PMC_MCKR_CSS_MAIN_CLK: - clk = pmc_get_main_clock(); - break; - case PMC_MCKR_CSS_PLLA_CLK: - clk = pmc_get_plla_clock(); - break; - case PMC_MCKR_CSS_UPLL_CLK: - clk = pmc_get_upll_clock(); - break; - default: - /* should never get here... */ - break; - } - - uint32_t pres = mckr & PMC_MCKR_PRES_Msk; - switch (pres) { - case PMC_MCKR_PRES_CLOCK: - break; - case PMC_MCKR_PRES_CLOCK_DIV2: - clk >>= 1; - break; - case PMC_MCKR_PRES_CLOCK_DIV4: - clk >>= 2; - break; - case PMC_MCKR_PRES_CLOCK_DIV8: - clk >>= 3; - break; - case PMC_MCKR_PRES_CLOCK_DIV16: - clk >>= 4; - break; - case PMC_MCKR_PRES_CLOCK_DIV32: - clk >>= 5; - break; - case PMC_MCKR_PRES_CLOCK_DIV64: - clk >>= 6; - break; -#ifdef PMC_MCKR_PRES_CLOCK_DIV3 - case PMC_MCKR_PRES_CLOCK_DIV3: - clk /= 3; - break; -#endif - default: - /* should never get here... */ - break; - } - - uint32_t mdiv = mckr & PMC_MCKR_MDIV_Msk; - switch (mdiv) { - case PMC_MCKR_MDIV_EQ_PCK: - break; - case PMC_MCKR_MDIV_PCK_DIV2: - clk >>= 1; // divide by 2 - break; - case PMC_MCKR_MDIV_PCK_DIV4: - clk >>= 2; // divide by 4 - break; - case PMC_MCKR_MDIV_PCK_DIV3: - clk /= 3; // divide by 3 - break; - default: - /* should never get here... */ - break; - } - - _pmc_mck = clk; -} - -uint32_t pmc_get_master_clock(void) -{ - if (!_pmc_mck) - _pmc_compute_mck(); - return _pmc_mck; -} - - -void pmc_configure_gck(uint32_t id, uint32_t clock_source, uint32_t div) -{ - osalDbgCheck(id < ID_PERIPH_COUNT); - osalDbgCheck(!(clock_source & ~PMC_PCR_GCKCSS_Msk)); - osalDbgCheck(div > 0); - osalDbgCheck(!((div << PMC_PCR_GCKDIV_Pos) & ~PMC_PCR_GCKDIV_Msk)); - - pmc_disable_gck(id); - PMC->PMC_PCR = PMC_PCR_PID(id); - volatile uint32_t pcr = PMC->PMC_PCR & ~(PMC_PCR_GCKCSS_Msk | PMC_PCR_GCKDIV_Msk); - PMC->PMC_PCR = pcr | clock_source | PMC_PCR_CMD | PMC_PCR_GCKDIV(div - 1); -} - - -void pmc_enable_gck(uint32_t id) -{ - osalDbgCheck(id < ID_PERIPH_COUNT); - - PMC->PMC_PCR = PMC_PCR_PID(id); - volatile uint32_t pcr = PMC->PMC_PCR; - PMC->PMC_PCR = pcr | PMC_PCR_CMD | PMC_PCR_GCKEN; - -#ifdef PMC_GCSR_PID0 - while ((PMC->PMC_GCSR[(id >> 5) & 3] & (1 << (id & 31))) == 0); -#else - while (!(PMC->PMC_SR & PMC_SR_GCKRDY)); -#endif -} - -void pmc_disable_gck(uint32_t id) -{ - osalDbgCheck(id < ID_PERIPH_COUNT); - - PMC->PMC_PCR = PMC_PCR_PID(id); - volatile uint32_t pcr = PMC->PMC_PCR; - PMC->PMC_PCR = PMC_PCR_CMD | (pcr & ~PMC_PCR_GCKEN); -} - -uint32_t pmc_get_gck_clock(uint32_t id) -{ - uint32_t clk = 0; - osalDbgCheck(id < ID_PERIPH_COUNT); - - PMC->PMC_PCR = PMC_PCR_PID(id); - volatile uint32_t pcr = PMC->PMC_PCR; - - switch (pcr & PMC_PCR_GCKCSS_Msk) { - case PMC_PCR_GCKCSS_SLOW_CLK: - clk = pmc_get_slow_clock(); - break; - case PMC_PCR_GCKCSS_MAIN_CLK: - clk = pmc_get_main_clock(); - break; - case PMC_PCR_GCKCSS_PLLA_CLK: - clk = pmc_get_plla_clock(); - break; - case PMC_PCR_GCKCSS_UPLL_CLK: - clk = pmc_get_upll_clock(); - break; - case PMC_PCR_GCKCSS_MCK_CLK: - clk = pmc_get_master_clock(); - break; -#ifdef CONFIG_HAVE_PMC_AUDIO_CLOCK - case PMC_PCR_GCKCSS_AUDIO_CLK: - clk = pmc_get_audio_pmc_clock(); - break; -#endif - } - - uint32_t div = (pcr & PMC_PCR_GCKDIV_Msk) >> PMC_PCR_GCKDIV_Pos; - return ROUND_INT_DIV(clk, div + 1); -} - -void pmc_configure_peripheral(uint32_t id, const struct _pmc_periph_cfg* cfg, bool enable) -{ - osalDbgCheck(id < ID_PERIPH_COUNT); - - pmc_disable_peripheral(id); - - if (cfg != NULL) { - - if (cfg->gck.div > 0) - pmc_configure_gck(id, cfg->gck.css, cfg->gck.div); - - } else { - pmc_disable_gck(id); - } - - /* Enable peripheral, gck or only configure it */ - if (enable) { - if (cfg && cfg->gck.div > 0) - pmc_enable_gck(id); - - pmc_enable_peripheral(id); - } -} - - -void pmc_enable_upll_clock(void) -{ - uint32_t uckr = CKGR_UCKR_UPLLEN | CKGR_UCKR_UPLLCOUNT(0x3); - uckr |= CKGR_UCKR_BIASCOUNT(0x1); - - -#if defined(SFR_UTMICKTRIM_FREQ_Msk) - switch (_pmc_main_oscillators.crystal_freq) { -#ifdef SFR_UTMICKTRIM_FREQ_48 - case 48000000: - SFR->SFR_UTMICKTRIM = (SFR->SFR_UTMICKTRIM & ~SFR_UTMICKTRIM_FREQ_Msk) | SFR_UTMICKTRIM_FREQ_48; - break; -#endif - case 24000000: - SFR->SFR_UTMICKTRIM = (SFR->SFR_UTMICKTRIM & ~SFR_UTMICKTRIM_FREQ_Msk) | SFR_UTMICKTRIM_FREQ_24; - break; - case 16000000: - SFR->SFR_UTMICKTRIM = (SFR->SFR_UTMICKTRIM & ~SFR_UTMICKTRIM_FREQ_Msk) | SFR_UTMICKTRIM_FREQ_16; - break; - default: - SFR->SFR_UTMICKTRIM = (SFR->SFR_UTMICKTRIM & ~SFR_UTMICKTRIM_FREQ_Msk) | SFR_UTMICKTRIM_FREQ_12; - } -#elif defined(UTMI_CKTRIM_FREQ_Msk) - switch (_pmc_main_oscillators.crystal_freq) { - case 16000000: - UTMI->UTMI_CKTRIM = (UTMI->UTMI_CKTRIM & ~UTMI_CKTRIM_FREQ_Msk) | UTMI_CKTRIM_FREQ_XTAL16; - break; - default: - UTMI->UTMI_CKTRIM = (UTMI->UTMI_CKTRIM & ~UTMI_CKTRIM_FREQ_Msk) | UTMI_CKTRIM_FREQ_XTAL12; - } -#endif - - /* enable the 480MHz UTMI PLL */ - PMC->CKGR_UCKR = uckr; - - /* wait until UPLL is locked */ - while (!(PMC->PMC_SR & PMC_SR_LOCKU)); -} - - -void pmc_enable_upll_bias(void) -{ - PMC->CKGR_UCKR |= CKGR_UCKR_BIASEN; -} - -void pmc_disable_upll_bias(void) -{ - PMC->CKGR_UCKR &= ~CKGR_UCKR_BIASEN; -} - -void pmc_switch_mck_to_slck(void) -{ - /* Select Slow Clock as input clock for PCK and MCK */ - PMC->PMC_MCKR = (PMC->PMC_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_SLOW_CLK; - while (!(PMC->PMC_SR & PMC_SR_MCKRDY)); - - _pmc_mck = 0; -} - -void pmc_select_internal_osc(void) -{ - pmc_enable_internal_osc(); - - /* switch MAIN clock to internal 12MHz RC */ - PMC->CKGR_MOR = (PMC->CKGR_MOR & ~(CKGR_MOR_MOSCSEL | CKGR_MOR_KEY_Msk)) | CKGR_MOR_KEY_PASSWD; - - /* in case where MCK is running on MAIN CLK */ - if ((PMC->PMC_MCKR & PMC_MCKR_CSS_PLLA_CLK) || (PMC->PMC_MCKR & PMC_MCKR_CSS_MAIN_CLK)) - while (!(PMC->PMC_SR & PMC_SR_MCKRDY)); - - /* disable external OSC 12 MHz to save power*/ - pmc_disable_external_osc(); -} - -int pmc_enable_external_osc(bool bypass) -{ - uint32_t cgmor = PMC->CKGR_MOR; - uint32_t mask = CKGR_MOR_MOSCXTEN; - volatile uint32_t timeout; - - if (bypass) - mask = CKGR_MOR_MOSCXTBY; - - /* Enable Crystal Oscillator if needed */ - if ((cgmor & mask) != mask) { - cgmor &= ~CKGR_MOR_KEY_Msk; - cgmor |= CKGR_MOR_KEY_PASSWD; - - if (bypass) { - /* Disable Crystal Oscillator */ - cgmor &= ~CKGR_MOR_MOSCXTEN; - PMC->CKGR_MOR = cgmor; - - /* Wait Main Oscillator not ready */ - while (PMC->PMC_SR & PMC_SR_MOSCXTS); - - /* Enable Crystal Oscillator Bypass */ - cgmor |= CKGR_MOR_MOSCXTBY; - PMC->CKGR_MOR = cgmor; - } else { - /* Disable Crystal Oscillator Bypass */ - cgmor &= ~CKGR_MOR_MOSCXTBY; - PMC->CKGR_MOR = cgmor; - - /* Wait Main Oscillator not ready */ - while (PMC->PMC_SR & PMC_SR_MOSCXTS); - - /* Set Oscillator Startup Time */ - cgmor &= ~CKGR_MOR_MOSCXTST_Msk; - cgmor |= CKGR_MOR_MOSCXTST(18); - PMC->CKGR_MOR = cgmor; - - /* Enable Crystal Oscillator */ - cgmor |= CKGR_MOR_MOSCXTEN; - PMC->CKGR_MOR = cgmor; - } - - /* Wait Main Oscillator ready */ - timeout = MOSCXTS_TIMEOUT; - while (!(PMC->PMC_SR & PMC_SR_MOSCXTS) && --timeout > 0); - - /* Return true if oscillator ready before timeout */ - return timeout == 0 ? -1 : 0; - } else { - /* Crystal Oscillator already selected, just check if ready */ - if (PMC->PMC_SR & PMC_SR_MOSCXTS) - return 0; - else - return -2; - } -} - -void pmc_disable_external_osc(void) -{ - /* disable external OSC */ - PMC->CKGR_MOR = (PMC->CKGR_MOR & ~(CKGR_MOR_MOSCSEL | CKGR_MOR_KEY_Msk)) | CKGR_MOR_KEY_PASSWD; - PMC->CKGR_MOR = (PMC->CKGR_MOR & ~(CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCXTBY | CKGR_MOR_KEY_Msk)) | CKGR_MOR_KEY_PASSWD; -} -int pmc_select_external_osc(bool bypass) -{ - int err; - volatile uint32_t timeout; - - /* Return if external oscillator had been selected */ - if ((PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) == CKGR_MOR_MOSCSEL) { - uint32_t mask = bypass ? CKGR_MOR_MOSCXTBY : CKGR_MOR_MOSCXTEN; - if ((PMC->CKGR_MOR & mask) == mask) - return 0; - } - - /* - * When switching the source of the main clock between the RC oscillator and the crystal - * oscillator, both oscillators must be enabled. After completion of the switch, the - * unused oscillator can be disabled. - */ - pmc_enable_internal_osc(); - err = pmc_enable_external_osc(bypass); - if (err < 0) - return err; - - /* switch MAIN clock to external oscillator */ - PMC->CKGR_MOR = (PMC->CKGR_MOR & ~CKGR_MOR_KEY_Msk) | CKGR_MOR_MOSCSEL - | CKGR_MOR_KEY_PASSWD; - - /* wait for the command to be taken into account */ - while ((PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) != CKGR_MOR_MOSCSEL); - - /* wait MAIN clock status change for external oscillator selection */ - timeout = MOSCSELS_TIMEOUT; - while (!(PMC->PMC_SR & PMC_SR_MOSCSELS) && --timeout > 0); - if (!timeout) { - PMC->CKGR_MOR &= ~CKGR_MOR_MOSCSEL; - return -1; - } - - /* in case where MCK is running on MAIN CLK */ - if ((PMC->PMC_MCKR & PMC_MCKR_CSS_PLLA_CLK) || (PMC->PMC_MCKR & PMC_MCKR_CSS_MAIN_CLK)) - while (!(PMC->PMC_SR & PMC_SR_MCKRDY)); - - /* disable internal 12MHz RC to save power */ - pmc_disable_internal_osc(); - - return 0; -} - - -void pmc_enable_internal_osc(void) -{ -#ifdef CKGR_MOR_MOSCRCEN - /* Enable internal 12MHz RC when needed */ - if ((PMC->CKGR_MOR & CKGR_MOR_MOSCRCEN) != CKGR_MOR_MOSCRCEN) { - PMC->CKGR_MOR = (PMC->CKGR_MOR & ~CKGR_MOR_KEY_Msk) | CKGR_MOR_MOSCRCEN | CKGR_MOR_KEY_PASSWD; - /* Wait internal 12MHz RC Startup Time for clock stabilization */ - while (!(PMC->PMC_SR & PMC_SR_MOSCRCS)); - } -#endif -} - -void pmc_switch_mck_to_pll(void) -{ - /* Select PLL as input clock for PCK and MCK */ - PMC->PMC_MCKR = (PMC->PMC_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_PLLA_CLK; - while (!(PMC->PMC_SR & PMC_SR_MCKRDY)); - - _pmc_mck = 0; -} - -void pmc_set_mck_prescaler(uint32_t prescaler) -{ - //assert(!(prescaler & ~PMC_MCKR_PRES_Msk)); - - /* Change MCK Prescaler divider in PMC_MCKR register */ - PMC->PMC_MCKR = (PMC->PMC_MCKR & ~PMC_MCKR_PRES_Msk) | prescaler; - while (!(PMC->PMC_SR & PMC_SR_MCKRDY)); -} - - -#ifdef CONFIG_HAVE_PMC_H32MXDIV -void pmc_set_mck_h32mxdiv(bool div2) -{ - uint32_t mckr = PMC->PMC_MCKR; - if (div2) { - if ((mckr & PMC_MCKR_H32MXDIV) != PMC_MCKR_H32MXDIV_H32MXDIV2) - PMC->PMC_MCKR = (mckr & ~PMC_MCKR_H32MXDIV) | PMC_MCKR_H32MXDIV_H32MXDIV2; - } else { - if ((mckr & PMC_MCKR_H32MXDIV) != PMC_MCKR_H32MXDIV_H32MXDIV1) - PMC->PMC_MCKR = (mckr & ~PMC_MCKR_H32MXDIV) | PMC_MCKR_H32MXDIV_H32MXDIV1; - } - while (!(PMC->PMC_SR & PMC_SR_MCKRDY)); -} -#endif /* CONFIG_HAVE_PMC_H32MXDIV */ - -#ifdef CONFIG_HAVE_PMC_PLLADIV2 -void pmc_set_mck_plladiv2(bool div2) -{ - uint32_t mckr = PMC->PMC_MCKR; - if (div2) { - if ((mckr & PMC_MCKR_PLLADIV2) != PMC_MCKR_PLLADIV2) - PMC->PMC_MCKR = mckr | PMC_MCKR_PLLADIV2; - } else { - if ((mckr & PMC_MCKR_PLLADIV2) == PMC_MCKR_PLLADIV2) - PMC->PMC_MCKR = mckr & ~PMC_MCKR_PLLADIV2; - } - while (!(PMC->PMC_SR & PMC_SR_MCKRDY)); -} -#endif - -void pmc_set_mck_divider(uint32_t divider) -{ - //assert(!(divider & ~PMC_MCKR_MDIV_Msk)); - - /* change MCK Prescaler divider in PMC_MCKR register */ - PMC->PMC_MCKR = (PMC->PMC_MCKR & ~PMC_MCKR_MDIV_Msk) | divider; - while (!(PMC->PMC_SR & PMC_SR_MCKRDY)); -} - -void pmc_configure_plla(const struct _pmc_plla_cfg* plla) -{ - uint32_t pllar = 0; - -#ifdef CKGR_PLLAR_ONE - pllar |= CKGR_PLLAR_ONE; -#endif - pllar |= CKGR_PLLAR_MULA(plla->mul); - pllar |= CKGR_PLLAR_DIVA(plla->div); - pllar |= CKGR_PLLAR_PLLACOUNT(plla->count); - PMC->CKGR_PLLAR = pllar; - -#ifdef CONFIG_HAVE_PMC_PLLA_CHARGEPUMP - PMC->PMC_PLLICPR = plla->icp & PMC_PLLICPR_ICP_PLLA_Msk; -#endif /* CONFIG_HAVE_PMC_PLLA_CHARGEPUMP */ - - if (plla->mul > 0) - while (!(PMC->PMC_SR & PMC_SR_LOCKA)); -} - -void pmc_disable_plla(void) -{ - PMC->CKGR_PLLAR = (PMC->CKGR_PLLAR & ~CKGR_PLLAR_MULA_Msk) | CKGR_PLLAR_MULA(0); -} - - - - - - -void pmc_disable_internal_osc(void) -{ -#ifdef CKGR_MOR_MOSCRCEN - /* disable internal 12MHz RC */ - PMC->CKGR_MOR = (PMC->CKGR_MOR & ~CKGR_MOR_MOSCRCEN & ~CKGR_MOR_KEY_Msk) | CKGR_MOR_KEY_PASSWD; -#endif -} - - -#endif - diff --git a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_pmc.h b/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_pmc.h deleted file mode 100644 index 2400ce842..000000000 --- a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_pmc.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef CH_SDMMC_PMC_H_ -#define CH_SDMMC_PMC_H_ - - -struct _pmc_plla_cfg { - /** PLLA MUL value */ - uint32_t mul; - - /** PLLA DIV value */ - uint32_t div; - - /** PLLA COUNT value (number of slow clock cycles before the PLLA is locked) */ - uint32_t count; - -#ifdef CONFIG_HAVE_PMC_PLLA_CHARGE_PUMP - /** PLLA ICP value */ - uint32_t icp; -#endif -}; - -struct _pmc_periph_cfg{ - - struct { - /** gck source selection: SLOW, MAIN, PLLA, UPLL, MCK or AUDIO */ - uint32_t css; - /** gck division ratio (0 means disable, n >= 1 divide by n) */ - uint32_t div; - } gck; - -}; - -#define pmcEnableSDMMC0() pmcEnablePidLow(ID_SDMMC0_MSK) -#define pmcDisableSDMMC0() pmcDisablePidLow(ID_SDMMC0_MSK) - -#define pmcEnableSDMMC1() pmcEnablePidHigh(ID_SDMMC1_MSK) -#define pmcDisableSDMMC1() pmcDisablePidHigh(ID_SDMMC1_MSK) - - -extern void pmc_configure_peripheral(uint32_t id, const struct _pmc_periph_cfg* cfg, bool enable); -extern void pmc_enable_upll_clock(void); -extern void pmc_enable_upll_bias(void); -extern uint32_t pmc_get_peripheral_clock(uint32_t id); -extern uint32_t pmc_get_master_clock(void); -extern uint32_t pmc_get_gck_clock(uint32_t id); -extern bool pmc_is_peripheral_enabled(uint32_t id); -extern uint32_t pmc_set_main_oscillator_freq(uint32_t freq); -extern uint32_t pmc_get_slow_clock(void); -extern uint32_t pmc_get_processor_clock(void); - -#endif /* CH_SDMMC_PMC_H_ */ diff --git a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_sama5d2.h b/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_sama5d2.h index ae05cee2f..adbd63a41 100644 --- a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_sama5d2.h +++ b/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_sama5d2.h @@ -10,56 +10,12 @@ #define SDMMC_BUFFER_SIZE (EXT_SIZE + SSR_SIZE + SCR_SIZE + SB1_SIZE + SB2_SIZE) -/** Frequency of the board main clock oscillator */ -#define BOARD_MAIN_CLOCK_EXT_OSC 12000000 -#define MAIN_CLOCK_INT_OSC 12000000 -#define OSC_STARTUP_TIME 0xFFu -#define MAINFRDY_TIMEOUT 32u -#define MOSCXTS_TIMEOUT ((OSC_STARTUP_TIME * 8) + 8) -#define MOSCSELS_TIMEOUT 32u - - typedef enum { SDMMC_SLOT0 = 0, SDMMC_SLOT1 }sdmmcslots_t; -#define CONFIG_HAVE_PMIC_ACT8945A 0 -#define CONFIG_HAVE_PMC_PLLADIV2 1 -#define CONFIG_HAVE_PMC_H32MXDIV 1 - -/* ========== Pio definition for SDMMC0 peripheral ========== */ -#define PIO_PA13A_SDMMC0_CD (1u << 13) /**< \brief Sdmmc0 signal: SDMMC0_CD */ -#define PIO_PA11A_SDMMC0_VDDSEL (1u << 11)/**< \brief Sdmmc0 signal: SDMMC0_VDDSEL */ -#define PIO_PA10A_SDMMC0_RSTN (1u << 10) /**< \brief Sdmmc0 signal: SDMMC0_RSTN */ -#define PIO_PA0A_SDMMC0_CK (1u << 0) /**< \brief Sdmmc0 signal: SDMMC0_CK */ -#define PIO_PA1A_SDMMC0_CMD (1u << 1) /**< \brief Sdmmc0 signal: SDMMC0_CMD */ -#define PIO_PA12A_SDMMC0_WP (1u << 12) /**< \brief Sdmmc0 signal: SDMMC0_WP */ -#define PIO_PA2A_SDMMC0_DAT0 (1u << 2) /**< \brief Sdmmc0 signal: SDMMC0_DAT0 */ -#define PIO_PA3A_SDMMC0_DAT1 (1u << 3) /**< \brief Sdmmc0 signal: SDMMC0_DAT1 */ -#define PIO_PA4A_SDMMC0_DAT2 (1u << 4) /**< \brief Sdmmc0 signal: SDMMC0_DAT2 */ -#define PIO_PA5A_SDMMC0_DAT3 (1u << 5) /**< \brief Sdmmc0 signal: SDMMC0_DAT3 */ -#define PIO_PA6A_SDMMC0_DAT4 (1u << 6) /**< \brief Sdmmc0 signal: SDMMC0_DAT4 */ -#define PIO_PA7A_SDMMC0_DAT5 (1u << 7) /**< \brief Sdmmc0 signal: SDMMC0_DAT5 */ -#define PIO_PA8A_SDMMC0_DAT6 (1u << 8) /**< \brief Sdmmc0 signal: SDMMC0_DAT6 */ -#define PIO_PA9A_SDMMC0_DAT7 (1u << 9) /**< \brief Sdmmc0 signal: SDMMC0_DAT7 */ - -/* ========== Pio PIN definition for SDMMC0 peripheral ========== */ - - -/* ========== Pio definition for SDMMC1 peripheral ========== */ -#define PIO_PA30E_SDMMC1_CD (1u << 30) /**< \brief Sdmmc1 signal: SDMMC1_CD */ -#define PIO_PA27E_SDMMC1_RSTN (1u << 27) /**< \brief Sdmmc1 signal: SDMMC1_RSTN */ -#define PIO_PA22E_SDMMC1_CK (1u << 22) /**< \brief Sdmmc1 signal: SDMMC1_CK */ -#define PIO_PA28E_SDMMC1_CMD (1u << 28) /**< \brief Sdmmc1 signal: SDMMC1_CMD */ -#define PIO_PA29E_SDMMC1_WP (1u << 29) /**< \brief Sdmmc1 signal: SDMMC1_WP */ -#define PIO_PA18E_SDMMC1_DAT0 (1u << 18) /**< \brief Sdmmc1 signal: SDMMC1_DAT0 */ -#define PIO_PA19E_SDMMC1_DAT1 (1u << 19) /**< \brief Sdmmc1 signal: SDMMC1_DAT1 */ -#define PIO_PA20E_SDMMC1_DAT2 (1u << 20) /**< \brief Sdmmc1 signal: SDMMC1_DAT2 */ -#define PIO_PA21E_SDMMC1_DAT3 (1u << 21) /**< \brief Sdmmc1 signal: SDMMC1_DAT3 */ - - /* mask for board capabilities defines: voltage, slot type and 8-bit support */ #define CAPS0_MASK (SDMMC_CA0R_V33VSUP | SDMMC_CA0R_V30VSUP | \ SDMMC_CA0R_V18VSUP | SDMMC_CA0R_SLTYPE_Msk | \ diff --git a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_tc.c b/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_tc.c deleted file mode 100644 index 00f8a998e..000000000 --- a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_tc.c +++ /dev/null @@ -1,258 +0,0 @@ -#include "hal.h" - -#if (HAL_USE_SDMMC == TRUE) - -#include "sama_sdmmc_lld.h" -#include "ch_sdmmc_pmc.h" -#include "ch_sdmmc_tc.h" - -#if SDMMC_USE_TC == 1 - -/*------------------------------------------------------------------------------ - * Global functions - *------------------------------------------------------------------------------*/ -uint32_t get_tc_id_from_addr(const Tc* addr, uint8_t channel) -{ - (void)channel; -#ifdef TC0 - if (addr == TC0) -#ifdef ID_TC0_CH0 - return ID_TC0 + channel; -#else - return ID_TC0; -#endif -#endif - -#ifdef TC1 - if (addr == TC1) -#ifdef ID_TC1_CH0 - return ID_TC1 + channel; -#else - return ID_TC1; -#endif -#endif - -#ifdef TC2 - if (addr == TC2) -#ifdef ID_TC2_CH0 - return ID_TC2 + channel; -#else - return ID_TC2; -#endif -#endif - -#ifdef TC3 - if (addr == TC3) -#ifdef ID_TC3_CH0 - return ID_TC3 + channel; -#else - return ID_TC3; -#endif -#endif - return ID_PERIPH_COUNT; -} -void tc_configure(Tc *tc, uint32_t channel, uint32_t mode) -{ - TcChannel *ch; - -// assert(channel < ARRAY_SIZE(tc->TC_CHANNEL)); - - ch = &tc->TC_CHANNEL[channel]; - - /* Disable TC clock */ - ch->TC_CCR = TC_CCR_CLKDIS; - - /* Disable interrupts */ - ch->TC_IDR = ch->TC_IMR; - - /* Clear status register */ - ch->TC_SR; - - /* Set mode */ - ch->TC_CMR = mode; -} - -void tc_start(Tc *tc, uint32_t channel) -{ - TcChannel *ch; - -// assert(channel < ARRAY_SIZE(tc->TC_CHANNEL)); - - ch = &tc->TC_CHANNEL[channel]; - - /* Clear status register */ - ch->TC_SR; - - ch->TC_CCR = TC_CCR_CLKEN | TC_CCR_SWTRG; -} - -void tc_stop(Tc *tc, uint32_t channel) -{ - TcChannel *ch; - -// assert(channel < ARRAY_SIZE(tc->TC_CHANNEL)); - - ch = &tc->TC_CHANNEL[channel]; - - ch->TC_CCR = TC_CCR_CLKDIS; -} - -void tc_enable_it(Tc *tc, uint32_t channel, uint32_t mask) -{ - TcChannel *ch; - -// assert(channel < ARRAY_SIZE(tc->TC_CHANNEL)); - - ch = &tc->TC_CHANNEL[channel]; - - ch->TC_IER = mask; -} - -void tc_disable_it(Tc *tc, uint32_t channel, uint32_t mask) -{ - TcChannel *ch; - -// assert(channel < ARRAY_SIZE(tc->TC_CHANNEL)); - - ch = &tc->TC_CHANNEL[channel]; - - ch->TC_IDR = mask; -} - -uint32_t tc_find_best_clock_source(Tc *tc, uint8_t channel, uint32_t freq) -{ - const int tcclks[] = { - TC_CMR_TCCLKS_TIMER_CLOCK1, - TC_CMR_TCCLKS_TIMER_CLOCK2, - TC_CMR_TCCLKS_TIMER_CLOCK3, - TC_CMR_TCCLKS_TIMER_CLOCK4, - TC_CMR_TCCLKS_TIMER_CLOCK5, - }; - int i, best, higher; - int best_freq, higher_freq; - - best = higher = -1; - best_freq = higher_freq = 0; - for (i = 0 ; i <(int) ARRAY_SIZE(tcclks) ; i++) { - uint32_t f = tc_get_available_freq(tc, channel, tcclks[i]); - if ( higher < 0 || (f > ((uint32_t)higher_freq) ) ) { - higher_freq = f; - higher = tcclks[i]; - } - if (f > freq) { - if (best < 0 || (f - freq) < (f - best_freq)) { - best_freq = f; - best = tcclks[i]; - } - } - } - - if (best < 0) - best = higher; - - return best; -} - -uint32_t tc_get_status(Tc *tc, uint32_t channel) -{ -// assert(channel < ARRAY_SIZE(tc->TC_CHANNEL)); - - return tc->TC_CHANNEL[channel].TC_SR; -} - -uint32_t tc_get_available_freq(Tc *tc, uint8_t channel, uint8_t tc_clks) -{ - uint32_t tc_id = get_tc_id_from_addr(tc, channel); - - switch (tc_clks) { - case TC_CMR_TCCLKS_TIMER_CLOCK1: -#ifdef CONFIG_HAVE_PMC_GENERATED_CLOCKS - if (pmc_is_gck_enabled(tc_id)) - return pmc_get_gck_clock(tc_id); - else - return 0; -#else - return pmc_get_peripheral_clock(tc_id) >> 1; -#endif - case TC_CMR_TCCLKS_TIMER_CLOCK2: - return pmc_get_peripheral_clock(tc_id) >> 3; - case TC_CMR_TCCLKS_TIMER_CLOCK3: - return pmc_get_peripheral_clock(tc_id) >> 5; - case TC_CMR_TCCLKS_TIMER_CLOCK4: - return pmc_get_peripheral_clock(tc_id) >> 7; - case TC_CMR_TCCLKS_TIMER_CLOCK5: - return pmc_get_slow_clock(); - default: - return 0; - } -} - -uint32_t tc_get_channel_freq(Tc *tc, uint32_t channel) -{ - TcChannel* ch; - -// assert(channel < ARRAY_SIZE(tc->TC_CHANNEL)); - - ch = &tc->TC_CHANNEL[channel]; - - return tc_get_available_freq(tc, channel, ch->TC_CMR & TC_CMR_TCCLKS_Msk); -} - -void tc_set_ra_rb_rc(Tc *tc, uint32_t channel, - uint32_t *ra, uint32_t *rb, uint32_t *rc) -{ - TcChannel* ch; - - //assert(channel < ARRAY_SIZE(tc->TC_CHANNEL)); - - ch = &tc->TC_CHANNEL[channel]; - -// assert(!(ra && rb) || (ch->TC_CMR & TC_CMR_WAVE)); - - if (ra) - ch->TC_RA = *ra; - if (rb) - ch->TC_RB = *rb; - if (rc) - ch->TC_RC = *rc; -} - -void tc_get_ra_rb_rc(Tc *tc, uint32_t channel, - uint32_t *ra, uint32_t *rb, uint32_t *rc) -{ - TcChannel* ch; - -// assert(channel < ARRAY_SIZE(tc->TC_CHANNEL)); - - ch = &tc->TC_CHANNEL[channel]; - - if (ra) - *ra = ch->TC_RA; - if (rb) - *rb = ch->TC_RB; - if (rc) - *rc = ch->TC_RC; -} - -#ifdef CONFIG_HAVE_TC_FAULT_MODE - -void tc_set_fault_mode(Tc *tc, uint32_t mode) -{ - tc->TC_FMR = mode; -} - -#endif /* CONFIG_HAVE_TC_FAULT_MODE */ - -uint32_t tc_get_cv(Tc* tc, uint32_t channel) -{ - TcChannel* ch; - -// assert(channel < ARRAY_SIZE(tc->TC_CHANNEL)); - - ch = &tc->TC_CHANNEL[channel]; - - return ch->TC_CV; -} - -#endif -#endif diff --git a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_tc.h b/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_tc.h deleted file mode 100644 index 1cce7cb85..000000000 --- a/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_tc.h +++ /dev/null @@ -1,21 +0,0 @@ - -#ifndef OS_HAL_PORTS_SAMA_LLD_SDMMCV0__SAMA_SDMMC_TC_H_ -#define OS_HAL_PORTS_SAMA_LLD_SDMMCV0__SAMA_SDMMC_TC_H_ - - -extern void tc_configure(Tc *tc, uint32_t channel, uint32_t mode); -extern void tc_start(Tc *tc, uint32_t channel); -extern void tc_stop(Tc *tc, uint32_t channel); -extern void tc_enable_it(Tc *tc, uint32_t channel, uint32_t mask); -extern void tc_disable_it(Tc *tc, uint32_t channel, uint32_t mask); -extern uint32_t tc_find_best_clock_source(Tc *tc, uint8_t channel, uint32_t freq); -extern uint32_t tc_get_status(Tc *tc, uint32_t channel); -extern uint32_t tc_get_available_freq(Tc *tc, uint8_t channel, uint8_t tc_clks); -extern uint32_t tc_get_channel_freq(Tc *tc, uint32_t channel); -extern void tc_set_ra_rb_rc(Tc *tc, uint32_t channel,uint32_t *ra, uint32_t *rb, uint32_t *rc); -extern void tc_get_ra_rb_rc(Tc *tc, uint32_t channel,uint32_t *ra, uint32_t *rb, uint32_t *rc); -extern uint32_t tc_get_cv(Tc* tc, uint32_t channel); - -extern uint32_t get_tc_id_from_addr(const Tc* addr, uint8_t channel); - -#endif /* OS_HAL_PORTS_SAMA_LLD_SDMMCV0__SAMA_SDMMC_TC_H_ */ diff --git a/os/hal/ports/SAMA/LLD/SDMMCv1/driver.mk b/os/hal/ports/SAMA/LLD/SDMMCv1/driver.mk index 13494bdc2..5b31411d5 100644 --- a/os/hal/ports/SAMA/LLD/SDMMCv1/driver.mk +++ b/os/hal/ports/SAMA/LLD/SDMMCv1/driver.mk @@ -2,12 +2,10 @@ PLATFORMSRC += $(CHIBIOS)/os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_lld.c \ $(CHIBIOS)/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_device.c \ $(CHIBIOS)/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_sdio.c \ $(CHIBIOS)/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_cmds.c \ - $(CHIBIOS)/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_tc.c \ $(CHIBIOS)/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_mmc.c \ $(CHIBIOS)/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_sd.c \ $(CHIBIOS)/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc.c \ - $(CHIBIOS)/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_ff.c \ - $(CHIBIOS)/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_pmc.c + $(CHIBIOS)/os/hal/ports/SAMA/LLD/SDMMCv1/ch_sdmmc_ff.c PLATFORMINC += $(CHIBIOS)/os/hal/ports/SAMA/LLD/SDMMCv1 diff --git a/os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_conf.h b/os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_conf.h index 0fb377549..72314ba1a 100644 --- a/os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_conf.h +++ b/os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_conf.h @@ -23,9 +23,6 @@ typedef FATFS CH_SDMMC_FAT; #define SDMMC_BLOCK_SIZE 512 #endif -#ifndef SDMMC_USE_TC -#define SDMMC_USE_TC 0 -#endif #endif //SAMA_SDMMC_CONF_H diff --git a/os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_lld.c b/os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_lld.c index f21aca143..2c5a862e1 100644 --- a/os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_lld.c +++ b/os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_lld.c @@ -24,6 +24,7 @@ #include "hal.h" #include "ccportab.h" + #if (HAL_USE_SDMMC == TRUE) || defined(__DOXYGEN__) #include #include "sama_sdmmc_lld.h" @@ -31,10 +32,13 @@ #include "ch_sdmmc_sd.h" #include "ch_sdmmc_sdio.h" #include "ch_sdmmc_trace.h" + /*===========================================================================*/ /* Driver local definitions. */ /*===========================================================================*/ - +#if SAMA_ST_USE_PIT == FALSE +#error "SDMMC Driver needs SAMA_ST_USE_PIT" +#endif /*===========================================================================*/ /* Driver exported variables. */ /*===========================================================================*/ diff --git a/os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_lld.h b/os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_lld.h index 7093dd9b3..488b57491 100644 --- a/os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_lld.h +++ b/os/hal/ports/SAMA/LLD/SDMMCv1/sama_sdmmc_lld.h @@ -75,14 +75,6 @@ typedef struct { sdmmcslots_t slot_id; - struct _pmc_periph_cfg pmccfg; - - bool use_fastest_clock; -#if SDMMC_USE_TC == 1 - Tc * tctimer; - uint8_t tc_chan; -#endif - uint8_t * bp; uint8_t * data_buf; uint32_t data_buf_size; @@ -129,10 +121,10 @@ struct SamaSDMMCDriver uint32_t timeout_ticks; int8_t timeout_elapsed; systime_t time,now; -#if SDMMC_USE_TC == 0 + rtcnt_t timeout_cycles; rtcnt_t start_cycles; -#endif + }; typedef sSdCard sdmmclib; -- cgit v1.2.3