uboot移植——DM9000的移植
以下內容源于朱有鵬嵌入式課程的學習,如有侵權,請告知刪除。
一、網卡相關的基本知識
1、網卡芯片和SoC的連接方式
上面的引腳中,重要的引腳有:IOR、IOW、AEN、CMD、INT、RST,以及數據引腳 SD0-SD15。下面是引腳的作用。
(1)DM9000的CS引腳
- CS(chip_select,片選信號);
- 主機向CS發送有效信號則芯片工作,主機向CS發送無效信號則從機芯片不工作;
- 此引腳接到SROM控制器的某個片選引腳;
- s5pv210的SROM控制器有5個bank,每個bank都有一個片選信號CSn(n=0-5);
- 這里接CSn1,說明DM9000接的是SROM的bank1。
- 由此可知DM9000的總線基地址是0x8800_0000。
- DM9000的CMD引腳,并接到了210的ADDR2引腳上。
- 地址和數據是復用的。ADDR2為低,表示16位數據線上發送的是地址;ADDR2為高,表示16位數據線上發送的是數據;
- 如果要往DM9000的0x04地址寫入數據a,則要執行以下兩步:
- 第一步:ADDR2拉低,16位數據寫0x04,也就是 ?*0x8800_0000 = 0x04;(0x8800_0000這個基地址的寄存器存放的是將要訪問的某個內存的地址相對該基地址的偏移量?當要往某個地址寫入數據時,合成的地址的該基地址+偏移量?)
- 第二步:ADDR2拉高,16位數據寫a,也就是 *0x8800_0004 = a。
- 細節理解見博客http://www.cnblogs.com/biaohc/p/6413547.html
(3)DM9000通過HR911105A接口與外部網線相連
- 網線有8根線,但是實際只有4根有效通信線,另外4根都是GND,用來抗干擾的。
- 4根通信線中管發送的是有2根(TX-和TX+),管接收的2根(RX+和RX-),因為網上傳輸的是差分信號。
------------------------------------------------------------------------------------------------------------------------------------
(1)IOR:讀選擇引腳,低電平有效,即低電平是讀;IOW:寫選擇引腳,低電平有效,即低電平寫;
(2)cmd寄存器是命令/數據切換引腳,低電平時讀寫命令操作,高電平時讀寫數據操作其中。
(3)地址引腳配合AEN引腳來選通該網卡芯片,對于大多數的應用來說沒有意義,因為在我們的應用中一般只用一個網卡芯片,而這些地址引腳主要用于在多網卡芯片環境下選擇其中之一。
(4)DM9000工作的默認基地址為0x300,這里我們按照默認地址選擇,將SA9、SA8接高電平,SA7-DA4接低電平。
(5)下面這段話很關鍵:
dm9000芯片數據總線16根,地址總線只連接了1根,連接的ADDR2,dm9000中的寄存器尋址是通過數據總線來尋址的,并不是通過地址總線尋址。
當addr2為低電平時,data總線發送的是地址,前面提到了9、8地址線為1,4-7地址線為0,所以基地址是0x8800_0300 ;
當addr2為0,那么0x8800_0300地址中的值為地址,這個地址中的值對應的是dm9000芯片中的寄存器,而addr2為1即0x8800_0304這個地址對應的位數據。
(6)總結
1、
- 0x8800_0300 加上一定的偏移量,用來選擇dm9000中的寄存器;
- 0x8800_0304這個寄存器用來給dm9000中的寄存器讀寫值;
- 配合IOW、IOR兩個命令總線,可以讀取和寫入dm9000寄存器,從而進行對寄存器的操控。
- 內容參考http://blog.csdn.net/googlemi/article/details/8887871。
2、
- 在DM9000中只有兩個可以直接被處理器訪問的寄存器(為了解釋方便,這里命名為CMD端口和DATA端口);
- 訪問其他控制或者狀態寄存器的方法:1)將寄存器的地址寫到CMD端口;2)從DATA端口讀寫寄存器中的數據;
?3、讀、寫寄存器
其實INDEX端口和DATA端口的就是由芯片上的CMD引腳來區分的。低電平為INDEX端口,高電平為DATA端口。所以,要想實現讀寫寄存器,就必須先控制好CMD引腳。
若使用總線接口連接DM9000,假設總線連接后芯片的基地址為0x800300(24根地址總線),方法如下
#define _REG_DM_ADDR (*(volatile unsigned short *)0x800300) #define _REG_DM_DATA (*(volatile unsigned short *)0x800304)DM9000寄存器的寫讀寫函數: void dm9k_reg_write(u16 reg, u16 data) {udelay(20); //延時20um_REG_DM_ADDR = reg;udelay(20); //延時20um_REG_DM_DATA = data; } //這個函數即可把data中的值寫入dm9000相應的寄存器中;unsigned int dm9k_reg_read(u16 reg) {udelay(20); //延時20um _REG_DM_ADDR = reg;udelay(20);return _REG_DM_DATA ; }-------------------------------------------------------------------------------------------------------------------------------------
2、SoC的SROM控制器
(1)SROM,指的是SRAM或者ROM;
(2)SoC的SRAM控制器
- SoC提供的(對外總線式連接SRAM/ROM的)接口;
- 如果SoC要在外部外接一些SRAM/ROM類的存儲芯片,就要通過SROM控制器來連接。
(3)SROM控制器有6個bank
- 外部的SROM器件通過連接到自己的片選信號是否有效,來決定地址和數據是否可用。
- 網卡芯片好像存儲芯片,被擴展在SoC的一個地址空間中;
- SoC可以直接用一個地址來訪問網卡芯片的內部寄存器。
(5)網卡芯片內部寄存器使用相對地址訪問
- SoC訪問網卡芯片0地址寄存器的地址應該是:起始地址 + 0x00。
- 起始地址是網卡芯片接在SROM控制器的bankn所對應的基地址。
(6)主機SoC上網
- 操控網卡芯片內部的寄存器、緩沖區等資源來上網的;
- SoC是通過網卡芯片來間接上網的。
(7)總結
- 屬于一種總線式連接方式;
- SoC不需要內置網卡控制器,所有的SFR全部在網卡芯片中;
- 可以通過地址直接訪問(IO與內存統一編址),不用像NAND/SD接口一樣使用時序來訪問;
- 從邏輯上看,網卡類似于SoC內部串口等模塊。
二、uboot中的驅動文件
1、drivers/net目錄
- 各類網卡芯片文件;
- 我們開發板使用的是DM9000,因此相關文件是dm9000.h和dm9000.c;
- 這些驅動代碼源于linux kernel源代碼。
2、網卡的初始化
(1)對網卡芯片進行初始化的是,uboot的第二階段init_sequences的board_init函數,此函數在board/Samsung/smdkc110/smdkc110.c中。
- 被注釋掉的是三星提供的uboot中的代碼,后面新增的是修改的代碼。
- 在三星原版中,使用的是SROM的bank5,但是開發板使用的是bank1,因此要對SROM控制器的bank1進行初始化。
A、SROM_BW寄存器,設置SROM控制器的總配置
- 每4個位控制一個bank,對于使用的bank1,操作第7~4位。
- 網卡工作在16-bit模式,所以DataWidth1為1 。
- 原理圖連接時,SROM控制器的數據data15~0接到網卡的data15~0,因此是字節對齊的,所以AddrMode1 為1。
- 第7位和第6位和時序相關,都設置為1。
B、SROM_BCx寄存器,設置各個bank的時序信息
C、MP0_1CON寄存器,配置SROM控制器的GPIO的片選功能
- 將第7~4位設置為0010,表示MP01_1管腳為SROM控制器的bank1的片選引腳。
3、基地址的配置
(1)在原來的smdkv210single.h中,關于DM9000有如下的宏定義
- 表示基地址是0XA800_0000(因為使用的是bank5),CMD線接在了ADDR1。
- 我們的開發板接在bank1,基地址為0x8800_0000,CMD線接在ADDR2,所以數據的地址是基地址+4,如下
- 但是實測表明是不工作的,需要將CONFIG_DM9000_BASE 定義為 0x88000300,如下
- 修改為88000300的原因,應該是和DM9000芯片有關系,內部寄存器的偏移不是以0地址作為偏移,而是以0x300地址為偏移的。
4、uboot中使用ping命令,測試網卡移植是否成功
三、Linux網卡驅動的典型工作方式
1、在linux系統中,網卡是一個設備。- 此設備驅動工作后會生成一個設備名叫ethn(n是0、1、2),無線網卡名字一般叫wlan0、wlan1……然后linux系統用一些專用命令來操作網卡,如ifconfig命令。
2、Linux下的應用程序如何使用網卡驅動來進行網絡通信?
- 最通用的方法就是socket接口。
- Linux系統中有一系列的API和庫函數,提供了一個socket編程接口。
- linux下的應用程序都是通過socket來實現上網的。
- 而socket內部就是間接調用網卡驅動實現網絡通信的。
- 寫網絡編程應用層的人根本不用管驅動,只要會用socket接口即可;寫底層驅動的人根本不用管應用層,只要面向linux的網絡驅動框架模型即可。
4、ping命令的實現代碼屬于應用程序,而dm9000.h和dm9000.c這樣的代碼屬于驅動程序。
- 在uboot中,應用是直接調用驅動實現的,即ping命令是直接調用dm9000的網卡驅動中的函數來實現的。
舉例:uboot的ping命令實現
實現函數是do_ping,在common/cmd_net.c中。
使用string_to_ip函數將輸入的ip地址轉化為IPaddr_t類型值。
然后調用NetLoop函數(net\net.c中)。函數前面的部分,都是在構建ping的包;構建好后,使用PingStart函數(net\net.c中),準備發送ping包。
最后調用PingSend函數(net\net.c中),將包發出去。
PingSend函數前面在構建數據,最后使用ArpRequest函數(net\net.c),將ARP包發送。因為ping使用的是ARP包。
ArpRequest函數在之前也在做數據的處理,最后調用eth_send函數(drivers/net/dm9000x.c中),將數據包發送出去。可以看出,這個函數是和具體的網卡芯片有關的。
eth_send函數將指定的包,發送給DM9000網卡,網卡再將該包發送到網絡中。這樣,就完成了ping的ARP包的發送。
接收從網絡回發的ARP包:在net_loop函數的后面,調用eth_rx函數(drivers/net/dm9000x.c中)接收網絡數據包。此接收函數和具體網卡有關。
四、啟動內核
1、smdkv210single.h中要保證有如下宏,uboot才能給linux傳遞參數,啟動內核才能成功。
2、使用tftp命令,將鏡像下載到內存中,然后使用bootm命令運行內核。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的uboot移植——DM9000的移植的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息化建设工作计划
- 下一篇: 理解之软件需求说明书