软件计划贴,及时更新,欢迎提意见::WMA,MOUNT,LWIP等问题急需解决.

发布于 2009-08-10 14:45:23
软件平台用RT-Thread
- 文件系统暂时先用RT-Thread中带的DFS-EFSL(FAT16/32文件系统)
- 协议栈用LwIP,这个已经是移植好的
- 界面用RT-Thread GUI,需要在上面写radio的应用程序

- wma软解码器,待完成
- DM9000A网卡驱动,测试中,还存在一些问题。

aozima 2010-03-23添加
wma解码:(非常紧急)
目前耗费资源太大,还用不起来.但这个问题不解决,在白名单下,这个东西只能成为一个摆设.

网络不稳定:(非常紧急)
目前RADIO的网络还不稳定,应该是软件上面的问题,具体原因还待查明.
此问题不彻底解决,继续进行下去的工作价值不大.

目录播放:
能够在文件浏览器中选择目录进行播放这个目录下所有的mp3文件。可以考虑,在文件浏览器中,当按下enter键时,弹出一个选择菜单,菜单项包括:
- 打开
- 播放
- 删除
- 返回

界面优化:
对初始主界面进行优化(取消渐变色?),能够比较好的进行电台播放状态的更新
在USB联机视图上添加图标;

显示电台名称及多电台列表.
及无法读取资源文件时自动联机并试图修复
见:http://www.rt-thread.org/phpbb/viewtopic.php?f=17&t=296&p=2929#p2929



还需要完成:
2010-01-01 从存储设备完成IAP功能,欢迎认领.... [降低紧急程度,先暂停]



aozima 2010-03-24添加:
- 以SPI_FLASH为/,把SDCARD挂载到/SD并正常播放.基本完成.2010-03-24
- 单声道兼容完成. 2010-03-24
- 自动识别采样率功能基本完成. 2010-03-24
- wav文件播放,完成
- mp3软解码器,helix定点解码器,OK
- mass storage框架完成,届时,SPI_FLASH,SDCARD,NAND将分为3个逻辑单元添加到mass storage中.
- 自学习型红外遥控程序,已基本实现.

netradio.jpg
下载附件[player.pdf]
audio_mp.jpg

查看更多

关注者
0
被浏览
29.5k
41 个回答
bernard
bernard 2009-08-14
mp3软解占用资源比想象中的大很多,也比当时纯软解占用资源大很多(当时是50%左右)。

优化需要:
mp3 decoder数据放片内SRAM中,开辟了一块2560 * 2 * 2的memoy pool,helix mp3 decoder数据也放于片内SRAM。
-O3优化编译

经过这样做之后,decode的速度大于播放的速度,声音也连续流畅了(但破音存在,播放同一首mp3及此mp3转换而成的wav,在相同的地方存在破音)。

最关键的问题,目前播放是基于I2S中断方式的,每发送一个short就产生一次中断。试过DMA方式,但加入DMA后(DMA1_Channel5),却对SDIO的DMA2_Channel4造成影响,不解中。
zhengrob
zhengrob 2009-08-14
调程序是这样的,有时候意想不到的顺利,有时候意想不到的难以捉摸。

对于这个mp3解码,我们的bottom line就是如果软解总是有若干个小问题牵涉较多精力的话,先上VS1053。这样既省掉这一块的问题,又给其他模块留出了足够的硬件资源。这样争取了时间,降低了难度。当然缺点就是增加了30元的成本,但这也给持续改进留下了机会(比如等软解成熟了,将其放在第二版上)。不知楼主意下如何。

另外,按照LZ定义的软件模块构架,我们是否可以将一些模块分给一些有能力并且乐意参与的网友,由楼主做总体协调并定义出模块接口,从而使这些模块能够并行进行? 按照ourdev上关于这个主题的访问量和回复量,我相信会有相当数量的资深网友愿意参与进来。这是我想到的一个建议。
bernard
bernard 2009-08-16
谢谢楼上建议,本来是打算如果要启用硬解的话,那么这个项目还不如不做,所以软解非常关键。

重新试过了,代码不需要优化(-O0)软解也没什么问题。现在是SD卡用DMA方式,I2S也用DMA方式,能够正常播放,还需要解决破音的问题。

进行到这个地步,确实需要仔细的规划规划了,在软件上今天会把模块划分出来,以及如何对这个系统进行优化的方案也拿出来,优化过后,这个系统会是一个非常棒的系统!
bernard
bernard 2009-08-16
软件的框架图
[attach]0[/attach]
(软件部分设计遵循从粗到细的方式进行层层分解,通过这个也能够看到一个系统,它完整的软件是如何设计出来的)

模块分为几个部分

基础组件部分:
RTOS Kernel:非RT-Thread莫属。RT-Thread做为一套完善、稳定的实时操作系统,对于这个应用完全能够适用。通过使用RT-Thread来作为网络收音机的操作系统,大家也能够了解、熟悉、甚至是精通如何使用RT-Thread编程,如何使用RT-Thread来构建商业产品的基础平台。
文件系统:使用RT-Thread内置的DFS虚拟文件系统,目前这个DFS虚拟文件系统包装的是EFSL,以后根据情况可能会换一换,但对上层应用是感觉不到下面文件系统已经被替换(换成另一FAT文件系统实现或另一非FAT文件系统,上层都感觉不到),以后的版本应该会支持Nand Flash。
TCP/IP协议栈:LwIP轻型TCP/IP协议栈,目前和RT-Thread的整合已经非常完善了,对应用层提供了标准的socket接口,并且LwIP自身支持多种协议,例如ICMP, IGMP, DHCP, ppp等。
图形用户界面:RTGUI,这个还没怎么露面,参与这个项目的应该会提前见到它的身影。这个项目应该只会使用到它的基本功能(网络收音机项目包含一个320x240的TFT屏,5向导航键,无触摸屏,主要采用键盘操作)。
USB Mass Storage:U盘,采用STM32 USB固件库来实现一个完整的U盘,使得能够直接从电脑上操作播放器上的文件。在通过U盘操作文件时,系统自动停止播放,关闭打开的文件,不再操作文件,直到断开USB连接。

网络播放应用部分:
UI: Information Workbench,用于显示系统的一些信息,例如USB连接状态,电池状态,当前日期、时间等。
UI: Player Workbench,用于显示播放器界面。界面不会做得太过复杂,毕竟软解已经耗费了很多资源,想做视频动画效果估计芯片的能力已经跟不上了。需要包括:播放视图;网络电台列表更新视图;收藏列表视图;当前播放列表视图;
UI: Home Workbench,这个实际上是RTGUI的应用管理器,用于启动其他的应用,当前活动应用的列表等,一个workbench等于一个应用。

player模块,播放控制的核心模块。用于控制播放何种格式,何种来源。还有就是通常意义的控制操作,前进、后退、暂停、停止等。
mp3 codec模块,也就是mp3软解库,ID3TAG是需要的。
wav模块,提供wav音频格式的信息解析,及提供音频数据。
wma模块,wma软解库,必须是针对ARM定点优化过的解码库算法。。
netstream模块,网络音频流模块,它会包含几个子模块:http流,rtsp流等。

为了管理STM32F103ZE宝贵的片内SRAM资源,还需要一个sram buffer管理模块,形成一个类似cache的模块,部分的缓冲将直接从它上面分配出来。

设备驱动部分:
codec驱动,wm8753驱动,向上层应用提供设备名为snd的抽象设备接口。
keyboard驱动,五向导航键驱动,只用于RTGUI中。
LCD驱动,FSMC接口的LCD驱动,只用于RTGUI中。
网卡驱动,DM9000驱动
STM32的电源管理,会把RT-Thread设备管理模块的电源管理部分实现了。
bernard
bernard 2009-08-16
Mp3的格式,好像要FireFox才能打开svg的图形格式文件
bernard
bernard 2009-08-19
mp3丢帧的问题解决了,一个完整的mp3播放器正慢慢呈现出来 [s:173]
ningmeng7294
ningmeng7294 2009-08-19
虽然我出不上力,但是当拉拉队,给大伙加油助威 [s:154]
zhengrob
zhengrob 2009-08-21
Bernard, 很高兴看到软件方面的进展!

关于硬件方面不知道是否已开始。如果需要画线路图,请把与软件相关的pin脚定义列一下:-

-- STM32F103ZET6与SRAM,NANDFLASH的连接(参照某个开发板schematic?)。
-- SD card 连接 SDIO, SDcard detect用哪个GPIO?
-- DM9000A 使用8 bit还是16bit方式? 它的控制端引脚用哪些GPIOs?
-- TFT LCD的型号是否确定为34元的那个? 控制端引脚用哪些GPIOs合适?
-- WM8753与STM32F103ZET6的I2S如何连接的?同样控制端引脚用哪些GPIOs合适?
-- Buttons 用哪些GPIOs?
-- 电源管理用哪个AD口和GPIO控制口?
-- 是否要将MCU的pin都引出(2.54mm距)以兼容一个开发板的功能?

其实,最好的方式就是你是用的哪块开发板来调的软件模块,我们的线路图就按照那块开发板来走。这样确定软硬件接口会简单些。
bernard
bernard 2009-08-21
现在电路图还没定下来,原来说画图的兄弟临时有些事,现在在考虑接手的事。

硬件是基本都确定下来了,就差图了。pin脚倒确实希望能够都通过2.54mm接出来,这样调试也方便些。
zhengrob
zhengrob 2009-08-21
Bernard, 我来画图吧。请将相关硬件接口细节传给我。 wanghar@163.com

sch大概3-4天。PCB大概4-5天。 我用PADS2005 SP3。
bernard
bernard 2009-08-21
谢谢,看了下,电路图大体是完成了的,但SDIO SD卡还没加。

不过看到你的回复晚了些,“空白” 说这两天他会把图整理好。这里我先发一份给你,protel 99的。到时layout却是PADS的。
bernard
bernard 2009-08-26
软件设计的文档(需求部分应再展开,以各个阶段设计的连续性),还会持续更新 [s:187]
aozima
aozima 2009-08-26
拒绝白嫖,拒绝键盘侠!
这文档搞得还像那么回事 [s:154] [s:154]
zhengrob
zhengrob 2009-08-27
这星期前两天被其他事绊住。现在可以了,正在按Bernard传给我的原理图做线路图的最后整理。预计第一版PCB Layout (T1) 31日左右会出来。

SDIO已加上,SDIO0-SDIO3,SDIO_CLK,SDIO_CMD。card detect用PC7(Pin# 97)没有问题吧?这样布板会方便些。

那个TFT就是34元的那款吧?请确认。如果是的话我把与它配套的那个22pin connector就直接放到板子上了。

还有一个问题,传给我的电路图中,P6这个元件(连接器,或者是双排2.54针?)是做什么用的?什么封装形式,请确认。

最后一个问题就是电源部分了,坦白地讲, CD4013控制部分我看不太明白。另外锂电池放电电路会有问题,D2是防倒灌二极管,用肖特基的话也得有0.15V的压降,而3.3VLDO (SG20125)输入电压最低也得3.5V,这样的话,电池电压降到3.65V就有可能供电停止了,这意味着大约40%的电池容量不可用。锂电池标称的容量 xxxmAH是指从 4.2V到3.2V的放电过程。

如果这样的话,应该重新考虑电池供电的电路。
54et
54et 2009-08-28
第一版的可以不考虑用电池供电,毕竟这个版本没有wifi,就算用上电池,意义也不大。
aozima
aozima 2009-08-28
拒绝白嫖,拒绝键盘侠!
To "zhengrob"

看到信息后,请通过以下三种方式联系我
Email:master(AT)aozima(DOT)cn
QQ:347928257

我希望能在今天确认下原理图
bernard
bernard 2009-08-28
aozima, 上面有zhengrob的邮件地址的。
bernard
bernard 2009-09-07
播放音频
---- 基于RT-Thread框架

在这个项目中,需要使用到音频播放。它会引申出一个话题,如何在嵌入式系统中才能有效的进行音频播放呢?类似于这个项目,硬件是通过IIS总线把PCM音频数据传递给WM设备并最终进行播放的。

这其中面临着几个问题:把数据发送到IIS总线上;获得PCM音频数据。

在IIS总线上传递数据有几种方式,一种是程序轮询方式写入;一种是依赖于中断,当中断来临的时候写入;一种是采用DMA方式自动传送。第一种方式无疑最简单,想写什么就写什么。

但问题是,写着写着,把数据都写完的时候怎么办?再立马读出PCM数据?但读取也是需要时间的,而这点时间已经在你的耳朵里造成了吱吱的噪声了。而对于mp3软解码,显然这点时间更不够。

那么就采用另外两种方法,中断方式和DMA方式在复杂度上相差无几,而在性能上DMA无疑要高出一大截。DMA吧。

但新的问题是,通常产生PCM的速度是要大于播放的速度的(否则就又是吱吱的噪音了),如果一直产生PCM数据,那么最后系统的内存将被耗尽。这个时候就需要获取PCM数据的任务能够在恰当的时候自动停止,并且也能够在恰当的时候唤醒。在一般的RTOS中,或许用一个信号量去同步获取PCM数据任务和IIS设备间的关系。

在RT-Thread则简单多了:
获取PCM数据,需要用内存缓冲区去放置,并且这块放置了PCM数据的缓冲区还需要传递到IIS上。关键词:缓冲区
用RT-Thread里的memory pool就可以完成上面的,缓冲区开辟、释放、线程挂起、线程释放的所有动作。

audio_mp.jpg

播放线程,当要获取PCM数据时,将向memory pool请求内存块,如果内存块已经用完,将被挂起。否则,它将获得内存块以放置PCM数据。

而后播放线程把包含PCM数据的内存块写入到snd抽象设备中。(播放线程会立刻返回,继续制造更多的PCM数据)

当snd抽象设备写入完成后,将调用播放线程设置的回调函数,释放写入的内存块。如果此时,播放线程因为把memory pool里的内存块都用光而挂起时,将唤醒播放线程,让播放线程继续制造更多的PCM。
bernard
bernard 2009-10-08
能够在stm32 radio板子上跑的代码已经更新到svn,包括:
- wav文件播放;
- mp3文件播放;
- 文件系统 & LwIP协议栈及相应驱动;

已知问题:dm9000驱动在高负荷情况下,Rx Overflow触发,接收部分自动失效(Rx Overflow中断却不触发)。

用的依然是ST STM32 2.0.x的固件库,还没来得及更新,这部分目前来看影响也不大。
bernard
bernard 2009-10-10
dm9000a也挺郁闷的,加了个http client的代码用于播放shoutcast网络音频,发现dm9000a的驱动再连续进行发包是,包又粘合在一起乱掉了。驱动还需要再改良改良。

现在svn仓库上的ST固件库已经升级到3.1.2了。
bernard
bernard 2009-10-15
目前第一版能跑的代码已经放到google svn里了
http://code.google.com/p/rt-thread/sour ... tm32_radio

包括:
SDIO的SD卡,MMC卡驱动
wm8753驱动
DM9000驱动 -- 还在继续检查问题,今天晚上刚拿到两个中文文档。aozimo那边似乎表现得比较好,我的RP太差了,痛哭中。。。
key驱动
helix mp3软解压解码器
wav、mp3文件播放
http client
网络数据缓冲及http mp3音频播放

未完成的包括:
- RTGUI
- lcd驱动 (可惜RTGUI的lcd驱动并不是一个块设备,如果是framebuffer类的LCD驱动,可以这么做,但不是)
- U盘

开始加RTGUI 和 LCD驱动了。
aozima
aozima 2009-10-15
拒绝白嫖,拒绝键盘侠!
测试结果:

http读取MP3正常播放
buffering ... 100 %
netbuf suspend, avaible room 327680

同时PC使用发4090字节包进行PING操作
Reply from 192.168.1.30: bytes=4096 time=4ms TTL=255
Reply from 192.168.1.30: bytes=4096 time=4ms TTL=255
Reply from 192.168.1.30: bytes=4096 time=4ms TTL=255
Reply from 192.168.1.30: bytes=4096 time=4ms TTL=255

Ping statistics for 192.168.1.30:
Packets: Sent = 48, Received = 48, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 4ms, Maximum = 4ms, Average = 4ms

播放正常....(256K MP3)
bernard
bernard 2009-10-16
LCD驱动完成;

添加完成RTGUI代码,开始添加GUI相关应用。
bernard
bernard 2009-11-17
STM32上SDIO使用注意事项:
1、STM32勘误中提及,FSMC的DMA操作容易引起冲突:
DMA1 与 DMA2之间
DMA1 与 CPU之间
DMA2 与 CPU之间
当以上两者同时访问FSMC总线时会出现冲突,ST建议用软件的方式做一个互斥,不要让它们同时进行FSMC的访问。

2、SDIO操作方式分为1bit、2bit、4bit;当使用DMA 4bit时,数据读取速度会非常快,所以对一些卡不一定能够读出,建议使用1bit方式。
aozima
aozima 2009-11-17
拒绝白嫖,拒绝键盘侠!
FSMC的DMA操作容易引起冲突:当以上两者同时访问FSMC总线时会出现冲突,ST建议用软件的方式做一个互斥,不要让它们同时进行FSMC的访问。


IO资源分配是否也有要注意的地方?DMA通道是否是可以任意指定的?

所以对一些卡不一定能够读出,建议使用1bit方式。


SDIO默认是在1BIT模式下进行初始化的,我们可以在初始化后,切换到2BIT或4BIT后做一个读取测试,如失败就切回1BIT?
当然,使用DMA的情况下,1BIT应该也不会太慢.
PC用的读卡器内部是用什么机制处理的?好像能兼容任意卡,而且速度也是极限值,但新卡旧卡通吃.
ffxz
ffxz 2009-12-06
目前测试来看,DM9000a硬件问题应该不大,而LwIP还有待优化,把更多的系统资源放出来(用RTI组件后系统优化更好做了,这个开始到没想到)


现在情况是,UDP速度在300k/s,TCP也不错,但具体数值还没得出,30个大小1400长度的ping也没问题。


(新组件RTI,全称Realtime Target Insight,确实无敌,系统做了什么全知道)
aozima
aozima 2009-12-06
拒绝白嫖,拒绝键盘侠!
Good news!
bernard
bernard 2009-12-07
lwip测试:
TCP测试,1k报文大小5ms间隔自动发送(到板子上自动原文回复),总计运行8小时6分钟,总计发送/收到4.5G字节
bernard
bernard 2009-12-31
已经能够支持shoutcast电台播放了,只是我的AP有些怪异,做为网关老是不让我的板子出外网,还没整明白。如果网关没问题,那就可以直接播放互联网上的电台了。
aozima
aozima 2010-01-01
拒绝白嫖,拒绝键盘侠!
- mass storage框架完成,届时,SPI_FLASH,SDCARD,NAND将分为3个逻辑单元添加到mass storage中,

还需要完成: 从存储设备完成IAP功能,欢迎认领.... [s:154]
aozima
aozima 2010-01-01
拒绝白嫖,拒绝键盘侠!
mass storage目前发现如下几点问题:

1.理论速度只有500KB/秒,还需要改用双缓冲已达到1MB/秒的速度.实际测试大约400KB/秒.
测试的是读取速度,写速度应该要稍微低一些.

2.大容量SD卡在接上PC后,要半天才反应过来(此时系统界面操作也卡住),原因为,接上mass storage后,系统要读取设备的分区表和FAT表.
实际测试得:128M的卡会读取900~1000个扇区,4G的卡会读取大约7600个扇区,8G的卡会读取大约15000个扇区.
因此,4G的卡要十多秒才出来,8G的要几十秒,不可忍受....
同时测试发现,当盘符出来后再浏览目录并不会读取,看来,已经在先前读取过了.

3.SDIO底层还有问题
使用我的4G的SD卡,读取来卡类型也是SDHC,但容量和扇区大小都是对的,连接上PC后也操作正常.
但使用我的8G的SDHC卡,读取出来卡类型也是SDHC,但容量只有实际的一半,扇区大小还是512.
于是,在PC上创建目录失败,但可以正常读取...
用WINHEX工具显示DISK容量为3.4G(实际的一半),而我那个4G的应该不是SDHC的,而是SD2.0的.
因为我的读卡器不支持SDHC,但那个4G的可以读.
具体,还是进行测试.
aozima
aozima 2010-01-07
拒绝白嫖,拒绝键盘侠!
招募自学习型红外遥控程序开发

在这一版,红外应该要用起来了,但现在每个人家里都是一大堆遥控,再加个既增加成本又没地方放,还容易丢.
于是,需要使用现在有遥控器.于是产生了这个要求.
项目简单需求:
使用最常用的38K红外,
使用STM32的任何一个中断即可(这个好移植),程序可以独立,不必在RADIO的基础上面继续,因为RADIO目前的代码已经相当庞大,在这个上面比较费事.
预期: 进入学习功能,接下遥控器的一个键,RADIO接收到信号并保存之,下次再收到匹配的信号就确认.只需要实现4个方向加一个确认键即可.
bernard
bernard 2010-02-22
mp3文件播放和shoutcast播放都OK了,现在直接在放California Public Radio,都是英文的。中文的shoutcast电台少了些

播放shoutcast电台,如果码率不高基本上比较流畅。但码率高了后,可能会卡,卡了几次后远端shoutcast服务器就把这个客户端主动踢掉了。

几个网址:
LoveChina


Maerong Radio
http://216.155.130.9:8088

California
http://206.221.211.11:80
aozima
aozima 2010-03-23
拒绝白嫖,拒绝键盘侠!
板子也发了十多块了,但参与任务的人数增加不够.

而目前任务较重.
现总结一下:

wma解码:(非常紧急)
目前耗费资源太大,还用不起来.但这个问题不解决,在白名单下,这个东西只能成为一个摆设.

多目录挂载并在UI下播放:(较紧急)
目前在 finsh中可以浏览挂载的目录下面的文件,但是UI里面没有,
最终,将会把SPI_FLASH挂载到/,所以,这个问题要先解决.

网络不稳定:(非常紧急)
目前RADIO的网络还不稳定,应该是软件上面的问题,具体原因还待查明.
此问题彻底解决,继续进行下去的工作价值不大.
aozima
aozima 2010-03-23
拒绝白嫖,拒绝键盘侠!
同时,原来已经正常工作的功能还需要完善,

1.MP3单声道问题,现在只能播放双声道,但多数电台为单声道,需要完善此部分,不然,不能播放单声道电台.
2.同时,需要自动识别采样率,此功能难度不大,但需要解决.
aozima
aozima 2010-03-28
拒绝白嫖,拒绝键盘侠!
现在基本功能出来了,对界面和易用性上面的需求又上来了.

1.播放网络电台,需要显示 电台名称和状态,同时最好把电台名称放到播放列表里面去.
或 像播放M3U一样,一起添加到播放列表...

2.文件播放方面,多文件播放也得考虑了,m3u文件适合听一张专辑,但其它的则比较需要多文件播放.
aozima
aozima 2010-03-28
拒绝白嫖,拒绝键盘侠!
楼上都添加完,发现首贴中已添加了有部分重复.

继续添加:

1.最右上角那个图标是否要用起来? 中途网线被拔掉再插上,些处图标更新,且网络部分继续正常工作?
这个不重要.

2. 启动时读取资源文件失败自动USB联机,如可能格式化后从网络下载资料文件.
但从网络下载只能作为后备功能.不要做为主要,因为网络是不确定的.
这个,不太急.
bernard
bernard 2010-04-04
网络不稳定的原因是dm9000的驱动还有些问题,发生了Rx Overflow。

Packet Reception
The Rx SRAM is a ring data structure. The start address of RX SRAM is 0C00h after software or hardware reset. Each packet has a 4-byte header followed with the data of the reception packet which CRC field is included. The format of the 4-byte header is 01h, status, BYTE_COUNT low, and BYTE_COUNT high. It is noted that the start address of each packet is in the proper address boundary which depends on the operation mode (ths 8-bit, 16-bit or 32-bit mode).
bernard
bernard 2010-12-27
不经意间发现太长时间未更新了,Radio也需要进化到Radio2,也需要把Radio v3/v4的firmwire调试稳定。
yangjie5225
yangjie5225 2011-02-18
mp3丢帧的问题解决了,一个完整的mp3播放器正慢慢呈现出来 [s:173]

请问:这个问题是如何解决的呢?能否给个思路呢?我看你的代码中,似乎也没有处理这个问题啊。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友