частота CLK для связи с картой eMMC установлена ​​неправильно

В данный момент работаю с китайским процессором rockchip rk3568 и интерфейсом emmc. Я изучил исходники таких крупных проектов, как Linux и U-boot для этого интерфейса, и думаю, что практически воспроизвел те же действия, что и там (в обоих проектах инициализация на голом железе очень похожа). Однако, в отличие от источников, у меня проблема с тактовым сигналом CLK. Мне кажется логичным, что процессор берет определенную частоту (freq_1) и подает ее на тактирование периферийного устройства eMMC (конечно, источник этой частоты мы задаем через системные регистры процессора). Внутри самой периферии ставим делители и включаем тактовые сигналы CLK, и в итоге на выходе должны делить ожидаемую нами частоту CLK. Проверил регистры, действительно записываю туда значение делителя, и бит стабильности частоты устанавливается по мере необходимости. Но моя проблема в том, что периферия как бы игнорирует эти делители и я вижу на выходе ту же частоту, что и на входе (freq_1). Может, все дело в том, что я что-то делаю раньше (или позже), чем надо, но не понимаю что. буду благодарен за любую помощь

Я пытаюсь запустить простой код, но результат все тот же. Пример кода:

      mmcsd_reset(mmcsd_dev_p, SDHCI_RESET_ALL);
mmcsd_gpio_init();
HWREGB(mmcsd_dev_p->reg_base + EMMC_PWR_CTRL) = 0x01; // set bit Bus power ON
cyg_uint16 clk = 0;
cyg_uint16 div = 2; // some divider for output clk
HWREGH(mmcsd_dev_p->reg_base + EMMC_CLK_CTRL) = clk; // disable clk 
delay_us(1000);
// Set divider and input CLK 
clk |= (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT;
clk |= ((div & SDHCI_DIV_HI_MASK) >> SDHCI_DIV_MASK_LEN) << SDHCI_DIVIDER_HI_SHIFT;
clk |= SDHCI_CLOCK_INT_EN;
HWREGH(mmcsd_dev_p->reg_base + EMMC_CLK_CTRL) = clk;
// wait stable input clk
hal_delay_us(500 * 1000);
// Enable output clk
clk = HWREGH(mmcsd_dev_p->reg_base + EMMC_CLK_CTRL);
clk |= SDHCI_CLOCK_CARD_EN;
HWREGH(mmcsd_dev_p->reg_base + EMMC_CLK_CTRL) = clk;

1 ответ

Опытным путем выяснил, что тактирование линии CLK для eMMC настраивается напрямую через системные регистры (CRU_CLKSEL_CON28). То есть периферия поддерживает только те значения, которые доступны в этом регистре. Таким образом, U-boot никогда не подстраивает делители в периферийном регистре eMMC (Clock Control Register) и все работает корректно. Если жестко заставить U-boot выставить делитель в регистре, то выходная частота все равно будет равна входной. На данный момент по результатам экспериментов делаю вывод, что Rockchip по каким-то причинам не реализовала(?) работу делителей в блоке eMMC

Другие вопросы по тегам