前面有弄RT5350的wifi开发板做ipcam,本来规划增加audio功能上去。
当时找了官方SDK user manual 看下,RT5350的I2S有预留,但原厂并未有驱动和支持的解码芯片出来。

而后,最近看到openwrt中,有支持WM8960,ES9023芯片。
也参考PI中,有搞定I2S audio功能。
所以我也想试试,淘宝了ES9023。坐等收货试验,openwrt已经build好。

参考链接:
ES9023
http://transing.xyz/2015/07/27/wifi-audio-on-rt5350-with-openwrt/
https://github.com/qdk0901/openwrt-rt5350

WM8960
http://vonger.cn/?p=1970
附上 8960 audio driver code

#include <linux/init.h>
#include <linux/module.h>#include <linux/slab.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/of.h>
#include <linux/dma-mapping.h>
#include <linux/sysfs.h>#include <linux/vmalloc.h>#define MAX_BUFF    0x200000struct vocore_data {void __iomem *gdma;void __iomem *i2s;dma_addr_t addr;void *vaddr;u8 *buf;u32 size;       // current data size in buffer.u32 curr;       // current data pointer.
};irqreturn_t vocore_gdma_irq_handler(int irq, void *dev_id)
{struct vocore_data *p = (struct vocore_data *)dev_get_drvdata(dev_id);u32 mask, done;mask = readl(p->gdma + 0x0200);done = readl(p->gdma + 0x0204);// MASK, DONE their register type is W1C(write one to clean)writel(mask, p->gdma + 0x0200);writel(done, p->gdma + 0x0204);memcpy(p->vaddr, p->buf + p->curr, PAGE_SIZE);p->curr += PAGE_SIZE;if(p->curr >= p->size)p->curr = 0;// must fill the address again, or it will send some "random" data.writel(p->addr, p->gdma + 0x0020);writel(0x10000A10, p->gdma + 0x0024);writel(0x10000046, p->gdma + 0x0028);return IRQ_HANDLED;
}// input format must be 44.1KHz, 16bits, stereo pcm data, max data size is 2MB
static ssize_t vocore_gdma_data_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t count)
{struct vocore_data *p = (struct vocore_data *)dev_get_drvdata(dev);if(p->buf == NULL)p->buf = (u8 *)vmalloc(MAX_BUFF);   // 2MB bufferif(p->size + count > MAX_BUFF) {printk("buffer has full = %d.\n", p->size);return count;}memcpy(p->buf + p->size, buf, count);p->size += count;return count;
}static ssize_t vocore_gdma_play_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t count)
{struct vocore_data *p = (struct vocore_data *)dev_get_drvdata(dev);switch(buf[0]) {case '0': {     // stopwritel(0x00000044, p->gdma + 0x0028);writel(0x00004040, p->i2s + 0x0000);p->size = 0; // clean buffer.printk("vocore_gdma_play_store: stop!\n");break; }case '1': {     // startif(p->size < PAGE_SIZE) {printk("not enough data, can not start.\n");break;}memcpy(p->vaddr, p->buf, PAGE_SIZE);p->curr = PAGE_SIZE;// setup i2swritel(0x80000058, p->i2s + 0x0020);writel(0x0000000E, p->i2s + 0x0024);writel(0xC1004040, p->i2s + 0x0000);// start dma transferwritel(p->addr, p->gdma + 0x0020);writel(0x10000A10, p->gdma + 0x0024);writel(0x00200210, p->gdma + 0x002c);writel(0x10000046, p->gdma + 0x0028);printk("vocore_gdma_play_store: start!\n");break; }}return count;
}static DEVICE_ATTR(data, S_IWUSR, NULL, vocore_gdma_data_store);
static DEVICE_ATTR(play, S_IWUSR, NULL, vocore_gdma_play_store);static int vocore_gdma_probe(struct platform_device* dev)
{int irq, r;struct resource *res;struct vocore_data *p;p = (struct vocore_data *)kmalloc(sizeof(struct vocore_data), GFP_KERNEL);memset(p, 0, sizeof(struct vocore_data));platform_set_drvdata(dev, p);irq = platform_get_irq(dev, 0);printk("platform_get_irq %d\n", irq);r = request_irq(irq, vocore_gdma_irq_handler, IRQF_SHARED, "vocore-gdma", &dev->dev);if(r < 0) {printk("request_irq failed %d.\n", r);return 0;}printk("request_irq %d success.\n", irq);res = platform_get_resource(dev, IORESOURCE_MEM, 0);p->gdma = devm_ioremap_resource(&dev->dev, res);p->i2s = p->gdma - 0x00002800 + 0x00000a00;p->vaddr = dma_alloc_coherent(&dev->dev, PAGE_SIZE, &p->addr, GFP_DMA);printk("virtual address: %p, physics address: %p\n", p->vaddr, (void *)p->addr);device_create_file(&dev->dev, &dev_attr_data);device_create_file(&dev->dev, &dev_attr_play);return 0;
}static int vocore_gdma_remove(struct platform_device* dev)
{struct vocore_data *p = (struct vocore_data *)platform_get_drvdata(dev);int irq = platform_get_irq(dev, 0);free_irq(irq, &dev->dev);printk("free_irq %d done.\n", irq);dma_free_coherent(&dev->dev, PAGE_SIZE, p->vaddr, p->addr);printk("free virtual address: %p, physics address: %p\n", p->vaddr, (void *)p->addr);if(p->buf)vfree(p->buf);kfree(p);device_remove_file(&dev->dev, &dev_attr_data);device_remove_file(&dev->dev, &dev_attr_play);return 0;
}static const struct of_device_id gdma_rt_dt_ids[] = {{ .compatible = "ralink,rt2880-gdma", },{ }
};static struct platform_driver rt_gdma_driver = {.probe = vocore_gdma_probe,.remove = vocore_gdma_remove,.driver = {.owner = THIS_MODULE,.name = "ralink-gdma",.of_match_table = gdma_rt_dt_ids,},
};static int vocore_gdma_init(void)
{printk("vocore_gdma_init\n");return platform_driver_register(&rt_gdma_driver);
}static void vocore_gdma_exit(void)
{platform_driver_unregister(&rt_gdma_driver);printk("vocore_gdma_exit\n");
}module_init(vocore_gdma_init);
module_exit(vocore_gdma_exit);MODULE_AUTHOR("Qin Wei <me@vonger.cn>");
MODULE_DESCRIPTION("VoCore Test GDMA&I2S driver");
MODULE_LICENSE("GPL");

RT5350 I2S audio问题相关推荐

  1. CSR Audio Sink Application User Guide

    为了让CSR867x的开发更容易,现与思度科技联合推出CSR867x学习板[淘宝链接:思度科技CSR开发板]. 技术交流QQ群号:743434463 开发板会员QQ群号:725398389(凭订单号入 ...

  2. smart210驱动(12)audio

    音频驱动 这里smart210_wm8960.c放在drivers/sound/soc/下并修改Makefile和Kconfig Makefile # S3c24XX Platform Support ...

  3. ds90ub934 i2c 配置_DS90UB948-Q1:1080p 双路 FPD-Link III 解串器

    DS90UB948-Q1:1080p 双路 FPD-Link III 解串器 DS90UB948-Q1 是一款 FPD-Link III 解串器,与 DS90UB949/947/929-Q1 串行器配 ...

  4. moodeaudio 源码_MoodeAudio 音频播放器上手配置

    MoodeAudio 是运行于树莓派等开发板的高品质音频播放系统.与 Volumio 类似,又有些许不同.它们声音表现是基本一致的,各种配置选项差别不大,MoodeAudio 所提供的选项稍多,播放功 ...

  5. linux驱动编写(声卡驱动之asoc移植)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] Linux下面的声卡驱动很复杂,根本不是一篇博客能够说清楚的.所以,本片文章的目的就是让同学门快 ...

  6. Ambarella : 一家伟大的视频压缩处理芯片厂商

    最近工作比较忙,没有好好的关注业界动态.今天首次听说Ambarella A5s,有种惊艳的感觉查其出身,才知道是Ambarella公司,一家位于加州Santa Clara的初创公司,主营H264压缩处 ...

  7. 2021年如何折腾小米平板2,装上win11

    米板2上的安卓太难用了,所以笔者暂时只装了Windows.后续有时间再研究双系统. 期待win11原生运行安卓app的一天,米板2也许能起飞~~ 一.安装系统: 安卓系统的,先刷成win10,请另找教 ...

  8. 支持v4l2 linux内核选项 s3c2440,linux内核移植-移植2.6.35.4内核到s3c2440

    原标题:linux内核移植-移植2.6.35.4内核到s3c2440 硬件平台:FL2440 主机平台:Ubuntu 11.04 交叉编译器: - -gcc 4.3.2 原创作品,转载请标明出处htt ...

  9. linux 内核2.6.35.3,linux-2.6.35.3内核移植(s3c2440)

    忙乎了一个下午,总算忙乎出来了,不过前期大量的搜索工作别人已经完成. 大量参考:http://blog.csdn.net /huihui1988/archive/2010/08/09/5799500. ...

最新文章

  1. Vue + VueRouter + Vuex + Axios 抓取 GitHub 上的 Issues 来搭建个人博客站点
  2. 7、单向一对多的关联关系(1的一方有n的一方的集合属性,n的一方却没有1的一方的引用)...
  3. 最短路径:Dijkstra算法和Floyd算法
  4. .NET源码反编译和加密
  5. 父子继承与方法的重写 java 114818255
  6. HTML之文本相关标签
  7. 2020-8-6 Codeforces摸鱼报告
  8. 替代传统按键方案 单通道感应TTP223E-BA6 TTP223E-CA6 TTP223E-HA6 单按键触摸检测IC
  9. 3dmax linux版本,如何安装Linux版FLOW-3D及注意事项
  10. 对集合对象进行排序:根据对象集合其中一属性进行排序
  11. 谷歌服务组件安装简介
  12. Java se官方中文API下载链接
  13. 全面剖析:“外包”浪潮以及程序员应对攻略
  14. BMS-Pro电池巡检综合监控系统
  15. android 客户端 和 新浪微博如何打通的
  16. SQL Server故障处理合集
  17. pyqt5 源码 eric 记录
  18. 【击穿、穿透、雪崩】
  19. 基于javaweb的超市库存管理系统(idea+servlet+jsp)
  20. 【算法】不用乘、除、取余操作实现除法

热门文章

  1. 区块链学习-智能合约与ICO
  2. vue3日历时间 vite + vue3 日历时间
  3. 计算机浏览器存储技术cookie、sessionStorage、localStorage
  4. 神华sap系统服务器,SAP同略会:神华SAP应用四大亮点解析
  5. 4.19 utime函数-文件时间修改
  6. 基于 JAVAEE 的企业固定资产管理系统的设计与实现
  7. 记一次对钓鱼邮件的实地反击
  8. 滴普科技完成1亿美金B轮融资,引入多家金融业产业资本
  9. 学计算机的怎么追星,仅用“三招”, 这位老师让学生成为计算机课的“粉丝”...
  10. 客户因我们产品卖给了他竞争对手因而要终止同我们的合作,该如何应对。