基於IMX6Q的XFM10621六麥驅動實現說明

2021-08-20 14:20:03 字數 1700 閱讀 6681

本文主要針對在imx6q平台上實現的xfm10621六麥克陣列驅動做了一些介紹和說明,因為科大訊飛沒有乙個可參考的通用驅動,所以自己就在imx6q上實現了一下,相信可以給很多感興趣和有需求的朋友作為參考,具體的驅動原始碼可以參看附件部分。

1. 環境介紹

硬體平台

imx6q

android版本

5.1linux版本

3.14.52

麥克陣列模組

訊飛xfm10621六麥陣列

2. linux框架簡介

音訊驅動主要涉及linux asoc框架,asoc基於alsa框架,由codec驅動,platform驅動和machine驅動組成。codec驅動負責編譯碼以及音訊硬體的實際控制,platform驅動主要負責cpu和音訊模組的通訊介面的控制,machine驅動協調codec驅動和platform驅動對使用者層提供音效卡介面。

下表描述了我們驅動原始碼的位置:

驅動原始碼位置

codec

kernel_imx/sound/soc/codecs/ifly-dmic.c

platform

kernel_imx/sound/soc/fsl/fsl_ssi.c

machine

kernel_imx/sound/soc/fsl/fsl_dmic.c

dtskernel_imx/arch/arm/boot/dts/imx6qdl-sabresd.dtsi

3. codec驅動

我們的codec驅動主要職責是處理喚醒中斷,對使用者層上報喚醒資訊及喚醒角度,向asoc框架註冊codec驅動。

以i2c驅動為入口,在i2c驅動probe函式中主要做的事情包含:

初始化codec驅動資料結構;

解析裝置樹獲取中斷引腳的gpio;

向linux輸入子系統註冊乙個輸入裝置,用來上報喚醒資訊;

向linux asoc框架註冊乙個codec驅動。

主要資料結構及描述如下:

struct ifly_dmic_data ;

unsigned int ret = 0;

struct i2c_msg msgs = ;

struct i2c_msg msgs = ;

#endif

struct ifly_dmic_data *data = container_of(work, typeof(*data), work);

int angle = 0;

angle = ifly_dmic_get_wakeup_angle(data->client);

dev_warn(data->codec->dev, "ifly-dmic wakeup (%d)\n", angle);

if ((angle <= 360) && (angle >= 0)) ,

module_device_table(i2c, dmic_id);

static const struct of_device_id dmic_dt_ids = ,

module_device_table(of, dmic_dt_ids);

static struct i2c_driver dmic_driver = ,

module_device_table(of, fsl_dmic_of_match);

static struct platform_driver asoc_dmic_driver = ;

sound-dmic ;

imx6q 驅動開發

一 leds驅動 vim imx6q arm2.dts 根節點中新增 leds led5 led6 測試leds cd sys bus platform devices leds leds led5 echo 1 brightness echo 0 brightness 二 lcd驅動 檢視解析度 ...

imx6q平台的gpio配置方法

這裡介紹一下imx6q平台的gpio配置方式,如下圖所示為原理圖 從原理圖中可看到每個引腳的名稱 比如引腳名稱為gpio 16,開啟kernel imx arch arm boot dts imx6q pinfunc.件 該檔案都是一些巨集定義,固定形式為mx6qdl pad 引腳名 引腳功能描述 ...

imx6q平台的gpio配置方法

這裡介紹一下imx6q平台的gpio配置方式,如下圖所示為原理圖 從原理圖中可看到每個引腳的名稱 比如引腳名稱為gpio 16,開啟kernel imx arch arm boot dts imx6q pinfunc.件 該檔案都是一些巨集定義,固定形式為mx6qdl pad 引腳名 引腳功能描述 ...