liuweiele 发表于 2009-12-5 21:03:17

* 在ARM(S3C2440)上运行的 MP3软件解码 源程序 *

最近在S3C2440上玩了一下MP3软件解码,给各位分享:

liuweiele 发表于 2009-12-5 21:06:36

解码源程序ourdev_511127.rar(文件大小:2.47M) (原文件名:mp3软件解码源码.rar)

liuweiele 发表于 2009-12-5 21:08:24

一些参考文件:
点击此处下载 ourdev_511128.rar(文件大小:211K) (原文件名:MP3_IDV2.rar)
点击此处下载 ourdev_511129.rar(文件大小:211K) (原文件名:mp3格式.rar)
点击此处下载 ourdev_511130.rar(文件大小:122K) (原文件名:MP3文件格式.rar)

looker 发表于 2009-12-5 21:08:48

mark

liuweiele 发表于 2009-12-5 21:14:17

可执行目标代码:

适用于夏普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地址直接运行.

liuweiele 发表于 2009-12-5 21:16:42

运行效果图
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)

liuweiele 发表于 2009-12-5 21:29:08

程序操作方法:
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文件.

liuweiele 发表于 2009-12-5 21:35:49

开机后先会自动运行触摸屏校正程序,按光标操作便可.

oufuqiang 发表于 2009-12-5 21:38:26

顶,虽然不会玩DSP

liuweiele 发表于 2009-12-5 21:41:12

是ARM,不是DSP

ny2000214 发表于 2009-12-5 21:41:35

mark

liuweiele 发表于 2009-12-5 21:44:05

DAC芯片为:UDA1341

ecooly 发表于 2009-12-5 22:08:26

好东西,要记一下

tyblly 发表于 2009-12-6 09:05:57

这个不顶不行

lijintao 发表于 2009-12-6 09:59:43

赞一个

yaya001 发表于 2009-12-6 10:23:30

赞一个

songzi2018 发表于 2009-12-6 14:07:00

1.顶一个,开来可以考虑在S3C2440上移植网络收音机了,呵呵!
2.大侠,可以将那个模拟U盘的代码开源吗?想学习一下;
3.另外:在S3C2440上device做的U盘,读写速度怎么样?你是SD模拟的还是使用NAND flash的?1M的文件,读写需要多少s;
4.记得前段时间在LPC2148上将SD卡模拟成U盘,速度不理想呀。

liuweiele 发表于 2009-12-6 15:46:35

1.使用SD卡.
2.如果不考虑多任务环境,目前测试过的最高速度(没有使用DMA):读:约700KB/S,写:约:400KB/S;
但为了保证系统流畅,我将U盘读写速度都控制在200KB/S左右,

wayde 发表于 2009-12-6 18:01:02

mark

jiben042 发表于 2009-12-6 18:49:38

LZ好强大,实在是佩服,我也想做一个2440下的MP3软解码,水平太菜,刚刚把SD卡的程序做好,不知LZ是在什么平台下编译的,ADS还是Linux下?能否把你整个工程发一份参考一下。

kinre 发表于 2009-12-6 18:52:26

Mark

fy024 发表于 2009-12-6 19:27:10

太强了

liuweiele 发表于 2009-12-6 20:26:52

RE 【19楼】
:
ADS下开发

liuweiele 发表于 2009-12-8 21:16:24

下次再增加同时支持 NandFlash 和 SD 卡的的 USB Mass Storage

binggongs 发表于 2009-12-11 11:06:39

老大你这个东西好像缺少个include.h文件啊。另外就是你这个只是解析后保存到文件了,如果我想直接播放到dsp该如何处理?

lvhaian 发表于 2009-12-11 11:08:11

这个不顶不行啊 , 我买了一个 Primer2 , 就是玩楼主的这个功能啊.

^_^!!

binggongs 发表于 2009-12-11 11:13:57

楼上的,这个能跑起了吗,是裸板上还是带系统?

EngKing 发表于 2009-12-11 11:17:12

的确要MARK

gzhuli 发表于 2009-12-11 11:32:26

呵呵,浮点解码,ARM9也很吃力吧。

liuweiele 发表于 2009-12-11 13:03:51

很吃力

liuweiele 发表于 2009-12-11 13:04:20

要改成定点才实用

lvhaian 发表于 2009-12-11 13:15:31

【26楼】 binggongs

你可以到 primer2 那个开源论坛看看. 已经有源码了.

lvhaian 发表于 2009-12-11 13:17:35

不过我也想请教个问题, 既然这个代码是浮点的, 是不是也是可以像 定点 DSP 芯片 使用 Q24 或者 Q15 格式来处理浮点运算呢?

不知道时候可以把控制电机的理论搬到这个上面来.

binggongs 发表于 2009-12-11 13:23:35

楼主你这个程序,我跑不起来啊。看不到PCM_Output函数的处理。能否告知一下啊。非常感谢

binggongs 发表于 2009-12-11 13:25:19

我看用libmad的比较简单,这个比较复杂啊,不是很明白,希望能指点一下啊

lwy86 发表于 2009-12-11 13:26:06

mark

yemingxp 发表于 2009-12-11 13:35:57

mini2440方便移植吗?

binggongs 发表于 2009-12-11 13:36:59

刚看到lvhaian 安哥
留言,谢谢了。先去看看

binggongs 发表于 2009-12-11 13:43:23

晕,没找到网址,能否直接给一个啊lvhaian 安哥
多谢了

liuweiele 发表于 2009-12-11 15:19:26

我就是在Mini2440运行的

liuweiele 发表于 2009-12-11 15:22:39

【24楼】 binggongs

Include.h 这个文件要根据你的实际情况来编写,也就是一个整个系统的所有头文件的集合.

liuweiele 发表于 2009-12-11 15:26:23

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部分的驱动程序

jackmo 发表于 2009-12-11 15:37:40

mark

zzwuyu 发表于 2009-12-11 15:39:31

好东西,楼主,谢谢。我试试把它移植到9200的板子上。9200带有I2S接口,看看效果如何

gzhuli 发表于 2009-12-11 17:24:49

没浮点运算能力的CPU还是移植整数的libmad或者helix好,只需要20-30MIPS就搞定了。

liuweiele 发表于 2009-12-11 21:03:16

在S3C2440上,用float类型做MP3解码,要占用150MIPS上

win100 发表于 2009-12-12 16:42:46

标记

quzegang 发表于 2009-12-16 17:02:51

MARK!

s625972380 发表于 2009-12-25 22:03:42

这个程序为什么老是出现Frame cannot be located ,帧不同步啊?
我的PCLK是50MHZ啊!16位441000啊!为什么不同步???
使用郁闷中。

liuweiele 发表于 2009-12-26 01:41:17

你用什么系统?

lwy86 发表于 2009-12-26 08:14:54

mark

cookie2g 发表于 2009-12-26 09:40:55

mark

s625972380 发表于 2009-12-27 22:53:33

我没用系统,超级裸奔啊,请问怎么回事啊??

csformat 发表于 2009-12-30 09:19:14

打酱油,还在ARM7晃恩~~~

yunqian09 发表于 2009-12-31 10:41:14

ding

dengxiaofeng 发表于 2010-1-5 19:45:34

支持楼主

xinyou 发表于 2010-1-5 23:14:20

mark

gzyang 发表于 2010-1-11 18:26:38

记下

Morgery 发表于 2010-1-11 20:39:09

这个一定得顶,怎一个酷字了得。

安哥说酷的就会置酷。

cyamon 发表于 2010-2-4 10:24:39

回复【楼主位】liuweiele
-----------------------------------------------------------------------

谢谢楼主分享~~~~~~~~~~~~~~

xiaoniu 发表于 2010-2-4 13:35:25

mark

qiu1123 发表于 2010-2-4 14:42:56

哇哦牛逼了

liuweiele 发表于 2010-2-4 18:28:30

回复【32楼】lvhaian 安哥
不过我也想请教个问题, 既然这个代码是浮点的, 是不是也是可以像 定点 DSP 芯片 使用 Q24 或者 Q15 格式来处理浮点运算呢?
不知道时候可以把控制电机的理论搬到这个上面来.
-----------------------------------------------------------------------

对于没有FPU的CPU,似乎C编译器就是按这种方式来处理浮点数运算的.

niba 发表于 2010-2-4 18:56:01

必顶。。。贴贴精华

html110 发表于 2010-2-5 00:06:59

mark

superyongzhe 发表于 2010-2-24 00:04:21

路过!!

tyou 发表于 2010-2-24 02:17:38

发现有上一个下一个目录功能的 几乎没有

另外这个DAC 音质太差,听了VS1053之后就不想听简易USB声卡了

fayjame 发表于 2010-4-1 14:28:38

很强大哦!谢谢

liouravr 发表于 2010-4-2 14:06:36

hao好东东啊.........

lirics 发表于 2010-4-15 16:39:50

mark

crcyspa2010 发表于 2010-4-18 14:46:42

好东西啊!!正是我正开始学习的部分!!!谢谢啦
顶上去啊

avrwoo 发表于 2010-4-18 16:52:54

mark

XUEPENGBIN 发表于 2010-4-18 17:42:27

好东西!收藏了
1

eduhf_123 发表于 2010-4-18 17:44:13

MARK MP3软解码

qingzhou 发表于 2010-4-24 15:54:06

mark

ep1c3 发表于 2010-5-4 10:29:30

mark

dongchanger 发表于 2010-5-5 11:30:02

回复【楼主位】liuweiele Liuwei
-----------------------------------------------------------------------

lz,你好,我用了一下你的代码,但是解码的时候,一直输出4和蜂鸣声,然后就data abort exception 了。我的pclk是100M,应该不会是这个问题吧。望解答,谢谢。

xy8800 发表于 2010-5-12 13:28:24

支持啊

csformat 发表于 2010-5-12 13:44:54

菜鸟路过打酱油

高深~~~~

手里的2440一直在桌子上供着~~~~

lghtjpu 发表于 2010-5-12 13:45:40

好定西

binaimei2007 发表于 2010-5-12 19:01:40

mark标记备用

zbjzxc 发表于 2010-5-12 19:44:37

记号~~

liangbmw 发表于 2010-5-16 20:40:43

QRAHAO 发表于 2010-5-16 23:08:46

学习

Byway 发表于 2010-5-22 13:21:07

mark 备用,呵呵

tom919 发表于 2010-7-6 16:32:03

tks,关注中,mark.

ap0405209 发表于 2010-7-6 17:01:00

mask

ljt8015 发表于 2010-7-6 17:55:52

mark!~

shanyao 发表于 2010-7-7 16:35:25

标记下!!!!!!!!!

haizaolan 发表于 2010-7-7 20:47:17

今天偶然看到,留下!多谢!

Bird 发表于 2010-7-10 09:06:38

mark!!

swustlx86 发表于 2010-7-21 11:24:22

先mark,后学习

devcang 发表于 2010-9-3 17:11:41

谢谢   抓来学习一下

luo496724812 发表于 2010-9-5 19:07:03

mark

elecfun 发表于 2010-9-5 21:20:32

学习

xxx7597 发表于 2010-10-12 12:15:36

mp3mark

huangtonggao 发表于 2010-10-13 08:57:42

happywolf999 发表于 2011-1-20 10:54:01

mark

blxy 发表于 2011-3-1 11:34:54

哈哈,谢谢,在MINI2440上刚能播放WAV文件,现在想播放MP3了。

gmolzc 发表于 2011-3-1 11:39:03

頂一下樓主!
页: [1] 2
查看完整版本: * 在ARM(S3C2440)上运行的 MP3软件解码 源程序 *