網絡功能是UBOOT重要的功能之一,實作了網絡功能之後UBOOT可以很友善的下載下傳核心到闆子上。畢竟通過JTAG來燒錄實在是一種煎熬。
在UBOOT中,內建了一些裝置的驅動代碼。這些代碼一般都分類存放于drivers/目錄下面,而網絡裝置驅動存于drivers/net目錄下面。可以看到UBOOT有dm9000x.c和dm9000x.h兩個檔案存在。說明UBOOT已經內建了DM9000的驅動程式,現在就來将這個驅動內建到UBOOT中。
其實多移植幾次就會發現,UBOOT的移植修改還是遵循着一定的規律。即是先在配置頭檔案中打開相關宏定義支援,再到闆級初始化(一般是第二階段初始化過程)代碼中添加需要支援功能的初始化函數。對于學習闆子來說,很多晶片在UBOOT中都找得到驅動。是以省去了很多事,如同本次的網絡功能調試支援一樣。
UBOOT的網絡結構分析
支援調試還算是簡單,但是掌握相關流程更加重要。在以後碰到其他闆子或者新晶片的時候也可以模仿成熟的構架添加相關的支援。
配置頭檔案修改說明
啟動網絡功能的時候首先需要定義宏CONFIG_NET_MULTI,這個宏就如同一個總開關一樣。其他的宏往往都和具體晶片有關,要如何定義也應該是各個驅動作者來定義。是以上面DM9000的相關宏定義都是參考其他使用該晶片的闆子和對驅動檔案本身的了解而成型的。畢竟是開源工程,相關文檔确實不是很完善。
DM9000的驅動中,宏CONFIG_DRIVER_DM9000是啟動該驅動代碼的總開關(打開dm9000.h第一句就有#ifdef CONFIG_DRIVER_DM9000,這就是原因。)。然後我們需要自己去指定晶片所在的基位址,OK6410的基位址是0x18800300,這個也就是DM9000的IO口的基位址,資料接口的基位址是IO口的基位址加4得到。前者用于一些設定之類的,後者就是資料傳輸。當然還會有中斷之類的概念,不過UBOOT這裡沒有用到就不需要了。最後關于CONFIG_DM9000_NO_SROM這個宏是用于DM9000晶片沒有用EEPROM的時候所需要的一個宏。一般一個網卡都會有MAC位址之類的資訊,而這些資訊都是存儲到網絡晶片的EEPROM中,但是OK6410上沒有這樣設計,是以這些資訊就隻有編譯到UBOOT讓UBOOT在運作的時候指定。這個宏打開過後,一些從EEPROM晶片擷取MAC資訊的操作就不會被編譯到UBOOT中了。
最後需要注意一個宏CONFIG_CMD_NET這個宏預設在config_cmd_default.h檔案中已經得到了定義。不要再配置頭檔案中重複了。
下面是配置過程:
1.修改/include/configs/smdk6410.h
屏蔽掉CS8900宏定義這部分,
#if 0
#define CONFIG_CS8900
#define CONFIG_CS8900_BASE 0x18800300
#define CONFIG_CS8900_BUS16
#endif
加上DM9000的宏定義:
#define CONFIG_DM9000 //定義DM9000 回頭初始化驅動,就判斷這個宏
#define CONFIG_DM9000_NO_SROM 1 // 此處說明,該網卡沒有eeprom存儲..其實dm9000是有的,隻是沒用,是以隻好說沒有了
#define CONFIG_DRIVER_DM9000 1 //開啟DM9000驅動的代碼
#define CONFIG_DM9000_BASE 0x18800300 //這個宏是定義網卡連接配接到你的arm上面的位址.屬于sram1位址區域
#define DM9000_IO CONFIG_DM9000_BASE //根據網卡手冊,指定I/O DATA操作位址
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT //指明使用16位資料模式,該宏其實是為了友善知道網卡資訊
配置網卡資訊
#define CONFIG_ETHADDR 00:40:5c:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.10
#define CONFIG_SERVERIP 192.168.1.3
#define CONFIG_GATEWAYIP 192.168.1.1
2.修改board/samsung/smdk6410/smdk6410.c
board_eth_init()函數中改為
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
#ifdef CONFIG_DM9000
rc = dm9000_initialize(bis);
#endif
3.列印闆子資訊
sfluboot>>pri
baudrate=115200
bootargs=console=ttySAC,115200
bootcmd=nandread 0x50008000 0x100000 0x500000;bootm 50008000
bootdelay=5
ethact=dm9000
ethaddr=00:40:5c:26:0a:5b
gatewayip=192.168.1.1
ipaddr=192.168.1.10
netmask=255.255.255.0
serverip=192.168.1.3
stderr=serial
stdin=serial
stdout=serial
可見DM9000網絡配置資訊正常,ping ubuntu 主控端
sfluboot>>ping192.168.1.3
dm9000 i/o:0x18800300, id: 0x90000a46
DM9000: runningin 16 bit mode
MAC:00:40:5c:26:0a:5b
operating at100M full duplex mode
Using dm9000device
host 192.168.1.3is alive
可見網絡通信正常,如果通信失敗有以下解決辦法:1、檢視網線是否連接配接正常;2、虛拟機網絡連接配接設為橋接模式,如果是NAT模式則網絡不通。3、網絡防火牆的問題,看看Linux有沒有開啟防火牆,如果有請關閉防火牆。接下來可以進行TFTP設定,并可以通過TFTFP直接下載下傳程式到Nandflash中。
4. 安裝設定TFTP,建立/tftpboot,并且賦予/tftpboot最大的權限。
TFTP簡介:TFTP(Trivial File Transfer Protocol,簡單檔案傳輸協定)是TCP/IP協定族中的一個用來在客戶機與伺服器之間進行簡單檔案傳輸的協定,提供不複雜、開銷不大的檔案傳輸服務。端口号為69。詳細說明:http://baike.baidu.com/link?url=PPSNMBn1rqUjlQK_0qZVPOihMDogluMBxK2Qg8Poc-ahNyg9z9BsqjyW3dx4TRyKQTptXNHyI8t5Dk-9mbjR0q
sudo apt-get install tftp-hpa tftpd-hpa
mkdir /tftpboot
chmod 777 tftpboot
修改tftp設定
sudo vim /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
#TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
#TFTP_OPTIONS="--secure"
TFTP_OPTIONS="-l-c-s"
完成之後重新開機tftp服務即可
sudo service tftpd-hpa restart
5、通過tftp下載下傳程式到Nandflash
5.1、首先将編譯産生的u-boot-nand.bin檔案拷貝到/tftpboot 檔案夾下
[email protected]:/tftpboot$ ls
u-boot-nand.bin
5.2、将虛拟機運作到tftp狀态
[email protected]:/tftpboot$ tftp
(to)
5.3、現在就可以将u-boot-nand.bin下載下傳到Nandflash中了
在序列槽超級終端中執行
sfluboot>>tftp 50008000 u-boot-nand.bin
将程式下載下傳到50008000位置
sfluboot>>tftp 50008000 u-boot-nand.bin
dm9000 i/o: 0x18800300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 00:40:5c:26:0a:5b
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.3; our IP address is 192.168.1.10
Filename 'u-boot-nand.bin'.
Load address: 0x50008000
Loading: ###################
800.8 KiB/s
done
Bytes transferred = 276392 (437a8 hex)
速度很快比JTAG爽多了。