1. 程式人生 > >[ Linux驅動煉成記 ] 12 -音訊驅動TAS5754新增EQ引數

[ Linux驅動煉成記 ] 12 -音訊驅動TAS5754新增EQ引數

每一個帶有音訊播放的產品,裝置初期的時候都會除錯裝置的EQ引數。EQ通過將聲音中各頻率的組成泛音等級加以修改,專為某一類音樂進行優化,增強人們的感覺。常見包括:正常、搖滾、流行、舞曲、古典、柔和、爵士、金屬、重低音和自定義。1

調節音訊晶片EQ引數一般是專業音響公司做的,必須有專業的裝置和調音師完成,最終輸出晶片配套的檔案,供驅動寫入。這裡以TAS5754為例:

EQ引數

專業的音響裝置調好EQ後給的檔案,簡要如下:

//可以發現都是晶片內部暫存器的一些值
reg_value base_main_Rate48_REG_xxx_program[] = {
    {0x00,0x00},
    {0x00,0x01},
//			# reg[1][3] = 0x4
    {0x03,0x04},
    {0x00,0x00},
//			# reg[0][0x3] = 0x11
    {0x03,0x11},
//			# reg[0][2] = 0x10
    {0x02,0x10},
    {0xFF,0x04},
    {0xFF,0x05},
    {0x00,0x00},
//			# reg[0][0x2b] = 0x1f
    {0x2B,0x1F},
    {0x00,0x2C},
....
};

tas5754音訊晶片調完EQ引數後的值需要做簡單的修改:

reg_value base_main_Rate48_REG_Section_program[] = {
    {0x00,0x00},
    {0x00,0x01},
//			# reg[1][3] = 0x4
    {0x03,0x04},
    {0x00,0x00},
//			# reg[0][0x3] = 0x11
    {0x03,0x11},
//			# reg[0][2] = 0x10
    {0x02,0x10},
    {0xFF,0x04},    // 1. 寫ADC資料
    {0xFF,0x04},   //  2. 寫DAC資料
    {0x00,0x00},

檔案中提供了兩個陣列的資料,base_main_Rate48_REG_Section_program, tas5754_reg_values, 在第2處(寫DAC資料),插入第二個陣列的資料,同時把 {0xFF,0x04},  {0xFF,0x05}, 刪掉,第二個陣列就是DAC的EQ資料,因為TAS5754沒有ADC,所以 {0xFF,0x04}的資料為空,不用寫。

驅動寫入EQ

EQ引數實際對應的都是晶片暫存器值,驅動中需要通過IIC寫入到音訊晶片中,由於音訊晶片的EQ引數很多,需要單獨線上程中寫入,而不影響驅動的正常載入,這就需要核心中Workqueue機制2

  • tas5754的私有資料
// 私有資料
struct tas575x_private {
	struct snd_soc_codec *codec;
	... 
	struct workqueue_struct *workqueue;
	struct delayed_work      dwork;
	....
};
  • 建立工作佇列
static int tas575x_set_dai_fmt(struct snd_soc_dai *dai, unsigned int format)
{
	struct tas575x_private *priv = snd_soc_codec_get_drvdata(dai->codec);
	priv->codec = dai->codec;
	priv->format = format;
	//建立工作佇列
	priv->workqueue = create_singlethread_workqueue("tas575x_workqueue");
	// 建立工作,呼叫函式是tas575x_task
	INIT_DELAYED_WORK(&priv->dwork,tas575x_task);
	//延時5s去執行
	queue_delayed_work(priv->workqueue,&priv->dwork,5);
	
	return 0;
}

  • 工作佇列的處理函式
    處理函式中巧妙之處是使用了container_of這個巨集來從而避免了全域性變數的使用,該巨集的作用就是可以根據一個結構體變數中的一個成員變數的指標來獲取指向整個結構體變數的指標。
static void tas575x_task(struct work_struct *work)
{
	int i = 0;
	struct tas575x_private *priv;
	struct delayed_work *dwork = to_delayed_work(work);
	int cnt = sizeof(tas5754_reg_values)/sizeof(tas5754_reg_values[0]);
	pr_info("%s, reg cnt:%d\n", __func__, cnt);
	priv = container_of(dwork, struct tas575x_private, dwork);
	for(i = 0; i<cnt; i++){
		snd_soc_write(priv->codec, tas5754_reg_values[i].reg,tas5754_reg_values[i].val);
	}
}

相關推薦

[ Linux驅動 ] 12 -音訊驅動TAS5754新增EQ引數

每一個帶有音訊播放的產品,裝置初期的時候都會除錯裝置的EQ引數。EQ通過將聲音中各頻率的組成泛音等級加以修改,專為某一類音樂進行優化,增強人們的感覺。常見包括:正常、搖滾、流行、舞曲、古典、柔和、爵士、金屬、重低音和自定義。1 調節音訊晶片EQ引數一般是專業音響

[Linux驅動] 04-音訊晶片TAS5754外設

背景 整個嵌入式專案由Buildroot構建,現有專案增加音訊TAS5754驅動,詳細步驟如下 Buildroot 配置 核心檔案配置 Kernel -> Defconfig name -&g

[Linux驅動] 04-功放TAS5754

背景 整個嵌入式專案由Buildroot構建,現有專案增加音訊TAS5754驅動,詳細步驟如下 Buildroot 配置 核心檔案配置 Kernel -> Defconfig name -> 核心配置檔名稱 核心DTS配置

[Linux驅動] 07-檔案系統分割槽

檢視分割槽格式 # df -hT // ext4 檔案格式 Filesystem Type Size Used Available Use% Mounted on /dev/system ext4

[Linux驅動] 06-博通WIFI模組AP6212配置

Buildroot 配置 Kernel -> wifi modle -> AP6212 Kernel -> wifi modle -> wifi fw local path (wifi韌體路徑) 相關安裝包主要是: buildroot/

[Linux驅動] 05-儲存eMMC配置

嵌入式開發環境 主控晶片: Amlogic A113X Linux Kernel : 4.9 eMMc : 金士頓 4GB A113X主控晶片 金士頓的4GB eMMC 海力士256M DDR 博通WIFI模組 AP6212

[Linux驅動] 03-IIC外設從機地址

7位從機地址 在7位定址過程中,從機地址在啟動訊號後的第一個位元組開始傳輸,該位元組的前7位為從機地址,第8位為讀寫位,其中0表示寫,1表示讀 7位定址。I2C匯流排規範規定,標準模式I2C,從機地址為7位長,其次是讀/寫位 從機地址規定 任何I2C裝

[Linux驅動]02-IIC外設從機地址

7位從機地址 在7位定址過程中,從機地址在啟動訊號後的第一個位元組開始傳輸,該位元組的前7位為從機地址,第8位為讀寫位,其中0表示寫,1表示讀 7位定址。I2C匯流排規範規定,標準模式I2C,從機地

[Linux驅動] 04-儲存eMMC配置

嵌入式開發環境 主控晶片: Amlogic A113X Linux Kernel : 4.9 eMMc : 金士頓 4GB A113X主控晶片 金士頓的4GB eMMC 海力士256M DDR 博通WIFI模組 AP6212 支援eMMC 現有專案儲存

[Linux驅動] 08-GPIO按鍵

這裡以Amlogic A113為例 按鍵DTS配置 arch/arm64/boot/dts/amlogic/xxx.dts gpio key dts 配置 : gpio_keypad{ com

[Linux驅動] 09-串列埠除錯

實現功能 主控(Amlogic A113X)串列埠和MCU(STM32) 進行串列埠通訊,實現資料的傳輸,由STM32控制燈效.看似簡單的一個雙方對接功能,還是走了不少彎路的. 串列埠DTS配置 //

[Linux驅動] 10 -光感ISL29035除錯/IIO子系統

簡介 專案中需要加入光感檢測功能,需求一到,就打算自己寫驅動,意外的發現最新核心中已經支援該驅動ISL29035。配置好DTS應該初步可以使用。看程式碼過程中發現isl29035的實現主要是採用IIO子

Python挑翻音樂網,GUI實現音樂播放器,無敵Pythoner

了解 nbsp python源碼 利用 imp 發布 mage 文章 獲取 今天幾篇博文都是些Python純幹貨,有難度大的,也有難度比較低的適合新手的。但無一列外,就是它們都會有源碼+視頻教程二合一供大家學習。這樣的文章有個好處,本人的文章多次遭其它人cop

滴滴出行千億級訊息佇列

本文整理自滴滴出行訊息佇列負責人 江海挺 在Apache RocketMQ開發者沙龍北京站的分享。通過本文,您將瞭解到滴滴出行: 1. 在訊息佇列技術選型方面的思考; 2. 為什麼選擇 RocketMQ 作為出行業務的訊息佇列解決方案; 3. 如何構建自己的訊息佇列服務; 4. 在

Forgather Beauty護膚:冬季保養,不老女神

隨著氣溫的驟降,工作的壓力 肌膚表面像是附了層怎麼也洗不掉的灰 心情都隨之暗淡了 是時候get冬季護膚心得 令歲月淡去痕跡,變身不老女神! 01 Forgather Beauty護膚 保持充足的睡眠,是肌膚健康的祕密 睡眠會給肌體重新注入新的能量 面板在夜間進行休整 睡眠時細胞分裂加

Linux音訊驅動-PCM裝置

概述 1.  什麼是pcm? pcm(Pulse-code modulation)脈衝編碼調製,是將模擬訊號轉化為數字訊號的一種方法。聲音的轉化的過程為,先對連續的模擬訊號按照固定頻率週期性取樣,將取樣到的資料按照一定的精度

嵌入式Linux音訊驅動開發

1.嵌入式音訊系統硬體連線 下圖所示的嵌入式裝置使用IIS將音訊資料傳送給編解碼器。對編解碼器的I/O暫存器的程式設計通過IIC匯流排進行。 2.音訊體系結構-ALSA ALSA是Advanced Linux Sound Architecture 的縮寫,目前已經成為了li

linux應用層下用C呼叫音訊驅動

static void audio_pause(void) {     int err;     if (alsa_can_pause) {         if ((err = snd_pcm_pause(alsa_handler, 1)) < 0)        

Linux音訊驅動之ASoC驅動架構

1.  ASoC的由來 ASoC--ALSA System on Chip ,是建立在標準ALSA驅動層上,為了更好地支援嵌入式處理器和移動裝置中的音訊Codec的一套軟體體系。在ASoc出現之前,核心對於SoC中的音訊已經有部分的支援,不過會有一些侷限性:    Codec驅動與SoC CPU的底層

Linux音訊驅動-ASOC之Machine

struct snd_soc_dai_link { /* config - must be set by machine driver */ const char *name; /* Codec name */ const char *stream_name; /* Stream name */