jz2440开发板移植U-boot之修改代码支持DM9000网卡
今天我們來移植U-boot到jz2440開發板,修改代碼支持DM9000網卡。查看之前寫的移植記錄請點擊鏈接:點擊查看之前的移植記錄
現在大多數開發板都支持DM9000網卡。我們的U-boot源碼里面也是有DM9000網卡的驅動程序的。文件為Dm9000x.c(drivers\net).
首先我去網卡目錄的Makefile文件中搜索dm9000字符串:
由Makefile得知,如果我們定義了CONFIG_DRIVER_DM9000這個宏,那么dm9000網卡就會被編譯進去(同時要去掉cs8900網卡)。
首先在smdk2440.h中找到下面的宏定義:
#define CONFIG_CS8900 /* we have a CS8900 on-board */ #define CONFIG_CS8900_BASE 0x19000300 #define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */這是cs8900網卡的定義,我們把它去掉,加上dm9000所需要的宏:
#ifdef 0 #define CONFIG_CS8900 /* we have a CS8900 on-board */ #define CONFIG_CS8900_BASE 0x19000300 #define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */ #else #define CONFIG_DRIVER_DM9000 #endif重新編譯uboot(肯定會顯示有錯誤,不可能這么簡單就弄好了,但是我們一步解決一個錯誤):
顯示錯誤:
顯示說dm9000x.c中的56行沒有定義DM9000_DATA這個宏參數。在經驗不足,對驅動程序了解不多的情況下,我們沒有辦法知道這個宏參數是干什么的,但是我們可以仿照uboot中現有的程序中相同的地方模仿。我們在uboot源碼中搜索DM9000_DATA這個字符串:
輸入:grep “DM9000_DATA” * -nR (這是Linux下搜索字符串的命令)
顯示很多配置文件中用到了DM9000_DATA這個參數,我們隨便找一個配置文件進去看看別人是怎么配置的,假如找的是這個吧:
好,進去看了之后,別的是這么配置DM9000的網卡參數的:
#define CONFIG_DRIVER_DM9000 #define CONFIG_DM9000_BASE 0x04014000 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE + 2)原來是我們少定義了一些參數。那么我們來看看如何取值CONFIG_DM9000_BASE 與DM9000_DATA。
在分析之前先說一下:
DM9000屬于內存類接口,想要操作內存類接口,需要知道它的1)訪問地址,同時還要根據DM9000的實際情況2)設置內存控制器的時序以及位寬。
1)設置訪問地址:
首先是 CONFIG_DM9000_BASE ,這個是DM9000的基地址,是CPU用來識別網卡的一個基地址。 查看DM9000網卡原理圖:它的片選引腳是:nGCS4,那么我們查看2440手冊,因為網卡是內存類的接口,所以我們看2440手冊內存控制器那一章,找到片選信號的地址分配表:
從中可以看出:nGCS4這個片選引腳對應的初始地址是:0x20000000。那么我們就把CONFIG_DM9000_BASE這個值設為0x20000000,就會把nGCS4引腳設為低電平,從而片選到DM9000網卡設備。
然后是 DM9000_DATA的地址取值。查看原理圖知,cpu只發出了LADDR2給DM9000網卡內的CMD引腳, 說明CPU只關心訪問地址的第2位,所以我們把基地址加4,設置一下第二位的值:#define DM9000_DATA (CONFIG_DM9000_BASE + 4)
那么總的修改是:
那么我們已經設置好了上面說的第一步,設置訪問地址,下面再看如何設置內存控制器的時序以及位寬。
2)設置內存控制器的時序以及位寬:
uboot中lowlevel_init.S中有設置內存控制器寄存器的相關的代碼:
.long 0x22011110 //BWSCON這個寄存器應該是設置的位寬,.long 0x00000700 //BANKCON4(nGCS4)這個應該是設置時序的寄存器
1)首先我們在2440手冊中搜索BWSCON這個寄存器。在207頁有設置位寬的寄存器位操作(其中19:18:17:16位對應的是BANK4,所以查看是否需要設置這四位):
DW4是設置位寬的的位,對應17:16位。我們計算.long 0x22011110 //BWSCON這個寄存器的值,用寄存器位查看器知:
17:16位對應的是01.那么查看手冊知01 = 16-bit。查看原理圖得知,DM9000網卡的位寬剛好是16位,所以,不需要修改了。18位的等待信號DM9000上沒有,不需要設置。19位的也沒有用到,不需要設置。
2)再看如何設置時序(設置BANKCON4寄存器)。找到如下圖:
這里面就是設置DM9000的時序了,至于怎么設置(為什么這么設置),可以參考韋東山第二期視頻移植DM9000網卡驅動程序那一節里面有詳細講過,這里不再講解。
看看原始設置的各個位是對少:
對比之前韋東山二期視頻講解的DM9000時序設置,我們在這里將位7:6設置為01。則對應的寄存器的值為:
所以將BANKCON4的值改為0x00000740。
然后重新編譯:
編譯順利通過。
將生成的鏡像文件燒寫到NOR FLASH,啟動:
看到,顯示Net: No ethernet found。那么我們去源碼中搜索看是哪個地方。
源碼中搜索:Net:
Board.c中:
跳到:eth_initialize:
里面有一個函數board_eth_init:
我們找board_eth_init 函數(smdk2410.c,這個名字一直沒有改成2440的,忘記了,暫時這么用吧,不影響):
發現沒有初始化我們的DM9000網卡。我們在DM9000網卡驅動程序中找到:dm9000_initialize。應該是DM9000的初始化函數。我們在linux下搜索這個dm9000_initialize:grep “dm9000_initialize” * -nR,看看有沒有類似的初始化。發現大多是這樣的:
return dm9000_initialize(bis);那么我們將上面的board_eth_init函數改成:
int board_eth_init(bd_t *bis) {int rc = 0; #ifdef CONFIG_CS8900rc = cs8900_initialize(0, CONFIG_CS8900_BASE); #endif#ifdef CONFIG_DRIVER_DM9000 rc = dm9000_initialize(bis); #endifreturn rc; }重新編譯,啟動:
OK啦,我們的網卡終于加好了。
現在ping一下電腦看看:
先設置ip:
set ipaddr 10.11.235.102
ping 10.11.235.146
顯示
沒有設置mac地址,重啟設置:
set ipaddr 192.168.1.102
set ethaddr 00:0c:29:4d:e4:f4 (可以隨便設置)
ping 192.168.1.102
顯示如下:
OK!顯示主機alive。已經ping通了。下面我們試一下看看能不能用tftp下載。因為uboot沒有集成TFTP工具,那么我們就用windows上的tftp工具進行下載內核。
如圖為TFTP下載工具(注意服務器ip)
在板子上uboot上設置:
set serverip 192.168.1.102
tftp 30000000 uImage_4.3
然后啟動內核:
bootm 30000000
成功啟動內核。說明我們已經成功了!!!現在下載比用dnw下載要方便快捷的多。
想一起探討以及獲得各種學習資源加我(有我博客中寫的代碼的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流關于嵌入式,操作系統,C++語言,C語言,數據結構等技術問題
總結
以上是生活随笔為你收集整理的jz2440开发板移植U-boot之修改代码支持DM9000网卡的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 想对可以使用的adblock插件感谢!!
- 下一篇: excel打开2个独立窗口_谢楠称女性独