WM8960驱动的移植记录

转载 2018年04月17日 17:49:09

转载地址:http://blog.chinaunix.net/uid-22950545-id-2600582.html

一,前言:WM8960是一个音频CODEC,与CPU通过I2S进行数据传输,CPU通过I2CWM8960进行控制。

Kernel:linux- 2.6.28.10 +TCC8900平台

二,实现I2C控制接口,在drivers/i2c/chips下加一个i2c驱动。Tcc_wm8960.c

#include

#include

#include

#include <linux i2c.h>

 

#define WM8960_SLAVE_ADDR  0x1a

static unsigned short probe_i2c[] = {0, WM8960_SLAVE_ADDR, I2C_CLIENT_END}; /* { i2c_num, i2c_addr } */

static unsigned short dummy[] = {I2C_CLIENT_END};

 

static struct i2c_client_address_data addr_data = {

       .normal_i2c = dummy,

       .probe = probe_i2c,

       .ignore = dummy,

};

 

static struct i2c_driver wm8960_i2c_driver;

struct i2c_client *wm8960_i2c_client;

EXPORT_SYMBOL(wm8960_i2c_client);

 

static int wm8960_i2c_probe(struct i2c_adapter *adap, int addr, int kind)

{

       struct i2c_client *i2c;

 

       i2c = kzalloc(sizeof(*i2c), GFP_KERNEL);

       if (!i2c)

              return -ENOMEM;

 

       strcpy(i2c->name, "WM8960");

       i2c->flags = 0;

       i2c->addr = addr;

       i2c->adapter = adap;

       i2c->driver = &wm8960_i2c_driver;

 

       wm8960_i2c_client = i2c;

 

       return i2c_attach_client(i2c);

}

 

static int wm8960_i2c_detach(struct i2c_client *client)

{

       i2c_detach_client(client);

       kfree(wm8960_i2c_client);

       return 0;

}

 

static int wm8960_i2c_attach(struct i2c_adapter *adap)

{

       return i2c_probe(adap, &addr_data, wm8960_i2c_probe);

}

 

static struct i2c_driver wm8960_i2c_driver = {

       .driver = {

              .name = "WM8960",

              .owner = THIS_MODULE,

       },

       .id = -1,

       .attach_adapter = wm8960_i2c_attach,

       .detach_client = wm8960_i2c_detach,

};

 

static int __init wm8960_i2c_init(void)

{

       return i2c_add_driver(&wm8960_i2c_driver);

}

 

static void __exit wm8960_i2c_exit(void)

{

       i2c_del_driver(&wm8960_i2c_driver);

}

 

module_init(wm8960_i2c_init);

module_exit(wm8960_i2c_exit);

 

MODULE_AUTHOR("Telechips Inc. SYS4-3 linux@telechips.com");

MODULE_DESCRIPTION("WM8960 I2C driver");

MODULE_LICENSE("GPL");

 

这个i2c驱动写得很简单,最重要的是导出了wm8960_i2c_client这样一个i2c_client,写wm8960寄存器就是通过这个i2c_client完成的。

三,参照sound/soc/codecs目录下的wm8731.c写出一个wm8960.c

四,修改一下sound/soc/tcc/tcc_board.c,主要是与wm8960有联系的地方改一下。关于声卡驱动的架构以后有空再写一篇分析出来。

五,修改一下相应目录下的KconfigMakefile

六,测试结果如下:

/nand2/mplayer # ./mplayer-y justonelastdance.mp3

MPlayer SVN-r4-4.3.2 (C) 2000-2009 MPlayer Team

 

Playing justonelastdance.mp3.

Audio only file format detected.

Clip info:

 Title: Just One Last Dance

 Artist: Sarah Connor

 Album: Key To My Soul

 Year: 2003

 Comment: http://www.joyui.com       

 Track: 3

 Genre: Pop

==========================================================================

Opening audio decoder: [mp3lib] MPEG layer-2, layer-3

AUDIO: 44100 Hz, 2 ch, s16le, 192.0 kbit/13.61% (ratio: 24000->176400)

Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)

==========================================================================

[AO OSS] audio_setup: Can't open audio device /dev/dsp: No such device or address

alsa-init: requested format: 44100 Hz, 2 channels, 9

alsa-init: using ALSA 1.0.15

soc_pcm_open

[AO] device [default], mode [0], return [0]

== alsa-debug ==

 totsize=0x10000 period=0x4000  period num=4

== alsa-debug == set_dma_outbuffer, addr[0x41040000], len[65536], period[16384]

== alsa-debug == [set_dma_outbuffer] HwTxDaParam [0xFFF00004]

== alsa-debug == [set_dma_outbuffer] HwTxDaTCnt [1023]

======================================

    set [2] channels

======================================

AO: [alsa] 44100Hz 2ch s16le (2 bytes per sample)

Video: no video

Starting playback...

A:   8.3 (08.2) of 268.0 (04:28.0) 10.4%                                       

 

MPlayer interrupted by signal 2 in module: play_audio

A:   8.4 (08.4) of 268.0 (04:28.0) 10.4%

 

动人的声音就出来了。

S5PV210平台wm8960音频解码芯片驱动移植记录.pdf

  • 2013年06月04日 17:48
  • 955KB
  • 下载

S5PV210 WM8960 ASOC 移植

S5PV210 移植 WM8960到ASOC中·············································································...
  • NoMmmMoN
  • NoMmmMoN
  • 2016-11-02 22:12:33
  • 680

android下调试声卡驱动之wm8960介绍二

三、LINPUT输入通道介绍             有关LINPUT的主要配置如下:            R32的bit8(LMN1)置1:LINPUT1连接PGA;          ...
  • hanbo622
  • hanbo622
  • 2015-03-28 18:24:22
  • 6365

linux驱动开发: wm8960 codec代码分析

关于alsa架构已经啃了好久好久,但是也卡了好久好久。难说皮毛到底有看懂多少,不管,我们先来啃wm8960 codec的驱动代码:必要相关函数说明: ////////////////////////...
  • changliang7731
  • changliang7731
  • 2016-12-09 23:54:05
  • 1809

S5PV210 WM8960音频驱动 学习

最新由于项目需要,调试S5PV210开发板 Linux系统上面的音频功能,我们选择的音频编解码芯片是WM8960,连接到CPU的IIS接口,调试过   程中遇到了一系列的问题,现总结如下: ...
  • xingyuan1hao
  • xingyuan1hao
  • 2013-10-11 23:54:07
  • 4986

AM335x(TQ335x)学习笔记——WM8960声卡驱动移植

经过一段时间的调试,终于调好了TQ335x的声卡驱动。TQ335x采用的Codec是WM8960,本文来总结下WM8960驱动在AM335x平台上的移植方法。Linux声卡驱动架构有OSS和ALSA两...
  • girlkoo
  • girlkoo
  • 2014-12-20 16:25:52
  • 18889

S5PV210+WM8960 IIS+IIC 字符设备驱动调试心得

S5PV210+WM8960 IIS+IIC 字符设备驱动调试心得本人闲来无事就捣鼓了一下S5PV210开发板上的WM8960的音频模块(一捣鼓就是1个礼拜T_T)。 WM8960在硬件接法上采用I...
  • NoMmmMoN
  • NoMmmMoN
  • 2016-10-31 22:06:05
  • 932

Tiny210开发板wm8960驱动

tinyalsa库如果修改了external/tinyalsa目录下的内容,可以通过如下两种方法去编译tinyalsa相关的工具。 1、m mm mmm external/tinyalsa m m...
  • luckywang1103
  • luckywang1103
  • 2015-07-24 16:26:20
  • 1113

I.mx6s上移植wm8960驱动(基于linux3.0.101版本)

I.mx6s上移植wm8960驱动   此篇博文只记录移植的步骤,其他不做分析。首先上一张wm8960的硬件连接图: ...
  • u010177751
  • u010177751
  • 2015-07-18 18:58:39
  • 4715

android下调试声卡驱动之wm8960介绍一

经过了一段时间的Android下wm8960驱动的调试,终于实现录音和播放功能了,在调试过程中有了一些心得,与大家分享一下, 由于能力有限,错误之处还望海涵和指教。 一、总述       wm8960...
  • hanbo622
  • hanbo622
  • 2015-03-28 18:03:21
  • 7154
收藏助手
不良信息举报
您举报文章:WM8960驱动的移植记录
举报原因:
原因补充:

(最多只允许输入30个字)