함수 sndsoc_register_codec () 분석

2570 단어 ALSAlinuxdriverAudio
함수 sndsoc_register_codec () 의 주요 역할 은 codec 를 ASoC 에 등록 하고 함수 snd 를 호출 하 는 것 입 니 다.soc_register_dais () 등록 DAI (디지털 오디 오 인터페이스).
여러 개의 주요 데이터 구 조 를 사 용 했 는데,
1. codec 와 관련 된 구조 체 는 장치 의 구조 체 'snd soc codec' 와 장치 작업 의 구동 'snd soc codec driver' 를 포함한다.
2. platform 과 관련 된 구조 체 는 장치 의 구조 체 인 'snd soc platform' 과 장치 작업 의 구동 인 'snd soc platform driver' 를 포함한다.
3. DAI (Digital Audio Interface) 와 관련 된 구조 체 는 장치 의 구조 체 'snd soc dai' 와 장치 작업 의 구동 'snd soc dai driver' 를 포함한다.
4. 또한 "snd soc card" 를 포함 하여, "snd_pcm_runtime", "snd_soc_dai_link";
이들 구조 체 를 상세 하 게 분석 하고 정리 하면 ALSA 가 어떻게 작 동 하 는 지 비교적 전면적으로 알 수 있다.
함수 안에서 어떤 동작 을 했 는 지 살 펴 보 자.
1. codec 에 메모리 공간 신청
codec 의 이름과 지정 한 형식 을 만 듭 니 다.
4. 567913. 3. codec 의 초기 화 는 읽 기와 쓰기 와 관련 된 조작 함수 (실제 codec drv 로 관리) 를 포함 하고 dev 와 driver 지침 의 링크 도 포함한다.
4. 567913. 4. 다음은 codec 레지스터 cache 와 관련 된 작업 입 니 다. 데이터 와 조작 함수 (왜 codec 에서 직접 읽 지 않 고 codec 에서 백업 해 야 합 니까? 이상 합 니 다) 를 포함 합 니 다.
데이터 형식 (big and little endian) 을 설정 합 니 다.
codec list 에 가입 합 니 다.
등록 DAI (디지털 오디 오 인터페이스)
DAI (Digital Audio Interface) 등록 에 대한 분석 은 박문 을 참고 하 시기 바 랍 니 다.http://blog.csdn.net/jgw2008/article/details/52808044
	codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
	if (codec == NULL)
		return -ENOMEM;

이로써 함수 snd soc register codec () 가 끝 났 습 니 다.
snd soc codec 구조 체 정 의 는 다음 과 같 습 니 다.
	/* create CODEC component name */
	codec->name = fmt_single_name(dev, &codec->id);
	if (codec->name == NULL) {
		ret = -ENOMEM;
		goto fail_codec;
	}

	if (codec_drv->compress_type)
		codec->compress_type = codec_drv->compress_type;
	else
		codec->compress_type = SND_SOC_FLAT_COMPRESSION;

snd soc codec driver 정 의 는 다음 과 같 습 니 다.
	codec->write = codec_drv->write;
	codec->read = codec_drv->read;
	codec->volatile_register = codec_drv->volatile_register;
	codec->readable_register = codec_drv->readable_register;
	codec->writable_register = codec_drv->writable_register;
	codec->ignore_pmdown_time = codec_drv->ignore_pmdown_time;
	codec->dapm.bias_level = SND_SOC_BIAS_OFF;
	codec->dapm.dev = dev;
	codec->dapm.codec = codec;
	codec->dapm.seq_notifier = codec_drv->seq_notifier;
	codec->dapm.stream_event = codec_drv->stream_event;
	codec->dev = dev;
	codec->driver = codec_drv;
	codec->num_dai = num_dai;
	mutex_init(&codec->mutex);

좋은 웹페이지 즐겨찾기