树莓派-MIC篇

2024-01-05 09:48
文章标签 树莓 mic

本文主要是介绍树莓派-MIC篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 DMIC驱动

arch\arm\boot\dts\overlays\example-sound-overlay.dts

// Definitions for example audio add on soundcard

/dts-v1/;

/plugin/;

 

/ {

compatible = "brcm,bcm2835";

 

fragment@0 {

target = <&i2s>;

__overlay__ {

status = "okay";

};

};

 

fragment@1 {

target = <&sound>;

__overlay__ {

compatible = "ai,example-soundcard";

i2s-controller = <&i2s>;

status = "okay";

};

};

};

 

linux\arch\arm\boot\dts\overlays\Makefile

dtbo-$(RPI_DT_OVERLAYS) += example-sound.dtbo

 

sound\soc\bcm\example-soundcard.c

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/kmod.h>

#include <linux/platform_device.h>

#include <sound/simple_card.h>

#include <linux/delay.h>

 

void device_release_callback(struct device *dev) { /*  do nothing */ };

static struct asoc_simple_card_info snd_rpi_simple_card_info = {

.card = "snd_rpi_simple_card", // -> snd_soc_card.name

.name = "simple-card_codec_link", // -> snd_soc_dai_link.name

.codec = "snd-soc-dummy", // "dmic-codec", // -> snd_soc_dai_link.codec_name

.platform = "3f203000.i2s",

.daifmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFM,

.cpu_dai = {

.name = "3f203000.i2s", // -> snd_soc_dai_link.cpu_dai_name

.sysclk = 0 },

.codec_dai = {

.name = "snd-soc-dummy-dai", //"dmic-codec", // -> snd_soc_dai_link.codec_dai_name

.sysclk = 0 },

};

static struct platform_device snd_rpi_simple_card_device = {

.name = "asoc-simple-card", //module alias

.id = 0,

.num_resources = 0,

.dev = { .release = &device_release_callback,

.platform_data = &snd_rpi_simple_card_info, // *HACK ALERT*

},

};

 

static int example_soundcard_probe(struct platform_device *pdev)

{

const char *dmaengine = "bcm2708-dmaengine"; //module name

int ret;

 

ret = request_module(dmaengine);

pr_alert("request module load '%s': %d\n",dmaengine, ret);

ret = platform_device_register(&snd_rpi_simple_card_device);

pr_alert("register platform device '%s': %d\n",snd_rpi_simple_card_device.name, ret);

 

pr_alert("Hello World :)\n");

return 0;

}

 

static int example_soundcard_remove(struct platform_device *pdev)

{

platform_device_unregister(&snd_rpi_simple_card_device);

return 0;

}

 

static const struct of_device_id example_soundcard_of_match[] = {

{ .compatible = "ai,example-soundcard", },

{},

};

MODULE_DEVICE_TABLE(of, example_soundcard_of_match);

 

static struct platform_driver example_soundcard_driver = {

       .driver         = {

.name   = "example-audio",

.owner  = THIS_MODULE,

.of_match_table = example_soundcard_of_match,

       },

       .probe          = example_soundcard_probe,

       .remove         = example_soundcard_remove,

};

 

module_platform_driver(example_soundcard_driver);

MODULE_AUTHOR("Thornton");

MODULE_DESCRIPTION("example Soundcard");

MODULE_LICENSE("GPL v2");

MODULE_ALIAS("platform:example-soundcard");

 

linux\sound\soc\bcm\Makefile

obj-m += snd-soc-example-soundcard.o

 

linux\sound\soc\bcm\bcm2835-i2s.c

@@ -456,6 +456,10 @@ static int bcm2835_i2s_hw_params(struct snd_pcm_substream *

        ch2pos = bclk_ratio / 2 + data_delay;

 

        switch (params_channels(params)) {

+       case 1:

+               format = BCM2835_I2S_CH1(format);

+               format |= BCM2835_I2S_CH1(BCM2835_I2S_CHPOS(ch1pos));

+               break;

        case 2:

                format = BCM2835_I2S_CH1(format) | BCM2835_I2S_CH2(format);

                format |= BCM2835_I2S_CH1(BCM2835_I2S_CHPOS(ch1pos));

@@ -494,6 +498,8 @@ static int bcm2835_i2s_hw_params(struct snd_pcm_substream *s

        switch (dev->fmt & SND_SOC_DAIFMT_MASTER_MASK) {

        case SND_SOC_DAIFMT_CBS_CFS:

                /* CPU is master */

+               mode |= BCM2835_I2S_PDMN;

+               mode |= BCM2835_I2S_PDME;

                break;

        case SND_SOC_DAIFMT_CBM_CFS:

                /*

@@ -508,6 +514,8 @@ static int bcm2835_i2s_hw_params(struct snd_pcm_substream *s

                 * CPU is bit clock master

                 */

                mode |= BCM2835_I2S_FSM;

+               mode |= BCM2835_I2S_PDMN;

+               mode |= BCM2835_I2S_PDME;

                break;

        case SND_SOC_DAIFMT_CBM_CFM:

                /* CODEC is master */

@@ -736,7 +744,7 @@ static struct snd_soc_dai_driver bcm2835_i2s_dai = {

                                | SNDRV_PCM_FMTBIT_S32_LE

                },

        .capture = {

-               .channels_min = 2,

+               .channels_min = 1,

                .channels_max = 2,

                .rates =        SNDRV_PCM_RATE_8000_192000,

                .formats =      SNDRV_PCM_FMTBIT_S16_LE

2 KERNEL编译

export PATH=$PATH:/home/thornton/work/pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/home/thornton/work/pi/firmware modules_install

 

3 KERNEL更新

将RPI T卡插在LINUX系统下,会弹出两个盘,一个是KERENL盘和一个BOOT盘

将firmware/lib拷到KERNEL盘,其他拷到BOOT盘

 

4 启动驱动

修改BOOT盘里的config.txt

#dtparam=i2s=on

改为

dtparam=i2s=on

使能snd-soc-bcm2835-i2s.ko驱动

 

dtparam=audio=on

使能snd-bcm2835.ko

 

dtoverlay=example-sound

使能snd-soc-example-soundcard.ko

 

5测试

arecord -D hw:1,0 -r16000 -fS16_LE -twav -c2|aplay -D hw:0,0 -r16000 -fS16_LE -c1

这篇关于树莓派-MIC篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/572466

相关文章

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

树莓派5_opencv笔记27:Opencv录制视频(无声音)

今日继续学习树莓派5 8G:(Raspberry Pi,简称RPi或RasPi)  本人所用树莓派5 装载的系统与版本如下:  版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下: 今天就水一篇文章,用树莓派摄像头,Opencv录制一段视频保存在指定目录... 文章提供测试代码讲解,整体代码贴出、测试效果图 目录 阶段一:录制一段

1-8 图像腐蚀 opencv树莓派4B 入门系列笔记

目录 一、提前准备 二、代码详解 kernel=np.ones((2,2),np.uint8) _, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) eroded_image=cv2.erode(binary_image,kernel,iterations=1) eroded_image2=cv2.ero

逗比学树莓派之lcd1602显示

通过树莓派GPIO连接LCD1602,使用wiringPi库和其附带的LCD库进行显示树莓派的CPU温度和内存使用情况。 1.首先按下图连接好硬件电路图: 2.然后在终端使用命令 sudo apt-get install git 安装版本管理软件Git 。

树莓派wiringPi常用的函数介绍

 1.void pinMode (int pin, int mode) ; 这个函数式设置pin脚的输入和输出模式以及PWM的输入和输出模式。在wiringPi中只有 pin 1 (BCM_GPIO 18)是支持PWM的输出的。 2.void digitalWrite (int pin, int value) ; 这个函数式用来设置pin脚的高低电平的,当我们写HIGH or LO

RasberryPi 3B树莓派基本配置

RaspberryPi 3B树莓派基本配置 文章目录 RaspberryPi 3B树莓派基本配置一、准备工作1.1 硬件准备:1.1.1 树莓派和电源适配器:1.1.2 USB转TTL模块:1.1.3 读卡器和TF卡: 1.2 软件准备:1.2.1 下载 Raspberry Pi OS:1.2.2 SD Card Formatter:1.2.3 下载系统镜像刻录软件:1.2.4 MobaX

树莓派使用WiringPi库配合时间函数实现超声波测距

树莓派使用WiringPi库配合时间函数实现超声波测距 文章目录 树莓派使用WiringPi库配合时间函数实现超声波测距一、HR-04超声波模块原理1.1 超声波测距原理:1.2 超声波时序图: 二、树莓派与超声波模块硬件连接三、时间函数3.1 时间函数gettimeofday()原型和头文件: 四、实现超声波测距4.1 使用wiringOP库和时间函数实现超声波测距: 五、实现超声波测距

1-9 图像膨胀 opencv树莓派4B 入门系列笔记

目录 一、提前准备 二、代码详解 kernel = np.ones((3, 3), np.uint8) _, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) dilated_image = cv2.dilate(binary_image, kernel, iterations=1) 三、运行现象 四

树莓派使用WiringPi库驱动继电器

树莓派使用WiringPi库驱动继电器 文章目录 树莓派使用WiringPi库驱动继电器一、继电器概念二、树莓派与继电器硬件接线三、使用WiringPi库驱动继电器: 一、继电器概念 ​ 继电器(英文名称:relay)是一种电控制器件,是当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制系统(又

构建智能门禁安防系统:树莓派 4B、OpenCV、SQLite 和 MQTT 的应用(代码示例)

一、项目概述 1.1 项目目标和用途 本项目旨在开发一个智能门禁安防系统,该系统利用摄像头和人脸识别技术,结合本地人脸库,实现对进出人员的自动识别和管理。系统能够实时记录进出人员的信息,并对未注册人员进行警报提示。通过与物联网平台的集成,用户可以远程监控和管理门禁系统,提升安全性和管理效率。 1.2 解决的问题和价值 传统的门禁系统往往依赖于钥匙或密码,存在安全隐患和管理不便的问题。本项目