关于linux的音频驱动
为了实现mp3播放,我们最近在sep4020上完成了i2s的驱动,主要经验总结如下:
1. 首先是要在probe函数里进行一系列的初始化,这些初始化对于i2s是很重要的,而且很多
● 配置操作codec的L3的gpio口线;
L3接口相对于一个混音器控制接口,也就是对应在驱动中的mixer结构体,在这里我们需要利用3根gpio口线实现对L3的控制,以下是初始化代码:
*(volatile unsigned long*)(GPIO_PORTD_DIR_V) &= ~(0xd<<1); //GPB[4:1]=00_0 Output(L3CLOCK):Output(L3DATA):Output(L3MODE)
*(volatile unsigned long*)(GPIO_PORTD_SEL_V) |= (0xd<<1);
//GPD[4:1] 1 1010
● 配置端口为放音功能,因为sep4020只支持单独放音和录音,不能全双工,因此我们在这里配置为放音,是通过一个口线置高置低实现的,具体代码:
*(volatile unsigned long*)(GPIO_PORTG_DIR_V) &= ~(0x1<<11);
*(volatile unsigned long*)(GPIO_PORTG_SEL_V) |= 0x1<<11;
*(volatile unsigned long*)(GPIO_PORTG_DATA_V) |= 0x1<<11;
● 配置pwm,实现对codec时钟的供给:
*(volatile unsigned long*)PWM4_CTRL_V =0x00;
*(volatile unsigned long*)PWM4_DIV_V =0x4; //88MHz/(4*2)=11Mhz 11M/256fs=42.96k
*(volatile unsigned long*)PWM4_PERIOD_V =0x2; //计数时钟为总线的DIV分频
*(volatile unsigned long*)PWM4_DATA_V =0x1; //周期为两个计数时钟
*(volatile unsigned long*)PWM_ENABLE_V =0x1<<3; //高电平为一个计数时钟
● 初始化codec(UDA1341),实际这一步是和第一步配置控制L3口线一起的,配置好口线后,通过这些口线将codec的参数配置好,当然具体codec的参数要看uda1341的手册,其中的uda1341_l3_address,uda1341_l3_data是单独为其编写的函数:
*(volatile unsigned long*)(GPIO_PORTD_DATA_V) &= ~(L3M|L3C|L3D);
*(volatile unsigned long*)(GPIO_PORTD_DATA_V) |= (L3M|L3C); //Start condition : L3M=H, L3C=H
//以下配置可能需要修改 marked at 11-08
uda1341_l3_address(0x14 + 2);
uda1341_l3_data(0x61); //1110 dc-filtering开不开无所谓 不能像三星的选成MSB
uda1341_l3_address(0x14 + 2);
uda1341_l3_data(0x21);
uda1341_l3_address(0x14 + 2);
uda1341_l3_data(0xc1); //Status 1,Gain of DAC 6 dB,Gain of ADC 0dB,ADC non-inverting,DAC non-inverting,Single speed playback,ADC-Off DAC-On
uda1341_l3_address(0x14 + 0);
uda1341_l3_data(0x0f); //00,00 ffff : Volume control (6 bits) -14dB
uda1341_l3_address(0x14 + 0);
uda1341_l3_data(0x7b); //01,11 10,11 : Data0, Bass Boost 18~24dB, Treble 6dB
uda1341_l3_address(0x14 + 0);
uda1341_l3_data(0x83);
● 配置dma,主要实现了对dma通道的使能,清除中断标志位,具体对dma的缓冲区分配等会在使用dma之前的一个dmasetup函数中实现,并且有对应的dmaclear清除缓冲区。
2. 音频驱动的audio结构体,和mixer结构体
在音频驱动中主要就是实现这两个结构体的operation函数:
static struct file_operations sep4020_audio_fops = {
llseek: sep4020_audio_llseek,
write: sep4020_audio_write,
read: sep4020_audio_read,
poll: sep4020_audio_poll,
ioctl: sep4020_audio_ioctl,
open: sep4020_audio_open,
release: sep4020_audio_release
};
static struct file_operations sep4020_mixer_fops = {
ioctl: sep4020_mixer_ioctl,
open: sep4020_mixer_open,
release: sep4020_mixer_release
};
sep4020_audio_fops这个结构体主要实现了i2s控制器的操作,包括读写,控制,查询(poll),打开,释放等等。Audio主要实现了接受上层应用数据,并将数据传递给codec进行播放(放音);从codec接受数据,并传递给上层的功能(录音)。这部分中又以write,read函数最为重要,ioctl可以沿用别人的,因此我们的主要工作也是集中在write,read函数上。
而sep4020_mixer_fops则主要实现了对codec参数的配置,我们也可以很清晰的看到它的operation结构体中只有控制函数,没有读写。并且由于codec的通用性,这部分的代码基本上可以沿用别人的,如2410。
3. 关于sep4020_audio_write函数:
这个是整个驱动的核心,也是难点,牵涉了dma操作,buffer ring的思想,linux中信号量的思想,明天继续,今天累了,呵呵
转自:http://blog.csdn.net/myleeming/article/details/3285471
关于linux的音频驱动相关推荐
- 为什么Linux的音频驱动位于sound目录下而不是driver/sound?
原文见链接 为什么Linux的音频驱动位于sound目录下而不是driver/sound?
- Linux/Android 音频驱动从概念到 APP
这里写自定义目录标题 前言 硬件介绍 Codec 通用结构 ADC 框图 DAC 框图 常用数字接口 其他相关术语 Codec 实际结构 硬件原理图 芯片手册框图 软硬件对应示例 Codec 硬件逻辑 ...
- Linux ALSA音频驱动之一:框架概述
1.ALSA概述 ALSA表示高级Linux声音体系结构(Advanced Linux Sound Architecture).它由一系列内核驱动,应用程序编译接口(API)以及支持Linux下声音的 ...
- zedboard 音频芯片 adau1761 linux 下音频驱动(一)简介
一.概述 这其实和 ZedBoard 板卡无关,只要音频芯片是 adau1761 ,都可以使用.有两种方法可以驱动此芯片,在此只介绍第二种: 1.Linux uio 方式. 2.本文 adi kern ...
- Linux ALSA音频驱动一:音频系统概述
音频系统概述 音频系统通过数据+控制总线与CODEC连接,控制通路用I2C,数据通常为I2S,框图如图1所示. I2C:寄存器读写,用于配置CODEC控制通路. I2S:音频数据传输,通常与platf ...
- zedboard 音频芯片 adau1761 linux 下音频驱动(三)PetaLinux
一.概述 在这一篇文章,我们使用PetaLinux生成BOOT.bin.image.ub内核文件,用于下一步播放音乐调试.我们使用的Linux环境是Ubuntu14.04.4,软件为petalinux ...
- LINUX音频驱动架构
https://www.jianshu.com/p/0f5fe8f51b66 简介 LINUX下音频驱动开发,要遵循标准的ALSA架构, 下面分别从硬件架构.软件架构.驱动程序,3个方面分析. 硬件架 ...
- linux音频时钟bclk,linux alsa音频中采样率fs、比特率BCLK 、主时钟MCLK关系
转:https://blog.csdn.net/lugandong/article/details/72468831 一. 拿512fs说话: 看图知道采样的位深是32bit(位),左右声道各占了8* ...
- linux驱动:音频驱动(六)ASoc之codec设备
linux驱动:音频驱动(六)ASoc之codec设备
最新文章
- 动画体系知识梳理(1) 转场动画 ContentTransition 理论篇
- Leetcode 264. 丑数 II 解题思路及C++实现
- SAP Spartacus里使用defer的一个例子
- miui11未升级android版本,MIUI 11稳定版正式推送,升级前你需要了解
- 逍遥模拟器配置burpsuite抓包环境
- java getpathinfo_request.getServletPath()和request.getPathInfo()用法
- 新建jsp报错“The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path”...
- linux nginx添加php版本号,linux伪装隐藏Nginx,PHP版本号提升服务器安全性
- 循环移动(cyclic)
- trace (矩阵的迹) 的性质
- 这些屏幕特效是咋实现的
- 17.3.13 多任务学习 Multi-task learning
- 字符串、bute[]数组和十六进制字符串的相互转换
- Unity制作别踩白块儿
- Java 扫描微信公众号二维码,关注并自动登录网站
- web.xml根标签web-app规范
- filebeat收集日志到elsticsearch中并使用ingest node的pipeline处理
- 【转】实习中,我怎样学习和工作
- 几何校正(image to image)
- 得之坦然,失之淡然,顺其自然,争其必然。真的太经典了啊!