版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、u-boot中NAND flash的MTD驅(qū)動(dòng)移植u-boot中移植了linux中的MTD驅(qū)動(dòng)源碼來(lái)支持NAND flash擦除、燒寫(xiě)及讀的驅(qū)動(dòng)。MTD(memory technology device內(nèi)存技術(shù)設(shè)備)是用于訪問(wèn)flash設(shè)備的Linux的子系統(tǒng)。MTD的主要目的是為了使新的存儲(chǔ)設(shè)備的驅(qū)動(dòng)更加簡(jiǎn)單并有通用接口函數(shù)可用。MTD驅(qū)動(dòng)可支持CFI接口的norflash驅(qū)動(dòng)、NAND flash驅(qū)動(dòng)。我們知道NAND flash的訪問(wèn)接口并沒(méi)有像norflash一樣提供了一個(gè)標(biāo)準(zhǔn)的CFI訪問(wèn)接口,但是NAND flash生產(chǎn)廠家之間在各品牌、各型號(hào)NAND falsh芯片的訪問(wèn)接口方面做
2、了一些約定俗成規(guī)定,如命令字、地址序列、命令序列、壞塊標(biāo)記位置、oob區(qū)格式等。值得注意的是:在工藝制程方面分NAND flash有兩種類型:MLC和SLC。MLC和SLC屬于兩種不同類型的NAND FLASH存儲(chǔ)器。SLC全稱是Single-Level Cell,即單層單元閃存,而MLC全稱則是Multi-Level Cell,即為多層單元閃存。它們之間的區(qū)別,在于SLC每一個(gè)單元,只能存儲(chǔ)一位數(shù)據(jù),MLC每一個(gè)單元可以存儲(chǔ)兩位數(shù)據(jù),MLC的數(shù)據(jù)密度要比SLC 大一倍。在頁(yè)面容量方面分NAND也有兩種類型:大頁(yè)面NAND flash(如:HY27UF082G2B)和小頁(yè)面NAND flash
3、(如:K9F1G08U0A)。這兩種類型在頁(yè)面容量,命令序列、地址序列、頁(yè)內(nèi)訪問(wèn)、壞塊標(biāo)識(shí)方面都有很大的不同,并遵循不同的約定所以在移植驅(qū)動(dòng)時(shí)要特別注意。下面以大頁(yè)面的NAND flash:現(xiàn)代 HY27UF082G2B為例介紹一下NAND flash一些基本情況,再來(lái)介紹MTD驅(qū)動(dòng)的基本結(jié)構(gòu)及流程分析,最后介紹u-boot中MTD驅(qū)動(dòng)移植的詳細(xì)步驟:)NAND flash一些基本情況fl2400開(kāi)發(fā)板上的nandflash芯片型號(hào)為:現(xiàn)代 HY27UF082G2B,下面先介紹一下nandflash,及norflash與nandflash之間的區(qū)別:NOR和NAND是現(xiàn)在市場(chǎng)上兩種主要的非易失
4、閃存技術(shù)。Intel于1988年首先開(kāi)發(fā)出NOR flash技術(shù),它最重要得特征是支持片上執(zhí)行,徹底改變了原先由EPROM和EEPROM一統(tǒng)非易失閃存天下的局面。緊接著,1989年,東芝公司發(fā)表了NAND flash結(jié)構(gòu),每比特更低的成本,更高的容量,并且象磁盤(pán)一樣可以通過(guò)接口輕松升級(jí)。NOR flash更適合用來(lái)存儲(chǔ)少量的關(guān)鍵的代碼和數(shù)據(jù),而NAND falsh則更適合存儲(chǔ)大量的高密度的數(shù)據(jù)。下表說(shuō)明了norflash與nandflash之間的差異:性能項(xiàng)目NorflashNandflash容量通常為14MB,最大為32MB8MB512MB片上執(zhí)行支持,可以直接在其上啟動(dòng)bootloader
5、不支持,讀要驅(qū)動(dòng)。僅三星芯片支持steppingstone技術(shù)外,其他芯片必須搭配norflash啟動(dòng)bootloader可靠性比較高,位反轉(zhuǎn)機(jī)率為nandflash的1/10比較低,位反轉(zhuǎn)很常見(jiàn),必須要有校驗(yàn)措施。推薦使用EDC/ECC算法進(jìn)行錯(cuò)誤檢查和恢復(fù),這也導(dǎo)致了對(duì)nandflash的管理和編寫(xiě)驅(qū)動(dòng)程序更為復(fù)雜。訪問(wèn)接口與RAM、eeprom相同,地址線和數(shù)據(jù)線分開(kāi),并行訪問(wèn),可隨機(jī)訪問(wèn)地址、數(shù)據(jù)、命令并用I/O線,通過(guò)各使能引腳區(qū)分地址、數(shù)據(jù)及命令,串行訪問(wèn),必須順序訪問(wèn)塊大?。ú脸龁挝唬?4K128K8K64K塊擦除時(shí)間5S,很慢3ms,快讀寫(xiě)速度燒寫(xiě)慢,讀快讀、燒寫(xiě)都很快可擦除次
6、數(shù)110萬(wàn)次10100萬(wàn)次主要用途保存代碼和關(guān)鍵數(shù)據(jù)保存大量的高密度數(shù)據(jù)文件系統(tǒng)支持Jffs2yaffs價(jià)格高低 下面我們根據(jù)HY27UF082G2B的datasheet從以下幾個(gè)方面詳細(xì)說(shuō)明:3.) HY27UF082G2B概述 HY27UF082G2B,48腳TSOP1封裝,容量2Gbit(256MB),位寬8位,地址、數(shù)據(jù)及命令復(fù)用I/O07。芯片封裝圖如下(截圖自HY27UF082G2B datasheet): 從上圖中可以看出:48個(gè)引腳中大部分沒(méi)有用(NC),由于數(shù)據(jù)線復(fù)用所以HY27UF082G2B的真正需要連接引腳并不多。下表是HY27UF082G2B連接引腳功能表:引腳名稱引
7、腳功能I/O0I/O7數(shù)據(jù)輸入/輸出CLE命令鎖存使能ALE地址鎖存使能CE片選使能WE寫(xiě)使能RE讀使能WP寫(xiě)保護(hù)R/B就緒/忙信號(hào)輸出VCC電源VSS地NC不接由上表可知,HY27UF082G2B與S3C2440的連線比較少:8個(gè)I/O引腳、5個(gè)使能引腳(CLE、ALE、CE、WE、RE)、1個(gè)寫(xiě)保護(hù)引腳(WP)、1個(gè)狀態(tài)引腳(R/B)。地址、數(shù)據(jù)、命令都是在這些使能信號(hào)的配合下,通過(guò)8個(gè)I/O引腳傳輸。寫(xiě)地址、數(shù)據(jù)、命令時(shí),CE、WE信號(hào)必須為低電平,他們?cè)赪E信號(hào)的上升沿被鎖存。命令鎖存使能信號(hào)CLE和地址鎖存信號(hào)ALE用來(lái)區(qū)分I/O引腳上傳輸?shù)氖敲钸€是地址。其他BUS OPERATI
8、ON(總線操作)在datasheet的11頁(yè)有詳細(xì)描述,這里不再贅述。由上可知,對(duì)芯片的總線操作必須要有各使能信號(hào)的配合,但是這些使能信號(hào)控制不需要用戶的驅(qū)動(dòng)程序干預(yù)。S3C2440中的NAND flash控制器將自動(dòng)根據(jù)用戶讀寫(xiě)NAND falsh控制寄存器(寫(xiě)的是命令寄存器NFCMD,還是地址寄存器NFADDR,還是讀的數(shù)據(jù)寄存器NFDATA等等)的情況在NAND flash控制相關(guān)引腳輸出正確的使能信號(hào),用戶要做的就是將S3C2440上NAND flash控制相關(guān)引腳連正確接到HY27UF082G2B的使能引腳上。S3C2440上NAND flash控制相關(guān)引腳見(jiàn)下圖:除5個(gè)使能信號(hào)外,
9、HY27UF082G2B的狀態(tài)引腳也應(yīng)該連接到s3c2440的NAND flash控制相關(guān)引腳FRnB上。NAND flash芯片與S3C2440 硬件連線見(jiàn)下圖,該截取至飛凌提供的官方硬件接線原理圖:在這里還介紹一下S3C2440的NAND flash控制器相關(guān)的寄存器:1、 NFCONF:NAND flash配置寄存器1設(shè)置時(shí)序參數(shù)TACLS、TWRPH0、TWRPH0;2、 NFCONT:NAND flash配置寄存器2使能禁止NAND控制器、使能禁止引腳信號(hào)nFCE、初始化ECC;3、 NFCMD:NAND flash命令寄存器寫(xiě)該寄存器時(shí)向NAND flash芯片發(fā)出命令信號(hào);4、
10、NFADDR:NAND flash地址寄存器寫(xiě)該寄存器時(shí)向NAND flash芯片發(fā)出地址信號(hào);5、 NFDATA:NAND flash數(shù)據(jù)寄存器讀寫(xiě)該寄存器時(shí)向NAND flash芯片讀出或?qū)懭霐?shù)據(jù)信號(hào);6、 NFSTAT:NAND flash狀態(tài)寄存器僅用到位0,0:busy,1:ready這里只簡(jiǎn)單介紹了一些重要的寄存器,還有很多的寄存器沒(méi)有介紹到。比如:與NAND flash控制器提供的ECC硬件生產(chǎn)功能相關(guān)寄存器等,詳見(jiàn)S3C2440 datasheet。3.) HY27UF082G2B的存儲(chǔ)單元組織結(jié)構(gòu)NAND flash跟norflash不同,NAND Flash的讀取和燒錄以(
11、page)頁(yè)為基礎(chǔ), 而NOR卻是以字節(jié)或字為基礎(chǔ)。擦除都是以塊為單位。NAND Flash存儲(chǔ)器由block (塊) 構(gòu)成, block的基本單元是page (頁(yè))。每個(gè)頁(yè)面又包含了一個(gè)Data area(數(shù)據(jù)存儲(chǔ)區(qū)域)和一個(gè)Spare area(備用區(qū)域),小頁(yè)面的NAND Flash器件每個(gè)page (頁(yè))內(nèi)包含512個(gè)字節(jié)的Data area(數(shù)據(jù)存儲(chǔ)區(qū)域)和16字節(jié)Spare area(備用區(qū)域)。大頁(yè)面的NAND Flash器件每一個(gè)page (頁(yè))內(nèi)包含2048個(gè)字節(jié)的Data area(數(shù)據(jù)存儲(chǔ)區(qū)域)和64字節(jié)的Spare area(備用區(qū)域)。HY27UF082G2B為大頁(yè)面
12、NAND flash。下圖是HY27UF082G2B的存儲(chǔ)單元組織結(jié)構(gòu):圖中劃紅線處為8位寬的的HY27UF082G2B存儲(chǔ)單元組織結(jié)構(gòu)??梢钥闯鲆粋€(gè)芯片包含了2048個(gè)塊,一個(gè)塊包含了64個(gè)頁(yè),而一個(gè)頁(yè)包含了2048字節(jié)的數(shù)據(jù)存儲(chǔ)區(qū)和64字節(jié)的備用區(qū)域。下圖形象的表示了HY27UF082G2B的存儲(chǔ)單元組織結(jié)構(gòu)(注意:該圖中只有1024個(gè)塊):可以看出一個(gè)HY27UF082G2B芯片包括了1Gbit(256MB)的數(shù)據(jù)存儲(chǔ)區(qū)和256Mbit(32MB)的備用區(qū)。1、 HY27UF082G2B的訪問(wèn)地址序列HY27UF082G2B總共的容量為288MB(256MB+32MB),8位位寬,需要2
13、9位的訪問(wèn)地址。但芯片只提供了8根地址線(復(fù)用),明顯不足。所以對(duì)HY27UF082G2B訪問(wèn)時(shí),訪問(wèn)地址被分割成5個(gè)地址序列,這5個(gè)地址序列中的前兩個(gè)為頁(yè)內(nèi)地址,后三個(gè)為頁(yè)面地址。兩個(gè)頁(yè)內(nèi)地址序列有效地址位為12位,以滿足對(duì)頁(yè)內(nèi)2048+64字節(jié)空間的訪問(wèn);后三個(gè)地址序列有效地址為17位,以滿足對(duì)一個(gè)芯片內(nèi)共2048(塊)*64(頁(yè))個(gè)頁(yè)面的訪問(wèn)。HY27UF082G2B地址序列表見(jiàn)下圖: 上圖中的L表示無(wú)效地址設(shè)為低電平。在實(shí)際驅(qū)動(dòng)程序編程時(shí)用戶必須嚴(yán)格按照這五個(gè)地址序列來(lái)向NFADDR寄存器中分別寫(xiě)入每個(gè)序列地址。也就是說(shuō)用戶發(fā)出一個(gè)完整的訪問(wèn)地址必須寫(xiě)5次NFADDR寄存器。值得注意的
14、是:小頁(yè)面NAND flash僅僅提供了一個(gè)地址序列,8個(gè)訪問(wèn)地址位來(lái)訪問(wèn)512+16字節(jié)的頁(yè)內(nèi)空間,訪問(wèn)地址位明顯足。所以小頁(yè)面NAND flash將頁(yè)內(nèi)地址分割成A、B、C三個(gè)區(qū),分別用不同的讀命令進(jìn)行訪問(wèn),以彌補(bǔ)頁(yè)內(nèi)訪問(wèn)地址序列地址位不足的缺陷。相對(duì)而言,大頁(yè)面NAND flash它為頁(yè)內(nèi)地址訪問(wèn)提供了足夠的地址序列和訪問(wèn)地址位(12位地址訪問(wèn)2048+64字節(jié)空間,足夠了),所以大頁(yè)面NAND flash對(duì)頁(yè)內(nèi)地址的訪問(wèn)也更為簡(jiǎn)潔。2、 HY27UF082G2B的操作命令序列和操作實(shí)現(xiàn) 前面提到過(guò): NAND Flash的讀取和燒錄以(page)頁(yè)為基礎(chǔ),擦除以塊為單位。那么,在NAN
15、D Flash上有三種基本的操作:讀取一個(gè)頁(yè), 燒錄一個(gè)頁(yè)和擦除一個(gè)塊,這三個(gè)基本操作有各自的命令序列。實(shí)際上,大多數(shù)NAND Flash除提供了這三個(gè)基本操作外,還提供了很多其他的操作及操作命令序列,如:HY27UF082G2B就提供了Multi Plane Program(多層燒寫(xiě))、Multi Plane Erase(多層擦除)、Copy-back Program(同層頁(yè)復(fù)制)、Multi-Plane Copy-Back Program(多層同層頁(yè)復(fù)制)、Multi Plane Erase(多層擦除)、EDC Operation(ECD操作)、reset(復(fù)位)等操作。如上涉及到了一個(gè)層
16、的概念,什么是層?層就是將芯片各塊平均分配到塊組,如:塊編號(hào)為奇數(shù)為一組,塊編號(hào)為偶數(shù)的分為一組,這樣的塊組就叫層。層有這樣的特性:用戶可對(duì)不同層中的塊同時(shí)進(jìn)行擦除和燒寫(xiě)甚至復(fù)制。HY27UF082G2B中的塊分成了2個(gè)層,有些NAND flash分成了4個(gè)層。明顯,分層操作能成倍提高燒寫(xiě)、擦除速度。下圖是HY27UF082G2B各操作的命令序列: 紅線處為HY27UF082G2B的五種基本操作。下面就這五種基本操作中的讀頁(yè)操作的命令序列和操作方法作出詳細(xì)說(shuō)明,其他操作的操作方法具體參見(jiàn)datasheet。4.1) READ1讀頁(yè)讀頁(yè)操作有兩個(gè)命令序列,命令字分別為00h、30h。讀頁(yè)操作的流
17、程圖見(jiàn)下圖: 整個(gè)流程比較簡(jiǎn)單,先寫(xiě)讀頁(yè)操作的第一個(gè)命令序列的命令字00h,然后寫(xiě)頁(yè)地址(注意:這里的頁(yè)地址是指頁(yè)面的開(kāi)始地址,此時(shí)頁(yè)內(nèi)地址A0A11都應(yīng)為0),然后寫(xiě)第二個(gè)命令序列的命令字30h。再讀取狀態(tài)寄存器的位0,為1后就可以從NFDATA連續(xù)讀出頁(yè)內(nèi)數(shù)據(jù)。注:流程圖有一點(diǎn)錯(cuò)誤:它沒(méi)有讀取并判斷狀態(tài)寄存器)。值得注意的是:這里的操作流程僅僅是讀頁(yè)操作,如果要在驅(qū)動(dòng)程序中讀出頁(yè)中數(shù)據(jù)(即讀NAND flash)比讀頁(yè)復(fù)雜得多,必須先要初始化NAND flash、判斷壞塊,進(jìn)行ECC校驗(yàn)等一系列操作。這些操作這里不詳述,在后面編寫(xiě)驅(qū)動(dòng)程序時(shí)再詳細(xì)分析。這里只分析讀頁(yè)操作是因?yàn)樵谝浦矎腘AN
18、D flash啟動(dòng)是只需要讀頁(yè)操作,其他的操作在移植NAND flash驅(qū)動(dòng)時(shí)再做分析。4.2) PAGE PROGRAM寫(xiě)頁(yè)寫(xiě)頁(yè)操作同樣也有兩個(gè)命令序列,命令字分別為:80h、10h。寫(xiě)頁(yè)操作流程圖如下:操作流程為:先寫(xiě)命令字80h再寫(xiě)頁(yè)地址(注意:這里的頁(yè)地址是指頁(yè)面的開(kāi)始地址,此時(shí)頁(yè)內(nèi)地址A0A11都應(yīng)為0),接著將要寫(xiě)的數(shù)據(jù)寫(xiě)到全部依次NFDATA寄存器(這些數(shù)據(jù)會(huì)寫(xiě)到芯片內(nèi)的寫(xiě)緩沖區(qū)),再通過(guò)讀取狀態(tài)寄存器及I/O0判斷寫(xiě)頁(yè)是否正確完成。4.3) BLOCK ERASE擦除塊同樣也有兩個(gè)命令序列,命令字分別為60h、D0h,擦除塊流程圖如下: 操作流程為:寫(xiě)命令字60h后再寫(xiě)塊地址(
19、塊開(kāi)始地址)然后寫(xiě)命令字d0h,再讀取狀態(tài)寄存器及I/O0判斷是否擦除成功。 4.4) READID讀ID 讀設(shè)備ID只有一個(gè)命令字90h,先向命令寄存器寫(xiě)入90h再向地址寄存器寫(xiě)入00h可啟動(dòng)讀ID操作,后續(xù)連續(xù)5次讀取數(shù)據(jù)寄存器操作可以讀出5個(gè)包含了全部id內(nèi)容的數(shù)據(jù)。這5個(gè)數(shù)據(jù)內(nèi)容如下: 第一個(gè)讀取的數(shù)據(jù)為廠商ID,第二個(gè)讀取的數(shù)據(jù)為設(shè)備ID。第三個(gè)讀取的數(shù)據(jù)組織結(jié)構(gòu)見(jiàn)下表:bit0:1為芯片封裝類型,bit2:3為芯片制程類型(SLC還是MLC),bit4:5為同時(shí)寫(xiě)頁(yè)數(shù),bit6、7不明。第三個(gè)讀ID數(shù)據(jù)反應(yīng)的內(nèi)容并不常用。第四個(gè)讀ID數(shù)據(jù)組織結(jié)構(gòu)如下圖:bit0:1為芯片的頁(yè)面容量
20、,bit2為oob區(qū)大小,bit3、7表征串行訪問(wèn)時(shí)間、bit4:5表示芯片塊容量、bit6表示芯片位寬。第四個(gè)讀ID數(shù)據(jù)給出的信息很重要,請(qǐng)注意。第五個(gè)讀ID數(shù)據(jù)組織結(jié)構(gòu)如下圖:bit2:3表示芯片的分層數(shù),bit4:6表示芯片單層容量。第五個(gè)讀ID數(shù)據(jù)主要反應(yīng)了芯片的分層信息,在進(jìn)行分層操作時(shí)這個(gè)數(shù)據(jù)比較重要。對(duì)一個(gè)nandflash而言,讀ID獲得的數(shù)據(jù)是個(gè)固定值,它反應(yīng)了芯片的固有特性。HY27UF082G2A的讀ID數(shù)據(jù)如下圖:4.5)READ STATUS REGISTER讀狀態(tài)寄存器 讀狀態(tài)寄存器只有一個(gè)命令序列70h,向命令寄存器寫(xiě)70h后獲取芯片的狀態(tài)有兩種方式:1、讀狀態(tài)寄
21、存器:狀態(tài)寄存器的bit0指示了芯片的狀態(tài),為1時(shí)就緒,為0是忙;2、讀數(shù)據(jù)寄存器:I/O07指示狀態(tài)如下:Bit6指示了芯片的狀態(tài),bit0指示了燒寫(xiě)、擦除的狀態(tài):0為完成,1為出錯(cuò)。關(guān)于這點(diǎn)在燒寫(xiě)、擦除流程圖中表述得很清楚。)MTD驅(qū)動(dòng)結(jié)構(gòu)及流程分析MTD的驅(qū)動(dòng)結(jié)構(gòu)是圍繞三個(gè)重要的數(shù)據(jù)結(jié)構(gòu)展開(kāi)的, 分析一個(gè)數(shù)據(jù)結(jié)構(gòu)就包含了三個(gè)方面:1、 數(shù)據(jù)結(jié)構(gòu)的結(jié)構(gòu)聲明;2、 數(shù)據(jù)結(jié)構(gòu)的變量定義;3、 數(shù)據(jù)結(jié)構(gòu)的操作;下面我們就MTD驅(qū)動(dòng)的三個(gè)數(shù)據(jù)結(jié)構(gòu)在這三方面分別分析。MTD驅(qū)動(dòng)的三個(gè)重要數(shù)據(jù)結(jié)構(gòu)是:struct mtd_info、struct nand_chip、struct nand_flash_
22、dev。1、數(shù)據(jù)結(jié)構(gòu)struct mtd_info分析該數(shù)據(jù)結(jié)構(gòu)是MTD設(shè)備操作的通用接口,主要針對(duì)的是MTD設(shè)備。這其中包含了大量的描述MTD設(shè)備的基本數(shù)據(jù)和對(duì)MTD設(shè)備操作函數(shù)的函數(shù)指針。要強(qiáng)調(diào)的是:包含的這些函數(shù)指針指向的函數(shù)是MTD驅(qū)動(dòng)提供的接口函數(shù)(每一個(gè)驅(qū)動(dòng)程序的最終目的就是提供一些接口函數(shù)實(shí)現(xiàn)對(duì)底層硬件設(shè)備的操作),這些函數(shù)是在整個(gè)MTD驅(qū)動(dòng)框架中層次最高的函數(shù),他們可以在應(yīng)用程序中直接調(diào)用實(shí)現(xiàn)對(duì)MTD設(shè)備底層硬件的操作。如:static int nand_read_ecc ()。它實(shí)現(xiàn)了對(duì)NAND flash的讀操作。這些函數(shù)一般是都在u-boot源碼目錄下的driver/na
23、nd/nand_base.c中實(shí)現(xiàn)的通用操作函數(shù)。MTD驅(qū)動(dòng)保證這些通用的操作函數(shù)支持對(duì)各種NAND flash芯片的操作。下面就數(shù)據(jù)結(jié)構(gòu)的三個(gè)方面來(lái)具體分析struct mtd_info:1) struct mtd_info的結(jié)構(gòu)聲明該結(jié)構(gòu)在include/linux/mtd/nand.h中做了結(jié)構(gòu)聲明,去掉一些編譯選項(xiàng)、無(wú)關(guān)成員和原有注釋后聲明,并添加了一些重要成員的住時(shí)候,其源碼如下:struct mtd_info u_char type; /MTD設(shè)備類型,norflash還是NAND flashu_int32_t flags; /MTD設(shè)備的性能描述u_int32_t size; /
24、MTD設(shè)備的容量u_int32_t erasesize; /擦除單位大小u_int32_t oobblock; /NAND flash 頁(yè)面容量u_int32_t oobsize; /NAND flash OOB區(qū)容量u_int32_t oobavail; /文件系統(tǒng)可用的oobfree區(qū)字節(jié)數(shù)u_int32_t ecctype; /ECC校驗(yàn)類型u_int32_t eccsize;int (*erase) (struct mtd_info *mtd, struct erase_info *instr); /擦除功能函數(shù)的函數(shù)指針int (*read) (struct mtd_info *mt
25、d, loff_t from, size_t len, size_t *retlen, u_char *buf);/讀功能函數(shù)的函數(shù)指針int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); /寫(xiě)功能函數(shù)的函數(shù)指針int (*read_ecc) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf, u_char *eccbuf, struct nand_oobin
26、fo *oobsel); /NAND flash特有的讀ECC功能函數(shù)(實(shí)際上NAND flash讀操作是在這個(gè)函數(shù)中完成的)函數(shù)指針int (*write_ecc) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf, u_char *eccbuf, struct nand_oobinfo *oobsel);/NAND flash特有的寫(xiě)ECC功能函數(shù)(實(shí)際上NAND flash寫(xiě)操作是在這個(gè)函數(shù)中完成的)函數(shù)指針int (*read_oob) (struct mtd_info *mt
27、d, loff_t from, size_t len, size_t *retlen, u_char *buf); /NAND flash 讀oob區(qū)功能函數(shù)的函數(shù)指針int (*write_oob) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);/NAND flash 寫(xiě)oob區(qū)功能函數(shù)的函數(shù)指針./* 壞塊管理函數(shù)的函數(shù)指針 */int (*block_isbad) (struct mtd_info *mtd, loff_t ofs);int (*block_markbad)
28、 (struct mtd_info *mtd, loff_t ofs);void *priv; /這個(gè)指針指向MTD驅(qū)動(dòng)中另一個(gè)重要的數(shù)據(jù)結(jié)構(gòu)struct nand_chip; 2) struct mtd_info的變量定義struct mtd_info數(shù)據(jù)結(jié)構(gòu)的變量在drivers/nand/nand.c中定義為:nand_info_t nand_infoCFG_MAX_NAND_DEVICE;其中有:typedef struct mtd_info nand_info_t 可知nand_info就是mtd_info,CFG_MAX_NAND_DEVICE為在include/configs/f
29、l2440.h中必須配置的參數(shù),它表示開(kāi)發(fā)板上NAND flash的物理片數(shù)。這個(gè)變量將在nand_init()調(diào)用函數(shù)static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand, ulong base_addr)時(shí),作為該函數(shù)的第一個(gè)實(shí)參調(diào)用,如下: nand_init_chip(&nand_infoi, &nand_chipi, base_addressi); 在MTD框架內(nèi)幾乎所有的函數(shù)都會(huì)有一個(gè)形參struct mtd_info *mtd,這個(gè)形參的實(shí)際值就是&nand_info
30、i,所以MTD框架內(nèi)的函數(shù)中mtd指針指向的是在drivers/nand/nand.c中定義的變量nand_infoi的指針。尤其是nand_scan()函數(shù)中,大量用到了mtd這個(gè)指針來(lái)指向變量nand_infoi。如:mtd->write = nand_write;mtd->read_ecc = nand_read_ecc;mtd->write_ecc = nand_write_ecc;等。3)對(duì)struct mtd_info操作(初始化)數(shù)據(jù)結(jié)構(gòu)struct mtd_info是一個(gè)簡(jiǎn)單的結(jié)構(gòu)體,對(duì)它的操作比較簡(jiǎn)單。無(wú)非就是對(duì)其結(jié)構(gòu)體中的成員變量進(jìn)行初始化。對(duì)struct
31、 mtd_info的初始化都在函數(shù)nand_scan()中完成。該函數(shù)是初始化MTD設(shè)備的核心函數(shù)。我們將在后面詳細(xì)分析它。題外話:對(duì)一個(gè)數(shù)據(jù)結(jié)構(gòu)的操作絕不僅僅是初始化,如鏈表,對(duì)它的操作除初始化外還包括了鏈表管理,如:鏈表成員的添加、刪除等操作。這樣的操作更復(fù)雜,一般通過(guò)專門(mén)的函數(shù)來(lái)實(shí)現(xiàn)。2、 數(shù)據(jù)結(jié)構(gòu)struct nand_chip分析 這個(gè)數(shù)據(jù)結(jié)構(gòu)從結(jié)構(gòu)名nand_chip就可以知道它主要針對(duì)MTD設(shè)備中NAND flash的描述。在這個(gè)數(shù)據(jù)結(jié)構(gòu)中包含了許多參數(shù)和函數(shù)指針。其中的成員大致可以分為以下幾類:1、 與芯片有關(guān)的參數(shù)如:page_shift、phys_erase_shift、b
32、bt_erase_shift、chip_shift、chipsize、numchips 2、與壞塊管理、ECC校驗(yàn)及oob區(qū)管理有關(guān)的參數(shù): 如: eccmode、eccsize、eccbyte、eccsteps、calculate_ecc、oob_buf、oobdirty、autooob、bbt、badblockpos、bbt_td、bbt_md、badblock_pattern 3、與NAND flash控制器寄存器操作有關(guān)的參數(shù) 如:IO_ADDR_R、IO_ADDR_W 4、與NAND flash控制器寄存器操作有關(guān)的函數(shù)指針 如:read_byte、write_byte、read_w
33、ord、write_word、hwcontrol、dev_ready、cmdfunc、select_chip 5、與NAND flash操作功能有關(guān)的函數(shù)指針 如:write_buf、read_buf、verify_buf、waitfunc、erase_cmd 6、與壞塊管理、ECC校驗(yàn)及oob區(qū)管理有關(guān)的函數(shù)指針: 如:block_bad、block_markbad、calculate_ecc、correct_data、enable_hwecc、scan_bbt綜上,nand_chip主要包括了MTD驅(qū)動(dòng)的低層和底層硬件操作函數(shù)的函數(shù)指針以及壞塊管理、ECC校驗(yàn)和oob區(qū)管理需要相關(guān)函數(shù)的函
34、數(shù)指針,這些指針指向的函數(shù)一部分在u-boot源碼目錄下的driver/nand/nand_base.c定義為通用函數(shù),一部分需要用戶在移植時(shí)自行編寫(xiě)。那些需要用戶自行編寫(xiě)在后續(xù)的分析將會(huì)提到。nand_chip還包括了一些參數(shù),這些參數(shù)與具體芯片型號(hào)及壞塊管理策略有關(guān),它們會(huì)在nand_scan()函數(shù)中被初始化。1)struct nand_chip的結(jié)構(gòu)聲明它在include/linux/mtd/nand.h中被聲明定義,去掉一些編譯選項(xiàng)、無(wú)關(guān)成員及原有注釋,添加一些注釋后如下;struct nand_chip void _iomem*IO_ADDR_R; /NAND flash控制器的寄
35、存器讀訪問(wèn)指針,void _iomem*IO_ADDR_W; /NAND flash控制器的寄存器寫(xiě)訪問(wèn)指針,u_char(*read_byte)(struct mtd_info *mtd); /寫(xiě)一字節(jié)到NAND flash控制器的寄存器函數(shù)的函數(shù)指針void(*write_byte)(struct mtd_info *mtd, u_char byte); /從NAND flash控制器的寄存器讀一字節(jié)函數(shù)的函數(shù)指針u16(*read_word)(struct mtd_info *mtd); /讀字函數(shù)指針void(*write_word)(struct mtd_info *mtd, u16
36、 word); /寫(xiě)字函數(shù)指針 /讀寫(xiě)緩沖區(qū)函數(shù)指針,所謂緩沖區(qū)無(wú)非就是自行定義的一個(gè)數(shù)組void(*write_buf)(struct mtd_info *mtd, const u_char *buf, int len);void(*read_buf)(struct mtd_info *mtd, u_char *buf, int len);int(*verify_buf)(struct mtd_info *mtd, const u_char *buf, int len);/緩存校驗(yàn)韓式指針,驗(yàn)證從Flash中讀取的內(nèi)容是否與緩存中一致void(*select_chip)(struct mtd
37、_info *mtd, int chip); /芯片片選函數(shù)指針,由于涉及底層寄存器操作該函數(shù)在移植時(shí)一般要自己編寫(xiě)int(*block_bad)(struct mtd_info *mtd, loff_t ofs, int getchip); /讀取壞塊標(biāo)記函數(shù)指針int(*block_markbad)(struct mtd_info *mtd, loff_t ofs); /標(biāo)記壞塊函數(shù)指針void(*hwcontrol)(struct mtd_info *mtd, int cmd); /寄存器訪問(wèn)控制函數(shù)指針,該函數(shù)根據(jù)第二個(gè)參數(shù)cmd使O_ADDR_R/W指向不同的寄存器int(*dev_
38、ready)(struct mtd_info *mtd); /設(shè)備狀態(tài)讀取函數(shù)指針,該函數(shù)讀取NAND flash控制器的NFSTAT的bit0,獲取R/B狀態(tài)void(*cmdfunc)(struct mtd_info *mtd, unsigned command, int column, int page_addr);/向NAND flash寫(xiě)一個(gè)命令字,如果形參column、page_addr不都為-1則還向NAND flash寫(xiě)一個(gè)地址int(*waitfunc)(struct mtd_info *mtd, struct nand_chip *this, int state);/操作超
39、時(shí)處理函數(shù)指針,該函數(shù)根據(jù)命令的不同設(shè)定不同的超時(shí)時(shí)間并時(shí)刻檢查R/B位直到R/B狀態(tài)進(jìn)入Ready狀態(tài)否則為操作超時(shí)。int(*calculate_ecc)(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code); /ECC編碼計(jì)算函數(shù)指針,該函數(shù)通過(guò)軟件算法計(jì)算256字節(jié)的3字節(jié)ECC編碼int(*correct_data)(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc); /ECC檢測(cè)糾正函數(shù),該函數(shù)檢測(cè)并糾正256字節(jié)塊中的1位錯(cuò)誤
40、。void(*enable_hwecc)(struct mtd_info *mtd, int mode); /使能硬件計(jì)算ECC碼函數(shù)指針void(*erase_cmd)(struct mtd_info *mtd, int page); /擦除指定塊函數(shù)的函數(shù)指針int(*scan_bbt)(struct mtd_info *mtd); /壞塊標(biāo)記表創(chuàng)建函數(shù)指針inteccmode;/ ECC的計(jì)算方法, NAND_ECC_SOFT時(shí)意指軟件運(yùn)算,即采用calculate_ecc進(jìn)行運(yùn)算,利用correct_data進(jìn)行校正inteccsize;/ ECC校準(zhǔn)的數(shù)據(jù)長(zhǎng)度,用calculate_
41、ecc進(jìn)行校準(zhǔn)時(shí),數(shù)據(jù)長(zhǎng)度固定為256字節(jié)inteccbytes;/ ECC校驗(yàn)碼字節(jié)數(shù),軟件校準(zhǔn)時(shí)為3字節(jié)inteccsteps;/ ECC校驗(yàn)的步數(shù),當(dāng)FLASH每頁(yè)的字節(jié)數(shù)為512字節(jié),而calculate_ecc每次僅能校驗(yàn)256字節(jié),則需要兩步才能校驗(yàn)完成。intchip_delay;/ 等待時(shí)間,一般用于等待Flash的R/B管腳intpage_shift;/ 頁(yè)的地址移位數(shù),當(dāng)為512(29)字節(jié)的空間,其該值為9intphys_erase_shift;/ 塊的地址移位數(shù)intbbt_erase_shift;/ 在bbt表中,相間隔兩個(gè)內(nèi)容之間的地址差的位數(shù),也即是塊的地址位數(shù)i
42、ntchip_shift;/ 芯片總的地址位數(shù)u_char*data_buf; /數(shù)據(jù)緩沖區(qū)指針u_char*oob_buf;/oob緩沖區(qū)指針intoobdirty;/ 表示oob_buf內(nèi)是否有內(nèi)容,如為0表示oob_buf為空(0xFF),為1表示oob_buf中已有內(nèi)容u_char*data_poi;/ 指向一個(gè)臨時(shí)使用的數(shù)據(jù)區(qū)unsigned intoptions;/MTD驅(qū)動(dòng)中配置NAND FALSH芯片的擴(kuò)展功能,如NAND_IS_AND、NAND_USE_FLASH_BBT、NAND_COPYBACK等等和重要參數(shù),如位寬NAND_BUSWIDTH_16。上述的這些宏在incl
43、ude/linux/mtd/nand.h均有定義,這些宏的定義能保證當(dāng)它們進(jìn)行或運(yùn)算是能保證options能同時(shí)接受這些擴(kuò)展功能和參數(shù)。及options某bit位為1時(shí)則使用對(duì)應(yīng)的擴(kuò)展功能。如有:#define NAND_COPYBACK0x00000010那么如果options的bit4位為1則使用copyback功能,在MTD中大量使用了這種技巧,需要注意intbadblockpos;/ 壞塊標(biāo)記的位置。當(dāng)芯片為小頁(yè)面NAND flashs時(shí)值為NAND_SMALL_BADBLOCK_POS(即為5);為大頁(yè)面時(shí)值為NAND_BIG _BADBLOCK_POS(即為0)intnumchip
44、s;/開(kāi)發(fā)板上NAND flash芯片的片數(shù)unsigned longchipsize;/ 芯片的容量intpagemask;/頁(yè)地址掩碼intpagebuf;/ 存儲(chǔ)Data_buf內(nèi)的相關(guān)的頁(yè)號(hào)struct nand_oobinfo*autooob;/ oob區(qū)布局設(shè)計(jì)結(jié)構(gòu)體指針。從功能上看,oob區(qū)和數(shù)據(jù)存儲(chǔ)區(qū)一樣可以存儲(chǔ)數(shù)據(jù),但是oob區(qū)一般不會(huì)用于存儲(chǔ)數(shù)據(jù),而是做為壞塊標(biāo)記和ECC校驗(yàn)數(shù)據(jù)存儲(chǔ)。其中壞塊標(biāo)記位置一般有約定俗成的位置,而oob區(qū)的布局設(shè)計(jì)有很多不同的設(shè)計(jì),MTD使用一個(gè)結(jié)構(gòu)體來(lái)描述這種設(shè)計(jì),oob區(qū)布局設(shè)計(jì)結(jié)構(gòu)體在include/linux/mtd/mtd_abi.h中
45、定義如下:struct nand_oobinfo uint32_t useecc;uint32_t eccbytes;uint32_t oobfree82;uint32_t eccpos32;其中useecc 為使用ECC校驗(yàn)標(biāo)志,eccbyte為ECC校驗(yàn)的位數(shù),eccpos為ECC校驗(yàn)所存的位號(hào),oobfree為OOB中ECC未使用到的字節(jié)(起始地址長(zhǎng)度)uint8_t*bbt;/ 指向內(nèi)存中壞塊表的指針struct nand_bbt_descr*bbt_td;/ 用以Flash中壞塊表搜索的相關(guān)描述struct nand_bbt_descr*bbt_md;/ 上述描述的鏡像struct
46、nand_hw_control*controller;/ 用以實(shí)現(xiàn)互鎖操作,此處并未使用void*priv;/用途不明;2)struct nand_chip的變量定義struct nand_chip數(shù)據(jù)結(jié)構(gòu)的變量在drivers/nand/nand.c中定義為: static struct nand_chip nand_chipCFG_MAX_NAND_DEVICE;該變量nand_chipi的指針將作為函數(shù)static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand, ulong base_addr) 被nan
47、d_init()調(diào)用時(shí)的第二個(gè)實(shí)參被引用如下:nand_init_chip(&nand_infoi, &nand_chipi, base_addressi);在函數(shù)nand_init_chip()中&nand_chipi將被復(fù)制給mtd數(shù)據(jù)結(jié)構(gòu)中的成員priv,如下 mtd->priv = nand;所以,mtd->priv實(shí)際上就是數(shù)據(jù)結(jié)構(gòu)struct nand_chip變量指針。3)struct nand_chip的操作(初始化)對(duì)struct nand_chip的初始化操作都在函數(shù)nand_scan()中完成。該函數(shù)是初始化MTD設(shè)備的核心函數(shù)。我們將
48、在后面詳細(xì)分析它。值得注意的是:在nand_scan()中struct nand_chip的函數(shù)指針會(huì)被初始化為相應(yīng)的在driver/nand/nand_base.c定義的通用函數(shù),雖說(shuō)MTD驅(qū)動(dòng)對(duì)絕大多數(shù)的NAND flash芯片支持都很好但是少部分通用函數(shù)可能還是會(huì)需要修改,而且涉及到底層硬件操作的函數(shù)MTD不可能提供通用的函數(shù),所以要在移植MTD驅(qū)動(dòng)時(shí)自行編寫(xiě),這也是移植的一個(gè)重要內(nèi)容。這些函數(shù)包括:hwcontrol、dev_ready、select_chip等。3、 數(shù)據(jù)結(jié)構(gòu)struct nand_flash_dev分析這個(gè)數(shù)據(jù)結(jié)構(gòu)主要描述的是具體的NAND flash芯片型號(hào)。這個(gè)
49、數(shù)據(jù)結(jié)構(gòu)比較簡(jiǎn)單,它在include/linux/mtd/nand.h中被聲明定義為一個(gè)結(jié)構(gòu)體: struct nand_flash_dev char *name; /NAND flash的名稱int id; /NAND flashd 的設(shè)備IDunsigned long pagesize;/頁(yè)面大小,單位為KBunsigned long chipsize;/芯片容量,單位為MBunsigned long erasesize;/擦除單位大小unsigned long options;/ NAND flashd的擴(kuò)展功能配置及位寬配置;結(jié)構(gòu)體struct nand_flash_dev在drive
50、rs/mtd/nand_ids.c中這個(gè)數(shù)據(jù)結(jié)構(gòu)被定義為一個(gè)結(jié)構(gòu)體數(shù)組并被初始化。其中包含的每一個(gè)數(shù)組元素即為MTD驅(qū)動(dòng)支持的NAND flashd芯片型號(hào)。初始化如下:struct nand_flash_dev nand_flash_ids = ."NAND 128MiB 1,8V 16-bit", 0x72, 512, 128, 0x4000, NAND_BUSWIDTH_16,"NAND 128MiB 3,3V 16-bit", 0x74, 512, 128, 0x4000, NAND_BUSWIDTH_16,/* 1 Gigabit */&quo
51、t;NAND 128MiB 1,8V 8-bit", 0xA1, 0, 128, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR,"NAND 128MiB 3,3V 8-bit", 0xF1, 0, 128, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR,/* 2 Gigabit */"NAND 256MiB 1,8V 8-bit", 0xAA, 0, 256, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR,&
52、quot;NAND 256MiB 3,3V 8-bit", 0xDA, 0, 256, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR,/* 4 Gigabit */"NAND 512MiB 1,8V 8-bit", 0xAC, 0, 512, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR,/* 8 Gigabit */"NAND 1GiB 1,8V 8-bit", 0xA3, 0, 1024, 0, NAND_SAMSUNG_LP_OPTIONS | N
53、AND_NO_AUTOINCR,/* 16 Gigabit */"NAND 2GiB 1,8V 8-bit", 0xA5, 0, 2048, 0, NAND_SAMSUNG_LP_OPTIONS | NAND_NO_AUTOINCR,NULL,;這里列出來(lái)的只有很少的一部分?jǐn)?shù)組元素,其中加粗的元素就是HY27UF082G2B對(duì)應(yīng)的nand_flash_dev結(jié)構(gòu)體??芍狧Y27UF082G2B的設(shè)備ID為DA,芯片容量為256MB,頁(yè)面大小和擦除單元大小為0表示這些數(shù)據(jù)需要從芯片中讀取。要強(qiáng)調(diào)的是:移植MTD驅(qū)動(dòng)時(shí)一定要確定要移植的NAND flash芯片在這里有對(duì)應(yīng)的na
54、nd_flash_dev結(jié)構(gòu)體,沒(méi)有的話要自行添加。在nand_scan()中,會(huì)先讀出芯片的設(shè)備ID再到該結(jié)構(gòu)體數(shù)組中逐個(gè)對(duì)比,如果沒(méi)有找到匹配項(xiàng)則會(huì)導(dǎo)致在nand_scan()初始化失敗返回。4)u-boot中MTD對(duì)NAND flash的初始化流程及源碼分析 對(duì)NAND flash初始化的核心內(nèi)容就是對(duì)以上分析的三個(gè)數(shù)據(jù)結(jié)構(gòu)(結(jié)構(gòu)體)進(jìn)行初始化。注意這三個(gè)數(shù)據(jù)結(jié)構(gòu)均為結(jié)構(gòu)體,且在變量定義的時(shí)候都被定義為結(jié)構(gòu)體數(shù)組。每一個(gè)NAND flash芯片分別對(duì)應(yīng)三個(gè)結(jié)構(gòu)體數(shù)組中的一個(gè)數(shù)組元素。對(duì)一個(gè)NAND flash的初始化就是對(duì)三個(gè)結(jié)構(gòu)體數(shù)組元素初始化。在這三個(gè)數(shù)組元素(就是結(jié)構(gòu)體)中包含了1
55、、 MTD驅(qū)動(dòng)的接口函數(shù)、底層操作函數(shù)、壞塊管理函數(shù)、ECC校驗(yàn)函數(shù)的函數(shù)指針,這些函數(shù)大部分為在nand_base.c中實(shí)現(xiàn)的通用函數(shù),少部分涉及底層硬件操作的函數(shù)由用戶編寫(xiě);2、 支持這些函數(shù)的必要數(shù)據(jù)結(jié)構(gòu),如壞塊表、讀寫(xiě)緩沖區(qū)等3、 一些重要的參數(shù),這些參數(shù)由flash_dev nand_flash_ids提供或者有ReadID操作直接提供或基于這些參數(shù)運(yùn)算獲得。4.1)流程分析 對(duì)NAND flash的這些參數(shù)和函數(shù)指針的初始化由函數(shù)nand_init()完成,該函數(shù)在lib_arm/board.c中的函數(shù)start_armboot()中被調(diào)用,調(diào)用代碼如下:#if (CONFIG_C
56、OMMANDS & CFG_CMD_NAND)puts ("NAND: ");nand_init();/* go init the NAND */#endif由上可知:必須第一好宏開(kāi)關(guān):CONFIG_COMMANDS & CFG_CMD_NAND(也就是NAND命令的宏定義)nand_init()才會(huì)被執(zhí)行。所以移植時(shí)一定要注意。NAND flash的初始化函數(shù)nand_init()在drivers/nand/nand.c中被定義,代碼如下:void nand_init(void)int i;unsigned int size = 0;for (i = 0; i < CFG_MAX_NAND_DEVICE; i+) nand_init_chip(&nand_infoi, &n
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生態(tài)旅游度假區(qū)招投標(biāo)申請(qǐng)表
- 社會(huì)保險(xiǎn)管理與城市規(guī)劃
- 石油化工設(shè)備使用與管理
- 水上樂(lè)園水電布線施工合同
- 農(nóng)村燃?xì)鈧€(gè)人承包施工合同
- 2024年跨國(guó)醫(yī)療設(shè)備采購(gòu)與技術(shù)支持合同
- 2024年河南漯河事業(yè)單位選拔100位人才3篇
- 2024年鏟車(chē)安全巡查記錄表3篇
- 2025年度跨境電商擔(dān)保抵押合同范本2篇
- 2025版物流園區(qū)土地及建筑物租賃承包協(xié)議3篇
- 采購(gòu)合同范例壁布
- 公司員工出差車(chē)輛免責(zé)協(xié)議書(shū)
- 2024年陜西榆林市神木市公共服務(wù)輔助人員招聘775人歷年管理單位遴選500模擬題附帶答案詳解
- 2024年度抖音短視頻拍攝制作服務(wù)合同范本3篇
- 2024-2025學(xué)年高二上學(xué)期期末數(shù)學(xué)試卷(提高篇)(含答案)
- 安全生產(chǎn)事故案例分析
- 2024年07月22208政治學(xué)原理期末試題答案
- 期末檢測(cè)卷(一)(試卷)-2024-2025學(xué)年外研版(三起)英語(yǔ)六年級(jí)上冊(cè)(含答案含聽(tīng)力原文無(wú)音頻)
- 《客戶開(kāi)發(fā)技巧》課件
- 《防范于心反詐于行》中小學(xué)防范電信網(wǎng)絡(luò)詐騙知識(shí)宣傳課件
- 口腔執(zhí)業(yè)醫(yī)師定期考核試題(資料)帶答案
評(píng)論
0/150
提交評(píng)論