一、u-boot基本常用命令
1. 基本环境设置
setenv serverip 192.168.1.149
setenv ipaddr 192.168.1.148
setenv gatewayip 192.168.1.1
setenv ethaddr 11:22:33:44:55:66
setenv bootargs root=/dev/mtdblock2 rootfstype=yaffs init=/linuxrc mem=64M console=ttySAC0,115200
saveenv
2. 烧写Boot
tftp 30008000 u-boot-v1.0.bin
nand erase 0 30000
nand write 30008000 0 30000
3. 加载内核
tftp 30008000 zImage
go 30008000
4. 烧写rootfs
tftp 30008000 rootfs_udev.yaffs
tftp 30008000 rootfs_mdev.yaffs //只考这里其中一个即可
nand erase 240000 800000
nand write.yaffs 30008000 240000 $(filesize)
setenv bootargs root=/dev/mtdblock2 rootfstype=yaffs init=/linuxrc mem=64M console=ttySAC0,115200
saveenv
5. 烧写内核
//自动引导内核加载
tftp 30008000 zImage
nand erase 40000 200000
nand write 30008000 40000 200000
setenv bootcmd nand read 30008000 40000 200000 /; go 30008000
saveenv
6. erase appfs分区
nand erase 1240000 2DC0000
7. 使用nfs配置:
setenv bootargs root=nfs nfsroot=192.168.1.201:/source/rootfs ip=192.168.1.211 console=ttySAC0,115200 init=/linuxrc mem=64M
二、Linux 2.6.19 fs2410 移植
1.修改nand flash分区: (1和2让内核可以识别yaffs文件系统,因为本出用的内核不支持yaffs文件系统,所以要分区和打补丁)
原始分区为八个分区,与64MB不匹配;所以分为四个;可以根据自己的需求来分区
arch/arm/plat-s3c24xx/common-smdk.c
/* NAND parititon from 2.4.18-swl5 */
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "BootLoader",
.size = 0x00040000, /* 256KB */
.offset = 0,
},
[1] = {
.name = "Kernel",
.size = 0x00200000, /* 2MB */
.offset = 0x00040000,
},
[2] = {
.name = "Rootfs",
.size = 0x01000000, /* 16MB */
.offset = 0x00240000,
},
[3] = {
.name = "Appfs",
.size = 0x02DC0000, /* 44MB + 792KB */
.offset = 0x01240000,
}
};
make
把生成的zImage放到tftpboot
开发板:
tftp ipserver
tftp 30008000 zImage
go 30008000
//Erase Kernel Partition
nand erase 40000 200000
//Erase Rootfs Partition
nand erase 240000 1000000
//Erase Appfs Partition
nand erase 1240000 2DC0000
2. 挂载yaffs文件系统:
yaffs2补丁:
./patch-ker.sh c ../linux-2.6.29-fs2410 把补丁打到内核中,
可以再Kconfig中查看; surce "fs/yaffs2/Kconfig"
在Makefile中也有更改,且把一些文件考到内核源码中
由此把yaffs文件系统放入内核中;
make menuconfig
把File system -->Miscellaneous filesystems-->YAFFS FILE SYSTEM SUPPORT;LETS YAFFS DO ITS OWN ECC;都选上
3. cs8900网络驱动移植 (cs8900a.c, cs8900a.h,注意*a.c里面有个include cs8900.h 要加个a)考到driver/net 再修改kconfig
(1)
arch/arm/plat-s3c24xx/devs.c
/* CS8900 netif -- Addde by fengyong*/
static struct resource cs8900_resource[] = {
[0] = {
.start = 0x19000300,
.end = 0x19000310,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_EINT9,
.end = IRQ_EINT9,
.flags = IORESOURCE_IRQ,
}
};
struct platform_device net_device_cs8900 = {
.name = "cs8900",
.id = -1,
.num_resources = ARRAY_SIZE(cs8900_resource),
.resource = cs8900_resource,
};
EXPORT_SYMBOL(net_device_cs8900);
(2)
arch/arm/plat-s3c/include/plat/devs.h
extern struct platform_device net_device_cs8900; //Added by fengyong
(3)
arch/arm/mach-s32410/mach-smdk2410.c
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&net_device_cs8900, //Added by fengyong
};
(4)
drivers/net/Kconfig
加入
config CS8900A
tristate "CS8900A support"
depends on ARM && ARCH_S3C2410
---help---
Support for cs8900a chipset.
To compile this driver as a module, choose M here. The module
will be called cs8900a.
(5)修改drivers/net/Makefile
obj-$(CONFIG_CS8900A) += cs8900a.o 就在menuconfig中加入了cs8900a选项,
make menuconfig后设置一下里面的选项:
1. Device Drivers ---> SCSI device support ---> 用空格选中<*> SCSI device support,[*] legacy /proc/scsi/ support 和<*> SCSI disk support
2.Device Drivers ---> [*] Network device support ---> 选中 <*> CS8900a support和 [*] Ethernet (10 or 100Mbit) --->
保存再make zImage 再下载到内核中,go一下
ip设置:ifconfig eth0 192.168.1.148 up
/*(6)vim etc/init.d/rcs配置网路
#networking
/sbin/ifconfig lo 127.0.0.1 up
/sbin/ifconfig eth0 ip netmask 255....... up
/sbin/route add default gw 192.168.1.1
*/
在/etc/ifconfig_eth0.sh中设置ip。
4. USB MassStorage 驱动移植
设置usb时,直接make menuconfig 设置选项:
1.Device Drivers ---> [*] USB support --->
2. File systems ---> -*- Native language support ---> <*> Codepage 437 (United States, Canada) ,<*> Simplified Chinese charset (CP936, GB2312) 和<*>
NLS ISO 8859-1 (Latin 1; Western European Languages) ,<*> NLS UTF-8
3.File systems --->DOS/FAT/NT Filesystems ---> <*> MSDOS fs support 和<*> VFAT (Windows-95) fs support
(936) Default codepage for FAT 将里面的数字437改为936,
保存退出make zImage
/*static void __init smdk2410_init(void)
{
u32 val = 0;
s3c24xx_fb_set_platdata(&fs2410_fb_info);
s3c_i2c0_set_platdata(NULL);
platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));
smdk_machine_init();
//Added by fengyong
val = (0x78 << 12) | (0x02 << 4) | (0x03);
//48M时钟MDIV [19:12] =0x78,PDIV[9:4]=0x2 ,SDIV[1:0]=0x3.
writel(val, S3C2410_UPLLCON);
加上一个头文件:#include <mach/regs-clock.h>
}*/
//mount -t vfat /dev/sda1 /mnt/udisk 出错则修改内核配置
//file system--dos/fat/nt ---(437)default -- 改成 936
编译
挂载:mount -t vfat /dev/sda1 /mnt/udisk
开发板上 mount -t vfat -o iocharset=cp936 /dev/sda1 /mnt/udisk 会出现中文显示
退一目录卸载u盘:umount /mnt/udisk
5. SD卡
make menuconfig
device driver--mmc/sd/sd10 card suppport选中--mmc block device driver ,use bounce ,samsumg s3c sd/mmc card interface support 退出
arch/arm/mach-s32410/mach-smdk2410.c
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_sdi, //Added
&net_device_cs8900,:wq
};
drivers/mmc/host/s3cmic.c
s3cmci_probe函数中:
//host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);
host->irq_cd = IRQ_EINT18;
s3c2410_gpio_cfgpin(S3C2410_GPG10, S3C2410_GPG10_EINT18);
make zImage
mount -t vfat -o iocharset=cp932 /dev/mmcblk0p1 /mnt/sdfs
6. LCD
arch/arm/mach-s3c2410/mach-smdk2410.c
#include <mach/fb.h>
/* LCD driver info */
static struct s3c2410fb_display fs2410_lcd_cfg[] __initdata = {
{
/* Config for 320x240 LCD */
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
.type = S3C2410_LCDCON1_TFT,
.width = 320,
.height = 240,
.pixclock = 100000, /* HCLK/10 */
.xres = 320,
.yres = 240,
.bpp = 16,
.left_margin = 13,
.right_margin = 8,
.hsync_len = 4, //58
.upper_margin = 2,
.lower_margin = 7,
.vsync_len = 4, //18
},
};
static struct s3c2410fb_mach_info fs2410_fb_info __initdata = {
.displays = fs2410_lcd_cfg,
.num_displays = ARRAY_SIZE(fs2410_lcd_cfg),
.default_display = 0,
.gpccon = 0xaaaaaaaa,
.gpccon_mask = 0xffffffff,
.gpcup = 0x0000ffff,
.gpcup_mask = 0xffffffff,
.gpdcon = 0xaaaaaaaa,
.gpdcon_mask = 0xffffffff,
.gpdup = 0x0000ffff,
.gpdup_mask = 0xffffffff,
.lpcsel = ((0xCE6) & ~7) | 1<<4,
};
static void __init smdk2410_init(void)
{
s3c24xx_fb_set_platdata(&fs2410_fb_info); //Added by fengyong for LCD
s3c_i2c0_set_platdata(NULL);
platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));
smdk_machine_init();
}
make menuconfig 后
1.Device Drivers --->Graphics support ---> 选中 [*] Bootup logo ---> 和 <*> Support for frame buffer devices --->
2.<*> Support for frame buffer devices --->选中 <*> S3C2410 LCD framebuffer support
3.Device Drivers --->Graphics support ---> 选中 Console display driver support ---> <*> Framebuffer Console support
make menuconfig
device driver ---graphics supports(选中)--support for frme buffer (---s3c2410)
--bootup logo 缺省
make zImage
bmp_arry_320*240.exe工具修改位图为开发板识别格式
cp name.img /dev/fb0
7. rootfs 文件系统
udev 和mdev:
在/etc/init.d/rcS脚本中
mdev:
/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
放开,屏蔽udev
udev:
vi /etc/init.d/rcS
/sbin/udevd --daemon
/sbin/udevstart
屏蔽mdev
加到mounting file system .....后面
/bin/mknod /dev/null c 1 3
/bin/mknod /dev/console c 5 1
mdev和udev在rootfs中只能使用其中一种。
烧写制作3种文件系统:
crmafs:
./mkfs.cramfs rootfs rootfs.cramfs //制作crmafs映像
tftp 30008000 rootfs.cramfs
nand erase 240000 800000
nand write 30008000 240000 $(filesize)
setenv bootargs root=/dev/mtdblock2 rootfstype=cramfs init=/linuxrc mem=64M console=ttySAC0,115200
saveenv
jffs2:
./mkfs.jffs2 -r ./rootfs -o rootfs.jffs2 -e 0x4000 --pad=0x800000 -n //制作jffs2映像
tftp 30008000 rootfs.jffs2
nand erase 240000 800000
nand write.jffs2 30008000 240000 800000
setenv bootargs root=/dev/mtdblock2 rootfstype=jffs2 rw init=/linuxrc mem=64M console=ttySAC0,115200
saveenv
yaffs:
./mkyaffs2image rootfs rpptfs.yaffs
tftp 30008000 rootfs.yaffs
nand erase 240000 800000
nand write.yaffs 30008000 240000 $(filesize)
setenv bootargs root=/dev/mtdblock2 rootfstype=yaffs init=/linuxrc mem=64M console=ttySAC0,115200
saveenv
8.wget 下载图片,并在显示屏上显示
inux下安装ftp(apt-get install vsftpd)
将图片拷贝到/home/ftp下(首先建好ftp目录)
启动内核(tftp 30008000 zImage & go 30008000)
wget ftp://192.168.1.137/i.img
cp i.img /dev/fb0
9.启动优化
1. make menuconfig : drivers/character devices --> pty 255->8 //255表有255个pty设备结点,telnet能同时登陆的用户个数
2.可以查看时间的设置: Kernel hacking ---> [*] Show timing information on printks
3. tty
/include/linux/vt.h
#define MIN_NR_CONSOLES 1 /* must be at least 1 */
#define MAX_NR_CONSOLES 8 //63 /* serial lines start at 64 */ //表示有63个tty设备结点,串口虚拟终端个数,不是uart series;
#define MAX_NR_USER_CONSOLES 8 //63 /* must be root to allocate above this */
10.电源管理
1) bootloader修改
cpu/arm920t/start.S
2)内核
arch/arm/plat-s3c24xx/irq.c
unsigned long s3c_irqwake_intmask = 0xffffffffL;
=》
unsigned long s3c_irqwake_intmask = 0xfffffff0L; //0xffffffffL;
arch/arm/plat-s3c24xx/pm.c
/* set the irq configuration for wake */
s3c2410_pm_configure_extint();
DBG("sleep: irq wakeup masks: %08lx,%08lx/n",
s3c_irqwake_intmask, s3c_irqwake_eintmask);
__raw_writel(s3c_irqwake_intmask, S3C2410_INTMSK);
__raw_writel(s3c_irqwake_eintmask, S3C2410_EINTMASK);
/* ack any outstanding external interrupts before we go to sleep */
=》
/* set the irq configuration for wake */
__raw_writel(2, S3C2410_EXTINT0); Added by fengyong
s3c2410_pm_configure_extint();
DBG("sleep: irq wakeup masks: %08lx,%08lx/n",
s3c_irqwake_intmask, s3c_irqwake_eintmask);
__raw_writel(s3c_irqwake_intmask, S3C2410_INTMSK);
__raw_writel(s3c_irqwake_eintmask, S3C2410_EINTMASK);
//Added by fengyong
__raw_writel(((__raw_readl(S3C2410_GPECON)&(~(3<<22)))+(0x01<<22)), S3C2410_GPECON);
__raw_writel(__raw_readl(S3C2410_GPEDAT)&(~(1<<11)), S3C2410_GPEDAT);
DBG("GPECON=%x/n",__raw_readl(S3C2410_GPECON));
DBG("GPEDAT=%x/n",__raw_readl(S3C2410_GPEDAT));
/* ack any outstanding external interrupts before we go to sleep */
配置:
在 Power management options ---> 选中[*] Power Management support,[*] Suspend to RAM and standby ,<*> Advanced Power Management Emulation
修改完之后,将test_pm.c运行arm-linux-gcc把可执行文件拷到u盘上,再挂载到板子上,在板子上执行。
3)
内核里面定义了一个虚拟的电源设备:apm_bios(在内核编译的配置中可以打开),
该设备的实现代码在源文件driver/char/apm-emulation.c,应用程序可以通过ioctl()方式访问该设备启动系统的休眠。
在apm_ioctl()函数中,先调用函数queue_suspend_event()向所有apm用户通知休眠事件,
然后调用apm_suspend()(定义同在源文件driver/char/apm-emulation.c中)完成从休眠到唤醒的所有工作。
而apm_suspend()的主要任务是调用定义在kernel/power/main.c中的pm_suspend()函数,以及唤醒上述的apm用户。
11.根文件系统rootfs的制作
1.解压:tar zxvf busybox-1.13.2.tar.gz ,进入目录:cd busybox-1.13.2 ,
修改:vim Makefile ,查找:/CROSS ,修改路径:CROSS_COMPILE ?= /home/linux/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-
gnu- 保存退出, 运行:make && make install
2.解压:tar zxvf rootfs_fs2410_template_v1.0.tar.gz 解压:tar zxvf udev-120.tar.gz 修改udev-120里面Makefile的路径,再make一下。
3.在busybox-1.13.2里将_install里面的所有内容都拷贝到rootfs里:cp -a * /opt/rootfs ,将udev-120里面 udevadm udevd拷贝到/opt/rootfs/usr/sbin 命令 : cp
udevadm udevd /opt/rootfs/usr/sbin 将交叉编译里的 lib 库所有除.a .o .dir和目录文件删除后考到/opt/rootfs/lib下面 rm *.a .o .dir gconv ldscripts 。
4.在rootfs下裁剪编译器下的.so文件命令为:/home/linux/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-strip *.so 退出
rootfs目录将rootfs打包为yaffs文件 命令执行./mkyaffs2image rootfs roofs_fs2410.yaffs
将rootfs_fs2410.yaffs复制到tftpboot下 改变权限:chmod 777 rootfs_fs2410.yaffs。
5.将其烧到板子上:
tftp 30008000 rootfs——fs2410.yaffs
nand erase 240000 800000
nand write.yaffs 30008000 240000 $(filesize)
6. 加载内核
tftp 30008000 zImage
go 30008000
加载成功提示:Starting udevd ...
7。在板子上操作
查看分区:df
打开vi /etc/init.d/rcS 修改成:屏蔽"Start mdev ..."内容,打开Starting udevd ...
保存退出再sync一下,再reboot重启加载内核。
查看挂载:SD卡ls /mnt/SD U盘 ls /mnt/OHCI
8.代码分析
8.1 在udv里mout.sh的代码:vi mount.sh 自动挂载设置挂载分区的
#!/bin/sh
U_ACTION=$1
U_NAME=$2
#
# if remove then umount
#
if [ "${U_ACTION}" = "remove" ]; then
if [ "${U_NAME}" = "mmcblk0" ]; then
/bin/umount /mnt/SD
fi
if [ "${U_NAME}" = "sda" ]; then
/bin/umount /mnt/OHCI
fi
else
# else if add then detect device
#
if [ "${U_NAME}" = "mmcblk0p1" ]; then
/bin/mount /dev/mmcblk0p1 /mnt/SD
fi ### end if SD
if [ "${U_NAME}" = "sda" ]; then
/bin/mount /dev/sda -o iocharset=cp936 /mnt/OHCI //挂载U显示中文
fi ### end if OHCI
fi ### end if remove
8.2 在 rules.d里udev.rules的代码:支持热拔插的
###############################################
# mmc devices
KERNEL=="mmcblk[0-9]*", NAME="%k", ACTION=="add", RUN+="/etc/udev/mount.sh add %
KERNEL=="mmcblk[0-9]*", ACTION=="remove", RUN+="/etc/udev/mount.sh remove %k"
###############################################
# scsi devices
KERNEL=="sd[a-z]*", NAME="%k", ACTION=="add", RUN+="/etc/udev/mount.sh add %k"
KERNEL=="sd[a-z]*", ACTION=="remove", RUN+="/etc/udev/mount.sh remove %k"
###############################################
# rtc device
KERNEL=="rtc0", SYMLINK+="rtc"
SUBSYSTEM=="input", KERNEL=="event[0-9]*", SYSFS{modalias}=="input:*-e0*,3,*a0,1
###############################################
# input devices
KERNEL=="mice", NAME="input/%k"
KERNEL=="mouse[0-9]*", NAME="input/%k"
KERNEL=="event[0-9]*", NAME="input/%k"
KERNEL=="js[0-9]*", NAME="input/%k"
KERNEL=="ts[0-9]*", NAME="input/%k"
KERNEL=="uinput", NAME="input/%k"
12.音频
1)增加平台设备结构
arch/arm/mach-s3c2410/mach-smdk2410.c
增加头文件:
#include <sound/s3c24xx_uda134x.h>
#include <mach/regs-gpio.h>
/* uda134x codec */
static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = {
.l3_clk = S3C2410_GPB4,
.l3_data = S3C2410_GPB3,
.l3_mode = S3C2410_GPB2,
.model = UDA134X_UDA1341,
};
static struct platform_device s3c24xx_uda134x = {
.name = "s3c24xx_uda134x",
.dev = {
.platform_data = &s3c24xx_uda134x_data,
}
};
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,、
&s3c_device_iis,
&s3c_device_sdi,
&net_device_cs8900,
&s3c24xx_uda134x, //fengyong
};
2)配置I2C和ALSA
I2C: Device Drivers -> <*> I2C support ---> [*] Autoselect pertinent helper modules ;进入 I2C Hardware Bus support ---> <*> S3C2410 I2C Driver
ALSA:Device Drivers -> <*> Sound card support ---><*> Advanced Linux Sound Architecture --->
选中<*> Sequencer support , [*] Support old ALSA API , [*] Verbose procfs contents , <*> ALSA for SoC audio support --->
进入 <*> ALSA for SoC audio support ---> 选中<*> SoC Audio for the Samsung S3C24XX chips , <*> SoC I2S Audio support UDA134X wired to a S3C24XX
配置完后make zImage
一、s3c2410移植ALSA及相关工具使用
相关源码文件
ncurses-5.6.tar.gz
alsa-lib-1.0.17.tar.bz2
alsa-utils-1.0.17.tar.bz2
1. 设置环境变量
export MEDIA_INSTALL_DIR=/home/linux/driver/mplay/media_install
2. 编译ncurses
tar zxvf ncurses-5.6.tar.gz
cd ncurses-5.6
./configure --host=arm-linux --target=arm-linux --build=i686-linux --with-softfloat --prefix=/usr --without-ada CC=/opt/gcc-3.4.5-glibc-2.3.6/arm-softfloat-
linux-gnu/bin/arm-softfloat-linux-gnu-gcc
make
make install DESTDIR=$MEDIA_INSTALL_DIR
2. 编译alsa-lib
tar jxvf alsa-lib-1.0.17.tar.bz2
cd alsa-lib-1.0.17
./configure --host=arm-linux --target=arm-linux --build=i686-linux --with-softfloat --prefix=/usr --disable-python CC=/opt/gcc-3.4.5-glibc-2.3.6/arm-
softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-gcc
修改Makefile,删除掉aserver和alsalisp所有部分(各2处去掉两行,去掉两个单词 );因为运行configure设置了--with-softfloat ,不然会出错。
make
make install DESTDIR=$MEDIA_INSTALL_DIR
3.编译alsa-util
tar jxvf alsa-utils-1.0.17.tar.bz2
cd alsa-utils-1.0.17
./configure --host=arm-linux --target=arm-linux --build=i686-linux --with-softfloat --prefix=/usr --with-alsa-prefix=$MEDIA_INSTALL_DIR/usr/lib --with-alsa-
inc-prefix=$MEDIA_INSTALL_DIR/usr/include CC=/opt/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-gcc
make
make install DESTDIR=$MEDIA_INSTALL_DIR
4.相关工具使用
(1)
//由于alsa util工具访问音频alsa设备目录在/dev/snd下,可先创建一个脚本:create_snd_dev.sh
在/etc目录下创建脚本create_snd_dev.sh ,添加下面内容(这样可以使每次启动时自动创建)。
mkdir /dev/snd
ln -s /dev/controlC0 /dev/snd/controlC0
ln -s /dev/pcmC0D0c /dev/snd/pcmC0D0c
ln -s /dev/pcmC0D0p /dev/snd/pcmC0D0p
ln -s /dev/mixer /dev/snd/mixer
ln -s /dev/timer /dev/snd/timer
(2) 使用aplay直接播放wav文件
设置ip:在文件/etc/ifconfig_eth0.sh
cp -a alsa /usr/share/
export LD_LIBRARY_PATH=../lib
利用ftp下载文件到板子上,确定linux下的ftp开启,wget ftp://192.168.1.149/t.c ./
./aplay /mnt/OHCI/mp3/spring.wav
//./aplay xxx.wav
二、s3c2410上mp3库及madplay移植
相关源码文件
zlib-1.2.3.tar.gz
libid3tag-0.15.1b.tar.gz
libmad-0.15.1b.tar.gz
madplay-0.15.2b.tar.gz
1.编译zlib-1.2.3
tar zxvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure --prefix=/home/linux/driver/mplay/media_install/usr
修改Makefile
CC=/opt/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-gcc
AR=/opt/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-ar rc
RANLIB=/opt/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-ranlib
make
make install
2. 编译libid3tag
tar zxvf libid3tag-0.15.1b.tar.gz
cd libid3tag-0.15.1b
./configure --prefix=/home/linux/driver/mplay/media_install/usr --host=arm-linux --disable-debugging CC=/opt/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-
gnu/bin/arm-softfloat-linux-gnu-gcc CPPFLAGS="-I/home/linux/driver/mplay/media_install/usr/include" LDFLAGS="-
L/home/linux/driver/mplay/media_install/usr/lib"
make
make install
3. 编译libmad
tar zxvf libmad-0.15.1b.tar.gz
cd libmad-0.15.1b
./configure --prefix=/home/linux/driver/mplay/media_install/usr --host=arm-linux --disable-debugging CC=/opt/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-
gnu/bin/arm-softfloat-linux-gnu-gcc CPPFLAGS="-I/home/linux/driver/mplay/media_install/usr/include" LDFLAGS="-
L/home/linux/driver/mplay/media_install/usr/lib"
make
出现:cc1: error: unrecognized command line option "-fforce-mem"
修改Makefile
在Makefile中找到包含"fforce-mem"字符串,将其删除即可;原因:gcc3.4或更高版本中,已将将该选项去除了。
再重新make即可
make install
4. 编译madplay
tar zxvf madplay-0.15.2b.tar.gz
cd madplay-0.15.2b
./configure --prefix=/home/linux/driver/mplay/media_install/usr --host=arm-linux --disable-debugging --with-alsa CC=/opt/gcc-3.4.5-glibc-2.3.6/arm-softfloat
-linux-gnu/bin/arm-softfloat-linux-gnu-gcc CPPFLAGS="-I/home/linux/driver/mplay/media_install/usr/include" LDFLAGS="-
L/home/linux/driver/mplay/media_install/usr/lib"
make
编译出错:
/opt/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-gcc -Wall -O2 -fomit-frame-pointer -o madplay madplay.o getopt.o getopt1.o
version.o resample.o filter.o tag.o crc.o rgain.o player.o audio.o audio_aiff.o audio_cdda.o audio_hex.o audio_null.o audio_raw.o audio_snd.o audio_wave.o
audio_alsa.o -L/media/LinuxWorks/p760/multimedia/myworks/media_install/usr/lib /usr/lib/libasound.so -ldl -lpthread -lrt
/media/LinuxWorks/p760/multimedia/myworks/media_install/usr/lib/libmad.so /media/LinuxWorks/p760/multimedia/myworks/media_install/usr/lib/libid3tag.so -lz -
lm -Wl,--rpath -Wl,/media/LinuxWorks/p760/multimedia/myworks/media_install/usr/lib -Wl,--rpath -
Wl,/media/LinuxWorks/p760/multimedia/myworks/media_install/usr/lib
直接修改最后一步:
/opt/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-gcc -Wall -O2 -fomit-frame-pointer -o madplay madplay.o getopt.o getopt1.o
version.o resample.o filter.o tag.o crc.o rgain.o player.o audio.o audio_aiff.o audio_cdda.o audio_hex.o audio_null.o audio_raw.o audio_snd.o audio_wave.o
audio_alsa.o -L/media/LinuxWorks/p760/multimedia/myworks/media_install/usr/lib /media/LinuxWorks/p760/multimedia/myworks/media_install/usr/lib/libasound.so
-ldl -lpthread -lrt /media/LinuxWorks/p760/multimedia/myworks/media_install/usr/lib/libmad.so
/media/LinuxWorks/p760/multimedia/myworks/media_install/usr/lib/libid3tag.so -lz -lm -Wl,--rpath -
Wl,/media/LinuxWorks/p760/multimedia/myworks/media_install/usr/lib -Wl,--rpath -Wl,/media/LinuxWorks/p760/multimedia/myworks/media_install/usr/lib
make install
5.相关工具使用
可以在/etc/profile里面设置环境变量:export LD_LIBRARY_PATH=/mnt/appfs/media_install/usr/lib
也可以设置export PATH=/mnt/appfs/media_install/usr/bin:$PATH
使播放器可以在任意目录下播放。
cp -a madplay /usr/share/
//export LD_LIBRARY_PATH=../lib
在/mnt/appfs/media_install/usr/bin
./madplay tears.mp3
三、MPlayer在s3c2410上移植(软解码)
tar jxvf MPlayer-1.0rc2.tar.bz2
cd MPlayer-1.0rc2
./configure --cc=/opt/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-gcc --host-cc=gcc --target=armv4l-linux --
prefix=/home/linux/driver/mplay/media_install/usr --disable-w32threads --disable-dvdread --disable-mencoder --disable-live --disable-mp3lib --disable-tv --
disable-tv-v4l1 --disable-tv-v4l2 --disable-tv-bsdbt848 --disable-radio-v4l2 --disable-dvdnav --disable-cdparanoia --disable-bitmap-font --disable-ftp --
disable-vstream --disable-ass --disable-network --enable-xv --enable-mad --enable-alsa --with-extraincdir=/home/linux/driver/mplay/media_install/usr/include
--with-extralibdir=/home/linux/driver/mplay/media_install/usr/lib
可以用make distclean清楚make的文件痕迹
make
在目录中就会生成mplayer可执行文件
mplayer软件对mpeg4解码还比较流畅;但H264的格式解码性能不够,音视频会不同步。
mplayer tears.mp3 //可以播放mp3文件
mplayer HarryPotter.avi //MPEG4格式480 x 272格式
若没有声音,
方法<->(一般不采用此方法)
是因为内核配置有问题,就make menuconfig,
在 Device Drivers ---> <*> Sound card support ---> <*> Advanced Linux Sound Architecture --->
选中<*> OSS PCM (digital audio) API 就可以了。
方法<二>
将config.c config.MAK文件复制到/driver/mplay/MPlayer-1.0rc2 ,
再执行配置文件:
./configure --cc=/opt/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-gcc --host-cc=gcc --target=armv4l-linux --
prefix=/home/linux/driver/mplay/media_install/usr --disable-w32threads --disable-dvdread --disable-mencoder --disable-live --disable-mp3lib --disable-tv --
disable-tv-v4l1 --disable-tv-v4l2 --disable-tv-bsdbt848 --disable-radio-v4l2 --disable-dvdnav --disable-cdparanoia --disable-bitmap-font --disable-ftp --
disable-vstream --disable-ass --disable-network --enable-xv --enable-mad --enable-alsa --with-extraincdir=/home/linux/driver/mplay/media_install/usr/include
--with-extralibdir=/home/linux/driver/mplay/media_install/usr/lib
再make。
四、输入系统:input keyboard移植
1) arch/arm/mach-s3c2410/mach-smdk2410.c
在smdk2410_devices中增加:
&s3c_device_gpio_kbd,
2) arch/arm/plat-s3c24xx/devs.c中增加键盘的平台设备
struct platform_device s3c_device_gpio_kbd = {
.name = "s3c-gpio-kbd",
.id = -1,
};
EXPORT_SYMBOL(s3c_device_gpio_kbd);
3) arch/arm/plat-s3c/include/plat/devs.h中新增
extern struct platform_device s3c_device_gpio_kbd;
4) 在driver/input/keyboard中增加fs2410键盘驱动
Kconfig增加:
config KEYBOARD_INPUT_FS2410
tristate "fs2410 gpio keypad support"
depends on ARCH_S3C2410
help
input driver for fs2410 GPIO keypad
To compile this driver as a module, choose M here: the
module will be called fs2410_input_kbd.
Makefile增加:
obj-$(CONFIG_KEYBOARD_INPUT_FS2410) += fs2410_input_kbd.o
5)将fs2410_input_kbd.c拷到driver/input/keyboard中
五. 触摸屏驱动移植
1. 复制s3c2410_ts.c到drivers/input/touchscreen
2. 修改 Kconfig,增加如下配置
config TOUCHSCREEN_S3C2410
tristate "Samsung S3C2410 touchscreen input driver"
depends on ARCH_S3C2410 && INPUT && INPUT_TOUCHSCREEN
help
Say Y here if you have the s3c2410 touchscreen.
If unsure, say N.
To compile this driver as a module, choose M here: the
module will be called s3c2410_ts.
3. 修改Makefile,增加如下
obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o
六、 s3c2410 UDC移植:
arch/arm/mach-s3c2410/mach-smdk2410.c
增加头文件:
#include <mach/regs-clock.h>
#include <linux/delay.h>
#include <plat/udc.h>
增加如下函数:
//s3c2410 UDC control
static u8 *s3c2410_pullup_info[] = {
" ",
"Pull-up enable",
"Pull-up disable",
"UDC reset, in case of"
};
static void smdk2410_udc_pullup(enum s3c2410_udc_cmd_e cmd)
{
printk("smdk2410_udc: %s/n",s3c2410_pullup_info[cmd]);
s3c2410_gpio_cfgpin(S3C2410_GPG9, S3C2410_GPG9_OUTP);
switch (cmd)
{
case S3C2410_UDC_P_ENABLE :
s3c2410_gpio_setpin(S3C2410_GPG9, 1); //set gpg9 output HIGH
break;
case S3C2410_UDC_P_DISABLE :
s3c2410_gpio_setpin(S3C2410_GPG9, 0); //set gpg9 output LOW
break;
case S3C2410_UDC_P_RESET :
//FIXME!!!
break;
default:
break;
}
}
static struct s3c2410_udc_mach_info smdk2410_udc_cfg __initdata = {
.udc_command = smdk2410_udc_pullup,
};
在smdk2410_devices中增加:
&s3c_device_usbgadget, //fengyong
修改smdk2410_init如下:
static void __init smdk2410_init(void)
{
u32 val = 0;
s3c24xx_fb_set_platdata(&fs2410_fb_info);
s3c_i2c0_set_platdata(NULL);
platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));
smdk_machine_init();
s3c24xx_udc_set_platdata(&smdk2410_udc_cfg); //Addde by fengyong
//fengyong
s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST |
S3C2410_MISCCR_USBSUSPND0 |
S3C2410_MISCCR_USBSUSPND1, 0x0);
val = (0x78 << 12) | (0x02 << 4) | (0x03);
#if 1
while (val != readl(S3C2410_UPLLCON)) {
writel(val, S3C2410_UPLLCON);
udelay(20);
}
#else
writel(val, S3C2410_UPLLCON);
#endif
}
修改drivers/usb/gadget/file_storage.c
static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,
struct usb_request *req, int *pbusy,
enum fsg_buffer_state *state)
{
int rc;
udelay(1000); //Added by fengyong for s3c2410 UDC
……
}
make menuconfig后
在驱动里面[*] USB support ---> <*> USB Gadget Support ---> 选中
<M> USB Gadget Drivers
<M> Ethernet Gadget (with CDC Ethernet support) [*] RNDIS support (NEW)
<M> File-backed Storage Gadget
<M> Serial Gadget (with CDC ACM and CDC OBEX support)