溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

S5PV210-uboot移植-從三星官方uboot開始移植

發(fā)布時(shí)間:2020-08-02 09:35:04 來源:網(wǎng)絡(luò) 閱讀:805 作者:小溢 欄目:系統(tǒng)運(yùn)維



11、1、uboot移植前的準(zhǔn)備工作

1、三星移植過的uboot源代碼準(zhǔn)備

(1)三星對(duì)于S5PV210的官方開發(fā)板為SMDKV210,對(duì)應(yīng)移植過的uboot是android_uboot_smdkv210.tar.bz2在資源下載中

(2)這個(gè)源代碼網(wǎng)上是下載不到的,剛開始是下載不到的,三星官方是不會(huì)把這些東西放在官網(wǎng)上下載的。這些東西最初都是隨著官方的開發(fā)板一起流出的。


2、SI的準(zhǔn)備

(1)移植的時(shí)候,最重要的工作就是看代碼,改代碼,編譯運(yùn)行測(cè)試

(2)編譯代碼必須在Linux中進(jìn)行編譯(因?yàn)橐獎(jiǎng)?chuàng)建符號(hào)鏈接,Windows共享文件夾中配置uboot是不行的),看代碼和改代碼可以在Linux中(vim)也可以在windows中(SI)。

(3)正確的方法,應(yīng)該是,在windows中解壓一份uboot源代碼,在Linux也解壓一份源代碼,這兩分開始時(shí)是一模一樣的,然后我們移植的時(shí)候,是在windows中的這一份去看代碼,改代碼,然后在Linux中這一份去編譯燒寫。這種做法需要在windows中和Linux中兩分代碼之間保持一個(gè)同步,就是你windows中改過了后,要把改過后的源代碼復(fù)制到Linux中那一份去覆蓋Linux里面的同目錄通文件

(4)問題來了,怎么在windows中和Linux中去同步代碼?通過共享文件夾在Linux中進(jìn)行復(fù)制,也可以通過一些專用的工具sshsecureshell


11、2、便捷文件傳輸工具sshsecureshell

1、windows中安裝sshsecureshell客戶端


在Ubuntu10.04版本中,重啟網(wǎng)卡的命令是 /etc/init.d/networking/ restart

在Ubuntu14.04版本中,重啟網(wǎng)卡的命令是 ifdown eth0  ifup eth0 校園網(wǎng)時(shí)發(fā)現(xiàn)NAT模式下好使


11、3、Ubuntu14.04上網(wǎng)及安裝openssh

1、虛擬機(jī)上網(wǎng)要注意,你是用橋接上網(wǎng)的,還是NAT模式上網(wǎng)的。第二個(gè)要注意,Ubuntu中網(wǎng)絡(luò)的配置文件中的,/etc/network/interfaces 這個(gè)文件中是配置網(wǎng)卡信息的,是靜態(tài)IP還是dhcp靜態(tài)IP是多少。第三個(gè)如果是橋接模式要注意,要注意橋接到哪個(gè)網(wǎng)卡上,一般筆記本有兩個(gè)網(wǎng)卡,有限網(wǎng)卡和無線網(wǎng)卡。如果是NAT模式是沒有關(guān)系的。

Ubuntu14.04中重啟網(wǎng)卡的命令變了,ifdown eth0 ifup eth0。


如果用的校園網(wǎng)的話,你要想上網(wǎng)只能通過NAT模式,因?yàn)槲覀兊碾娔X要連到校園網(wǎng)的dhcp服務(wù)器上,會(huì)自動(dòng)給我們電腦和ubunut分配一個(gè)ip地址,所以/etc/network/interfaces 這個(gè)文件中的內(nèi)容,要設(shè)置成dhcp自動(dòng)獲取IP地址的方式,同時(shí)網(wǎng)絡(luò)中心中的虛擬機(jī)獲取方式也要設(shè)置成自動(dòng)獲取ip地址的方式。


如果用wife的話,NAT模式也好時(shí),橋接模式也好時(shí)。

如果你想讓虛擬機(jī)Ping通windows,首先虛擬機(jī)要選擇橋接模式上網(wǎng),要橋接到有線網(wǎng)卡上,同時(shí)由于windows有bug,所以widows的網(wǎng)上口,必須用網(wǎng)線連接到一個(gè)有上網(wǎng)能力的地方。之后將,Ubuntu中的/etc/network/interfaces 文件中改成static靜態(tài)模式,因?yàn)檫@樣在每次開機(jī)的時(shí)候ip地址就不會(huì)變了。將里面的ip地址設(shè)置成和我們主機(jī)windows在同一個(gè)網(wǎng)段上。之后重啟網(wǎng)卡ifdown eth0 ifup eth0 ,在Ubuntu終端下,ping主機(jī),如果ping通了,就OK了,這時(shí)你的SSH通信就可以了。openssh類似的工具就可以使用了


2、搭建openssh環(huán)境

(1)、ubuntu上網(wǎng)

(2)、安裝openssh-server。如果報(bào)錯(cuò)提示依賴錯(cuò)誤,可以參考:http://www.cnblogs.com/mliudong/p/4094519.html


(3)securecrt登錄

(4)sshsecretshell登錄  兩者都可以

如果ssh登錄不上,要修改/etc/ssh/sshd_config,參考:http://blog.sina.com.cn/s/blog_5f435c130102v6pv.html。 修改完重啟時(shí)如果/etc/init.d/ssh restart不起作用,可以使用:ps -e | grep ssh,看sshd的進(jìn)程號(hào),然后kill -9 進(jìn)程號(hào)殺死ssh進(jìn)程以達(dá)到重啟的目的,或者直接重啟ubuntu系統(tǒng)。





11、4、三星的uboot移植

0、先直接用三星移植過的uboot,看什么情況

1、將uboot復(fù)制到Linux的源生目錄下,解壓。

2、檢查makefile中的交叉編譯工具鏈

3、配置,我們配置的時(shí)候,因?yàn)槿堑氖莝mdkv210xxxx,所以我們先重第一個(gè)開始試,先用smdkv210single_config來配置一下試試,用這個(gè)的話,我們配置頭文件是在include/config/smdkv210single.h

4、配置完成后,直接make編譯,完了之后直接燒錄到SD卡上,啟動(dòng)下試試。

5、在uboot/sd_fusing/sd_fusing.sh 這個(gè)腳本是用來燒錄的。但有時(shí)這個(gè)腳本需要修改一些的東西,看腳本中的BL1的位置在哪里,還有整個(gè)uboot的大小分別放在了SD的哪個(gè)扇區(qū)。多少個(gè)扇區(qū)。應(yīng)該是1和49,可以從uboot的源代碼中找到那個(gè)計(jì)算公式,自己推到出來。在燒錄的過程要看燒錄運(yùn)行時(shí)的打印出來的信息,分析看燒錄沒燒錄成功,注意mkdbl1 和sd_fisk文件的屬性位數(shù)是否和我們當(dāng)前Ubuntu的位數(shù)一致。

6、燒錄成功后,插到開發(fā)板上試一下。


11、5、 1、代碼分析,問題查找

1、插到開發(fā)板上啟動(dòng)后,發(fā)現(xiàn)打印出來SD 檢查錯(cuò)誤(這個(gè)信息是IROM中做的)。但是電源自鎖是工作的。

回想,uboot串口打印信息時(shí),最早打印的是OK,是在start.S中的lowlevel_init中初始化時(shí)打印的。串口沒有輸出O,說明代碼在沒有執(zhí)行到O之前,代碼就已經(jīng)死掉了。但是開發(fā)板的供電鎖存是成功的,供電鎖存也是在start.S中的lowlevel_init中,所以說在供電鎖存的前面一部分代碼是沒有問題的。所以可以初步判斷,錯(cuò)誤在供電鎖存之后和串口打印出來O之前這一段代碼就有問題了。

2、接著就需要代碼的分析了,在windows下建立SI工程。發(fā)現(xiàn)可能是lowlevel_init.S中調(diào)用PMIC的問題,因?yàn)槲覀冮_發(fā)板并沒有這個(gè)電源管理芯片,所以當(dāng)我們調(diào)用這個(gè)函數(shù)的時(shí)候,I2C向PMIC發(fā)送信息是得不到PMIC電源管理芯片的應(yīng)答的,所以程序死在了這里。

將上面這個(gè)調(diào)用PMIC的函數(shù)屏蔽掉后,發(fā)現(xiàn)uboot可以啟動(dòng)了。但是很多的配置信息是有問題的,很多的功能應(yīng)該也是不能用的,都要去查驗(yàn)。



3、更改開始打印的uboot版本號(hào)后們的值,在start_armboot函數(shù)中的調(diào)用的display_banner函數(shù)中的version_string對(duì)應(yīng)的宏的值,也就是這個(gè)宏CONFIG_IDENT_STRING的值為for"xxx",這個(gè)宏在smdkv210single.h中,這是關(guān)鍵配置的頭文件。改完后,同步到Linux源生目錄下,之后在make distclean, make smdkv210single_config, make


4、時(shí)鐘配置

時(shí)鐘的代碼是不用修改的,在lowlevel_init.S中,因?yàn)槲覀內(nèi)怯玫男酒彩沁@個(gè)芯片,我們用的芯片也是這個(gè)芯片,所以我們大多數(shù)關(guān)注的應(yīng)該是開發(fā)板級(jí)別的移植,從串口打印的信息也可以看出來,時(shí)鐘的配置確實(shí)是對(duì)的,如果想改時(shí)鐘的配置,也只是需要在smdkv210single.h頭文件中打開或者關(guān)閉一個(gè)宏即可。如果要改時(shí)鐘的配置,不用改時(shí)鐘函數(shù)中的代碼,只需要改動(dòng)配置頭文件smdkv210single.h中的宏的配置就行。


5、DDR配置信息的更改

(1)因?yàn)槿堑膗boot運(yùn)行時(shí)打印出來的DDR大小是1G,但是我們的DDR是512M的,所以有問題,DDR的相關(guān)信息是有問題的??梢栽趗boot運(yùn)行的時(shí)候,用bdinfo命令看DDR等更多的信息。從bdinfo命令打印出來的信息可以看出來,DDR的起始地址三星配置為0X20000000和0X40000000,DDR的大小每片都配置成了0X20000000(512M大)。

(2)我們使用md命令和mw命令,分別讀DDR的內(nèi)存中的內(nèi)容,和往內(nèi)存中寫東西,發(fā)現(xiàn)DDR是可以用的,所以說明DDR的初始化是成功的,只是配置的不對(duì),我們?cè)谠L問0X30000000地址時(shí),發(fā)現(xiàn)訪問的情況和訪問0X20000000的情況是一樣的,可以說明我們的DDR本身確實(shí)是沒有512M大的,只有256M大小的,那為什么訪問0X30000000和訪問0X20000000內(nèi)存地址處的情況一樣呢,可能是內(nèi)存本身的一些特性,也可能是代碼中實(shí)現(xiàn)的。


6、DDR地址另外配置

(1)目標(biāo),將DDR端口0的起始地址配置為0X30000000,配置成30000000開頭的地址就可以和我們板子上的bank1第二片DDR的40000000地址連起來了。因?yàn)槲覀兊陌遄由系拇笮∈?56MB。

(2)DDR初始化的代碼在lowlevel_init.S中,初始化的代碼是不用我們改的,我們只需要改在include/configs/xxx.h中的宏配置就行。

(3)關(guān)于DDR相關(guān)參數(shù)的設(shè)置,要結(jié)合我們開發(fā)板的數(shù)據(jù)手冊(cè)進(jìn)行配置。

將配置頭文件中的#define DMC0_MEMCONFIG_0 0x20E01323 改成 #define DMC0_MEMCONFIG_0 0x30E01323

這樣的話,將來往那個(gè)DMC0CONTRL寄存器中寫入的值就變了,寄存中的值變了,相應(yīng)的硬件就會(huì)發(fā)生了變化,地址就真的映射到了3開頭的地址去了,但是硬件變了,但是軟件的配置還沒有變,所以我們要把配置文件中的這個(gè)宏#define MEMORY_BASE_ADDRESS 0x20000000 內(nèi)存的基地址也改成 0X30000000,這個(gè)是在軟件架構(gòu)成,我們告訴uboot內(nèi)存的起始地址是從哪里開始的

(4)虛擬地址映射表中相應(yīng)修改

uboot中開啟了MMU對(duì)內(nèi)存進(jìn)行了段式映射,有一張內(nèi)存映射表。

(5)怎么找這個(gè)虛擬地址映射表呢?

現(xiàn)在start.S中找_mmu_table_base:

.word mmu_table

找到mmu_table相關(guān)的符號(hào),找到了mmu_table在去在SI中索引mmu_table處,最后找到是在lowlevel_init.s中。

怎么看呢?

.set __base,0

// Access for iRAM

.rept 0x100

FL_SECTION_ENTRY __base,3,0,0,0

.set __base,__base+1

.endr

意思是從0地址開始的地方到0X10000000地址的地方這256M的空間原樣


.rept 0x200 - 0x100

.word 0x00000000

.endr

意思是0x20000000-0x10000000,這段地址映射到了0地址,應(yīng)該是不可以訪問的


.set __base,0x200

// should be accessed

.rept 0x600 - 0x200

FL_SECTION_ENTRY __base,3,0,1,1

.set __base,__base+1

.endr

意思是0x200開頭的地址范圍到0x600映射到0x200,開始的地址,原樣映射


.rept 0x800 - 0x600

.word 0x00000000

.endr

意思是0x8000-0x600地址也是不可訪問的


set __base,0x200

// 256MB for SDRAM with cacheable

.rept 0xD00 - 0xC00

FL_SECTION_ENTRY __base,3,0,1,1

.set __base,__base+1

.endr

意思是0x200開頭的地址被映射到了0XC00到0XD00范圍,一共是256M


(6)所以我們虛擬地址映射表中,應(yīng)該把C0000000-D0000000地址空間映射到30000000-40000000這個(gè)256MB的地址中去

方法是:修改這樣

set __base,0x300

// 256MB for SDRAM with cacheable

.rept 0xD00 - 0xC00

FL_SECTION_ENTRY __base,3,0,1,1

.set __base,__base+1

.endr

(7)修改完以后,在細(xì)細(xì)的檢查一下配置頭文件中的,關(guān)于內(nèi)存的宏的配置是否正確,主要是看地址是否是我改過的。


(8)運(yùn)行時(shí),發(fā)現(xiàn)只打印出來了OK,經(jīng)過分析,發(fā)現(xiàn)是DMC0_MEMCONFIG_0的問題,把這個(gè)宏的值改成0X30F01323,之后在編譯燒錄,運(yùn)行,發(fā)現(xiàn)好了一部分了。但是到SD卡打印的那段就不運(yùn)行了。

(9)經(jīng)過分析是虛擬地址到物理地址的映射函數(shù)中的問題。將-0x20000000改成-0x30000000,在 uboot/board/samsung/smdkc110/smdkc110.c中。


(10)iNand驅(qū)動(dòng)問題的解決

@1:先從現(xiàn)象定位問題。將打印出來的錯(cuò)誤信息,找到關(guān)鍵字在SI中搜索,發(fā)現(xiàn)問題的所在地方,在看當(dāng)前位置的上下文,來理解是什么原因造成的,最后發(fā)現(xiàn)是從mmc設(shè)備的擴(kuò)展寄存器中讀取到的版本號(hào)大于了我們代碼中給的5版本號(hào)導(dǎo)致的。我們第一個(gè)解決方案是將大于5改成大于8,給一更大的版本號(hào)。

@2:其中還有一個(gè)事情,就是三星的uboot中,代碼中,初始化打印的是mmc通道0的,也就inand,我們?nèi)绻麑⑦@個(gè)設(shè)備號(hào)改成了1,可能就會(huì)給外部的SD卡發(fā)送讀取到SD卡的版本號(hào),inand的版本比SD卡的版本高,雖然兩者很類似,所以改了這個(gè)通道,可能也會(huì)解決問題,就是在初始化mmc設(shè)備時(shí)的傳遞的參數(shù)。


(11)修改輸出到控制臺(tái)的串口號(hào) ,從三星默認(rèn)的串口2,修改到串口0,

@1:只需要改動(dòng),smdkv210single.h中的關(guān)于串口的那一個(gè)宏就行。串口初始化的代碼是在lowlevel_init.S中,跟標(biāo)準(zhǔn)輸入輸出綁定的是在seriver.c中??偤甓x決定初始化哪個(gè)串口的宏是在smdkv110.h中


(12)修改網(wǎng)絡(luò)的配置信息,也是在smdkv210single.h中的關(guān)于網(wǎng)絡(luò)配置的宏中修改就行。


(13)在我們uboot剛開始運(yùn)行的時(shí)候,如果你用的mmc設(shè)備是0,用的是板子上的inand的話,你的環(huán)境變量剛開始用的是uboot內(nèi)部自帶的環(huán)境變量的值,但是當(dāng)你改過了以后你在saveenv后,如果你選擇的mmc設(shè)備是0的話,那么就會(huì)保存到你mmc設(shè)備0通道對(duì)應(yīng)的設(shè)備中,我們的板子對(duì)應(yīng)的是inand,所以就保存到了inand中了,并不是保存到了你的mmc設(shè)備通道1對(duì)應(yīng)的那個(gè)sd卡通道2,我們的sd卡,

(14)所以如果我們要破壞inand中的那一份環(huán)境變量的值,而想用uboot源碼中自帶的環(huán)境變量的值的話,就需要先破壞掉inand中被從DDR中的環(huán)境變量分區(qū)保存到了inand中環(huán)境變量分區(qū)的那一份環(huán)境變量,破壞方法就在用mmc writer 0 30000000 11# 32 因?yàn)槲业沫h(huán)境變量保存時(shí),是放在了第17個(gè)扇區(qū),分區(qū)大小是32個(gè)扇區(qū)。意思就是將內(nèi)存中0x30000000中的開始的環(huán)境變量分區(qū)到整個(gè)環(huán)境變量分區(qū)的大小,全部寫成0,完了之后保存到了mmc設(shè)備通道0對(duì)應(yīng)的設(shè)備中。所以這個(gè)時(shí)候,mmc設(shè)備中對(duì)應(yīng)的環(huán)境變量分區(qū)的值就是不對(duì)了,將來在校驗(yàn)的時(shí)候,就會(huì)發(fā)現(xiàn)這個(gè)設(shè)備中沒有環(huán)境變量可以用,所以用的時(shí)候就會(huì)用uboot源碼中自帶的環(huán)境變量的值了。



(15)網(wǎng)卡驅(qū)動(dòng)的移植1

@1:srom是sram/rom,是一個(gè)統(tǒng)稱,SOC內(nèi)部的srom controller控制器就是SOC對(duì)外提供的一種總線式連接sram/rom的一種接口,如果我們的SOC要外部連接一個(gè)sram或這rom存儲(chǔ)芯片,或者一些偽裝成srom接口的芯片(如網(wǎng)卡芯片,DM9000),就需要用到SOC的這個(gè)srom controller來連接進(jìn)行外部擴(kuò)展??偩€式訪問的好處就是可以直接用地址的方式來進(jìn)行訪問,不需要通過什么發(fā)命令啊什么的,時(shí)序好什么的去訪問。當(dāng)網(wǎng)卡芯片通過srom接口接在了soc上的時(shí)候,我們的主機(jī)soc去訪問網(wǎng)卡芯片內(nèi)部的寄存器時(shí),就可以直接通過總線來用尋址的方式來直接放問網(wǎng)卡芯片。我們的板子上,網(wǎng)卡芯片是接在soc的srom中的一個(gè)bank上。

@2:網(wǎng)卡芯片內(nèi)部有很多個(gè)寄存器,既然網(wǎng)卡芯片和我們的soc是通過srom接口進(jìn)行鏈接的,我們就可以總線式的尋址去訪問網(wǎng)卡芯片,由于網(wǎng)卡芯片內(nèi)部的寄存器相對(duì)于網(wǎng)卡來說,是從0開始編址的,所以我們的soc要想通過地址去訪問到網(wǎng)卡芯片內(nèi)部的寄存器的時(shí)候,就要用一個(gè)相對(duì)地址去訪問網(wǎng)卡芯片,就是起始地址+網(wǎng)卡芯片本身寄存器的地址。

起始地址指的就是網(wǎng)卡芯片接在soc的srom的bank上的那個(gè)bank對(duì)應(yīng)的地址。也就是用soc訪問網(wǎng)卡芯片內(nèi)部寄存器的時(shí)候,要用網(wǎng)卡芯片接在srom bank上的那個(gè)基地址加上一個(gè)網(wǎng)卡芯片內(nèi)部地址的。相當(dāng)于用基地址加偏移量的方式去訪問,很好理解。

@3:主機(jī)soc要想上網(wǎng),就要對(duì)網(wǎng)卡芯片內(nèi)部寄存器進(jìn)行操作和網(wǎng)卡芯片內(nèi)部的緩沖區(qū)(可以理解為內(nèi)存)來進(jìn)行上網(wǎng),所以主機(jī)soc是通過網(wǎng)卡芯片來實(shí)現(xiàn)間接上網(wǎng)的。

@4:所以,如果連上了網(wǎng)以后,如果主機(jī)要通過網(wǎng)絡(luò)來接受數(shù)據(jù)的話,網(wǎng)卡芯片硬件會(huì)自動(dòng)的將從網(wǎng)絡(luò)來的數(shù)據(jù)放到自己內(nèi)部的緩沖區(qū)中,我們的主機(jī)soc只要去這個(gè)網(wǎng)卡芯片內(nèi)部的緩沖區(qū)中讀取數(shù)據(jù)就可以了,如果我們的主機(jī)soc想通過網(wǎng)路來發(fā)送數(shù)據(jù)的話,就只需要將我們想要發(fā)送的數(shù)據(jù)丟到網(wǎng)卡芯片內(nèi)部的緩沖區(qū)中,就行,網(wǎng)卡芯片硬件也會(huì)自動(dòng)從自己的緩沖區(qū)中把數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送出去。

@5:通過看我們開發(fā)板的原理圖,可以知道,我們網(wǎng)卡芯片有16根數(shù)據(jù)線和我們的soc相連接了,所以說明我們的soc的srom控制器用的16bit接口模式的。

@6:網(wǎng)線有8根線,但是有用的只有四根線,其他四根線是跟抗干擾有管的,這四根有用的線中,兩根發(fā),兩根收。因?yàn)榫W(wǎng)線中傳輸?shù)牟罘中盘?hào)。差分信號(hào)傳輸?shù)木嚯x相對(duì)較遠(yuǎn),抗干擾能力也較強(qiáng)

@7:網(wǎng)卡芯片有一個(gè)CS引腳:chip selcte,片選信號(hào),意思就是主機(jī)向CS發(fā)送有效信號(hào),則我們的從機(jī)芯片工作,主機(jī)向CS發(fā)送無效信號(hào),則從機(jī)芯片不工作。這個(gè)引腳要接到我們soc中的srom bank中的片選信號(hào)。我們的每一個(gè)srom bank中都有一個(gè)片選信號(hào)端CSn,從原理圖中可以看出來,我們DM9000的片選信號(hào)端接在soc中的srom bank1上,因?yàn)槭莄s1,所以我們DM9000相對(duì)我們主機(jī)soc的總線基地址就是我們主機(jī)soc中的sromc bank1的基地址(0x88000000)。

@8:DM9000的CMD引腳接到了soc的addr2引腳上,這個(gè)引腳也很重要。DM9000為了減少芯片的引腳數(shù),數(shù)據(jù)線和地址線是復(fù)用的。DATA0-DATA15這16根線是有時(shí)做數(shù)據(jù)線傳輸數(shù)據(jù)的,有時(shí)做地址線傳輸?shù)刂返?,?dāng)DM9000的CMD引腳的接受到高電平的時(shí)候,代表這時(shí)復(fù)用的是數(shù)據(jù)線,當(dāng)CMD為低電平的時(shí)候傳輸?shù)氖堑刂?,在DM9000中叫index,索引的意思,也就是相對(duì)于主機(jī)的地址的索引地址。這是查DM9000的數(shù)據(jù)手冊(cè)時(shí)知道的。

@9:這些引腳上面的電平變化都是我們soc中的sromc控制器做的,我們只需要在配置寄存器的值時(shí),充分考慮到硬件電路的接法,給我們相應(yīng)的寄存器配置正確的值就行。



(15)網(wǎng)卡驅(qū)動(dòng)的移植2

@1:uboot程序中本身就有很多網(wǎng)卡芯片驅(qū)動(dòng)的程序,在uboot/drivers/net文件夾下,有很多個(gè)關(guān)于不同網(wǎng)卡芯片的驅(qū)動(dòng)程序,大多數(shù)都是來自于Linux內(nèi)核,我們網(wǎng)卡芯片是DM9000,所以我們應(yīng)該看這個(gè)net文件夾下的dm9000.c和dm9000.h

,這兩個(gè)文件我們目前就不用看了,因?yàn)闀?huì)越看越糊涂的,因?yàn)檫€沒有開始學(xué)習(xí)驅(qū)動(dòng),對(duì)驅(qū)動(dòng),對(duì)Linux內(nèi)核對(duì)網(wǎng)絡(luò)驅(qū)動(dòng)這塊的框架不是很熟悉。

@2:我們可以不用看這個(gè)網(wǎng)卡驅(qū)動(dòng)DM9000的代碼,因?yàn)轵?qū)動(dòng)是做好的,數(shù)據(jù)和代碼是分離開的,這里只是驅(qū)動(dòng)代碼,數(shù)據(jù)是由我們開發(fā)板中的接法決定的,數(shù)據(jù)由一定的數(shù)據(jù)結(jié)構(gòu)提供,所以驅(qū)動(dòng)具有可移植性,所以這里的代碼我們我可以不用動(dòng),我們要?jiǎng)拥氖菙?shù)據(jù),數(shù)據(jù)就在smdkc210single.h中關(guān)于網(wǎng)卡配置的那些宏

@3:網(wǎng)卡移植的關(guān)鍵:初始化。在uboot的第二階段,start_armboot中那個(gè)函數(shù)指針數(shù)組中,里面就有一個(gè)board_init,這個(gè)函數(shù)指針指向的那個(gè)函數(shù)中,就有網(wǎng)卡的初始化,這個(gè)初始化才是網(wǎng)卡移植的關(guān)鍵,這個(gè)初始化只要把網(wǎng)卡芯片初始化好了,網(wǎng)卡芯片就可以工作(意思是網(wǎng)卡驅(qū)動(dòng)dm9000x.c和dm9000x.h依賴于這里的初始化而工作。)

@4:dm9000_pre_init這個(gè)函數(shù)就是移植網(wǎng)卡芯片的關(guān)鍵。這個(gè)初始化函數(shù)和我們開發(fā)板上的DM9000硬件連接有關(guān),必須要結(jié)合我們開發(fā)板的原理圖來分析,然后了決定這個(gè)函數(shù)怎么編程,所以我們要根據(jù)自己的開發(fā)板的硬件接法去修改這個(gè)初始化函數(shù),來讓我們的網(wǎng)卡芯片工作

@5:DM9000_16BIT_DATA這個(gè)宏用來表示DM9000工作在16位模式下,我們的開發(fā)板上的DM9000也是工作在16位模式下的

@6:SROM_BW_REG,從三星的源碼中和對(duì)應(yīng)數(shù)據(jù)手冊(cè),可以看出三星將網(wǎng)卡芯片DM9000接在了SOC中的sromc中的bank5上,而我們的開發(fā)板DM9000網(wǎng)卡芯片是接在SOC中的srom中的bank1上的,所以根據(jù)手冊(cè)我們要操作這個(gè)寄存的bit4-bit7,這里四個(gè)bit位表示的是bank1的。

@7:我們是工作在16位模式的,所以這個(gè)SROM_BW_REG寄存中的bit4是1,因?yàn)槲覀償?shù)據(jù)線是一一對(duì)齊的,所以bit5是1,其他兩位,按照模式來的話,按照別人的經(jīng)驗(yàn)配置成1,非必須情況可以不用弄清楚這兩個(gè)位。

@8:所以根據(jù)數(shù)據(jù)手冊(cè)和實(shí)際情況,我們應(yīng)該修改的寄存有三個(gè)SROM_BC5_REG SROM_BW_REG MP01CON_REG,最后一個(gè)是在GPIO中。

@8:基地址的配置:修改完上面那個(gè)初始化函數(shù)后,因?yàn)轵?qū)動(dòng)分為兩個(gè)部分:代碼和數(shù)據(jù),代碼不用動(dòng),所以我們還要修改一些數(shù)據(jù),在配置頭文件中,關(guān)于網(wǎng)卡的那些宏。

CONFIG_DM9000_BASE 是DM9000網(wǎng)卡通過srom bank 映射到SOC的地址空間的地址,因?yàn)槲覀冇玫氖莝rom中的bank1 所以根據(jù)數(shù)據(jù)手冊(cè)中的內(nèi)存圖,可以知道,我們的基地址應(yīng)該是0X88000000。

#define DM9000_IO (CONFIG_DM9000_BASE) 這個(gè)表示訪問我們網(wǎng)卡芯片IO的基地址,尋找芯片內(nèi)部寄存器等的時(shí)候。

#define DM9000_DATA (CONFIG_DM9000_BASE+4) 還有這個(gè)宏,我們要改成4,這個(gè)宏是來決定我們當(dāng)前發(fā)送的是數(shù)據(jù)的,當(dāng)我們要發(fā)送數(shù)據(jù)的時(shí)候,由原理圖知道,我們的CMD引腳接在了ADDR2,也就第二根地址線上,4的就100,所以就是讓第二根地址線保持高電平,這樣就表示復(fù)用發(fā)送數(shù)據(jù)。

@9:改完這些,網(wǎng)卡實(shí)際上不可以直接工作的,還要修改CONFIG_DM9000_BASE 將這個(gè)地址的0X88000000改成0X88000300,為什么改成這個(gè)呢,猜想可能是因?yàn)榫W(wǎng)卡芯片由于版本的問題,自身有了一個(gè)偏移量,在以前的時(shí)候,可以用這個(gè)0X88000000地址,也就是這個(gè)srom bank的地址直接就能找到DM9000本身內(nèi)部的那些寄存器的起始地址,但是可能由于版本問題,現(xiàn)在DM9000本身的寄存器的地址是從300H開始的。


@10:內(nèi)核啟動(dòng)不起來,將串口改到串口2,因?yàn)槿翘峁┑腖inux內(nèi)核用的是串口2,看配置頭文件中有沒有這兩個(gè)宏,

#define CONFIG_SETUP_MEMORY_TAGS

#define CONFIG_CMDLINE_TAG

這兩個(gè)宏,確保傳參的
















向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI