在成功移植Montavista到ML507开发板之后,尝试添加最简单的用户自定义IP核到PLB总线上,自定义IP核包含一个可以访问的wire型寄存器reg0,并给assign reg0 = 32’d1234,同时屏蔽了XPS自动生成的赋值语句。IP核里reg0外设在standalone模式下被成功读取出来。打印结果如下:
-- Entering main() --
-- Init LEDs... --
******************************
* User Peripheral Self Test
******************************
User logic slave module test...
- read 1234 from register 0 word 0
-- Exiting main() --
但是换成Montavista之后,编译dts导入linux内核源码,编译出的内核镜像无法boot成功。打印结果如下:
booting virtex
memstart=0x10
memsize=0xf
zImage starting: loaded at 0x00400000 (sp: 0x008b5eb8)
Allocating 0x390688 bytes for kernel ...
gunzipping (0x00000000 <- 0x0040e000:0x005abc17)...done 0x36a5ac bytes
Attached initrd image at 0x005ac000-0x008b48c2
initrd head: 0x1f8b0808
fdt_wrapper_setprop():104 FDT_ERR_NOSPACE
提示错误FDT_ERR_NOSPACE,是与device tree相关的错误号,NOSPACE提示空间不足,这个空间不足的文件其实是指dtc(device tree compiler)编译dts产生的dtb(device tree blob)映像文件。
根据文章《全面解析PowerPC架构下的扁平设备树FDT》介绍:
--------------------------------------------------------------------------------------
Dtc编译器命令格式:
dtc [-I <input -format > ] [-O <output -format > ] [-o output-filename] [-V output_version] input_filename
使用方法:
dtc -I dts -O dtb -S 0x3000 -o obj_name.dtb source_name.dts
其中-S 指定的是生成的dtb文件的大小,需要适当地扩大以供u-boot 创建/choose节点时使用 。
--------------------------------------------------------------------------------------
因此我们可以试着扩大一下dtb文件的大小。
编辑$(linux_source_dir)/arch/powerpc/boot/Makefile文件,找到这一句if $4, -d $4,修改成if $4, -d -S 0x4000 $4,即扩大到16K (设备树文件$(edk_project)\ppc440_0\libsrc\device-tree_v0_00_x\xilinx.dts大小为12k,所以大概16K就ok了),修改后文件部分如下:
# args (to if_changed): 1 = (this rule), 2 = platform, 3 = dts 4=dtb 5=initrd
quiet_cmd_wrap = WRAP $@
cmd_wrap =$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \
$(if $3, -s $3)$(if $4, -d -S 0x4000 $4)$(if $5, -i $5) vmlinux
然后保存,重新Make ARCH=powerpc zImage.initrd,并dow到开发板上测试,打印结果如下:
booting virtex
memstart=0x10
memsize=0xf
zImage starting: loaded at 0x00400000 (sp: 0x008b5eb8)
Allocating 0x390688 bytes for kernel ...
gunzipping (0x00000000 <- 0x0040e000:0x005abc17)...done 0x36a5ac bytes
Attached initrd image at 0x005ac000-0x008b4118
initrd head: 0x1f8b0808
Linux/PowerPC load: console=ttyS0 ip=222.25.191.100 root=/dev/ram
Finalizing device tree... flat tree at 0x8c2300
Using Xilinx Virtex machine description
Linux version 2.6.24_pro5024-ml507 (root@localhost.localdomain) (gcc version 4.2.0 (MontaVista 4.2.0-16.0.46.0900112 2009-01-20)) #24 PREEMPT Tue Apr 9 17:52:44 CST 2013
..........(此处省略部分打印结果)
MontaVista(R) Linux(R) Professional Edition 5.0.24 (0900120)
222.25.191.100 login: root
Welcome to MontaVista(R) Linux(R) Professional Edition 5.0.24 (0900120).
login[557]: root login on 'console'
# ls
hello led.ko leddrv.ko leddrv.ko.old testled
# insmod leddrv.ko
LED init...
LED is setted output.
Read from register1,value is 1234
# rmmod leddrv
exit LED!
#
从上面显示可以看出,boot成功,驱动正常运行。
参考:
Booting the Linux/ppc kernel without Open Firmware/booting-without-of.txt
powerpc_linux设备树dts移植.pdf