* 在ARM(S3C2440)上运行的 MP3软件解码 源程序 *
最近在S3C2440上玩了一下MP3软件解码,给各位分享: 解码源程序ourdev_511127.rar(文件大小:2.47M) (原文件名:mp3软件解码源码.rar) 一些参考文件:点击此处下载 ourdev_511128.rar(文件大小:211K) (原文件名:MP3_IDV2.rar)
点击此处下载 ourdev_511129.rar(文件大小:211K) (原文件名:mp3格式.rar)
点击此处下载 ourdev_511130.rar(文件大小:122K) (原文件名:MP3文件格式.rar) mark 可执行目标代码:
适用于夏普8寸TFT(640x480)ourdev_511134.rar(文件大小:79K) (原文件名:S3C2440_MP3_Decode_LQ080V3DG01(640x480).rar)
适用于东华4.3寸TFT(480x272)ourdev_511135.rar(文件大小:78K) (原文件名:S3C2440_MP3_Decode_东华4.3寸TFT(480x272).rar)
可用以下几种方式运行:
1.烧录到NorFlash的0地址
2.烧录到NandFlash的0地址
3.下载到RAM 0x32000000地址直接运行. 运行效果图
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_511139.JPG
(原文件名:test1.JPG)
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_511140.JPG
(原文件名:test2.JPG)
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_511141.JPG
(原文件名:test3.JPG)
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_511142.JPG
(原文件名:test4.JPG)
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_511143.JPG
(原文件名:test5.JPG) 程序操作方法:
1.先烧录或下载目标文件到2440的硬件平台
2.连接串口线和USB线到电脑,装入SD卡到2440,运行DNW工具软件(串口波特率为115200),按电脑键盘 '0',进入USB Massstorage功能,
等待USB枚举成功后,在"我的电脑"里应该会出现一个U盘符号.
3.复制test.mp3到这个U盘的根目录下,复制完成后,在DNW中按电脑键盘‘ESC'键退出USB Massstorage.
4.按'3'进入MP3 Test功能,系统便开始播放刚刚复制到SD卡中的MP3文件. 开机后先会自动运行触摸屏校正程序,按光标操作便可. 顶,虽然不会玩DSP 是ARM,不是DSP mark DAC芯片为:UDA1341 好东西,要记一下 这个不顶不行 赞一个 赞一个 1.顶一个,开来可以考虑在S3C2440上移植网络收音机了,呵呵!
2.大侠,可以将那个模拟U盘的代码开源吗?想学习一下;
3.另外:在S3C2440上device做的U盘,读写速度怎么样?你是SD模拟的还是使用NAND flash的?1M的文件,读写需要多少s;
4.记得前段时间在LPC2148上将SD卡模拟成U盘,速度不理想呀。 1.使用SD卡.
2.如果不考虑多任务环境,目前测试过的最高速度(没有使用DMA):读:约700KB/S,写:约:400KB/S;
但为了保证系统流畅,我将U盘读写速度都控制在200KB/S左右, mark LZ好强大,实在是佩服,我也想做一个2440下的MP3软解码,水平太菜,刚刚把SD卡的程序做好,不知LZ是在什么平台下编译的,ADS还是Linux下?能否把你整个工程发一份参考一下。 Mark 太强了 RE 【19楼】
:
ADS下开发 下次再增加同时支持 NandFlash 和 SD 卡的的 USB Mass Storage 老大你这个东西好像缺少个include.h文件啊。另外就是你这个只是解析后保存到文件了,如果我想直接播放到dsp该如何处理? 这个不顶不行啊 , 我买了一个 Primer2 , 就是玩楼主的这个功能啊.
^_^!! 楼上的,这个能跑起了吗,是裸板上还是带系统? 的确要MARK 呵呵,浮点解码,ARM9也很吃力吧。 很吃力 要改成定点才实用 【26楼】 binggongs
你可以到 primer2 那个开源论坛看看. 已经有源码了. 不过我也想请教个问题, 既然这个代码是浮点的, 是不是也是可以像 定点 DSP 芯片 使用 Q24 或者 Q15 格式来处理浮点运算呢?
不知道时候可以把控制电机的理论搬到这个上面来. 楼主你这个程序,我跑不起来啊。看不到PCM_Output函数的处理。能否告知一下啊。非常感谢 我看用libmad的比较简单,这个比较复杂啊,不是很明白,希望能指点一下啊 mark mini2440方便移植吗? 刚看到lvhaian 安哥
留言,谢谢了。先去看看 晕,没找到网址,能否直接给一个啊lvhaian 安哥
多谢了 我就是在Mini2440运行的 【24楼】 binggongs
Include.h 这个文件要根据你的实际情况来编写,也就是一个整个系统的所有头文件的集合. static U8 *pcm_dat;
static int pcm_size,pcm_cnt,pcm_pkt;
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
int PCM_DrvInit(void)
{
rCLKCON |= 0x20000; //enable IIS clock
IIS_PortSetting();
Init1341(PLAY);
AdjVolume(0x8000);
// pISR_DMA2= (unsigned)DMA2_Done;
// rINTMSK &= ~(BIT_DMA2);
//rINTMSK |= (BIT_DMA2); //DI
//IIS Tx Start
rIISCON |= 0x1; //IIS Interface start
// rDMASKTRIG2= (1<<2); //DMA2 stop
pcm_cnt=0;
pcm_size=0;
}
/*============================================================================*/
int PCM_SetVolume(U8 vol)
{
AdjVolume(vol<<8);
}
/*============================================================================*/
int PCM_DrvClose(void)
{
rIISCON &= ~(1<<0); //IIS Interface stop
rDMASKTRIG2= (1<<2); //DMA2 stop
rIISFCON = 0x0; //For FIFO flush
rINTMSK |= (BIT_DMA2);
}
/*============================================================================*/
int PCM_SetSampleRate(int bits,U32 rate)
{
int sel,bit;
U32 Pclk,div;
////
if(bits==16)
{
bit=1;
}
else
{
bit=0;
}
////
Pclk=CPU_GetPclkHZ()/1000000;
switch(rate)
{
case 8000:
div=(float)Pclk/3.0720;
break;
////
case 11025:
div=(float)Pclk/4.2336;
break;
////
case 16000:
div=(float)Pclk/6.1440;
break;
////
case 22050:
div=(float)Pclk/8.4672;
break;
////
case 32000:
div=(float)Pclk/12.2880;
break;
////
case 44100:
div=(float)Pclk/16.9344;
break;
////
case 48000:
div=(float)Pclk/18.4320;
break;
////
case 64000:
div=(float)Pclk/24.5760;
break;
////
case 88200:
div=(float)Pclk/33.8688;
break;
////
case 96000:
div=(float)Pclk/36.8640;
break;
////
default:
div=(float)Pclk/16.9344;
break;
}
////
DbgUart_Printf("div=%d\n",div);
sel=0;
switch(sel)
{
case 0 :
//IIS Pre-scaler Setting
rIISPSR = (div<<5) + div;
//In case PCLK = 50 MHz, IIS Codec CLK = 50/(5+1) = 8.34MHz
IIS_Codec_CLK = Pclk/(div+1);
DbgUart_Printf("IIS Master CLK(PCLK) = %d MHz\n", Pclk);
DbgUart_Printf("IIS Codec CLK = %d MHz\n", IIS_Codec_CLK);
rIISCON =(1<<5)|(1<<2)|(1<<1);
//Bit IIS prescaler enable
//Bit Rx idle
//Bit Tx DMA enable
rIISMOD = (0<<9)+(0<<8) + (2<<6) + (1<<5) + (0<<4) + (bit<<3) + (1<<2) + (1<<0);
//Bit Serial bit clock => 32fs,
//Bit Master clock => 384fs,
//Bit Serial data bit per channel => 16bit,
//Bit Serial interface format => IIS compatible format
//Bit Active level of left/right channel => Low for left channel
//Bit Tx/Rx mode select => Tx mode
//Bit Master/Slave mode => Master mode
//Bit Master clock => PCLK
rIISFCON = (1<<15) + (1<<13);
//BitTx FIFO enable
//BitTx FIFO access mode => DMA
DbgUart_Printf("IISLRCK = %d Hz\n", (int) IIS_Codec_CLK*1000000/384);
break;
////
case 1 :
//IIS Pre-scaler Setting
rIISPSR = (div<<5) + div;
IIS_Codec_CLK = FIN;
DbgUart_Printf("IIS Master CLK(MPLLin) = %d MHz\n", FIN/1000000);
DbgUart_Printf("IIS Codec CLK = %d MHz\n", IIS_Codec_CLK/1000000);
rIISCON =(1<<4) + (1<<2) + (1<<1);
//Bit IIS prescaler disable
//Bit Rx idle
//Bit Tx DMA enable
rIISMOD = (1<<9)+(0<<8) + (2<<6) + (0<<5) + (0<<4) + (bit<<3) + (1<<2) + (1<<0);
//Bit Serial bit clock => 32fs,
//Bit Master clock => 384fs,
//Bit Serial data bit per channel => 16bit,
//Bit Serial interface format => IIS compatible format
//Bit Active level of left/right channel => Low for left channel
//Bit Tx/Rx mode select => Tx mode
//Bit Master/Slave mode => Master mode
//Bit Master clock => MPLLin
rIISFCON = (1<<15) + (1<<13);
//BitTx FIFO enable
//BitTx FIFO access mode => DMA
DbgUart_Printf("IISLRCK = %d Hz\n", (int) IIS_Codec_CLK*1000000/384);
break;
////
}
////
}
/*============================================================================*/
int PCM_NeedData(void)
{
if((rDSTAT2&(1<<20))==(1<<20))
{ return 0; //DMA正在传输数据
}
else
{ return 1; //DMA已经传输完成
}
}
/*============================================================================*/
static void DMA2_Done(void)
{
//int size;
//DbgUart_Puts("^");
/*
DbgUart_Printf("pcm_size =%d\n",pcm_size);
DbgUart_Printf("pcm_cnt=%d\n",pcm_cnt);
DbgUart_Printf("pcm_dats =%d\n",pcm_size-pcm_cnt);
DbgUart_Printf("pcm_pkt=%d\n",pcm_pkt);
DbgUart_Printf("****\n\n");
*/
if((pcm_cnt+pcm_pkt)<pcm_size)
{
rDMASKTRIG2 |= (1<<2);
pcm_cnt+=pcm_pkt;
if((pcm_cnt+0x3ffff)<pcm_size)
{
pcm_pkt=0x3ffff;
}
else
{
pcm_pkt=pcm_size-pcm_cnt;
}
rDISRC2= (U32)(pcm_dat)+pcm_cnt;
rDISRCC2 = (0<<1) + (0<<0);
rDIDST2= ((U32)IISFIFO);
rDIDSTC2 = (0<<2) + (1<<1) + (1<<0);
rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)+(1<<23)+(1<<22)+(1<<20)+((pcm_pkt>>1));
rDMASKTRIG2 = (0<<2) + (1<<1) + (0<<0); //No-stop, DMA2 channel On, and No-sw trigger
//IIS Tx Start
rIISCON |= 0x1; //IIS Interface start
}
ClearPending(BIT_DMA2); //Clear pending bit
}
/*============================================================================*/
int PCM_SetSize(U32 size)
{
pcm_size=size;
}
/*============================================================================*/
int PCM_Output(void *pdata,U32 size)
{
////
// DbgUart_Printf("pcm_output ->size =%d\n",size);
rDMASKTRIG2= (1<<2); //DMA2 stop
pISR_DMA2 =(U32)DMA2_Done;
rINTMSK &=~BIT_DMA2;
////
pcm_dat =pdata;
pcm_size =size;
////
if(size>0x3ffff)
{
pcm_pkt=0x3ffff;
}
else
{
pcm_pkt=size;
}
///
if(pdata)
{
pcm_cnt = 0;
rDISRC2= (U32)(pdata);
}
rDISRCC2 = (0<<1) + (0<<0);
rDIDST2= ((U32)IISFIFO);
rDIDSTC2 = (0<<2) + (1<<1) + (1<<0);
rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)+(1<<23)+(1<<22)+(1<<20)+((pcm_pkt>>1));
rDMASKTRIG2 = (0<<2) + (1<<1) + (0<<0); //No-stop, DMA2 channel On, and No-sw trigger
//IIS Tx Start
rIISCON |= 0x1; //IIS Interface start
return 1;
}
/*============================================================================*/
补上PCM部分的驱动程序 mark 好东西,楼主,谢谢。我试试把它移植到9200的板子上。9200带有I2S接口,看看效果如何 没浮点运算能力的CPU还是移植整数的libmad或者helix好,只需要20-30MIPS就搞定了。 在S3C2440上,用float类型做MP3解码,要占用150MIPS上 标记 MARK! 这个程序为什么老是出现Frame cannot be located ,帧不同步啊?
我的PCLK是50MHZ啊!16位441000啊!为什么不同步???
使用郁闷中。 你用什么系统? mark mark 我没用系统,超级裸奔啊,请问怎么回事啊?? 打酱油,还在ARM7晃恩~~~ ding 支持楼主 mark 记下 这个一定得顶,怎一个酷字了得。
安哥说酷的就会置酷。 回复【楼主位】liuweiele
-----------------------------------------------------------------------
谢谢楼主分享~~~~~~~~~~~~~~ mark 哇哦牛逼了 回复【32楼】lvhaian 安哥
不过我也想请教个问题, 既然这个代码是浮点的, 是不是也是可以像 定点 DSP 芯片 使用 Q24 或者 Q15 格式来处理浮点运算呢?
不知道时候可以把控制电机的理论搬到这个上面来.
-----------------------------------------------------------------------
对于没有FPU的CPU,似乎C编译器就是按这种方式来处理浮点数运算的. 必顶。。。贴贴精华 mark 路过!! 发现有上一个下一个目录功能的 几乎没有
另外这个DAC 音质太差,听了VS1053之后就不想听简易USB声卡了 很强大哦!谢谢 hao好东东啊......... mark 好东西啊!!正是我正开始学习的部分!!!谢谢啦
顶上去啊 mark 好东西!收藏了
1 MARK MP3软解码 mark mark 回复【楼主位】liuweiele Liuwei
-----------------------------------------------------------------------
lz,你好,我用了一下你的代码,但是解码的时候,一直输出4和蜂鸣声,然后就data abort exception 了。我的pclk是100M,应该不会是这个问题吧。望解答,谢谢。 支持啊 菜鸟路过打酱油
高深~~~~
手里的2440一直在桌子上供着~~~~ 好定西 mark标记备用 记号~~ 学习 mark 备用,呵呵 tks,关注中,mark. mask mark!~ 标记下!!!!!!!!! 今天偶然看到,留下!多谢! mark!! 先mark,后学习 谢谢 抓来学习一下 mark 学习 mp3mark 顶 mark 哈哈,谢谢,在MINI2440上刚能播放WAV文件,现在想播放MP3了。 頂一下樓主!
页:
[1]
2