tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植网卡

      tiny210 板载的网卡芯片是 DM9000A,接在 S5PV210 的 SROM 控制器的 BANK1 上:


S5PV210 的 SROM 控制器支持 8/16 位  NOR  Flash/PROM/SRAM 内存。分为 6 个 bank,每个 bank 寻址空间达 128MB。每个 bank 有一个片选信号 nGCS[5:0],用来选通外接的内存芯片。当发的地址在bank1 的寻址范围类(0x88000000~0x8FFFFFFF)时,表示在访问 bank1,此时 nGCS1 信号被拉低,这就选中了接在 bank1 上的 DM9000A 网卡芯片。S5PV210 手册给出了每个 bank 的地址空间:


当对某个地址进行读操作时, S5PV210 的 Xm0OEn 信号被自动拉低,这个信号引脚接在 DM9000A 的nIOR 上,这就对 DM9000A 进行了读使能,可以从 DM9000A 读数据;当对某个地址进行写操作时,S5PV210 的 Xm0WEn 信号被自动拉低,这个信号引脚接在 DM9000A 的 nIOW 上,这就对 DM9000A进行了写使能,可以向 DM9000A 写数据。DM9000A 的 16 根数据线全部接在 S5PV210 的数据线上。DM9000A 包含一系列可被访问的控制状态寄存器,这些寄存器是字节对齐的,他们在硬件或软件复位时被设置成初始值。DM9000A 有 2 个端口:DATA 和 INDEX(即地址) 。DM9000A 的地址和数据线复用, 当 CMD 引脚为低电平时,操作的是 INDEX 端口,当 CMD 引脚为高电平时操作的是 DATA 端口。CMD 引脚接在 S5PV210 的地址线 Xm0ADDR2 上。

假设要读取 DM9000A 的寄存器 RSR(RX Status Register),需要分 2 步:
     1)  向 INDEX 端口写入 RSR 寄存器的地址(0x06)条件: nGCS1 信号拉低、 Xm0WEn 信号拉低、 Xm0ADDR2 拉低, 或者说向下面的地址写数据 0x06(0x88000000~0x8FFFFFFF)&    ~(1 << 2)
    2)  从 DATA 端口读取 RSR 寄存器的值
        条件:nGCS1 信号拉低、Xm0OEn 信号拉低、Xm0ADDR2 拉高,或者说从下面的地址读数据
(0x88000000~0x8FFFFFFF)|   (1 << 2)


假设要向 DM9000A 的寄存器 TCR(TX Control Register)写数据 0x56,同样需要 2 步
       1)  向 INDEX 端口写入 TCR 寄存器的地址(0x02)
         条件: nGCS1 信号拉低、 Xm0WEn 信号拉低、 Xm0ADDR2 拉低, 或者说向下面的地址写数据 0x02
(0x88000000~0x8FFFFFFF)&   ~(1 << 2) 
      2)  将要写入的数据(0x56)写入 DATA 端口
        条件: nGCS1 信号拉低、 Xm0WEn 信号拉低、 Xm0ADDR2 拉高,或者说向下面的地址写数据 0x56
(0x88000000~0x8FFFFFFF)|  (1 << 2)
  

有了这些理论知识就可以确定 DM9000A 的基地址了,在后面会用到。

    下面开始移植

首先我们要初始化 S5PV210 的 SROM 控制器,设置相关时序。 针对 SROM 控制器的每一个 bank 只有2 个寄存器:SROM_BW 和 SROM_BC,我要配置的是 bank1,所以只需配置 SROM_BW 和 SROM_BC1在 SROM_BW 寄存器中,我们只关心与 bank1 相关的域:


上面分析过,DM9000A 的 16 根数据线全部接在 S5PV210 的数据线上,所以 DataWidth1 设置为 1DM9000A 的地址是按字节存取的,所以 AddrMode1 设置为 1,通过查看原理图,没有使用 Xm0WAITn和 Xm0BEn 引脚,所以WaitEnable1 和 ByteEnable1 均设置为 0
       SROM_BW[7:4]=0x3
  

  下面分析时序,设置 SROM_BC1 寄存器:



上面 2 个时序图分别为 S5PV210 的 SROM 控制器读时序和 DM9000A 的读时序:
Tacs:地址发出后等多长时间发片选,DM9000A 中 CS 和 CMD(地址)同时发出,所以 Tacs=0ns
Tcos:发出片选信号后等多长时间发出读使能信号(nOW、IOR) ,在 DM9000A 的时序图上对应 T1,
最小为 0,我们稍微设置大点  Tcos=5ns
Tacc:读使能信号持续时间,在 DM9000A 的时序图上对应 T2,我们设置为设置 Tacc=15ns
Tcoh:读使能信号结束后,片选信号保持时间,在 DM9000A 的时序图中对应 T5,所以可以设置
Tcoh=5ns
Tcah:片选结束后,地址保存时间,DM9000A 中片选和地址同时结束,所以 Tcah=0
Tacp:页模式,不管
PMC:页模式,不管 

S5PV210 的 SROM 控制器使用 MSYS 域提供 HCLK 时钟,为 200MHz,一个 clock 为 5ns。

通过跟踪代码进入到 board.c 中的 board_init_r 函数:


   如果定义了 CONFIG_CMD_NET,就调用 eth_initialize(gd->bd)进行网卡初始化。这个宏在config_cmd_default.h 中定义,这个头文件又被单板配置文件 tiny210.h 所包含。

    eth_initialize 函数在 u-boot-2014.04/net/eth.c 中定义:


这里已经有注释,如果定义了单板相关的初始化函数就调用它,否则调用 CPU 相关的初始化函数。我们继续看下__def_eth_init 函数,同样在 u-boot-2014.04/net/eth.c 中定义 


这里用到了 gcc 的弱符号和别名属性,前面分析过。如果我们没有定义自己的 board_eth_init 函数,则 board_eth_init 就和__def_eth_init 相同,调用 board_eth_init 就相当于调用__def_eth_init,现在就能明白上面的 if 判断语句了。board_eth_init 在 u-boot-2014.04/board/samsung/tiny210/tiny210.c 中定义:


这里通过配置宏来决定调用哪个网卡初始化函数, 同时在 smdkv210.c 中还有个函数 smc9115_pre_init这个函数用来设置 SROM 控制器。我们使用的是 DM9000A,我们先查看下 DM9000A 的源码,看下使用哪个初始化函数
u-boot-2014.04/drivers/net/dm9000x.c:


看到这个函数比较像,并且它需要一个 bd_t *类型参数,而 board_eth_init 也传进来一个 bd_t *的参数,因此就调用这个 DM9000A 的初始化函数,在这个函数中 dm9000_get_enetaddr 从 EEPROM 加载MAC 地址,这个函数根据宏 CONFIG_DM9000_NO_SROM 来决定是否从 EEPROM 加载 MAC 地址, tiny210上的 DM9000A 没有接 EEPROM,我们将在 tiny210.h 中定义这个宏,表示不从 EEPROM 加载 MAC地址 。 另外,我们还需要知道如何才能把 DM9000A 的驱动编译进 u-boo.bint ,我们查看u-boot-2014.04/drivers/net/Makefile


从 Makefile 得知,需要定义 CONFIG_DRIVER_DM9000 这个宏。修改 board_eth_init 函数:


同时我们看到在 tiny210.c 中的 board_init 函数还调用了 smc9115 的初始化,我们不需要,把它屏蔽掉,然后仿照实现 dm9000_pre_init 函数,初始化 SROM:



然后在配置文件 tiny210.h 中添加宏 CONFIG_DRIVER_DM9000A,同时屏蔽掉 smc9111 的相关宏:


     没有定义 CONFIG_DM9000A_BASE、DM9000A_DATA 和 DM9000A_IO
     CONFIG_DM9000A_BASE 为 DM9000A 的基地址
     DM9000A_DATA 为 DM9000A 的 DATA 端口地址
     DM9000A_IO 为 DM9000A 的 INDEX 端口地址
     在前面分析过如何确定这些地址。另外,我们还需要添加一些 u-boot 的命令,比如 ping、tftpboot。ping 命令用来检查网络是否通畅,在 tiny210.h 中定义这些宏:


编译u-boot。烧写到sd卡中,启动开发板,先设置ip地址和mac地址,我的是:

tiny210 # setenv ipaddr 192.168.1.30
tiny210 # setenv ethaddr 12:34:56:78:9A:BC

ping自己的主机:


可以ping通。再测试tftp功能,把我们之前的led程序放在tftp服务器目录下:


设置服务器ip地址:

tiny210 # setenv serverip 192.168.1.101

下载tftp文件:


下载成功,我们运行一下这个程序,使用go命令:


运行成功! 这个时候发现我们板子上的四盏led全部都点亮了 。我们网卡移植成功!!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值