alsa结构体流程3

/* SoC Audio Codec device */
struct snd_soc_codec {
    const char *name;                 /* Codec的名字*/
    const char *name_prefix;
    int id;
    struct device *dev;              /* 指向Codec设备的指针 */    
    const struct snd_soc_codec_driver *driver;  /* 指向该codec的驱动的指针 */ 
    struct mutex mutex;
    struct snd_soc_card *card; /* 指向Machine驱动的card实例 */
    struct list_head list;
    struct list_head card_list;
    int num_dai;   /* 该Codec数字接口的个数,目前越来越多的Codec带有多个I2S或者是PCM接口 */
    enum snd_soc_compress_type compress_type;
    size_t reg_size;    /* reg_cache_size * reg_word_size */
    int (*volatile_register)(struct snd_soc_codec *, unsigned int);
    int (*readable_register)(struct snd_soc_codec *, unsigned int);

    /* runtime */
    struct snd_ac97 *ac97;  /* for ad-hoc ac97 devices */
    unsigned int active;
    unsigned int cache_bypass:1; /* Suppress access to the cache */
    unsigned int suspended:1; /* Codec is in suspend PM state */
    unsigned int probed:1; /* Codec has been probed */
    unsigned int ac97_registered:1; /* Codec has been AC97 registered */
    unsigned int ac97_created:1; /* Codec has been created by SoC */
    unsigned int sysfs_registered:1; /* codec has been sysfs registered */
    unsigned int cache_init:1; /* codec cache has been initialized */
    u32 cache_only;  /* Suppress writes to hardware */
    u32 cache_sync; /* Cache needs to be synced to hardware */

    /* codec IO */
    void *control_data; /* codec control (i2c/3wire) data 该指针指向的结构用于对codec的控制,通常和read,write字段联合使用 */
    hw_write_t hw_write;
    unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int);
    unsigned int (*read)(struct snd_soc_codec *, unsigned int);  /* 读取Codec寄存器的函数 */ 
    int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);  /* 写入Codec寄存器的函数 */  
    void *reg_cache;
    const void *reg_def_copy;
    const struct snd_soc_cache_ops *cache_ops;
    struct mutex cache_rw_mutex;

    /* dapm */
    struct snd_soc_dapm_context dapm;  /* 用于DAPM控件 */
#ifdef CONFIG_DEBUG_FS
    struct dentry *debugfs_codec_root;
    struct dentry *debugfs_reg;
    struct dentry *debugfs_dapm;
#endif
};

/* codec driver */
struct snd_soc_codec_driver {

	/* driver ops */
	int (*probe)(struct snd_soc_codec *);
	int (*remove)(struct snd_soc_codec *);
	int (*suspend)(struct snd_soc_codec *,
			pm_message_t state);
	int (*resume)(struct snd_soc_codec *);

	/* Default DAPM setup, added after probe() is run */
	const struct snd_soc_dapm_widget *dapm_widgets;
	int num_dapm_widgets;
	const struct snd_soc_dapm_route *dapm_routes;
	int num_dapm_routes;

	/* codec wide operations */
	int (*set_sysclk)(struct snd_soc_codec *codec,
			  int clk_id, unsigned int freq, int dir);
	int (*set_pll)(struct snd_soc_codec *codec, int pll_id, int source,
		unsigned int freq_in, unsigned int freq_out);

	/* codec IO */
	unsigned int (*read)(struct snd_soc_codec *, unsigned int);
	int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
	int (*display_register)(struct snd_soc_codec *, char *,
				size_t, unsigned int);
	int (*volatile_register)(struct snd_soc_codec *, unsigned int);
	int (*readable_register)(struct snd_soc_codec *, unsigned int);
	short reg_cache_size;
	short reg_cache_step;
	short reg_word_size;
	const void *reg_cache_default;
	short reg_access_size;
	const struct snd_soc_reg_access *reg_access_default;
	enum snd_soc_compress_type compress_type;

	/* codec bias level */
	int (*set_bias_level)(struct snd_soc_codec *,
			      enum snd_soc_bias_level level);

	void (*seq_notifier)(struct snd_soc_dapm_context *,
			     enum snd_soc_dapm_type, int);
};

codec驱动把自己注册为一个platform driver,那对应的platform device在哪里定义?

答案是在以下代码文件中:/drivers/mfd/wm8994-core.c。

WM8994本身具备多种功能,除了codec外,它还有作为LDO和GPIO使用,这几种功能共享一些IO和中断资源,linux为这种设备提供了一套标准的实现方法:mfd设备。其基本思想是为这些功能的公共部分实现一个父设备,以便共享某些系统资源和功能,然后每个子功能实现为它的子设备,这样既共享了资源和代码,又能实现合理的设备层次结构,主要利用到的API就是:mfd_add_devices(),mfd_remove_devices(),mfd_cell_enable(),mfd_cell_disable(),mfd_clone_cell()。


from:

Linux ALSA声卡驱动之八:ASoC架构中的Platform



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中的ALSA(Advanced Linux Sound Architecture)流程是用于音频处理的一种架构。它允许Android设备与硬件之间进行高性能的音频交互。 在Android中,ALSA流程可以简要归纳为以下步骤: 1. 初始化:首先,Android系统会初始化ALSA框架,这包括加载相应的驱动程序和配置系统音频参数。 2. 设置音频路径:Android会根据应用程序的音频要求,设置音频通道和路径。例如,如果要播放音乐,则会设置音频输出路径为耳机或扬声器。 3. 数据捕获和处理:如果有需要,Android设备可以捕获麦克风输入的音频数据。这些数据经过ALSA框架和硬件处理,以实现噪音过滤、音频增益等功能。 4. 数据播放和处理:对于音频播放,Android设备从存储中读取音频数据,并通过ALSA框架将其传递给相应的硬件。在传递过程中,ALSA还可以对音频数据进行降噪、音效处理等操作。 5. 同步和控制:在音频数据的捕获和播放过程中,ALSA会实时控制和同步音频输入和输出。它会根据音频缓冲区的状态来动态调整流程,以确保良好的音频质量和延迟。 6. 关闭和释放:当音频处理完成时,Android会关闭ALSA,释放资源并恢复系统原始状态。 总而言,ALSA流程是为了实现Android设备与音频硬件的高效交互。它提供了一套API和驱动程序,使得应用程序开发者可以轻松访问设备的音频功能,并以良好的音频质量进行音频处理和播放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值