文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>看看uboot是怎么安排代码的。

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

时间:2009-07-01  来源:Etual

  看看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
相关阅读 更多 +
排行榜 更多 +
油罐车运输模拟

油罐车运输模拟

赛车竞速 下载
模拟逃兵

模拟逃兵

赛车竞速 下载
项目赛车

项目赛车

赛车竞速 下载