编译es8388驱动的时候报错No MCLK configured, call set_sysclk() on init
时间: 2024-01-25 07:04:34 浏览: 192
这个错误提示意味着es8388驱动没有正确设置主时钟(MCLK)。一般情况下,主时钟是由系统时钟(Sysclk)经过分频得到的。因此,需要在驱动程序中调用set_sysclk()函数来设置系统时钟,然后根据需要计算出主时钟的频率并设置主时钟。以下是一个示例代码片段,以供参考:
```
static int es8388_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
struct es8388_priv *es8388;
int ret;
es8388 = devm_kzalloc(&client->dev, sizeof(struct es8388_priv), GFP_KERNEL);
if (!es8388)
return -ENOMEM;
es8388->regmap = devm_regmap_init_i2c(client, &es8388_regmap_config);
if (IS_ERR(es8388->regmap)) {
dev_err(&client->dev, "Failed to allocate register map\n");
return PTR_ERR(es8388->regmap);
}
ret = es8388_reset(es8388);
if (ret)
return ret;
ret = es8388_set_fmt(es8388, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
if (ret)
return ret;
ret = es8388_set_sysclk(es8388, ES8388_SYSCLK_MCLK, 256 * 1024 * 1024, 256 * 1024 * 1024);
if (ret)
return ret;
ret = devm_snd_soc_register_component(&client->dev, &es8388_component_driver,
es8388_dai, 1);
if (ret) {
dev_err(&client->dev, "Failed to register component: %d\n", ret);
return ret;
}
return 0;
}
```
在这个代码片段中,我们调用了es8388_set_sysclk()函数来设置主时钟的频率。在这个函数中,第一个参数指定了主时钟的源,第二个参数是主时钟的频率,第三个参数是系统时钟的频率。在这个例子中,我们将主时钟的频率设置为256MHz,系统时钟的频率也为256MHz。
如果您仍然无法解决问题,请查看您的驱动程序代码,确保正确设置了主时钟。如果问题仍然存在,请提供更详细的信息,以便我们更好地帮助您解决问题。
阅读全文