1. 程式人生 > >移植u-boot-2015.07-rc3之修改程式碼支援DM9000網絡卡(七)

移植u-boot-2015.07-rc3之修改程式碼支援DM9000網絡卡(七)

目前的u-boot啟動後有如下資訊:

Net:   CS8900-0

Error: CS8900-0address not set.

板子上的是DM9000不是CS8900,網絡卡模組肯定是錯誤的嘛。看到這裡,你應該有了熟悉的思路,grep "Net:" * -nR查詢網絡卡的初始化函式,經過篩選可以斷定”Net:”實在這裡列印的:

common/board_r.c:581:                  puts("Net:   ");

連續跟蹤可以發現如下結構:

initr_net                                                                                                                                                                                                                                                                                     

eth_initialize(net/eth.c 783)

eth_common_init

board_eth_init(board/samsung/smdk2440/smdk2440.c)

cs8900_initialize

最終發現了cs8900網絡卡的初始化函式cs8900_initialize,問題是找到了,但是不知道怎麼修改啊!不要擔心,別的開發板肯定有使用DM9000的,我們模仿其他開發板的使用方法。

搜尋發現u-boot中有對DM9000支援的.c檔案dm9000x.c,所以開啟對應的Makefile看看dm9000x.c有沒有被編譯進u-boot:

[email protected]:/home/uboot/u-boot-2015.07-rc3# vim drivers/net/Makefile                                                                                                                                                                

17 obj-$(CONFIG_CS8900) += cs8900.o

 18 obj-$(CONFIG_TULIP) += dc2114x.o

 19 obj-$(CONFIG_ETH_DESIGNWARE) += designware.o

 20 obj-$(CONFIG_DRIVER_DM9000) += dm9000x.o

所以要在smdk2440.h中取消CONFIG_CS8900巨集增加CONFIG_DRIVER_DM9000巨集:

include/configs/smdk2440.h檔案中:

46 //#define CONFIG_CS8900         /* we have a CS8900 on-board */                                                                                                                                                                    

 47 //#define CONFIG_CS8900_BASE    0x19000300

 48 //#define CONFIG_CS8900_BUS16   /* the Linux driver does accesses as shorts */

 49

 50

 51 #define CONFIG_DRIVER_DM9000

 52

make編譯,出現大量錯誤:

drivers/net/dm9000x.c: In function 'dm9000_outblk_8bit':                                                                                                                                                                                          

drivers/net/dm9000x.c:148: error: 'DM9000_DATA' undeclared (first use in this function)

drivers/net/dm9000x.c:148: error: (Each undeclared identifier is reported only once

drivers/net/dm9000x.c:148: error: for each function it appears in.)

drivers/net/dm9000x.c: In function 'dm9000_outblk_16bit':

drivers/net/dm9000x.c:157: error: 'DM9000_DATA' undeclared (first use in this function)

可以看到這些錯誤都是沒有定義DM9000_DATA、DM9000_IO巨集造成的,也不知道這兩個巨集是幹啥的,grep檢視一下:

[email protected]:/home/uboot/u-boot-2015.07-rc3# grep "DM9000_DATA" * -nR                                                                                                                                                

DM9000_DATA出現在很多標頭檔案中,任意開啟兩個標頭檔案可以看到:

[email protected]:/home/uboot/u-boot-2015.07-rc3# vim include/configs/M5253DEMO.h +73                                                                                                                                

69 #define CONFIG_DRIVER_DM9000

 70 #ifdef CONFIG_DRIVER_DM9000

 71 #       define CONFIG_DM9000_BASE       (CONFIG_SYS_CS1_BASE | 0x300)

 72 #       define DM9000_IO                CONFIG_DM9000_BASE

 73 #       define DM9000_DATA              (CONFIG_DM9000_BASE + 4)

 74 #       undef CONFIG_DM9000_DEBUG

 75 #       define CONFIG_DM9000_BYTE_SWAPPED

[email protected]:/home/uboot/u-boot-2015.07-rc3# vim include/configs/scb9328.h +216

213 #define CONFIG_DRIVER_DM9000            1

214 #define CONFIG_DM9000_BASE              0x16000000

215 #define DM9000_IO                       CONFIG_DM9000_BASE

216 #define DM9000_DATA                     (CONFIG_DM9000_BASE+4)

可以猜測的是我們使用DM9000至少也要定義CONFIG_DM9000_BASE、DM9000_IO和DM9000_DATA,所以在smdk2440中新增這三個巨集測試編譯能不能通過。

smdk2440.h中:我的環境下在smdk2440.h中使用//註釋編譯會出錯,所以不需要的程式碼我就直接刪除了                                                                                                        

42 /*

 43  * Hardware drivers

 44  */

 45

 46 #define CONFIG_DRIVER_DM9000

 47 #define CONFIG_DM9000_BASE                       0x16000000

 48 #define DM9000_IO                                 CONFIG_DM9000_BASE

 49 #define DM9000_DATA                              (CONFIG_DM9000_BASE+4)

 50

make編譯通過。但是現在DM9000還不能使用,要移植DM9000,先來補充一下DM9000的知識:

DM9000屬於記憶體類介面,既然是記憶體類介面,就需要知道訪問地址是多少,位寬是多少。

所以在初始化DM9000的時候,分兩步完成:

1、  設定記憶體控制器——時序、位寬

2、  確定訪問地址

首先找到mini2440的電路圖,可以看到:


可以看到nLAN_CS接的是nGCS4.在檢視2440晶片手冊:



所以基地址:CONFIG_DM9000_BASE0x2000,0000

雖然 MA9000 內部有很多暫存器,但是它提供給使用者作為程式設計介面的就兩個介面。一個是Index 埠,傳輸偏移地址用於確定 DM9000 內部的具體暫存器;另一個是資料埠,用於傳輸資料。而且兩個埠使用的都是 DM9000 上的 SD[15:0]引腳,而區分何時是 Index 資料何時是傳輸資料呢?主要是靠 DM9000 上的 CMD 引腳來決定,當 CMD 為 0 的時候傳的資料當 Index 使用,1時當傳輸資料使用

CMD 是接到 LADDR2 上的,所以地址為 0x20000300 時寫入的是 Index 資料,為 0x20000304時寫入的是傳輸資料。當然只要 LADDR2 為 1 就是傳輸資料,所以 LADDR2 為 1 的地址還可以是 0x20000305~0x20000307

所以#define DM9000_DATA             (CONFIG_DM9000_BASE + 4)

#define DM9000_IO                CONFIG_DM9000_BASE

DM9000_IO也就是寫到SD[15:0]的資料當Index用的偏移

DM9000_DATA就是寫到SD[15:0]的資料當資料用的偏移

以上確定訪問地址就搞定了。下面需要設定記憶體控制器。

在lowlevel_init.S中有對整個記憶體控制器的初始化,因為SDRAM在沒有修改的情況下都能使用,現在先不修改記憶體控制器的初始化值看看能不能使用,不能再回過頭來修改:

所以現在先對smdk2440.h做如下修改:

smdk2440.h中:                                                                                                                                                                                                                                                                

42 /*

 43  * Hardware drivers

 44  */

 45

 46 #define CONFIG_DRIVER_DM9000

 47 #define CONFIG_DM9000_BASE              0x20000000

 48 #define DM9000_IO                                CONFIG_DM9000_BASE

 49 #define DM9000_DATA                             (CONFIG_DM9000_BASE+4)

make編譯通過。

之前在board_eth_init函式中有對cs8900進行初始化的函式cs8900_initialize,現在取消CONFIG_CS9000的巨集後連cs8900_initialize都不執行了。這個時候很容易想到這裡應該替換成DM9000的初始化函式。而這個初始化函式當然是在dm9000x.c中,開啟dm9000x.c可以看到有dm9000_initialize函式。使用grep檢視dm9000_initialize的用法:

[email protected]:/home/uboot/u-boot-2015.07-rc3# grep "dm9000_initialize" * -nR                                                                                                                                                

開啟其中一個搜尋到的檔案:

[email protected]:/home/uboot/u-boot-2015.07-rc3# vim board/davinci/dm355evm/dm355evm.c +77

可以看到:

74 #ifdef CONFIG_DRIVER_DM9000

 75 int board_eth_init(bd_t *bis)

 76 {

 77         return dm9000_initialize(bis);

 78 }

 79 #endif

所以模仿上面的用法可以修改board/samsung/smdk2440/smdk2440.c中的board_eth_init函式為:

board/samsung/smdk2440/smdk2440.c中:                                                                                                                                                                                                                

118 #ifdef CONFIG_CMD_NET

119 int board_eth_init(bd_t *bis)

120 {

121         int rc = 0;

122 #ifdef CONFIG_CS89dm00

123         rc = cs8900_initialize(0, CONFIG_CS8900_BASE);

124 #endif

125

126 #ifdef CONFIG_DRIVER_DM9000

127         rc = dm9000_initialize(bis);

128 #endif

129

130         return rc;

131 }

132 #endif

make編譯下載到NorFlash並啟動。可以看到:

Net:  dm9000

這就代表DM9000可能移植成功了,具體是不是真的移植成功需要使用命令驗證,最簡單的方法就是ping。

SMDK2410 # print        //列印環境變數情況

baudrate=115200

bootdelay=5

ethact=dm9000

ipaddr=10.0.0.110

netmask=255.255.255.0

serverip=10.0.0.1

stderr=serial

stdin=serial

stdout=serial

Environment size: 160/65532 bytes

預設情況下開發板ip為10.0.0.110,伺服器ip為10.0.0.1。因為我的電腦ip為192.168.1.100,所以需要修改預設的ip:

SMDK2410 # set serverip 192.168.1.100;set ipaddr 192.168.1.200

SMDK2410 # print

baudrate=115200

bootdelay=5

ethact=dm9000

ipaddr=192.168.1.200

netmask=255.255.255.0

serverip=192.168.1.100

stderr=serial

stdin=serial

stdout=serial

Environment size: 168/65532 bytes

需要注意的是現在還不能使用save命令儲存環境變數

SMDK2410 # ping 192.168.1.100

dm9000 i/o: 0x20000000, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: ff:ff:ff:ff:ff:ff

WARNING: Bad MAC address (uninitialized EEPROM?)

could not establish link

Using dm9000 device

host 192.168.1.100 is alive         //ping通電腦,說明網絡卡工作正常

SMDK2410 # tftp 30000000 u-boot_xt.bin

dm9000 i/o: 0x20000000, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: ff:ff:ff:ff:ff:ff

WARNING: Bad MAC address (uninitialized EEPROM?)

could not establish link

Using dm9000 device

TFTP from server 192.168.1.100; our IP address is 192.168.1.200

Filename 'u-boot_xt.bin'.

Load address: 0x30000000

Loading: ###############

         1 MiB/s

done

Bytes transferred = 217484 (3518c hex)

SMDK2410 # nand erase 0 100000;nand write 30000000 0 100000

NAND erase: device 0 offset 0x0, size 0x100000

Erasing at 0xe0000 -- 100% complete.

OK

NAND write: device 0 offset 0x0, size 0x100000                                                                                                                                                                                                                

 1048576 bytes written: OK

撥碼開關撥到NandFlash啟動

SMDK2410 #reset

u-boot啟動正常

到此,DM9000網絡卡移植完成。

下一節mtdparts命令支援


相關推薦

移植u-boot-2015.07-rc3修改程式碼支援DM9000

目前的u-boot啟動後有如下資訊: Net:   CS8900-0 Error: CS8900-0address not set. 板子上的是DM9000不是CS8900,網絡卡模組肯定是錯誤的嘛。看到這裡,你應該有了熟悉的思路,grep "Net:" * -nR查詢網絡

移植u-boot-2015.07-rc3uboot裁剪及啟動引數修改

可以看到,現在make編譯出來的u-boot.bin有512kb大小,造成u-boot這麼巨大的原因是新版本的u-boot預設情況下支援非常多的命令,以至於很多不必要的.o檔案都被連結進u-boot.bin檔案中了。今天就來把u-boot中我用不到的命令都裁剪掉並設定預設的

u-boot-2015.07移植SPL

本文參考https://blog.csdn.net/doccode/article/details/47212363,在此謝過! SPL方式移植U-BOOT-2015.07 在JZ2440板子上移植u-boot-2015.07,移植思路,利用smdk2410板子作為基線進行移植.下載u-boot-2015

u-boot-2015.07 autoconf.mk生成過程分析

1、u-boot2015.7版本編譯沒有在頂層目錄中生成.config檔案,而生成了include/autoconf.mk和include/autoconf.mk.dep兩個檔案,並在每個模組編譯的時候包含著兩個檔案,作用相當於高版本u-boot中的.config檔案。   2、autoconf

05-S3C2440學習核心移植linux3.4.2移植(3)支援DM9000C修改支援串列埠2

接下來我們在此基礎上,在linux3.4.2中移植DM9000c網絡卡驅動,使核心可以支援網絡卡晶片,這樣方便使用NFS網路檔案系統。 一、移植思路 (1)我們現在移植好的核心中,支援smdk24

U-Boot移植DM9000(附:程式、原始碼、測試程式)

  U-Boot移植DM9000網絡卡 ——西伯利亞的風     根據書《嵌入式Linux應用開發完全手冊》移植網絡卡驅動,對於Jz2440開發板好像並不適用,Jz2440開發板使用的是DM9000網絡卡,已經不是書上講的CS8900網絡卡了。DM9000網絡卡與CS890

U-Boot1.1.6移植DM9000

    巨集定義CONFIG_DRIVER_DM9000為1表示配置使用DM9000網絡卡,u-boot編譯時會將DM9000相關的驅動編譯進去。其中0x20000000是DM9000的基址(BANK4),由於DM9000只有一條地址線CMD(LADDR2,見圖3.1)用於區別是資料還是地址(CMD為低時資料

計算機網協議

邊界 聯網 不同的 支持 報告 nac 5.0 ipv6地址 發的 IPv4協議的路由與轉發 查找路由表 1、多次間接交付後,IP數據報最終一定可以找到目地主機所在的目的網絡上的路由 2、到達最後一個路由器時,才會試圖向目的主機直接交付 分組轉發算法 1

springCloud Spring Boot mybatis分布式微服務雲架構-docker-feign-hystrix-ribbon

vid 目的 rul exec err eureka lis 負載均衡 分布式 簡介 在上一節中,我們討論了feign+hystrix在項目開發中,除了考慮正常的調用之外,負載均衡和故障轉移也是關註的重點,這也是feign + ribbon+hystrix的優勢所在,本節我

演算法工程師修仙路:吳恩達機器學習

吳恩達機器學習筆記及作業程式碼實現中文版 第六章 神經網路學習 非線性假設 無論是線性迴歸還是邏輯迴歸都有這樣一個缺點:當特徵太多時,計算的負荷會非常大。 使用非線性的多項式項,能夠幫助我們建立更好的分類模型。假設我們有非常多的特徵,例如大於 100 個

關於移植MT7601Uusb無線小度wifi,360隨身WIFI 2代的後續

請先看最後的我與連結文章作者做法上的區別 第一步可以看下這裡:http://blog.csdn.net/ofaith12345/article/details/24963457  其中有一個問題是串列埠不停有資訊返回,停不下來,後續解決~,只要修改os/linux/conf

linux 修改IP重啟方法

修改網絡卡命令: ifconfig eth0 192.168.0.3 netmask 255.255.255.0 ⚠️臨時修改IP生效,如果想重啟之後依然生效,可以修改網絡卡配置檔案。 重啟網絡卡命令: centos: sudo service ne

Flask專案手機端租房網站的實戰開發

說明:該篇部落格是博主一字一碼編寫的,實屬不易,請尊重原創,謝謝大家! 接著上一篇部落格繼續往下寫 :https://blog.csdn.net/qq_41782425/article/details/85934776 目錄 一丶登入後端介面編寫 二丶登入介面測試 三丶登入前

基於S3C2440的Linux-3.6.6移植——DM9000驅動移植

Linux-3.6.6很好的支援了DM9000,因此對於S3C2440晶片來說無需進行任何修改,甚至連menuconfig都已經預設配置了網絡卡驅動。但我們還需要設定網絡卡的MAC和IP等資訊。有許多方法可以實現網絡卡的設定,在這裡我們選擇一種比較簡單的方法——修改根檔案系

u-boot2012.04到jz2440 支援dm9000c

u-boot已經支援 dm9000c網絡卡 1.首先看Makefile  /driver/net 目錄         38 COBJS-$(CONFIG_DRIVER_DM9000) += dm9000x.o                     取消對CS8900

【IoT】物聯網 WIFI 一鍵配 smartConfig 淺析ESP32

一、背景 物聯網時代技術開始規模化服務於民眾,方便快捷顯得尤為重要,WIFI 直連便是一個典型案例。 目前主流的 WIFI 配置模式有以下 2 種: 1、智慧硬體處於 AP 模式(類似路由器,組成區域網),手機用於 STA 模式 手機連線到處於 AP 模式的智慧硬體後

『高級篇』docker服務發現、部署更新和擴容

所有 gem 測試 域名解析 cbc 代碼更新 mage ftp dock >原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!>原文鏈接地址:『高級篇』docker之服務發現、部署更新和擴容(七) 服務發現 所有的表現形式都是ip+端口的形式。

Android解決ubuntu沒有無線和手機wifi實現adb wifi除錯

1、問題 ubuntu沒有無線網絡卡,但是在在wifi1是同一個網段,然後手機需要wifi adb除錯 2、解決辦法 1、連線上wifi1 2、手機下載“終端模擬器apk”安裝在手機上 3、手機連線電腦,然後adb tcpip 5555 4、然後adb push dro

2015年OpenWRT路由器掛載RT3070 USB無線

RT3070 USB無線網絡卡掛載需要自己手動新增的元件和驅動如下: 新增的元件: kmod-usb-ohci kmod-usb-storage kmod-usb-wdm kmod-usb2 無線驅動: kmod-rt2800-pci kmod-rt2800-soc kmo

移植U-BOOT裁剪和修改預設引數易用性啟動核心,以及對uboot進行分割槽

今天我們來裁剪U-BOOT,使其更加易用,修改預設引數,以及製作最終修改好得補丁檔案方便以後的快速移植。 那麼如果想看之前的關於網絡卡以及flash等的移植,請點選連結檢視:點選連結檢視 在裁剪修改之前呢,我們先來了解一下U-BOOT的環境引數(環境變數):