- 1. 架构
- 2. 文件组成
- 3. ALSA核心层
- 4. ASoC框架
整体框架
| 文件/文件夹 | 作用 |
|---|---|
| aoa | 苹果板载音频驱动 |
| arm | arm音频设备支持 |
| atmel | atmel ABDAC(音频字节流数模转换器)和ac97C(ac97控制器) |
| core | alsa驱动中间层,是alsa驱动的核心 |
| drivers | 与cpu、bus无关的公用代码 |
| firewire | IEEE-1394/FireWire/iLink音频设备支持 |
| hda | HD audio(高保真音频)支持 |
| i2c | alsa的i2c控制代码 |
| isa | 各种isa声卡的代码 |
| mips | mips音频设备支持 |
| oss | 对oss的兼容支持 |
| parisc | 鸿蒙和PA-RISC架构的GSC音频设备支持 |
| pci | pci音频设备支持 |
| pcmcia | pcmcia音频设备支持 |
| ppc | PowerPC音频设备支持 |
| sh | SuperH架构音频设备支持 |
| soc | system-on-chip体系的中间层代码 |
| sparc | SPARC架构音频设备支持 |
| spi | spi音频设备支持 |
| synth | 一些工具 |
| usb | usb音频设备支持 |
| ac97_bus.c | 实现ac97标准总线 |
| last.c | 音频设备注册完成后打印”ALSA devices List” |
| sound_core.c | 注册音频核心层子系统 |
| sound_firmware.c | 加载音频驱动固件 |
soundsocsunxisun4i-codec.c
static struct snd_soc_card *suniv_codec_create_card(struct device *dev)
{
struct snd_soc_card *card;
int ret;
card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
if (!card)
return ERR_PTR(-ENOMEM);
card->dai_link = sun4i_codec_create_link(dev, &card->num_links);
if (!card->dai_link)
return ERR_PTR(-ENOMEM);
card->dev = dev;
card->name = "F1C100s Audio Codec";
card->dapm_widgets = suniv_codec_card_dapm_widgets;
card->num_dapm_widgets = ARRAY_SIZE(suniv_codec_card_dapm_widgets);
card->dapm_routes = suniv_codec_card_routes;
card->num_dapm_routes = ARRAY_SIZE(suniv_codec_card_routes);
card->fully_routed = true;
ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing");
if (ret)
dev_warn(dev, "failed to parse audio-routing: %dn", ret);
return card;
};
static const struct sun4i_codec_quirks suniv_f1c100s_codec_quirks = {
.regmap_config = &suniv_codec_regmap_config,
.codec = &suniv_codec_codec,
.create_card = suniv_codec_create_card,
.reg_adc_fifoc = REG_FIELD(SUNIV_CODEC_ADC_FIFOC, 0, 31),
.reg_dac_txdata = SUN4I_CODEC_DAC_TXDATA,
.reg_adc_rxdata = SUNIV_CODEC_ADC_RXDATA,
.has_reset = true,
.dma_max_burst = SUNIV_DMA_MAX_BURST,
};
static const struct of_device_id sun4i_codec_of_match[] = {
{
.compatible = "allwinner,suniv-f1c100s-codec",
.data = &suniv_f1c100s_codec_quirks,
},
};
static struct platform_driver sun4i_codec_driver = {
.driver = {
.name = "sun4i-codec",
.of_match_table = sun4i_codec_of_match,
},
.probe = sun4i_codec_probe,
.remove = sun4i_codec_remove,
};
module_platform_driver(sun4i_codec_driver);
socsunxisun4i-i2s.c
static const struct of_device_id sun4i_i2s_match[] = {
{
.compatible = "allwinner,sun4i-a10-i2s",
.data = &sun4i_a10_i2s_quirks,
},
{
.compatible = "allwinner,sun6i-a31-i2s",
.data = &sun6i_a31_i2s_quirks,
},
{
.compatible = "allwinner,sun8i-a83t-i2s",
.data = &sun8i_a83t_i2s_quirks,
},
{
.compatible = "allwinner,sun8i-h3-i2s",
.data = &sun8i_h3_i2s_quirks,
},
{
.compatible = "allwinner,sun50i-a64-codec-i2s",
.data = &sun50i_a64_codec_i2s_quirks,
},
{}
};
static struct platform_driver sun4i_i2s_driver = {
.probe = sun4i_i2s_probe,
.remove = sun4i_i2s_remove,
.driver = {
.name = "sun4i-i2s",
.of_match_table = sun4i_i2s_match,
.pm = &sun4i_i2s_pm_ops,
},
};
module_platform_driver(sun4i_i2s_driver);



