Norflash在SkyEye 1.3.1上的配置

使用Nandflash(http://blog.csdn.net/Matrix_Designer/archive/2010/12/13/6073767.aspx )加载QT运行还是慢!无奈,只有试试Norflash可快些了。本来配置Norflash应该很顺利的,结果还是几经波折。

1. 增加Norflash需要在skyeye.conf文件中增加下面两行:
mem_bank: map=F, type=RW, addr=0x80000000, size=0x02000000, file=./norflash.jffs2
flash: type=28F128J3A, base=0x80000000, size=0x02000000
    配置文件无需做其他改动。这里需要说明几点:
    首先,flash和mem_bank的base与addr及两个size必须一致;
    其次,addr不能指定为0x00000000,因为ArmLinux 2.6.36的section .note.gnu.build-id将加载到0x00000000位置,大小0x24字节。所以我将Norflash加载到了高位地址0x80000000。
    最后,就是Norflash的型号问题,网上推荐s3c2410使用Am29LV160T-16,经过测试,其他的没有测试过。但是Am29LV160T-16的容量只有2M,而我的目的是用它来加载QT,自然太小了,就换了Intel的28F128J3A。准确说是E28F128J3A-150,两片16M的Flash,32位地址线,128k的擦除块大小。

2. ArmLinux 2.6.36(http://blog.csdn.net/Matrix_Designer/archive/2010/12/09/6066055.aspx )需要增加Norflash的驱动,主要是设置MTD分区信息。从网上找了下面的驱动,加载到内核的方式是:
    一、gedit drivers/mtd/maps/s3c2410.c &
          增加以下内容:
/* maps driver for Intel E28F128J3A-150 on s2c2410 */

#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/io.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>
#include <linux/mtd/partitions.h>


/* We split the flash chip up into four parts.
 * 1: data partition (0x00000000 - 0x02000000) size 0x02000000
 */

#define FLASH_PHYS_ADDR            0x00000000
#define FLASH_SIZE            0x02000000

#define FLASH_PARTITION0_ADDR        0x00000000
#define FLASH_PARTITION0_SIZE        0x02000000

struct map_info s3c2410_map = {
    .name =  "s3c2410 NOR flash Intel E28F128J3A",
    .size =  FLASH_SIZE,
    .bankwidth = 2,
    .phys = FLASH_PHYS_ADDR,
};

struct mtd_partition s3c2410_parts[] = {
    {
        .name =  "S3C2410 flash partition 0",
        .offset = FLASH_PARTITION0_ADDR,
        .size =  FLASH_PARTITION0_SIZE,
        .mask_flags = MTD_WRITEABLE
    }
};

#define PARTITION_COUNT (sizeof(s3c2410_parts)/sizeof(struct mtd_partition))

static struct mtd_info *mymtd;

int __init init_s3c2410(void)
{
    printk(KERN_NOTICE "s3c2410 flash device: %x at %x/n", FLASH_SIZE, FLASH_PHYS_ADDR);
    s3c2410_map.phys = FLASH_PHYS_ADDR;
    s3c2410_map.virt = ioremap(FLASH_PHYS_ADDR, FLASH_SIZE);
    if (!s3c2410_map.virt) {
        printk("Failed to ioremap/n");
        return -EIO;
    }
    simple_map_init(&s3c2410_map);
    mymtd = do_map_probe("cfi_probe", &s3c2410_map);
    if (mymtd) {
        mymtd->owner = THIS_MODULE;
        mymtd->erasesize=0x20000;
        add_mtd_partitions(mymtd, s3c2410_parts, PARTITION_COUNT);
        printk(KERN_NOTICE "s3c2410 flash device initialized/n");
        return 0;
    }
    iounmap((void *)s3c2410_map.virt);
    return -ENXIO;
}

static void __exit cleanup_s3c2410(void)
{
    if (mymtd) {
        del_mtd_partitions(mymtd);
        map_destroy(mymtd);
    }
    if (s3c2410_map.virt) {
        iounmap((void *)s3c2410_map.virt);
        s3c2410_map.virt = 0;
    }
}

module_init(init_s3c2410);
module_exit(cleanup_s3c2410);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Dansen");
MODULE_DESCRIPTION("MTD map driver for S3C2410");

    二、gedit drivers/mtd/maps/Kconfig &
          在MTD_SA1100的配置下面添加:
config MTD_S3C2410
    tristate "CFI Flash device mapped on ARM S3C2410"
    depends on MTD_CFI && ARCH_SMDK2410 && MTD_PARTITIONS
    help
      This enables access to the flash chips on most platforms based on
      the Intel E28F128J3A-150, including the Assabet and the Compaq iPAQ.
      If you have such a board, say 'Y'.

    三、gedit drivers/mtd/maps/Makefile &
          在文件最后添加:
obj-$(CONFIG_MTD_S3C2410)     += s3c2410.o

    四、选中配置项:
Device Drivers->Memory Technology Device(MTD) support
->Mapping drivers for chip access->CFI Flash device mapped on ARM S3C2410
    最后运行时发现SkyEye发出一大堆Read、Write、Not Finish Porting之类的警告。无奈,只用换用physmap。取消掉上面的配置项,选中:
Device Drivers->Memory Technology Device(MTD) support
->Mapping drivers for chip access->Flash device in physical memory map
Device Drivers->Memory Technology Device(MTD) support
->Mapping drivers for chip access->Flash device in physical memory map->Physmap compat support
(0x80000000) Physical start address of flash mapping
(0x2000000) Physical length of flash mapping
(4) Bank width in octets
    编译后启动出现:
physmap platform flash device: 02000000 at 80000000
physmap-flash.0: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000089 Chip ID 0x000018
Intel/Sharp Extended Query Table at 0x0031
Intel/Sharp Extended Query Table at 0x0031
    表示内核已经成功识别Norflash,可以通过mtdblock访问了。这里需要注意的是,原先Nandflash的分区保存在mtdblock0和mtdblock1,现在由于多了个Norflash,所以mtdblock0变成了Norflash,mtdblock1和mtdblock2为Nandflash的两个分区。

3. 制作文件系统
    还是想用jffs2,毕竟它是Norflash首推的(yaffs2是Nandflash首推的)。将QT库文件拷贝到rootfiles目录下,执行:
mkfs.jffs2 -r rootfiles/ -o norflash.jffs2 -e 0x20000 --pad=0x2000000 -n
    生成镜像文件norflash.jffs2(0x20000为28F128J3A的擦除块大小128K,0x2000000为28F128J3A的容量32M)。然后启动SkyEye,进入ash后执行:
mount -t jffs2 /dev/mtdblock0 /norflash
    出现了一大堆类似:
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000c000c: 0xffffbf0c instead
    的错误。原先还以为是mkfs.jffs2的参数错了,结果发现每个块的幻数都不对!这估计就不是参数错就能产生的。无奈,只能换cramfs。执行下面命令:
mkfs.cramfs rootfiles/ norflash.jffs2
    然后启动SkyEye,进入ash后执行:
mount -t cramfs /dev/mtdblock0 /norflash
    成功加载!

至此,Norflash配置好了。现在的配置文件内容如下:
# skyeye config file for S3C2410X
arch: arm
cpu:  arm920t
mach: s3c2410x

# physical memory
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00000024
mem_bank: map=F, type=RW, addr=0x80000000, size=0x02000000, file=./norflash.cramfs
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00800000
mem_bank: map=M, type=RW, addr=0xc0800000, size=0x01000000, file=./initrd.img
mem_bank: map=M, type=RW, addr=0xc1800000, size=0x02800000

# all peripherals I/O mapping area
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000
mem_bank: map=I, type=RW, addr=0x19000300, size=0x00000020
mem_bank: map=I, type=RW, addr=0x19100300, size=0x00000020

net: type=cs8900a, base=0x19000300, size=0x20,int=9, mac=0:4:3:2:1:f, ethmod=tuntap, hostip=10.0.0.1, state=on

lcd: type=s3c2410x, mod=gtk
touchscreen: type=s3c2410x, mod=gtk
nandflash: type=s3c2410x, name=K9F1208U0B, dump=./nand.dump
flash: type=28F128J3A, base=0x80000000, size=0x02000000
sound: type=s3c2410x, mod=pcm, channels=2, bits_per_sample=16, samples_per_sec=22050

uart:mod=term
dbct:state=on

比较郁闷的是,最后发现通过Norflash加载QT还是慢!呵呵,彻底没辙了,估计SkyEye模拟运行QT是没有好的方法能快些了。

你可能感兴趣的:(c,struct,File,Module,Flash,qt)