注意:这篇文章是我在移植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
| |