A、环境
系统:Ubuntu16.04 64bit
交叉编译器:arm-linux-gnueabi
alsa_lib库版本:alsa-lib-1.1.8.tar.bz2
(下载路径:https://www.alsa-project.org/wiki/Main_Page)
B、交叉编译安装
./configure --host=arm-linux-gnueabi --prefix=$PWD/_install --enable-shared --disable-python CC=arm-linux-gnueabi-gcc CXX=arm-linux-gnueabi-g++ LD=arm-linux-gnueabi-ld
或者执行脚本
./configure \
--host=arm-linux-gnueabi \
--prefix=$PWD/_install \
--enable-shared \
--disable-python \
CC=arm-linux-gnueabi-gcc \
CXX=arm-linux-gnueabi-g++ \
LD=arm-linux-gnueabi-ld
配置解释如下:
1)一般在makefile时,部分程序会首先执行配置文件进行配置,然后再生成makefile文件,注意不同工程的配置方案并不相同,这些命令不一定在其他配置文件中也能使用;
2)--host:为使用的交叉编译工具名,直接使用arm-linux也可以,根据PC上安装的交叉编译工具来决定;
3)--prefix:即makeinstall时程序安装的目录,可以根据自己的情况进行修改,不用拘泥;
4)--enable:开启功能 --disable:关闭功能;
5)--with-configdir:alsa.conf文件安装路径,默认值是--prefix指定的路径值/share/alsa/,本目录要定好位置,交叉编译过后,移植到板子上时要和PC上路径一致,默认alsa配置文件会在安装目录里,这个配置对应include/config.h中ALSA_CONFIG_DIR的值;
6)--with-plugindir:如果需要自定义include/config.h中ALSA_PLUGIN_DIR的值,可通过参数--with-plugindir指定,即smixer的安装路径,默认值是--prefix指定的路径值/lib/alsa-lib/ ,alsa_lib所在目录,目前意义不明,可以自由定位,也可以默认安装,用的不多;
7)CC,CXX,LD:我单独加的,即配置生成的makefile文件中的编译工具为这几项;
8)注意: --with-alsa-devdir 指定音频设备的目录。(pcmC0D0c/pcmC0D0p/pcmC0D1p等)alsa_lib 默认到/dev/snd找这些音频设备,但有时候创建音频设备并不在/dev/snd里,而是在/dev/里或者其它目录里,这就需要指定目录,不然会提示找不到pcmCxDx 。
C、移植alsa至arm板
alsa-lib编译安装完成之后,进行如下操作:
A、环境
系统:Ubuntu16.04 64bit
交叉编译器:arm-linux-gnueabi
alsa_lib库版本:alsa-utils-1.1.8.tar.bz2
(下载路径:https://www.alsa-project.org/wiki/Main_Page)
B、交叉编译安装
cd alsa-utils-1.1.8/
./configure \
--host=arm-linux-gnueabi \
--prefix=$PWD/_install \
CFLAGS="-I /home/iflytek-dyye/work/txd33/tools/alsa/alsa-lib-1.1.8/_install/include" \
LDFLAGS="-L /home/iflytek-dyye/work/txd33/tools/alsa/alsa-lib-1.1.8/_install/lib -lasound" \
--disable-alsamixer \
--disable-xmlto \
--with-alsa-inc-prefix=/home/iflytek-dyye/work/txd33/tools/alsa/alsa-lib-1.1.8/_install/include \
--with-alsa-prefix=/home/iflytek-dyye/work/txd33/tools/alsa/alsa-lib-1.1.8/_install/lib \
CC=arm-linux-gnueabi-gcc \
CXX=arm-linux-gnueabi-g++ \
LD=arm-linux-gnueabi-ld
配置解释如下:
1 ) --host 指定编译器,与 lib 的配置选项相同;
2 ) --prefix 指定编译后文件的安装路径,与 lib 的配置选项相同;
3 ) CFLAGS 用于编译时指定的编译选项,在这里将利用 lib 编译后生成的头文件,因此指定为该头文件所在目录;
4 ) LDFLAGS 用于编译时指定连接库文件,与 CFLAGS 同样状况,将 lib 编译生成的库文件指定出来;
5 ) --with-alsa-inc-prefix 指定头文件目录,这个与 3) 类似,但必须指定,因为 Configure 程序会去该目录检查版本情况。如果不指定的话,则会直接去默认目录 ( 即宿主机对应的 alsalib 目录中寻找,因此可能会有错误 )。
C、移植
完成编译安装后,移植步骤如下:
(1) 将参数--prefix指定的路径值/bin/目录中的文件移植到arm linux系统中的/usr/bin或其它目录中,如果移植到其它目录中,则需要将该目录添加到环境变量PATH指的执行路径中;
(2) 将参数--prefix指定的路径值/sbin/目录中的文件移植到arm linux系统中的/usr/bin或其它目录中,如果移植到其它目录中,则需要将该目录添加到环境变量PATH指的执行路径中;
(3) 参数--prefix指定的路径值/share/目录中的内容可以移植也可以不移植,如果移植,则移植到arm linux系统中的目录路径和其在pc中的安装路径相同。
需要注意/dev/snd/ 目录中,此目录下应包含以下几个设备文件 ( 驱动 ) , controlC0, pcmC0D0c, pcmC0D0p, timer,如果没有,需要手动创建,方法如下:
mkdir /dev/snd
mknod /dev/snd/controlC0 c 116 0
mknod /dev/snd/pcmC0D0p c 116 16
mknod /dev/snd/pcmC0D0c c 116 24
mknod /dev/snd/seq c 116 1
mknod /dev/snd/hwC0D0 c 116 4
mknod /dev/snd/timer c 116 33
可以通过cat /proc/asound/devices,正常会看到一些设备来决定创建哪些设备节点。
0: [ 0] : control
16: [ 0- 0]: digital audio playback
24: [ 0- 0]: digital audio capture
33: : timer
D、测试
详见https://blog.csdn.net/sinat_35706094/article/details/87621498。
https://blog.csdn.net/yuanxinfei920/article/details/52954941
https://blog.csdn.net/luckywang1103/article/details/45626201
https://blog.csdn.net/kunkliu/article/details/80434627
https://blog.csdn.net/ropenyuan/article/details/8078100
https://blog.csdn.net/cean1024/article/details/52247807
https://www.alsa-project.org/wiki/Main_Page