分类: 嵌入式
2009-12-19 22:52:11
注意:这篇文章是我在移植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:
如果您有新的内容,请发到这个电子邮件,我们会把您的内容加入文档,并在作者列表中加入您的名字.
3.2 ADS bootloader部分
作者:刘勇
email:
作者:孙贺
email:
3.4 uboot部分
作者:聂强
email:
作者:孙贺
email:
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
#include
#include
/***********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
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
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
< as well as
To compile this driver as a module, choose M here and read
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
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
#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) --->
将刚才添加的网卡驱动程序静态添加到内核当中。
最后进行内核编译。
支持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
#include
#include
#include
//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 --->
│ │
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
│ │
│ │ USB support --->
│ │<*> Support for Host-side USB
│ │
│ │<*> OHCI HCD support
│ │<*> USB Mass Storage support
│ │
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 --->
│ │
加上这个后应该就可以挂载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
由于文档是我一个人写的,其中有什么纰漏请大家指出来,谢谢!busybox那部分我等到移植完美了在补充上来。
QQ:19995864