單片機學習國產(chǎn)龍芯-軟件開發(fā)_第1頁
單片機學習國產(chǎn)龍芯-軟件開發(fā)_第2頁
單片機學習國產(chǎn)龍芯-軟件開發(fā)_第3頁
單片機學習國產(chǎn)龍芯-軟件開發(fā)_第4頁
單片機學習國產(chǎn)龍芯-軟件開發(fā)_第5頁
已閱讀5頁,還剩165頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

龍芯軟件開發(fā)非常高興可以訂購到龍芯電 龍芯軟件開發(fā)(15)--搬家前的準 龍芯軟件開發(fā)(16)--內(nèi)存參數(shù).....................................................................................................................龍芯軟件開發(fā)(17)--初始化龍芯2E緩 龍芯軟件開發(fā)(18)--乾坤大挪移,從ROM到 龍芯軟件開發(fā)(19)--C函數(shù)..........................................................................................................................龍芯軟件開發(fā)(20)--頻率和初始化實時時 龍芯軟件開發(fā)(21)--調(diào)試與功能選 龍芯軟件開發(fā)(22)--初始化環(huán)境參 龍芯軟件開發(fā)(23)--PCI設備初始 龍芯軟件開發(fā)(24)--PCI設備初始化 龍芯軟件開發(fā)(25)--PCI設備初始化 龍芯軟件開發(fā)(26)--PCI設備初始化 龍芯軟件開發(fā)(27)--網(wǎng)絡初始 龍芯軟件開發(fā)(28)--顯示卡初始 龍芯軟件開發(fā)(29)--鍵盤初始 龍芯軟件開發(fā)(30)--自動加載操作系 龍芯軟件開發(fā)(31)--PCI設備查找細 龍芯軟件開發(fā)(32)--USB協(xié)議深入分 龍芯軟件開發(fā)(33)--USB協(xié)議深入分 龍芯軟件開發(fā)(34)-USB協(xié)議深入分析設備描述符配置 龍芯軟件開發(fā)(35)-USB協(xié)議深入分析設備描述符配置 龍芯軟件開發(fā)(36)-USB協(xié)議深入分析返回設備描述 龍芯軟件開發(fā)(37)-USB協(xié)議深入分析返回設備描述 龍芯軟件開發(fā)(38)-USB協(xié)議深入分析設置USB地 龍芯軟件開發(fā)(39)-USB協(xié)議深入分析配 龍芯軟件開發(fā)(40)-USB協(xié)議深入分析字符串描述 龍芯軟件開發(fā)系

非常高興可以訂購到龍從上看到龍芯CPU發(fā)布,到現(xiàn)在看到龍芯電腦的發(fā)布,真是太讓人興奮!這是自己的CPU啦,一定要支持ARM9龍夢公司的地址,然后就去發(fā)過去,讓他們確認一下。最后通過了他們的確認,就這樣就可以訂購到龍還想在上面REACTOS。龍芯軟件開發(fā)(1)--BIOS ent.php?aid=236 PMON源碼 gxemul模擬器 能運行龍夢BIOS和內(nèi)核的模擬器,版本龍芯軟件開發(fā)(2)--匯編資MIPSAssemblyLanguageMIPSAssemblyLanguageProgrammer’s...LanguageProgDoc.pdfMIPSAssembly.../download/rs-05.pdf...L.instructions.htmlMIPS32 龍芯軟件開發(fā)(3)--常問問對于一個新答:MIPS指令。答:MIPS的名字為“ puterwithoutinterlockedpipelinestages”的縮寫。另外一個通常的非正式的說法是“Millionsofinstructionspersecond”。在64位的CPU上運行。龍芯軟件開發(fā)(4)--主要介解一下龍芯電腦的主要組成,下面先從網(wǎng)上的龍夢電腦的組成來入手。它的配置如下:ICTNB2E(ALTERAEP2C20F484),功耗0.1-0.3VIAVT82C686B,33MHz32-bitPCI內(nèi)存內(nèi)存插槽200線,14cmx18cm龍芯軟件開發(fā)(5)--北橋南橋的作北橋是基于In 理CPU,RAM,AGP端口或PCIExpress,還有南橋之間的通信。北橋(NorthBridge)是主板組中起主導作用的最重要的組成部分,也稱為主橋(HostBridge。一般來說,組的名稱就是以北橋的名稱來命名的,例如英特爾845E組的北橋是82845E,875P組的北橋是82875P等等。北橋負責與CPU的聯(lián)系并控制內(nèi)存、AGP、PCI數(shù)據(jù)在北橋內(nèi)部傳輸,提供對CPU的類型和主頻、系統(tǒng)的前端總線頻率、內(nèi)存的類型(SDRAM,DDRSDRAM以及RDRAM等等)和最大容量、ISA/PCI/AGP插槽、ECC糾錯等支持,整合型組的北橋還集成了顯示。北橋就是主板上離CPU最近的,這主要是考慮到北橋與處理器之間的通信最密切,為了提高通信性能而縮短傳輸距離。因為北橋的數(shù)據(jù)處理量非常大,發(fā)熱量也越來越大,所以現(xiàn)在的北橋都覆蓋著散熱片用來加強北橋的散熱,有些主板的北橋還會配合風扇進行散熱。因為北橋的主要功能是控制內(nèi)存,技術就完全不一樣,而是不同的組北橋間肯定在一些地方有差別。由于已經(jīng)發(fā)布的AMDK8的CPU將內(nèi)存控制器集成在了CPU內(nèi)部,于是支持K8組的北橋變得簡化多了,甚至還能采用單組結構。這也許將是一種大趨勢,北橋的功能會逐漸單一化,為了簡老早就發(fā)布了不少單組。 入設備之間的通信。/輸出,LAN,Audio,USB,BIOSHub龍芯軟件開發(fā)(6)--CPU在開發(fā)軟件中,對于CPU的了解就是最重要的了。無論什么指令都需要CPU來執(zhí)行?,F(xiàn)在就來看看龍芯2E的龍芯2號增強型處理器(簡稱“龍芯2E”)計算技術研制的、具有自主知識的642E1GHz39.93SPECCPU2000500分,是目前全球除美日之外性能最高的通用處理器。龍芯2E采用四發(fā)射的動態(tài)量超流水線結構,實現(xiàn)了先進的轉(zhuǎn)移猜測、寄存器重命名、動態(tài)調(diào)度、以2E90納米CMOS工藝,是大陸地區(qū)第90計技術的處理器。晶470035750MHz5-7線級別,還有ALU的個數(shù),在這里有四個ALU。龍芯軟件開發(fā)(7)--編譯PMON一、SVN工由于要PMON代碼,就要使用SVN工具。目前,所有的代碼都是按版本控制形式保存在服務器上的,并且沒有打包的代碼,這樣就需要使用SVN的工具來代碼。如果在WINDOWS下,就要WINDOWS的SVN工具。如果在LINUX下,就需要LINUX的GETIT工具。二、帳先到上面一個帳號,然后才能登錄進入開發(fā),否則不能登錄進去的,由于目前沒有開通諾名功能。帳號后,就可以登錄,然后通過SVN的工具下載 piler下面找到交叉編譯器,它的名稱是mips-elf.tar.gz。這是一個壓縮包,當然要解壓后才能使用。那么需要解壓到那里呢?通常都 上面已經(jīng)把交叉編譯器安裝好后,并不能直接在任何路徑里就運行它。比如到目錄到它,就需要把它所在的加到當前環(huán)境變量里,這樣才可進行編譯。而在LINUX下,設置環(huán)境變量,需exportexport 在我沒有問kkmao之前,根本就不知道還需要這樣的一個過程。因此,就編譯不通過。由于PMON是根據(jù)配置選擇不同的源程序進行編譯,所以就需要一個工具來分析那個配置文件,而這個工具就是pmoncfg。生成tools/pmoncfgmakepmoncfgTargets/Bonito/confBonitoBonito.notebook件,為了方便運行,就進行符號連接。再接著運行pmoncfg工具來生成目標源程序的。執(zhí)行下面令:ln-sBonito.notebookBonitotools/pmoncfg/pmoncfg這樣就形成目標Bonito 著再到zloader make,或者直接到zloader下面make, (模擬器也可以運行gxemul-0.3.8-good.tar.gz源程序,然后進入到里,運行./configuremakefile文件。接著運make件就可以生成模gxemulpmon.bin貝到這個下,就可以如下./gxemul-Xebonito這樣就可以運行PMON了,上面令行意思是輸出到X窗口,而代碼ROM開始地址是0xbfc00000,也就是在我的LINUX里可以編譯通過gxemul-0.4.2.current.tar.gz,但運行它時,就不支持-X參數(shù),這個問題我也龍芯軟件開發(fā)(8)--理解龍芯2E寄存器和內(nèi)對于軟件開發(fā)人員來說,一個CPU最重要的部分就是寄存器、內(nèi)存布局和指令。龍芯2E邏輯上是有32個定點通用寄存器(其中0號固定為0),32個浮點寄存器,一個hi,一個lo,以及若干cp0控制寄存器,兩個 0,可能主要用途是清空內(nèi)存地址空間,以及做一些與或非的操作,訪lllll l l FPS8S0..S7 RA二、寄存kuseg:0x0000000-0x7FFFFFFF(2G):這些地址是用戶態(tài)可用的地址。有MMU的機器里,這些地址將一概被MMU作轉(zhuǎn)換。除非MMU的設置被建立好,這2G地址是不可用的。對于沒有MMU的機器,存取這2G地址的后依具體機器相關。你的CPU具體廠商提供的手冊將會告訴你關于這方面的MMUMIPSkseg0:0x800000000x9FFFFFFF(512M):把最清零,然后把它們映射到物理地址低段512M(0x00000000-0x1FFFFFFF)。因為這種映射是很簡數(shù)據(jù)的存放位置。對于有MMU的系統(tǒng),操作系統(tǒng)會存放在這個區(qū)域。kseg1:0xA00000000xBFFFFFFF(512M):3將使用這段地址空間去存取你的初始化ROM。大多數(shù)人在這段空間使用I/O寄存器。kseg2:0xC0000000-0xFFFFFFFF(1G):這段地址空間只能在態(tài)下使用并且要經(jīng)過MMU的轉(zhuǎn)換。在MMU設置好之前,不能存取這段區(qū)域。除非你在寫一個真正的操作系統(tǒng),一般來說你不需要使用這段地址空龍芯軟件開發(fā)(9)--理解龍芯2E幾個匯編問lw$9,0($8) jalmyfuncmovea0, addiu 龍芯軟件開發(fā)(102E每個CPU都有自己獨特的指令,比如X86結構的CPU有IN的指令系統(tǒng),MIPS的CPU也有自己的指令系做出響應的。如果發(fā)送一條不是CPU的指令,就會導致CPU執(zhí)行,并且會引起CPU異常。龍芯里,每條指令都是固定長度:324個字節(jié)。因此,任何指令段的代碼長度,一定要4字節(jié)的倍數(shù),絕對不要出現(xiàn)不是4的倍數(shù),否則就讓CPU不能運行了。從龍芯的使用手冊中可以看到,每條CPU指令都是一條32位的指令字,這些指令都是字對齊的。指令集包含2-1(I-型(J-型)和寄存器指令(J-型。使用簡單幾種指令格式可以簡化指令譯碼,并且使得編譯器根據(jù)這三種指令格式可以合成的復雜操作(使用頻率LoadandStore訪存指令在主存和通用寄存器之間移動數(shù)據(jù)。訪存指令都是立即數(shù)指令(I-型,因為該指令模式所支持的唯一訪存模式就是基址寄存器加上16位的對齊的偏移量。Computational計算型指令完成寄存器值的算術,邏輯,移位,乘法和除法操作。計算型指令包含了寄存?zhèn)€16位的立即數(shù)。龍芯2E微處理器還實現(xiàn)了自定義的乘法,除法和模操作指令,其方法是使用一個通用的JumpandBranch跳轉(zhuǎn)和分支指令改變程序的控制流。絕對地址跳轉(zhuǎn)被稱為“jump(跳轉(zhuǎn))”(J-型或者R-型),PC(指令計數(shù)器)相關的跳轉(zhuǎn)指令被稱為“branch(分支)”(I-型。跳轉(zhuǎn)指令的返回地址保存在第31號寄存器中。CoprocessorI2E器有兩個協(xié)處理器:0號協(xié)處理器(系統(tǒng)處理器)和1號協(xié)處理器(浮點協(xié)處理器。號協(xié)處理器(CP1)指令包括浮點指令,多指令,和龍芯擴展的定點計算指令。這些指令都是在浮點寄Exception異常指令引起跳轉(zhuǎn),根據(jù)異常號比較結果跳轉(zhuǎn)到通用異常處理向量。這些指令包括R-型和MIPSIIIIIIMIPSIIIIIIIIIIIIIIII2-2CPU(ALUMIPSIId=((signed)ssignedj1:0jId=((unsigned)sunsignedj1:0jIIIIIMIPS加II減IId=((signed)s<(signed)t)?Id=((unsigned)s<(unsigned)t)?I與I或IIIMIPS乘II除IIIIIIMIPSJIIIIIIIIIIIIMIPSIIIIIId=(longlong)s<<(shift+32)d=(longlongunsigned)s>>(shift%32)d=(longlongsigned)s>>(shift%32+32)MIPSIIMIPSOpCode MIPSII龍芯軟件開發(fā)(11)--龍芯2E運行的第一行天生萬物,萬物始于天。同樣,龍芯2E要運行起來,那么就少不了程序。那么龍芯2E的開天是從那里開程序,去看看龍芯的初始化階段都做了些什么事情,有沒有做壞事情呢?哈哈,這個很難說的。如果有BUG的出現(xiàn),就會干出各種各樣的壞事情。0xBFC000000x1FC00000PMONROMFlashPMONstart.S .globl.globl

.globlstack=start- /*PlacePMONstackbelowPMONstartinRAM/*NOTE!!Notmorethat16instructionshere!!!Rightnowit'sFULL!*/ zero,COP_0_STATUS_REG zero,lit0,SR_BOOT_EXC_VEC/*ExceptiontoBoostrapLocation*/ t0,COP_0_STATUS_REGlasp,stacklagp,_gpbal /*Switchtouncachedaddressspaceballocate /*Getcurrentexecuteaddress*/orra, /*2006-12-28OK,從上面看到,第一行程序運行的就是mtc0zero,COP_0_STATUS_REG。找到了第一行運行的程序,但這 GCC,那么它的匯編 .globl.globl .globlstack=start- /*PlacePMONstackbelowPMONstartinRAM在這里定義了子程序的名稱_startstartstack/*NOTE!!Notmorethat16instructionshere!!!Rightnowit'sFULL!*/ zero,COP_0_STATUS_REG zero,lit0,SR_BOOT_EXC_VEC/*ExceptiontoBoostrapLocation*/ t0,COP_0_STATUS_REGlasp,stacklagp,_gp由于龍芯的地址空間決定,這里的代碼過32條指令,因為后面緊跟著是其它中斷向量的地址。接著,CP0狀態(tài)寄存器COP_0_STATUS_REGCOP_0_CAUSE_REG寄存器全部清空為0lit0SR_BOOT_EXC_VEC接BEVCP0TLB設置引導程序的堆??臻g,lasp,stacksplagp,_gp_gp全baluncached /*Switchtouncachedaddressspace*/ballocate /*Getcurrentexecuteaddress*/orra, 就跳到uncached這里運行,先來看看bal指令會做些什么事情,通常bal指令會算出相對于PC寄存器的偏移量,然后把PC+8指令地址放到RA寄存器里,也就是把ballocate指令地址放到RA寄存器,以便可以返回。由于龍芯2E的加電時啟動地址是0xBFC00000,那么放在RA里的值就是0xBFCO0028。后面orra,UNCACHED_MEMORY_ADDR,這里進行是與0xA00000000的或運算,也就是說從ROM加載時,不會改變返回地址RA的值。主要是從其它地址空間運行這段程序時才會引起跳轉(zhuǎn)的地址空間的轉(zhuǎn)換。所以接著就跳回來到 locate位置并執(zhí)行ballocate指令,這樣就跳到locate的位置執(zhí)行程序了。龍芯軟件開發(fā)(122E摸索 ands0,0xffff0000 .set …bal/*bonitoendianess*/BONITO_BIS(BONITO_BONPONCFG,BONITO_BONPONCFG_IS_ARBITER)…0481:move /*localname*/lwt3,Init_Op(a0)lwt0,Init_A0(a0)andt4,t3,OP_MASK*bnet4,OP_EXIT,8fb.done…跳到locate里執(zhí)行的,首先計算跳轉(zhuǎn)時代碼的長度,保存s0。接著把物理地址保存到bonito寄存器,后面bal1f1標號地方運行。在1標號的地方,取跳轉(zhuǎn)時壓入的RA寄存器的值,然后通過寄存器相對尋址的方式,取得跳轉(zhuǎn)指令后面保存的參數(shù),并保存到t3,t0寄存器。后面就運行bne t4,OP_EXIT,8f這句了,在這里作是否初始化寄存器完成的判斷,如果沒有完成,就會跳到后面8標號處運行,然后經(jīng)歷一系列的設置后,直到OP_EXIT標志出現(xiàn)。看到前面有一行EXIT_INIT(0,這里就是說這個數(shù)據(jù)結構已經(jīng)結構了,它的宏定義如下:#defineEXIT_INIT(status).word.word PRINTSTR("\r\nPMON2000MIPSInitializing.Standby...\r\n") balhexserialPRINTSTR(" balhexserialPRINTSTR(" balhexserial/*2006-12-29于在這段程序里,主要做了兩件大事情,一是初始化南橋VIA686B,一是初始化串口輸出。初始化的辦法,就是加一個指示燈,這也叫“點燈”。只要串口能輸出字符串后,使用串口調(diào)試就成為基本的CP0ID龍芯軟件開發(fā)(13)--配置南橋進入調(diào)試串口輸出東西。先來看superio_init實現(xiàn)代碼:#definePCICONF_WRITEB(dev,func,reg,data)\ a0,CFGADDR(dev,func,reg);\ a1,PHYS_TO_UNCACHED(PCI_CFG_SPACE); a2,a0,0xffff; a1,a2; a0,16; a2,BONITO_BASE+BONITO_PCIMAP_CFG; a0,BONITO_PCIMAP_CFG(bonito);\ a0,zero,data;\ #definePCICONF_WRITEW(dev,func,reg,data)\ a0,CFGADDR(dev,func,reg);\ a1,PHYS_TO_UNCACHED(PCI_CFG_SPACE); a2,a0,0xffff; a1,a2; a0,16; a2,BONITO_BASE+BONITO_PCIMAP_CFG; a0,BONITO_PCIMAP_CFG(bonito);\ a0,zero,data;\ #definePCICONF_ORB(dev,func,reg,data)\ a0,CFGADDR(dev,func,reg);\ a1,PHYS_TO_UNCACHED(PCI_CFG_SPACE); a2,a0,0xffff; a1,a2; a0,16; a2,BONITO_BASE+BONITO_PCIMAP_CFG; a0,BONITO_PCIMAP_CFG(bonito);\ zero,BONITO_PCIMAP_CFG(bonito);\lbua2,(a1);\oria2,data; a0,BONITO_PCIMAP_CFG(bonito);\ zero,BONITO_PCIMAP_CFG(bonito);sb#defineSUPERIO_WR(idx,data) v0,BONITO_PCIIO_BASE_VA+0x3f0; v1,zero,idx; v1,(v0);\ #defineE2_EPP#defineE2_S1#defineE2_S2#defineE2_FLOPPY(1<<4)/*positivedecode*//*enableRTC/PS2/KBC*/SUPERIO_WR(0xe2,E2_S2|E2_S1|E2_EPP|E2_FLOPPY)/*enableserialandfloppy*/SUPERIO_WR(0xe3,0x3f0>>2)/*floppybaseaddress*/SUPERIO_WR(0xe6,0x378>>2)/*parallelport*/SUPERIO_WR(0xe7,0x3f8>>2)/*setserialport1baseaddr0x3f8*/SUPERIO_WR(0xe8,0x2f8>>2)/*setserialport2baseaddr0x2f8*/SUPERIO_WR(0xee,0xc0)/*bothportsonhighspeed*/lui$a0,0x1lui$a1,0xbfe8 or$a1,$a1,$a2srl$a0,$a0,0x10lui$a2,0x1fe0sw$a0,280($s4)li$a0,0x7后面那些都是設置SUPERIO端口,分配地址。lav0,liv1,FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_4sbv1,NSREG(NS16550_FIFO)(v0)liv1,sbv1,liv1,NS16550HZ/2/(16*CONS_BAUD)sbv1,NSREG(NS16550_DATA)(v0)srlv1,sbv1,NSREG(NS16550_IER)(v0)liv1,CFCR_8BITSsbv1,liv1,sbv1,liv1,sbv1, /*2006-12-30于這里先獲取COM1的址,是通過內(nèi)存映射地址實現(xiàn)的。接著把FIFO的設置,設置CFCR寄存器,設置波特NS16550HZ臺電腦上,就可看到調(diào)試信息輸出來,當然還可以實現(xiàn)源碼級調(diào)試了。龍芯軟件開發(fā)(14)--串口PRINTSTR(" PRINTSTR(x).rdata;98:.ascizx;.text;laa0,98b;balstringserial;98:.ascizla現(xiàn)在又去查看stringserial的代碼,它如下: a2,ra a1,a0,s0lbua0,0(a1) baladdiua1,1 lbua0, 上面代碼,先把返回地址ra保存到a2,然后計算字符串的地址,接著通過lbu獲取第一個字符,在beqz里addiub1b面還有一行l(wèi)bua0,0(a1)。由于龍芯是流水線的CPU,當跳轉(zhuǎn)發(fā)生時,已經(jīng)把后面那一條指令解釋執(zhí)行完成了,所以a0里總是保存的字符。 a2, lia3,7rola0,a1,4 a1,a0anda0,0xflav0,hexchar v0,s0 v0,a0lbua0,0(v0) a3, a3,- 是做8次的計數(shù)。bneza3,1b lav0,lav0,lbuv1,andv1,LSR_TXRDY v1,1bsba0, v1,lav0,bnev0,v1,1b 龍芯軟件開發(fā)(15)--搬家前的準任何人在搬家前,都需要把新房子修建好,然后再經(jīng)過裝修才能住到新房子里,然而這里的啟動程序也不例而是內(nèi)存空間。由于在ROM運行的速度都是比較慢,并且空間有限,不能隨時更改ROM里的內(nèi)容。同時為了下MMSDRAM在龍芯電腦里,使用的內(nèi)存是標準的筆記本內(nèi)存,也就是叫做SO-DIMM一條線表示時鐘信號,一條線表示數(shù)據(jù)信號,不管數(shù)據(jù)是,還是寫入,都是通過數(shù)據(jù)線來進行的。無論命令,而不同地址的設備就不會響應后面令。為什么DIMM內(nèi)存上的EEPROM,就需要按I2C的協(xié)議PRINTSTR("DIMM/*onlyonememoryslot,slaveaddress blia1,lia0,0xa1#savea1movet1,a1movea0,v0#restorea1movea1,t1addiu v0,0x20bleua1,v0,1bli#setsomeparametersfor#ranknumberandDDRtypefieldwillbefilledlater#tocheck:fixTCAS?lisdCfg,0x341043dflia0,0xa1/*readDIMMmemorytype(mustbeDDRAM)*/#lia1,2 PRINTSTR("readmemory/*readDIMMnumberofrows*/lia0,0xa1lia1,3 a0, v0, s1, v0,PRINTSTR("readnumberof2:/*readDIMMnumberofcols*/lia0,0xa1lia1,4 v0, t1,bnet1,0,10fbnev0,2,20fliv0, 20:bnev0,1,21fliv0, 21:bnev0,0,22fliv0, 22:bnev0,3,33fliv0, 10:bnet1,1,11fbnev0,3,20fliv0, 20:bnev0,2,21fliv0, 21:bnev0,1,liv0, 22:bnev0,4,33fliv0, 11:bnet1,2,33fbnev0,4,20fliv0, 20:bnev0,3,21fliv0, 21:bnev0,2,33fliv0, 33:PRINTSTR("DDRtypenotsupported!\r\n");34:b #bit25:22isDDRtypefieldsllv0,22orsdCfg,v0/*readDIMMmemorysizeperside*/lia0,0xa1lia1,31 slltmpsize,v0,22 #multiplyby4MPRINTSTR("readmemorysizeper2:/*readDIMMnumberofblocks-per-ddrram*/lia1,17balPRINTSTR("readblocksper2:/*readDIMMnumberofsides(banks)*/lia1,5slltmpsize,1#msize*=2orsdCfg,0x1<<27PRINTSTR("readnumberof2:/*readDIMMwidth*/lia1,6 PRINTSTR("read2:addu PRINTSTR("\r\nNoDIMMinslot") balhexserial #limsize,0x#lisdCfg,0x3d9043df#~133MHzlimsize,0xli PRINTSTR("DIMM balhexseriallit0,0xbff00008sdsdCfg,0(t0)####gx2006-03-17:modelit1,0x28lit0,0xbff00000sdt1,0(t0)lilit0,0xbff00000sdt1,0x30(t0)####setuphighmemorywindow#### t1,0x msize,t1,luit1,0x2000luit1,0x1000 balhexserial balhexserialli #accumulatepcimembasecfg/*setbar0maskandtranslationtopointtoSDRAMsubnotandt0,BONITO_PCIMEMBASECFG_MEMBASE0_MASKorliandt0,BONITO_PCIMEMBASECFG_MEMBASE0_TRANSoror/*setbar1tominimumsizetoconservePCIspace*/lit0,~0andt0,BONITO_PCIMEMBASECFG_MEMBASE1_MASKorliandt0,BONITO_PCIMEMBASECFG_MEMBASE1_TRANSororsw/*enableconfigurationcyclesnow*/lwt0,BONITO_BONPONCFG(bonito)andsw/*2007-1-1于*/PRINTSTR("InitSDRAMDone!\r\n");龍芯軟件開發(fā)(16)--內(nèi)存參數(shù)lia1,0x0lia0,0xa1數(shù)i2cread是怎么樣I2C數(shù)據(jù)。/*a0:slaveaddressa1:regoff/*setdeviceaddressliv0,0xbfd00000+lia0,0xa1sba0,0(v0);/*storeregisteroffsetliv0,0xbfd00000+ sba1,0(v0);/*readbytedataprotocol*/liv0,0x08liv1,0xbfd00000+sbv0,/*makesureSMBhostreadytostart,important!--zfx*/liv1,0xbfd00000+SMBUS_HOST_STATUSlbuv0,0(v1)andiv0,v0,0x1fbeqzv0,1fsbv0,lbuv0, #flushthe/*startliv1,0xbfd00000+lbuv0,0(v1)oriv0,v0,0x40sbv0,0(v1);/*waitliv1,0xbfd00000+lia1,#if/*delay*/lia0,0x1000 addiua0,-addiua1,-1 lbuv0,andiv0,bnezv0,1b#IDEL?liv1,0xbfd00000+lbuv0,0(v1)andiv0,v0,0x1fbeqzv0,1fsbv0, lbuv0, #flushtheliv1,0xbfd00000+lbuv0,第2字節(jié)表示內(nèi)存類型。3字節(jié)表示行地址位數(shù)。4字節(jié)表示列地址位數(shù)。第5字節(jié)表示排數(shù)。6字節(jié)表示數(shù)據(jù)寬度(低字節(jié)。第7字節(jié)表示數(shù)據(jù)寬度(高字節(jié)。第8字節(jié)表示信號電平。第10字節(jié)表示SDRAM時間。第11字節(jié)表示配置類型。第16字節(jié)表示支持突發(fā)傳輸長度。23SDRM鐘。2最大指數(shù)倍。第24字節(jié)表示SDRAM時間。34字節(jié)表示輸入數(shù)據(jù)建立時間。第35字節(jié)表示輸入數(shù)據(jù)保持時間。62字節(jié)表示SPD版本號。其它的字節(jié),就要參考SPD文檔了。后面一大段程序就是實現(xiàn)了這些參數(shù),然后根據(jù)這些參數(shù)來設置龍芯內(nèi)存的SDRAM寄存器。/*2007-1-2于*/PRINTSTR("DIMM balhexseriallit0,0xbff00008sdsdCfg,0(t0)####gx2006-03-17:modelit1,0x28lit0,0xbff00000sdt1,0(t0)lilit0,0xbff00000sdt1,0x30(t0)####setuphighmemorywindow#### t1,0x msize,t1,luit1,0x2000luit1,0x1000 balhexserial balhexserial龍芯軟件開發(fā)(17)--初始化2ECPU,都具有大量的緩存。由于很多程序都具有局部循環(huán)特性,使用緩存就可以大大地提高CPU效率。比如像下面的程序:intnSum=for(inti=0;i<10000;{nSum+=}64K,64K512K。一級緩存采用虛地址索引和物理地址標SYNC,只要運行這條指令,就可TTYDBG("Sizing t3,COP_0_CONFIG/*t3=originalconfigandt3, /*MakesurecoherencyisOKandt3,~(CF_7_TE|CF_7_SE|CF_7_TC|CF_7_SC)/*disableL2/L3cache*/ t3,COP_0_CONFIGlit2,srlt1,t3,andt1, s3,t2, /*s3=Icachesize#ifdef andt1,t3,0x20srlt1,t1,1 s4,t1, /*s4=Icachelinesizesrlt1,t3,6andt1,3 s5,t2, /*s5=Dcachesize#ifdef andt1,t3, s6,t1,16 /*s6=Dcachelinesize*/TTYDBG("Initcaches...\r\n")lis7, /*noL2cachelis8, /*noL3cacheCPUIDIDCPUTTYDBG("godson2cachesfound\r\n")balgodson2_cache_init####part2#### t4, t5,t4,0x0e00srlt5,t5,9 t6,t4,0x01c0srlt6,t6,6addiut6,t6,11addiut5,t5,11addiut4,$0,1 t6,t4,t6srlt6,1 t5,t4,srladdiut7,$0,2####part3####luia0,0x8000 a1,$0,t5 a2,$0, ,a1=icache_size,a2=dcache_size#a3,v0andv1usedaslocalregisters $0, v0,$0,a0 v1,a0,1:slta3,v0,v1beqa3,$0,1f $0,cacheIndex_Store_Tag_D,0x0(v0) $0,CP0_TAGLOcacheIndex_Store_Tag_D,0x1(v0) $0,CP0_TAGLO $0,CP0_TAGLOcacheIndex_Store_Tag_D,0x3(v0)beq$0,$0,1baddiuv0,v0,上面的代碼是通過循環(huán)初始化64K數(shù)據(jù)緩存。首先使用mtc0指令清空TagLo寄存器,然后把0x80000000開始的內(nèi)存映射到數(shù)據(jù)緩存索引,它是通過指令cache來進行的。Index_Store_Tag_D的值是0x05,意思就是v0寄存的值加0x0TagLoTagHi。這樣就把64K數(shù)據(jù)緩存指向了0x80000000開始的64K內(nèi)存了。#if$0,v0,$0,v1,a0,a3,v0,a3,$0,$0,Index_Store_Tag_S,$0,Index_Store_Tag_S,$0, Index_Store_Tag_S, $0, $0,$0,1b v0,v0, v0,$0,a0 v1,a0,128*10241:slta3,v0,v1beqa3,$0,1fcacheIndex_Writeback_Inv_S,0x0(v0)cacheIndex_Writeback_Inv_S,0x1(v0)cacheIndex_Writeback_Inv_S,0x2(v0)cacheIndex_Writeback_Inv_S,0x3(v0)beq$0,$0,1baddiuv0,v0,0x20#endif v0,$0,a0 v1,a0,1:slta3,v0,v1beqa3,$0,1fcacheIndex_Invalidate_I,0x0(v0)#cacheIndex_Invalidate_I,0x1(v0)#cacheIndex_Invalidate_I,0x2(v0)#cacheIndex_Invalidate_I,beq$0,$0,1baddiuv0,v0, v0,$0,a0 v1,a0,1:slta3,v0,v1beqa3,$0,1fcacheIndex_Writeback_Inv_D,0x0(v0)cacheIndex_Writeback_Inv_D,0x1(v0)cacheIndex_Writeback_Inv_D,cacheIndex_Writeback_Inv_D,beq$0,$0,1baddiuv0,v0,0x20TTYDBG("cacheinitpanic\r\n");1:b 0x800000000x9FFFFFFF的虛擬內(nèi)存運行,這樣在內(nèi)存運行的代碼就非??炝?。龍芯軟件開發(fā)(18)--乾坤大挪移,從ROM到的存取速度比ROM里快很多,并且可以隨時修改數(shù)據(jù),而在ROM是不能修改的,就算可以修改,也是非常慢的。#####xuhua########opencp1#if1

后先用通過0x24000000來打開浮點協(xié)處理器,把值改寫回到狀態(tài)寄存器。/*closeL2cache a0,0xbfe00164 a0,a0,~((1<<12)|3) TTYDBG("CopyPMONtoexecutelocation...\r\n")#ifdefDEBUG_LOCORETTYDBG("start=0x")laa0,startTTYDBG("\r\ns0=0x") a0,s0balhexseriallaa0,lia1,0xbfc00000laa2,_edata a0, t1,a2,a0srlt1,t1,2 t0, t1, t2,0000,a1ROM0xbfc00000,a2RAM/*copytextsection*/1:andt3,t0,0x0000ffff li 2:lwt3,0(t1)swt3,0(t0) t0, t1,4bnet2,t0,1bPRINTSTR("\ncopytextsection/*ClearBSSlaa0,laa2,_end2:swzero,0(a0)bnea2,a0,2b a0,4TTYDBG("CopyPMONtoexecutelocationmovea0,sp#iflia0,swa0,CpuTertiaryCacheSize/*SetL3cachesizesrl/*passpointertokseg1tgt_putchar*/laa1,tgt_putcharaddulaa2,stringserialaddua2,a2,s0lav0,initmips 上面代碼先把內(nèi)存大小msize放到參數(shù)0里,把輸出字符函數(shù)指針放到參數(shù)1里,把字符串輸出函數(shù)指針放到參數(shù)2里,然后取得C函數(shù)initmips地址,直接跳到那里運行,不再返回來。不過,后面還有一#ifdefTTYDBG("DumGT64240lis3,0

movea0,s3balhexserialTTYDBG(":adda0,s3,bonitolwa0,0(a0)addius3,4TTYDBG("")lia0,0xfffanda0,s3 a0,3flia0,0x01fanda0,s3 a0,2b 減少BUG的出現(xiàn)。龍芯軟件開發(fā)(19)--C經(jīng)歷了漫長的匯編,最終走到光明的C世界了,進入高級語言環(huán)境,會讓開發(fā)更方便,寫更少的語句就可以實現(xiàn)的功能。從這里開始,就初始化PCI局部線所有設備,初始化南橋所有的功能,初始化IDE硬盤,上次分析移動代碼里,就知道代碼已經(jīng)移到0x80000000開始運行了。initmips(unsignedint{SetupmemoryaddressdecoderstomapentireButfirstmoveawaybootrommaptohigh#ifGT_WRITE(BOOTCS_LOW_DECODE_ADDRESS,BOOT_BASE>>GT_WRITE(BOOTCS_HIGH_DECODE_ADDRESS,(BOOT_BASE-1+BOOT_SIZE)>>memorysize=memsz>256?256<<20:memsz<<memorysize_high=memsz>256?(memsz-256)<<20:srl#if{intstart=0xintend=0x+while(start<end)asmvolatile("cache"cache1,1(%0)\r\n""cache1,2(%0)\r\n""cache"cachestart+=}}

volatile("mfc0"and$2,$2,0xfffffff8\r\n""or $2,$2,2\r\n""mtc0$2,$16\r\n"ProbeclockfrequencyssodelayswillworkInitPMONandcpuinfotab[0]=&DBGREG;Setupexceptionbcopy(MipsException,(char*)TLB_MISS_EXC_VEC,MipsExceptionEnd-MipsException);bcopy(MipsException,(char*)GEN_EXC_VEC,MipsExceptionEnd-MipsException);CPU_SetSR(0,printf("BEVinSRsetto#if/*memtest*/printf("memtestdone\n");}/*2007-1-5于C是實現(xiàn)非常復雜的功能的。比如顯示卡,就是最復雜的部份,由于它的BIOS代碼是X86CPU執(zhí)行的,不能直接在龍芯2E里運行,這樣就變得非常復雜了,因此龍芯2E里就要實現(xiàn)一個模擬X86CPU功能才能運行顯示卡的BIOS程序。不知道那天有了我們自己的顯示卡廠商,才可能開發(fā)適用龍芯2E的顯示卡BIOS,這樣才龍芯軟件開發(fā)(20)- 頻率和初始化實時時前面已經(jīng)介紹進入C語言世界,就會實現(xiàn)的功能,支持的應用?,F(xiàn)在就來仔細地分析源程序,并且首先來的函數(shù) Returnstheexternalclockfrequency,usuallythebus{if(md_cpufreq==0)}}static{#ifdefinti,timeout,cur,sec,SBD_DISPLAY("FREQ",#if

md_pipefreq= /*Defaults*/md_cpufreq= md_pipefreq= /*NBFPGA*/md_cpufreq= clk_invalid=#ifdefSBD_DISPLAY("FREI",Dothenexttwicefortworeasons.Firstmakesureweruncache.Secondmakesuresynchedonsecondupdate.(Punfor(i=2;i!=0;i--)cnt=timeout= while(CMOS_READ(DS_REG_CTLA)&DS_CTLA_UIP);sec=dowhile(CMOS_READ(DS_REG_CTLA)&cur=}while(timeout!=0&&cur==cnt=CPU_GetCOUNT()-cnt;if(timeout==0){ /*Getoutifclockisnotrunning}}*Calculatetheexternalbusclockif(timeout!={clk_invalid=0;md_pipefreq=cnt/10000;md_pipefreq*=20000;/*wehavenosimplewaytoreadmultipliermd_cpufreq }#endif/*HAVE_TOD}staticvoid{intyear,month,date,hour,min,sec;CMOS_WRITE(DS_CTLA_DV1,DS_REG_CTLA);CMOS_WRITE(DS_CTLB_24|DS_CTLB_DM|DS_CTLB_SET,DS_REG_CTLB);CMOS_WRITE(0,DS_REG_CTLC);CMOS_WRITE(0,year=month=CMOS_READ(DS_REG_MONTH);date=CMOS_READ(DS_REG_DATE);hour=CMOS_READ(DS_REG_HOUR);min=CMOS_READ(DS_REG_MIN);sec=CMOS_READ(DS_REG_SEC);if((year>99)||(month<1||month>12)(date<1||date>31)||(hour>23)||(min>59)||(sec>59)){printf("RTCtimeinvalid,resettoepoch.\n");*/CMOS_WRITE(3,DS_REG_YEAR);CMOS_WRITE(1,DS_REG_DATE);CMOS_WRITE(0,DS_REG_HOUR);CMOS_WRITE(0,DS_REG_MIN);CMOS_WRITE(0,DS_REG_SEC);}CMOS_WRITE(DS_CTLB_24|DS_CTLB_DM,//printf("RTC:%02d-%02d-%02d year,month,date,hour,min,}CPU龍芯軟件開發(fā)(21)--調(diào)試與功能選*InitPMONandcpuinfotab[0]=&DBGREG;*PMON2000entrypoint.Calledafterinitialdbginit(char{intmemsize,freq; fs[10], /*memsize=init();/*DoallconstructorinitialisationSBD_DISPLAY("ENVI",envinit#if/*Turnoncachesunlessoptedout*/if(!getenv("nocache"))SBD_DISPLAY("SBDD",#ifdefSBD_DISPLAY("NETI",#ifNCMD_HIST>SBD_DISPLAY("HSTI",上面初始化是否緩存過去令#ifNMOD_SYMBOLS>SBD_DISPLAY("SYMI",#ifdefSBD_DISPLAY("DEMO",SBD_DISPLAY("SBDE",initial_sr|=tgt_enable(tgt_getmachtype#ifdefStatus=initial_sr&~SR_FR;/*don'tconfusenaiveclients*//*Setupinitialconsoleterminalstate*/ioctl(STDIN,TCGETA,&consterm);printf("\n*PMON2000Professional*");printf("\nConfiguration[%s,%s",TARGETNAME,BYTE_ORDER==BIG_ENDIAN?"EB":"EL");#ifdef#ifNSD>#ifNWD>printf("]\nVersion:%s.\n",printf("Supportedloaders[%s]\n",getExecString());printf("Supportedfilesystems[%s]\n",getFSString());printf("ThissoftwaremayberedistributedundertheBSDfreq=tgt_pipefreq();sprintf(fs,"%d",fp=fs+strlen(fs)-fp[3]=fp[2]=fp[1]=fp[0]=printf("%sMHz",freq=tgt_cpufreq();sprintf(fs,"%d",freq);fp=fs+strlen(fs)-6;fp[3]='\0';fp[2]=fp[1]=fp[0]=printf("/Bus@%sMHz\n",CPUprintf("Memorysize%3dMB(%3dMBLowmemory,%3dMBHighmemory).\n",(memsize>>20),#ifdefined(SMP)printf("\n");md_setpc(NULL,(int32_t)CLIENTPC);md_setsp(NULL,tgt_clienttos());#ifdefs=getenv("al");autoload(s);s=getenv("autoboot");autorun(s);}C++init(),如下:{staticintinitialized=CallglobalArrangetocallglobaldestructorsatif{initialized=1;}}ctorsGCC這些全局初始化函數(shù),很多全局變量是沒有定義的值,本來你編程時初始化為100的值,可能只是0或者任意的數(shù)值?,F(xiàn)在又立即去看函數(shù)ctors()的實現(xiàn),如下:staticvoid{void(**p)(void) +while} { =.;LONG((CTOR_END

CTOR_LIST)/4-} {

= =LONG((

DTOR_LIST)/4-}

=編譯器就會根據(jù)上面的連接生成全局初始化函數(shù)和全局析構函數(shù),并且每個函數(shù)是按照4字節(jié)的指龍芯軟件開發(fā)(22)--初始化環(huán)境參envinit{intSBD_DISPLAY("MAPV",/*extractnvramvariablesintolocalcopy*/bzero(envvar,sizeof(envvar));envinited=1;SBD_DISPLAY("STDV",/*setdefaults(onlyifnotsetatall)*/for(i=0;stdenvtab[i].name;i++){if(!getenv(stdenvtab[i].name))setenv(stdenvtab[i].name,}}}envvartgt_mapenv(_setenv)設置環(huán)境變量參數(shù),設置環(huán)境變量已經(jīng)初始化,最后初始化標準的stdenvtab環(huán)境變量。*ReadinenvironmentfromNV-ramandtgt_mapenv(int P((char*,char{char*ep;char*nvram;intCheckintegrityoftheNVRAMenvarea.Ifnotininitializeitto#ifdefNVRAM_IN_FLASHnvram=(char*)((tgt_flashmap())->fl_map_base+FLASH_OFFS);printf("nvram=%08x\n",(unsignedint)nvram);if(fl_devident(nvram,NULL)==0||cksum(nvram+NVRAM_OFFS,NVRAM_SIZE,0)!=0)nvram=(char*)malloc(512);上面分配內(nèi)存,然后從時鐘上那些參數(shù)出來,由于時鐘在CPU斷電后,還會繼續(xù)保存數(shù)據(jù)。接if(cksum(nvram,NVRAM_SIZE,0)!={printf("NVRAMisinvalid!\n");nvram_invalid=1;}elsenvram+=NVRAM_OFFS;ep=nvram+2;;while(*ep!=0)char*val=0,*p=env;i=0;while((*p++=*ep++)&&(ep<=nvram+NVRAM_SIZE-1)&&i++<{if((*(p-1)=='=')&&(val==NULL))*(p-1)=val=}}if(ep<=nvram+NVRAM_SIZE-1&&i<{(*func)(env,}elsenvram_invalid=2;}}}EthernetaddressforGalileoethernetisstoredinthesixbytesofnvramstorage.Setenvironmenttobcopy(&nvram[ETHER_OFFS],hwethadr,sprintf(env,"%02x:%02x:%02x:%02x:%02x:%02x",hwethadr[0],hwethadr[1],hwethadr[2],hwethadr[3],hwethadr[4],hwethadr[5]);(*func)("ethaddr",#ifdefno_thank_yousprintf(env,"%d",memorysize/(1024*1024));(*func)("memsize",env);sprintf(env,"%d",memorysize_high/(1024*1024));(*func)("highmemsize",env);sprintf(env,"%d",md_pipefreq);(*func)("cpuclock",env);sprintf(env,"%d",md_cpufreq);(*func)("busclock",env);} staticstruct{ }stdenvtab[]=

P((char*,char{"brkcmd","l-r@cpc1",0},#ifdefHAVE_QUAD{"datasize","-b","-b-h-w-d"},{"datasize","-b","-b-h-w"},{"dlecho","off","offon{"dlproto","none","noneXonXoffEtxAck"},#ifdefINET{"bootp","no","nosecprisave"},{"hostport","tty0",{"inalpha","hex","hex{"inbase",INBASE_DEFAULT,INBASE_STRING},#ifNCMD_MORE>0{"moresz","10",0,chg_moresz},{"prompt","PMON>",{"regstyle","sw","hwsw"},#ifdefHAVE_QUAD{"regsize","32","32{"rptcmd","trace","offon{"trabort","^K",{"ulcr","cr","crlf{"uleof","%",#ifdefPMON_DEBUGGER/*XXX:Patriktemp{"validpc","_ftextetext",0,chg_validpc},{"heaptop",SETCLIENTPC,0,{"showsym","yes","no{"fpfmt","both","bothdoublesingle{"fpdis","yes","noyes"},#ifdefined(TGT_DEFENV)龍芯軟件開發(fā)(23)--PCI這樣就需要一樣東西把這些設備轉(zhuǎn)換才能連接到PCI局部總線上,這個東西就是南橋的。在龍芯電腦里VT82C686,在匯編已經(jīng)初始化它的串口輸出,在這里會更進一步初始化其它功能?,F(xiàn)在就來看{*Gatherinfoaboutandconfigure*/{CpuOnboardCacheOn=}elseCpuOnboardCacheOn=}{CpuExternalCacheOn=}elseCpuExternalCacheOn=}_pci_businit(1);/*PCIbusinitialization}void{}龍芯軟件開發(fā)(24)--PCI#defineSUPERIO_CFG_REGstaticvoid{pcitag_ttag;#defineE2_EPP2#defineE2_S1#defineE2_S2#defineE2_FLOPPY/*配置superio*/配置。根據(jù)VT82C686B的操作流程如下:#ifdefHIGH_SPEED_SERIALlinux_outb(val|0xc0,0x3f1);/*bothportsonhighspeed*/#ifoutb(PCI_IO_SPACE_BASE+0x3f1,(COM1_BASE_ADDR-PCI_IO_SPACE_BASE)>>2);/*com1serialbaseoutb(PCI_IO_SPACE_BASE+0x3f1,(COM2_BASE_ADDR-PCI_IO_SPACE_BASE)>>2);/*com2serialbase0x3F0}staticvoid{pcitag_ttag=_pci_make_tag(VTSB_BUS,VTSB_DEV,}#defineIDE_CHIPEN_REG0x40#defineIDE_CFG_REG0x41staticvoidinitIDE(void){charval;#if/*IDEcontrollerenableval=val&~2;/*IDEIRQRoute*/tag=_pci_make_tag(VTSB_BUS,VTSB_DEV,/*enableIOspace/*settocompatiblemode上面全部設置為固定模式。也就是主IDE令寄存器是0x1F0—0x1F7,從IDE令寄存器/*latencyRTCVBAT/*settolegacyinterrupt/*enableprimary/secondarychannel/*disableprefetchbuffer&postwritebuffer/*setzerowaitstateformaster*tomakeictnb0/*disablememoryreadmultiple/memorywriteand#if}

_pci_conf_writen(tag,0x10,_pci_conf_writen(tag,0x14,_pci_conf_writen(tag,0x18,_pci_conf_writen(tag,0x1c,_pci_conf_writen(tag,0x20, #defineIRQ_ROUTE_REG10x51#defineIRQ_ROUTE_REG20x52#defineIRQ_ROUTE_REG40x55#defineIRQ_ROUTE_REG50x56#defineIRQ_ROUTE_REG60x57#definePCI_IRQ_TYPE_REG0x54#defineIRQ(x)x#definePARALLEL_IRQ #defineFLOPPY_IRQ #defineCOM1_IRQ #defineCOM2_IRQ #definePCIA_IRQ #definePCIB_IRQ #definePCIC_IRQ #define staticvoid{charval;tag=_pci_make_tag(VTSB_BUS,VTSB_DEV, 12val&=0xf;valPCI的A10B,C11,12val&=0xf0;valD13val&=0xf0;_pci_conf_writen(tag,PCI_IRQ_TYPE_REG,PARALLEL_IRQ|FLOPPY_IRQ,1);上面設置為低電平中斷模}staticvoid{charval;tag=_pci_make_tag(VTSB_BUS,VTSB_DEV,/*enableon-boardio*//*enablecom1and_pci_conf_writen(tag,0x83,0x80|0x1|}龍芯軟件開發(fā)(25)--PCI_pci_businit(1);/*PCIbusinitialization_pci_businit(int{charv=getenv("pciverbose");if(v){_pciverbose=}/*intialisethePCIbridge*/if(/*init*/1){SBD_DISPLAY("PCIH",init=_pci_hwinit(init,&def_bus_iot,&def_bus_memt);pci_roots=init;if(init<}{intstructpci_deviceif(_pciverbose)printf("settingup%dbus\n",}for(i=0,pb=_pci_head;i<pci_roots;i++,pb=pb->next)_pci_scan_dev(pb,i,0,}}}_pci_hwinit(initialise,iot,memt)intinitialise;bus_space_tag_tiot;bus_space_tag_tmemt;{/*pcire

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論