免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2346 | 回复: 0
打印 上一主题 下一主题

Mplayer 在S3C2440 Linux-2.6.18.2上移植记录 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-16 11:15 |只看该作者 |倒序浏览

                    Mplayer 在S3C2440 Linux-2.6.18.2上移植记录
一、库文件移植准备
  为支持mp3的解码,在交叉编译mplayer时,加上 –enable-mad,如果在make的时候出现了:找不到 mad.h 的错误。下面方法就是针对这个问题的解决方案)
1.交叉编译libmad
下载libmad包(libmad-0.15.1b.tar.gz);
打开一个终端,进入libmad的目录,输入配置命令:
./configure --enable-fpm=arm --host=arm-linux --disable-shared --disable-debugging --prefix=/usr/local/arm/3.3.2/lib
CC=arm-linux-gcc(要保证arm-linux-gcc的路径已经有 export过,否则给出完整路径。)
make
make install
这样就可以看到 /usr/local/arm/3.3.2/lib 目录下多了include和lib目录,这些就是libmad相关的库。
2.在 configure mplayer的时候,要加上以下几个选项:
--enable-mad (为了在编译和链接的时候找的到头文件和库文件需要在CONFIGURE选项里加入以下两句,不然在编译的时候会找不到头文件,在链接的时候 –lmad 找不到mad的库文件)
--with-extraincdir=/usr/local/arm/3.3.2/lib/include(这个指明 mad.h 这个文件所在的路径)
--with-extralibdir=/usr/local/arm/3.3.2/lib/lib(这个指明libmad相关链接库所在的路径)

二、MPlayer 的移植
    在准备好LIBMAD库以后,就可以进行mplayer的移植了,先下载mplayer的源文件(MPlayer-1.0pre7.tar.bz2),再进行解压缩。
1、  在mplayer-1.0pre7 目录下建立一个setup.sh的文件,把configure配置放里面。命令:touch setup.sh , chmod 777 setup.sh
2、  编辑setup.sh ,在 setup.sh 里加入一行configure的命令,./configure --cc=arm-linux-gcc --target=arm-armv4-linux --enable-static --prefix=/tmp /mplayer --disable-win32  --disable-dvdread --enable-fbdev --disable-mencoder --disable-live --disable-mp3lib --enable-mad --enable-libavcodec  --with-extraincdir=/usr/local/arm/3.3.2/lib/include –with-extralibdir=/usr/local/arm/3.3.2/lib/lib –host-cc=gcc
其中—with…这个参数已经在上面说明了,--host-cc=gcc 必须要有,不然就编译不通过,因为有个文件需要GCC来生成,而不是arm-linux-gcc
3、  配置好以后就进行编译make,一切顺利。到此已经移植完成了。

三、开发板上调试
    下载以上编译的结果到板子上,mplayer大小有10M之多。运行./mplayer xxx.avi 失败,提示声卡的问题,mplayer有个参数是没声音输出,./mplayer –nosound xxx.avi ,结果兴奋,视频出来了,很流畅,当然是用320x240压缩过的视频。但是为什么不能和声音一起播放呢?网上收集的资料显示
这个问题产生的根源最终追溯到音频的驱动部分。现在大部分的嵌入式板子都使用菲利普uda1341音频芯片,因而也都使用了相同一个音频驱动,即MIZI公司拥有版权的linux uda1341音频驱动,这个驱动基本上符合了oss的规范,但是当使用到多段DMA音频数据传输时,出现了一个问题,即DMA缓冲的建立发生在第一次调用write()函数将音频数据传送到设备描述符的时候,然而oss驱动的调用者通常要在打开音频设备描述时候,就期望获取DMA缓冲的信息,然而因为缓冲尚未建立,因而返回缓冲大小为0这个结果。 解决的办法是在音频驱动源码的smdk2410_audio_open()函数体,加上如下一段代码,
              if ((file->f_mode & FMODE_WRITE)){
                            init_s3c2410_iis_bus_tx();
                            audio_clear_buf(&output_stream);
               // 加上以下这行代码
               if (!output_stream .buffers && audio_setup_buf(&output_stream))
                  return -ENOMEM;
按以上的方法做了,但是还是出现同样的提示,仔细的看了驱动,在驱动上加了大量的调试信息最后发现在smdk2410_audio_ioctl 中调用的一个函数老是返回错误,这个函数是access_ok(VERIFY_WRITE, inf, sizeof(*inf)),查了这个函数的代码发现返回1的时候是表示可以访问,而不是错误,所以导致下面代码老是出错,其实运行都是对的:
int err = access_ok(VERIFY_WRITE, inf, sizeof(*inf));
if (err)
return err;
于是改成int err = !access_ok(VERIFY_WRITE, inf, sizeof(*inf));
重新编译内核,大功告成。



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/72877/showart_1083246.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP