当前位置: 首页 > article >正文

音频调试———FM

一、确认硬件接口

根据硬件原理图设计情况获取对应信息:

项目vaule
接在哪个I2CI2C4
接在哪个I2SI2S2
I2S2_DOUT, I2S2_DINPH11, PE9
I2S2-BCLK,I2S2-LRCK,I2S2-DIN0PE6,PE7,PE9

 

二、设备树

 1、设备节点

&i2s2_plat {
        tdm-num         = <2>;
        tx-pin          = <0>;

        rx-pin          = <0>;
        pinctrl-used;
        pinctrl-names= "default","sleep";
        pinctrl-0       = <&i2s2_pins_a &i2s2_pins_c >;
        pinctrl-1       = <&i2s2_pins_b>;
        tx-hub-en;
        rx-sync-en;

        status          = "okay";
};

&i2s2_mach {
        soundcard-mach,name             = "sndi2s2";
        soundcard-mach,format           = "i2s";
        soundcard-mach,frame-master     = <&i2s2_codec>;
        soundcard-mach,bitclock-master  = <&i2s2_codec>;
        /* soundcard-mach,frame-inversion; */
        /* soundcard-mach,bitclock-inversion; */
        soundcard-mach,slot-num         = <2>;
        soundcard-mach,slot-width       = <32>;
        soundcard-mach,capture-only;
        status          = "okay";
        i2s2_cpu: soundcard-mach,cpu {
                sound-dai = <&i2s2_plat>;
                soundcard-mach,pll-fs   = <1>;
                /* edp mclk: 512fs */^M
                soundcard-mach,mclk-fs  = <0>;
        };
        i2s2_codec: soundcard-mach,codec {
                sound-dai               = <&tef668x>;
        };
};

&twi4 {
	clock-frequency = <400000>;
	pinctrl-0 = <&twi4_pins_default>;
	pinctrl-1 = <&twi4_pins_sleep>;
	pinctrl-names = "default", "sleep";
	/* For stability and backwards compatibility, we recommend setting ‘twi_drv_used’ to 1 */
	twi_drv_used = <1>;
	twi-supply = <&reg_dcdc4>;
	status = "okay";



    tef668x: tef668x@64 {
		#sound-dai-cells        = <0>;
        compatible = "tef668x_codec_0";
        device_type = "tef668x_codec_0";
        reg = <0x64>;      
        status = "okay";
    };
};

2、pinctr信息

三、驱动移植

1、Kconfig

2、Makefile

3、驱动

bsp/drivers/sound/codecs/tef668x

声卡注册 snd_soc_register_codec

混杂设备注册 tef668x_probe(i2c, i2c_id);

static int tef668x_codec_i2c_probe(struct i2c_client *i2c,
			   const struct i2c_device_id *i2c_id)
{
	struct tef668x_codec_priv *tef668x_codec;


	int ret = 0;

	printk("tef668x_codec_i2c_probe 20241218 17:41\n");

	tef668x_probe(i2c, i2c_id);

	tef668x_codec = devm_kzalloc(&i2c->dev, sizeof(struct tef668x_codec_priv), GFP_KERNEL);
	if (tef668x_codec == NULL) {
		dev_err(&i2c->dev, "Unable to allocate tef668x_codec private data\n");
		return -ENOMEM;
	}
	
	gTef668xCodec = tef668x_codec;

	tef668x_codec->i2c = i2c;
	dev_set_drvdata(&i2c->dev, tef668x_codec);

	tef668x_codec->fm_switch_on = false;



	if (i2c_id->driver_data < TEF668X_CODEC_CHIP_NUMS) {
		i2c_ctrl[i2c_id->driver_data] = i2c;
		ret = snd_soc_register_codec(&i2c->dev, &tef668x_codec_soc_codec_driver,
					tef668x_codec_dai[i2c_id->driver_data], 1);
		if (ret < 0) {
			dev_err(&i2c->dev,
				"Failed to register tef668x_codec codec: %d\n", ret);
		}
	} else {
		pr_err("The wrong i2c_id number :%d\n",
		       (int)(i2c_id->driver_data));
	}

	

	if (ret < 0) {
		dev_err(&i2c->dev,
			"Failed to register tef668x_codec codec: %d\n", ret);
	}
		


	return ret;
}

混杂设备, 用于 fm 控制调频,搜台

bsp/drivers/sound/codecs/tef668x/misc_drv/tef668x.c

四、FM测试

移植对应APP测试程序后。执行APP,IIC报错

排查后定位,IIC未接上拉电阻,上拉4.7K,到VDD_3V3

上拉后,正常

音频设备:

五、录音播放测试

1、FM 录音

arecord -r 44100 -f S16_LE -D hw:1,0 -c2 /mnt/UDISK/fmrecord.wav

#查看录制状态

cat /proc/asound/sndi2s2/pcm0c/sub0/status

state: RUNNING
owner_pid   : 1565
trigger_time: 1434.845529224
tstamp      : 0.000000000
delay       : 1287
avail       : 1287
avail_max   : 5513
hw_ptr      : 2189948
appl_ptr    : 2188661

2、FM 录制回放

tinymix -D 0 29 1

aplay  /mnt/UDISK/fmrecord.wav

3、问题合集

问题1: 录制数据全0

引脚复用异常

原因: PE9 复用成了 IO Disable

root@Longan:~$ devmem 0x20000C4 32

0xF0033FFF


root@Longan:~$ devmem 0x20000C0 32

0x44F00002

#设置PE9 I2S

devmem 0x20000C4 32 0xF0033F44

解决办法:function 是 i2s2 i2s2_din

	i2s2_pins_c: i2s2@2 {
		pins = "PE9";//I2S2-DIN0
		function = "i2s2"; //"i2s2_din";
		drive-strength = <20>;
		bias-disable;
	};

调试完成!!!!


http://www.kler.cn/a/500606.html

相关文章:

  • 网工_网络体系结构
  • 从预训练的BERT中提取Embedding
  • Nginx支持UDP性能优化
  • PHP 使用 Redis
  • 代理模式详解与应用
  • 2025“华数杯”国际数学建模大赛A他能游得更快吗Can He Swim Faster(完整思路 模型 源代码 结果分享)
  • 使用Go语言的http.Transport进行SSL握手的方法与注意事项
  • Android使用系统消息与定时器实现霓虹灯效果
  • 3. 使用springboot做一个音乐播放器软件项目【封装项目使用的工具类】
  • golang中的eval,goeval,govaluate
  • 智能风控/数据分析 聚合 分组 连接
  • LeetCode-找出字符串中第一个匹配项的下标(028)
  • WPF控件Grid的布局和C1FlexGrid的多选应用
  • Golang笔记——channel
  • 软件系统分析与设计综合实践-家庭维修服务系统小程序(代码见附录,私发)
  • Xcode 正则表达式实现查找替换
  • JVM之垃圾回收器概述(续)的详细解析
  • 【机器学习】零售行业的智慧升级:机器学习驱动的精准营销与库存管理
  • 【Spring Boot 应用开发】-04 自动配置-数据源
  • 【优选算法篇】:深入浅出位运算--性能优化的利器
  • EFCore HasDefaultValueSql (续1 ValueGeneratedOnAdd)
  • 金融项目实战 04|JMeter实现自动化脚本接口测试及持续集成