最近被其他事情耽擱了一下,已經好久沒有玩EVB板了,這兩天想起來,EVB上還有好多外設還沒有玩過呢,正好有點時間玩一下。先還是玩玩NOR FLASH的MTD吧,這個東西相對寫的代碼比較少,而且系統一下有了可以讀寫而且掉電不丟失的文件系統也是蠻讓人欣喜的。EVB最大的好處就是任何驅動都沒有現成的,都要自己寫,這樣比較有成就感,而且容易搞清楚驅動的所以然。
廢話少說,開始幹吧,首先當然是要修改Kconfig,由於增加的MAP Driver,所以要在drivers/mtd/maps下面改了:
config MTD_CBP_NOR_FLASH
tristate "CFI Flash device mapped on VTC CBP"
depends on ARCH_CBP&& MTD_CFI
help
The CBP board has a 16bit Nor FLash
以及Makefile了:
obj-$(CONFIG_MTD_CBP_NOR_FLASH) += cbp-norflash.o
然後就是make menuconfig把這個東東選上(在Mapping Driver裏面),當然還有其它的,比如
1)MTD Partitions,用於支持分區
2)Direct Char MTD Device,支持通過char接口訪問,而不僅僅是block,這樣就可以小規模修改kernel或者boot的數據了
3)Command Line Partition Table Parsing, 從命令行輸入MTD分區參數
4)Caching block device access to MTD,這個增加性能的,先選上
然後在RAM/ROM/FLASH chip drivers裏面把Intel, AMD,ST都選上,其實我是不太肯定我的到底是用的那個CFI Probe模式,因爲用的是Samsung的K5L2866芯片,那個選項裏面沒有Samsung選項。
有了MTD和Flash,一般都要玩JFFS2的,因此要在File System下面的miscellaneous把JFFS2選上,至於下面的其它選項,豐儉由人了。
然後就進入正題了, Linux程序現在越來越複雜,一層套一層的,就像奧迪的四個圈或者奧運的五環,俺就採用個比較簡單的玩法,也就少寫幾句,大概如下:
#define CBP_FLASH_BASE 0x00000000
#define CBP_FLASH_SIZE 0x01000000
static struct mtd_partition static_partitions[] =
{
{
.name = "BootLoader",
.size = 0x040000,
.offset = 0x0
},
{
.name = "Kernel",
.size = 0x0380000,
.offset = 0x40000
},
。。。。。。。。。。。此處省略兩個分區
}
static struct map_info map_info;
static struct mtd_info * pmtd_info;
void __init cbp_nor_flash_init(void)
{
map_info.name=cbp_nor_name;
map_info.virt=ioremap_nocache(CBP_FLASH_BASE,CBP_FLASH_SIZE);
map_info.phys=CBP_FLASH_BASE;
map_info.size=CBP_FLASH_SIZE;
map_info.bankwidth=2;
map_info.set_vpp=cbp_nor_flash_set_vpp;
simple_map_init(&map_info);
pmtd_info=do_map_probe("cfi_probe", &map_info);
add_mtd_partitions(pmtd_info, static_partitions, NUM_OF_PARTITIONS);
printk("pmtd_info-master:%x priv:%x/n",pmtd_info,pmtd_info->priv);
}
module_init(cbp_nor_flash_init);
此外還修改了一點CBP的映射,CBP的Nucleus的Boot上來是把前面的一部分空間映射成了RAM,還得把它恢復成Flash,不然找不着Flash,當然修改起始地址也是可以的,但是後面的Offset還要重新算,太麻煩了,還是映射成Flash看起來簡單點。
ldr r0, =0x0bc0000c
ldr r8, =0x03
str r8,[r0]
其實這樣一個有四個分區的MTD設備就搞定,看起來還是蠻清爽的,當然遠沒達到完美,首先沒有采用現在標準的platform,bus,driver模式註冊驅動結構,其次對一些返回的指針是否正確也沒有檢查,不過這個驅動的確是可以用的,CFI Nor FLash MTD基本原理其實就是這樣。
不過samsung的Flash在CFI Probe的時候會有一點問題,跟AMD不是完全兼容的,主要是ID不對,需要修改一下下,修改的Patch文件在以下地址,其中也包括了mkfs.jffs2的PC版本:
http://cid-a0a942ebd8c6c3b5.office.live.com/self.aspx/.Documents/jffs.rar
這樣基本上就有戲了,我的第三個分區時原來的RamDisk,直接將原來的啓動命令改成:
root=/dev/mtdblock2 initrd=0x10700000,1000k keepinitrd init=/sbin/init mem=8M console=ttyS0,115200n8";
這樣啓動的時候就從mtdblock2拷貝文件系統到RamDisk裏面運行了
然後在pc上製作一個JFFS2的root文件系統,
mkfs.jffs2 -r mmufs -o mmufs.jffs -e 0x10000 -s 0x10000
其中的-e -s是表示Page和Erase Block都是64KiB的。
放在第四個分區上,修改啓動命令如下:
"root=/dev/mtdblock3 rootfstype=jffs2 rw init=/sbin/init mem=8M console=ttyS0,115200n8";
恭喜一下我自己,啓動以後的root fs已經是JFFS2的了