Freescale i.MX6Q MEMORY CONFIG

首先是对bootloader的移植。移植uboot之前,首先需要的是DCD段。
bootloader里的DCD段是MX系列CPU用来初始化内存用的固定的一段代码,用DCDheader 标识出来
主要是对DDR controller的初始化。
这个地方调试起来比较要命,因为bootloader默认是在内存里运行的,如果DCD段的初始化不能正常完成,系统连第一行指令也运行不了。
好在这里有两个强力的工具可以用,一个是对方提供的内存压力测试工具,利用CPU进入 serial downloader模式,通过PC端的测试工具,对应于配置的inc文件,可以逐个试DDR的寄存器配置。这样大大降低了开发初始的复杂度。即使是这样,这个内存的配置过程仍然是非常痛苦的,多亏了技术支持的帮助,帮我们度过了痛苦的LP DDR2的配置过程。
另一个强大的工具是uboot里的配置,可以配置成为iram模式。这种模式下,利用uboot里的lds文件,将代码段定义到CPU的内部ram中运行,避免了对外部DDR的依赖,可以验证其他的外部设备,减少和内存的相关度。在这里想验证CPU的工作状态,写点跑马灯之类的程序,都方便多了。

利用这两个工具搞定了uboot之后,就可以加载内核了。

内核也是利用了BSP中的源代码,使用起来方便很多,直接编译,除了个别的管脚需要修改一下之外,其他基本是一马平川。我在这里被小郁闷了几下,主要是我们的主板用到的IO口和公板的源码有冲突,我们的驱动放在了前面,然后在后面紧接着又被二次配置了,查了很久才发现。

内核可以动了,就要加载ramdisk启动根文件系统了。这里没少费心力。
安卓的启动过程,要解析根下的init.freescale.rc 和init.rc两个关键的文件,然后起动相应的服务。其中,一个至关重要的服务,是console,也就是我们看到的串口上的提示符那部分。
事实上,android的init进程不进行有实质意义的工作,而是完成对相应的分区挂载后,从/system/bin下找到对应的程序后开始运行。这使得仅仅通过ramdisk是无法完成系统的启动的,必须要完成其他的分区的初始化。
这里,因为我们的程序都放在SD卡,而当时SD卡的驱动一直没有调,使得进度卡在这里好几天。发现了卡上的错误,修改之后就一切正常了。
如果下次调试新的CPU系统,需要准备一个独立的ramdisk镜像,从busybox编出来,不依赖于外部存储的,调试时会方便很多。


经过以上的两个磨难,内核也可以启动了,根文件系统也挂载成功了,下面可以直接进入安卓起动阶段了,但是这里发现了一个大问题:安卓的两个核心进程zygote一旦启动立即会触发系统的内核崩溃。
经过继续追踪后,发现只要申请超过40M的内存基本上就会挂掉。
分析了一下,应该是系统真正可用的内存只有512M,虽然在uboot中配置成了2G,实际上对应的物理地址是不可访问的,所以DMA跑到那里的时候系统就直接引发莫名其妙的panic了。

今天板子的内存终于可以运转了。

主要的原因在于CFG3那里的控制跳线。我们最终使用了interleaving模式,这样能够正确的使用双通道

相应的,在bootloader 里面,也需要改动内存的布局。

内存的布局是由uboot通过bd数据结构传到内核的,内核不会再对内存的底层配置进行初始化

因此,需要告诉内核,双通道的两片物理内存的起始地址,和大小

经过这次配置之后,终于可以随意的申请内存了。

基本可以得出一个结论,是否是双通道,是内存控制器的问题,是否采用interleaving地址排布,也都是由MDMMC 进行控制的,对于软件完全是透明的,所以软件仍然需要按照真实的物理地址分布对系统进行配置,不需要自己做逻辑转换

完成之后,只需要对LVDS进行一点简单的修改,屏幕就可以点亮了
终于看到如此和谐的安卓4.0解锁屏幕了,触摸驱动还没有加上,等待解锁…………

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值