#include <zephyr/init.h>
#include <fsl_clock.h>
#include <fsl_iomuxc.h>
static int force_mclk_init(void)
{
/* Принудительно настраиваем пин GPIO_SD_B0_00 в режим вывода SAI2_MCLK */
IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_00_SAI2_MCLK, 0U);
IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_00_SAI2_MCLK, 0x10B0U);
/* Включаем тактирование самого модуля SAI2 в процессоре i.MX RT */
CLOCK_EnableClock(kCLOCK_Sai2);
/* Конфигурируем источник тактирования для SAI2 Root Clock
* Настраиваем делители (преселекторы), чтобы на выходе MCLK получилось ровно ~12.288 МГц
*/
CLOCK_SetMux(kCLOCK_Sai2Mux, 0); /* Выбор PLL4 (Audio PLL) в качестве источника */
CLOCK_SetDiv(kCLOCK_Sai2PreDiv, 3); /* Предделитель */
CLOCK_SetDiv(kCLOCK_Sai2Div, 7); /* Основной делитель */
/* Включаем вывод мастер-клока наружу через мастер-контроллер SAI */
I2S2->TCSR |= I2S_TCSR_BCE_MASK; /* Enable Bit Clock */
printk("Forced MCLK clock line generation enabled for SGTL5000\n");
return 0;
}
/* Регистрируем функцию на этапе PRE_KERNEL_2.
* Она выполнится до того, как ядро Zephyr начнет опрашивать I2C-кодеки!
*/
SYS_INIT(force_mclk_init, PRE_KERNEL_2, 50);