从零开始移植U-boot到mini2440(三)——CPU初始化篇

发布者:知识的海洋最新更新时间:2022-06-17 来源: eefocus关键字:移植  U-boot  mini2440  CPU初始化 手机看文章 扫描二维码
随时随地手机看文章

经过前两节的准备,我们现在可以开始肝u-boot的代码了

U-boot版本:2020/5/2

编译环境:Ubuntu 16.04

arm-none-eabi-gcc version 4.9.3 20150529 (prerelease) (15:4.9.3+svn231177-1)

运行环境:mini2440(s3c2440,arm920t)

代码仓库:git@github.com:JingyeLi/u-boot_2440.git

https://github.com/JingyeLi/u-boot_2440/tree/v0.1


u-boot.lds

这是一个很容易被人忽略的一个文件,包括我自己,以前一般用keil的时候都是自动生成的,但其实想要理解一个芯片的启动代码,最好先从lds文件开始(不过在此之前,希望你能对编译-链接-运行有所理解)。众所周知一个程序会分成对应的几段,而lds文件的用途就是规定好这几段会放在什么地方。


而lds的重点是开头的这几句,与程序入口密切相关,程序虽然还是从_start开始,但与老版的u-boot不同,新版的多了__image_copy_start和vectors,__image_copy_start我们放在后面relocate的时候一起理解,这里可以先忽略。


ENTRY(_start)  /* 表明可执行文件代码从_start开始 */

SECTIONS

{

        . = 0x00000000; /* 指定这个段从0x0开始*/

        . = ALIGN(4); /* 4字节对齐,32位指令* /

        .text : /* 具体TEXT段的结构 */

        {

                *(.__image_copy_start) 

                *(.vectors)

                CPUDIR/start.o (.text*)

        }

}


lib/vectors.S

在芯片启动后,会自动执行load 0x0的指令,而在u-boot.lds中,我们知道0x0的位置对应的指令应该就是_start标签所在的地方。找了一圈发现,新版的u-boot将arm的中断向量表都放在lib/vectors.S中。这个文件其实也简单,十分的好理解,找到_start然后发现就是跳到reset


        .macro ARM_VECTORS

        b      reset   /* 这个指令将会保存在_start的地址 */

        ldr     pc, _undefined_instruction

        ldr     pc, _software_interrupt

        ldr     pc, _prefetch_abort

        ldr     pc, _data_abort

        ldr     pc, _not_used

        ldr     pc, _irq

        ldr     pc, _fiq

        .endm

_start:

        ARM_VECTORS


_undefined_instruction: .word undefined_instruction

_software_interrupt: .word software_interrupt

_prefetch_abort: .word prefetch_abort

_data_abort: .word data_abort

_not_used: .word not_used

_irq: .word irq

_fiq: .word fiq


S3C2440初始化 - start.S/lowlevel_init.S

U-boot在0x0会跳转到’reset’ label,而这个label对应在arch/arm/cpu/arm920t的start.S中。

具体代码的分析就不贴了,基本和旧的u-boot版本没什么区别。这里推荐一篇blog,虽然他用到的u-boot版本还是很旧的,但是确实讲得很清楚很好。

https://blog.csdn.net/qq_16933601/article/details/105685770


CPU的初始化分为几步,


设置为特权模式(SVC32)

关闭看门狗

关闭中断

关闭MMU和cache

初始化时钟

初始化SRAM

https://blog.csdn.net/dndxhej/category_9261234.html?spm=1001.2014.3001.5482


不过初始化时钟值得仔细讲一下,一开始移植的时候,执行到某条跳转指令程序就跑飞了,出现data abort或者unhandled exception,百思不得其解,后来就是看到上述那篇博文,找到了思路。


首先我们应该理解ARM的时钟系统。

S3C2440有两个PLL,MPLL用于提供系统时钟,UPLL用于USB模块,而在编程手册上提到一点。

Although the MPLL starts just after a reset, the MPLL output (Mpll) is not used as the system clock until the software

writes valid settings to the MPLLCON register. Before this valid setting, the clock from external crystal or EXTCLK source

will be used as the system clock directly. Even if the user does not want to change the default value of MPLLCON

register, the user should write the same value into MPLLCON register.


对于频率的计算方法,在编程手册上也有,

MPLL = (2 * m * Fin) / (p * 2^s)

m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2

同时还有一个建议,建议最终的频率大于200MHz

FCLKOUT must be bigger than 200MHz (It does not mean that the ARM core has to run more than 200MHz).


而和时钟设置相关的两个寄存器分别是CLKDIVN和MPLLCON


因为刚reset的时候MPLLCON是不生效的,FCLK直接使用晶振时钟,同时manual的下面还有推荐的频率,这里我们就设置MPLL为400MHz方便计算,下面NOTE还提示到要有7个NOP时钟才能生效

MPLLCON = ((0x5c << 12) | (0x01 << 4) | (0x01))

同时CLKDIVN设置为0x5,则得到

FCLK = 400MHz

HCLK = 100MHz

PCLK = 50MHz


所以我们能得到以下初始化时钟代码加在start.S里面:


#  define MPLLCON       0x4C000004      

#  define CLKDIVN       0x4C000014      /* clock divisor register */

#  define S3C2440_MPLL_400MHZ     ((0x5c<<12)|(0x01<<4)|(0x01))

        /* default FCLK is 12 MHz ! */

        ldr     r0, =CLKDIVN

        mov     r1, #0x03                   // FCLK:HCLK:PCLK=1:2:4

        str     r1, [r0]


        mrc     p15, 0, r1, c1, c0, 0           /* 读出控制寄存器 */

        orr     r1, r1, #0xc0000000           /* 设置为“asynchronous bus mode” */

        mcr     p15, 0, r1, c1, c0, 0           /* 写入控制寄存器 */


        /* MPLLCON = S3C2440_MPLL_400MHZ */

        ldr r0, =MPLLCON

        ldr r1, =S3C2440_MPLL_400MHZ

        str r1, [r0]


在控制时钟寄存器设置好后,接下来的初始化步骤就是按上述所讲,就不再多解释了。也可以理解为,当程序执行到_main(start.S的最后一步),CPU就初始化好了,可以正常执行所有功能。


附 uboot调试方法

在bringup CPU的时候,其实出现的问题远比记录在博客上的多,收集了两个在串口没好前的调试方法


AXD

由于uboot是使用命令行Makefile直接编译的,没有使用Keil,不能直接使用JTAG的单步调试,这时我们可以借用AXD,参考:

https://blog.csdn.net/xautfengzi/article/details/6306323


OpenOCD

这是一个功能比JLink更强大的工具

https://blog.csdn.net/qingwufeiyang12346/article/details/45954595


说一下自己的感想,其实自己作为嵌入式工程师工作也有好几年了,突然想搞u-boot的移植并且用博客记录下来,是出于自己的初心,在技术道路上,就是要无限进步。现在网上搜索,都2021年了,大部分人移植还拿着200x年的u-boot在捣鼓,能参考的资料多是没错,但是计算机技术从来就不是守旧主义,我们要理解的是一颗芯片如何bringup,如何从一条条的机器指令到整个系统跑起来,我们要提供什么样的代码,初始化的思路是什么。u-boot作为一个经典的底层开源项目,我们从中能吸取到什么。在招聘面试中,要问的从来不是做了多少项目,而是问怎么去做这个项目。

关键字:移植  U-boot  mini2440  CPU初始化 引用地址:从零开始移植U-boot到mini2440(三)——CPU初始化篇

上一篇:移植uboot到mini2440(一)
下一篇:【嵌入式】从零开始移植U-boot到mini2440(四)——C runtime配置篇

推荐阅读最新更新时间:2024-11-13 10:24

stm32f429的u-boot、uclinux内核烧写说明
最近比较忙,针对前面的留言说有怎么download u-boot、uclinux到stm32,我翻了翻以前记录下的笔记,特意贴上来,其实有些步骤我都已经忘记了。。。 一、搭建嵌入式linux开发环境 1. 准备一台Linux系统(Fedora,CentOS,Ubuntu等)的电脑,将BSP压缩包(linux-cortexm-2.0.0.tar.gz)拷贝到一个目录; 2. 解压BSP包: tar -xzvf linux-cortexm-2.0.0.tar.gz 3. 解压arm工具链: cd linux-cortexm-2.0.0/tools tar xvfj arm-2010q1-189-arm-uc
[单片机]
stm32f429的<font color='red'>u-boot</font>、uclinux内核烧写说明
linux 2.6.32.2 mini2440平台移植--内核移植、yaffs2文件系统移植
1.1 获取Linux内核源代码 有很多方式可以获取Linux内核源代码,如果你的linux平台可以上互联网,可以直接在命令行输入以下命令获取到Linux-2.6.32.2: #wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz 当然你也可以先在Windows系统下使用迅雷等工具下载完,再复制到linux中。 1.2 解压内核源代码 假定我们刚才把内核源代码下载到了/root/mini2440目录,执行以下解压命 令: #cd /opt/FriendlyARM/mini2440 #tar xvzf linux-
[单片机]
Linux-2.6.32.2内核在mini2440上的移植(八)---添加ADC驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 【1】关于S3C2440 的ADC 和触摸屏接口 在 S3C2440 芯片中,AD
[单片机]
Linux-2.6.32.2内核在<font color='red'>mini2440</font>上的<font color='red'>移植</font>(八)---添加ADC驱动
Linux-4.9.2内核在mini2440上的移植(二)Ubuntu编译环境搭建(下)
2.1安装arm-linux-编译器 编译器在ubuntu环境下可以使用apt命令自动安装,也可以下载独立的安装包手动安装,这两种安装方式都可以实现内核编译,不同版本的arm-linux-gcc可以在系统中共存。本文会介绍这两种安装方法。任一种编译器都能编译内核,推荐使用第一种方法。 这里我们规定一下,所有的命令前的“#”表示使用root权限执行,登录系统后使用sudo -i切换为root权限,#后面的内容是实际指令,复制粘贴到putty中执行即可。 (1)自动安装编译器 ~# apt-get install gcc-arm-linux-gnueabihf 安装完成后,查看是否安装成功 ~#arm-linux-
[单片机]
Linux-4.9.2内核在<font color='red'>mini2440</font>上的<font color='red'>移植</font>(二)Ubuntu编译环境搭建(下)
U-boot 在 mini2440-S3C2440 上的移植(4):U-boot第二阶段代码:修改初始化代码
编译U-boot给mini2440时,要编译出能在ARM平台上使用的可执行文件-bin,首先要在ubuntu 中安装交叉编译工具链,因为我使用的是友善之臂的开发板,所以我使用的已经制作好的工具链,当然也可以自己制作工具链:如基于GCC和glibc制作工具链,可以使用cross tools编译; 我使用的工具链的版本是arm-linux-gcc-4.3.3版本,下载地址:下载地址 1.在pc端下载好以后,将压缩包用xftp传输到Ubuntu;当然也可以用其他软件上传;上传后把它放在根目录下的/usr/local文件夹中新建一个arm文件夹,然后把压缩包复制到这个文件夹;注意先建好文件夹再上传,可以减少很多工作量; 一定要上传压缩包,
[单片机]
<font color='red'>U-boot</font> 在 mini2440-S3C2440 上的<font color='red'>移植</font>(4):<font color='red'>U-boot</font>第二阶段代码:修改<font color='red'>初始化</font>代码
基于ARM的嵌入式Linux移植真实体验(5)――应用实例
应用实例的编写实际上已经不属于Linux操作系统移植的范畴,但是为了保证本系列文章的完整性,这里提供一系列针对嵌入式Linux开发应用程序的实例。 编写Linux应用程序要用到如下工具: (1)编译器:GCC GCC是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:gcc 。 我们应该使用arm-linux-gcc。 (2)调试器:GDB gdb是一个用来调试C和C++程序的强力调试器,我们能通过它进行一系列调试工作,包括设置断点、观查变量、单步等。 我们应该使用arm-linux-gdb。 (3)Make GNU Make的主要工作是读进一个文本文件,称为makefile。这个文件记
[单片机]
mini2440按键驱动程序分析
先说明一下按键与S3C2440芯片的连接方式: KEY1 ---- EINT8 ---- GPG0 KEY2 ---- EINT11 ---- GPG3 KEY3 ---- EINT13 ---- GPG5 KEY4 ---- EINT14 ---- GPG6 KEY5 ---- EINT15 ---- GPG7 KEY6 ---- EINT19 ---- GPG11 驱动程序源码如下: (drivers/char/mini2440_buttons.c) #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux
[单片机]
Ubuntu下移植内核到OK6410开发板
环境:Win7+virsualBox+ubuntu12.04+ok6410开发板 一,下载源码:我这里下载的版本是--linux-3.12.7 http://www.kernel.org/ 二,解压内核: tar -xvf linux-3.12.7-tar.xz 三,更改权限(最好赋予全部权限) sudo chmod -R 777 linux-3.12.7/* 四,修改源码(针对基于smdk6410架构的ok6410开发板) 1,在arch/arm/mach-s3c64xx/目录下的mach-smdk6410.c 复制一份在当前文件下命名为mach-ok6410.c wu@wu-VirtualBox:/opt
[单片机]
Ubuntu下<font color='red'>移植</font>内核到OK6410开发板
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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