SylixOS下IIS驱动编程

目录

1. IIS简介    1

2. 数字声音简介    1

2.1    采样频率    1

2.2    量化位数    1

2.3    声道数    1

3. WAV音频文件格式简介    2

3.1    文件格式    2

3.2    原始声音数据的组织方式    2

4. Mini2440声卡的连接方式    3

4.1    相关连线说明    3

5. SylixOS下的OSS音频驱动接口    3

6. 播放声音流程    4

7. 录音流程    5

  1. IIS简介

    IIS是飞利浦公司开发的一种用于数字音频设备之间进行数据传输的总线,IIS只负责音频数据的传输,对音频的控制需要另外的芯片来控制,一般声卡都会有IIS接口和控制接口,两者共同协作来完成声音数据的传输和控制。如图 11所示:

    图 11  声音传输示意图

  2. 数字声音简介

    主要介绍数字声音的几个指标:

  3. 采样频率

    采样频率fs就是录音时每秒对声音信号的采样次数,播放时最好也以采样频率播放,否则声音听起来会变音。常见的采样频率有22.050kHz、44.100kHz、48.000kHz等。

  4. 量化位数

    量化位数指对声音采样结果用几位数据保存,这和声卡中的ADC的位数相关,常见的有8位、16位等。

  5. 声道数

    分为单声道和双声道,双声道就是左右两个声道,又称为立体声,另外更高级的有5声道和7声道。

    单声道声音采样如图 21所示,横轴表示时间,纵轴表示采样结果,蓝色线条表示声音的原始波形。

    图 21  声音采样示意图

  6. WAV音频文件格式简介

  7. 文件格式

    如图 31所示,WAV音频文件由3部分组成:头部区域、格式描述区域和数据区域。其中格式区域记录了音频的声道数、采样频率、和量化位数等信息,数据区域记录了声音的数据,这些数据是原始数据,没有经过压缩的。像mp3等格式的音频文件中的数据都是经过压缩的数据。

    图 31  WAV文件格式

  8. 原始声音数据的组织方式

    如图 32所示,为4种情况下WAV文件中音频数据的组织方式。

    图 32  WAV声音数据组织方式

  9. Mini2440声卡的连接方式

    如图 41所示,在mini2440中,声卡的型号为UDA1341TS,和IIS接口相关的有5根线,还有另外3条线用于音频控制。

    图 41  声卡连接图

  10. 相关连线说明

    CDCLK:声卡工作时钟,一般为采样频率的256、384、512倍,即256fs、384fs、512fs

    I2SSCLK:数据串行时钟,数值为量化位数*声道数*采样频率。如果量化位数为16,声道数为2,则I2SSCLK=32fs

    I2SLRCLK:左右声道切换频率,该数值应等于采样频率

    I2SSDI:音频数据输入,即由声卡传输数据给2440,录音状态

    I2SSDO:音频数据输出,即由2440传输数据给声卡,播放状态

    控制接口:根据声卡的不同,接口也不同,比如有的是I2C接口,有的是L3接口,具体看声卡手册。控制接口主要控制声音的音量,是否静音,增益等。

    播放和录音时,三个时钟频率要设置正确,否则没有声音或者声音失真。

  11. SylixOS下的OSS音频驱动接口

    SylixOS下的OSS音频驱动接口可以在SylixOS\system\device\sound\soundcard.h中查看,主要有几点需要注意:

    播放和录音是通过读写/dev/dsp设备来实现的

    音量、增益等控制是通过读写/dev/mixer设备来实现的

    应用程序通过ioctl来进行参数设置、控制等操作,并且具体操作对应ioctl中的命令都在soundcard.h定义好了,比如:

    设置量化位数是用"SNDCTL_DSP_SETFMT",设置采样频率是"SNDCTL_DSP_SPEED",设置音量是用"SOUND_MIXER_WRITE_VOLUME"等等。

  12. 播放声音流程

    1. CPU从上层拷贝音频数据到缓冲区,拷贝完成一个缓冲区后发送一个DMA传输请求,这时DMA开始传送刚刚拷贝好的缓冲区数据,同时CPU继续从上层拷贝音频数据到下一个缓冲区,如图 61所示。

    图 61  CPU拷贝,DMA传输

    2. CPU拷贝数据的速度是比DMA传送数据速度快的,所以当发生CPU要拷贝到的缓冲区和DMA当前正在处理的缓冲区重叠时,需要阻塞线程,这是通过信号量实现的,如图 62所示。

    图 62  阻塞线程

    3. 当DMA传送完成后产生中断,在中断处理程序中唤醒刚才阻塞的线程,CPU就可以继续拷贝数据到刚才DMA处理的缓冲区里了,如图 63所示。

    图 63  唤醒线程

  13. 录音流程

    录音的流程和播放流程大体相似,只是先由DMA传送数据到缓冲区,然后由CPU拷贝缓冲区内容给上层应用程序。当CPU处理的缓冲区和DMA当前处理的缓冲区重合时,同样阻塞线程,直到DMA处理完后在中断中唤醒。

时间: 2024-11-05 06:07:36

SylixOS下IIS驱动编程的相关文章

at91 linux 4.1.0下dts驱动编程模型

下面的这个驱动文件at91_keyled.c在Atmel提供的linux-at91-linux4sam_5.3下实现了按键控制LED的亮灭过程,通过这个简单的驱动描述了基于DTS的驱动开发模型以及Linux内核里的GPIO相关的操作函数. 1 /********************************************************************************* 2 * Copyright: (C) 2016 Guo Wenxue<[email pro

SylixOS下基于NUC970的NAND驱动

开发环境 开发环境 宿主机: Windows7 64bits 系统 开发板: 安米MDK972 软件环境: RealEvo-IDE3.0 NAND Flash: S34ML02G100TF100 S34ML02G100TF100芯片参数 Density:2 Gbit Input / Output Bus Width: 8-bits Page Size:2112 (2048 + 64) bytes; 64 bytes is spare area Block Size: 64 Pages;128k

【原创】Linux环境的图形系统和AMD显卡驱动编程(1)——Linux环境下的图形系统简介

Linux/Unix环境下最早的图形系统是Xorg图形系统,Xorg图形系统通过扩展的方式以适应显卡和桌面图形发展的需要,然而随着软硬件的发展,特别是嵌入式系统的发展,Xorg显得庞大而落后.开源社区开发开发了一些新的图形系统,比如Wayland图形系统. 由于图形系统.3D图形本身的复杂以及历史原因,Linux下的图形系统相关的源码庞大而且复杂,而且缺少学习的资料(所有源代码分析或者驱动编程的书籍都很少介绍显卡驱动).在后续一系列文章中,笔者将从对AMD硬件编程的角度出发对部分问题做一个简单的

SylixOS下移植C++工程

1.使用范围 本文档适用于在RealEvo-IDE开发环境下移植C++工程的用户,使用者应熟悉使用RealEvo-IDE开发环境,并具备C++语言编程的基础知识. 2. 准备工作 2.1 环境准备 在使用之前,须安装有翼辉信息开发的集成开发套件,由于系统上安装的防火墙软件或者杀毒软件可能会影响到集成开发软件的使用,因此,在使用本套件前请关闭计算机上的windows防火墙以及杀毒软件. 因后续操作需要在模拟器上进行展示,所以在进行后续章节操作前,请完成mini2440模拟器的配置并启动,具体配置步

SylixOS BSP tick驱动流程

SylixOS BSP tick驱动流程 1. 开发环境 - 操作系统:SylixOS - 编程环境:RealEvo-IDE3.1 - 硬件平台:IMX6Q实验箱 2.技术实现 时钟节拍(clock tick)是特定的周期性中断.这个中断可以看做是系统心脏的脉动.时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,同时当任务等待事件发生时,提供等待超时的依据. 2.1 Tick的频率设置 Tick的频率需要根据具体的硬件性能来设置.频率越快,系统的额外开销也会越大.SylixOS中频率通

第6章 Android驱动编程

第6章  Android驱动编程 通过介绍本章设备驱动.字符设备驱动编程.GPIO驱动程序实例和4*4扫描键盘驱动等内容,熟练掌握了Android驱动编程.Android内核内核模块编程中包括设备驱动和内核模块.模块相关命令.Android内核内核模块编程和内核模块实例程序.Android内核中采用可加载的模块化设计,一般情况下编译的Android内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中.模块相关命令中lsmod列出了当前系统中加载的模块,rmmood用于当前模块卸载,in

Linux内核驱动编程

Linux内核驱动编程 2015-02-12 驱动程序基础的东西这儿就不罗嗦了,百度上有更好的资料,此处我们只是注重实际用处. 下面我们开始写程序: 一.初步helloword程序 首先是来一个简单的hello. hello.c代码: 1 /****************************** 2 3 the first program 4 5 Hello World! 6 7 ******************************/ 8 9 #include <linux/mod

【原创】Linux环境的图形系统和AMD显卡驱动编程(2)——Framebuffer、DRM、EXA和Mesa简介

1. Framebuffer Framebuffer驱动提供基本的显示,framebuffer驱动操作的硬件就是一个显示控制器和帧缓存(一片位于系统主存或者显卡显存).Framebuffer驱动向应用程序提供/dev/fbx的设备接口,应用程序通过读写这个设备节点实现对显示控制器和帧缓存. 下面这个程序显示了应用程序操作操作framebuffer节点的过程.运行这个程序,将在屏幕上方显示一个正方形(这里省略了错误检查代码). 1 #include <stdio.h> 2 #include &l

linux 操作系统下c语言编程入门

2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 7)Linux程序设计入门--线程操作 8)Linux程序设计入门--网络编程 9)Linux下C开发工具介绍 1)Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编