微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > s3c6410 uboot代码分析

s3c6410 uboot代码分析

时间:11-09 来源:互联网 点击:

,这个函数是真正匹配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网卡

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top