精华] s3c2410全线移植linux2.6.14.1 u盘 cs8900a busybox 详细过程。

来源:互联网 发布:java实现分页功能 编辑:程序博客网 时间:2024/05/01 12:28

注意:这篇文章是我在移植kernel2.6.14.1过程中写的,文章里面的大部分内容为引用各位大牛的Blog,名字具体请看<感谢:>,往后我还在继续移植 rt73 + busybox,因为还没有成功,希望有同样兴趣的朋友联系我!
QQ:19995864 验证写:arm-linux

请tplink的321g用rt73驱动移植成功的朋友,说说怎样移植的吧。谢谢!

工作环境:redhat9.0 登陆用户:root 时间:2007-5-7 19:00
软件包:
1. arm-linux-gcc-3.4.1.tar.bz2
2. cross-2.95.3.tar.bz2
3. vivi-20030629.tar.bz2
4. busybox 1.1.3


感谢:
Superlp
Hujun
Lfc
luofuchong


PS:网上的linux_mig_release.pdf文档是超级大牛们合作写的,对本文指导很大,请大家搞linux的朋友感谢他们的辛苦劳动!

大牛们的联系方式:如下

作者介绍
3.1 策划, 组织, 指导, 发布者
刘勇
email: littlegenius2008@163.com
如果您有新的内容,请发到这个电子邮件,我们会把您的内容加入文档,并在作者列表中加入您的名字.
3.2 ADS bootloader部分
作者:刘勇
email: littlegenius2008@163.com
作者:孙贺
email: msunhe@gmail.com
3.4 uboot部分
作者:聂强
email: wolfwind9779@yahoo.com.cn
作者:孙贺
email: msunhe@yahoo.com.cn
3.5 内核部分
作者:聂大鹏
email:dozec@mail.csdn.net
作者:牛须乐(8900a网卡移植部分)
email:clizniu@hotmail.com
3.6 应用程序部分
作者:聂大鹏
email:dozec@mail.csdn.net
3.7 Nand Flash 驱动部分
作者:孙磊,刘勇
email:sunlei3448@yahoo.com.cn
4 支持企业
4.1 尚观科技
为我们提供统许多套远峰公司的ARM开发板, 才能让我们做出统一的文档.

建立交叉编译环境
软件:
arm-linux-gcc-3.4.1.tar.bz2
cross-2.95.3.tar.bz2

步骤:
1. tar jxvf arm-linux-gcc-3.4.1.tar.bz2
2. tar jxvf cross-2.95.3.tar.bz2
3. copy 2.95.3 -> /usr/local/arm/
4. copy 3.4.1 -> /usr/local/arm/


编译Bootload vivi
步骤:
1. tar jxvf vivi-20030629.tar.bz2
2. cd vivi
3. edit makefile
LINUX_INCLUDE_DIR = /usr/local/arm/2.95.3/include
CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-
ARM_GCC_LIBS = /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3

4 edit vivi/arch/s3c2410/smdk.c:
mtd_partition_t default_mtd_partitions[] = {
{
name: "vivi",
offset: 0,
size: 0x00020000,
flag: 0
}, {
name: "param",
offset: 0x00020000,
size: 0x00010000,
flag: 0
}, {
name: "kernel",
offset: 0x00030000,
size: 0x00200000, //modify ->2M
flag: 0
}, {
name: "root",
offset: 0x00230000,
size: 0x01E00000, //modify ->30M
flag: MF_BONFS
}
};
char linux_cmd[] = "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0"; //modify

5. load config ->arch/def-configs/smdk2410
6. exit ->ok
7. make
finish create vivi


编译kernel 2.6.14.1
步骤:
1. tar jxvf linux-2.6.14.1.tar.bz2
2. edit source files


A) edit arch/arm/mach-s3c2410/devs.c

1.
/***********add here*************/
#include <linux/mtd/partitions.h>
#include <asm/arch/nand.h>
#include <linux/mtd/nand.h>
/***********end add*************/

2.
/*****************************rei1984 add here***************************/
static struct mtd_partition partition_info[] ={
{
name: "vivi", //注意这里的size和offset的位置和vivi的mtd结构的位置
size: 0x00020000,
offset: 0,
}, {
name: "param",
size: 0x00010000,
offset: 0x00020000,
}, {
name: "kernel",
size: 0x00200000,
offset: 0x00030000,
}, {
name: "root",
size: 0x01E00000,
offset: 0x00230000,
/*mask_flags: MTD_WRITEABLE,*/ //查看了许多Blog都没有这句话
}
};

struct s3c2410_nand_set nandset ={
nr_partitions: 4 ,
partitions: partition_info ,
};

struct s3c2410_platform_nand superlpplatform={
tacls:0, //感谢superlp的Blog,没有人不知道superlp的吧!
twrph0:30,
twrph1:0,
sets: &nandset,
nr_sets: 1,
};
/********************************rei1984 end add****************************/

3.
struct platform_device s3c_device_nand = {
.name = "s3c2410-nand",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_nand_resource),
.resource = s3c_nand_resource,
.dev = {
.platform_data = &superlpplatform //***********rei1984 add here***********
}
};


B) edit arch/arm/mach-s3c2410/mach-smdk2410.c

static struct platform_device *smdk2410_devices[] __initdata={
&s3c_device_usb,
...

/*add*/
&s3c_device_nand, // rei1984 add

};


C) edit drivers/mtd/nand/s3c2410.c

s3c2410_nand_init_chip()
/**** chip->eccmode = NAND_ECC_SOFT; **/
chip->eccmode = NAND_ECC_NONE; //disable ECC,不知道现在的内核2.6.20 ECC能用吗?


D) edit /include/linux/mtd/partitions.h
partitions.h文件的最前面加上#include <linux/list.h> //为什么kernel出现这么低级的错误?网上也讨论的很少,知道的朋友说明一下。


E) edit fs/kconfig //支持devfs,目前2.6.17以后的kernel放弃devfs,需要udev的支持。

menu "Pseudo filesystems"
/*add*/
config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
default y

config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depends on DEVFS_FS
/*end*/

// edit 终于结束了,以下是配置编译kernel

3. edit makefile
ARCH ?= arm //其实修改SUBARCH 也可以,具体查看makefile
CROSS_COMPILE ?=/usr/local/arm/3.4.1/bin/arm-linux- //注意后面的’-’

4. make zImage

Finish !kernel in /root/arm/linux-2.6.14.1/arch/arm/boot


编译文件系统(compile the busybox as file system)

1.make menuconfig

2.make TARGET_ARCH=arm CROSS=/usr/local/arm/3.4.1/bin/arm-linux- all install

3.copy _install to /root/fs

4.cd /root/fs
5. mknod -m 660 dev/console c 5 1
mknod -m 660 dev/null c 1 3

6.一定要选上ash


修改内核,支持CS8900A (support cs8900a)

1) 从网上下载了cs8900.c和cs8900.h两个针对2.6.7的内核的驱动程序源代码,将其放在drivers/net/arm/目录下面。
#cp cs8900.c ./drivers/net/arm/
#cp cs8900.h ./drivers/net/arm/

并在cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下两条语句:
__raw_writel(0x2211d110,S3C2410_BWSCON);
__raw_writel(0x1f7c,S3C2410_BANKCON3);

在cs8900.c中添加:
#include <asm-arm/arch-s3c2410/regs-mem.h> //千万不要忘记

2) 修改drivers/net/arm/目录下的Kconfig文件,在最后添加如下内容:
config ARM_CS8900
tristate "CS8900 support"
depends on NET_ETHERNET && ARM && ARCH_SMDK2410
help
Support for CS8900A chipset based Ethernet cards. If you have a
network (Ethernet) card of this type, say Y and read the
Ethernet-HOWTO, available from
<http://www.tldp.org/docs.html#howto> as well as
<file:Documentation/networking/cs89x0.txt>.
To compile this driver as a module, choose M here and read
<file:Documentation/networking/net-modules.txt>. The module will be
called cs8900.o.

注:内核系统配置文件由2.4版本的config.in变成了2.6版本Kconfig文件,在这个文件里面添加如上内容,则在运行make menuconfig或者make xconfig命令的时候就会出现:
[ ] CS8900 support
这一选项。

3) 修改drivers/net/arm/目录下的Makefile文件,在最后添加如下内容:
obj-$(CONFIG_ARM_CS8900) += cs8900.o

4) 在/arch/arm/mach-s3c2410/mach-smdk2410.c文件中,
找到smdk2410_iodesc[]结构数组,
添加如下如下内容:{vSMDK2410_ETH_IO, 0x19000000, SZ_1M, MT_DEVICE}
修改之后变成了:

#include <asm-arm/arch-s3c2410/smdk2410.h>

static struct map_desc smdk2410_iodesc[] __initdata = {
/* nothing here yet */
/* Map the ethernet controller CS8900A */
{vSMDK2410_ETH_IO, 0x19000000, SZ_1M, MT_DEVICE},
};

5) 在include/asm-arm/arch-s3c2410/目录下创建smdk2410.h文件,其内容为:

#ifndef _INCLUDE_SMDK2410_H_
#define _INCLUDE_SMDK2410_H_

#include <linux/config.h>

#define pSMDK2410_ETH_IO 0x19000000
#define vSMDK2410_ETH_IO 0xE0000000
#define SMDK2410_ETH_IRQ IRQ_EINT9

#endif // _INCLUDE_SMDK2410_H_

注:因为在网卡驱动程序当中,用到了一些常量,所以特意在此添加这个头文件。这个头文件定义了网卡的物理地址、虚拟地址以及网卡占用的中断线。

6)配置内核
#make menuconfig

Networking support --->
Ethernet (10 or 100Mbit) --->

  • CS8900 support

    将刚才添加的网卡驱动程序静态添加到内核当中。
    最后进行内核编译。


    支持U盘(support USB)
    最终效果:mount /dev/ub/a/part1 /mnt

    1) edit linux-2.6.14/arch/arm/mach-s3c2410/mach-smdk2410.c

    //hujun for usb start
    #include <asm/arch/usb-control.h>
    #include <asm/arch/regs-clock.h>
    #include <linux/device.h>
    #include <linux/delay.h>
    //hujun for usb end

    //心得以上加载源文件的include后面

    2) //以下加在static void __init smdk2410_map_io(void)前面

    /**********************add by lfc*************************************/
    static struct s3c2410_hcd_info usb_sbc2410_info = {
    .port[0] = {
    .flags = S3C_HCDFLG_USED
    }
    };

    int usb_sbc2410_init(void)
    {
    unsigned long upllvalue = (0x78<<12)|(0x02<<4)|(0x03);
    printk("USB Control, (c) 2006 sbc2410/n");
    s3c_device_usb.dev.platform_data = &usb_sbc2410_info;
    while(upllvalue!=__raw_readl(S3C2410_UPLLCON))
    {
    __raw_writel(upllvalue,S3C2410_UPLLCON);
    mdelay(1);
    }
    return 0;
    }
    /***************************end add**********************/


    在MACHINE_START与MACHINE_END 之间加上.init_machine= &usb_sbc2410_init,结果变成了

    MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch
    * to SMDK2410 */
    /* Maintainer: Jonas Dietsche */
    .phys_ram = S3C2410_SDRAM_PA,
    .phys_io = S3C2410_PA_UART,
    .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
    .boot_params = S3C2410_SDRAM_PA + 0x100,
    .map_io = smdk2410_map_io,
    .init_irq = smdk2410_init_irq,
    .timer = &s3c24xx_timer,

    //hujun add
    .init_machine= &usb_sbc2410_init,

    MACHINE_END

    3) 下面的 是luofuchong 大侠做的, 不知道什么原因,usb_sbc2410_init();加在了smdk2410_map_io这个函数里面

    static void __init smdk2410_map_io(void)
    {
    s3c24xx_init_io(smdk2410_iodesc, ARRAY_SIZE(smdk2410_iodesc));
    s3c24xx_init_clocks(0);
    s3c24xx_init_uarts(smdk2410_uartcfgs, ARRAY_SIZE(smdk2410_uartcfgs));
    s3c24xx_set_board(&smdk2410_board);

    /*************************add by lfc****************************/
    usb_sbc2410_init();
    /*************************end add*******************************/

    }


    二、内核配置
    下面说一下郁闷了我好一阵子的内核配置(支持USB)问题,这个就比Nand flash的配置要复杂多了。

    1、让内核支持热插拔
    │ General setup --->
    │ │
  • Support for hot-pluggable devices

    2、USB驱动设置,可能有些不选也行,不过没时间去试,至于为什么要选这些选项的话可以看一下这个贴(Linux下的硬件驱动——USB设备):
    http://www-128.ibm.com/developerworks/cn/linux/l-usb/index1.html

    │ │ Device Drivers --->
    │ │ Generic Driver Options --->
    │<*> Hotplug firmware loading support
    │ │ Block devices --->
    │ │ <*> Low Performance USB Block driver
    │ │ SCSI device support --->
    │ │ <*> SCSI generic support
    │ │
  • Probe all LUNs on each SCSI device
    │ │ USB support --->
    │ │<*> Support for Host-side USB
    │ │
  • USB device filesystem
    │ │<*> OHCI HCD support
    │ │<*> USB Mass Storage support
    │ │
  • USB Monitor

    3、加入了MSDOS fs和VFAT fs的支持。

    │ │ File systems --->
    │ │ DOS/FAT/NT Filesystems --->
    │ ┌───────────────────────────-───────┐ │
    │ │ <*> MSDOS fs support │ │
    │ │ <*> VFAT (Windows-95) fs support │ │
    │ │ (936) Default codepage for FAT │ │
    │ │ (cp936) Default iocharset for FAT │ │
    │ │ < > NTFS file system support

    做完这些后,插入u盘后,内核应该可以识别到u盘,出现:
    usb 1-1: new full speed USB device using s3c2410-ohci and address 3
    ub(1.3): GetMaxLUN returned 0, using 1 LUNs

    但是,还有下面一句出错提示:
    /dev/ub/a: unknown partition table

    4.
    再次查看了贴子上大虾们的讨论,提到:“使能CONFIG_MSDOS_PARTITION选项”,再仔细查找,发现配置选项如下:
    │ │ File systems --->
    │ │ Partition Types --->
    │ │
  • PC BIOS (MSDOS partition tables) support

    加上这个后应该就可以挂载usb上的MSDOS分区了

    以下是我的内核插入u盘后的提示信息:
    usb 1-1: new full speed USB device using s3c2410-ohci and 2
    ub(1.2): GetMaxLUN returned 0, using 1 LUNs
    /dev/ub/a: p1
    表示usb设备已经挂载到/dev/ub/a/part1设备文件下

    4.加入中文字体库(可惜在我的板上还是没能正常显示中文~_~,知道的朋友麻烦告诉我一声,大家一起探讨)
    │ │ Native Language Support --->
    │ │<*> Simplified Chinese charset (CP936, GB2312)
    │ │<*> NLS UTF8

    以下是挂载usb设备后的显示:
    [root@luofuchong /]# mount -t vfat -o iocharset=cp936 /dev/ub/a/part1 /mnt
    [root@luofuchong /]# ls /mnt
    cramfs-1.1.tar.gz netkit-base-0.17.tar.gz thttpd-2.25b.tar.gz
    lfc settings.dat


    //PS:以下是kernel2.4下面的挂载命令,想到就顺便说一下:
    kernel 2.4: mount -t vfat /dev/scsi/host0/bus0/target0/lun0/part1 /tmp
  •  

     原文地址 http://www.linuxforum.net/forum/showflat.php?Cat=&Board=embedded&Number=648878&page=0&view=collapsed 发表于: 2008-01-17,修改于: 2008-01-17 09:33,已浏览1006次,有评论0条 推荐 投诉