在zynq开发板zc706上,网络通路由下面三个设备组成:

其中zynq负责对phy进行配置,当zynq上的网络控制器以及phy完成正确配置时,能够看到RJ45上面的黄灯亮,此时表明链路已经通了。如果u-boot中已经设置了IP地址,通过网线就可以ping通电脑,此时会打印host alive这句话。

但是如果板子不是这样做的,比如是下面这种方式:

这里用到了BCM5396网络交换芯片,此时要保证网络链路通就需要对5396和两个PHY进行配置。幸运地是,PHY0由5396进行配置,当我们对5396进行正确配置后,PHY0也就配置完成了,PHY1的配置还是老样子。整个配置可以分为两步走,首先通过SPI总线配置5396,再配置PHY1,完成全部配置后,就能看到RJ45上面的黄灯亮起。

u-boot中需要修改的代码主要涉及三个地方

1、 arch/arm/lib/Board.c

其中board_init_r函数中需要在网络驱动配置前加入配置bcm5396的函数调用,这里我放在了串口驱动配置之后运行。

void board_init_r(gd_t *id, ulong dest_addr)

{

ulong malloc_start;

#if !defined(CONFIG_SYS_NO_FLASH)

ulong flash_size;

#endif

gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */

bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_R, "board_init_r");

monitor_flash_len = _end_ofs;

/* Enable caches */

enable_caches();

debug("monitor flash len: %08lX\n", monitor_flash_len);

board_init(); /* Setup chipselects */

/*

* TODO: printing of the clock inforamtion of the board is now

* implemented as part of bdinfo command. Currently only support for

* davinci SOC's is added. Remove this check once all the board

* implement this.

*/

#ifdef CONFIG_CLOCKS

set_cpu_clk_info(); /* Setup clock information */

#endif

serial_initialize();

myspi_init(); /*init bcm5396*/

printf("Now running in RAM - U-Boot at: %08lx\n", dest_addr);

#ifdef CONFIG_LOGBUFFER

2、 net/Eth.c

在其中加入配置bcm5396的代码

void myspi_init()

{

XSpiPs Spi;

int i32Option,status;

int i;

unsigned char workBuf[10];

workBuf[0]=0xf0;

workBuf[1]=0x1;

g_SpiConfig = &XSpiPs_ConfigTable[0];

//Initialize the SPI device.

Spi.IsBusy = 0;

Spi.Config.BaseAddress = g_SpiConfig->BaseAddress;

//Spi.StatusHandler = StubStatusHandler;

Spi.SendBufferPtr = NULL;

Spi.RecvBufferPtr = NULL;

Spi.RequestedBytes = 0;

Spi.RemainingBytes = 0;

Spi.IsReady = 0x11111111;

XSpiPs_WriteReg(Spi.Config.BaseAddress,0,0x00020000);

//Initialize the SPI device. end

i32Option = 0x1 | 0x2 | 0x4 | 0x10;

Spi_SetOptions(&Spi, i32Option);

XSpiPs_SetSlaveSelect(&Spi,1 );

XSpiPs_SetClkPrescaler(&Spi, 6 );

workBuf[0]=0xf0;

workBuf[1]=0x1;

workBuf[2]=0;

for(i=0x10;i<=0x1f;i++)

{

status = writeBCM5396(&Spi, i, 0x20, workBuf );

}

printf("*****************Read SPI Reg of 5396******************\r\n");

printf("---BMC Status Registers(PAGE 0x10-0x1F)---\n");

for(i=0x10;i<=0x1f;i++)

{

status = readBCM5396(&Spi, i, 0x28, workBuf );

printf("port=%d,offset=0x28,data=0x%x\n",(i-0x10),workBuf[2]);

printf("port=%d,offset=0x29,data=0x%x\n",(i-0x10),workBuf[3]);

}

printf("---BMC Status Registers(PAGE 0x10-0x1F)---\n\r");

for(i=0x10;i<=0x1f;i++)

{

status = readBCM5396(&Spi, i, 0x20, workBuf );

printf("port=%d,offset=0x20,data=0x%x\n\r",(i-0x10),workBuf[2]);

printf("port=%d,offset=0x21,data=0x%x\n\r",(i-0x10),workBuf[3]);

}

}

3、 drivers/net/Zynq_gem.c

这里的修改是可选项,主要是配置phy,我这里使用的是marvell的88E1111,u-boot中提供的配置方法不起效,于是进行了手动配置。加了phy_detect和negotiat函数

static void phy_negotiat(struct eth_device *dev)

{

struct zynq_gem_priv *priv = dev->priv;

u16 control;

u16 status;

u16 temp;

u16 timeout_counter=0;

printf("Start PHY autonegotiation.\n");

phywrite(dev,priv->phyaddr, 22, 2);

phyread(dev, priv->phyaddr, 21, &control);

control |= 0x0030;

phywrite(dev, priv->phyaddr, 21, control);

phywrite(dev, priv->phyaddr, 22, 0);

zc706开发板的linux移植,Zynq—Linux移植学习笔记(十)相关推荐

  1. zc706开发板的linux开发,第一篇:zc706 开箱及开发环境搭建

    第一篇:zc706开箱及开发环境搭建 1.拿到zc706时的封装箱子,从该工具箱中打开后,将看到内含的器件: 2.其中zc706评估板具体各部分说明如下: 在拿到开发板后,默认开发板上的拨码开关以及跳 ...

  2. 基于迅为2K1000开发板龙芯处理器安装 Linux系统到固态硬盘

    基于迅为2K1000开发板龙芯处理器安装 Linux系统到固态硬盘 硬件:迅为2K1000开发板 固态硬盘 LS2K1000 龙芯处理器支持 SATA 接口,所以在迅为开发板的底板板载了一个 M2 接 ...

  3. Mastering Embedded Linux Programming 学习 (三)在百问网157开发板上,编译构建linux内核

    Mastering Embedded Linux Programming 学习 (三)在百问网157开发板上,编译构建linux内核 一.下载内核源码 wget http://ftp.sjtu.edu ...

  4. 5、赛灵思-Zynq UltraScale+ MPSoC学习笔记:Petalinux 的设计流程及定制Linux系统

    5.赛灵思-Zynq UltraScale+ MPSoC学习笔记:Petalinux 的设计流程及定制Linux系统 声明:本文是学习赛灵思 Zynq UltraScale+ MPSoC 5EV过程中 ...

  5. ZC706开发板SI5324配置

    ZC706开发板上的SI5324需要通过I2C配置,官网找了一圈,只有VC709和KC705的例程,都是基于MICROBLAZE的,改到ZC706上问题也不大,准备动手这际,转念一想,何不去看一下ZC ...

  6. 【GD32F427开发板试用】RT-THREAD标准版 移植使用

    本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:打盹的消防车 前言: 无意在微信看到了GD做活动,想到了第一时间体验一下,搭配RT-TH ...

  7. 《鸟哥的Linux私房菜》个人学习笔记-第一篇

    <鸟哥的Linux私房菜>个人学习笔记-基础篇 这是一篇一个linux菜鸡自学的笔记 csdn上的各位大手子们好,本人实习生一枚最近想自己深入学习下linux,所以在社区里发博客,希望能记 ...

  8. 在Android开发板跑一个LED驱动的历程(个人笔记)

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) 在Android开发板跑一个LED驱动的历程(个人笔记) 1. 板子端, 放置驱动程序 1.1 编写一个驱动程序 驱动程序的编写上, ...

  9. Linux内核设计与实现学习笔记目录

    **注:**这是别人的笔记,我只是把目录抄过来 <Linux内核设计与实现学习笔记> 1.<Linux内核设计与实现>读书笔记(一)-内核简介 2.<Linux内核设计与 ...

  10. 《Linux高性能服务器编程》学习笔记

    <Linux高性能服务器编程>学习笔记 Linux高性能服务器编程 TCP/IP协议族 TCP/IP协议族体系结构以及主要协议 数据链路层 网络层 传输层 应用层 封装 分用 测试网络 A ...

最新文章

  1. jdk5.0新特性—— 枚举
  2. CSS深入理解流体特性和BFC特性下多栏自适应布局
  3. 微信适配国产操作系统:原生支持 Linux
  4. 爱思助手短信备份到安卓_爱思助手肿么将短信导入iphone
  5. java 快速构建ssm项目_SSM快速搭建
  6. Bioconductor软件安装与升级
  7. 算法题 20 或与加
  8. 构建一个基本的Python迭代器
  9. HeadFirstJava学习心得——网络编程
  10. 各大厂面试云集的《520道LeetCode题Java版答案》
  11. 《深入J2SDK》 总结
  12. uniapp——ios端和android端微信分享,通过打开appStore和应用宝商店下载
  13. 【AI创造营】鬼畜小视频
  14. N4 DVWA CSRF(跨站请求伪造)
  15. IP SSL证书购买方式
  16. 陕师大计算机好就业吗,陕师大是好学校吗?陕师大出来好不好就业?
  17. Flink事件时间、水印以及迟到数据处理的个人理解
  18. 地平线检测horizon line detection
  19. 海外休闲游戏的网络连接方案
  20. 为什么使用聚乙烯醇胶水消泡剂

热门文章

  1. 云小课 | 网站接入WAF失败怎么办?看这里就够了
  2. 解密昇腾AI处理器--DaVinci架构(存储系统)
  3. k 近邻算法解决字体反爬手段|效果非常好
  4. 搞清楚一道关于Integer的面试题
  5. python原类、类的创建过程与方法
  6. mysql empty table_【MySQL】 empty table and delete table.
  7. ibm db2获取目标时间与当前时间的差值_【学术论文】高帧频视觉实时目标检测系统...
  8. gui界面如何和内核链接 python_专栏 | 除了内核程序,Abaqus还能这样做二次开发...
  9. php登录后自动退出登录,PHP利用Cookie设置用户30分钟未操作自动退出功能
  10. Android笔记 意图传值demo