u-boot-2009.08在2440上的移植
常用命令:
二、移植步骤 本次移植的功能特点包括:
1、首先安装编译器:arm-linux-gcc-4.3.2.tgz
然后转到
移植u-boot 到NOR flash
? ? ? ? (1) 由于原作者使用的flash是64M,而我所使用的是256M,因此要修改nand_read_ll?函数(修改寻址部分): 要修改代码如下: #include <config.h> #define NF_BASE 0x4E000000? #define?? ?__REGb(x) ? ?(*(volatile unsigned char *)(x)) #define?? ?__REGi(x)?? ?(*(volatile unsigned int *)(x))? #define?? ?NFCONF?? ?__REGi(NF_BASE + 0x0) #define?? ?NFCONT?? ?__REGi(NF_BASE + 0x4) #define?? ?NFCMD?? ?__REGb(NF_BASE + 0x8) #define?? ?NFADDR?? ?__REGb(NF_BASE + 0xC) #define?? ?NFDATA?? ?__REGb(NF_BASE + 0x10) #define?? ?NFSTAT?? ?__REGb(NF_BASE + 0x20)? #define?? ?NAND_CHIP_ENABLE?? ?(NFCONT &= ~(1<<1)) #define?? ?NAND_CHIP_DISABLE?? ?(NFCONT |= (1<<1)) #define?? ?NAND_CLEAR_RB?? ?(NFSTAT |= (1<<2)) #define?? ?NAND_DETECT_RB?? ?{ while(! (NFSTAT&(1<<2)) );}?? #define?? ?NAND_SECTOR_SIZE?? ?2048// 注意这个地方原来是512,需要改成2048即2K的页 #define?? ?NAND_BLOCK_MASK?? ?(NAND_SECTOR_SIZE - 1) ? static void?? ?s3c2440_write_addr_lp(unsigned int addr) { ? ? ? ? int i,col,page; ? ? ? ??col = addr & NAND_BLOCK_MASK; ? ? ? ??page = addr / NAND_SECTOR_SIZE; ? ? ? ??NFADDR = col & 0xff; ? ? ? ??for (i = 0; i < 10; i ++); ? ? ? ??NFADDR = (col >> 8) & 0x0f; ? ? ? ??NFADDR = page & 0xff; ? ? ? ??NFADDR = (page >> 8) & 0xff; ? ? ? ??NFADDR = (page >> 16) & 0xff; }? int nand_read_ll(unsigned char *buf,unsigned long start_addr,int size) { ? ? ? ??int i,j; ? ? ? ??if((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) ? ? ? ??{ ? ? ? ??? ? ? ??return -1; ? ? ? ??} ? ? ? ??NAND_CHIP_ENABLE; ? ? ? ??for(i = start_addr; i < (start_addr + size);) ? ? ? ??{ ? ? ? ??? ? ? ??NAND_CLEAR_RB; ? ? ? ??? ? ? ??NFCMD = 0x00;? ? ? ? ??? ? ???s3c2440_write_addr_lp(i);? ? ? ? ??? ? ? ??NFCMD = 0x30; ? ?//注释掉下面的内容? ? ? ? ??? ? ? ??/*NFADDR = i & 0xFF; ? ? ? ??? ? ? ??NFADDR = (i >> 9) & 0xFF; ? ? ? ??? ? ? ??NFADDR = (i >> 17) & 0xFF; ? ? ? ??? ? ? ??NFADDR = (i >> 25) & 0xFF;*/ ? ? ? ??? ? ? ??NAND_DETECT_RB;? ? ? ? ??? ? ? ??for(j = 0; j < NAND_SECTOR_SIZE; j++,i++) ? ? ? ??? ? ? ??{ ? ? ? ??? ? ? ??? ? ? ??? ? *buf = (NFDATA & 0xFF); ? ? ? ? ? ? ? ? ? ? ? ? ? ???buf ++; ? ? ? ??? ? ? ??} ? ? ? ??}? ? ? ? ??NAND_CHIP_DISABLE; ? ? ? ??return 0; } ? ? ? ? (2)?现在进入u-boot的第二阶段(添加Nand Flash(K9F1208U0C)的有关操作支持)。中 vim?include/configs/my2440.h 因为我们的是256M 所以这样设置: /* Command line configuration. */ #ifdef CONFIG_CMDLINE_EDITING ? /* NAND flash settings */ ?然后: #vim include/configs/my2440.h //注释掉环境变量保存到Flash的宏(注意:如果你要使用上一篇中的从Nor启动的saveenv命令,则要恢复这些Flash宏定义) //#define CONFIG_ENV_IS_IN_FLASH 1 //添加环境变量保存到Nand的宏(注意:如果你要使用上一篇中的从Nor启动的saveenv命令,则不要这些Nand宏定义) #define CONFIG_ENV_IS_IN_NAND? 1 注意:
(3) Linux-2.6.30.4在Mini2440上的内核移植 1.准备工作目录和解压内核源码 2. 进入内核根目录修改Makefile使之编译成ARM平台
3. 机器码的确认: ? ???U-Boot和Linux中都有一个机器码,只有当这两个机器码一致的时候,才能够正确的引导Linux内核。u-boot- 2009.08/include/asm-arm/mach-types.h文件中的1985行附近的位置
4. ? #vim u-boot/board/samsung/my2440/my2440.c ? ? ?把gd->bd->bi_arch_number = MACH_TYPE_SMDK2410改为MACH_TYPE_MINI2440 5. Linux 2.6.32.2根目录下,? #vim Makefile 1)修改总目录下的Makefile ARCH =arm CROSS_COMPILE =arm-linux- (后面都不要有空格) 3) ?linux-2.6.32.2/arch/arm/mach-s3c2440 目录下有个mach-mini2440.c 文件,把它直接删除。将linux-2.6.32.2/arch/arm/mach-s3c2440/目录下的mach-smdk2440.c 复制一份。命名为mach-mini2440.c , 找到MACHINE_START(S3C2440,"SMDK2440"), 修改为MACHINE_START(MINI2440,"My?Mini2440") 4)?在 mach-mini2440.c( 就是我们刚刚通过复制mach-smdk2440.c 得到的)的第160 行 ??smdk2440_map_io(void)函数中,把其中的16934400改为mini2440 开发板上实际使用的12000000??? ? 5) 命令行模式下%s/smdk2440/mini2440/g?(mach-mini2440.c 下) 6)arch/arm/mach-s3c2440/mach-mini2440.c文件中添加NandFlash的分区信息
//这里是nand flash本身的一些特性,一般需要对照datasheet填写,大部分情况下按照以下参数填写即可? struct?s3c2410_platform_nand mini2440_nand_info?.tacls????????=?20.twrph0????????=?60.twrph1????????.nr_sets????(mini2440_nand_sets.sets????????=?mini2440_nand_sets.ignore_unset_ecc?; |
struct?platform_device?*mini2440_devices]?__initdata?{ |
void?__init mini2440_machine_init(void)
{
? ? ...........................
????s3c_device_nand.dev.platform_data = &mini2440_nand_info; //添加
????platform_add_devices(mini2440_devices?ARRAY_SIZE;
} 不过还要在该文件中添加几个头文件才能编译成功:
/*添加下面的四个文件*/
#include?<linux/mtd.h>
/nand/nand_ecc/partitions>
#include <plat/nand.h>?//添加 |
7) ?yaffs2启动系统? ? ?#make menuconfig
? ? ?设置boot option -> default commond line -"noinit root=/dev/mtdblock3 init=/linuxrc console=ttySAC0"
8)?给内核打上yaffs补丁
9) 在 Linux 源代码根目录下执行
#make mini2440_defconfig?;使用Linux 官方自带的mini2440 配置
#make zImage
10) ?进入到kernel/arch/arm/boot目录下,生成并将uImage.img拷贝到/tftp目录下
mkimage?-n?'linux-2.6.32.2'?-A arm?-O linux?-T kernel?-C none?-a 0x30008000?-e 0x30008000-d zImage uImage.img
11) 将uboot烧写到nand flash里(通过H-Jtag)
12) nand flash 启动后输入
? ? ?#set bootcmd 'nand read 0x31000000?0x60000?0x500000;bootm 0x31000000'
? ???set bootargs 'noinit root=/dev/mtdblock3 init=/linuxrc console=ttySAC0'
? ? ?#saveenv
tftp 0x30000000 uImage.img?
? ? ?nand erase 0x60000 0x500000?//擦除nand的0x60000开始大小为0x500000的内容
nand write 0x30000000 0x60000 0x500000?//将内存0x30000000处的内容写入到nand的0x60000处? ? ?
#tftp 0x30000000 root.bin
? ? ?#nand erase 0x560000 0xffaa0000//256M - 0x560000
? ? ?#nand write.yaffs2 0x30000000 0x560000 0x60be80//0x60be80是root.bin的大小,下载过程中可找到
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!