现在的位置: 首页 > 综合 > 正文

【基于EDK的嵌入式系统】 关于Xilinx EDK添加自定义IP核到PLB总线后linux无法boot的问题

2013年05月07日 ⁄ 综合 ⁄ 共 2958字 ⁄ 字号 评论关闭

在成功移植MontavistaML507开发板之后,尝试添加最简单的用户自定义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,所以大概16Kok),修改后文件部分如下:

# 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

抱歉!评论已关闭.