s3c6410 uboot代码分析
,这个函数是真正匹配getenv传递进去的ipaddr参数的,里面使用while循环
去找环境变量中的‘=’号前面的是否有ipaddr字符串,有则返回ipaddr在环境变量中的索引,比如ipaddr=“。。。”\0这个字符串
被放在default_environment[1]中,则返回这个索引值1。
getenv的509行返回这个索引所在的环境环境变量的地址,即return ( ((uchar *)(gd->env_addr + index)) )。
我们返回getenv_IPaddr函数,执行return (string_to_ip(getenv(var))),把上面返回的地址所在的字符串(IP)转化为int类型的数据
保存在gd->bd->bi_ip_addr中。
390~403:MAC地址初始化
和上面的IP初始化一样,做着换汤不换药的事情
6)设备列表初始化
start_armboot函数的417行:devices_init ()函数。函数完成的主要功能是把设备放入list列表。这种方法是被推荐的,因为下次在查找
设备的时候会通过这个列表来查询设备,方便统一管理。这个设备列表的接口的个二级指针变量devlist(list_t类型->二级指针)。
下面不贴代码了,因为不难理解。这个函数的169~171行for循环在把标准输入、标准输出、标准错误的名字赋值到stdio_names全局
数组变量中。176行比较关键,是为uboot中的设备建立了list列表,以后增加设备时,可以插入这个list中通过devlist指针。
再往下面是很多宏定义,但是我们都没有定义,只有一个函数会执行,就是drv_system_init ()。这个函数注册了一个设备,设备名是
serial,填充设备的device_t结构体,指明设备的输入和输出设备等,最后使用device_register (&dev),把自己注册到devlist列表中。
7)配置功能函数表
start_armboot函数的423行执行jumptable_init (),为gd-jt全局变量定义了一些独立的函数接口,方便调用。
8)控制台初始化
start_armboot函数的437行执行console_init_r (),设定一个控制台。我们知道,我们的uboot也是有printf之类输出、有命令可以
让我们输入的,所以我们需要定义出一个控制台设备,让我们的输入和输出都指向它,下面看函数:
491行:从devlist设备列表中获得当前devlist中所列举的最大设备个数,我们前面已经对这个接口做过赋值,并配置到devlist中,且
当初设置的值为0,代表第一个设备,那么这里items的值就应该是0了;
493和500行的宏我没有定义,不执行;
507~519行:查找输入输出设备,
511行:定义一个能够代表控制台设备的结构体,并且从devlist中为自己获取一个列表位置,ListGetPtrToItem函数如下图所示:
上面if和else if都没有得到执行,直接执行最后的return
return的值由最下面的define决定,我们看到list->itemList数组其实就是devlist的设备挂载点
我们将会把我们的设备列表都列举到这个数组中
但是需要注意一个问题,list->itemList定义是list->itemlist[1],只是分配了一个字段,如何能存下多个设备列表呢
gnu编译器对标准C做了扩展,支持动态大小的数组定义,所以我想你应该使用gnu编译器来编译uboot
513和516行把这个获得的列表地址赋值给了inputdev和outputdev两个设备指针;
522和528行是真正的给我们的标准输入和标准输入设备填充结构的函数,会把dev地址再赋值给全局结构体stdio_devices
这个结构体是最终记录标准输入输出结构体的;
534行:CFG_CONSOLE_INFO_QUIET宏没有定义,所以会执行下面的代码,我们在启动uboot之后,会打印
In:serial
Out:serial
Error:serial
就是这段代码起的效果;
559行:使用setenv把标准输入输出和标准错误设备变量设置到环境变量中。
9)开中断异常向量表
start_armboot函数的433行执行enable_interrupts,内容如下:
以上代码是内嵌汇编,这个我不解释,因为我前面有文章专门介绍__asm__ __volatile__用法的,作用就是清除cpsr中的
[7]位。这位的含义是中断使能/禁止位,拥有中断最高优先级,这里代码用于开启中断。
10)网卡芯片初始化
我的板子上使用的是DM9000AEP网卡,不是CS8900,所以代码有所改动,增加了对DM9000网卡的初始化支持,这里我调用了
DM9000里的一个函数eth_set_mac,用于初始化网卡芯片,代码如下:
注释写的很好,最起码我们知道这段代码在干什么,首先打印出全局变量gd里面存放的网卡设备的MAC地址,这个值是我们在
板子头文件里面定义的CONFIG_ETHADDR获取的;
293行:在填充MAC地址的值到网卡芯片专门用于保存MAC地址的寄存器当中,所以这里我们定义了DM9000_PAR,它的值是0x10
用于保存MAC地址,为什么是0x10这个地址保存MAC地址,我们当然不知道,得去找DM9000网卡
s3c6410uboot代码分 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)