Nand Flash詳述(絕對經(jīng)典)_第1頁
Nand Flash詳述(絕對經(jīng)典)_第2頁
Nand Flash詳述(絕對經(jīng)典)_第3頁
Nand Flash詳述(絕對經(jīng)典)_第4頁
Nand Flash詳述(絕對經(jīng)典)_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、NandFlash詳述1. 硬件特性:【Flash的硬件實(shí)現(xiàn)機(jī)制】Flash全名叫做Flash Memory,屬于非易失性存儲設(shè)備(Non-volatile Memory Device),與此相對應(yīng)的是易失性存儲設(shè)備(Volatile Memory Device)。這類設(shè)備,除了Flash,還有其他比較常見的如硬盤,ROM等,與此相對的,易失性就是斷電了,數(shù)據(jù)就丟失了,比如大家常用的內(nèi)存,不論是以前的SDRAM,DDR SDRAM,還是現(xiàn)在的DDR2,DDR3等,都是斷電后,數(shù)據(jù)就沒了。Flash的內(nèi)部存儲是MOSFET,里面有個懸浮門(Floating Gate),是真正存儲數(shù)據(jù)的

2、單元。-金屬-氧化層-半導(dǎo)體-場效晶體管,簡稱金氧半場效晶體管(Metal-Oxide-Semiconductor Field-Effect Transistor, MOSFET)是一種可以廣泛使用在模擬電路與數(shù)字電路的場效晶體管(field-effect transistor)。MOSFET依照其“通道”的極性不同,可分為n-type與p-type的MOSFET,通常又稱為NMOSFET與PMOSFET,其他簡稱尚包括NMOS FET、PMOS FET、nMOSFET、pMOSFET等。-在Flash之前,紫外線可擦除(uv-erasable)的EPROM,就已經(jīng)采用用Floating Ga

3、te存儲數(shù)據(jù)這一技術(shù)了。圖1.典型的Flash內(nèi)存單元的物理結(jié)構(gòu)數(shù)據(jù)在Flash內(nèi)存單元中是的。存儲電荷的多少,取決于圖中的外部門(external gate)所被施加的電壓,其控制了是向存儲單元中沖入電荷還是使其釋放電荷。數(shù)據(jù)的表示,以所存儲的電荷的電壓是否超過一個特定的閾值Vth來表示?!維LC和MLC的實(shí)現(xiàn)機(jī)制】Nand Flash按照內(nèi)部存儲數(shù)據(jù)單元的電壓的不同層次,也就是單個內(nèi)存單元中,是存儲1位數(shù)據(jù),還是多位數(shù)據(jù),可以分為SLC和MLC:1. SLC,Single Level Cell:單個存儲單元,只存儲一位數(shù)據(jù),表示成1或0.就是上面介紹的,對于數(shù)據(jù)的表示,單個存儲單

4、元中內(nèi)部所存儲電荷的電壓,和某個特定的閾值電壓Vth,相比,如果大于此Vth值,就是表示1,反之,小于Vth,就表示0.對于nand Flash的數(shù)據(jù)的寫入1,就是控制External Gate去充電,使得存儲的電荷夠多,超過閾值Vth,就表示1了。而對于寫入0,就是將其放電,電荷減少到小于Vth,就表示0了。關(guān)于為何Nand Flash不能從0變成1,我的理解是,物理上來說,是可以實(shí)現(xiàn)每一位的,從0變成1的,但是實(shí)際上,對于實(shí)際的物理實(shí)現(xiàn),出于效率的考慮,如果對于,每一個存儲單元都能單獨(dú)控制,即,0變成1就是,對每一個存儲單元單獨(dú)去充電,所需要的硬件實(shí)現(xiàn)就很復(fù)雜和昂貴,同時,所進(jìn)行對塊擦除的

5、操作,也就無法實(shí)現(xiàn)之前的,一閃而過的速度了,也就失去了Flash的眾多特性了。/ 也就是放電的思路還是容易些。1->02. MLC,Multi Level Cell:與SLC相對應(yīng),就是單個存儲單元,可以存儲多個位,比如2位,4位等。其實(shí)現(xiàn)機(jī)制,說起來比較簡單,就是,通過控制內(nèi)部電荷的多少,分成多個閾值,通過控制里面的電荷多少,而達(dá)到我們所需要的存儲成不同的數(shù)據(jù)。比如,假設(shè)輸入電壓是Vin4V(實(shí)際沒有這樣的電壓,此處只是為了舉例方便),那么,可以設(shè)計出2的2次方4個閾值,1/4的Vin1V,2/4的Vin2V,3/4的Vin3V,Vin4V,分別表示2位數(shù)據(jù)00,01,10,

6、11,對于寫入數(shù)據(jù),就是充電,通過控制內(nèi)部的電荷的多少,對應(yīng)表示不同的數(shù)據(jù)。對于讀取,則是通過對應(yīng)的內(nèi)部的電流(與Vth成反比),然后通過一系列解碼電路完成讀取,解析出所存儲的數(shù)據(jù)。這些具體的物理實(shí)現(xiàn),都是有足夠精確的設(shè)備和技術(shù),才能實(shí)現(xiàn)精確的數(shù)據(jù)寫入和讀出的。單個存儲單元可以存儲2位數(shù)據(jù)的,稱作2的2次方4 Level Cell,而不是2 Level Cell;同理,對于新出的單個存儲單元可以存儲4位數(shù)據(jù)的,稱作2的4次方16 Level Cell?!娟P(guān)于如何識別SLC還是MLC】Nand Flash設(shè)計中,有個命令叫做Read ID,讀取ID,意思是讀取芯片的ID,就像大家的身份證一樣,這

7、里讀取的ID中,是:讀取好幾個字節(jié),一般最少是4個,新的芯片,支持5個甚至更多,從這些字節(jié)中,可以解析出很多相關(guān)的信息,比如:此Nand Flash內(nèi)部是幾個芯片(chip)所組成的,每個chip包含了幾片(Plane),每一片中的頁大小,塊大小,等等。在這些信息中,其中有一個,就是識別此flash是SLC還是MLC。下面這個就是最常見的Nand Flash的datasheet中所規(guī)定的,第3個字節(jié),3rd byte,所表示的信息,其中就有SLC/MLC的識別信息:DescriptionI/O7I/O6I/O5 I/O4I/O3 I/O2I/O1 I/O0InternalChip Number

8、12480 00 11 01 1Cell Type2 Level Cell4 Level Cell8 Level Cell16 Level Cell0 00 11 01 1Number ofSimultaneouslyProgrammed Pages12480 00 11 01 1Interleave ProgramBetween multiple chipsNot SupportSupport01Cache ProgramNot SupportSupport01表1.Nan

9、d Flash第3個ID的含義【Nand Flash的物理存儲單元的陣列組織結(jié)構(gòu)】Nand flash的內(nèi)部組織結(jié)構(gòu),此處還是用圖來解釋,比較容易理解:圖2.Nand Flash物理存儲單元的陣列組織結(jié)構(gòu)上圖是K9K8G08U0A的datasheet中的描述。簡單解釋就是:1.一個nand flash由很多個塊(Block)組成,塊的大小一般是-> 128KB,-> 256KB,-> 512KB此處是128KB。2.每個塊里面又包含了很多頁(page)。每個頁的大小,老的nand flash,頁大小是256B,512B,這類的nand flash

10、被稱作small block,。地址周期只有4個。對于現(xiàn)在常見的nand flash多數(shù)是2KB,被稱作big block,對應(yīng)的發(fā)讀寫命令地址,一共5個周期(cycle),更新的nand flash是4KB,塊,也是Nand Flash的擦除操作的基本/最小單位。3.每一個頁,對應(yīng)還有一塊區(qū)域,叫做空閑區(qū)域(spare area)/冗余區(qū)域(redundant area),而Linux系統(tǒng)中,一般叫做OOB(Out Of Band),這個區(qū)域,是最初基于Nand Flash的硬件特性:數(shù)據(jù)在讀寫時候相對容易錯誤,所以為了保證數(shù)據(jù)的正確性,必須要有對應(yīng)的檢測和糾錯機(jī)制,此機(jī)制被叫做EDC(Er

11、ror Detection Code)/ECC(Error Code Correction,或者Error Checking and Correcting),所以設(shè)計了多余的區(qū)域,用于放置數(shù)據(jù)的校驗(yàn)值。頁, 是Nand Flash的寫入操作的基本/最小的單位。【Nand Flash數(shù)據(jù)存儲單元的整體架構(gòu)】簡單說就是,常見的nand flash,內(nèi)部只有一個chip,每個chip只有一個plane。而有些復(fù)雜的,容量更大的nand flash,內(nèi)部有多個chip,每個chip有多個plane。這類的nand flash,往往也有更加高級的功能,比如下面要介紹的Multi Plane Progra

12、m和Interleave Page Program等。比如,型號為K9K8G08U0A這個芯片(chip),內(nèi)部有:K9F4G08U0A (256MB) : Plane (1Gb), Plane (1Gb)K9F4G08U0A (256MB) : Plane (1Gb), Plane (1Gb)K9WAG08U1A ,內(nèi)部包含了2個K9K8G08U0AK9NBG08U5A ,內(nèi)部包含了4個K9K8G08U0A【Flash名稱的由來】Flash的擦除操作是以block塊為單位的,與此相對應(yīng)的是其他很多存儲設(shè)備,是以bit位為最小讀取/寫

13、入的單位,F(xiàn)lash是一次性地擦除整個塊:在發(fā)送一個擦除命令后,一次性地將一個block,常見的塊的大小是128KB/256KB。,全部擦除為1,也就是里面的內(nèi)容全部都是0xFF了,由于是一下子就擦除了,相對來說,擦除用的時間很短,可以用一閃而過來形容,所以,叫做Flash Memory。中文有的翻譯為(快速)閃存?!綟lash相對于普通設(shè)備的特殊性】1. 上面提到過的,F(xiàn)lash最小操作單位,有些特殊。一般設(shè)備,比如硬盤/內(nèi)存,讀取和寫入都是以bit位為單位,讀取一個bit的值,將某個值寫入對應(yīng)的地址的位,都是可以按位操作的。但是Flash由于物理特性,使得內(nèi)部存儲的數(shù)據(jù),只能從1

14、變成0,這點(diǎn),可以從前面的內(nèi)部實(shí)現(xiàn)機(jī)制了解到,只是方便統(tǒng)一充電,不方便單獨(dú)的存儲單元去放電,所以才說,只能從1變成0,也就是釋放電荷。所以,總結(jié)一下Flash的特殊性如下:普通設(shè)備(硬盤/內(nèi)存等)Flash讀取/寫入的叫法讀取/寫入讀取/編程(Program)讀取/寫入的最小單位Bit/位Page/頁擦除(Erase)操作的最小單位Bit/位Block/塊擦除操作的含義將數(shù)據(jù)刪除/全部寫入0將整個塊都擦除成全是1,也就是里面的數(shù)據(jù)都是0xFF對于寫操作直接寫即可在寫數(shù)據(jù)之前,要先擦除,然后再寫表2.Flash和普通設(shè)備相比所具有的特殊性注:之所以將寫操作叫做編程,是因?yàn)?,flash和之前的EP

15、ROM,EEPROM繼承發(fā)展而來,而之前的EEPROM(Electrically Erasable Programmable Read-Only Memory),往里面寫入數(shù)據(jù),就叫做編程Program,之所以這么稱呼,是因?yàn)槠鋵?shù)據(jù)的寫入,是需要用電去擦除/寫入的,就叫做編程。對于目前常見的頁大小是2K/4K的Nand Flash,其塊的大小有128KB/256KB/512KB等。而對于Nor Flash,常見的塊大小有64K/32K等。在寫數(shù)據(jù)之前,要先擦除,內(nèi)部就都變成0xFF了,然后才能寫入數(shù)據(jù),也就是將對應(yīng)位由1變成0?!綨and Flash引腳(Pin)的說明】圖3.Nand Fl

16、ash引腳功能說明上圖是常見的Nand Flash所擁有的引腳(Pin)所對應(yīng)的功能,簡單翻譯如下:1. I/O0 I/O7:用于輸入地址/數(shù)據(jù)/命令,輸出數(shù)據(jù)2. CLE:Command Latch Enable,命令鎖存使能,在輸入命令之前,要先在模式寄存器中,設(shè)置CLE使能3. ALE:Address Latch Enable,地址鎖存使能,在輸入地址之前,要先在模式寄存器中,設(shè)置ALE使能4. CE#:Chip Enable,芯片使能,在操作Nand Flash之前,要先選中此芯片,才能操作5. RE#:Read Enable,讀使能,

17、在讀取數(shù)據(jù)之前,要先使CE有效。6. WE#:Write Enable,寫使能,在寫取數(shù)據(jù)之前,要先使WE有效。7. WP#:Write Protect,寫保護(hù)8. R/B#:Ready/Busy Output,就緒/忙,主要用于在發(fā)送完編程/擦除命令后,檢測這些操作是否完成,忙,表示編程/擦除操作仍在進(jìn)行中,就緒表示操作完成.9. Vcc:Power,電源10. Vss:Ground,接地11. N.C:Non-Connection,未定義,未連接。小常識在數(shù)據(jù)手冊中,你常會看到,對于一個引腳定義,有些字母上面帶一橫杠的,那是說明此

18、引腳/信號是低電平有效,比如你上面看到的RE頭上有個橫線,就是說明,此RE是低電平有效,此外,為了書寫方便,在字母后面加“”,也是表示低電平有效,比如我上面寫的CE;如果字母頭上啥都沒有,就是默認(rèn)的高電平有效,比如上面的CLE,就是高電平有效?!緸楹涡枰狝LE和CLE】突然想明白了,Nand Flash中,為何設(shè)計這么多的命令,把整個系統(tǒng)搞這么復(fù)雜的原因了:比如命令鎖存使能(Command Latch Enable,CLE)和地址鎖存使能(Address Latch Enable,ALE),那是因?yàn)?,Nand Flash就8個I/O,而且是復(fù)用的,也就是,可以傳數(shù)據(jù),也可以傳地址,也可以傳命令

19、,為了區(qū)分你當(dāng)前傳入的到底是啥,所以,先要用發(fā)一個CLE(或ALE)命令,告訴nand Flash的控制器一聲,我下面要傳的是命令(或地址),這樣,里面才能根據(jù)傳入的內(nèi)容,進(jìn)行對應(yīng)的動作。否則,nand flash內(nèi)部,怎么知道你傳入的是數(shù)據(jù),還是地址,還是命令啊,也就無法實(shí)現(xiàn)正確的操作了.【Nand Flash只有8個I/O引腳的好處】1. 減少外圍引腳:相對于并口(Parellel)的Nor Flash的48或52個引腳來說,的確是大大減小了引腳數(shù)目,這樣封裝后的芯片體積,就小很多?,F(xiàn)在芯片在向體積更小,功能更強(qiáng),功耗更低發(fā)展,減小芯片體積,就是很大的優(yōu)勢。同時,減少芯片接口,也

20、意味著使用此芯片的相關(guān)的外圍電路會更簡化,避免了繁瑣的硬件連線。2. 提高系統(tǒng)的可擴(kuò)展性,因?yàn)闆]有像其他設(shè)備一樣用物理大小對應(yīng)的完全數(shù)目的addr引腳,在芯片內(nèi)部換了芯片的大小等的改動,對于用全部的地址addr的引腳,那么就會引起這些引腳數(shù)目的增加,比如容量擴(kuò)大一倍,地址空間/尋址空間擴(kuò)大一倍,所以,地址線數(shù)目/addr引腳數(shù)目,就要多加一個,而對于統(tǒng)一用8個I/O的引腳的Nand Flash,由于對外提供的都是統(tǒng)一的8個引腳,內(nèi)部的芯片大小的變化或者其他的變化,對于外部使用者(比如編寫nand flash驅(qū)動的人)來說,不需要關(guān)心,只是保證新的芯片,還是遵循同樣的接口,同樣的時序,

21、同樣的命令,就可以了。這樣就提高了系統(tǒng)的擴(kuò)展性?!綨and flash的一些典型(typical)特性】1.頁擦除時間是200us,有些慢的有800us。2.塊擦除時間是1.5ms.3.頁數(shù)據(jù)讀取到數(shù)據(jù)寄存器的時間一般是20us。4.串行訪問(Serial access)讀取一個數(shù)據(jù)的時間是25ns,而一些舊的nand flash是30ns,甚至是50ns。5.輸入輸出端口是地址和數(shù)據(jù)以及命令一起multiplex復(fù)用的。以前老的Nand Flash,編程/擦除時間比較短,比如K9G8G08U0M,才5K次,而后來很多6.nand flash的編程/擦除的壽命,最多允許的次數(shù),以前的nand

22、flash多數(shù)是10K次,也就是1萬次,而現(xiàn)在很多新的nand flash,技術(shù)提高了,比如,Micron的MT29F1GxxABB,Numonyx的NAND04G-B2D/NAND08G-BxC,都可以達(dá)到100K,也就是10萬次的編程/擦除。和之前常見的Nor Flash達(dá)到同樣的使用壽命了。7.48引腳的TSOP1封裝或 52引腳的ULGA封裝【Nand Flash中的特殊硬件結(jié)構(gòu)】由于nand flash相對其他常見設(shè)備來說,比較特殊,所以,特殊的設(shè)備,也有特殊的設(shè)計,所以,有些特殊的硬件特性,就有比較解釋一下:1. 頁寄存器(Page Register):由于Nand Flash讀取

23、和編程操作來說,一般最小單位是頁,所以,nand flash在硬件設(shè)計時候,就考慮到這一特性,對于每一片,都有一個對應(yīng)的區(qū)域,專門用于存放,將要寫入到物理存儲單元中去的或者剛從存儲單元中讀取出來的,一頁的數(shù)據(jù),這個數(shù)據(jù)緩存區(qū),本質(zhì)上就是一個buffer,但是只是名字叫法不同,datasheet里面叫做Page Register,此處翻譯為頁寄存器,實(shí)際理解為頁緩存,更為恰當(dāng)些。注意:只有寫到了這個頁緩存中,只有等你發(fā)了對應(yīng)的編程第二階段的確認(rèn)命令0x10之后,實(shí)際的編程動作才開始,才開始把頁緩存中的數(shù)據(jù),一點(diǎn)點(diǎn)寫到物理存儲單元中去。所以,簡單總結(jié)一下就是,對于數(shù)據(jù)的流向,實(shí)際是經(jīng)過了如下步驟:

24、圖4 Nand Flash讀寫時的數(shù)據(jù)流向【Nand Flash中的壞塊(Bad Block)】Nand Flash中,一個塊中含有1個或多個位是壞的,就成為其為壞塊。壞塊的穩(wěn)定性是無法保證的,也就是說,不能保證你寫入的數(shù)據(jù)是對的,或者寫入對了,讀出來也不一定對的。而正常的塊,肯定是寫入讀出都是正常的。壞塊有兩種:(1)一種是出廠的時候,也就是,你買到的新的,還沒用過的Nand Flash,就可以包含了壞塊。此類出廠時就有的壞塊,被稱作factory (masked)bad block或initial bad/invalid block,在出廠之前,就會做對應(yīng)的標(biāo)記,標(biāo)為壞塊。具體標(biāo)記的地方是

25、,對于現(xiàn)在常見的頁大小為2K的Nand Flash,是塊中第一個頁的oob起始位置(關(guān)于什么是頁和oob,下面會有詳細(xì)解釋)的第1個字節(jié)(舊的小頁面,pagesize是512B甚至256B的nand flash,壞塊標(biāo)記是第6個字節(jié)),如果不是0xFF,就說明是壞塊。相對應(yīng)的是,所有正常的塊,好的塊,里面所有數(shù)據(jù)都是0xFF的。(2)第二類叫做在使用過程中產(chǎn)生的,由于使用過程時間長了,在擦塊除的時候,出錯了,說明此塊壞了,也要在程序運(yùn)行過程中,發(fā)現(xiàn),并且標(biāo)記成壞塊的。具體標(biāo)記的位置,和上面一樣。這類塊叫做worn-out bad block。對于壞塊的管理,在Linux系統(tǒng)中,叫做壞塊管理(B

26、BM,Bad Block Managment),對應(yīng)的會有一個表去記錄好塊,壞塊的信息,以及壞塊是出廠就有的,還是后來使用產(chǎn)生的,這個表叫做 壞塊表(BBT,Bad Block Table)。在Linux內(nèi)核MTD架構(gòu)下的Nand Flash驅(qū)動,和Uboot中Nand Flash驅(qū)動中,在加載完驅(qū)動之后,如果你沒有加入?yún)?shù)主動要求跳過壞塊掃描的話,那么都會去主動掃描壞塊,建立必要的BBT的,以備后面壞塊管理所使用。而關(guān)于好塊和壞塊,Nand Flash在出廠的時候,會做出保證:1.關(guān)于好的,可以使用的塊的數(shù)目達(dá)到一定的數(shù)目,比如三星的K9G8G08U0M,整個flash一共有409

27、6個塊,出廠的時候,保證好的塊至少大于3996個,也就是意思是,你新買到這個型號的nand flash,最壞的可能,有30963996100個壞塊。不過,事實(shí)上,現(xiàn)在出廠時的壞塊,比較少,絕大多數(shù),都是使用時間長了,在使用過程中出現(xiàn)的。2.保證第一個塊是好的,并且一般相對來說比較耐用。做此保證的主要原因是,很多Nand Flash壞塊管理方法中,就是將第一個塊,用來存儲上面提到的BBT,否則,都是出錯幾率一樣的塊,那么也就不太好管理了,連放BBT的地方,都不好找了,_。一般來說,不同型號的Nand Flash的數(shù)據(jù)手冊中,也會提到,自己的這個nand flash,最多允許多少個壞塊。就比如上面

28、提到的,三星的K9G8G08U0M,最多有100個壞塊。對于壞塊的標(biāo)記,本質(zhì)上,也只是對應(yīng)的flash上的某些字節(jié)的數(shù)據(jù)是非0xFF而已,所以,只要是數(shù)據(jù),就是可以讀取和寫入的。也就意味著,可以寫入其他值,也就把這個壞塊標(biāo)記信息破壞了。對于出廠時的壞塊,一般是不建議將標(biāo)記好的信息擦除掉的。uboot中有個命令是“nand scrub”就可以將塊中所有的內(nèi)容都擦除了,包括壞塊標(biāo)記,不論是出廠時的,還是后來使用過程中出現(xiàn)而新標(biāo)記的。一般來說,不建議用這個。不過,我倒是經(jīng)常用,其實(shí)也沒啥大礙,呵呵。最好用“nand erase”只擦除好的塊,對于已經(jīng)標(biāo)記壞塊的塊,不擦除?!緉and Flash中頁的

29、訪問順序】在一個塊內(nèi),對每一個頁進(jìn)行編程的話,必須是順序的,而不能是隨機(jī)的。比如,一個塊中有128個頁,那么你只能先對page0編程,再對page1編程,。,而不能隨機(jī)的,比如先對page3,再page1,page2.,page0,page4,.?!酒x無關(guān)(CE dont-care)技術(shù)】很多Nand flash支持一個叫做CE dont-care的技術(shù),字面意思就是,不關(guān)心是否片選,那有人會問了,如果不片選,那還能對其操作嗎?答案就是,這個技術(shù),主要用在當(dāng)時是不需要選中芯片卻還可以繼續(xù)操作的這些情況:在某些應(yīng)用,比如錄音,音頻播放等應(yīng)用,中,外部使用的微秒(us)級的時鐘周期,此處假設(shè)是比

30、較少的2us,在進(jìn)行讀取一頁或者對頁編程時,是對Nand Flash操作,這樣的串行(Serial Access)訪問的周期都是20/30/50ns,都是納秒(ns)級的,此處假設(shè)是50ns,當(dāng)你已經(jīng)發(fā)了對應(yīng)的讀或?qū)懙拿钪?,接下來只是需要Nand Flash內(nèi)部去自己操作,將數(shù)據(jù)讀取除了或?qū)懭脒M(jìn)去到內(nèi)部的數(shù)據(jù)寄存器中而已,此處,如果可以把片選取消,CE#是低電平有效,取消片選就是拉高電平,這樣會在下一個外部命令發(fā)送過來之前,即微秒量級的時間里面,即2us50ns2us,這段時間的取消片選,可以降低很少的系統(tǒng)功耗,但是多次的操作,就可以在很大程度上降低整體的功耗了??偨Y(jié)起來簡單解釋就是:由于

31、某些外部應(yīng)用的頻率比較低,而Nand Flash內(nèi)部操作速度比較快,所以具體讀寫操作的大部分時間里面,都是在等待外部命令的輸入,同時卻選中芯片,產(chǎn)生了多余的功耗,此“不關(guān)心片選”技術(shù),就是在Nand Flash的內(nèi)部的相對快速的操作(讀或?qū)懀┩瓿芍螅腿∠x,以節(jié)省系統(tǒng)功耗。待下次外部命令/數(shù)據(jù)/地址輸入來的時候,再選中芯片,即可正常繼續(xù)操作了。這樣,整體上,就可以大大降低系統(tǒng)功耗了。注:Nand Flash的片選與否,功耗差別會有很大。如果數(shù)據(jù)沒有記錯的話,我之前遇到我們系統(tǒng)里面的nand flash的片選,大概有5個mA的電流輸出呢,要知道,整個系統(tǒng)優(yōu)化之后的待機(jī)功耗,也才10個mA左

32、右的。【帶EDC的拷回操作以及Sector的定義(Copy-Back Operation with EDC & Sector Definition for EDC)】Copy-Back功能,簡單的說就是,將一個頁的數(shù)據(jù),拷貝到另一個頁。如果沒有Copy-Back功能,那么正常的做法就是,先要將那個頁的數(shù)據(jù)拷貝出來放到內(nèi)存的數(shù)據(jù)buffer中,讀出來之后,再用寫命令將這頁的數(shù)據(jù),寫到新的頁里面。而Copy-Back功能的好處在于,不需要用到外部的存儲空間,不需要讀出來放到外部的buffer里面,而是可以直接讀取數(shù)據(jù)到內(nèi)部的頁寄存器(page register)然后寫到新的頁里面去。而且,

33、為了保證數(shù)據(jù)的正確,要硬件支持EDC(Error Detection Code)的,否則,在數(shù)據(jù)的拷貝過程中,可能會出現(xiàn)錯誤,并且拷貝次數(shù)多了,可能會累積更多錯誤。而對于錯誤檢測來說,硬件一般支持的是512字節(jié)數(shù)據(jù),對應(yīng)有16字節(jié)用來存放校驗(yàn)產(chǎn)生的ECC數(shù)值,而這512字節(jié)一般叫做一個扇區(qū)。對于2K64字節(jié)大小的頁來說,按照512字節(jié)分,分別叫做A,B,C,D區(qū),而后面的64字節(jié)的oob區(qū)域,按照16字節(jié)一個區(qū),分別叫做E,F(xiàn),G,H區(qū),對應(yīng)存放A,B,C,D數(shù)據(jù)區(qū)的ECC的值。總結(jié):512+162K +64 : A B C D - E F G H區(qū)Copy-Back編程的主要作用在于,去掉了

34、數(shù)據(jù)串行讀取出來,再串行寫入進(jìn)去的時間,所以,這部分操作,是比較耗時的,所以此技術(shù)可以提高編程效率,提高系統(tǒng)整體性能。【多片同時編程(Simultaneously Program Multi Plane)】對于有些新出的Nand Flash,支持同時對多個片進(jìn)行編程,比如上面提到的三星的K9K8G08U0A,內(nèi)部包含4片(Plane),分別叫做Plane0,Plane1,Plane2,Plane3。.由于硬件上,對于每一個Plane,都有對應(yīng)的大小是2048+64=2112字節(jié)的頁寄存器(Page Register),使得同時支持多個Plane編程成為可能。K9K8G08U0A支持同時對2個P

35、lane進(jìn)行編程。不過要注意的是,只能對Plane0和Plane1或者Plane2和Plane3,同時編程,而不支持Plane0和Plane2同時編程。【交錯頁編程(Interleave Page Program)】多片同時編程,是針對一個chip里面的多個Plane來說的,而此處的交錯頁編程,是指對多個chip而言的??梢韵葘σ粋€chip,假設(shè)叫chip1,里面的一頁進(jìn)行編程,然后此時,chip1內(nèi)部就開始將數(shù)據(jù)一點(diǎn)點(diǎn)寫到頁里面,就出于忙的狀態(tài)了,而此時可以利用這個時間,對出于就緒狀態(tài)的chip2,也進(jìn)行頁編程,發(fā)送對應(yīng)的命令后,chip2內(nèi)部也就開始慢慢的寫數(shù)據(jù)到存儲單元里面去了,也出于忙

36、的狀態(tài)了。此時,再去檢查chip1,如果編程完成了,就可以開始下一頁的編程了,然后發(fā)完命令后,就讓其內(nèi)部慢慢的編程吧,再去檢查chip2,如果也是編程完了,也就可以進(jìn)行接下來的其他頁的編程了。如此,交互操作chip1和chip2,就可以有效地利用時間,使得整體編程效率提高近2倍,大大提高nand flash的編程/擦寫速度了。【隨機(jī)輸出頁內(nèi)數(shù)據(jù)(Random Data Output In a Page)】在介紹此特性之前,先要說說,與Random Data Output In a Page相對應(yīng)的是,普通的,正常的,sequential data output in a page。正常情況下,

37、我們讀取數(shù)據(jù),都是先發(fā)讀命令,然后等待數(shù)據(jù)從存儲單元到內(nèi)部的頁數(shù)據(jù)寄存器中后,我們通過不斷地將RE#(Read Enale,低電平有效)置低,然后從我們開始傳入的列的起始地址,一點(diǎn)點(diǎn)讀出我們要的數(shù)據(jù),直到頁的末尾,當(dāng)然有可能還沒到頁地址的末尾,就不再讀了。所謂的順序(sequential)讀取也就是,根據(jù)你之前發(fā)送的列地址的起始地址開始,每讀一個字節(jié)的數(shù)據(jù)出來,內(nèi)部的數(shù)據(jù)指針就加1,移到下個字節(jié)的地址,然后你再讀下一個字節(jié)數(shù)據(jù),就可以讀出來你要的數(shù)據(jù)了,直到讀取全部的數(shù)據(jù)出來為止。而此處的隨機(jī)(random)讀取,就是在你正常的順序讀取的過程中,先發(fā)一個隨機(jī)讀取的開始命令0x05命令,再傳入你

38、要將內(nèi)部那個數(shù)據(jù)指針定位到具體什么地址,也就是2個cycle的列地址,然后再發(fā)隨機(jī)讀取結(jié)束命令0xE0,然后,內(nèi)部那個數(shù)據(jù)地址指針,就會移動到你所制定的位置了,你接下來再讀取的數(shù)據(jù),就是從那個制定地址開始的數(shù)據(jù)了。而nand flash數(shù)據(jù)手冊里面也說了,這樣的隨機(jī)讀取,你可以多次操作,沒限制的。請注意,上面你所傳入的地址,都是列地址,也就是頁內(nèi)地址,也就是說,對于頁大小為2K的nand flash來說,所傳入的地址,應(yīng)該是小于2048+642112的。不過,實(shí)際在nand flash的使用中,好像這種用法很少的。絕大多數(shù),都是順序讀取數(shù)據(jù)?!卷摼幊蹋▽懖僮鳎縉and flash的寫操作叫做

39、編程Program,編程,一般情況下,是以頁為單位的。有的Nand Flash,比如K9K8G08U0A,支持部分頁編程,但是有一些限制:在同一個頁內(nèi)的,連續(xù)的部分頁的編程,不能超過4次。一般情況下,很少使用到部分頁編程,都是以頁為單位進(jìn)行編程操作的。一個操作,用兩個命令去實(shí)現(xiàn),看起來是多余,效率不高,但是實(shí)際上,有其特殊考慮,至少對于塊擦除來說,開始的命令0x60是擦除設(shè)置命令(erase setup comman),然后傳入要擦除的塊地址,然后再傳入擦除確認(rèn)命令(erase confirm command)0xD0,以開始擦除的操作。這種,分兩步:開始設(shè)置,最后確認(rèn)的命令方式,是為了避免由

40、于外部由于無意的/未預(yù)料而產(chǎn)生的噪音,比如,此時,即使被nand flash誤認(rèn)為是擦除操作,但是沒有之后的確認(rèn)操作0xD0,nand flash就不會去擦除數(shù)據(jù),這樣使得數(shù)據(jù)更安全,不會由于噪音而誤操作。分類: Flash驅(qū)動【讀(read)操作過程詳解】以最簡單的read操作為例,解釋如何理解時序圖,以及將時序圖中的要求,轉(zhuǎn)化為代碼。解釋時序圖之前,讓我們先要搞清楚,我們要做的事情:那就是,要從nand flash的某個頁里面,讀取我們要的數(shù)據(jù)。要實(shí)現(xiàn)此功能,會涉及到幾部分的知識,至少很容易想到的就是:需要用到哪些命令,怎么發(fā)這些命令,怎么計算所需要的地址,怎么讀取我們要的數(shù)據(jù)等等。下面,

41、就一步步的解釋,需要做什么,以及如何去做:1.需要使用何種命令首先,是要了解,對于讀取數(shù)據(jù),要用什么命令。下面是datasheet中的命令集合:圖5.Nand Flash K9K8G08U0A的命令集合很容易看出,我們要讀取數(shù)據(jù),要用到Read命令,該命令需要2個周期,第一個周期發(fā)0x00,第二個周期發(fā)0x30。2.發(fā)送命令前的準(zhǔn)備工作以及時序圖各個信號的具體含義知道了用何命令后,再去了解如何發(fā)送這些命令。小常識在開始解釋前,多羅嗦一下”使能”這個詞,以便有些讀者和我以前一樣,在聽這類雖然對于某些專業(yè)人士說是屬于最基本的詞匯了,但是對于初次接觸,或者接觸不多的人來說,聽多了,容易被搞得一頭霧水

42、:使能(Enable),是指使其(某個信號)有效,使其生效的意思,“使其”“能夠”怎么怎么樣。比如,上面圖中的CLE線號,是高電平有效,如果此時將其設(shè)為高電平,我們就叫做,將CLE使能,也就是使其生效的意思。圖6.Nand Flash數(shù)據(jù)讀取操作的時序圖注:此圖來自三星的型號K9K8G08U0A的nand flash的數(shù)據(jù)手冊(datasheet)。我們來一起看看,我在圖6中的特意標(biāo)注的邊上的黃色豎線。黃色豎線所處的時刻,是在發(fā)送讀操作的第一個周期的命令0x00之前的那一刻。讓我們看看,在那一刻,其所穿過好幾行都對應(yīng)什么值,以及進(jìn)一步理解,為何要那個值。(1)黃色豎線穿過的第一行,是CLE。還

43、記得前面介紹命令所存使能(CLE)那個引腳吧?CLE,將CLE置1,就說明你將要通過I/O復(fù)用端口發(fā)送進(jìn)入Nand Flash的,是命令,而不是地址或者其他類型的數(shù)據(jù)。只有這樣將CLE置1,使其有效,才能去通知了內(nèi)部硬件邏輯,你接下來將收到的是命令,內(nèi)部硬件邏輯,才會將受到的命令,放到命令寄存器中,才能實(shí)現(xiàn)后面正確的操作,否則,不去將CLE置1使其有效,硬件會無所適從,不知道你傳入的到底是數(shù)據(jù)還是命令了。(2)而第二行,是CE#,那一刻的值是0。這個道理很簡單,你既然要向Nand Flash發(fā)命令,那么先要選中它,所以,要保證CE#為低電平,使其有效,也就是片選有效。(3)第三行是WE#,意思

44、是寫使能。因?yàn)榻酉聛硎峭鵱and Flash里面寫命令,所以,要使得WE#有效,所以設(shè)為低電平。(4)第四行,是ALE是低電平,而ALE是高電平有效,此時意思就是使其無效。而對應(yīng)地,前面介紹的,使CLE有效,因?yàn)閷⒁獢?shù)據(jù)的是命令,而不是地址。如果在其他某些場合,比如接下來的要輸入地址的時候,就要使其有效,而使CLE無效了。(5)第五行,RE#,此時是高電平,無效??梢钥吹剑篮竺娴?階段,才變成低電平,才有效,因?yàn)槟菚r候,要發(fā)生讀取命令,去讀取數(shù)據(jù)。(6)第六行,就是我們重點(diǎn)要介紹的,復(fù)用的輸入輸出I/O端口了,此刻,還沒有輸入數(shù)據(jù),接下來,在不同的階段,會輸入或輸出不同的數(shù)據(jù)/地址。(7)

45、第七行,R/B#,高電平,表示R(Ready)/就緒,因?yàn)榈搅撕竺娴牡?階段,硬件內(nèi)部,在第四階段,接受了外界的讀取命令后,把該頁的數(shù)據(jù)一點(diǎn)點(diǎn)送到頁寄存器中,這段時間,屬于系統(tǒng)在忙著干活,屬于忙的階段,所以,R/B#才變成低,表示Busy忙的狀態(tài)的。介紹了時刻的各個信號的值,以及為何是這個值之后,相信,后面的各個時刻,對應(yīng)的不同信號的各個值,大家就會自己慢慢分析了,也就容易理解具體的操作順序和原理了。3.如何計算出,我們要傳入的地址在介紹具體讀取數(shù)據(jù)的詳細(xì)流程之前,還要做一件事,那就是,先要搞懂我們要訪問的地址,以及這些地址,如何分解后,一點(diǎn)點(diǎn)傳入進(jìn)去,使得硬件能識別才行。此處還是以K9K8G

46、08U0A為例,此nand flash,一共有8192個塊,每個塊內(nèi)有64頁,每個頁是2K+64 Bytes,假設(shè),我們要訪問其中的第7000個塊中的第25頁中的1208字節(jié)處的地址,此時,我們就要先把具體的地址算出來:物理地址=塊大小×塊號+頁大小×頁號+頁內(nèi)地址=7000×128K+64×2K+1208=0x36B204B8,接下來,我們就看看,怎么才能把這個實(shí)際的物理地址,轉(zhuǎn)化為nand Flash所要求的格式。在解釋地址組成之前,先要來看看其datasheet中關(guān)于地址周期的介紹:圖7 Nand Flash的地址周期組成結(jié)合圖7和圖5中的2,3階

47、段,我們可以看出,此nand flash地址周期共有5個,2個列(Column)周期,3個行(Row)周期。而對于對應(yīng)地,我們可以看出,實(shí)際上,列地址A0A10,就是頁內(nèi)地址,地址范圍是從0到2047,而對出的A11,理論上可以表示20484095,但是實(shí)際上,我們最多也只用到了20482112,用于表示頁內(nèi)的oob區(qū)域,其大小是64字節(jié)。A12A30,稱作頁號,頁的號碼,可以定位到具體是哪一個頁。而其中,A18A30,表示對應(yīng)的塊號,即屬于哪個塊。/ 可見:地址的傳輸順序是是 頁內(nèi)地址,頁號,塊號。 從小到大。簡單解釋完了地址組成,那么就很容易分析上面例子中的地址了:0x36B204B8 =

48、 0011 0110 1011 0010 0000 0100 1011 1000,分別分配到5個地址周期就是:1st 周期,A7A0 :1011 1000 = 0x B82nd周期,A11A8 :0000 0100 = 0x043rd周期,A19A12 :0010 0000 = 0x204th周期,A27A20 :0110 1011 = 0x6B5th周期,A30A28 :0000 0011 = 0x03注意,與圖7中對應(yīng)的,*L,意思是低電平,由于未用到那些位,datash

49、eet中強(qiáng)制要求設(shè)為0,所以,才有上面的2nd周期中的高4位是0000.其他的A30之后的位也是類似原理,都是0。因此,接下來要介紹的,我們要訪問第7000個塊中的第25頁中的1208字節(jié)處的話,所要傳入的地址就是分5個周期,分別傳入兩個列地址的:0xB8,0x04,然后再傳3個行地址的:0x20,0x6B,0x03,這樣硬件才能識別。4.讀操作過程的解釋準(zhǔn)備工作終于完了,下面就可以開始解釋說明,對于讀操作的,上面圖中標(biāo)出來的,1-6個階段,具體是什么含義。(1) 操作準(zhǔn)備階段:此處是讀(Read)操作,所以,先發(fā)一個圖5中讀命令的第一個階段的0x00,表示,讓硬件先準(zhǔn)備一下,接下來的操作是讀

50、。(2) 發(fā)送兩個周期的列地址。也就是頁內(nèi)地址,表示,我要從一個頁的什么位置開始讀取數(shù)據(jù)。(3) 接下來再傳入三個行地址。對應(yīng)的也就是頁號。(4) 然后再發(fā)一個讀操作的第二個周期的命令0x30。接下來,就是硬件內(nèi)部自己的事情了。(5) Nand Flash內(nèi)部硬件邏輯,負(fù)責(zé)去按照你的要求,根據(jù)傳入的地址,找到哪個塊中的哪個頁,然后把整個這一頁的數(shù)據(jù),都一點(diǎn)點(diǎn)搬運(yùn)到頁緩存中去。而在此期間,你所能做的事,也就只需要去讀取狀態(tài)寄存器,看看對應(yīng)的位的值,也就是R/B#那一位,是1還是0,0的話,就表示,系統(tǒng)是busy,仍在”忙“(著讀取數(shù)據(jù)),如果是1,就說系統(tǒng)活干完了,忙清了,已經(jīng)把整個頁的數(shù)據(jù)都搬

51、運(yùn)到頁緩存里去了,你可以接下來讀取你要的數(shù)據(jù)了。對于這里。估計有人會問了,這一個頁一共2048+64字節(jié),如果我傳入的頁內(nèi)地址,就像上面給的1028一類的值,只是想讀取1028到2011這部分?jǐn)?shù)據(jù),而不是頁開始的0地址整個頁的數(shù)據(jù),那么內(nèi)部硬件卻讀取整個頁的數(shù)據(jù)出來,豈不是很浪費(fèi)嗎?答案是,的確很浪費(fèi),效率看起來不高,但是實(shí)際就是這么做的,而且本身讀取整個頁的數(shù)據(jù),相對時間并不長,而且讀出來之后,內(nèi)部數(shù)據(jù)指針會定位到你剛才所制定的1208的那個位置。(6) 接下來,就是你“竊取“系統(tǒng)忙了半天之后的勞動成果的時候了,呵呵。通過先去Nand Flash的控制器中的數(shù)據(jù)寄存器中寫入你要讀取多少個字節(jié)

52、(byte)/字(word),然后就可以去Nand Flash的控制器的FIFO中,一點(diǎn)點(diǎn)讀取你要的數(shù)據(jù)了。至此,整個Nand Flash的讀操作就完成了。對于其他操作,可以根據(jù)我上面的分析,一點(diǎn)點(diǎn)自己去看datasheet,根據(jù)里面的時序圖去分析具體的操作過程,然后對照代碼,會更加清楚具體是如何實(shí)現(xiàn)的。【Flash的類型】Flash的類型主要分兩種,nand flash和nor flash。除了網(wǎng)上最流行的這個解釋之外:NAND和NOR的比較再多說幾句:1.nor的成本相對高,具體讀寫數(shù)據(jù)時候,不容易出錯??傮w上,比較適合應(yīng)用于存儲少量的代碼。2.Nand flash相對成本低。使用中數(shù)據(jù)讀

53、寫容易出錯,所以一般都需要有對應(yīng)的軟件或者硬件的數(shù)據(jù)校驗(yàn)算法,統(tǒng)稱為ECC。由于相對來說,容量大,價格便宜,因此適合用來存儲大量的數(shù)據(jù)。其在嵌入式系統(tǒng)中的作用,相當(dāng)于PC上的硬盤,用于存儲大量數(shù)據(jù)。所以,一個常見的應(yīng)用組合就是,用小容量的Nor Flash存儲啟動代碼,比如uboot,系統(tǒng)啟動后,初始化對應(yīng)的硬件,包括SDRAM等,然后將Nand Flash上的Linux 內(nèi)核讀取到內(nèi)存中,做好該做的事情后,就跳轉(zhuǎn)到SDRAM中去執(zhí)行內(nèi)核了,然后內(nèi)核解壓(如果是壓縮內(nèi)核的話,否則就直接運(yùn)行了)后,開始運(yùn)行,在Linux內(nèi)核啟動最后,去Nand Flash上,掛載根文件,比如jffs2,yaff

54、s2等,掛載完成,運(yùn)行初始化腳本,啟動consle交互,才運(yùn)行你通過console和內(nèi)核交互。至此完成整個系統(tǒng)啟動過程。而Nor Flash存放的是Uboot,Nand Flash存放的是Linux的內(nèi)核鏡像和根文件系統(tǒng),以及余下的空間分成一個數(shù)據(jù)區(qū)。Nor flash,有類似于dram之類的地址總線,因此可以直接和CPU相連,CPU可以直接通過地址總線對nor flash進(jìn)行訪問,而nand flash沒有這類的總線,只有IO接口,只能通過IO接口發(fā)送命令和地址,對nand flash內(nèi)部數(shù)據(jù)進(jìn)行訪問。相比之下,nor flash就像是并行訪問,nand flash就是串行訪問,所以相對來說

55、,前者的速度更快些。但是由于物理制程/制造方面的原因,導(dǎo)致nor 和nand在一些具體操作方面的特性不同:表3 Nand Flash 和 Nor Flash的區(qū)別1. 理論上是可以的,而且也是有人驗(yàn)證過可以的,只不過由于nand flash的物理特性,不能完全保證所讀取的數(shù)據(jù)/代碼是正確的,實(shí)際上,很少這么用而已。因?yàn)?,如果真是要用到nand flash做XIP,那么除了讀出速度慢之外,還要保證有數(shù)據(jù)的校驗(yàn),以保證讀出來的,將要執(zhí)行的代碼/數(shù)據(jù),是正確的。否則,系統(tǒng)很容易就跑飛了。2. 芯片內(nèi)執(zhí)行(XIP, eXecute In Place):【Nand Flash的種類】具體再分,又可以分為

56、1)Bare NAND chips:裸片,單獨(dú)的nand 芯片2)SmartMediaCards: =裸片+一層薄塑料,常用于數(shù)碼相機(jī)和MP3播放器中。之所以稱smart,是由于其軟件smart,而不是硬件本身有啥smart之處。_3)DiskOnChip:裸片+glue logic,glue logic=硬件ECC產(chǎn)生器+用于靜態(tài)的nand 芯片控制的寄存器+直接訪問一小片地址窗口,那塊地址中包含了引導(dǎo)代碼的stub樁,其可以從nand flash中拷貝真正的引導(dǎo)代碼?!緎pare area/oob】Nand由于最初硬件設(shè)計時候考慮到,額外的錯誤校驗(yàn)等需要空間,專門對應(yīng)每個頁,額外設(shè)計了叫做

57、spare area空區(qū)域,在其他地方,比如jffs2文件系統(tǒng)中,也叫做oob(out of band)數(shù)據(jù)。其具體用途,總結(jié)起來有:1. 標(biāo)記是否是壞快2. 存儲ECC數(shù)據(jù)3. 存儲一些和文件系統(tǒng)相關(guān)的數(shù)據(jù),如jffs2就會用到這些空間存儲一些特定信息,yaffs2文件系統(tǒng),會在oob中,存放很多和自己文件系統(tǒng)相關(guān)的信息?!緝?nèi)存技術(shù)設(shè)備,MTD(Memory Technology Device)】MTD,是Linux的存儲設(shè)備中的一個子系統(tǒng)。其設(shè)計此系統(tǒng)的目的是,對于內(nèi)存類的設(shè)備,提供一個抽象層,一個接口,使得對于硬件驅(qū)動設(shè)計者來說,可以盡量少的去關(guān)心存儲格式,比如FTL,F(xiàn)FS2等,而只需要去提供最簡單的底層硬件設(shè)備的讀/寫/擦除函數(shù)就可以了。而對于數(shù)據(jù)對于上層使用者來說是如何表示的,硬件驅(qū)動設(shè)計者可以不關(guān)心,而MTD存儲設(shè)備子系統(tǒng)都幫你做好了。對于MTD字系統(tǒng)的好處,簡單解釋就是,他幫助你實(shí)現(xiàn)了,很多對于以前或者其他系統(tǒng)來說,本來也是你驅(qū)動設(shè)計者要去實(shí)現(xiàn)的很多功能。換句話說,有了MTD,使得你設(shè)計Nand Flash的驅(qū)

溫馨提示

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

最新文檔

評論

0/150

提交評論