【uboot移植】基于samsung移植过的uboot(三)

现在网卡还是不能工作的,ping命令如图。本章主要讲dm9000的移植。
在这里插入图片描述

dm9000的原理图和引脚

在这里插入图片描述
在这里插入图片描述
DM9000的CS引脚

CS(chip_select,片选信号);此引脚会接到SROM控制器的某个片选引脚;
s5pv210的SROM控制器有5个bank,每个bank都有一个片选信号CSn(n=0-5);
这里接CSn1,说明DM9000接的是SROM的bank1。由此可知DM9000的总线基地址是0x8800_0000。

DM9000的CMD引脚

DM9000 采用地址数据复用,CPU访问一般存储器时,有地址线、数据线,地址线选中目标,然后数据值写到目标中。
但是对于 DM9000 来说,分两次进行,第一次数据线写 DM9000 的寄存器地址,第二次写寄存器数据。

CMD接到了210的ADDR2引脚上。ADDR2为低,表示16位数据线上发送的是地址,ADDR2为高,表示16位数据线上发送的是数据。因此可以说DM9000只有一根地址线。因此可以确定,DM9000的INDEX端口地址是0x88000000(ADDR2=0),DATA端口的地址是0x88000004(ADDR2=1)。

DM9000的地址端口和数据端口

关于+4的理解,网上的解释 DM9000网卡原理与基地址设置

我自己的理解:
地址总线的高低电平 = 地址线本身的地址 = 地址线要传输的地址;
数据总线的高低电平 = 传输的数据;
DM9000的寄存器地址的本质是管脚上的电平组合(基地址+INDEX),那软件上操作这个地址,CPU就会形成在对应的管脚上形成对应的电平(这也就形成了逻辑上的地址),从而跟DM9000的电平对上了,就能正确寻址,这是地址总线的工作原理;那数据总线的高低电平就直接是数据,DM9000读写就行了。至于DM9000的CMD引脚,只是他管脚上电平组合的需要,CPU满足他就可以了。
其实上面说的电平组合就是物理地址的含义。对于CPU来看是物理地址,对于dm9000来看就只是电平组合而已。
总之,地址总线时传输的是地址,其地址值就是DATA0~15管脚高低电平的组合值;数据总线同理。两者的差异只不过是,CPU给的地址的Bit2被放0或1,这就同时导致了以下几种现象:一、CMD被拉高拉低,这样可以告诉DM9000当前传递的是数据还是地址;二、造成了DM9000的地址端口基地址和数据端口基地址分别为88000000和88000004;三、bit2实际不影响地址或数据的值,因为地址或数据都是16位的(DM9000工作在16位模式下),且表示在其高16位。
在这里插入图片描述

修改代码

一、SROM初始化(网卡预初始化)

这里没有直接去找ERROR打印在哪,而是直接去看dm9000_pre_init这个函数,这个函数并不是初始化dm9000,而是为dm9000与CPU连接的SROM进行初始化,因此叫pre_init。在这里插入图片描述
dm9000_pre_init这个函数对应内核代码mach-xxx.c中的xxx_machine_init函数。其实可以参考着修改。
在这里插入图片描述
SROM_BW_REG寄存器[7:4]写入(1<<7) | (1<<6) | (1<<5) | (1<<4);
SROM_BC1_REG寄存器写入((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));(实测不配置也可以)
MP01CON_REG寄存器[7:4]写入0010;

寄存器具体含义如下:
1、SROM_BW寄存器,设置SROM控制器的总配置
在这里插入图片描述
2、SROM_BCx寄存器,设置各个bank的时序信息
在这里插入图片描述
3、MP0_1CON寄存器,配置SROM控制器的GPIO的片选功能
在这里插入图片描述
二、基地址的配置
由于dm9000内部以300H为基地址,因此在上述的分析中,地址端口和数据端口基地址还得在加上300H(但是实测发现 DM9000网卡原理与基地址设置这篇文章说的对,随便设都可以)。
地址端口=0x88000300
数据端口=0x88000304
在这里插入图片描述
其实这块的配置可以参考内核代码mach-xxx.c中,作为platform_device的dm9000设备硬件描述的资源描述。
在这里插入图片描述

ping命令测试

在这里插入图片描述
测试成功。

DDR地址配置与内核启动

如果这样直接去启动内核还是启动不了。
在这里插入图片描述
回想之前修改DDR配置的地址的时候,由于三星的uboot将SDRAM1起始地址配置到了0x20000000地址处(其主要依赖MEMORY_BASE_ADDRESS这个宏):
在这里插入图片描述
其主要依赖MEMORY_BASE_ADDRESS这个宏,#define MEMORY_BASE_ADDRESS 0x20000000
在这里插入图片描述
而这个宏又牵扯到了这些个宏,特别是内核存放的地址。
1)0x30008000对应需下载kernel到30008000内存地址处?但是搜遍了都没有调用movi_zImage_copy函数(这个函数使用了CFG_PHY_KERNEL_BASE)的地方;
2)或是对应kernel链接脚本中的c0008000?
在这里插入图片描述
在这里插入图片描述
总之,将MEMORY_BASE_ADDRESS改成0x30000000,内核即可启动。至于具体原因还未知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值