Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1427011
  • 博文数量: 430
  • 博客积分: 9995
  • 博客等级: 中将
  • 技术积分: 4388
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-24 18:04
文章存档

2013年(1)

2008年(2)

2007年(14)

2006年(413)

分类:

2006-06-30 13:58:34

 http://hahaxixi.blogeden.cn

由于工作需要,只编译lib库,可以参考 :-)



交叉编译alsa-lib

$ cd ${PRJROOT}/build-tools

$ wget --passive-ftp ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.0.10.tar.bz2 && tar xvjf alsa-lib-1.0.10.tar.bz2 && cd alsa-lib-1.0.10

$ CC=arm-linux-gcc ./configure --target=arm-linux --build=arm-linux --host=i686-pc-linux --prefix=${TARGET_PREFIX}

$ make

$ make install



提示:

pcm_file.c:191: parse error before `n'

make[2]: *** [pcm_file.lo] Error 1

解决:

修改alsa-lib-1.0.10/src/pcm/pcm_file.c文件

+++191行

- snd_pcm_uframes_t n = snd_pcm_frames_to_bytes(pcm, err);

+ /*snd_pcm_uframes_t*/ n = snd_pcm_frames_to_bytes(pcm, err);

暂时不需要交叉编译driver,先把它放上来,以后可能会用到,到时候在完善^_^

交叉编译alsa-driver

$ cd ${PRJROOT}/build-tools

$ wget --passive-ftp ftp://ftp.alsa-project.org/pub/driver/alsa-driver-1.0.10.tar.bz2 && tar xvjf alsa-driver-1.0.10.tar.bz2 && cd alsa-driver-1.0.10

$ ./configure --with-cross=arm-linux- --host=i686-pc-linux --with-kernel=${PRJROOT}/kernel/linux-2.4.26 --prefix=${PREFIX_TARGET}

$ su -m

password:

# make install

http://hahaxixi.blogeden.cn/post/143796/5213 Wed, 28 Jun 2006 15:27:27 +0800

试着编译openssl,出现一些问题,在网上找到,就转到这里了,根据情况做了些改动 :-)



In a nutshell:



[tim@localhost control-project]$ cd ${PRJROOT}/build-tools



[tim@localhost build-tools]$ wget && tar xvzf openssl-0.9.7d.tar.gz && cd openssl-0.9.7d



[tim@localhost openssl-0.9.7d]$ ./Configure linux-elf-arm --prefix=${TARGET_PREFIX}



Then set your environment so a gcc 3.3-based ARM crosscompiler (Cirrus Logic 3.3 in /usr/local/arm/3.3 will be fine) is in your $PATH, and patch your Makefile to use this

cross-compiler (the patch also contains a linking instruction to libdl, needed to get the openssl binary):



[tim@localhost openssl-0.9.7d]$ wget -N ~clem/nist/opensslForARM.Makefile.patch && patch -p1 < opensslForARM.Makefile.patch



You can compile it now! (after setting DISTCC to /usr/bin/distcc, DISTCC_HOSTS to your distcc hosts, and using make -j DISTCC_HOSTS*2, for example, instead of make to distribute

compiling if you want and can):



[tim@localhost openssl-0.9.7d]$ make && make build-shared



[tim@localhost openssl-0.9.7d]$ make install



(You can do the following if you want (that way /opt/arm/openssl will be your local OpenSSL dir, its includes will be in include and its libs in lib):

/opt/arm/openssl-0.9.7d% mkdir lib && cd lib && ln -s ../libcrypto* ../libssl* . && cd ../.. && ln -s openssl-0.9.7d openssl)
http://hahaxixi.blogeden.cn/post/143796/5201 Mon, 26 Jun 2006 16:28:12 +0800



一. U-Boot

,解压取得源代码后移往源码目录:

$ cd ${PRJROOT}/bootldr/u-boot-1.1.4



建立U-Boot之前,需要针对目标板来设定U-Boot的配置.阅读README文件.

$ make smdk2410_config

$ make CROSS_COMPILE=arm-linux-



将相关的bootloader映像复制到${PRJROOT}/images目录:

$ cp System.map ${PRJROOT}/images/u-boot.System.map-1.1.4

$ cp u-boot.bin ${PRJROOT}/images/u-boot.bin-1.1.4

$ cp u-boot.srec ${PRJROOT}/images/u-boot.srec-1.1.4



如果想要对U-Boot本身进行调试,还必须复制ELF二进制文件:

$ cp u-boot ${PRJROOT}/images/u-boot-1.1.4



最后是U-Boot建立时产生的主机工具:

$ cp tools/mkimage ${PREFIX}/bin
http://hahaxixi.blogeden.cn/post/143796/4881 Thu, 18 May 2006 14:04:32 +0800



一. 文件系统

1. CRAMFS

2.4.26内核没有提供cramfs, 但是优龙公司光盘里提供了mkcramfs, 将它复制到${PREFIX}/sbin目录下, 然后运行:

$ mkcramfs rootfs/ images/cramfs.img



2. JFFS2

$ mkfs.jffs2 -r rootfs/ -o images/rootfs-jffs2.img



3. NFTL上的磁盘文件系统



4. RAM disk上的磁盘文件系统

$ cd ${PRJROOT}

$ mkdir tmp/initrd

建立空的文件系统映像:

$ dd if=/dev/zero of=images/initrd.img bs=1k count=8192

对文件系统初始化, 然后对它建立文件系统并且安装它:

$ su -m

password:

# /sbin/mke2fs -F -v -m0 images/initrd.img

# mount -o loop images/initrd.img tmp/initrd

# cp -av rootfs/* tmp/initrd

# umount tmp/initrd

# exit

最后压缩文件系统产生一个经压缩的RAM disk:

$ gzip -9 < images/initrd.img > images/initrd.bin



5. 安装TMPFS上的目录

在内核配置菜单的File systems子菜单中启用"Virtual memory file system support(former shm fs)"的支持.

在/tmp目录上安装4MB的TMPFS文件系统:

# mount -t tmpfs none /tmp -o size=4m

可以将其加入/etc/init.d/rcS文件.





二. 在线更新

1. rsync工具程序

下载rsync工具程序并解压后移往存放源代码的目录

$ cd ${PRJROOT}/sysapps/rsync-2.6.8

接着设定并编译此套件:

$ CC=arm-linux-gcc CPPFLAGS="-DHAVE_GETTIMEOFDAY_TZ=1" ./configure --host=$TARGET --prefix=${TARGET_PREFIX}

$ make

编译完成后,接着将rsync二进制文件安装到目标板的根文件系统并且对它进行strip的处理:

$ cp rsync ${PRJROOT}/rootfs/bin

$ arm-linux-strip ${PRJROOT}/rootfs/bin/rsync



fsync安装到目标板上后,可以在目标上使用如下的命令来更新它的根文件系统:

# rsync -e "ssh -l root" -r -l -p -t -D -v --progress 192.168.172.50:${PRJROOT}/rootfs/* /

这个命令会从ip将footfs目录的内容复制到目标板的根目录,主机必须执行sshd和rsync这两个监控程序.

命令选项如下:

-e 将用来连接远程服务器的应用程序的名称传给rsync.(此例中,使用ssh -l root以root身份连接服务器.)

-r 以递归的方式复制目录.

-l 保存符号链接.

-p 保存文件存取权限.

-t 保存时间戳.

-D 保存设备节点.

-v 提供详细的输出.

--progress 报告传输的过程.

-n 检查更新进行"排练"而不执行实际的更新动作.





三. 为目标板安装patch工具程序

下载gptch工具 ftp://ftp.gun.org/gnu/patch/ ,取出2.5.4源码并放到${PRJROOT}/sysapps目录下.

$ cd ${PRJROOT}/sysapps

$ mkdir build-patch

$ cd build-patch

$ CC=arm-linux-gcc ../patch-2.5.4/configure --host=$TARGET --prefix=${TARGET_PREFIX}

$ make LDFLAGS="-static"

$ make install

此处以静态链接patch的好处是,不会因为更新期间造成链接库丢失或不完整而导致patch在目标板上执行失败.

$ cp ${TARGET_PREFIX}/bin/patch ${PRJROOT}/rootfs/bin

$ cd ${PRJROOT}/rootfs/bin

$ arm-linux-strip patch

http://hahaxixi.blogeden.cn/post/143796/4880 Thu, 18 May 2006 14:02:17 +0800



一, 为宿主机安装MTD工具程序

下载MTD工具程序: ftp://ftp.uk.linux.org/pub/people/dwmw2/mtd/cvs/

下载至${PRJROOT}/build-tools并将它解开.

$ cd ${PRJROOT}/build-tools/mtd/util

$ make clean



修改Makefile文件:

SBINDIR=sbin

MANDIR=man

INCLUDEDIR=include



$ make



install时需要root权限,否则提示安装失败 :(

$ su -m

password:

# make DESTDIR=${PREFIX} install

工具程序安装到${PREFIX}/sbin目录.搜索路径已经在开发工具里添加.

然后用# chown -R命令改变tools目录的属主



在主机/dev目录中建立MTD设备条目,以root的身份执行MAKEDEV

# ./MAKEDEV



二, 为目标板安装MTD工具程序

首先下载并安装zlib.从 下载zlib并将它解开放到${PRJROOT}/build-tools目录.然后移往该链接库的源码目录,进行编译工作:

$ cd ${PRJROOT}/build-tools/zlib-1.2.3

$ CC=arm-linux-gcc LDSHARED="arm-linux-ld -shared" ./configure --shared

缺省情况下,zlib建立静态的链接库.设定LDSHARED变量以及提供--shared选项,建立成共享链接库.

$ make

$ make prefix=${TARGET_PREFIX} install

zlib安装到${TARGET_PREFIX}/lib,接着将它安装到目标板的根文件系统:

$ cd ${TARGET_PREFIX}/lib

$ cp -d libz.so* ${PRJROOT}/rootfs/lib



然后,将MTD snapshot下载并解开放到${PRJROOT}/sysapps.

$ cd ${PRJROOT}/sysapps/mtd/util

$ make clean



修改Makefile文件:

SBINDIR=usr/sbin

MANDIR=usr/man

INCLUDEDIR=usr/include

CROSS=arm-linux-



$ make



install时需要root权限

$ su -m

password:

# make DESTDIR=${PRJROOT}/rootfs install

工具程序安装到${PRJROOT}/rootfs/usr/sbin目录.

然后用# chown -R命令改变rootfs目录的属主.





Flash芯片以块(而非字节)为单位,所以建立分区的时候必须考虑到"抹除块"的大小,以"抹除块"的大小为界,如:

(可以 # cat /proc/mtd 来察看分区信息)

dev: size erasesize name

mtd0: 00030000 00004000 "boot"

mtd1: 001d0000 00004000 "kernel"

mtd2: 00a00000 00004000 "rootfs"

mtd3: 03400000 00004000 "ext-fs3"
http://hahaxixi.blogeden.cn/post/143796/4866 Mon, 15 May 2006 10:34:07 +0800



一, 根文件系统的基本结构

建立目录见:构建嵌入式Linux系统-开发工具

$ cd ${PRJROOT}/rootfs



二, 链接库

查看应用程序依存哪些动态链接库(不可使用宿主机的ldd),示范使用readelf取回BusyBox工具程序的依存关系:

$ arm-linux-readelf -a ${PRJROOT}/rootfs/bin/busybox | grep "Shared library"





复制必要glibc组件命令:

$ cd ${TARGET_PREFIX}/lib

$ for file in libc libcrypt libdl libm libpthread libresolv libutil

> do

> cp $file-*.so ${PRJROOT}/rootfs/lib

> cp -d $file.so.[*0-9] ${PRJROOT}/rootfs/lib

> done

$ cp -d ld*.so* ${PRJROOT}/rootfs/lib



$ arm-linux-strip ${PRJROOT}/rootfs/lib/*.so





三, 复制内核模块目录到根文件系统

$ cp -a ${PRJROOT}/images/modules-2.4.26/* ${PRJROOT}/rootfs





四, 内核映像

如果准备将引导加载程序设置成从根文件系统来启动内核,则此刻将内核映像复制到目标板的根文件系统:

$ cd ${PRJROOT}/images

$ cp zImage-2.4.26 ${PRJROOT}/rootfs/boot

$ cp 2.4.26.config ${PRJROOT}/rootfs/boot





五, 设备文件

内核源码树的Documentation/dvices.txt文档是静态设备主要和次要编号的正式信息来源.



$ cd ${PRJROOT}/rootfs/dev

$ su -m

Password:

# mknod -m 600 mem c 1 1

# mknod -m 666 null c 1 3

# mknod -m 666 zero c 1 5

# mknod -m 644 random c 1 8

# mknod -m 600 tty0 c 4 0

# mknod -m 666 tty c 5 0

# mknod -m 600 console c 5 1

# exit



$ ln -s /proc/self/fd fd

$ ln -s fd/0 stdin

$ ln -s fd/1 stdout

$ ln -s fd/2 stderr



六, BusyBox

$ cd ${PRJROOT}/sysapps/busybox-0.60.5

$ make TARGET_ARCH=arm CROSS=arm-linux- PREFIX=${PRJROOT}/rootfs all install





七, 定制应用程序





八, 系统初始化

Busybox init

1.配置/etc/inittab文件

#=================示例==================================

# Boot-time system configuration/initialization script.

# This is run first except when booting in single-user mode.

#

::sysinit:/etc/init.d/rcS



# /bin/sh invocations on selected ttys

#

# Start an "askfirst" shell on the console (whatever that may be)

::askfirst:-/bin/sh



console::once:/usr/sbin/inetd



# Stuff to do when restarting the init process

::restart:/sbin/init



# Stuff to do before rebooting

::ctrlaltdel:/bin/umount -a -r > /dev/null 2>&1

::ctrlaltdel:/sbin/swapoff -a > /dev/null 2>&1

#=================end===================================





2.配置/etc/init.d/rcS文件

#=================示例==================================

#! /bin/sh

##set -x

hostname S3C2410

echo "FSC2410 RootDisk"

# Mount the /proc file system

mount -t proc proc /proc

mount -t usbdevfs none /proc/bus/usb

mount -t devpts none /dev/pts



echo "mount tmpfs filesystem to /tmp"

mount -t ramfs none /var

mkdir /var/log

mkdir /var/lock

mkdir /var/run

mkdir /var/empty

mkdir /var/tmp

mount -t tmpfs none /var/tmp

ln -s /dev/fb/0 /dev/fb0

ln -s /dev/touchscreen/0raw /dev/touchpanel

cd /dev

mknod tty0 c 4 0

cd /

cp /usr/pen.cfg /tmp



echo "mount yaffs file system to nand flash partition 3"

mount -t yaffs /dev/mtdblock/3 /mnt

export PATH=$PATH:/mnt/recorder/



ls /

clear

ifconfig lo 127.0.0.1 netmask 255.0.0.0

route add -net 127.0.0.0 netmask 255.0.0.0 dev lo



alias ll='ls -l'



# start up the logins (on serial ports)

# finished

echo "/etc/init.d/rcS done."

# Fall through to a shell prompt

#exit 0



echo "start recorder program"

cd /mnt/recorder/

recorder

#=================end===================================

http://hahaxixi.blogeden.cn/post/143796/4611 Thu, 20 Apr 2006 11:21:59 +0800



一, 下载内核

下载linux-2.4.18.tar.gz

下载patch-2.4.18-rmk5.gz (arm内核补丁)

将内核副本下载至${PRJROOT}/kernel目录.

$ tar xvzf linux-2.4.18.tar.gz 或 $ tar xvjf linux-2.4.18.tar.bz2

$ mv linux linux-2.4.18

$ cd linux-2.4.18

$ zcat ../patch-2.4.18-rmk5.gz | patch -p1



二, 配置方法

$ make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

MTD子系统的配置是内核配置选项主菜单的一部分.具体见存储设备管理.



三, 管理多种配置

将配置文件.config移到${PRJROOT}/kernel目录,并重新命名,版本编号以及简单描述或日期,或二者,最后.config为扩展名.

如: 以2.4.18内核为例

不提供串口支持的配置 2.4.18-no-serial.config

目前认为最佳配置 2.4.18.config



四, 编译内核

建立依存关系

$ make ARCH=arm CROSS_COMPILE=arm-linux- clean dep

建立内核

$ make ARCH=arm CROSS_COMPILE=arm-linux- zImage

建立模块

$ make ARCH=arm CROSS_COMPILE=arm-linux- modules



恢复到配置设定,依存关系建立或编译之前的初始状态,可用如下命令:

$ make ARCH=arm CROSS_COMPILE=arm-linux- distclean



五, 管理内核映像

$ cp arch/arm/boot/zImage ${PRJROOT}/images/zImage-2.4.18-rmk5

$ cp vmlinux ${PRJROOT}/images/vmlinux-2.4.18-rmk5

$ cp System.map ${PRJROOT}/images/System.map-2.4.18-rmk5

$ cp .config ${PRJROOT}/images/2.4.18-rmk5.config



六, 安装内核模块

$ make ARCH=arm CROSS_COMPILE=arm-linux- INSTALL_MOD_PATH=${PRJROOT}/images/modules-2.4.18-rmk5 modules_install

将下载到${PRJROOT}/sysapps目录并取出源码,将script/depmod.pl命令脚本复制到${PREFIX}/bin目录.



$ mkdir ${PRJROOT}/images/modules-2.4.18-rmk5/lib/modules/2.4.18-rmk5

$ depmod.pl

> -k ./vmlinux -F ./System.map

> -b ${PRJROOT}/images/modules-2.4.18-rmk5/lib/modules >

> ${PRJROOT}/images/modules-2.4.18-rmk5/lib/modules/2.4.18-rmk5/modules.dep

http://hahaxixi.blogeden.cn/post/143796/4369 Wed, 29 Mar 2006 14:10:40 +0800



在S3C2410嵌入式开发平台上移植了几款linux媒体播放器,感觉播放效果不是很理想,320x240分辨率下的视频播放也不是很流畅,难道200M主频的速度就只能这样了?我开始有点失望了。上个月,当mplayer摘取了年度Linux world 博览会“新媒体”大奖的消息传来,激发了我再次移植mplayer 到2410的决心,尽管前几次移植的结果都不是很成功。

以前我刚开始在linux下做桌面开发时,就听说mplayer号称linux史上功能最强的媒体播放器,它在桌面上安装起来很方便,简单的configure,make一下,就装好了,和QT的GUI配合,界面还是蛮友好的。Mplayer对媒体格式的广泛支持,以及丰富的后期处理滤镜给我留下深刻印象,最新的版本更支持DIVX,H.264,MPEG4等最新的流媒体格式,可以实时在线播放视频流,这么优秀的播放软件把它移植到嵌入式设备上该多好啊!

公司里有一块2410的开发板,CPU是三星的S3C2410,arm9的内核,板子做工很精细,以前一直都用它来做开发,买的时候配的是10。4寸的sharp大屏,640X480的分辨率,不错,这样就可以测试在640X480分辨率下的视频播放速度了。硬件平台的问题解决了,下一步下载最新的mplayer源代码包,毕竟最新的源代码包才有最新的功能,当然了BUG估计也是不少的。打开mplayer的官方网站的主页,可以看到“download”这个链接,点击一下,进入下载页面,在该页面里可以看到“daily CVS snapshot source”的下载部分,这部分链接都指向了每天提交到CVS服务器里最新的mplayer源代码包,鼠标点击一下开始下载!

1. 开始编译

下载下来的源代码一般都叫MPlayer-current.tar.bz2的名字,好,开始解包,在命令行下敲以下的命令

bunzip2 MPlayer-current.tar.bz2 | tar xv –

查看解包出来的README和INSTALL文件,看看有没有安装时特别声明的东西,这是我的习惯,因为同一个软件的不同版本,安装的方法有时并不一样。然后输入./configure --help看看有没有多出或减少什么选项,还好,没什么变化,于是把以前配置mplayer的命令拿出来,复制,粘贴在命令行上:

./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 --language=zh_CN

配置完毕,开始跨平台编译: make

眼睛盯着编译器反馈的每一个信息,老是担心在哪出错,mplayer的源代码太庞大了,

又使用到不少第三方的库,谁能保证编译不出问题呢.果然,没编译几下,就停下来了,说什么codec-cfg无法运行,产生不了某某头文件。检查了一下,发现codec-cfg这个可执行文件是最先编译产生的一个文件,这个文件是存在的啊,怎么会执行不了呢?于是手动执行了一下,系统提示“cannot execute binary file”,突然想起来,codec-cfg是按跨平台方式编译的啊,产生的是arm的代码,当然不能在x86上执行了,那就先用不用跨平台编译的方式,先把mplayer编译成x86的代码,于是重新配置,简单的 ./configure, make,然后将生成的

codec-cfg改名为codec-cfg.x86。然后再按跨平台方式配置,编译,等编译器出现错误停止编译时,将codec-cfg.x86该名为codec-cfg,再make,OK,编译就可以继续进行了。

在编译期间,还出现了几处错误,都是头文件引用的问题,特别提醒大家的是,在libmpcodecs和libavcodec这两个目录下,有一个疏漏,就是这两个目录的源文件都以

#incude “config.h” 的方式引用头文件“config.h”,但是在这两个目录下并不存在该头文件“config.h”,这些源文件实际是期望引用mplayer安装包根目录下的“config.h”头文件,

因此我们需要在libmpcodecs和libavcodec这两个目录下手动建立一个名为config.h的链接并指向mplayer安装包根目录下的“config.h”头文件,建立方法

$> cd libmpcodecs

$> ln –s ../config.h config.h

$> cd ../

$> cd libavcodec

$> ln –s ../config.h config.h

经过几次的编辑修改,终于成功完成对mplayer的编译链接,一看mplayer文件的大小,10M,z这也太太夸张了吧,我还没编译成debug的呢。到目前为止这算是成功的第一步了。

2.开始调试

编译出来的代码能正常的在2410上跑吗?心中还是有许多疑问。给板子上电,然后用自己编写的一个网络传输工具将代码传到板子的ramdisk,接着再传上一个10M左右的视频,好了,先不带参数运行mplayer,不错,中文的帮助信息弹出来了,说明程序基本编译对了,这时输入命令 ./mplayer matrix.mpg , 眼睛直盯着屏幕,期待着画面的出现,可惜,在出现了一些视频剪辑的反馈信息后,程序再也不动了,没办法,按CTRL+C结束程序,然后就提示出现段错误。以前听说有linux嵌入式的爱好者移植时也出现这样的错误,但是如果不播放声音时,图像可以出现,于是输入命令 ./mplayer -nosound matrix.mpg,这时画面出来了,这个320x240大小的从网上下载的视频,播放起来相当流畅,好像比平时看的影碟机解码速度还快,那当然了,毕竟是320x240大小,又没声音解码的。

声音这块不解决,当然是不能说移植成功的,因为mplayer还支持那么多格式的音频解码。但是问题究竟出在哪里呢?用排除法吧!找一个未经任何音频压缩的WAV音频文件,其时就是PCM文件,上传到ramdisk,然后用mplayer播放,还是出现一样的问题,程序死了。好了,这就说明问题并非出现在音频解码部分,极有可能出现在音频流的播放部分。现在市面上大多数的嵌入式开发板的音频驱动是oss规范的驱动,以前自己做过oss的编程,对这块还是比较熟悉。于是开始查看mpalyer,c源文件,看看它是如何实现音频流播放的,

在音频播放部分它使用到了libao2库的音频播放/控制模块,通过进一步查看ao_oss.c源代码进一步获知mplayer是如何与音频的linux驱动工作的。这一步弄清楚后,重新编译mplayer,打开debug选项,打开调试字符串输出,并在音频播放处设置多处断点,并加上printf语句输出一些变量内容,最终发现在调用ao_oss.c的play()函数时出现除零出错,

这个问题产生的根源最终追溯到音频的驱动部分。现在大部分的嵌入式板子都使用菲利普uda1341音频芯片,因而也都使用了相同一个音频驱动,即MIZI公司拥有版权的linux uda1341音频驱动,这个驱动基本上符合了oss的规范,但是当使用到多段DMA音频数据传输时,出现了一个问题,即DMA缓冲的建立发生在第一次调用write()函数将音频数据传送到设备描述符的时候,然而oss驱动的调用者通常要在打开音频设备描述时候,就期望获取DMA缓冲的信息,然而因为缓冲尚未建立,因而返回缓冲大小为0这个结果。

解决的办法是在音频驱动源码的smdk2410_audio_open()函数体,加上如下一段代码,

if (!output_stream .buffers && audio_setup_buf(&output_stream))

return -ENOMEM;

添加的位置具体见以下代码的粗体部分:

static int smdk2410_audio_open(struct inode *inode, struct file *file)

{

int cold = !audio_active;

DPRINTK("audio_openn");

if ((file->f_flags & O_ACCMODE) == O_RDONLY) {

if (audio_rd_refcount || audio_wr_refcount)

return -EBUSY;

audio_rd_refcount++;

} else if ((file->f_flags & O_ACCMODE) == O_WRONLY) {

if (audio_wr_refcount)

return -EBUSY;

audio_wr_refcount++;

} else if ((file->f_flags & O_ACCMODE) == O_RDWR) {

if (audio_rd_refcount || audio_wr_refcount)

return -EBUSY;

audio_rd_refcount++;

audio_wr_refcount++;

} else

return -EINVAL;

if (cold) {

audio_rate = AUDIO_RATE_DEFAULT;

audio_channels = AUDIO_CHANNELS_DEFAULT;

audio_fragsize = AUDIO_FRAGSIZE_DEFAULT;

audio_nbfrags = AUDIO_NBFRAGS_DEFAULT;

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;

}

if ((file->f_mode & FMODE_READ)){

init_s3c2410_iis_bus_rx();

audio_clear_buf(&input_stream);

}

}

MOD_INC_USE_COUNT;

return 0;

}

改完驱动后,重新编译内核。

3结论

mplayer因为直接使用缓冲帧,或者使用别的什么优化的算法,使得在ARM S3C2410视频播放速度得到显著提高,至少在320x240大小,解压mpeg1或2标准的视频时速度是相当流畅的,但是mpeg4解码速度仍显不足。Arm s3c2410的cpu属于精简指令,定点计算,

无MMX,无硬件浮点计算,因而对大尺寸多媒体编解码的能力仍显不足。业界的解决办法是在CPU外增加硬编解码的DSP,或者在SOC内增加协处理器以加强这方面的功能。

后记

在得知xscale PXA255面世后,我决定用将移植好的mplayer拿给他们在板子上测试。mpeg4编码,画面大小为320x240的视频播放已经相当流畅,这也许就是那些市面上用PXA255 CPU做的PDA播放DIVX视频的效果吧!

http://hahaxixi.blogeden.cn/post/143796/4358 Tue, 28 Mar 2006 13:55:36 +0800



构建嵌入式Linux系统-开发工具



一, 建立实际项目工作空间

工作环境配置脚本文件(develenv),内容如下:

#start------------------------------------------------------------------------------------

#! /bin/bash

#设置环境变量

export PROJECT=daq-module

export PRJROOT=~/control-project/${PROJECT}

export TARGET=arm-linux

export PREFIX=${PRJROOT}/tools

export TARGET_PREFIX=${PREFIX}/${TARGET}

export PATH=${PREFIX}/bin:${PATH}



#创建项目目录

mkdir ${PRJROOT} ${PRJROOT}/bootldr ${PRJROOT}/build-tools ${PRJROOT}/debug ${PRJROOT}/doc ${PRJROOT}/images ${PRJROOT}/kernel ${PRJROOT}/rootfs ${PRJROOT}/sysapps ${PRJROOT}/tmp ${PRJROOT}/tools



#创建build-tools目录

mkdir ${PRJROOT}/build-tools/build-binutils ${PRJROOT}/build-tools/build-boot-gcc ${PRJROOT}/build-tools/build-glibc ${PRJROOT}/build-tools/build-gcc



#创建工具链所需要的include目录

mkdir -p ${TARGET_PREFIX}/include



#根文件系统的基本结构

mkdir ${PRJROOT}/rootfs/bin ${PRJROOT}/rootfs/dev ${PRJROOT}/rootfs/etc ${PRJROOT}/rootfs/lib ${PRJROOT}/rootfs/proc ${PRJROOT}/rootfs/sbin ${PRJROOT}/rootfs/tmp ${PRJROOT}/rootfs/usr ${PRJROOT}/rootfs/var

chmod 1777 ${PRJROOT}/rootfs/tmp

mkdir ${PRJROOT}/rootfs/usr/bin ${PRJROOT}/rootfs/usr/lib ${PRJROOT}/rootfs/usr/sbin

mkdir ${PRJROOT}/rootfs/var/lib ${PRJROOT}/rootfs/var/lock ${PRJROOT}/rootfs/var/log ${PRJROOT}/rootfs/var/run ${PRJROOT}/rootfs/var/tmp ${PRJROOT}/rootfs/boot

chmod 1777 ${PRJROOT}/rootfs/var/tmp



#修改搜索路径:

export PATH=${PREFIX}/sbin:${PATH}

cd $PRJROOT

#end------------------------------------------------------------------------------------





二, GNU跨平台开发工具链

下载GNU工具链的各个组件: ftp://ftp.gnu.org/gnu

准备build-tools目录(见上面脚本)

目录中文件包括:binutils-2.10.1.tar.gz gcc-2.95.3.tar.gz glibc-2.2.3.tar.gz glibc-linuxthreads-2.2.3.tar.gz



建立工具链程序概述:

1.内核头文件的设置

2.二进制工具程序的设置

3.引导编译器的设置

4.C链接库的设置

5.完整编译器的设置



三, 内核头文件设置

内核下载:

将内核副本下载至${PRJROOT}/kernel目录.

$ tar xvzf linux-2.4.18.tar.gz 或 $ tar xvjf linux-2.4.18.tar.bz2

$ mv linux linux-2.4.18

$ cd linux-2.4.18

arm内核补丁

($ zcat ../patch-2.4.18-rmk5.gz | patch -p1)

$ make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig



配置好内核后,将内核头文件复制过去.

$ cp -r include/linux/ ${TARGET_PREFIX}/include

$ cp -r include/asm-arm/ ${TARGET_PREFIX}/include/asm

$ cp -r include/asm-generic/ ${TARGET_PREFIX}/include

注:本例使用的是arm目标板,如果使用ppc或i386目标板,则必须将asm-arm替换成asm-ppc或asm-i386.





四, binutils的设置

$ cd ${PRJROOT}/build-tools

$ tar xvzf binutils-2.10.1.tar.gz

产生一个binutils-2.10.1目录

$ cd build-binutils

$ ../binutils-2.10.1/configure --target=$TARGET --prefix=${PREFIX}

$ make

$ make install

查看一下安装结果是否正确:

$ ls ${PREFIX}/bin





五, 引导编译器的设置

$ cd ${PRJROOT}/build-tools

$ tar xvzf gcc-2.95.3.tar.gz

产生gcc-2.95.3目录

$ cd build-boot-gcc

$ ../gcc-2.95.3/configure --target=$TARGET --prefix=${PREFIX} --without-headers --with-newlib --enable-languages=c

$ make all-gcc

$ make install-gcc

检查一下${PREFIX}/bin的内容看是否安装成功,安装的编译器的文件名是arm-linux-gcc.

注: 原生gcc3.2及以上版本无法生成引导编译器,解决方式见后.



六, 链接库的设置

$ cd ${PRJROOT}/build-tools

$ tar xvzf glibc-2.2.3.tar.gz

$ tar xvzf glibc-linuxthreads-2.2.3.tar.gz --directory=glibc-2.2.3

$ cd build-glibc

$ CC=arm-linux-gcc ../glibc-2.2.3/configure --host=$TARGET --prefix="/usr" --enable-add-ons --with-headers=${TARGET_PREFIX}/include

$ make

$ make cross-compiling=yes install_root=${TARGET_PREFIX} prefix="" install

make时产生错误,install时产生两个error,解决方式见后.



$ cd ${TARGET_PREFIX}/lib

#备份libc.so文件

$ cp ./libc.so ./libc.so.orig

修改libc.so文件,将里面的绝对路径去掉,如: /lib/libc.so.6 --> libc.so.6



七, 完整编译器的设置

$ cd ${PRJROOT}/build-tools/build-gcc

$ ../gcc-2.95.3/configure --target=$TARGET --prefix=${PREFIX} --enable-languages=c,c++

$ make all

$ make install



八, 完成工具链的设置

$ cd ${PREFIX}/${TARGET}/bin

$ file as ar gcc ld nm ranlib strip

$ arm-linux-gcc -print-search-dirs

显示的信息:

install: /home/tim/control-project/daq-module/tools/lib/gcc-lib/arm-linux/2.95.3/

programs: /home/tim/control-project/daq-module/tools/lib/gcc-lib/arm-linux/2.95.3/:/home/tim/control-project/daq-module/tools/lib/gcc-lib/arm-linux/:/usr/lib/gcc/arm-linux/2.95.3/:/usr/lib/gcc/arm-linux/:/home/tim/control-project/daq-module/tools/arm-linux/bin/arm-linux/2.95.3/:/home/tim/control-project/daq-module/tools/arm-linux/bin/

libraries: /home/tim/control-project/daq-module/tools/lib/gcc-lib/arm-linux/2.95.3/:/usr/lib/gcc/arm-linux/2.95.3/:/home/tim/control-project/daq-module/tools/arm-linux/lib/arm-linux/2.95.3/:/home/tim/control-project/daq-module/tools/arm-linux/lib/



programs那一行的第一个条目就是${PREFIX}/lib/gcc-lib/arm-linux/2.95.3,此目录包含了gcc的链接库与工具程序.把二进制文件移往此目录,则交叉编译器就会使用它们,而不会使用原生的工具.



$ mv as ar gcc ld nm ranlib strip ${PREFIX}/lib/gcc-lib/arm-linux/2.95.3

$ for file in as ar gcc ld nm ranlib strip

> do

> ln -s ${PREFIX}/lib/gcc-lib/arm-linux/2.95.3/$file .

> done





我遇到的问题



Q:glibc编译错误如下:

error: `BUS_ISA' undeclared

A:参照

kernel-2.4.23以上的核心用CTL_BUS_ISA代替BUS_ISA

$ cp ${PRJROOT}/build-tools/glibc-2.2.3/sysdeps/unix/sysv/linux/arm/ioperm.c ${PRJROOT}/build-tools/glibc-2.2.3/sysdeps/unix/sysv/linux/arm/ioperm.c.orig

修改glibc源代码下的文件sysdeps/unix/sysv/linux/arm/ioperm.c

用CTL_BUS_ISA替换BUS_ISA





Q:glibc编译错误如下:

make -C manual subdir_install

make[2]: Entering directory `/home/tim/control-project/daq-module/build-tools/glibc-2.2.3/manual'

LANGUAGE=C LC_ALL=C makeinfo libc.texinfo

./stdio.texi:3269: First argument to cross-reference may not be empty.

./stdio.texi:3270: First argument to cross-reference may not be empty.

makeinfo: Removing output file `/home/tim/control-project/daq-module/build-tools/glibc-2.2.3/manual/libc.info' due to errors; use --force to preserve.

make[2]: *** [libc.info] Error 2

make[2]: Leaving directory `/home/tim/control-project/daq-module/build-tools/glibc-2.2.3/manual'

make[1]: *** [manual/subdir_install] Error 2

make[1]: Leaving directory `/home/tim/control-project/daq-module/build-tools/glibc-2.2.3'

make: *** [install] Error 2

A: 参考http://www.ctag.cn/blog/?q=node/22

修改stdio.texi文件之前作一下备份

$ cd ${PRJROOT}/build-tools/glibc-2.2.3/manual

$ cp stdio.texi stdio.texi.orig

Seems like I found the bug...

in libc's stdio.texi lines 2491 and 2492 the combination @ref{, is not allowed, I changed this to a valid first argument... seems like gcc has now started compiling, that probably means that libc was sucessful :-) *crossing fingers*

Sure.... But as I stated, this is not a "fix", it's a "hack" to make it work. I'ts in the documentation, and I think there is a very small chance anybody will look at that.

Untar the glibc-packet, patch it and re-tar before doing a "make".



diff -ur glibc-2.1.3 glibc-2.1.3.new/

diff -ur glibc-2.1.3/manual/stdio.texi glibc-2.1.3.new/manual/stdio.texi

--- glibc-2.1.3/manual/stdio.texi Wed Feb 23 08:02:56 2000

+++ glibc-2.1.3.new/manual/stdio.texi Sun Oct 6 14:46:39 2002

@@ -2487,8 +2487,10 @@

If you are trying to read input that doesn't match a single, fixed

pattern, you may be better off using a tool such as Flex to generate a

lexical scanner, or Bison to generate a parser, rather than using

-@code{scanf}. For more information about these tools, see @ref{, , ,

-flex.info, Flex: The Lexical Scanner Generator}, and @ref{, , ,

+@code{scanf}. For more information about these tools, see @ref{Low-Level

+I/O, , ,

+flex.info, Flex: The Lexical Scanner Generator}, and @ref{Low-Level I/O, ,

+,

bison.info, The Bison Reference Manual}.





Q: 编译无法进行,无法生成arm-linux-gcc.

A:使用gcc 3.2及以上的版本

$ cd ${PRJROOT}/build-tools

$ tar xvzf glibc-2.2.3.tar.gz

$ tar xvzf glibc-linuxthreads-2.2.3.tar.gz --directory=glibc-2.2.3

$ mkdir build-glibc-headers

$ cd build-glibc-headers

$ ../glibc-2.2.3/configure --host=$TARGET --prefix="/usr" --enable-add-ons --with-headers=${TARGET_PREFIX}/include

$ make cross-compiling=yes install_root=${TARGET_PREFIX} prefix="" install-headers



产生一个假的stubs.h文件:

$ mkdir -p ${TARGET_PREFIX}/include/gnu

$ touch ${TARGET_PREFIX}/include/gnu/stubs.h



接下来建立引导gcc编译器:

$ cd ${PRJROOT}/build-tools

$ tar xvzf gcc-2.95.3.tar.gz

产生gcc-2.95.3目录

$ cd build-boot-gcc

$ ../gcc-2.95.3/configure --target=$TARGET --prefix=${PREFIX} --disable-shared --with-headers=${TARGET_PREFIX}/include --with-newlib --enable-languages=c

$ make all-gcc

$ make install-gcc





Q: 提示缺少features.h文件.

A: 拷贝一个过去:

$ cp ${PRJROOT}/build-tools/glibc-2.2.3/include/features.h ${TARGET_PREFIX}/include





Q: 交叉编译程序出错

/lib/libc.so.6: In function `pthread_attr_init@@GLIBC_2.1':

/lib/libc.so.6(.text+0xda5f0): multiple definition of `pthread_attr_init@@GLIBC_2.1'

/home/tim/control-project/daq-module/tools/arm-linux/lib/libpthread.so(.text+0xac): first defined here

/lib/libc.so.6: In function `pthread_cond_broadcast@@GLIBC_2.3.2':

......

/home/tim/control-project/daq-module/tools/lib/gcc-lib/arm-linux/2.95.3/ld: cannot find /lib/libc_nonshared.a

......

A: 忘记修改libc.so文件 :( 怎么修改? 老大, 看看上面,对了,说一下,每次重新编译glibc并安装后,都要修改这个文件.



有的时候需要修改specs文件:

$ cd $PREFIX/lib/gcc-lib/arm-linux/2.95.3

$ emacs specs

将20行的/lib/ld-linux.so.2

修改为 {TARGET_PREFIX}/lib/ld-linux.so.2 (结合使用的系统,将环境变量换成真实路径)

http://hahaxixi.blogeden.cn/post/143796/4320 Thu, 23 Mar 2006 11:56:01 +0800

MiniGUI-1.3.3在开发板上的移植.



1. 构建Linux交叉编译环境

参考建立arm-linux-gcc交叉编译环境.



2. 交叉编译MiniGUI

(1) 解开libminigui-1.3.3.tar.gz软件包.进入该目录,运行./configure脚本:

$ CC=arm-linux-gcc ./configure --target=arm-linux --prefix=${TARGET_PREFIX} --build=arm-linux --host=i686-pc-linux-gnu --disable-lite



(2) 如果运行./configure脚本成功,就会生成定制的Makefile文件,

$ make

$ make install

.安装成功后,函数库被装在lib/子目录中;头文件装在${TARGET_PREFIX}include/子目录中;手册被装在${TARGET_PREFIX}man/子目录中;配置文件被装在${TARGET_PREFIX}etc/子目录中.



(3) MiniGUI资源的编译安装.解压minigui-res-1.3.3.tar.gz,进入相应目录.修改configure.linux文件.打开 configure.linux文件,会发现prefix选项部分的默认值为$(TOPDIR)/usr/local,修改为prefix=${TARGET_PREFIX},然后:

$ make install

安装自动把资源文件安装到${TARGET_PREFIX/lib/minigui/res/ 目录下.
http://hahaxixi.blogeden.cn/post/143796/4169 Mon, 13 Mar 2006 15:22:47 +0800
阅读(3000) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~