I.mx6s上移植wm8960驱动
此篇博文只记录移植的步骤,其他不做分析。首先上一张wm8960的硬件连接图:
1 上电操作
配置wm8960的上电脚,文件位置:arch/arm/mach-mx6/board-mx6q_sabresd.c
另外,根据原理图可知上电脚为GPIO17,所以相关配置头文件里需将其配置为gpio口,文件位置:arch/arm/mach-mx6/board-mx6dl_sabresd.h
2:配置I2C,用于client的生成 ,文件位置:arch/arm/mach-mx6/board-mx6q_sabresd.c 需确认你的i2c是接的哪个控制器。
3: 修改wm8960 codec相关的数据结构,此处根据wm8962修改而来,文件位置: arch/arm/mach-mx6/board-mx6q_sabresd.c
以下是修改的地方
1 上电操作
配置wm8960的上电脚,文件位置:arch/arm/mach-mx6/board-mx6q_sabresd.c
#define SABRESD_CODEC_PWR_EN IMX_GPIO_NR(7, 12)
440 /* Enable wm8960 power supply */
441 gpio_request(SABRESD_CODEC_PWR_EN, "audio-power");
442 gpio_direction_output(SABRESD_CODEC_PWR_EN, 1);
443 msleep(1);
444 gpio_set_value(SABRESD_CODEC_PWR_EN, 1);
445 printk("Power up wm8960 successful %s\n", __FUNCTION__);
另外,根据原理图可知上电脚为GPIO17,所以相关配置头文件里需将其配置为gpio口,文件位置:arch/arm/mach-mx6/board-mx6dl_sabresd.h
236 /* CODEC_PWR_EN */
237 MX6DL_PAD_GPIO_17__GPIO_7_12,
2:配置I2C,用于client的生成 ,文件位置:arch/arm/mach-mx6/board-mx6q_sabresd.c 需确认你的i2c是接的哪个控制器。
805 static struct i2c_board_info mxc_i2c0_board_info[] __initdata = {
806 {
807 I2C_BOARD_INFO("wm8960", 0x1a),
808 },
};
3: 修改wm8960 codec相关的数据结构,此处根据wm8962修改而来,文件位置: arch/arm/mach-mx6/board-mx6q_sabresd.c
以下是修改的地方
57 #include <sound/wm8962.h>
58 #include <sound/wm8960.h>
...省略部分内容...
410 static struct platform_device mx6_sabresd_audio_wm8960_device = {
411 .name = "imx-wm8960",
412 };
413
414 static struct mxc_audio_platform_data wm8960_data;
415
416 static int wm8960_clk_enable(int enable)
417 {
418 if (enable) {
419 clk_enable(clko);
420 printk("%s:wm clk enable\n", __FUNCTION__);
421 }
422 else {
423 clk_disable(clko);
424 printk("%s:wm clk disable\n", __FUNCTION__);
425 }
426 return 0;
427 }
428
429 static int mxc_wm8960_init(void)
430 {
431 int rate;
432
433 clko = clk_get(NULL, "clko_clk");
434 if (IS_ERR(clko)) {
435 pr_err("can't get CLKO clock.\n");
436 return PTR_ERR(clko);
437 }
438 /* both audio codec and comera use CLKO clk*/
439 rate = clk_round_rate(clko, 24000000);
440 clk_set_rate(clko, rate);
441
442 wm8960_data.sysclk = rate;
443
444 /* Enable wm8960 power supply */
445 gpio_request(SABRESD_CODEC_PWR_EN, "audio-power");
446 gpio_direction_output(SABRESD_CODEC_PWR_EN, 1);
447 msleep(