uboot是c语言还是汇编,看看uboot是怎么安排代码的。

本文详细解析了U-Boot中针对CPU ARM920T的代码组织,包括CPU初始化、中断处理、异常处理、缓存操作等关键函数。同时介绍了板级设置,如定时器、I2C、UART、SDRAM和Flash的初始化。移植U-Boot时,需关注CPU架构设置、外围设备驱动和板级参数调整。此外,还提及了CMD功能实现、网络协议和文件系统的部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看看uboot是怎么安排代码的。

/CPU/ARM920T/

顾名思义,CPU架构相关的函数。

怎么样的函数才算是架构相关呢?看看具体代码都有些什么东

西。

以下以 三星的 s3c2440A 为对象,因为我用的板子就是这个

,没有办法,先学懂了再说。

1)先看cpu.c

static unsigned long read_p15_c1 (void)

读取p15的c1,p15是协处理器

有read,就肯定有 write

static void write_p15_c1 (unsigned long value)

参数和返回值都是 unsigned long,32位的,和 unsigned

int 一样。

int cpu_init (void)

初始化cpu,其实就是初始化 FIQ 和 IRQ 堆栈,为什么要在

这里做呢?搞不清楚,堆栈的设置应该属于C环境初始化的时

候做的,也就是crt0的任务,不知道放到这里,不可能是因为

架构不同的原因,因为这个目录本身就包含了 start.S启动文

件。

int cleanup_before_linux (void)

关缓存等,准备linux需要的环境,因为也是cp15协寄存器的

操作,所以也放在这里了。

int do_reset (cmd_tbl_t *cmdtp, int flag, int argc,

char *argv[])

复位,CPU复位

void icache_enable (void)

void icache_disable (void)

指令缓存的使能和失能

void dcache_enable (void)

void dcache_disable (void)

int dcache_status (void)

数据缓存的使能操作。因为主要都是访问cp15的操作,所以放

到这里。

2) interrupt.c

void enable_interrupts (void)

int disable_interrupts (void)

使能和禁止中断,这主要是操作CPSR的I和F位

void show_regs (struct pt_regs *regs)

显示寄存器,调试用,死机前显示一下具体情况

void do_undefined_instruction (struct pt_regs

*pt_regs)

等等,这里就是各个异常(exception)的处理句柄,可以看

出,基本上都没有实际处理,有错误就直接panic了,嘿嘿。

只是fiq的处理句柄有做了,计数器清零,本来就只是用了

timer用来计数,提供一个时钟而已,没有过多的使用。

3) /s3c24x0/Interrupt.c

这个是 timer的真正的处理函数,初始化timer,读,reset等

操作都在这里做。

i2c.c

又搞不懂,为啥i2c操作函数要在这里做,虽然说是CPU核心的

一个外围,这样说的话很多外围啊。

serial.c

顾名思义,uart口的处理函数,初始化等,主要提供2个函数

,putc 和 getc,这两个可是最基础的串口处理函数,之后实

现的tty,printf重定向到串口等,说白了,最后调用的都是

这两个函数,这让我想起了 newlib,外部提供这两个函数,

那么内部的流就可以重定向了。

speed.c

得到 PCLK,HCLK,FCLK的几个函数,这个可是比较重要,也是

修改重点,毕竟CPU的频率设置对了,才能正常工作,例如

uart口。

usb_ohci.c

USB的主机驱动,USB还没有学,这个pass

所以说,本目录基本就是移植的重点修改的地方,其实说白了

,就是一个芯片的初始化工作,这个必须做好,做了3年单片

机了,而且是汇编,对这个的重要性非常清楚。

再看 /board/smdk2440

这个就可以说是板级设置,为什么要这样?其实很好理解,例

如刚才说的timer中断,cp15等,这个是属于cpu本身的功能,

所以是一个架构的问题,不同的ARM9cpu对应的设置可能不同

,但是同一个arm9cpu,无论你外围电路怎么布局,都不会影

响cp15的设置的。但是board目录主要放的是板级布线影响的

要素,举个例子,网卡,网卡芯片挂在s3c2440的哪个bank上

面,直接影响的是cpu对网卡的访问地址,又例如flash,这个

是板决定的,我可以用nand flash也可以用nor,可以2M,也

可以 64M,这个东东就是由设计板的决定的,所以这个目录就

是重点设置这些和开发板相关的。

lowlevel_init.S

SDRAM的参数设置,SDRAM好歹也算是一个外设,所以根据布板

和用料的不同,这些参数也不同,所以就放在这里了。

smdk2410.c

其实就一个板子的初始化函数,初始化IO,设置timer,设置

boot parameter的位置,注册板子的类型,这个比较重要,因

为是和linux内核是相关的。开icache和dcache等。

flash.c

提供了几个函数,包括写,初始化,擦除等,纯粹是操作

NORflash,所以相当的简单。

也就是说移植的思路:

拿到一个CPU,先确定这个CPU是什么架构,是ARM7TDMI还是

920T,确定好之后就修改CPU的设置,主要是步骤,修改

start.S文件,让系统先做好启动工作,修改时钟分频倍频,

让所有外围器件都正常,修改UART,让串口正常输出,修改

timer处理函数,让驱动整个系统跑的tick正常。

然后就修改板级参数。

看看自己的开发板是什么样子的,仔细阅读电路图,搞清楚外

围器件和CPU是怎么连接的。

再来看看 common目录

一大堆 CMD开头的文件,其实这些就是具体的功能实现函数,

这部分基本和移植没什么关系,因为都是工作在虚拟层的,纯

粹的C语言。研究某些功能怎么实现的话,就要慢慢钻研这个

目录下面的东西了。

/driver 目录

移植用到的,估计就只有nand部分的代码了,本来就是从

linux内核里面的程序,去掉一些linux调用,然后匹配一下裸

奔,就得出了这部分程序驱动了。网卡驱动也在这个目录下面

,可以关注一下。

/net

网络协议的实现,以后再研究,同样了,是工作在虚拟层的,

所以基本上不需要修改什么,只要底层的网卡驱动能正常就OK

了。

/fs

文件系统处理代码,以后再看 .... 毕竟uboot用来启动,貌

似不怎么需要访问文件系统,当然,这也有些思路,有一些想

法......

/lib_arm

一些汇编代码都是一些库函数,本来C编译器就提供了乘除等

库函数了,为啥要单独出来搞呢

armlinux.c

就是启动linux的相关代码,放到这里代表的是公用,也就是

说跟下级的任何cpu和任何平台无关了,只是一般性怎么去启

动这个linux。

好了,就扯这么多了。

Etual

2009-7-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值