1. 程式人生 > >Zynq-Linux移植學習筆記之十-u-boot網路配置

Zynq-Linux移植學習筆記之十-u-boot網路配置

在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的函式呼叫,這裡我放在了串列埠驅動配置之後執行。

[cpp] view plain copy  print?
  1. void board_init_r(gd_t *id, ulong dest_addr)  
  2. {  
  3.     ulong malloc_start;  
  4. #if !defined(CONFIG_SYS_NO_FLASH)
  5.     ulong flash_size;  
  6. #endif
  7.     gd->flags |= GD_FLG_RELOC;   /* tell others: relocation done */
  8.     bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_R, "board_init_r");  
  9.     monitor_flash_len = _end_ofs;  
  10.     /* Enable caches */
  11.     enable_caches();  
  12.     debug("monitor flash len: %08lX\n", monitor_flash_len);  
  13.     board_init();   /* Setup chipselects */
  14.     /* 
  15.      * TODO: printing of the clock inforamtion of the board is now 
  16.      * implemented as part of bdinfo command. Currently only support for 
  17.      * davinci SOC's is added. Remove this check once all the board 
  18.      * implement this. 
  19.      */
  20. #ifdef CONFIG_CLOCKS
  21.     set_cpu_clk_info(); /* Setup clock information */
  22. #endif
  23.     serial_initialize();  
  24.     myspi_init(); /*init bcm5396*/
  25.     printf("Now running in RAM - U-Boot at: %08lx\n", dest_addr);  
  26. #ifdef CONFIG_LOGBUFFER


2、  net/Eth.c

在其中加入配置bcm5396的程式碼

[cpp] view plain copy  print?
  1. void myspi_init()  
  2. {  
  3.     XSpiPs Spi;  
  4.     int i32Option,status;  
  5.     int i;  
  6.     unsigned char workBuf[10];  
  7.     workBuf[0]=0xf0;  
  8.     workBuf[1]=0x1;  
  9.     g_SpiConfig = &XSpiPs_ConfigTable[0];  
  10.     //Initialize the SPI device.
  11.     Spi.IsBusy = 0;  
  12.     Spi.Config.BaseAddress = g_SpiConfig->BaseAddress;  
  13.     //Spi.StatusHandler = StubStatusHandler;
  14.     Spi.SendBufferPtr = NULL;  
  15.     Spi.RecvBufferPtr = NULL;  
  16.     Spi.RequestedBytes = 0;  
  17.     Spi.RemainingBytes = 0;  
  18.     Spi.IsReady = 0x11111111;  
  19.     XSpiPs_WriteReg(Spi.Config.BaseAddress,0,0x00020000);  
  20.     //Initialize the SPI device. end
  21.     i32Option = 0x1 | 0x2 | 0x4 | 0x10;  
  22.     Spi_SetOptions(&Spi, i32Option);  
  23.     XSpiPs_SetSlaveSelect(&Spi,1 );  
  24.     XSpiPs_SetClkPrescaler(&Spi, 6 );  
  25.     workBuf[0]=0xf0;  
  26.     workBuf[1]=0x1;  
  27.     workBuf[2]=0;  
  28.     for(i=0x10;i<=0x1f;i++)  
  29.     {  
  30.         status = writeBCM5396(&Spi, i, 0x20, workBuf );  
  31.     }  
  32.     printf("*****************Read SPI Reg of 5396******************\r\n");  
  33.     printf("---BMC Status Registers(PAGE 0x10-0x1F)---\n");  
  34.     for(i=0x10;i<=0x1f;i++)  
  35.     {  
  36.           status = readBCM5396(&Spi, i, 0x28, workBuf );  
  37.           printf("port=%d,offset=0x28,data=0x%x\n",(i-0x10),workBuf[2]);  
  38.           printf("port=%d,offset=0x29,data=0x%x\n",(i-0x10),workBuf[3]);  
  39.         }  
  40.     printf("---BMC Status Registers(PAGE 0x10-0x1F)---\n\r");  
  41.     for(i=0x10;i<=0x1f;i++)  
  42.     {  
  43.           status = readBCM5396(&Spi, i, 0x20, workBuf );  
  44.           printf("port=%d,offset=0x20,data=0x%x\n\r",(i-0x10),workBuf[2]);  
  45.           printf("port=%d,offset=0x21,data=0x%x\n\r",(i-0x10),workBuf[3]);  
  46.         }  
  47. }  

3、  drivers/net/Zynq_gem.c

這裡的修改是可選項,主要是配置phy,我這裡使用的是marvell的88E1111,u-boot中提供的配置方法不起效,於是進行了手動配置。加了phy_detect和negotiat函式

[cpp] view plain copy  print?
  1. staticvoid phy_negotiat(struct eth_device *dev)  
  2. {  
  3.     struct zynq_gem_priv *priv = dev->priv;  
  4.     u16 control;  
  5.     u16 status;  
  6.     u16 temp;  
  7.     u16 timeout_counter=0;  
  8.     printf("Start PHY autonegotiation.\n");  
  9.     phywrite(dev,priv->phyaddr, 22, 2);  
  10.     phyread(dev, priv->phyaddr, 21, &control);  
  11.     control |= 0x0030;  
  12.     phywrite(dev, priv->phyaddr, 21, control);  
  13.     phywrite(dev, priv->phyaddr, 22, 0);  
  14.     phyread(dev, priv->phyaddr, 4, &control);  
  15.     control |= 0x0800;  
  16.     control |= 0x0400;  
  17.     control |= (0x0100 | 0x0080);  
  18.     control |= (0x0040 | 0x0020);  
  19.     phywrite(dev, priv->phyaddr, 4, control);  
  20.     phyread(dev, priv->phyaddr, 9,&control);  
  21.     control |= 0x0300;  
  22.     phywrite(dev, priv->phyaddr, 9,control);  
  23.     phywrite(dev, priv->phyaddr, 22, 0);  
  24.     phyread(dev, priv->phyaddr, 16,&control);  
  25.     control |= (7 << 12); /* max number of gigabit attempts */
  26.     control |= (1 << 11); /* enable downshift */
  27.     phywrite(dev, priv->phyaddr, 16,control);  
  28.     phyread(dev, priv->phyaddr, 0, &control);  
  29.     control |= 0x1000;  
  30.     control |= 0x0200;  
  31.     phywrite(dev, priv->phyaddr, 0, control);  
  32.     phyread(dev, priv->phyaddr, 0, &control);  
  33. 相關推薦

    Zynq-Linux移植學習筆記-u-boot網路配置

    在zynq開發板zc706上,網路通路由下面三個裝置組成: 其中zynq負責對phy進行配置,當zynq上的網路控制器以及phy完成正確配置時,能夠看到RJ45上面的黃燈亮,此時表明鏈路已經通了。如果u-boot中已經設定了IP地址,通過網線就可以ping通

    Zynq-Linux移植學習筆記27UIO機制響應外部中斷實現【轉】

    轉自:https://blog.csdn.net/zhaoxinfan/article/details/80285150 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/jj12345jj198999/article/details/802851501、&n

    Zynq-Linux移植學習筆記31-使用者自定義I2C驅動

    1、背景介紹 板子上通過ZYNQ的I2C-0控制器連線了三片DBF晶片和一片Ti的226測功耗晶片,示意圖如下: 如上圖所示,三塊DBF晶片的I2C地址分別為2,4,8,Ti 226晶片的I2C地址為0x40.現在需要ZYNQ通過I2C匯流排讀寫這四塊晶片的暫存器數值

    Zynq-Linux移植學習筆記33-CMA連續實體記憶體配置

    1、背景介紹 在使用pcie進行資料傳輸時,常常需要用到dma,由於dma傳輸多為非同步傳輸方式,只需要告訴dma起始地址,資料大小,然後啟動dma,cpu就可以去做其他事情。不過Dma傳輸需要有一個前提條件,分配一段連續的實體記憶體,在linux下,由於存在虛實實體地址轉

    轉發:Zynq-Linux移植學習筆記六-netperf網路測試

    1、netperf安裝 目前linux下主流的網路測試工具是netperf,完全可以在zc706上執行的linux內加入netperf網路測試工具,然後用網線與電腦相連進行測試。 netperf下載地址:netperf下載地址 Client端安裝 下載結束後,進行安裝:

    Zynq Linux移植學習筆記四 fsbl

                    這一篇講一講FSBL1、  FSBL簡介在zynq上執行程式的時候,載入過程中肯定需要用到一個檔案,那就是fsbl,fsbl的全稱為first stage boot loader,從字面上就能夠看出這是zynq啟動第一階段的載入程式,經過了fsbl這一階段,後面系統才能夠執行裸

    Zynq-Linux移植學習筆記14-RapidIO驅動開發

    在對zynq進行linux驅動開發時,除了需要針對zynq內ARM自帶的控制器適配驅動外,還需要對zynq PL部分的IP核進行驅動開發。對於ARM來說,zynq PL部分的IP核就是一段地址空間,這段地址空間包含了該IP的一系列暫存器,ARM操作該IP核的暫存器也就是

    Zynq-Linux移植學習筆記13-i2c驅動配置

    1、 背景介紹 板子上通過I2C匯流排與zynq相連的是三片1848 如上圖所示,zynq通過I2C匯流排與3片CPS-1848交換晶片相連,3片1848晶片的I2C地址分別為2,4,8. 目前zynq上linux I2C驅動採用的是i2c-cadence(driver

    Zynq-Linux移植學習筆記三-ramdisk

    下面用一張圖簡單介紹一下ramfs的產生過程: 如上圖所示,收集到的一些嵌入式相關的原始碼以及package經過PC上的GCC,binutis等工具編譯後得到gcc編譯器,ld,obj,庫等,注意這裡編譯得到的就是嵌入linux的相應編譯工具,它們共同組成嵌入式編譯環

    Zynq-Linux移植學習筆記16-Zynqlinux XADC驅動

    1、  簡介 XADC是zynq晶片內部進行溫度和電壓檢測的模組,通過(Xilinx Wiki - xadc.html)這篇wiki可以知道,XADC控制器有兩種表現形式,一種是位於PS內部,即文件中提到的the PS-XADC interface for the PS s

    Zynq-Linux移植學習筆記21-Linux啟動時自動以root賬號登入

    在除錯zynq開發板時,linux啟動後總是需要手動輸入root以登入系統,如下圖所示: 這對於自動執行應用程式來說很不方便。現在可以通過修改ramdisk的相關內容實現root賬號自動登入。 1、建立可執行檔案 首先需要建立可執行檔案,用對應板子的CROSS COM

    Zynq-Linux移植學習筆記八-linux網路驅動

    這一篇詳細介紹一下zynq下linux核心中網路驅動的執行過程。 1、基本層次 在linux中,網路可以分為下面三個層次: Linux網路驅動涉及到後面兩層,網路協議層中需要了解skb和netif;硬體驅動層也就是mac層,需要了解dma和dec。 按內容來說,整個網路

    Zynq-Linux移植學習筆記四-fsbl

    這一篇講一講FSBL 1、  FSBL簡介 在zynq上執行程式的時候,載入過程中肯定需要用到一個檔案,那就是fsbl,fsbl的全稱為first stage boot loader,從字面上就能夠看出這是zynq啟動第一階段的載入程式,經過了fsbl這一階段,後面系統

    Zynq-Linux移植學習筆記九-petalinux

    在對zynq上進行linux作業系統移植時,除了使用傳統的由使用者編譯u-boot,kernel,rootfs方法外,目前主流採用vivado+petalinux操作方式。該操作方式能夠快速生成適配於zynq的linux映象,下文中進行詳細介紹。 一、硬體設計 參考ug9

    Linux netfilter 學習筆記 五 netfilter模組新增一個match

    通過這段時間的學習,基本上熟悉了netfilter模組,為了進一步加深對netfilter的認識以及理解iptables與netfilter的聯絡,準備新增一個match模組。 在看到閘道器產品會有一個公網限制的功能,就想著新增一個公網數目限制的功能。 該模組實現的功能

    Linux學習筆記————Linux常用服務器構建ftp服務器

    download pytho ftp服務 nsf png tp服務器 圖片 拷貝文件 span 一、ftp服務器介紹 FTP 是File Transfer Protocol(文件傳輸協議)的英文簡稱,而中文簡稱為“文傳協議”。 用於Internet上的控制文件的雙向傳輸。

    Linux運維學習筆記:SSH服務

    第十八章 SSH服務 一、SSH服務基礎 1、簡介 SSH 為 Secure Shell 的縮寫,由 IETF 的網路工作小組(Network Working Group)所制定;SSH 為建立在應用層和傳輸層基礎上的安全協議。SSH 是目前較可靠,專為遠端登入會話和其他

    Linux運維學習筆記七:LNMP的WEB架構深度優化效能優化

    第二十七章LNMP的WEB架構深度優化之效能優化 一、Nginx效能優化-配置Nginx的worker程序個數 1、worker的作用和初始設定 worker_processes就是worker角色的程序個數,也就是nginx啟動後有多少個worker處理http請求。ma

    MySQ學習筆記 NULL值處理

    con pop -a 能夠 第一個 ips ng- 索引 one 這是MySQL一大特殊之處。 概念上。NULL意味著“沒有值”或“未知值”,且它被看作有點與眾不同的值。為了測試NULL。你不能使用算術比較

    《SAS編程與數據挖掘商業案例》學習筆記

    style rename today 降序排序 cat list append span nod 本次重點在:sas數據集管理 主要包含:包含數據集縱向拼接、轉置、排序、比較、復制、重命名、刪除等 1.append語句 註:base數據集