1 、配置内核支持UDA1341

(1)内核

解压内核并打上补丁

配置内核

platform

需要设置哪些配置项,先看一下platform,需要把S3c24xx-i2s.c文件配置上去,dma.c也要配置上去。这些文件对应哪一个配置项,可以通过打开内核目录中以上两个文件所在目录下的Makefile。

  • 配置编译项CONFIG_SND_S3C24XX_I2S
     // s3c24xx-i2s.c

搜索S3c24xx-i2s可知最终会编译进文件snd-soc-s3c24cc-i2s-objs这个文件里。

而文件snd-soc-s3c24cc-i2s-objs对应的配置项是CONFIG_SND_S3C24XX_I2S

因而需要配置编译项CONFIG_SND_S3C24XX_I2S  // s3c24xx-i2s.c

  • 配置编译项CONFIG_SND_SOC_SAMSUNG  // dma.c

因而需要配置编译项CONFIG_SND_SOC_SAMSUNG  // dma.c

codec

  • 配置编译项CONFIG_SND_SOC_UDA134X  // uda134x.c

看一下codec,需要把uda134x.c 文件配置上去。这文件对应哪一个配置项,可以通过打开内核目录中文件所在目录下的Makefile。

因而需要配置编译项CONFIG_SND_SOC_UDA134X  // uda134x.c

machine

  • 配置编译项CONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X  //
    s3c24xx_uda134x.c

看一下machine,需要把s3c24xx_uda134x.c 文件配置上去。这文件对应哪一个配置项,可以通过打开内核目录中文件所在目录下的Makefile。

因而需要配置编译项CONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X
 // s3c24xx_uda134x.c



搜索那四个配置项,配置内核以把上面四项全部配置上去

-> Device Drivers

  -> Sound card support

    -> Advanced Linux Sound Architecture

      -> ALSA for SoC audio support

      <*>   ASoC support for Samsung     // CONFIG_SND_SOC_SAMSUNG

      <*>   SoC I2S Audio support UDA134X wired to a S3C24XX    // CONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X  // s3c24xx_uda134x.c
         





-> System Type

[*] S3C2410 DMA support

2、 修改代码

machine

  • 修改mach-smdk2440.c 添加"s3c24xx_uda134x"平台设备

我们把S3c24xx-i2s.c文件配置进内核了,S3c24xx-i2s.c只有platform_driver,但是platform_device在mach_mini2440.c(3.4.2内核用mach-smdk2440.c),需要修改这个文件把同名的platform_device放进去。先构建一个smdk2440_audio的平台设备结构体,然后把这个结构体放进平台设备数组里。这个数组最后会把里面的结构体注册进内核。

platform

  • 修改s3c24xx-i2s.c 添加"s3c24xx-iis"平台设备

我们把s3c24xx-i2s.c文件配置进内核了,S3c24xx-i2s.c只有platform_driver,但是platform_device(之前在mach-mini2440.c中被放到数组里面)在devs.c,需要修改这个文件把同名的platform_device放进去。先构建一个s3c_device_iis的平台设备结构体,然后把这个结构体放进平台设备数组里。这个数组最后会把里面的结构体注册进内核。

注:平台设备数组在mach-smdk2440.c

codec

  • 修改mach-smdk2440.c 添加"samsung-audio"平台设备

我们把dma.c文件配置进内核了,dma.c只有platform_driver,但是platform_device(之前在mach-mini2440.c中被放到数组里面)在devs.c,需要修改这个文件把同名的platform_device放进去。先构建一个samsung_asoc_dma的平台设备结构体,然后把这个结构体放进平台设备数组里。这个数组最后会把里面的结构体注册进内核。

注:平台设备数组在mach-smdk2440.c



codec

  • 修改mach-smdk2440.c 添加"uda134x-codec"平台设备

我们把uda134x.c文件配置进内核了,dma.c只有platform_driver,但是platform_device(之前在mach-mini2440.c中被放到数组里面)在mach-smdk2440.c,需要修改这个文件把同名的platform_device放进去。先构建一个uda1340_codec的平台设备结构体,然后把这个结构体放进平台设备数组里。这个数组最后会把里面的结构体注册进内核。

3、编译内核出现问题

修改bug: sound\soc\samsung\dma.c

pos += prtd->dma_period;

改为

pos += prtd->dma_period*limit;

4、实验

编译内核并把编译出来的内核拷贝到网络根文件系统里,设置启动参数并启动u-boot,u-boot引导内核启动。开是否识别出声卡

5、移植应用程序测试声卡

alsa-util是使用alsa-lib的一些应用程序,我们使用alsa-util可以用来播放声音,录音或者调整音量等等。

(1) 编译alsa-lib, alsa-util以使用声卡:

  • alsa-lib  :

解压并切换到目录下

在配置时不使用--prefix,因为这样做会破坏文件系统的结构,使用默认路径(把库编译安装到/usr目录下,但/usr目录是PC机用的,为了跟PC机不冲突,因而在配置前把/usr改名为/usr_bak)

编译:将源代码变为机器可执行的代码文件。

安装:将可执行文件安装到操作系统里,才可以使用。

mv /usr/bin/g* /tmp
就是移动 usr/bin/目录下,以g开头的文件到/tmp目录里

sudo mv /usr /usr_bak

用echo $PATH查看环境变量

修改环境变量,吧所有的usr改为usr_bak

这是临时修改变量,最终修改参考http://blog.csdn.net/qingkongyeyue/article/details/52243210

export PATH=/usr_bak/local/sbin:/usr_bak/local/bin:/usr_bak/sbin:/usr_bak/bin:/sbin:/bin:/usr_bak/games:/usr_bak/local/arm/4.3.2/bin

配置

./configure --host=arm-linux

编译

make

因为make install是安装到usr目录下面去

创建usr目录

sudo mkdir /usr

改变usr目录的所有者和所在组

sudo chown book:book /usr

安装

make install

把/usr目录拷贝到/work/projects/alsa/目录下

sudo cp -rf  /usr  /work/projects/alsa/

把自己创建的/usr目录删掉

sudo rm -rf /usr

然后复制回来

sudo mv /usr_bak /usr

把环境变量改回来

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.3.2/bin

在我们的 /work/projects/alsa/下有编译出来的/usr

把头文件和库复制进交叉工具链里

cd /work/projects/alsa/usr/include

sudo cp * -rfd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include





cd /work/projects/alsa/usr/lib

sudo cp * -rfd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib





把usr目录复制到网络根文件系统目录下

cd /work/projects/alsa

sudo -rfd usr /work/nfs_root/fs_mini_mdev_new

  • alsa-util

先编译依赖:ncurses-5.9.tar.gz

把头文件和库复制进交叉工具链里

cd /work/projects/alsa/ncurses-5.9/tmp/include/ncurses

sudo cp * -rfd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include

cd /work/projects/alsa/ncurses-5.9/tmp/include/

sudo cp * -rfd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include

cd /work/projects/alsa/ncurses-5.9/tmp/lib

sudo cp * -rfd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib

把库复制到根文件系统的lib目录下

cd /work/projects/alsa/ncurses-5.9/tmp/lib

sudo cp *so* -rfd /work/nfs_root/fs_mini_mdev_new/lib

由于在拷贝过程中lib目录下没有发现动态库.so,在配置时没有制定生成动态库,因而需要重新配置加入--with-shard

安装错误无需理会,只要在tmp临时文件生成头文件和库文件就可以了

解压并切换到其目录下

配置

ncurses是库ncurses-5.9的名字

./configure --host=arm-linux --prefix=$PWD/tmp --with-curses=ncurses --disable-xmlto
--disable-nls

–disable-FEATURE 

当你想禁用某个FEATURE的时候可以使用它

with选项来指定具体的软件包地址,通过without选项来指定不使用指定的软件包

编译和安装

make

sudo make install



把安装在tmp目录下的文件拷贝到网络跟文件系统

6、测试

用aplay -h看是否能用

拷贝音频文件到网络文件系统

进行播放

出现无法找到声卡

aplay或者alsa-lib使用的声卡节点默认是在/dev/snd/目录下

因而需要新建/dev/snd目录

mkdir /dev/snd

cd /dev/snd/

ln -s  源文件 目标文件  做软链接
和快捷方式只能共享执行文件不同,linux通过链接文件能共享几乎所以类型的文件

在当前目录创建指向源文件的链接

ln -s /dev/controlC0 

ln -s /dev/pcmC0D0p 

ln -s /dev/pcmC0D0c





播放:

aplay Windows.wav

调音量用amixer来调,用amixer -h查看用法

查看控制项

amixer controls

查看当前音量,numid=1表示第一个control,为什么是numid=1,是因为用amixer controls命令显示出第一个控制项是Master
Playback Volume就是他的音量

amixer cget numid=1

设置音量,numid=1表示第一个control,30是设置的音量值

amixer cset numid=1 30

7、把内核的修改制作成补丁文件

(1)把.config文件拷贝为config_ok文件,保存我们修改的配置。然后make distclean

(2)把修改后的内核改个名字,然后解压原版内核

(3)制作补丁文件

(4)打上补丁后,吧config_ok复制为.config就可以了

转自:http://blog.csdn.net/qingkongyeyue/article/details/52504235

ALSA声卡笔记4-----体验声卡的更多相关文章

  1. ALSA声卡笔记3--ASoC驱动重要结构体关系图

    1.ASoC中重要的数据结构之间的关联方式 (1)Kernel-2.6.35-ASoC中各个结构的静态关系 ASoC把声卡实现为一个Platform Device,然后利用Platform_devic ...

  2. ALSA声卡笔记2---ASoC驱动框架

    1.简单了解一下ASOC 在嵌入式系统里面的声卡驱动为ASOC(ALSA System on Chip) ,它是在ALSA 驱动程序上封装的一层   分为3大部分,Machine,Platform和C ...

  3. ALSA声卡笔记1---ALSA驱动框架

    1.声卡驱动程序sound.c (1)入口函数里通过register_chrdev()函数注册file_operations 结构体 (2)file_operations 结构体,里面只有open函数 ...

  4. [RK3288][Android6.0] 调试笔记 --- 如何确认声卡是否注册成功【转】

    本文转载自:http://blog.csdn.net/kris_fei/article/details/78399875 Platform: RK3288 OS: Android 6.0 Kernel ...

  5. Spring Boot 学习笔记1---初体验之3分钟启动你的Web应用

    前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...

  6. Ubuntu下声卡驱动解决方法alsa

    一.首先介绍一下什么是ALSA : Advanced Linux Sound Architecture 的简称为 ALSA ,译成中文的意思是先进的Linux声音架构(这是google翻译的):一谈到 ...

  7. alsa声卡切换

    环境 ubuntu12.04 因为桌面版的默认装了,而且调声音也很方便,这里说一下server版下的配置,毕竟做开发经常还是用server版的 1.安装 apt-get install alsa-ba ...

  8. Linux ALSA声卡驱动之六:ASoC架构中的Machine

    前面一节的内容我们提到,ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上 ...

  9. 1-1. OSS/ALSA 声卡的驱动与配置和 Madplay 嵌入式播放器的移植

    报警子系统 一. OSS/ALSA 声卡的驱动与配置 声卡驱动中传统的OSS构架在02年被收购后即不开源,并且OSS的混音效果不好->因此ALSA构架孕育而生. ALSA(高级音频构架,目前应用 ...

随机推荐

  1. EventUtil对象

    var EventUtil = { addHandler : function(element,type,handler){ if(element.addEventListener){ element ...

  2. 十图详解TensorFlow数据读取机制(附代码)

    在学习TensorFlow的过程中,有很多小伙伴反映读取数据这一块很难理解.确实这一块官方的教程比较简略,网上也找不到什么合适的学习材料.今天这篇文章就以图片的形式,用最简单的语言,为大家详细解释一下 ...

  3. 5天突击GRE(155+170+4.0)

    个人认为最靠谱GRE经验,没有之一 虽然分数并不高(V 155 + Q 170 + AW 4.0),但是自认为有很多很多可以拿来给短期突击同学的宝贵经验. 首先是自己的背景,交大英语教改实验班(交大同 ...

  4. Bandit:一种简单而强大的在线学习算法

    假设我有5枚硬币,都是正反面不均匀的.我们玩一个游戏,每次你可以选择其中一枚硬币掷出,如果掷出正面,你将得到一百块奖励.掷硬币的次数有限(比如10000次),显然,如果要拿到最多的利益,你要做的就是尽 ...

  5. Java 进阶巩固:什么是注解以及运行时注解的使用

    这篇文章 2016年12月13日星期二 就写完了,当时想着等写完另外一篇关于自定义注解的一起发.结果没想到这一等就是半年多 - -. 有时候的确是这样啊,总想着等条件更好了再干,等准备完全了再开始,结 ...

  6. Linux sed命令操作 删除文件每一行的前k个字符、在文本的行尾或行首添加字符

    删除文件每一行的前k个字符 $ cat tmp.txt # 删除每行第一个字符 $ sed 's/.//' tmp.txt # 删除每行前两个字符 $ sed 's/..//' tmp.txt # 删 ...

  7. pytorch在CPU和GPU上加载模型

    pytorch允许把在GPU上训练的模型加载到CPU上,也允许把在CPU上训练的模型加载到GPU上.CPU->CPU,GPU->GPU torch.load('gen_500000.pkl ...

  8. 【数据处理】OneHotEncoder编码

    原创博文,转载请注明出处! # OneHotEncoder编码      OneHotEncoder编码称为"哑编码"或"独热编码",是将表示分类的数据扩维度, ...

  9. 【集成学习】 lightgbm原理

    # lightgbm和xgboost对比: 模型精度:lightgbm≈xgboost 收敛速度:lightgbm>xgboost #

  10. MySQL的用户账户管理

    1.开启MySQL远程连接 1.sudo -i 2.cd /etc/mysql/mysql.conf.d/ 3.vim mysqld.cnf #bind-address = 127.0.0.1 把前面 ...