Chinaunix首页 | 论坛 | 博客
  • 博客访问: 406686
  • 博文数量: 59
  • 博客积分: 5195
  • 博客等级: 大校
  • 技术积分: 645
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-01 14:38
文章分类

全部博文(59)

文章存档

2017年(1)

2011年(10)

2010年(1)

2009年(9)

2008年(1)

2007年(35)

2006年(2)

我的朋友

分类: LINUX

2007-03-16 10:47:03

u-boot1.1.6移植:
1、cp -R at91rm9200dk myboard
1)cp at91rm9200dk.c myboard.c
2)vi Makefle
将COBJS   := at91rm9200dk.o at45.o flash.o 改为 COBJS   := myboard.o at45.o flash.o
3)添加Nor Flash驱动,芯片型号是MBM29LV320BE(FUJITSU)
vi flash.c
1>加入
OrgDef OrgMBM29LV320BE[] =
{
    {   8,  8*1024 },   /*   8 *  8 kBytes sectors */
    { 63, 64*1024 },    /* 63 * 64 kBytes sectors */
};
2>加入
#define RESET           0xF0
3>
在函数void flash_identification (flash_info_t * info)中加入:
/* Read Reset  */
    MEM_FLASH_ADDR1 = FLASH_CODE1;
    MEM_FLASH_ADDR2 = FLASH_CODE2;
    MEM_FLASH_ADDR1 = RESET;

/* Go to Autoselect mode */
    MEM_FLASH_ADDR1 = FLASH_CODE1;
    MEM_FLASH_ADDR2 = FLASH_CODE2;
    MEM_FLASH_ADDR1 = ID_IN_CODE;

/* Vendor type */
    info->flash_id = FUJ_MANUFACT & FLASH_VENDMASK;
    printf("FUJ and AMD\n");

/* AMD Flash */
    info->flash_id |= AMD_ID_LV320B & FLASH_TYPEMASK;
    printf("MBM29LV320B (32Mbit)\n");
4>
在函数ulong flash_init (void)中加入:
/* MBM29LV320BE Flash */
        pOrgDef = OrgMBM29LV320BE;
        flash_nb_blocks = sizeof (OrgMBM29LV320BE) / sizeof (OrgDef);
5>
在函数void flash_print_info (flash_info_t * info)中加入:
case (FUJ_MANUFACT & FLASH_VENDMASK):
        printf("FUJ");
        break;

case (AMD_ID_LV320B & FLASH_TYPEMASK):
        printf("MBM29LV320BE (32Mbit\n)");
        break;
6>
在函数int flash_erase (flash_info_t * info, int s_first, int s_last)中加入:
if ((info->flash_id & FLASH_VENDMASK) != (FUJ_MANUFACT & FLASH_VENDMASK))
{
        return ERR_UNKNOWN_FLASH_VENDOR;
}
2、回到u-boot目录下,打开Makefile文件,加入:
myboard_config  :   unconfig
    @$(MKCONFIG) $(@:_config=) arm arm920t myboard NULL at91rm9200
3、在u-boot目录下,打开MAKEALL文件,在
LIST_ARM9=" \
    at91rm9200dk    cmc_pu2                     \
    ap920t      ap922_XA10  ap926ejs    ap946es     \
    ap966       cp920t      cp922_XA10  cp926ejs    \
    cp946es     cp966       lpd7a400    mp2usb      \
    mx1ads      mx1fs2      netstar     omap1510inn \
    omap1610h2  omap1610inn omap730p2   sbc2410x    \
    scb9328     smdk2400    smdk2410    trab        \
    VCMA9       versatile   versatileab versatilepb \
    voiceblue                            \
"
加入 myboard,即:
LIST_ARM9=" \
    at91rm9200dk    cmc_pu2                     \
    ap920t      ap922_XA10  ap926ejs    ap946es     \
    ap966       cp920t      cp922_XA10  cp926ejs    \
    cp946es     cp966       lpd7a400    mp2usb      \
    mx1ads      mx1fs2      netstar     omap1510inn \
    omap1610h2  omap1610inn omap730p2   sbc2410x    \
    scb9328     smdk2400    smdk2410    trab        \
    VCMA9       versatile   versatileab versatilepb \
    voiceblue   myboard                         \
"
4、cd include/configs,cp at91rm9200dk.h myboard.h,打开myboard.h文件
1)加入#define CONFIG_SKIP_LOWLEVEL_INIT (由于板子会自动进行初始化,所以此处要跳过去,否则会成为死循环)
2)由于我的板子上的Nor Flash是4M,所以把
#define PHYS_FLASH_SIZE  0x200000
改为
#define PHYS_FLASH_SIZE  0x400000
3)由于我的板子上的Nor Flash共71个扇区,所以把
#define CFG_MAX_FLASH_SECT      256
改为
#define CFG_MAX_FLASH_SECT      71
5、
export BUILD_DIR=/home/lb/abc
make distclean
make myboard_config
make all
在/home/lb/abc中会生成三个文件u-boot.bin、u-boot和u-boot.srec,我们只需要u-boot.bin文件。


kernel2.6.*移植:
1、
cd linux-2.6.*
zcat ../2.6.*-at91.patch.gz |patch -p1
2、
vi Makefile

ARCH     ?= $(SUBARCH)
CROSS_COMPILE ?=
改为
ARCH            ?= arm
CROSS_COMPILE   ?= 相应交叉编译环境
3、
make mrproper
make at91rm9200dk_defconfig
make menuconfig
make
4、
cp linux2.6.*/vmlinux /home/lb/kernel
cp linux2.6.*/arch/arm/boot/zImage /home/lb/kernel
5、
cd /home/lb/kernel
1)[编译器绝对路径]/bin/arm-linux-objcopy -O binary -S vmlinux linux.bin
2)gzip -v9 linux.bin
3)/home/lb/abc/tools/mkimage -A arm -O linux -C gzip -a 0x20008000 -e 0x20008000 -d linux.bin.gz uImage
得到了内核映射文件uImage

构建文件系统:
要先安装mtd(memory technology device),debian中安装mtd-tools,gentoo中安装mtd-utils。
1、建立内存映像文件ramdisk
1)mkdir -p /mnt/loop
2)dd if=/dev/zero of=/tmp/loop_tmp bs=1k count=3072
3)/sbin/losetup /dev/loop0 /tmp/loop_tmp
将设备与临时文件联系起来。如果出现“ioctl: LOOP_SET_FD: 设备或资源忙”的提示,说明设备还和一文件联系,可以用/sbin/losetup /dev/loop0来看,并可用-d来删除。
4)mkfs.ext2 –m0 /dev/loop0
mkfs.ext2将会自动判断设备容量的大小并相应地配置自身,-m0参数防止它给root保留空,这样会腾出更多地有用空间。
5)mount -t ext2 /dev/loop0 /mnt/loop
6)mkdir {bin,sbin,usr,dev,etc,lib,home,opt,root,src,tmp,var,mnt,proc,sys,initrd}
7)umount /mnt/loop
卸载此文件系统,得到的/tmp/loop_tmp就是ramdisk,可以将其改名为ramdisk
8)gzip - v9 /tmp/ramdisk
在/tmp中生成一个ramdisk.gz,这样一个内存映像文件就生成了。
2、编译busybox
1)
make defconfig
make menuconfig
2)busybox设置
1>在Build Options中的Build BusyBox as a static binary (no shared libs)是问是否将busybox静态链接,如果是glibc的话不选,如果是uclibc的话要选。
2>在Installation Options选项中,默认地, 运行 make install之后, BusyBox将被安装到./_install目录.
3>NFS是肯定要选的, 使用NFS将宿主机的文件系统mount到目标板上, 这是嵌入式Linux程序开发的一个重要方面.
4>由于可使用NFS, 能在宿主机上实现的功能就都不需要在目标板上实现了。
5>Debian Utilities 全不选, Editors全不选, System Logging Utilities全不选.
6>解压缩工具只安装解压工具,gzip、bzip2、tar工具(要求目标板能解压缩tar.bz2和tar.gz文件).
7>shell使用ash.
3)编译及安装
make TARGET_ARCH=arm CROSS=arm-linux- -j2
make install
3、用busybox给ramdisk增加命令
1)
gunzip ramdisk.gz
mount -o loop ramdisk /mnt/ramdisk
2)
cd busybox1.4.1/_install
cp -rfv * /mnt/ramdisk
umount /mnt/ramdisk
gzip -v9 ramdisk
生成最后带有busybox命令的内存映像文件ramdisk.gz

阅读(2549) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~