Tekkaman Ninja 版本的uboot说明
来源:互联网 发布:python日期加减 编辑:程序博客网 时间:2024/06/05 10:04
(basic)
但是此次移植并非我的功劳,首先基本的移植是由Alex Ling <kasimling at gmail.com>完成的,你可以在这里看到他提交的补丁,但是编译后无法使用,可能是因为host系统不同,对脚本的解析不同,使得spl部分的生成出现问题,只需修改一下nand_spl目录下目标板目录的中config.mk中的
在完成了2010.09版本的移植以后,我就想要做一个简单的u-boot启动SD卡的烧写工具。虽然我知道应该实现什么功能,但是我不会写界面,只好求助于我的好兄弟Amankwah。我告诉他所要实现的功能、界面布局和烧写的方法,他帮我实现具体的界面。
经过我们的沟通与合作,这个u-boot的SD卡烧写界面的雏形和基本的功能都已经实现了。在这里我要感谢Amankwah对我的无私的帮助。
这里是源码的下载地址。运行环境:Ubuntu。
如果你在使用中发现了bug,你可以发邮件给Amankwah,最好再抄送一份给我。
此工具是测试版本,功能还不完善:
erase还不能用(虽然没有什么必要)
没有烧写成功的提示(虽然已经成功了)
但是我们会慢慢的完善她。
以下是运行的效果图:
注意:此工具会改变你的可移动存储设备的内容,请小心使用!推荐使用测试用SD卡(里面没有重要数据),我们对使用此工具造成的一切数据丢失一概不负责。
昨天完成了MINI6410的u-boot自动识别256MB和128MB DDR 内存的功能,这里把其中的原理记录一下。
1、了解DDR SDRAM的原理
首先你必须了解一下DDR SDRAM的原理和外部接口,这些在网上有几篇比较经典的文章这里推荐一下:
专家详解:内存工作原理及发展历程
内存的原理和时序(SDRAM、DDR、DDR-Ⅱ、Rambus DRAM)
----------------------------------------------------------------------------------
2、MINI6410的内存硬件结构与寻址关系
在看过上面的文档之后,相信应该对DDR内存有了一个比较完整的认识和理解,下面我们就来讲讲在MINI6410上的内存硬件结构:
对于MINI6410的设计,用了两块引脚兼容的DDR内存芯片来实现128MB内存和256MB内存可共用一个PCB。
128MB内存使用的是两片K4X51163PG(32Mx16bit),形成一个32M×32bit(128MB)的内存。
256MB内存使用的是两片K4X1G163PE(64Mx16bit),形成一个64M×32bit(256MB)的内存。
而这两款芯片在引脚上的差别就是K4X51163PG的F7是NC脚,而K4X1G163PE的F7脚是A13。
这个F7引脚在128MB内存版本的MINI6410中这个引脚是不连接的,而256MB版本中是通过一个0欧电阻和S3C6410的Xm1ADDR13相连的。
看了这两个内存芯片和S3C6410(DRAM控制器)的数据手册的朋友一定知道,这种连接形成一个这样的寻址关系:
128MB内存版本:Xm1ADDR[15:14](bank):Xm1ADDR[12:0](行地址):Xm1ADDR[9:0](列地址) 。一共25根地址线刚好可寻址32M空间
256MB内存版本:Xm1ADDR[15:14](bank):Xm1ADDR[13:0](行地址):Xm1ADDR[9:0](列地址) 。一共26根地址线刚好可寻址64M空间
而这两种连接和芯片配置也要通过修改S3C6410的DRAM控制器的两个寄存器的参数来匹配。
----------------------------------------------------------------------------------
3、U-boot中内存自适应代码应处的位置
做好了以上的两个知识准备后,我们看看在u-boot中应该在什么位置来识别和自适应不同的内存大小。
首先我们在识别了内存大小之后可能需要重新配置S3C6410的内存控制器。这么一来,这些代码不能在DDR中运行。因为一旦重新配置内存控制器,必然导致内存暂时无法使用,如果代码在DDR中CPU可能无法得到下一步的代码。所以这些代码要放在u-boot实现自拷贝到内存之前的地方,其实最好的地方就是在u-boot的SPL部分中初始化内存控制器的代码段中。
这些代码就在:arch/arm/cpu/arm1176/s3c64xx/cpu_init.S
这个文件是汇编代码,其中的函数mem_ctrl_asm_init是通过start.S中的“bl lowlevel_init”------>/board/samsung/mini6410/lowlevel_init.S中的lowlevel_init ”bl mem_ctrl_asm_init”调用的。mem_ctrl_asm_init函数中的代码对S3C6410的DRAM控制器进行了初始化,并对外部的DDR内存也进行了初始化,所以内存的识别和自适应代码应该放在这些初始化之后。先识别内存的大小,如果内存大小和原先DRAM控制器的配置不相符,就修改DRAM控制器的配置。
----------------------------------------------------------------------------------
4、内存大小的识别
针对MINI6410的情况,我们只需要识别内存是128MB还是256MB。由于这两种内存大小关系到DRAM控制器的两个寄存器的参数,所有我们必须先假设我们的内存大小,再通过读写的方式来证明,如果证明我们的假设是错误的,再修改寄存器的参数。
我移植的U-boot代码中首先假设内存是256MB,并先配置DRAM控制器为256MB内存的参数。如果这时连接的是128MB内存,那么就会有这样一个有趣的现象:
由于Xm1ADDR[13]没有连接,所以DDR内存的第一个8M×32bit(32MB)和第二个8M×32bit(32MB)是镜像关系,第三个8M×32bit(32MB)和第四个8M×32bit(32MB)是镜像关系,以此类推。一共有四个这样的镜像关系,共256MB。如果连接的就是256MB的内存就不会有这样的现象。所以,只要我们证明了这种现象存在,就证明了我们其实连接的是128MB内存,然后重新配置DRAM控制器为128MB内存的参数就大功告成了。
所以我移植的U-boot代码中首先写一个32bit的测试数据到第一个8M×32bit(32MB)的某个位置(比如0x0地址),然后就去第二个8M×32bit(32MB)相应偏移位置读取,如果数据一致就可以证明镜像关系。但是还不保险,如果就是这么巧(在连接256MB的内存的情况下)第二个8M×32bit(32MB)相应位置本身就是这个数据怎么办?不要紧,我们再去第二个8M×32bit(32MB)同一位置写入另一个测试数据,然后去第一个8M×32bit(32MB)的那个位置(也就是一开始的那个写入位置)读取数据,如果数据一致就完全可以证明镜像关系。通过这样的两次测试,看看是否要重新配置DRAM控制器参数。
但是我们不能假设内存是128MB,并先配置DRAM控制器为128MB内存的参数。如果连接的是256MB的内存,没有任何特殊的现象可以测试到。通过上面的寻址关系,如果连接的是256MB的内存,只是第二、四、六、八(假设Xm1ADDR[13]一直是0)个8M×32bit(32MB)是没法访问的(可以说是内存空洞),这个无法通过读写证明。(通过寻址关系推断,未通过实验证明)
----------------------------------------------------------------------------------
5、关于内存控制器的重配置
如果上面的步骤中测试出了镜像的存在,我们必须重新配置两个寄存器的值,但是如何重新配置,这个三星的数据手册是没有讲的,我通过测试发现可以通过以下的步骤重新配置DRAM控制器:
1、将DRAM控制器设为暂停(Paused)状态;
2、检测P1MEMSTAT,直到确认了暂停(Paused)状态;
3、将DRAM控制器设为配置(Config)状态;
4、检测P1MEMSTAT,直到确认了配置(Config)状态;
5、修改需要重新配置的寄存器
6、将DRAM控制器设为启动(Go)状态;
7、检测P1MEMSTAT,直到确认了就绪(Ready)状态;
----------------------------------------------------------------------------------
所有的原理就总结到这里,具体的源码可以到这里下载、分析。
如果您认为我的方法不好,可以在评论中批评、指出。
如果有朋友有更好的办法来解决MINI6410内存的识别问题,也欢迎在评论中共享出来
以前我移植的u-boot在启动的时候只支持128MB内存,因为最开始友善出的MINI6410只有128MB的DDR内存。但是后面他们升级为256MB的DDR了,我的U-boot一直没有修改,一直在凑合着用。最近几天,由于项目需要,看了一下DDR(1/2/3)的接口和相关的时序,就想到也让U-boot支持一下256MB的DDR,所有就稍微看了看S3C6410的DRAM控制器,调整了两个寄存器就实现了对256MB的支持。
- setenv bootcmd 'setenv bootargs noinitrd root=/dev/nfs rw nfsroot=192.168.1.2:/home/tekkaman/development/share/mini6410_rootfs ip=192.168.1.22:192.168.1.2::255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=$ramsize ; tftp 192.168.1.2:uImage ;bootm'
好久都没有更新mini6410的u-boot了,前段时间仔细学习了git和quilt的使用,发现真的对开发有极大的帮助。这次将u-boot-2011.06移植到mini6410算是一个集中实习。
- make CROSS_COMPILE=(你的编译器路径) mini6410_config
- make CROSS_COMPILE=(你的编译器路径)
- Tekkaman Ninja 版本的uboot说明
- 很厉害的Tekkaman Ninja 的博客
- [Tekkaman Ninja]在U-boot下实现自动识别启动Flash的原理(针对S3C24x0)
- 在U-boot下实现自动识别启动Flash的原理(针对S3C24x0)(转自Tekkaman Ninja)
- tekkaman修改版uboot使用config_mtd_device后不能正常访问nand的种原因
- tekkaman修改版uboot使用config_mtd_device后不能正常访问nand的种原因
- Tekkaman
- Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介) - Linux设备驱动程序 - Tekkaman Ninja
- UBOOT版本
- uboot中的快捷菜单的制作说明
- uboot中的快捷菜单的制作说明
- uboot中的快捷菜单的制作说明
- Uboot中的快捷菜单的制作说明
- uboot中的快捷菜单的制作说明
- Uboot的bootargs引导参数说明
- uboot中的快捷菜单的制作说明
- 对于Tekkaman completion 的一点疑问?? 没有 解决
- 研究 tekkamanninja-u-boot-2010.03-tekkaman 遇到的问题
- 在ubuntu下烧写映像文件到SD卡--基于三星210开发板
- 小波变换网文精粹:小波变换和motion信号处理(五)
- 在ubuntu下烧写映像文件到nand--基于三星210开发板
- Zend Framework教程-Zend_Helpers-动作助手-ViewRenderer
- u-boot中.lds连接脚本文件的分析
- Tekkaman Ninja 版本的uboot说明
- poj-2586-Y2K Accounting Bug
- 怎样为Eclipse设置字符集
- 详解公钥、私钥、数字证书的概念
- ThinkPhp文件下载问题
- http 协议详解
- 资料样板的定义与套用
- RedHat5.5+IBM DS4800+Oracle10g RAC+LVM安装
- WMI012-WMI学习笔记(十二)——Win32_ApplicationService