看看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