tda7313是一款立体声音频处理器件,支持3路输入通道和i2c串行总线支持。

I2C命令:

我们可以看到该芯片i2c命令是由 start信号+地址+ N个DATA + STOP信号组成

DATA:

例1.Volume control -45db组成是:00100100

例2.Audio switch stereo2(输入端口2) LOUDNESS ON +7.5db组成是:01001001

由于我得板子是i2s1接 RK809 ,输出spkout接 tda7313的 L1 R1

i2s1接 RK809的spkout 可以参考官方的

记得屏蔽ucart3 ucart5不然跟i2s1会冲突

Linux i2C driver:

tda7313挂载在i2c5下,地址为0x88 但是i2c只支持7bit的地址所以要右移一位得0x44

设备树描述:

#if 1
&i2c5 {status = "okay";tda7313: tda7313@44 {status = "okay";compatible = "st,tda7313";reg = <0x44>;tda7313pwr-gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;pwr2-gpios = <&gpio3 RK_PC4 GPIO_ACTIVE_LOW>;#sound-dai-cells = <0>;};
};
#endif

tda7313pwr-gpios是板子上得电源引脚,没有得话可以不写

测试驱动代码:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/device.h>#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <linux/of_gpio.h>#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
#include <linux/uaccess.h>
#include <linux/delay.h> // mdelay()#define MYMA 300
#define COUNT 1
static struct device_node *work_device_node;static int gpio_0;
static int gpio_1;
static int gpio_fm;
static int value = 0;
static int bassvalue = 0;
static int audioSwitch = 0;#define VOLUME_2BIT 0
#define AUDIO_SWITCH_3BIT 2
#define SPEAKER_LF_3BIT 4
#define SPEAKER_RF_3BIT 5
#define SPEAKER_LR_3BIT 6
#define SPEAKER_RR_3BIT 7#define STEREO_1 0
#define STEREO_2 1
#define STEREO_3 2
#define STEREO_ALL 3
#define STEREO_VALUE STEREO_2#define BASS_4BIT 6
#define TEBLE_4BIT 7
#define OFFSET_3BIT 5
#define OFFSET_4BIT 4#define LOUDNESS 0 // 0x4
typedef struct
{struct mutex mutex;struct cdev cdev;struct i2c_client *cli;struct class *cls;
} dht12_data_t;struct file_operations fops = {.owner = THIS_MODULE,};int myprobe(struct i2c_client *cli, const struct i2c_device_id *id)
{struct device_node *np;struct device *dev;static int mi = 0; // 记录次设备号dht12_data_t *data;dev_t devid;int ret;// 注册设备号devid = MKDEV(MYMA, mi);ret = register_chrdev_region(devid, COUNT, cli->name);if (ret < 0)goto err0;// 准备每个匹配设备的数据data = kzalloc(sizeof(*data), GFP_KERNEL);if (NULL == data){ret = -ENOMEM;goto err1;}// 字符设备初始化cdev_init(&data->cdev, &fops);data->cdev.owner = THIS_MODULE;ret = cdev_add(&data->cdev, devid, COUNT);if (ret < 0)goto err2;// 初始化互斥锁mutex_init(&data->mutex);// 创建设备文件data->cls = class_create(THIS_MODULE, cli->name);device_create(data->cls, NULL, devid, NULL, "%s.%d", cli->name, mi++);data->cli = cli;i2c_set_clientdata(cli, data);dev = &cli->dev;if (!dev)return -ENODEV;np = dev->of_node;gpio_0 = of_get_named_gpio(np, "tda7313pwr-gpios", 0);if (gpio_0 < 0){printk("0 of_get_namd_gpio is error \n");return -1;}gpio_1 = of_get_named_gpio(np, "pwr2-gpios", 0);if (gpio_1 < 0){printk("1 of_get_namd_gpio is error \n");return -1;}gpio_fm = of_get_named_gpio(np, "fm-gpios", 0);if (gpio_fm < 0){printk("fm of_get_namd_gpio is error \n");return -1;}gpio_direction_output(gpio_0, 1);gpio_direction_output(gpio_1, 1);gpio_direction_output(gpio_fm, 1);mdelay(100);struct i2c_msg msgs[2];char data_rcv[5], addr[2] = {0x24 ,                  // volue -45db0x48, // .Audio switch stereo1(输入端口2)  LOUDNESS ON +7.5db组成是:01001001}// 上锁,防止重入mutex_lock(&data->mutex);msgs[0].addr = cli->addr;msgs[0].flags = 0;msgs[0].len = 2;msgs[0].buf = addr;ret = i2c_transfer(cli->adapter, msgs, 1);if (ret != 1){printk("error %d\n", ret);// goto out;}printk("ret %d\n", ret);mutex_unlock(&data->mutex);printk("myprobe--------------------------------------------------------------n\n");return 0;
err2:kfree(data);
err1:unregister_chrdev_region(devid, COUNT);
err0:return ret;
}int myremove(struct i2c_client *cli)
{dht12_data_t *data = i2c_get_clientdata(cli); // dev_get_drvdata(&cli->dev);// 移除设备文件device_destroy(data->cls, data->cdev.dev);class_destroy(data->cls);cdev_del(&data->cdev);unregister_chrdev_region(data->cdev.dev, COUNT);kfree(data);return 0;
}struct i2c_device_id ids[] = {{"st,tda7313", 0},{},
};
MODULE_DEVICE_TABLE(i2c, ids);
static const struct of_device_id tda7313_of_match[] = {{.compatible = "st,tda7313"},{},
};struct i2c_driver mydrv = {.probe = myprobe,.remove = myremove,.driver = {.name = "tda7313",.of_match_table = tda7313_of_match,.owner = THIS_MODULE,},.id_table = ids,
};module_i2c_driver(mydrv);
MODULE_LICENSE("GPL");
struct i2c_msg msgs[2];
char data_rcv[5], addr[2] = {0x24 ,                  // volue -45db0x4a, // .Audio switch stereo2(输入端口2)  LOUDNESS ON +7.5db组成是:01001001}msgs[0].addr = cli->addr;//设备地址msgs[0].flags = 0;//0为写msgs[0].len = 2;//2个DATA数据msgs[0].buf = addr;//DATA数据地址
ret = i2c_transfer(cli->adapter, msgs, 1) 执行一次会发出start信号+设备地址+len个数据+stop信号

RK系列(RK3568) tda7313音频 i2c驱动相关推荐

  1. RK系列(RK3568) i2s 音频输入 麦克风驱动

    平台:Android12 SOC:RK3568 外围芯片:XS9922 i2s简介: 从上图看I2s主要的线有:SDO SCLK LRCK MCLK I2S协议只定义三根信号线:串行时钟信号SCLK( ...

  2. RK系列开发板音频驱动适配指南(二)

    背景: 上一篇文章RK系列开发板音频驱动适配指南-DAI模块适配中已经阐述音频驱动适配的DAI模块适配步骤以及核心代码的展示,本次主要介绍音频驱动适配中的DMA模块适配. RK系列开发板 DMA模块适 ...

  3. RK系列开发板音频驱动适配指南(一)

    背景: 多媒体系统目前在Linux操作系统,windows操作系统已经非常成熟,并且应用场景广泛,但是,基于OpenAtom OpenHarmony(以下简称"OpenHarmony&quo ...

  4. linux下的I2C驱动记录(RK)

    现在做的是RK平台的I2C驱动,不是说linux每个外设对应一个设备文件吗?可是找了一下一直没找到,今天特别搞了一下.I2C设备是注册为platform平台驱动的. 下面是我用adb命令查看的 lin ...

  5. I2C知识大全系列三 —— I2C驱动之单片机中的I2C

    两种方式 单片机中的I2C驱动有两种方式.一种方式是用专用硬件I2C控制器实现,这种方式简单易行,品质也容易控制,只是会增加硬件成本方面的压力.另一种方式是用纯软件方式实现,这种方式几乎无硬件成本方面 ...

  6. linux驱动:i2c驱动(一)

    I2C系统框架:I2C核心层.I2C总线驱动.I2C设备驱动 --------------------------------------------------------------------- ...

  7. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析 (iic驱动框架,i2c驱动框架)...

    转载于 : http://blog.csdn.net/zqixiao_09/article/details/50917655 关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸 ...

  8. STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  9. WinCE的I2C驱动程序设计

    1 I2C 通信协议及S3C2410 芯片介绍 I2C(Inter Integrated Circuit) 总线是1980 年由Philips 公司推出的. I2C 总线用两条线(SDA 和SCL ) ...

最新文章

  1. java 获取linux mac_java在linux获得ip地址和mac
  2. 如何在Azure machine learning中使用异常检测
  3. java传送字符到前端_javaWeb后台特殊字符怎样还原传给前端正确显示?
  4. python常用函数使用方法实例
  5. jquery 给类名元素添加行内样式_学Jquery的第一天
  6. 由SQL数据库转换Redis的实例
  7. jQuery原型方法first,last,eq,slice源码分析
  8. Servlet/JSP-02 Servlet相关类
  9. .NET精品文章系列(一)
  10. Facebook提高工作效率的秘密 ,值得收藏
  11. 查看dll是32还是64
  12. paip.指针 引用 c++ java的使用总结.
  13. 浅析总结 Java 内部类的一些使用与梳理
  14. 多元统计分析(笔记更新中...)
  15. linux win10五笔码表,Win10五笔助手下载_WubiLex微软五笔助手下载免费版9.9.6.0 - 系统之家...
  16. token干什么用_什么是TOKEN?Token小号的理解运用,拼多多,知乎,快手,抖音的Token是什么意思...
  17. 用什么软件测试内存条稳定,使用内存条检测工具监测内存稳定性,内存条检测工具有哪些...
  18. iOS基础:Xcode 添加PCH文件、常用预处理指令(移除程序中的identifier、发布模式关闭NSLog、导出和隐藏符号)
  19. android 动画 最顶层_【尼康影像学院】使用SnapBridge连接照相机与智能手机(Android安卓系统)...
  20. 【CAPL】CAPL的简单介绍及变量

热门文章

  1. 头条、快手,那些我曾经错过的暴富机会
  2. 头条号三农领域原创视频日赚1000,自媒体领域选择哪个好?
  3. 投资体系-02-房产投资三级火箭模式与产业思维
  4. “啤酒与尿布”----关联分析的由来及真实性
  5. 如何让谷歌、百度和雅虎收录你的网站,编入索引
  6. 公告信息mysql_通告(公告),消息(站内短信),提醒的数据库设计
  7. 介绍Tduck问卷系统技术栈
  8. 手机QQ UI界面分析
  9. qq android平板电脑,QQ(Pad版)
  10. ChatGPT全栈开发实战:从需求分析到数据可视化,一站式指南助你快速构建全面应用