声卡驱动UDA1341与wm8976

本文详细介绍了如何在嵌入式系统中配置和驱动UDA1341和WM8976声卡,包括IIS接口、L3控制接口的工作原理及其实现。通过修改内核源码,实现了播放、录音功能,并提供了WM8976驱动程序的编写步骤。同时,通过madplay测试了声卡的音量控制功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IIS(Intel-IC Sound) 是由飞利浦公司开发,主要用于CD,MD,MP3等设备声卡一般是编解码芯片。
声音播放:
IIS接口发送声音
内存(SDRAM)---->S3C2440------------------->UDA1341(DAC)解码------->耳机
录音过程:
IIS接口接收声音
麦克风----->UDA1341(ADC)编码------------------>S3C2440----->内存(SDRAM)

采集频率:也称为采样速度或者采样率,定义了每秒从连续信号中提取并组成离散信号的采样个数,简单说就是一秒能采集的声音的次数,用赫兹(Hz)表示,.WAV声音文件里就包含了一个声音文件的采集频率。
UDA1341
在原理图上:
①IIS接口类 :
CDCLK : 为编解码芯片提供系统同步时钟
I2SSCLK: IIS控制器提供的串行时钟信号
I2SLRCK: 声道控制信号,当为低电平时是左声道,为高电平是右声道
I2SDI : 数据输入信号
I2SDO : 数据输出信号

②L3控制接口类:
L3MODE : L3-总线 模式输入 引脚
L3CLOCK: L3-总线 时钟 输入引脚
L3DATA : L3-总线 数据输入输出引脚

IIS接口只要用于传输声音,L3接口主要用于控制器对编解码芯片的控
制(如控制音量)

DA1341:L3接口
WM8976:IIC/3线接口

L3接口用到3条线:
L3MODE: 0 地址模式 1 数据模式
L3CLK: 每一个CLK传1位
L3DAT: 线上是地址 线上是数据
UDA1341访问时序

对应芯片手册UDA1341:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

其驱动框架为:

参考代码:sound\soc\s3c24xx\s3c2410-uda1341.c
s3c2410_uda1341_init
driver_register(&s3c2410iis_driver);

s3c2410iis_probe
/* 使能时钟 /
/
配置GPIO */

/* 设置S3C2440的IIS控制器 */
init_s3c2410_iis_bus

/* 使用L3接口初始化uda1341芯片 */
init_uda1341();

/* 设置两个DMA通道:一个用于播放,另一个用于录音 */
.....

register_sound_dsp(&smdk2410_audio_fops, -1);
  sound_insert_unit(&chains[3], fops, dev, 3, 131, "dsp", S_IWUSR | S_IRUSR, NULL); // /dev/dsp

register_sound_mixer(&smdk2410_mixer_fops, -1);
  sound_insert_unit(&chains[0], fops, dev, 0, 128, "mixer", S_IRUSR | S_IWUSR, NULL);  // /dev/mixer

/dev/dsp: 用于播放/录音
/dev/mixer: 调整音量

  1. 主设备号
  2. file_operations
  3. register_chrdev
app: open () // 假设主设备号为14
-------------------------------------------
          soundcore_open
		    int unit = iminor(inode);
		 s = __look_for_unit(chain, unit);
			  // 从chains数组里得到, 谁来设置这个数组?
				在sound_insert_unit函数里设置		      
		 new_fops = fops_get(s->unit_fops);
		 file->f_op = new_fops;
		 err = file->f_op->open(inode,file);

录音:

app:   read
----------------------
		file->f_op->read

播放:

app:  write
-------------------------
		file->f_op->write

测试:
1、确定内核里已经配置了sound\soc\s3c24xx\s3c2410-uda1341.c

-> Device Drivers
  -> Sound
    -> Advanced Linux Sound Architecture
      -> Advanced Linux Sound Architecture
        -> System on Chip audio support
        <*> I2S of the Samsung S3C24XX chips

2、make uImage
使用新内核启动
3、ls -l /dev/dsp /dev/mixer
4、播放:
在WINDOWS PC里找一个wav文件,放到开发板根文件系统里
cat Windows.wav > /dev/dsp
5、录音:
cat /dev/dsp > sound.bin
然后对着麦克风说话
ctrl+c退出
cat sound.bin > /dev/dsp // 就可以听到录下的声音
WM8976
怎么写WM8976驱动程序:
① IIS部分一样,保持不变;
② 控制部分不同,重写
在这里插入图片描述

static void wm8976_write_reg(unsigned char reg, unsigned int data)
{
 int i;
 unsigned long flags;
 unsigned short val = (reg << 9) | (data & 0x1ff);
 s3c2410_gpio_setpin(S3C2410_GPB2,1);
 s3c2410_gpio_setpin(S3C2410_GPB3,1);
 s3c2410_gpio_setpin(S3C2410_GPB4,1);
 local_irq_save(flags);
 for (i = 0; i < 16; i++){
  if (val & (1<<15))
  {
   s3c2410_gpio_setpin(S3C2410_GPB4,0);
   s3c2410_gpio_setpin(S3C2410_GPB3,1);
   udelay(1);
   s3c2410_gpio_setpin(S3C2410_GPB4,1);   
  }
  else
  {
   s3c2410_gpio_setpin(S3C2410_GPB4,0);
   s3c2410_gpio_setpin(S3C2410_GPB3,0);
   udelay(1);
   s3c2410_gpio_setpin(S3C2410_GPB4,1);   
  }
  val = val << 1;
 }
 s3c2410_gpio_setpin(S3C2410_GPB2,0); 
 udelay(1);
 s3c2410_gpio_setpin(S3C2410_GPB2,1);
 s3c2410_gpio_setpin(S3C2410_GPB3,1);
 s3c2410_gpio_setpin(S3C2410_GPB4,1);
 local_irq_restore(flags); 
}
static void init_wm8976(void)
{
 uda1341_volume = 57;
 uda1341_boost = 0;
 /* software reset */
 wm8976_write_reg(0, 0);
 /* OUT2的左/右声道打开
  * 左/右通道输出混音打开
  * 左/右DAC打开
  */
 wm8976_write_reg(0x3, 0x6f);
 wm8976_write_reg(0x1, 0x1f);//biasen,BUFIOEN.VMIDSEL=11b  
 wm8976_write_reg(0x2, 0x185);//ROUT1EN LOUT1EN, inpu PGA enable ,ADC enable
 wm8976_write_reg(0x6, 0x0);//SYSCLK=MCLK  
 wm8976_write_reg(0x4, 0x10);//16bit   
 wm8976_write_reg(0x2B,0x10);//BTL OUTPUT  
 wm8976_write_reg(0x9, 0x50);//Jack detect enable  
 wm8976_write_reg(0xD, 0x21);//Jack detect  
 wm8976_write_reg(0x7, 0x01);//Jack detect 
}

测试:
1、确定内核里已经配置了sound\soc\s3c24xx\s3c2410-uda1341.c

-> Device Drivers
  -> Sound
    -> Advanced Linux Sound Architecture
      -> Advanced Linux Sound Architecture
        -> System on Chip audio support
        <*> I2S of the Samsung S3C24XX chips

2、修改sound/soc/s3c24xx/Makefile
obj-y += s3c2410-uda1341.o
改为:
obj-y += s3c-wm8976.o
3、 make uImage
使用新内核启动
4. ls -l /dev/dsp /dev/mixer
5. 播放:
在WINDOWS PC里找一个wav文件,放到开发板根文件系统里
cat Windows.wav > /dev/dsp
6. 录音:
cat /dev/dsp > sound.bin
然后对着麦克风说话
ctrl+c退出
cat sound.bin > /dev/dsp // 就可以听到录下的声音

使用madplay测试声卡:
1、解压:
tar xzf libid3tag-0.15.1b.tar.gz // 库
tar xzf libmad-0.15.1b.tar.gz // 库
tar xzf madplay-0.15.2b.tar.gz // APP
2、编译 libid3tag-0.15.1b
mkdir tmp
cd libid3tag-0.15.1b
./configure --host=arm-linux --prefix=/work/drivers_and_test/21th_sound/app/tmp
make
make install
3、 编译 libmad-0.15.1b
cd libmad-0.15.1b
./configure --host=arm-linux --prefix=/work/drivers_and_test/21th_sound/app/tmp
make
make install
4、 编译madplay
cd madplay-0.15.2b/
./configure --host=arm-linux --prefix=/work/drivers_and_test/21th_sound/app/tmp LDFLAGS="-L/work/drivers_and_test/21th_sound/app/tmp/lib" CFLAGS="-I /work/drivers_and_test/21th_sound/app/tmp/include"
make
make install
5、 把tmp/bin/* tmp/lib/so 复制到根文件系统:
6、 把一个mp3文件复制到根文件系统
7、 madplay --tty-control /1.mp3
播放过程中不断按小键盘的减号("-")会降低音量
不断按小键盘的加号("+")会降低音量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值