这个想法开始于去年。那个时候尝试在V2P Pro上移植,可以通过,但是在spartan3E上移植一直没有通过。直到最近,再次分析的时候,才解决了这个问题。
软件环境EDK10.0.03
Linux host:Cent OS5
移植Linux所需支持包:petalinux
--------------
February 5th, 2009
出于对成本的考虑,很多地方都会使用到spartan系列的fpga,
从edk9.2开始,提供的软核microblaze已经可以支持MMU了,所以想尝试在xup spartan3e的板子上实现它,并尝试移植Linux上去,而不再是uclinux。
因为据说支持MMU之后的MicroBlaze大小会比之前大一倍,出于对资源的考虑,外设只是单单选择了一个LED灯,以及串口用于输出。
具体的开启MicroBlaze的方式直接添加以下两个参数到mhs文件的MicroBlaze中。
PARAMETER C_USE_MMU = 3
PARAMETER C_MMU_ZONES = 2
还需要把
PARAMETER C_AREA_OPTIMIZED = 1
这个参数删掉,是不兼容的。这个参数的意思是,spartan3E因为资源有限的问题,所以其MicroBlaze使用了面积优化。其实,有面积优化的MicroBlaze内部使用3级流水,而没有面积优化的是5级流水。
但是最后出来的结果却让自己有点失望。因为test mem没有过。而且是很奇怪的方式:
– Entering main() –
Starting MemoryTest for DDR_SDRAM:
Running 32-bit test…PASSED!
Running 16-bit test…FAILED!
Running 8-bit test…FAILED!
– Exiting main() –
也就是说,系统内部链接应该都没有问题,但是在内部优化的地方是有问题的。自己于是开始思考到底哪里有问题呢?
于是新建一个工程,其他什么都没有变,只把 microblaze的面积优化去掉,也不开启MMU支持,然后编译,test mem的结果是一样的。所以这里有问题。难道spartan3e中其microblaze只能使用面积优化?或者说spartan3E上的 microblaze无法MMU?
————————
2009 年3月 24日 晚
今天再次分析这个项目的时候,偶然的机会想要去生成软件的linker,结果跳出了这样的对话框:
WARNING:MDT - ***********************************************************************
WARNING:MDT - ** MicroBlaze - microblaze_0
WARNING:MDT - ***********************************************************************
WARNING:MDT - ** Byte and halfword write instructions cannot be used with “spartan3e”
WARNING:MDT - ** when data cache size is set to less than 4kB.
WARNING:MDT - ***********************************************************************
Linker Script generated successfully.
然后发现确实为了资源的问题,自己没有给cpu设置很大的cache,按照V2P上自己做通过的例子来说,icache和dcache都设置为2k。但 是从上面的warning明显看出来,在Spartan3E的器件上,dcache一定要设置到4k以上。
经过尝试,最后了的结果是Byte write instructions一定要dcache为8k。icache没有改变,还是2k。这样设置之后,一切正常,Mem test过了。
– Entering main() –
Starting MemoryTest for DDR_SDRAM:
Running 32-bit test…PASSED!
Running 16-bit test…PASSED!
Running 8-bit test…PASSED!
– Exiting main() –
最后的资源为:
Design Summary Report:
Number of External IOBs 55 out of 232 23%
Number of External Input IOBs 3
Number of External Input IBUFs 3
Number of LOCed External Input IBUFs 3 out of 3 100%
Number of External Output IOBs 33
Number of External Output DIFFMs 1
Number of LOCed External Output DIFFMs 1 out of 1 100%
Number of External Output DIFFSs 1
Number of LOCed External Output DIFFSs 1 out of 1 100%
Number of External Output IOBs 31
Number of LOCed External Output IOBs 31 out of 31 100%
Number of External Bidir IOBs 19
Number of External Bidir IOBs 19
Number of LOCed External Bidir IOBs 19 out of 19 100%
Number of BSCANs 1 out of 1 100%
Number of BUFGMUXs 5 out of 24 20%
Number of DCMs 2 out of 4 50%
Number of MULT18X18SIOs 3 out of 20 15%
Number of RAMB16s 19 out of 20 95%
Number of Slices 4564 out of 4656 98%
Number of SLICEMs 445 out of 2328 19%
Number of LOCed Slices 62 out of 4564 1%
Number of LOCed SLICEMs 41 out of 445 9%
虽然只有一个外设(8个LED小灯),但是资源还是用的很满了。让人觉得在3E上跑带有MMU支持的系统着实感到吃力,但是成本会很低。接下来自己的系统可以在这个上面移植Linux,而不再是uclinux。
——————————
2009年3月25日 0:25
成功移植了linux到spartan3E的板卡上
以下是启动信息,可以看出这个是linux了,而不是uclinux,包括版本号,以及外设地址都重新映射到虚拟地址上了。
Linux version 2.6.20-uc0(centos@localhost.localdomain) (gcc version 4.1.1) #2 W
ed Mar 25 00:19:41 EDT 2009
setup_cpuinfo: initialising
setup_cpuinfo: No PVR support in CPU. Using static compile-time info
set_cpuinfo_static: Using static CPU info.
setup_memory: max_mapnr: 0×2000
setup_memory: min_low_pfn: 0×86294
setup_memory: max_low_pfn: 0×88000
On node 0 totalpages: 8192
DMA zone: 64 pages used for memmap
DMA zone: 0 pages reserved
DMA zone: 8128 pages, LIFO batch:0
Normal zone: 0 pages used for memmap
Built 1 zonelists. Total pages: 8128
Kernel command line:
xps_intc_0_1.00.a INTC at 0×81800000 mapped to 0xFDFFF000
PID hash table entries: 128 (order: 7, 512 bytes)
xps_timer_1_1.00.a TIMER at 0×83C00000 mapped to 0xFDFFE000
disabling early console
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory: 29836k/32768k available
Calibrating delay loop… 49.35 BogoMIPS (lpj=246784)
Mount-cache hash table entries: 512
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
xgpio0 #0 at 0×81400000 mapped to 0xC2000000 device: 10,185 using IRQ#2
uartlite.0: ttyUL0 at MMIO 0×84000000 (irq = 3) is a uartlite
RAMDISK driver initialized: 16 RAM disks of 8192K size 1024 blocksize
Freeing unused kernel memory: 1426k freed
Mounting proc:
Mounting var:
Populating /var:
Running local start scripts.
Mounting /etc/config:
Populating /etc/config:
flatfsd: Nonexistent or bad flatfs (0), creating new one…
flatfsd: Created 3 configuration files (117 bytes)
Mounting sysfs:
Setting hostname:
uclinux login: root
Password:
BusyBox v1.00 (2009.03.25-04:13+0000) Built-in shell (ash)
Enter ‘help’ for a list of built-in commands.
~ # ls
bin dev etc home init lib mnt proc sys tmp usr var
~ #