这里直接从hardware层开始分析
hardware/rockchip/audio/legacy_hal/AudioHardware.cpp
1 | ssize_t AudioHardware::AudioStreamOutALSA::write(const void* buffer, size_t bytes) |
hardware/rockchip/audio/legacy_hal/alsa_pcm.c
1 | int pcm_write(struct pcm *pcm, void *data, unsigned count) |
#define SNDRV_PCM_IOCTL_WRITEI_FRAMES
_IOW('A', 0x50, struct snd_xferi)
这里可以看到,Audio通过了ioctl
控制进入驱动层写数据
那么再找找pcm->fd
是哪个节点
hardware/rockchip/audio/legacy_hal/alsa_pcm.c
1 | struct pcm *pcm_open(unsigned flags) { |
上面我打印,得到的路经是 /dev/snd/pcmC0D0p,路经位置可以进入
adb shell
来验证
ioctl用法参考:http://blog.sina.com.cn/s/blog_ba08e8e00101bw4e.html
http://www.cnblogs.com/geneil/archive/2011/12/04/2275372.html
接下来就是看驱动层是怎么通过ioctl来实现播放声音的
1 | cd kernel/sound |
kernel/sound/core/pcm.c, 但是发现不是在里,后面我是通过宏来定位地方的,整体目录还是在这
core
里的
include/uapi/sound/asound.h
#define SNDRV_PCM_IOCTL_WRITEI_FRAMES_IOW('A', 0x50, struct snd_xferi)
kernel/sound/core/pcm_native.c
1 | static int snd_pcm_playback_ioctl1(struct file *file, |
总结,通过hw层写byte数据,然后通过ioctl定位至驱动层,写入相应寄存器发声,大致一对一的关系