使用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是没有好的方法能快些了。