SGTL5000声卡驱动移植
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.
第1章 SGTL5000声卡驱动移植
本章导读
产品开发完毕后,因为某些原因,用到的一些芯片停产,这是一件很让人头疼的事情,可是却又不得不面对这样的尴尬情形。如果有兼容的芯片还好处理,如果没有兼容芯片,那就不得不进行改版设计,实现与原来相同的功能。
在EasyARM-i.MX283A 开发过程中就遇到了UDA1380芯片停产的情况,新方案准备采用SGTL5000来进行替换,本章就讲述SGTL5000声卡驱动在i.MX283平台上的移植过程。
1.1 背景交代
由于AP-283Demo 板上的UDA1380音频芯片即将停产,因此要用SGTL5000音频芯片代替。因此需要在EasyARM-i.MX283A 开发板的Linux 内核上实现该芯片的驱动。 EasyARM-i.MX283A 开发板的Linux 内核针对i.MX283处理器已经有了SGTL5000驱动代码,所以这里的工作主是使驱动正常工作起来。
SGTL5000在内核的音频解码/编码驱动源码文件在
1.2 电路原理图
需要制作一块SGTL5000的验证板,其核心电路图如图1.1所示。
图1.1 SGTL5000验证板核心电路图
SGTL5000是并没有使用晶振提供的时钟,而是用了处理器提供MCLK 信号作为系统时钟。
SGTL5000验证板的接口电路图如图1.2所示。SGTL5000是通过I 2S 接口与EasyARM-i.MX283A 开发板实现音频通信。SGTL5000验证板的接口是通过杜邦线与EasyARM-i.MX283A 开发板连接。
文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.
图1.2 SGTL5000验证板接口电路图
SGTL5000验证板接口与 EasyARM-i.MX283A 开发板的连接方法如表1.1所示。
表1.1 SGTL5000验证板接口说明
1.3 驱动移植
1.3.1 引脚设置
根据SGTL5000电路图中SGTL5000芯片和EasyARM-i.MX283A 开发板的连接,在内核
程序清单1.1添加音频引脚的初始化代码
#if defined(CONFIG_BCMDHD_WEXT) && defined(CONFIG_iMX_287) && !defined(CONFIG_SPI_MXS) {
.name
= "SSP2_DA TA0", .id = PINID_SSP0_DA TA4, .fun
= PIN_FUN2,
.strength = PAD_8MA, .voltage = PAD_3_3V , .pullup = 1, .drive = 1,
文库资料©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.
文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.
1.3.2 添加SGTL5000 I 2C 设备
EasyARM-i.MX283A 开发板是通过I 2C1读/写SGTL5000的寄存器。为了使SGTL5000音频解码/编码驱动能正常读/写芯片的寄存器,必须为该驱动添加I 2C 设备。在内核的
程序清单1.2添加I 2
C 设备
static struct i2c_board_info __initdata mxs_i2c_device[] = { { I2C_BOARD_INFO("sgtl5000-i2c", 0xa), .flags = I2C_M_TEN }, //0xa 为设备的从机地址 { I2C_BOARD_INFO("FM24C02A", 0x50) },
};
static void __init i2c_device_init(void) { i2c_register_board_info(1, mxs_i2c_device, ARRAY_SIZE(mxs_i2c_device)); ……省略……
}
SGTL5000音频解码/编码驱动模块在启动时会寻找名为“sgtl5000-i2c ”的I 2C 设备。 1.3.3 配置和编译
由于I 2S 的部分引脚和UART4的引脚复用,故此要禁用UART4的功能。 在make menuconfig 按以下路径进入音频配置界面:
Device Drivers → Sound card support → Advanced Linux Sound Architecture →
ALSA for SoC audio support →
使能SGTL5000音频驱动配置如图1.3所示。
文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.
图1.3音频驱动使能
重新编译内核,并把新固件烧写到EasyARM-i.MX283A 开发板。内核启动后,打印了如下信息:
ALSA device list:
#0: mxs-evk(SGTL5000)
这表示SGTL5000音频芯片已经被正确探测并识别。 进入系统后,使用aplay 命令播放wav 格式的音频文件:
# aplay /root/halt.wav
可以听到音频文件的声音,但音频文件开头几秒(约3秒)的声音是听不到的。 1.3.4 修正播放音频的问题
在实际操作中发现:
● 在第一次播放音频文件时,音频文件的开头几秒是听不到的; ● 若马上再播放音频文件,音频文件的所有声音都可以听到;
● 但若过一段时间(约5、6秒)后,再播放音频文件,还会出现这种情况。 为弄清楚产生这种情况的原因,需要打印SGTL5000音频解码/编码驱动程序对
SGTL5000寄存器的操作情况。在内核的sound/soc/codes/sgtl5000.c 文件的sgtl5000_write()函数任何位置添加下面一行:
printk(“w r:%02x , v:%04x \n ”, reg, value);
编译内核后,把固件烧写到开发板。启动系统进入终端,输入aplay halt.wav 命令如下:
root@EasyARM-iMX283 ~# aplay halt.wav w r:06,v:0000
(1)
w r:04,v:0000 w r:06,v:0130 w r:02,v:0001 w r:30,v:ffff w r:02,v:0021 w r:24,v:0022 w r:2a,v:0200 w r:30,v:ffff w r:0e,v:0200 (2) Playing WA VE 'halt.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
w r:0e,v:020c
(3)
w r:02,v:0020 w r:06,v:0130
(4) root@EasyARM-iMX283 ~#
root@EasyARM-iMX283 ~# w r:2a,v:0000
(5)
w r:30,v:ffff w r:02,v:0020 w r:24,v:0132