SGTL5000声卡驱动移植

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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在内核的音频解码/编码驱动源码文件在文件。 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 开发板的连接,在内核文件的mx28evk_fixed_pins 数组添加引脚配置,如程序清单1.1所示。

程序清单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所示。

程序清单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

相关文档
最新文档