【问题】
自己用buildroot编了一个新的rootfs,然后烧到板子里,都可以正常跑起来了,但是运行amixer的时候出错了:
amixer: Control default open error: No such file or directory
【解决过程】
1.查看了别的某个可以正常使用amixer的rootfs,然后和当前用的rootfs比较,发现当前的rootfs,缺少很多设备节点文件,所以,按照直观的自己的理解,用mknod加入了下面这些设备节点:
crw-r—– 1 root root 116, 24 2010-02-25 11:18 pcmC0D0c
crw-r—– 1 root root 116, 16 2010-02-25 11:18 pcmC0D0p
crw-r—– 1 root root 116, 25 2010-02-25 11:18 pcmC0D1c
crw-r—– 1 root root 116, 17 2010-02-25 11:18 pcmC0D1p
crw-r—– 1 root root 116, 26 2010-02-25 11:18 pcmC0D2c
crw-r—– 1 root root 116, 18 2010-02-25 11:18 pcmC0D2p
结果还是不行,又加了这个:
crw-r—– 1 root root 116, 0 2010-02-25 11:18 controlC0
仍然不行。
2.索性去
ftp://ftp.alsa-project.org/pub/
下载了alsa的相关源码:alsa-lib-1.0.9和alsa-utils-1.0.9
ftp://ftp.alsa-project.org/pub/utils/alsa-utils-1.0.9.tar.bz2
然后建了个source Insight工程,方便搜索源码,
找到了对应错误提示部分的源码:
alsa-utils-1.0.9amixeramixer.c:
static int info(void)
{
…
if ((err = snd_ctl_open(&handle, card, 0)) < 0) {
error("Control device %s open error: %s", card, snd_strerror(err));
return err;
}
…
}
很明显,其是去调用了snd_ctl_open:
alsa-lib-1.0.9srccontrolcontrol.c:
int snd_ctl_open(snd_ctl_t **ctlp, const char *name, int mode)
{
int err;
assert(ctlp && name);
err = snd_config_update();
if (err < 0)
return err;
return snd_ctl_open_noupdate(ctlp, snd_config, name, mode);
}
然后跟踪代码看了下,发现太复杂,搞不清默认的设备节点的名字到底是啥。。。
3.最后,发现,原来那些需要的设备节点,都是在/dev/snd下面才可以,即按照下面建立那些对应设备节点,就可以了:
# mkdir /dev/snd
# cd /dev/snd
# ls -lh
crw-r–r– 1 root root 116, 0 Dec 31 17:10 controlC0
crw-r–r– 1 root root 116, 0 Dec 31 17:08 controlc0
crw-r–r– 1 root root 116, 24 Dec 31 17:05 pcmC0D0c
crw-r–r– 1 root root 116, 16 Dec 31 17:05 pcmC0D0p
crw-r–r– 1 root root 116, 25 Dec 31 17:05 pcmC0D1c
crw-r–r– 1 root root 116, 17 Dec 31 17:06 pcmC0D1p
crw-r–r– 1 root root 116, 26 Dec 31 17:06 pcmC0D2c
crw-r–r– 1 root root 116, 18 Dec 31 17:06 pcmC0D2p
crw-r–r– 1 root root 116, 1 Dec 31 17:10 seq
crw-r–r– 1 root root 116, 33 Dec 31 17:10 timer
再执行amixer,就可以正常执行了:
# amixer cset numid=1,iface=MIXER,name=’Master Volume’ 27
numid=1,iface=MIXER,name=’Master Volume’
; type=INTEGER,access=rw—R–,values=2,min=0,max=27,step=0
: values=27,27
| dBscale-min=-40.50dB,step=1.50dB,mute=0
# amixer cset numid=24,iface=MIXER,name=’Mixer DAC Mix Switch’ 1
numid=24,iface=MIXER,name=’Mixer DAC Mix Switch’
; type=BOOLEAN,access=rw——,values=1
: values=on
# amixer cset numid=20,iface=MIXER,name=’DAC Output Switch’ 1
numid=20,iface=MIXER,name=’DAC Output Switch’
; type=BOOLEAN,access=rw——,values=1
: values=on
# amixer cset numid=6,iface=MIXER,name=’PCM Switch’ 1
numid=6,iface=MIXER,name=’PCM Switch’
; type=BOOLEAN,access=rw——,values=1
: values=on
# amixer cset numid=5,iface=MIXER,name=’PCM Volume’ 27
numid=5,iface=MIXER,name=’PCM Volume’
; type=INTEGER,access=rw—R–,values=2,min=0,max=27,step=0
: values=27,27
| dBscale-min=-40.50dB,step=1.50dB,mute=0
也就是,之前最开始创建的那些节点虽然是对的,但是是/dev下面的,而不是/dev/snd下面的,所以不行。
【总结】
办法很简单,就是确定你需要哪些对应alsa的那些util,比如amixer等,所需要的对应的设备节点,自己创建好对应的设备节点即可。
至少此处,只需要建立如下节点即可:
# mkdir /dev/snd
# cd /dev/snd
# ls -lh
crw-r–r– 1 root root 116, 0 Dec 31 17:10 controlC0
crw-r–r– 1 root root 116, 0 Dec 31 17:08 controlc0
crw-r–r– 1 root root 116, 24 Dec 31 17:05 pcmC0D0c
crw-r–r– 1 root root 116, 16 Dec 31 17:05 pcmC0D0p
crw-r–r– 1 root root 116, 25 Dec 31 17:05 pcmC0D1c
crw-r–r– 1 root root 116, 17 Dec 31 17:06 pcmC0D1p
crw-r–r– 1 root root 116, 26 Dec 31 17:06 pcmC0D2c
crw-r–r– 1 root root 116, 18 Dec 31 17:06 pcmC0D2p
crw-r–r– 1 root root 116, 1 Dec 31 17:10 seq
crw-r–r– 1 root root 116, 33 Dec 31 17:10 timer
【提示】
如果想要buildroot中,自动生成上述对应的设备节点,那么就把如下内容:
#new ALSA Audio stuff
/dev/snd/controlC0 c 666 0 0 116 0 – – –
/dev/snd/seq c 666 0 0 116 1 – – –
/dev/snd/pcmC0D0p c 666 0 0 116 16 – – –
/dev/snd/pcmC0D1p c 666 0 0 116 17 – – –
/dev/snd/pcmC0D2p c 666 0 0 116 18 – – –
/dev/snd/pcmC0D0c c 666 0 0 116 24 – – –
/dev/snd/pcmC0D1c c 666 0 0 116 25 – – –
/dev/snd/pcmC0D2c c 666 0 0 116 26 – – –
/dev/snd/timer c 666 0 0 116 33 – – –
加入到targetgenericdevice_table.txt即可。
【引用】
1。alsamixer: function snd_ctl_open failed for default: No such file or directory
转载请注明:在路上 » 【已解决】amixer: Control default open error: No such file or directory