網卡移植
網卡初始化函數的位置在board.c檔案的baord_init函數中調用了dm9000_pre_init();這個函數,而我們使用的開發闆就是dm9000的開發闆,是以主要是移植這個函數
三星版本的開發闆smdvv210 的網卡是接在SRAM的bank 5中的,而我們的的是接在bank 1 中,是以根據資料手冊對SRAM中各個寄存器的定義進行對應的修改,修改結果如下
<code>static</code> <code>void</code> <code>dm9000_pre_init(</code><code>void</code><code>)</code>
<code>{</code>
<code>unsigned </code><code>int</code> <code>tmp;</code>
<code>#if defined(DM9000_16BIT_DATA)</code>
<code>SROM_BW_REG &= ~(0xf << 4);</code>
<code>SROM_BW_REG |= (0<<7) | (1<<6) | (1<<5) | (1<<4);</code>
<code>#else</code>
<code>SROM_BW_REG &= ~(0xf << 20);</code>
<code>SROM_BW_REG |= (0<<19) | (0<<18) | (0<<16);</code>
<code>#endif</code>
<code>SROM_BC1_REG = ((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0));</code>
<code>tmp = MP01CON_REG;</code>
<code>tmp &=~(0xf<<4);</code>
<code>tmp |=(2<<4);</code>
<code>MP01CON_REG = tmp;</code>
<code>}</code>
對應的修改對應的宏定義
(1)#define CONFIG_DM9000_BASE (0xA8000000),這個是網卡的基位址,我們使用的bank 1 對應的是0x8800000,但是實際上這個位址是不行的,應該改為88000300,原因可能是網卡晶片内部的寄存器本身就存在一個300的偏移量,是以要改為
#define CONFIG_DM9000_BASE (0x88000300)
(2)#define DM9000_DATA (CONFIG_DM9000_BASE+2)
改為
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
+4的原因是 DM9000_DATA對應CMD引腳,因為端口複用的原因,這個引腳為高低電平時分别是表示發送位址和指令,CMD這個引腳接的是ADDR2(位址總線的第二根( 0 1 2 )),是以+4是因為4=100剛好對應第二跟位址總線也就是ADDR2
<a href="http://s5.51cto.com/wyfs02/M02/86/0A/wKiom1ezKI6i31WHAACpGwrfNj4799.png-wh_500x0-wm_3-wmp_4-s_130469658.png" target="_blank"></a>
将更改的代碼同步後,編譯運作測試可知,開發闆可以和虛拟機ping通,使用tftp進行下載下傳時也正常,至此三星官方uboot的移植已經完成
本文轉自 菜鳥養成記 51CTO部落格,原文連結:http://blog.51cto.com/11674570/1839384