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

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

QQ19995864 验证写:arm-linux

 

tplink321grt73驱动移植成功的朋友,说说怎样移植的吧。谢谢!

 

工作环境: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 内核部分

作者:聂大鹏

emaildozec@mail.youkuaiyun.com

作者:牛须乐(8900a网卡移植部分)

emailclizniu@hotmail.com

3.6 应用程序部分

作者:聂大鹏

emaildozec@mail.youkuaiyun.com

3.7 Nand Flash 驱动部分

作者:孙磊,刘勇

emailsunlei3448@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", //注意这里的sizeoffset的位置和vivimtd结构的位置

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, //感谢superlpBlog,没有人不知道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.ccs8900.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_STARTMACHINE_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 fsVFAT 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值