当前位置:  技术问答>linux和unix

WM8976的寄存器设置问题

    来源: 互联网  发布时间:2016-10-20

    本文导语:  在Linux下,音频芯片WM8976的寄存器操作问题: 音频驱动中有wm8976_write函数: int wm8976_write(struct snd_soc_codec  *codec, unsigned int reg,unsigned int value) 该函数为向WM8976寄存器写数据的函数,但是函数的传入参数有一个结...

在Linux下,音频芯片WM8976的寄存器操作问题:
音频驱动中有wm8976_write函数:
int wm8976_write(struct snd_soc_codec  *codec, unsigned int reg,unsigned int value)
该函数为向WM8976寄存器写数据的函数,但是函数的传入参数有一个结构体,我发现程序中
凡是调用到这个函数的,都会先定义一个结构体,这样调用wm8976_write时就会有传入的结构体
参数了。如以下函数:
static int wm8976_set_dai_fmt(struct snd_soc_dai *codec_dai,unsigned int fmt)
{
struct snd_soc_codec *codec = codec_dai->codec;
...
wm8976_write(codec, WM8976_IFACE, iface);
wm8976_write(codec, WM8976_CLOCK, clk);
}

static int wm8976_set_dai_pll(struct snd_soc_dai *codec_dai,
int pll_id, unsigned int freq_in, unsigned int freq_out)
{
struct snd_soc_codec *codec = codec_dai->codec;
...
wm8976_write(codec, WM8976_PLLK1, pll_div.k >> 18);
}

static int wm8976_hw_params(struct snd_pcm_substream *substream,
    struct snd_pcm_hw_params *params,
    struct snd_soc_dai *dai)
{
struct snd_soc_device *socdev = rtd->socdev;
struct snd_soc_codec *codec = socdev->codec;
...
wm8976_write(codec, WM8976_ADD, adn);
}

static int wm8976_set_dai_clkdiv(struct snd_soc_dai *codec_dai,
int div_id, int div)
{
struct snd_soc_codec *codec = codec_dai->codec;
...
wm8976_write(codec, WM8976_CLOCK, reg | div);
}

这些函数要么在下面的定义中:
struct snd_soc_dai wm8976_dai = {
.name = "WM8976 HiFi",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
.channels_max = 2,
.rates = WM8976_RATES,
.formats = WM8976_FORMATS,},
.capture = {
.stream_name = "Capture",
.channels_min = 1,
.channels_max = 2,
.rates = WM8976_RATES,
.formats = WM8976_FORMATS,},
.ops = {
.hw_params = wm8976_hw_params,
},
.dai_ops = {
.digital_mute = wm8976_mute,
.set_fmt = wm8976_set_dai_fmt,
.set_clkdiv = wm8976_set_dai_clkdiv,
.set_pll = wm8976_set_dai_pll,
.set_sysclk = wm8976_set_dai_sysclk,
},
};

要么就是这里定义:
struct snd_soc_codec_device soc_codec_dev_wm8976 = {
.probe =  wm8976_probe,
.remove =  wm8976_remove,
.suspend =  wm8976_suspend,
.resume = wm8976_resume,
};

我需要再添加一个函数,用于操作寄存器,通过调用wm8976_write函数实现,但是
调用它必须加入一个传入结构体,尝试定义过结构体,但是运行内核后内核直接
崩溃,请教高手我该如何添加函数?
我添加的函数如下:
void wm8976_spk_phone_set(int mode)
{
struct snd_soc_device *socdev = wm8976_socdev;
struct snd_soc_codec *codec = socdev->codec;
if(mode)//speaker mode
{
wm8976_write(codec, WM8976_SPKVOLL, 0x3f);
wm8976_write(codec, WM8976_SPKVOLR, 0x3f);
}
else//headphone mode
{
wm8976_write(codec, WM8976_HPVOLL, 0x3f);
wm8976_write(codec, WM8976_HPVOLR, 0x40);
}
}
EXPORT_SYMBOL_GPL(wm8976_spk_phone_set);

生成内核映像后运行时,内核崩溃,期待高手指点。

|
这个问题应该不难搞啊!我也在搞wm8993,不难弄这个功能。

首先:定义一个静态全局变量:static struct snd_soc_codec *wm8976_codec;
然后:在static int wm8976_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id)函数体的后半部分增加一行:wm8976_codec = codec;
最后就可以这样调用了,wm8976_write(wm8976_codec , WM8976_HPVOLR, 0x40);

祝你好运。

    
 
 

您可能感兴趣的文章:

  • RTC寄存器的配置,分寄存器值不变
  • SPI驱动能够写寄存器,不能读出寄存器
  • 寄存器映射方法
  • 寄存器的疑问
  • 【新手求助】关于2.6内核下S3C2410寄存器的访问方法(串口寄存器)
  • 关于CPU寄存器的访问
  • 寄存器问题
  • 如何设置2410的总线带宽寄存器为8位
  • 什么是线程寄存器
  • 如何修改GPIO寄存器
  • 深夜100分请教高手一个VIM寄存器的问题
  • 浮点运算寄存器的问题
  • ARM linux如何处理启动参数地址存放寄存器R2
  • USB驱动 OHCI寄存器 ioremap地址映射
  • 老问题,关于CPU寄存器的读写
  • 请教:往外设寄存器写数据遇到的麻烦
  • 在linux嵌入汇编,如何将寄存器的值返回,或传给变量???????????
  • 读写寄存器错误
  • 对寄存器赋值
  • 为什么寄存器会捕捉不到字符???
  • 再问: linux驱动从open到最后设置寄存器过程
  • 100分请教一下如何设置ov9650的摄像头寄存器设置---在友善之臂中使用
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 只有vim.gtk或vim.gnome才能使用系统全局粘贴板,默认的vim.basic看不到+号寄存器
  • Linux下写驱动程序时怎样访问,硬件控制寄存器
  • S3C2410寄存器的配置问题,请教了
  • linux下有没有工具能看到内存和寄存器的值?
  • 问下,读寄存器指令在linux中的速度问题
  • 网卡寄存器读写:X86 vs ARM
  • 中断字寄存器在硬件哪里?振晶是啥?工作原理为什么能作为CPU的…
  • mysql iis7站长之家
  • 谁能解释一下下面这段读写寄存器的含义
  • 进入程序后的第一个函数main的函数地址是存放在那个寄存器?
  • s3c6410 linux2.6.21内核 USB驱动 OHCI寄存器
  • rtl8139.c代码中的相关的寄存器如何配置?
  • PC中串口寄存器对应的针脚是如何对应的.
  • linux下如何用C实现对嵌入式开发板AD部分寄存器的读取?
  • CPU如何知道CS寄存器内装的是LDTR指向的描述符表的段选择符还是GDTR指向的描述符表的段选择符呢?
  • 在线急问,驱动中读写寄存器问题??
  • 帮我想个办法吧,关于写寄存器的时序问题。
  • I/O端口寄存器地址在驱动中到底要被映射几次???
  • 请教linux下读写 gpio端口控制寄存器的方法
  • 怎样访问GOIO寄存器


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3