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

s3c6410 uboot代码分析

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

芯片厂商的datasheet,如下:


看倒数第二行,告诉你DM9000的物理网卡地址寄存器叫PAR,地址是10h-15h 6个字节用于保存MAC地址

那么我们下面就把我们的物理网卡地址写到这个寄存器里面来吧,使用294行的函数(注意我们已经开启MMU了,不能

不能直接访问内存和IO内存了)。DM9000_iow的函数实现体如下图所示:


DM9000_outb是个宏,向IO内存中写入值,例如DM9000_outb(reg,DM9000_IO)的含义是把reg的值写入DM9000_IO这个寄存器

那么DM9000_IO和DM9000_DATA的值是多少呢?即你现在需要具备以下的分析过程:

我们想让DM9000网卡能用,就必须接到板子上

不是随便接的,因为你需要能够控制DM9000的寄存器才能通过软件控制它

那么你又要想如何才能操作到DM9000网卡的寄存器?

操作DM9000网卡寄存器就有对它的读和写,必须通过总线访问到DM9000网卡寄存器的数据地址

访问数据地址必须通过CPU的内存映射(CPU访问外设的地址空间)

所以,最终我们得让CPU和DM9000连接,把DM9000接到CPU能访问的地址空间上

我们如何知道连接上了呢?得看DM9000网卡的连接原理图,如下:


看上面的图,有一个叫NET_ncs的引脚,它就是访问片选引脚,它接到了CPU的CS1上,这张图写的是CS#

CS#代表什么意思?幸好我是知道接到CS1上的,这个‘#’应该是硬件工程师的失误了吧

不管怎么样,你要知道接到s3c6410cpu的CS1引脚上是什么意思,代表cpu可以通过这个地址来访问DM9000哦

接下来我们看一下,CS1的值是多少,即什么地址可以访问到DM9000,查看s3c6410 datasheet:


看图中红线部分,原来接NET_nCS接到了s3c6410的SRAM1上,即CS1上,地址是0x18000000

好了,回到DM9000_iow函数继续分析,我们定义DM9000_IO和DM9000_DATA的值,如下图所示:


不难看出,DM9000_IO的值是0x18000300

?,为什么不是0x18000000呢?因为DM9000网卡采用pakeage机制,访问DM9000的内部寄存器被映射到了

CS1+0x300偏移地址处,DM9000_DATA寄存器的地址是DM9000_IO的值+4(都是32位)

DM9000_outb(reg, DM9000_IO);
DM9000_outb(value, DM9000_DATA);

上面两行代码应该知道什么意思了吧,第一行是指定往DM9000网卡的哪一个地址写,reg是0x10,即是用于存储
MAC地址的DM9000内部PAR寄存器,那么DM9000_outb(reg, DM9000_IO)相当于说要向

0x18000310地址写入一个字节,DM9000_outb(value, DM9000_DATA)相当于说0x18000310被写入的内容是value

好了,通过eth_set_mac函数的293~294行,我们把MAC地址写入了DM9000的PAR寄存器中

295~296行:向广播地址寄存器中赋值全1;

299~301行:是用于调试的,看能不能从刚才的寄存器中读出我们写入的MAC地址。

网卡分析比较复杂,关键是你要找到IO访问基地址,还要知道DM9000的中断线,因为我们读网卡数据,系统是通过中断的方式

来获得的(linux系统,其他的不能太确定),还有DM9000网卡是数据和地址复用的,通过NET_CMD引脚来控制。我的DM9000

中断引脚接的是EINT7,看上面的DM9000网卡的连接原理图就知道了。

11)一些后续初始化

看下面的真相:


好吧,这个后续初始化工作我们好像都没有定义,等等,除了BOARD_LATE_INIT。不过board_late_init函数里面我什么都没写,

2)main_loop详解

这个挺重要的,因为它是uboot和我们用户交互的接口。让我们一起进去分析吧(代码有点小长哦)

297行:CFG_HUSH_PARSER没有定义,所以会定义全局变量lastcommand[CFG_CBSIZE],CFG_CBSIZE的值为256,用于记录

console buffer size;

304行:我们定义了CONFIG_BOOTDELAY在头文件中,默认是3,我改成了1。后面会定义指针s和int型bootdelay。用于uboot判断

无任何按键按下,就执行CONFIG_BOOTCOMMAND宏所对应的命令,这个命令通常用于加载启动操作系统;

308行:CONFIG_PREBOOT宏没有定义,不管;

311行:CONFIG_BOOTCOUNT_LIMIT没有定义,不管;

318行:没有定义CONFIG_VFD,所以也不管,但我后面会加上这个宏,因为我想在启动的时候在我的LCD上显示我的LOGO;

329行:CONFIG_BOOTCOUNT_LIMIT没有定义,不管;

339行:CONFIG_MODEM_SUPPORT没有定义,不管;

350行:CONFIG_VERSION_VARIABLE没有定义,不管;

。。。再没有定义的就不贴了,直接找我们定义的看;

362行:其实CONFIG_AUTO_COMPLETE宏我也没有定义,但是这个东西挺好用的,可以帮助我们自动补齐命令

390行:我们定义了CONFIG_BOOTDELAY,所以391行s的值将保存bootdelay环境变量的值得地址,392行把地址的值给bootdelay

408行:s保存bootcmd等于号后面字符串的地址;

412行:

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

网站地图

Top