S3C6410之uboot回炉再造(3)lowlevle_init.S

发布者:SparkStar22最新更新时间:2024-09-03 来源: cnblogs关键字:S3C6410  uboot 手机看文章 扫描二维码
随时随地手机看文章

218     mov    pc, lr

219 

220 


  12、串口初始化的执行代码


221 #ifndef CONFIG_NAND_SPL

222 /*

223  * uart_asm_init: Initialize UART's pins

224  */

225 uart_asm_init:

226     /* set GPIO to enable UART */

227     ldr    r0, =ELFIN_GPIO_BASE

228     ldr    r1, =0x220022

229     str    r1, [r0, #GPACON_OFFSET]

230     mov    pc, lr

231 #endif

232 


  13、NAND flash的初始化


  后面有详细分析,这里不重复粘贴了。


  14、MMU的初始化


  同上。


  这篇比较偷懒,但是想把主要精力放在start.S的分析上。


  其实这也是分析方法的一种,看代码的时候先了解模块的代码区,若想深入了解某个模块的实现,则再深入到每一行代码中理解。



  总结一下 lowlevl_init 的总体实现内容:


  1、点亮LED;


  2、关闭看门狗


  3、禁用中断;


  4、初始化时钟;


  5、初始化串口;


  6、初始化NAND FLASH;


  7、初始化MMU(根据宏声明而定)。



  这里补上两段代码的分析:


  NAND flash的初始化 与 MMU 的初始化,因为在 kernel 的启动过程中还会有类似的代码段,现在分析了,到后面分析 kernel 初始化的时候可以做一个对比。


  1、首先是 NAND FLASH 的初始化


233 #ifdef CONFIG_BOOT_NAND

234 /*

235  * NAND Interface init for SMDK6400

236  */

237 nand_asm_init:

238     ldr    r0, =ELFIN_NAND_BASE

239     ldr    r1, [r0, #NFCONF_OFFSET]

240     orr    r1, r1, #0x70

241     orr    r1, r1, #0x7700

242     str    r1, [r0, #NFCONF_OFFSET]

243 

244     ldr    r1, [r0, #NFCONT_OFFSET]

245     orr    r1, r1, #0x07

246     str    r1, [r0, #NFCONT_OFFSET]

247 

248     mov    pc, lr

249 #endif

250 


  1)确认成立条件 CONFIG_BOOT_NAND


  这个条件声明在/include/configs/smdk6400.h中,所以下面的执行代码是有效的。


  接着深入分析


238     ldr    r0, =ELFIN_NAND_BASE

//在/include/asm-arm/arch-s3c64xx/s3c6400.h中声明了

#define  ELFIN_NAND_BASE  0x70200000

//这里采用的是伪汇编指令,即将其值放入 r0 中

  2)进入s3c6410 UM中检索 ELFIN_NAND_BASE 相关地址信息找到table 2-3 中有相应的地址信息。


Address              Description

0x7020_0000 ~ 0x702F_FFFF  NFCON SFR

  接着在UM中检索0x7020_0000 可以跳转到8.11节。


  看了之后发现,这一小篇内容描述的是 NAND FALSH 控制寄存器地图。


  其中 base 就是我们的 0x7020_0000。


  从UM中,我们先看到 0x7020_0000 代表的意思:


  NFCONF (Nand Flash CONFiguration)寄存器功能为 Nand Flash Configuration register。


  复位值为 0xX000_100X


  相对应的位的信息为


//不同关系的作用位用 ',' 隔开,总体以 4 bit 来分隔, 含同一组作用位的用 '|' 隔开。

[31, 30, 29 28 | 27 26, 25, 24 | 23, 22 21 20 | 19 18 17 16 ]

[15, 14 13 12, | 11, 10 9 8, | 7, 6 5 4, | 3, 2, 1, 0]

//按作用位组来介绍

//1、 X, 0, 0 0 ---> X

31 - Reserved, 30 - [0:系统时钟 > 66MHZ; 1:系统时钟 < 66MHZ], 29 28 - Reserved

//2、 0 0, 0, 0 ---> 0

27 26 - Reserved, 25 - ECC校验长度 [0:512 byte; 1:24 byte ], 24 - 联合23

//3、 0, 0 0 0 ---> 0

24 23 - ECC类型 [00: 1 bit; 10: 4 bit; 01: 8 bit /*注意4 bit 和 8 bit 的类型码*/]

22 : 15 - Reserved

//4、 0 0 0 0 ---> 0

//5、 0, 0 0 1 ---> 1

14 13 12 - CLE & ALE 持续时间设定 

//6、 0, 0 0 0 ---> 0

11 - Reserved, 10 9 8 - TWRPH0 持续时间设定

//7、 0, 0 0 0 ---> 0

7 - Reserved, 6 5 4 - TWRPH1 持续时间设定

//8、 X, 0, X, 0 ---> X

4 2 1 - Reserved, 3 - Reserved 但必须为1


  3)接着看下面的指令


239     ldr    r1, [r0, #NFCONF_OFFSET] //先找到 NFCONF_OFFSET 的定义

//目录为 /include/asm-arm/arch-s3c64xx/s3c6400.h, 则此处 r1 = 0xX000_100X

//在UM中找到相应项目

240     orr    r1, r1, #0x70

//                   r1 = 0xX020_007X

241     orr    r1, r1, #0x7700

//                   r1 = 0xX020_777X

242     str    r1, [r0, #NFCONF_OFFSET]

//送回NFCONF寄存器

//对应上面的表可以知道,改变的为 CLE & ALE, TWRPH0/1 的持续时间而已(时间增加了)

243 


  4)然后是剩下的指令



244     ldr    r1, [r0, #NFCONT_OFFSET] //这里是NFCONT_OFFSET了,注意区分

245     orr    r1, r1, #0x07        // r1 = 0x0001_00C6 | 0x07 

                        // r1 = 0x0001_00C7

//NFCONT 寄存器的最后一位功能为 [0:禁用NAND Flash  1:使用NADN flash]

//所以这里的功能就很清晰了,就是初始化 NAND flash

246     str    r1, [r0, #NFCONT_OFFSET] //回送

247 

248     mov    pc, lr      //程序返回

249 #endif

250     


  2、MMU的初始化代码


251 #ifdef CONFIG_ENABLE_MMU

252 /*

253  * MMU Table for SMDK6400

254  */

255 

256     /* form a first-level section entry */

257 .macro FL_SECTION_ENTRY base,ap,d,c,b

258     .word (base << 20) | (ap << 10) |

259           (d << 5) | (1<<4) | (c << 3) | (b << 2) | (1<<1)

260 .endm

261 

262 .section .mmudata, 'a'

263     .align 14

264     /* the following alignment creates the mmu table at address 0x4000. */

265     .globl mmu_table

266 mmu_table:

267     .set __base, 0

268     /* 1:1 mapping for debugging */

269     .rept 0xA00

270     FL_SECTION_ENTRY __base, 3, 0, 0, 0

271     .set __base, __base + 1

272     .endr

273 

274     /* access is not allowed. */

275     .rept 0xC00 - 0xA00

276     .word 0x00000000

277     .endr

278 

279     /* 128MB for SDRAM 0xC0000000 -> 0x50000000 */

280     .set __base, 0x500

281     .rept 0xC80 - 0xC00

282     FL_SECTION_ENTRY __base, 3, 0, 1, 1

283     .set __base, __base + 1

284     .endr

285 

286     /* access is not allowed. */

287     .rept 0x1000 - 0xc80

288     .word 0x00000000

289     .endr

290 #endif


  1)确认成立条件


#if !defined(CONFIG_NAND_SPL) && (TEXT_BASE >= 0xc0000000)

#define CONFIG_ENABLE_MMU

#endif

  此处的TEXT_BASE是 0x0000_0000显然是不成立的。


  但是我们还是继续往下分析。


  2).macro


252 /*

253  * MMU Table for SMDK6400

254  */

255 

256     /* form a first-level section entry */

257 .macro FL_SECTION_ENTRY base, ap, d, c, b

258     .word (base << 20) | (ap << 10) |

259           (d << 5) | (1<<4) | (c << 3) | (b << 2) | (1<<1)

260 .endm    //结束宏定义

261 


  先来看看伪指令的格式


MACRO{$label}    macroname    {$parameter1} {$parameter2} ...

//label宏展开时可以替换的符号

//macroname 宏名

//parameter n 宏指令的参数

  这里宏的名字为 FL_SECTION_ENTRY,其实可以看成C语言的 #define


  3)制作映射表


262 .section .mmudata, 'a'

263     .align 14    //按照 2^14 = 16384 对齐,即 0x4000

264     /* the following alignment creates the mmu table at address 0x4000. */

265     .globl mmu_table

266 mmu_table:

267     .set __base, 0  //赋值为 0

268     /* 1:1 mapping for debugging */

269     .rept 0xA00    //重复次数 0xA00 = 2560

270     FL_SECTION_ENTRY __base, 3, 0, 0, 0

    //代入公式得 FL_SECTION_ENTRY(起始) = (0b11 << 10) | (0b1 << 4) | (0b1 << 1)

                        =  0x0000_4000(对齐后)

271     .set __base, __base + 1

    //每一次 __base + 1 之后, FL_SECTION_ENTRY + 0x0010_0000 ,即 1MB 

    //所以此次制表范围是 2560MB

    //从 0x0000_4000 ~ 0x9FF0_4000

272     .endr

273 


  不可访问的区域,全部置为 0


274     /* access is not allowed. */

275     .rept 0xC00 - 0xA00  //重复次数 0x200 = 512

276     .word 0x00000000    //从0x9FF0_4000 ~ 0xBFF0_4000

277     .endr

278 

  映射SDRAM


279     /* 128MB for SDRAM 0xC0000000 -> 0x50000000 */

    //这里为128MB,在实际使用中应该为256MB

280     .set __base, 0x500

281     .rept 0xC80 - 0xC00  //重复次数 0x80 = 128

    //为256MB时应更改为 0xD00 - 0xC00 

282     FL_SECTION_ENTRY __base, 3, 0, 1, 1

    //代入公式得  FL_SECTION_ENTRY(起始) = 0xBFF0_4000

    //此次制表范围 128MB

    //从 0xBFF0_4000 ~ 0xC7F0_4000

283     .set __base, __base + 1

284     .endr

285 


  不可访问区域,置为0


286     /* access is not allowed. */

287     .rept 0x1000 - 0xc80  //重复次数 0x380 = 896

288     .word 0x00000000    //从0xC7F04000 ~ 0xFFF0_4000

289 .endr   

290#endif

  分析方法就是这样,虽然计算的地址可能有错,但是大概意思已经讲清楚了。


  今天就写到这里了。


[1] [2]
关键字:S3C6410  uboot 引用地址:S3C6410之uboot回炉再造(3)lowlevle_init.S

上一篇:S3C6410之uboot回炉再造(4)使能MMU
下一篇:S3C6410之uboot回炉再造(1)start.S - SVC模式设置

推荐阅读最新更新时间:2024-11-02 19:11

AT90S8515单片机SPI驱动74LS595源程序
AT90S8515使用SPI驱动74LS595。 我这里使用了SS口线PB.4,作为74LS595的锁存信号,关键是把PB.4设置为输出。 74LS595驱动发光管显示加1计数,我用SPI最高速度,所以显示16位计数高八位,低八位太快,看不清楚。 单片机源程序如下: //ICC-AVR application builder : 2020/3/30 22:23:31 // Target : 8515 // Crystal: 8.0000Mhz #include io8515v.h #include macros.h #define SS_ON PORTB |= BIT(4); //E置1 #define SS
[单片机]
AT90<font color='red'>S</font>8515单片机SPI驱动74LS595源程序
基于S3C241OX微处理器和MC39i模块实现无线数据传输系统的设计
1 系统硬件平台设计与实现 1.1 终端硬件平台总体介绍 本文的终端平台的无线接入模块采用西门子最新推出的 MC39i模块,并以 32位基于ARM920T的微处理器S3C241OX为核心。按照功能分类,本文所实现的硬件平台主要由微处理器单元、存储器单元、串口通讯单元、USB接口单元、电源单元、GPRS通讯模块单元以及JTAG接口单元组成,硬件总框图如图 1所示。 图1终端硬件系统总框图 1.2 嵌入式微处理器单元 本文硬件平台的 CPU采用的 Samsung的基于ARM920T内核的 S3C2410X微处理器,该微处理器是 Samsung公司为手持设备和一般类型应用提供一种低价格、低功耗、高性能小型微控制器的解决方案。S3C2
[单片机]
基于<font color='red'>S</font>3C241OX微处理器和MC39i模块实现无线数据传输系统的设计
三星Galaxy S21 Ultra了被曝运行Android 12系统跑分
据外媒 SamMobile 消息,三星 Galaxy S21 Ultra 5G 手机的一条跑分信息出现在 Geekbench 5 网站,值得注意的是,手机运行的是 Android 12 系统。目前三星最新的 One UI 4.0 系统基于 Android 11 内核,而三星也没有 Android 12 预览版放出。   这款手机搭载高通骁龙 888 SoC,12GB 内存,单核成绩 1122 分,多核成绩 3469 分,属于同款 SoC 中发挥较好的成绩。   IT之家了解到,目前已经有一加、realme 等品牌官方,推出了自家的 Android 12 预览版系统。特定机型用户可以抢先下载体验,但官方不建议主力手机进行
[手机便携]
三星Galaxy <font color='red'>S</font>21 Ultra了被曝运行Android 12系统跑分
用下载电缆实现AT89S5X的ISP编程
摘要:下载电缆被广泛应用于电子系统设计与调试过程中。本文介绍它的基本原理和编程控制方法;针对目前单片机的ISP串行编程模式列举实例,简要介绍AT89S5X的串行编程的方法和部分协议,使用VC编程,应用下载电缆实现对AT89S5X系列单片机的ISP编程;文末提出统一下载电缆硬件或软件的设想,并提供可以下载支持多种单片机ISP编程软件的网址。 关键词:下载电缆 串行编程 AT89S5X ISP 引言 随着电子技术的日益发展,芯片的规模越来越大,封装日趋小型化,相应的对系统板级调试困难也在加大。IEEE制定了标准测试端口与边界扫描的标准IEEE std 1149.1,这就是JTAG接口协议。JTAG接口通过TCK、TDI、TDO
[单片机]
vivo Y93s拍照评测:暗光也清晰明亮
元旦将至,新一轮换机热潮渐渐临近。vivo再次瞄准种类丰富、竞争激烈的千元机市场,推出千元新品Y93s,并引起消费者的广泛关注。 vivo Y93s采用了新一代水滴全面屏设计,拥有强劲配置和长续航实力。鉴于vivo领先于行业的拍照技术积累,纵使Y93s定位中低端市场,不少消费者依旧对Y93s的拍照实力充满期待。下面就通过实际测试,来满足大家的好奇心吧! 后置AI双摄,拍照表现符合用户预期 首先需要知道的是,vivo Y93s后置主摄搭载了1300万像素,支持PDAF相位对焦功能,同时加上主要用于景深用途的200万像素副摄,配以AI技术,实现了旗舰级的人像背景虚化功能。所以,有了这些硬件基础与后期软件调教算法之后,Y9
[手机便携]
stm8s开发(八) IIC的使用:IIC主机通信!
  前面讲过两个常用的串口,UART和SPI,这次这次讲解一下另一个常用的串口:IIC(I2C)通信   科普IIC:一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。   通信过程:   主模式时,IIC接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。起始条件和停止条件都是在主模式下由软件控制产生。   从模式时,IIC接口能识别它自己的地址(7位或10位)和广播呼叫地址。软件能够控制开启或禁止广播呼叫地址的识别。   数据和地址按8位/字节进行传输,高位在前。跟在
[单片机]
stm8<font color='red'>s</font>开发(八) IIC的使用:IIC主机通信!
射频脉冲S参数的测量
RF矢量网络分析仪是准确表征S参数的主要工具。矢量网络分析仪测试微波组件,提供了精确测量幅度和相位反应。对于许多设备,连续波(CW)的激励/响应配置是足够的。然而,许多射频和微波放大器用于商业和航空航天,/国防应用程序需要使用脉冲射频激励测试。本应用重点介绍新的脉冲式RF S参数测量技术和方法。 安捷伦PNA系列微波矢量网络分析仪。本应用讨论的两个检测的常用技术的优点和缺点使用宽带和窄带检测,比较和对比PNA系列网络分析仪(包括PNA-L),前者适合行业标准脉冲S-参数的测量,85108A适合脉冲射频网络分析仪系统。 图1示出了的一个现代的微波系统的例子,在这种情况下,一个雷达系统。这些系统是由许多单独的,这是显而易见的框
[测试测量]
射频脉冲<font color='red'>S</font>参数的测量
uboot理解
make---》定义系统结构---》定义主机操作系统类型---》定义执行shell脚本的shell---》 make XXX_config ---》执行顶层目录的mkconfig(是一个脚本) mkconfig这个脚本做了3件事情:1.建立软连接 2.创建include/configs.mk 3.创建include/config.h 1.软连接中连接了a:arm通用的头文件 b:特定cpu用的头文件 c:cpu用的特殊文件(结构体,汇编函数...) 2.include/config.mk文件中包含了: ARCH CPU BOARD VENDOR SOC 等 3.include/config.h中包含一些通用的头文件:config_
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved