1. 程式人生 > >[RK3288][Android6.0] 使用者空間對音訊暫存器的控制

[RK3288][Android6.0] 使用者空間對音訊暫存器的控制

Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92

Audio HAL控制驅動中的暫存器是通過kcontrol結構實現的,kcontrol有多種型別,如mixer, mux等,由struct snd_kcontrol_new表示。

簡單型控制元件:
只有一個控制量,比如一個開關。如:

static const struct snd_kcontrol_new rt3261_snd_controls[] = {
    SOC_SINGLE("Mono Playback Switch", RT3261_MONO_OUT,
                RT3261_L_MUTE_SFT, 1
, 1), };

名字是”Mono Playback Switch”, 暫存器是RT3261_MONO_OUT, 控制的bit位是RT3261_L_MUTE_SFT

對應的巨集定義:

SOC_SINGLE
SOC_DOUBLE
還有衍生版本: SOC_DOUBLE_TLV, SOC_DOUBLE_EXT_TLV等等。

Mixer控制元件:
用於音訊通道的路由控制,由多個輸入和一個輸出組成,多個輸入可以自由地混合在一起,形成混合後的輸出。
對於Mixer控制元件,我們可以認為是多個簡單控制元件的組合,通常,我們會為mixer的每個輸入端都單獨定義一個簡單控制元件來控制該路輸入的開啟和關閉,反應在程式碼上,就是定義一個soc_kcontrol_new陣列,如

static const struct snd_kcontrol_new rt3261_dig_l_mix[] = {
    SOC_DAPM_SINGLE("DAC L1 Switch", RT3261_DIG_MIXER,
            RT3261_M_STO_L_DAC_L_SFT, 1, 1),
    SOC_DAPM_SINGLE("DAC L2 Switch", RT3261_DIG_MIXER,
            RT3261_M_DAC_L2_DAC_L_SFT, 1, 1),
};

巨集定義和前者一樣。

Mux控制元件:

mux控制元件與mixer控制元件類似,也是多個輸入端和一個輸出端的組合控制元件,與mixer控制元件不同的是,mux控制元件的多個輸入端同時只能有一個被選中。如:

static const struct snd_kcontrol_new rt3261_sto_adc_l1_mux =
    SOC_DAPM_ENUM("Stereo ADC L1 source", rt3261_stereo_adc1_enum);

對應的巨集定義:

SOC_ENUM
SOC_ENUM_DOUBLE

還有很多衍生版本: SOC_ENUM_SINGLE_EXT,SOC_VALUE_ENUM_DOUBLE等。

不管如何定義,最終都會提供給使用者空間三個關鍵介面(函式指標):
info: 獲取當前kcontrol支援資訊。
get: 獲取當前kcontrol資訊。
put: 設定kcontorl資訊。

使用者空間對kcontrol的控制介面通過ioctl進行,cmd是SNDRV_CTL_IOCTL_ELEM_WRITE。

目前平臺有兩個模組有呼叫:
1. tinymix自帶部分。 位於 external/tinyalsa/mixer.c
2. rk audio HAL部分。 位於hardware/rockchip/audio/tinyalsa_hal/alsa_mixer.c

相關推薦

[RK3288][Android6.0] 使用者空間音訊控制

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 Audio HAL控制驅動中的暫存器是通過kcontrol結構實現的,kcontrol有多種型別,如mixer, mux等,由struct snd_kco

[RK3288][Android6.0] 除錯筆記 --- pmu(rk818)讀寫

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 rk的pmu模組只提供了每次單個暫存器的讀寫,驅動提供了這個節點供使用:/sys/rk818/rk818_test 舉例: 讀取: echo r

1.4 x86 CPU地址空間分配和訪問

1、基本概念 cpu地址空間和pci地址空間是兩個常用的比較容易混淆的概念,特別是其中不同系列的cpu的實現還各不相同:x86系列cpu地址空間和pci地址空間是重合的,即為同一空間;而非x86 cpu的cpu地址空間和pci地址空間為兩個獨立的空間。 也許

[RK3288][Android6.0] 音訊輸入介面Mic In和Line In

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 Mic in的訊號幅度很小,需要在接入電路上加入放大電路,另外其匹配阻抗較line in要大很多。 Line in的輸入訊號幅度可以很大,且接入電路上無

[RK3288][Android6.0] WiFi之Autojoin無線網路的選擇機制

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 當有兩個或者兩個以上的已經儲存的無線網路可以連線時,系統通過attemptAutoJoin()來選擇一個最優網路。 假設只有兩個儲存的無線網路,配置檔案

[RK3288][Android6.0] 除錯筆記 --- 普通串列埠的新增

Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 uart0,1,3,4 (普通串列埠) 用的是同一個串列埠驅動. uart2(除錯串列埠)的驅動程式碼嵌在fiq debugger的code中. 相關的配置在rk3288.dtsi中:

rk3288 android6.0 camera子系統

概述 camera kernel驅動是基於Linux的v4l2驅動,裝置名/dev/videox。camera系統採用Client/Service構架,通過Binder IPC來通訊,最終Client通過呼叫Service介面實現各個具體功能。Service程序負責

[RK3288][Android6.0] 除錯筆記 --- hwclock命令無法使用

Platform: Rockchip  OS: Android 6.0  Kernel: 3.10.92 現象:  使用hwclock,提示找不到檔案 [email protected]:/ # hwclock                          

[RK3288][Android6.0] 控制匯流排通用介面regmap小結

Platform: RockchipOS: Android 6.0Kernel: 3.10.92看音訊模組時發現了一個叫regmap的東西,看了下以後勢必會用到,也把小結分享給大家。之前使用I2C或者SPI匯流排進行讀寫時的框架:需要自己再對讀寫函式進行封裝,這樣每個裝置驅動

[RK3288][Android6.0] AT24C02驅動分析及功能增加小結

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 Spec: 網上很多,如 https://wenku.baidu.com/view/0020131fff00bed5b8f31d05.html驅動: 檔案: kernel/

[RK3288][Android6.0] I2C預設傳輸速率及修改

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 RK對應的i2c controller驅動在 kernel/drivers/i2c/busses/i2c-rockchip.c 對應的傳輸函式是rockchip_i2c_

[RK3288][Android6.0] RTC驅動的上層呼叫流程

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 說明: RTC驅動在註冊的時候提供了兩個字元裝置給使用者空間供操作。 1. /dev/alarm, android特有裝置,為了提高平臺無關性而加

[RK3288][Android6.0] 除錯筆記 --- I2C通訊失敗問題

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 使用rk3288的i2c5讀寫時,會出現以下error log: [email prot

[RK3288][Android6.0] 系統除錯串列埠驅動流程小結

Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 rk3288提供了fiq debugger功能, 因此rk將debug uart和普通uart區分開來, debug uart的初始化整合到了fiq debugger程式碼中完成,不過uart的初始化 方法還

[RK3288][Android6.0] 除錯筆記 --- 測試I2C裝置正常傳輸方法

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 rk在驅動層做了一個通用i2c測試程式碼提供給上層快速測試i2c外設是否傳輸正常. 測試使用方法

[RK3288][Android6.0] 移植筆記 --- 13.3寸eDP顯示屏新增

Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 不得不說從 RGB -> LVDS -> MIPI -> eDP 一路過來,現在的

[RK3288][Android6.0] 除錯筆記 --- eMMC分割槽號和名字的對應

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 有時候需要知道mmcblk對應的分割槽是哪一個,其實驅動已經完成這個功能了,如下: [email protected]:/dev/blo

[RK3288][Android6.0] PMIC之RK818驅動小結

uboot部分: pmic_init ->    power_rockchip.c     pmic_rk818_init ->    pmic_rk818.c         rk818_parse_dt ->             fdt_get_i2c_info           

[RK3288][Android6.0] 除錯筆記 --- user版本串列埠只有輸出不能輸入

Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92現象: 編譯成user版本之後串列埠只有輸出沒有輸入.原因: 編譯user版本之後 ro.debug

[RK3288][Android6.0] 除錯筆記 --- 系統自帶預置第三方APK方法

Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 Rockchip預設提供了機制來預置第三方APK, 方法很簡單: 1. 在device/rockchip/rk3288建立preinstall目錄(如果