将储存于存储于芯片 RAM #4 地址 1FF0H 到芯片 RAM#5 地址 0010H 之间的所有内容求和

24402410的区别主要是 2440的主频更高,增加了摄像头接口和 AC‘97音频接口;寄存器方面,除了新增模 块的寄存器外,移植所要注意的是 NAND FlASH控制器的寄存器有较大的变化、芯片的时钟频率控制寄存器(芯片 PLL的寄存器)有一定的变化。其他寄存器基本是兼容的。

3.  你开发板的boot方式是什么,开发板上电以后是怎么执行的。

一般来说三星的开发板有三种启动方式: nandnorram

nand-flash启动的机制。开发板一上电, CPU就自动复制

S3C24400地址,上电从 0地址开始执行。

    要理解程序的入口地址,自然想到的是连接文件,首先看看开发板相对于某个开发板的连接文件 "/board/你的开发板 /u-boot.lds",看一个 2410的例子:

(2). = 0x也许可以看出 _start的地址是 0x,事实并不是这样的,这里的 0x没效,在连接的时候最终会被 TETX_BASE所代替的,具体请参考

(3) 网上很多说法是 _start=TEXT_BASE,我想这种说法也是正确的,但没有说具体原因。

本人的理解是这样的, TEXT_BASE表示 text段的起始地址,而从

看,放在 text段的第一个文件就是 start.c编译后的内容,而 start.c中的第一个函数就是

start_armboot是一个函数地址,在编译的时候给分配了一个绝对地址,所以上面语句实际上是完成了一个绝对地址的跳转。而我一直不明白的为什么在 start.S里面有很多 BL,B跳转语句都没有跳出 4Ksteppingstone,原因是他们都是相对于 PC的便宜的跳转,而不是绝对地址的跳转。还有要补充一下 LDR,MOV,LDR伪指令的区别。

x必须是一个 8 bits的数移到偶数次得到的数。

在u-boot1.3.3及以上版本Makefile有一定的变化,使得对于24x0处理器从nand启动的遇到问题。也就是网上有人说的:无法运行过lowlevel_init。其实这个问题是由于编译器将我们自己添加的用于nandboot的子函数nand_read_ll放到了4K之后造成的(到这不理解的话,请仔细看看24x0处理器nandboot原理)。我是在运行失败后,利用mini2440的4个LED调试发现u-boot根本没有完成自我拷贝,然后看了uboot根目录下的System.map文件就可知道原因。

 这种向程序计数器 PC直接写跳转地址,能在 4GB连续空间内任意跳转。

2)通过 B BL BLX BX可以完成在当前指令向前或者向后 32MB的地址空间的跳转(为什么是 32MB呢?寄存器是 32位的,此时的值是 24位有符号数,所以 32MB)。

B是最简单的跳转指令。要注意的是,跳转指令的实际值不是绝对地址,而是相对地址——是相对当前 PC值的一个偏移量,它的值由汇编器计算得出。

BL非常常用。它在跳转之前会在寄存器 LR(R14)中保存 PC的当前内容。 BL的经典用法如下:

二.开始上机移植:(红色字体为添加的内容,蓝色字体为修改的内容,下同 )

给自己的开发板取名为 qljt2440

由于我在上一步板子的开发者 /或经销商 (vender)中填了 qljt ,所以开发板 qljt2440目录一定要建在 /board子目录中的 qljt目录下 ,否则编译会出错。

6. 测试交叉编译能否成功

三.开始针对自己的开发板移植

1.1 修改寄存器地址定义

参见P255表,同时要知道本开发板的Fin12MHz,需要的Fclk(也就

也是0x7ff,不知为什么UBoot一直没改过来。但是由于芯片复位默认

/*时钟控制逻辑单元能够产生s3c2440需要的时钟信号,包括CPU使用的主频FCLK,AHB总线使用的HCLK,APB总线设备使用的PCLK2440里面的两个锁相环(PLL),其中一个对应FCLKHCLKPCLK,另外一个对应

改变总线模式为异步模式网上某位朋友说不知到在哪里看到过

1.4 将从Flash启动改成从NAND Flash启动。(特别注意:这和2410的程序有不同,不可混用!!!是拷贝vivi的代码。)
将以下UBoot的重定向语句段:

/*下面这段用来初始化栈指针sp和帧指针fp,至于它们的定义和作用参考文件夹 栈指针sp和帧指针fp”里面的内容

有趣的是外国人的逆向思维很厉害,它们很灵活地把它放在SDRAM的最后0x80000地方,也就是 0x33F80000

这里特别注意r0的值是指nand_read_ll 执行完以后的返回值,而不是上面

/*计算机就是好,很容易就可以检测我们放在SDRAM中的u-boot是不是flash中的uboot

本开发板使用的是nand-falsh的启动方式,板子一上电并不是马上进入SDRAM执行程序的。是这样的:板子一上电,S3C2440自动把nand-falsh中从0地址开始的4Kbytes复制到S3C2440集成的某个缓冲区里面(起始地址是0x00),从那里开始执行,那4K程序负责把整个uboot复制到SDRAM,然后才跳到SDRAM开始正真的UBOOT(这个技术是有个专业名字的我忘记了

1.5 在跳到 C函数执行前,也就是跳出 start.S前,添加几个 LED灯的控制,说明程序跑到这里了,移植的第一阶段完成了。

2,因为如果按照ARM的规则,意思是按照 22次方=4bit

flash的相关寄存器,例如如果你想像nand flash写一个命令,那么只要对命令寄存器写入你的命令就可以了,s3c2440 可以自动帮你完成所有的时序动作,写地址也是一样。反过来说如果没有了对nand flash的支持,那么我们对nand falsh的操作就会增加好多对I/O口的控制,例如对CLE,ALE的控制。s3c2440已经帮我们完成了这部分工作了 */

/*下面这个送地址的过程可以说是这段程序里最难懂的一部分了,难就难于为什么送进nand flash的地址忽略了bit8

纵观整个for(i) 循环,i并不是一个随机的地址,而应该是每一页的首地址。其实nand flash并不是忽略了bit 8这个

半页开始读取,从而它有两个读的命令,分别是0x00(从一页的上半页开始读)0x01(从一页的下半页开始读)

到这里,应该是可以编译通过的,否则就是编辑的时候出现了错误

Tsrc才对,好多地方都没有改过来,我我觉得只是个名字而已,不影响结果

注意:如果这里改了,那么下面这句中的 Trc也要改为相应的 Tsrc

/*1.要知道上面这些配置的最终会被用到下面SMRDATA 这个数据池里面,所以必须要明白SMRDATA 这个数据池是用

来干什么的,SMRDATA 后面每一个.word 后面防止的数据都是将要写入BWSCON 开始的寄存器的,总共有13.work ,它们后面放置的值将会分别别写入0x0x0x…一直到0x13个寄存器。 */

/*2.上面那些配置的值是怎样决定的呢,详细请参考s3c2440A和你所用SDRAMdatasheet。细心找总是能找到的。 */

/*3.而上面的那些配置值最终是通过下面lowlevel_init后面的这段函数写到寄存器里面的,下面对该段函数逐一分析: */

_TEXT_BASE的值?原因是这样的:我们使用的是从nandflash boot的方式,目前程序

相对于地址0x的放置的所在地方(相对于0x00的地址值) */

/*从这三条语句可以看出前人为了实现从nand flash启动可谓费尽心思啊! */

到这里,应该是可以编译通过的,否则就是编辑的时候出现了错误

到这里,应该是可以编译通过的,否则就是编辑的时候出现了错误

的定义,有多少中定义就有多少种*/

/*下面部分内容是修改的 */

顺便修改源代码,以匹配s3c2440:

到这里,应该是可以编译通过的,否则就是编辑的时候出现了错误

/*下面说说上面结构体的 8个参数是怎么得出来的,以便日后再次移植的时候会更换 nand flash*/

4. 总共容纳的地址位数:也就是有效的地址位数。针对于本 flash(K9F1208U0M)可以参考它的 datasheet7页。

6. 地址需要多少字节数减一 (行列地址总共 ):举个例子可能更容易明白,第 4点中可以知道本 flash(K9F1208U0M)26位,而对本 flash地址的写入每次只能写 8位,所以至少要写 4次才能把 26位地址写入本 flash4次的写入针对于编程来说就是 [0:3],所以本 falsh相对于该结构体的该变量的值是 3.

8. 是否为 16位总线:本 flash地址和数据总线共用,都是 8位的,所以上面值为 0

// 在串口初始化和console 初始化完成,串口输出信息之前,LED1 LED2 LED3 会亮起!

// 在进入命令提示符之前,四个LED 会同时亮起!

到这里,应该是可以编译通过的,否则就是编辑的时候出现了错误

16. 裁减flash的支持 (这一步也可以不执行)

1:表示该值为真, 0:表示该值为假

}

我要回帖

更多关于 片内ram的20h-2fh为位寻址区 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信