1. 程式人生 > >linux驅動:音訊驅動(一)ALSA

linux驅動:音訊驅動(一)ALSA

一、【基礎知識】

1、J2 《--HPR_OUT+HPL_OUT 《--  U13(TLV320AIC3104IRHBR)的HPROUT+HPLOUT

2、驅動原始碼

IPNC_RDK_V3.8.0.1/Source/ti_tools/ipnc_psp_arago/kernel/sound/soc/codecs/tlv320aic3x.c

3、依賴於I2C驅動

4、音效卡驅動框架:ALSA(Advanced Linux Sound Architecture)

6、結構體snd_card描述一個音效卡裝置

7、結構體snd_device描述子裝置

8、音效卡裝置

[email protected]:kernel$ls /dev/snd/ -l

總用量 0

drwxr-xr-x  2 root root       60 十二 15 09:10 by-path

crw-rw---T+1 root audio 116,  6 十二 15 09:10 controlC0

crw-rw---T+1 root audio 116,  2 十二 15 09:10 midiC0D0

crw-rw---T+1 root audio 116,  5 十二 15 09:11 pcmC0D0c

crw-rw---T+1 root audio 116,  4 十二 15 09:36 pcmC0D0p

crw-rw---T+1 root audio 116,  3 十二 15 09:10 pcmC0D1p

crw-rw---T+1 root audio 116,  1 十二 15 09:10 seq

crw-rw---T+1 root audio 116, 33 十二 15 09:10 timer

[email protected]:kernel$ls /dev/snd/by-path/ -l

總用量 0

lrwxrwxrwx1 root root 12 十二 15 09:10pci-0000:02:03.0 -> ../controlC0

9、主裝置號

Include/sound/core.h中

#defineCONFIG_SND_MAJOR    116 /* standardconfiguration */

10、sound目錄說明:在《深度實踐嵌入式。。。》640頁

二、【驅動框架】

1、建立音效卡:snd_card_new(linux 2.6.22以上被snd_card_create代替) --->

2、建立子裝置:

snd_device_new(snd_pcm_new、snd_rawmidi_new、snd_ctl_new、snd_timer_new、snd_card_proc_new、snd_jack_new) --->

3、註冊音效卡:snd_card_register

三、【PCM功能】

PCM:脈衝編碼調製,將模擬轉換成數字

0、結構體包含關係

0.1struct snd_pcm --> snc_pcm_str --> snd_pcm_substream --> (snd_pcm_ops+ snd_pcm_runtime)

0.2snd_pcm_runtime --> snd_pcm_hardware  

1、結構體描述PCM:struct snd_pcm

2、註冊pcm:snd_pcm_new

3、pcm流與pcm子流:snc_pcm_str、snd_pcm_substream

4、子流中的重要結構體

4.1snd_pcm_ops:pcm流的操作方法需要在具體音效卡中實現

4.2snd_pcm_runtime:硬體描述、中斷回撥、DMA緩衝區及私有資料等成員需要在具體音效卡中實現

4.2.1snd_pcm_hardware:硬體描述

5、pcm裝置檔案的建立

5.1 描述邏輯裝置的結構體:snd_minor

5.2 建立過程:

snd_card_register--> snd_pcm_register  -->snd_pcm_new --> snd_pcm_dev_register --> snd_register_device_for_dev  --> (snd_kernel_minor獲取裝置號+device_create建立裝置節點)

6、PCM裝置檔案的訪問

6.1 檔案操作f_ops的指定

操作集合是snd_pcm_f_ops陣列中的一項,定義在sound/core/pcm_native.c中

6.2 註冊字元裝置

alsa_sound_init--> register_chrdev(major, “alsa”, &snd_fops)

snd_fops中只有一個snd_open函式,該函式根據次裝置號從snd_miors陣列中取出對應的snd_minor物件,並將檔案的操作集合(file->f_op)用該物件的f_ops成員替換,具體到PCM裝置(一個snd_minor物件),該檔案操作集合就是snd_pcm_f_ops中的相應操作

四、【音效卡控制項】

1、控制項建立

1.1 描述控制項結構體:snd_kcontorl(include/sound/control.h中)

1.2 建立控制項函式:snd_ctl_new1

1.3 將控制項新增到它所屬的音效卡中:snd_ctl_add

1.4 控制項回撥函式:info、get、put

2、 Cotrol裝置建立

snd_card_create--> snd_ctl_new --> snd_ctl_dev_register-->snd_register_device_for_dev  -->(snd_kernel_minor獲取裝置號+device_create建立裝置節點)

3、Cotrol裝置檔案的訪問

過程與PCM相同,不同點:將檔案操作集合替換成snd_ctl_f_ops

相關推薦

linux驅動音訊驅動ALSA

一、【基礎知識】 1、J2 《--HPR_OUT+HPL_OUT 《--  U13(TLV320AIC3104IRHBR)的HPROUT+HPLOUT 2、驅動原始碼 IPNC_RDK_V3.8.0.1/Source/ti_tools/ipnc_psp_arago/kern

linux驅動開發之蜂鳴器驅動源碼分析

linux 蜂鳴器 驅動 蜂鳴器的驅動源碼在/driver/char/buzzer/x210-buzzer.c文件中,源碼如下#include <linux/module.h> #include <linux/kernel.h> #include <linux

Linux驅動開發除錯技術

驅動程式開發的一個重大難點就是不易除錯。本文目的就是介紹驅動開發中常用的幾種直接和間接的除錯手段,它們是:     使用printk     檢視OOP訊息     使用strace     使用核心內建的hacking選項     使用ioctl方法     使用/proc 檔案系統     使用

Linux裝置驅動之字元裝置

Linux中裝置驅動的分類 從上圖可以看到Linux系統將各異的裝置分為三大類:字元裝置,塊裝置和網路裝置。核心針對每一類裝置都提供了對應驅動模型架構,包括基本的核心設施和檔案系統介面。 字元裝置:在傳送過程中以字元為單位,一個位元組一個位元組的讀寫,不

Linux驅動子系統之I2C

1 硬體特性 1.1 概述 I2C匯流排是由Philips公司開發的兩線式序列匯流排,這兩根線為時鐘線(SCL)和雙向資料線(SDA)。由於I2C匯流排僅需要兩根線,因此在電路板上佔用的空間更少,帶來的問題是頻寬較窄。I2C在標準模式下傳輸速率最高100Kb/s,在快速模式下最高可達400kb/s。屬於半

FS_S5PC100平臺上Linux Camera驅動開發詳解

說明:         理解攝像頭驅動需要四個前提:         1)攝像頭基本的工作原理和S5PC100整合的 Camera控制器 的工作原理         2)platform_device和platform_driver工作原理         3)Linu

linux裝置驅動模型架構分析——概述

概述 LDD3中說:“Linux核心需要一個對系統結構的一般性描述。”這個描述就是linux裝置驅動模型(下面簡稱為LDDM)。LDDM不是獨立存在,其體系如下圖所示: LDDM體系結構 對架構的每一部分本文都會開闢獨立的章節進行描述。暫且拋開這個架構,首先從總體上了

Linux 裝置驅動開發 —— 驅動開發環境建立

引言   Linux 裝置驅動簡介:它在 Linux 系統中扮演著重要角色,是很多獨立的“黑盒子”的總稱,使某個特定硬體響應一個定義良好的內部程式設計介面,這些介面完全隱藏裝置的工作細節。使用者操作通過一組標準化的呼叫執行,而這些呼叫是和特定的驅動程式無關的。將這些呼叫對映

文件驅動 —— 表單元件表單元素元件

# 文件驅動 想要做到文件驅動表單,首先要做幾個表單元素元件。基於原生的HTML5的表單元素,做了一下分類,比如文字類、數字、日期、選擇等,具體如下圖。 【圖片】 ![](https://img2020.cnblogs.com/blog/17148/202009/17148-20200911103844023

Linux進階httpd服務

Socket套接字:IP和埠的組合 HTTP http:Hyper text transfer protocol 超文字(包含連線的檔案,點選地址會跳轉到令一個資源)傳輸協議 埠:80/TCP 主要傳輸html編碼的資料 http是應用層協議,基於傳輸層的tcp協議傳輸 html

java丨事件驅動程式設計學習筆記

一、事件和事件源 事件:事件可以定義為程式發生了某些事情的訊號 源物件(源元件):能建立一個事件並觸發該事件的元件成為源物件 事件類的根類:java.util.EventObject 可以使用EventObject類中的例項方法getSource()獲得事件的源物件 如果一

Linux網絡編程一個簡單的socket程序

服務 htonl 網絡 pre fin efi from ret span 服務器: /* *tcp_server.c */ #include <stdio.h> #include <sys/socket.h> #include <ne

LCD驅動---LVDS詳解

fb_videomode每個引數的意思:  1struct fb_videomode {  2    const char *name;    //name  3    u32 refresh;        //Frequency  4    u32 xres;    

itop exynos4412 lcd驅動 詳細分析

(若轉載,請註明出處,若有錯誤請指正,謝謝) (以下分析皆基於:itop4412精英板裝置和程式碼資源) (核心為:iTop4412_Kernel_3.0提供) (看客需要一定的linux平臺驅動基礎,和lcd操作基礎) (針對lcd基本操作,我準備寫

linux提權輔助指令碼linux-exploit-suggester

#!/bin/bash # # Copyright (c) 2016-2018, mzet # # linux-exploit-suggester.sh comes with ABSOLUTELY NO WARRANTY. # This is free software, and you are we

Linux進階之路部署

經過長期的開發工作,在專案中經常會需要將打包好的專案部署到Linux伺服器上,不過,在此之前需要掌握一些Linux常用命令比如ls、ll、ps -ef|grep java 、cp、tail 等等,詳細的可以百度查一下,還是很多的。接下來,就說一下關於專案的部署。 首先需要一個遠端訪問Linu

USB滑鼠裝置驅動程式簡單實現

一、Linux下的USB驅動程式 分離和分層是Linux下驅動程式開發採用的最基本的形式,USB驅動開發在主機端主要涉及兩個部分:主機控制器驅動和裝置驅動。 主機控制器驅動主要是和具體的Soc相關的,它來識別USB裝置,安裝對應的裝置驅動程式,提供對USB裝置的讀寫函式。

字元裝置驅動核心框架小結

最近一直在學習驅動相關知識,但是如果說會用或者簡單的會寫的話我還不是很滿足,我還是想知道它底層是如何實現的。那閒話少說,最近也看了很多大牛的經驗總結,然後也就談談自己的看法吧~ 首先還是先列個大綱: 1、VFS如何實現; 2、字元裝置驅動框架; 一、VFS(

Arduino驅動ILI9341彩屏——顏色問題

  最近在淘寶的店鋪上淘到了一塊ILI9341的彩色液晶屏,打算研究一下如何使用。 淘寶店鋪購買螢幕之後有附原始碼可供下載,程式碼質量慘不忍睹,各種縮排不規範就不說了,先拿來試一下吧。 這是淘寶店鋪程式碼的核心部分: void setup() { Lcd_Init(); //LCD_Cle

領域驅動設計實踐——驗證

  領域模型設計為複雜問題的解決提供了一套方法,但其理論往往非常抽象,本系列文單旨在提供一些最佳實踐。您需要首先認識到,軟體的設計過程主觀性很強,我希望能夠提供一個設計思想讓您在入門中有一個感性的認識,莫要陷入到“教條主義”中。 領域驅動設計:強調的是戰略,是巨集觀的,它為複雜業務的解決提供了指導思想。在實