4.体验声卡

目录

1 、配置内核支持UDA1341

(1)内核

platform

codec

machine

配置

2、 修改代码

machine

platform

codec

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

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

3、编译内核出现问题

4、实验

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

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

 alsa-lib 

alsa-util

6、测试

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


 

book@book-desktop:/work/system/video2/alsa$ ls
ncurses-5.9.tar.gz
book@book-desktop:/work/system/video2/alsa$ tar xzf ncurses-5.9.tar.gz 
book@book-desktop:/work/system/video2/alsa$ export PATH=/usr/local/arm/4.3.2/bin:$PATH
book@book-desktop:/work/system/video2/alsa$ cd ncurses-5.9/
book@book-desktop:/work/system/video2/alsa/ncurses-5.9$ ./configure --host=arm-linux --prefix=$PWD/tmp

1 、配置内核支持UDA1341

(1)内核

 解压内核并打上补丁

book@book-desktop:/work/system/video2/linux-3.4.2$export PATH=/usr/local/arm/4.3.2/bin:$PATH
book@book-desktop:/work/system/video2/linux-3.4.2$tar jxvf linux-3.4.2.tar.bz2
book@book-desktop:/work/system/video2/linux-3.4.2$ patch -p1 <  ../linux-3.4.2_alsa.patch

配置内核

book@book-desktop:/work/system/video2/linux-3.4.2$ cp config_ok .config
book@book-desktop:/work/system/video2/linux-3.4.2$ make menuconfig

platform

需要设置哪些配置项,先看一下platform,需要把S3c24xx-i2s.c文件配置上去,dma.c也要配置上去。这些文件对应哪一个配置项,可以通过打开内核目录中以上两个文件所在目录下的Makefile
搜索S3c24xx-i2s可知最终会编译进文件snd-soc-s3c24cc-i2s-objs这个文件里。

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

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

搜索SND_S3C24XX_I2S

分析:现在是n,如果下面的都配置上去,那么SND_S3C24XX_I2S他就会自动配置上去,在导致S3C2410_DMA配置上去

往后看发现SND_SOC_SAMSUNG为n(这里我是配置过了),我们配置上去看看

在搜索一下SND_SOC_SAMSUNG,找到下图

然后试着去配置上去

-> Device Drivers
  -> Sound card support
    -> Advanced Linux Sound Architecture
      -> ALSA for SoC audio support
      <*>   ASoC support for Samsung     // CONFIG_SND_SOC_SAMSUNG

查看一下SND_S3C24XX_I2S看下是否配置上去,并没有,那应该是还有依赖,也配置上去

-> 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  

现在SND_S3C24XX_I2S配置上去了,S3C2410_DMA也配置上去,现在可以编译了

编译报错;

sound/built-in.o: In function `__samsung_dma_get_ops':
/work/system/video2/linux-3.4.2/arch/arm/plat-samsung/include/plat/dma-ops.h:56: undefined reference to `s3c_dma_get_ops'
sound/built-in.o: In function `s3c24xx_i2s_trigger':
/work/system/video2/linux-3.4.2/sound/soc/samsung/s3c24xx-i2s.c:292: undefined reference to `s3c2410_dma_ctrl'
make: *** [.tmp_vmlinux1] Error 1

看一下arch/arm/plat-s3c24xx/dma.c

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

配置上去

-> System Type
[*] S3C2410 DMA support

codec

配置编译项CONFIG_SND_SOC_UDA134X  // uda134x.c

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

 

machine

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

配置

搜索那四个配置项,配置内核以把上面四项全部配置上去
-> 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的平台设备结构体,然后把这个结构体放进平台设备数组里。这个数组最后会把里面的结构体注册进内核。
arch/arm/mach-s3c24xx/mach-smdk2440.c

相关头文件加上:#include <sound/s3c24xx_uda134x.h>

 

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,添加到数组里即可,s3c_device_iis结构体在arch/arm/plat-samsung/devs.c里有

codec

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

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

注:平台设备数组在mach-smdk2440.c
添加到数组里即可,s3c_device_iis结构体在arch/arm/plat-samsung/devs.c里有

修改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、实验

这里实验时:下载内核启动如下错误

+---------------------------------------------+
| S3C2440A USB Downloader ver R0.03 2004 Jan  |
+---------------------------------------------+
USB: IN_ENDPOINT:1 OUT_ENDPOINT:3
FORMAT: <ADDR(DATA):4>+<SIZE(n+10):4>+<DATA:n>+<CS:2>
NOTE: Power off/on or press the reset button for 1 sec
      in order to get a valid USB device address.

Hit any key to stop autoboot:  0 
Booting Linux ...

NAND read: device 0 offset 0x60000, size 0x200000

Reading data from 0x25f800 -- 100% complete.
 2097152 bytes read: OK
## Booting image at 30007fc0 ...
   Image Name:   Linux-3.4.2
   Created:      2014-03-22   0:13:16 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2267336 Bytes =  2.2 MB
   Load Address: 30008000
   Entry Point:  30008000
   Verifying Checksum ... Bad Data CRC

找了个之前正常的log

linux2.6.22

[21:28:25:606]USB: IN_ENDPOINT:1 OUT_ENDPOINT:3
[21:28:25:616]FORMAT: <ADDR(DATA):4>+<SIZE(n+10):4>+<DATA:n>+<CS:2>
[21:28:25:616]NOTE: Power off/on or press the reset button for 1 sec
[21:28:25:623]      in order to get a valid USB device address.
[21:28:25:623]
[21:28:28:302]Hit any key to stop autoboot:  0 
[21:28:28:303]Booting Linux ...
[21:28:28:303]
[21:28:28:303]NAND read: device 0 offset 0x60000, size 0x200000
[21:28:28:303]
[21:28:31:499]Reading data from 0x25f800 -- 100% complete.
[21:28:31:500] 2097152 bytes read: OK
[21:28:31:500]## Booting image at 30007fc0 ...
[21:28:31:513]   Image Name:   Linux-2.6.22.6
[21:28:31:513]   Created:      2013-11-13  16:46:47 UTC
[21:28:31:514]   Image Type:   ARM Linux Kernel Image (uncompressed)
[21:28:31:527]   Data Size:    1820508 Bytes =  1.7 MB
[21:28:31:527]   Load Address: 30008000
[21:28:31:528]   Entry Point:  30008000
[21:28:32:178]   Verifying Checksum ... OK
[21:28:32:179]   XIP Kernel Image ... OK
[21:28:32:179]
[21:28:32:179]Starting kernel ...
[21:28:32:179]
[21:28:32:841]Uncompressing 

也试过第一个项目的3.4.2


Reading data from 0x25f800 -- 100% complete.
 2097152 bytes read: OK
## Booting image at 30007fc0 ...
   Image Name:   Linux-3.4.2
   Created:      2014-03-23   8:27:59 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2093616 Bytes =  2 MB
   Load Address: 30008000
   Entry Point:  30008000
   Verifying Checksum ... OK
   XIP Kernel Image ... OK

Starting kernel ...

看起来是太大了,要修改一下分区参考:https://blog.csdn.net/qq_34738528/article/details/105462141

改好之后:

+---------------------------------------------+
USB: IN_ENDPOINT:1 OUT_ENDPOINT:3
FORMAT: <ADDR(DATA):4>+<SIZE(n+10):4>+<DATA:n>+<CS:2>
NOTE: Power off/on or press the reset button for 1 sec
      in order to get a valid USB device address.

Hit any key to stop autoboot:  0 
Booting Linux ...

NAND read: device 0 offset 0x60000, size 0x200000

Reading data from 0x25f800 -- 100% complete.
 2097152 bytes read: OK
## Booting image at 30007fc0 ...
Bad Magic Number

一种方式:(测试不行)

sudo /etc/init.d/portmap restart      //nfs is a RPC service, portmap maps its port

 sudo /etc/init.d/nfs-kernel-server restart

暂时用提供得吧,以后再看看

 

烧录后提供得,发现启动有问题

Memory: 64MB = 64MB total
Memory: 60256k/60256k available, 5280k reserved, 0K highmem
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    vmalloc : 0xc4800000 - 0xff000000   ( 936 MB)
    lowmem  : 0xc0000000 - 0xc4000000   (  64 MB)
    modules : 0xbf000000 - 0xc0000000   (  16 MB)
      .text : 0xc0008000 - 0xc0412000   (4136 kB)
      .init : 0xc0412000 - 0xc0434000   ( 136 kB)
      .data : 0xc0434000 - 0xc046a920   ( 219 kB)
       .bss : 0xc046a944 - 0xc048a7a8   ( 128 kB)
NR_IRQS:85
irq: clearing subpending status 00000002
sched_clock: 32 bits at 200 Hz, resolution 5000000ns, wraps every 4294967291ms
Console: colour dummy device 80x30
Calibrating delay loop... 199.47 BogoMIPS (lpj=498688)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok

bootargs参数设置错误,这里我是目录设置错了。

 

如有以下错误,不用管,这是uboot本身对nfs下载的协议的支持不大好

   

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

启动后,已经识别出来了

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

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

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

 

 alsa-lib 

解压并切换到目录下

book@book-desktop:/work/system/video2/alsa$ tar xjf alsa-lib-1.0.27.2.tar.bz2 

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

编译:将源代码变为机器可执行的代码文件。
安装:将可执行文件安装到操作系统里,才可以使用。
 

sudo mv /usr /usr_bak

这一步很危险,不要关闭终端或者重启系统

用echo $PATH查看环境变量

 

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

这是临时修改变量,最终修改参考

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

我的:export PATH=/usr_bak/local/arm/4.3.2/bin:/usr_bak/local/sbin:/usr_bak/local/bin:/usr_bak/sbin:/usr_bak/bin:/sbin:/bin:/usr_bak/games:/work/tools/gcc-3.4.5-glibc-2.3.6/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

我的:export PATH=/usr/local/arm/4.3.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/tools/gcc-3.4.5-glibc-2.3.6/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 cp -rfd usr /work/nfs_root/fs_mini_mdev_new
 

 

alsa-util

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

滋滋指定动态库

tar zxf ncurses-5.9.tar.gz
./configure --host=arm-linux --prefix=$PWD/tmp --with-shared
make && make install

 

 

安装出错,不用理会,临时文件生成头文件和库文件就可以了

/usr/bin/tic: symbol lookup error: /usr/bin/tic: undefined symbol: _nc_check_termtype2
? tic could not build /work/projects/alsa/ncurses-5.9/tmp/share/terminfo
make[1]: *** [install.data] Error 1
make[1]: Leaving directory `/work/projects/alsa/ncurses-5.9/misc'
make: *** [install] Error 2

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

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临时文件生成头文件和库文件就可以了

解压并切换到其目录下

alsa-utils-1.0.27.2配置

常规配置:./configure --host=arm-linux --prefix=$PWD/tmp

缺少依赖:configure: error: required curses helper header not found

解决:

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

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目录下的文件拷贝到网络跟文件系统

sudo cp * -rfd /work/nfs_root/fs_mini_mdev_new/usr/

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就可以了

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值