Linux 系统移植arm s3c2410

 一、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)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值