日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jz2440开发板移植U-boot之修改代码支持DM9000网卡

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:156: error: 'DM9000_DATA' undeclared (first use in this function) dm9000x.c:156: error: (Each undeclared identifier is reported only once dm9000x.c:156: error: for each function it appears in.) 。。。。 。。。。

顯示說dm9000x.c中的56行沒有定義DM9000_DATA這個宏參數。在經驗不足,對驅動程序了解不多的情況下,我們沒有辦法知道這個宏參數是干什么的,但是我們可以仿照uboot中現有的程序中相同的地方模仿。我們在uboot源碼中搜索DM9000_DATA這個字符串:
輸入:grep “DM9000_DATA” * -nR (這是Linux下搜索字符串的命令)
顯示很多配置文件中用到了DM9000_DATA這個參數,我們隨便找一個配置文件進去看看別人是怎么配置的,假如找的是這個吧:

include/configs/at91sam9261ek.h:159:#define DM9000_DATA (CONFIG_DM9000_BASE + 4)

好,進去看了之后,別的是這么配置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)
那么總的修改是:

#define CONFIG_DRIVER_DM9000 #define CONFIG_DM9000_BASE 0x20000000 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE + 4)

那么我們已經設置好了上面說的第一步,設置訪問地址,下面再看如何設置內存控制器的時序以及位寬。

2)設置內存控制器的時序以及位寬:
uboot中lowlevel_init.S中有設置內存控制器寄存器的相關的代碼:

SMRDATA:.long 0x22011110 //BWSCON.long 0x00000700 //BANKCON0.long 0x00000700 //BANKCON1.long 0x00000700 //BANKCON2.long 0x00000700 //BANKCON3 .long 0x00000700 //BANKCON4.long 0x00000700 //BANKCON5.long 0x00018005 //BANKCON6.long 0x00018005 //BANKCON7.long 0x008C04F4 // REFRESH.long 0x000000B1 //BANKSIZE.long 0x00000030 //MRSRB6.long 0x00000030 //MRSRB7

.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中:

#if defined(CONFIG_CMD_NET)puts("Net: ");eth_initialize(gd->bd);

跳到:eth_initialize:
里面有一個函數board_eth_init:
我們找board_eth_init 函數(smdk2410.c,這個名字一直沒有改成2440的,忘記了,暫時這么用吧,不影響):

int board_eth_init(bd_t *bis) {int rc = 0; #ifdef CONFIG_CS8900rc = cs8900_initialize(0, CONFIG_CS8900_BASE); #endifreturn rc; }

發現沒有初始化我們的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
顯示

*** ERROR: `ethaddr' not set

沒有設置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网卡的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。