版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、3月31日前言:為了深入了解MTD如何處理Nand問(wèn)題,決定跟一下MTD Nand層代碼。mtd.h重要結(jié)構(gòu)體:struct erase_info如果擦除失敗,fail_addr將指示壞塊地址。struct mtd_infomtd層函數(shù)指針存放處。nand.hNand基本指令:#define NAND_CMD_READ00#define NAND_CMD_READ11#define NAND_CMD_PAGEPROG0x10#define NAND_CMD_READOOB0x50#define NAND_CMD_ERASE10x60#define NAND_CMD_STATUS0x70#def
2、ine NAND_CMD_STATUS_MULTI0x71#define NAND_CMD_SEQIN0x80#define NAND_CMD_READID0x90#define NAND_CMD_ERASE20xd0#define NAND_CMD_RESET0xff和K9F1208指令對(duì)比重要結(jié)構(gòu)體:struct nand_chip具體操作Nand的函數(shù)指針都在這個(gè)結(jié)構(gòu)體里面。 struct nand_bbt_descrNand壞塊表?具體如何使用還不清楚。4月1日nand_base.cint nand_scan (struct mtd_info *mtd, int maxchips)st
3、ruct nand_chip *this = mtd-priv;priv是mtd_info結(jié)構(gòu)體里面的一個(gè)空指針,現(xiàn)在指向this。if (this-cmdfunc = NULL)this-cmdfunc = nand_command;判斷驅(qū)動(dòng)編寫(xiě)者是否提供了command函數(shù),后來(lái)幾個(gè)類似。this-cmdfunc (mtd, NAND_CMD_READID, 0X00, -1);讀取Nand芯片信息,包括廠商信息的芯片ID,對(duì)于K9F1208是0xEC和0x76。對(duì)應(yīng)nand_ids.c中的NAND 64MiB 3,3V 8-bit, 0x76, 512, 64, 0x4000, 0。含義
4、:三星的這顆Nand芯片是64MB的,3.3V供電,8bit位寬,ID為0x76,每一頁(yè)大小為512Byte,64MB容量,擦除塊尺寸為0x4000,操作0。對(duì)擦除塊為0x4000的解釋:這顆Nand芯片的容量是這樣劃分的,512Byte x 32 x 4096 = 64MB,一共有4096個(gè)塊(block),因此每一個(gè)塊的大小為512Byte x 32 = 16384Byte = 0x4000Byte。這些信息接下來(lái)都會(huì)被MTD層獲得,如果全部沒(méi)有問(wèn)題,則在啟動(dòng)時(shí)會(huì)打?。簆rintk (KERN_INFO NAND device: Manufacturer ID: 0x%02x, Chip
5、ID: 0x%02x (%s %s)n, nand_maf_id, nand_dev_id,nand_manuf_idsmaf_ , mtd-name);/* Calculate the address shift from the page size */this-page_shift = ffs(mtd-oobblock) - 1;this-bbt_erase_shift = this-phys_erase_shift = ffs(mtd-erasesize) - 1;this-chip_shift = ffs(this-chipsize) - 1;這一段不太明白,翻譯過(guò)來(lái)是
6、根據(jù)頁(yè)面大小計(jì)算地址變化?我在啟動(dòng)時(shí)將其打印了出來(lái):mtd-oobblock is 0x200mtd-oobsize is 0x10mtd-erasesize is 0x4000this-page_shift is 0x9this-bbt_erase_shift is 0xethis-chip_shift is 0x1affs函數(shù)第一次見(jiàn)到,看看是什么東西:#define ffs(x) generic_ffs(x)繼續(xù),蠻有意思的函數(shù):static inline int generic_ffs(int x)int r = 1;if (!x)return 0;if (!(x & 0xffff)
7、x = 16;r += 16;if (!(x & 0xff) x = 8;r += 8;if (!(x & 0xf) x = 4;r += 4;if (!(x & 3) x = 2;r += 2;if (!(x & 1) x = 1;r += 1;return r;這函數(shù)人如其名,找到第一個(gè)bit位(find first bit set),比如0x80,將返回7。/* Set the bad block position */this-badblockpos = mtd-oobblock 512 ?NAND_LARGE_BADBLOCK_POS : NAND_SMALL_BADBLOCK_PO
8、S;確定壞塊標(biāo)記的位置,如果大于512,在oob區(qū)的位置0,否則是在oob區(qū)的位置5。/* Do not replace user supplied command function ! */if (mtd-oobblock 512 & this-cmdfunc = nand_command)this-cmdfunc = nand_command_lp;這一段沒(méi)有什么意義,因?yàn)槲覀兊牡讓域?qū)動(dòng)里面提供了命令函數(shù)。if (!nand_flash_) printk (KERN_WARNING No NAND device found!n);this-select_chip(mtd,
9、 -1);return 1;如果沒(méi)有發(fā)現(xiàn)芯片,會(huì)提示找不到芯片,我剛開(kāi)始做u-boot驅(qū)動(dòng)時(shí),讀不到正確的芯片ID,就報(bào)這個(gè)錯(cuò)誤,并且直接返回1,下面的程序不再執(zhí)行。for (i=1; i select_chip(mtd, i);/* Send the command for reading device ID */this-cmdfunc (mtd, NAND_CMD_READID, 0x00, -1);/* Read manufacturer and device IDs */if (nand_maf_id != this-read_byte(mtd) | nand_dev_id != t
10、his-read_byte(mtd)break;如果有多塊芯片,這里會(huì)去讀它們的ID信息。/* Allocate buffers, if neccecary */if (!this-oob_buf) size_t len;len = mtd-oobsize phys_erase_shift - this-page_shift);this-oob_buf = kmalloc (len, GFP_KERNEL);if (!this-oob_buf) printk (KERN_ERR nand_scan(): Cannot allocate oob_bufn);return -ENOMEM;this
11、-options |= NAND_OOBBUF_ALLOC;if (!this-data_buf) size_t len;len = mtd-oobblock + mtd-oobsize;this-data_buf = kmalloc (len, GFP_KERNEL);if (!this-data_buf) if (this-options & NAND_OOBBUF_ALLOC)kfree (this-oob_buf);printk (KERN_ERR nand_scan(): Cannot allocate data_bufn);return -ENOMEM;this-options |
12、= NAND_DATABUF_ALLOC;如果前面沒(méi)有分配,在這兒分配數(shù)據(jù)區(qū)和oob區(qū)的空間。說(shuō)說(shuō)這個(gè)size_t,是為了方便移植而的設(shè)定的,其實(shí)就是unsigned int。oob區(qū)的大小是mtd-oobsize phys_erase_shift - this-page_shift),數(shù)據(jù)區(qū)的大小是mtd-oobblock + mtd-oobsize。這兒在計(jì)算oob區(qū)該分配多大時(shí)用到了前面定義的this-page_shift和this-phys_erase_shift。具體計(jì)算方法?這時(shí)候用得上前面print出來(lái)的內(nèi)容:mtd-oobblock is 0x200mtd-oobsize is
13、 0x10mtd-erasesize is 0x4000this-page_shift is 0x9this-bbt_erase_shift is 0xethis-chip_shift is 0x1alen = mtd-oobsize phys_erase_shift - this-page_shift);這句話應(yīng)該是計(jì)算oob_buf的長(zhǎng)度,計(jì)算結(jié)果應(yīng)該是(16 numchips = i;mtd-size = i * this-chipsize;/* Convert chipsize to number of pages per chip -1. */this-pagemask = (thi
14、s-chipsize this-page_shift) - 1;/* Preset the internal oob buffer */memset(this-oob_buf, 0xff, mtd-oobsize phys_erase_shift - this-page_shift);存儲(chǔ)芯片的數(shù)目并計(jì)算mtd的總大小。將芯片大小換算成頁(yè)數(shù),這時(shí)我才看懂this-page_shift的意思,就是9bit,因?yàn)楸阌谝莆徊僮?,所以才用ffs函數(shù)將512變換為9的。最后將oob_buf全部填充了0xff。/* If no default placement scheme is given, sele
15、ct an * appropriate one */if (!this-autooob) /* Select the appropriate default oob placement scheme for * placement agnostic filesystems */switch (mtd-oobsize) case 8:this-autooob = &nand_oob_8;break;case 16:this-autooob = &nand_oob_16;break;case 64:this-autooob = &nand_oob_64;break;default:printk (
16、KERN_WARNING No oob scheme defined for oobsize %dn,mtd-oobsize);BUG();根據(jù)oobsize填充autooob,我們的oobsize是16,填充的是nand_oob_16這個(gè)結(jié)構(gòu)體的內(nèi)容:static struct nand_oobinfo nand_oob_16 = .useecc = MTD_NANDECC_AUTOPLACE,.eccbytes = 6,.eccpos = 0, 1, 2, 3, 6, 7,.oobfree = 8, 8 ;結(jié)構(gòu)體中規(guī)定了ecc校驗(yàn)位的位置。/* The number of bytes av
17、ailable for the filesystem to place fs dependend * oob data */mtd-oobavail = 0;for (i = 0; this-autooob-oobfreei1; i+)mtd-oobavail += this-autooob-oobfreei1;文件系統(tǒng)的oob數(shù)據(jù)放在oob的free區(qū)里面。/* * check ECC mode, default to software * if 3byte/512byte hardware ECC is selected and we have 256 byte pagesize * fa
18、llback to software ECC*/this-eccsize = 256;/* set default eccsize */this-eccbytes = 3;switch (this-eccmode) case NAND_ECC_HW12_2048:if (mtd-oobblock oobblock);this-eccmode = NAND_ECC_SOFT;this-calculate_ecc = nand_calculate_ecc;this-correct_data = nand_correct_data; elsethis-eccsize = 2048;break;cas
19、e NAND_ECC_HW3_512:case NAND_ECC_HW6_512:case NAND_ECC_HW8_512:if (mtd-oobblock = 256) printk (KERN_WARNING 512 byte HW ECC not possible on 256 Byte pagesize, fallback to SW ECC n);this-eccmode = NAND_ECC_SOFT;this-calculate_ecc = nand_calculate_ecc;this-correct_data = nand_correct_data; elsethis-ec
20、csize = 512; /* set eccsize to 512 */break;case NAND_ECC_HW3_256:break;case NAND_ECC_NONE:printk (KERN_WARNING NAND_ECC_NONE selected by board driver. This is not recommended !n);this-eccmode = NAND_ECC_NONE;break;case NAND_ECC_SOFT:this-calculate_ecc = nand_calculate_ecc;this-correct_data = nand_co
21、rrect_data;break;default:printk (KERN_WARNING Invalid NAND_ECC_MODE %dn, this-eccmode);BUG();默認(rèn)的eccsize為256,eccbytes為3。開(kāi)始判斷驅(qū)動(dòng)中提供的eccmode,我們以前用的是NAND_ECC_SOFT,現(xiàn)在為了使用yaffs,改用NAND_ECC_NONE,其他硬件的都不用看。如果是NONE的話,直接printk一個(gè)warning,如果是SOFT的,需要填充:this-calculate_ecc = nand_calculate_ecc;this-correct_data = na
22、nd_correct_data;這是兩個(gè)函數(shù)哦,不是變量,mark下后面要跟。/* Check hardware ecc function availability and adjust number of ecc bytes per * calculation step*/switch (this-eccmode) case NAND_ECC_HW12_2048:this-eccbytes += 4;case NAND_ECC_HW8_512:this-eccbytes += 2;case NAND_ECC_HW6_512:this-eccbytes += 3;case NAND_ECC_H
23、W3_512:case NAND_ECC_HW3_256:if (this-calculate_ecc & this-correct_data & this-enable_hwecc)break;printk (KERN_WARNING No ECC functions supplied, Hardware ECC not possiblen);BUG();mtd-eccsize = this-eccsize;沒(méi)用到硬件ecc,這兒應(yīng)該直接跳過(guò)了。/* Set the number of read / write steps for one page to ensure ECC generat
24、ion */switch (this-eccmode) case NAND_ECC_HW12_2048:this-eccsteps = mtd-oobblock / 2048;break;case NAND_ECC_HW3_512:case NAND_ECC_HW6_512:case NAND_ECC_HW8_512:this-eccsteps = mtd-oobblock / 512;break;case NAND_ECC_HW3_256:case NAND_ECC_SOFT:this-eccsteps = mtd-oobblock / 256;break;case NAND_ECC_NON
25、E:this-eccsteps = 1;break;設(shè)置每一頁(yè)的ecc校驗(yàn)的steps。NAND_ECC_NONE是1,NAND_ECC_SOFT是2。/* Initialize state, waitqueue and spinlock */this-state = FL_READY;init_waitqueue_head (&this-wq);spin_lock_init (&this-chip_lock);初始化狀態(tài)機(jī)、等待列隊(duì)和自旋鎖。/* Fill in remaining MTD driver data */mtd-type = MTD_NANDFLASH;mtd-flags =
26、MTD_CAP_NANDFLASH | MTD_ECC;mtd-ecctype = MTD_ECC_SW;mtd-erase = nand_erase;mtd-point = NULL;mtd-unpoint = NULL;mtd-read = nand_read;mtd-write = nand_write;mtd-read_ecc = nand_read_ecc;mtd-write_ecc = nand_write_ecc;mtd-read_oob = nand_read_oob;mtd-write_oob = nand_write_oob;mtd-readv = NULL;mtd-wri
27、tev = nand_writev;mtd-writev_ecc = nand_writev_ecc;mtd-sync = nand_sync;mtd-lock = NULL;mtd-unlock = NULL;mtd-suspend = nand_suspend;mtd-resume = nand_resume;mtd-block_isbad = nand_block_isbad;mtd-block_markbad = nand_block_markbad;填充MTD結(jié)構(gòu)體的其他成員及函數(shù),我看完nand scan如果沒(méi)有突破點(diǎn),就應(yīng)該一個(gè)一個(gè)看這里面的內(nèi)容。/* Check, if we
28、should skip the bad block table scan */if (this-options & NAND_SKIP_BBTSCAN)return 0;這兒比較重要,我正想u-boot在開(kāi)機(jī)能不能跳過(guò)scan壞塊呢,只要定義了NAND_SKIP_BBTSCAN就可以跳過(guò)壞塊了。但是這個(gè)Linux下的nand_base.c,剛又看了下u-boot里面的nand_base.c,發(fā)現(xiàn)沒(méi)有這個(gè)判斷,奇怪。/* Build bad block table */return this-scan_bbt (mtd);雖然返回,但沒(méi)有結(jié)束,跳去執(zhí)行scan_bbt這個(gè)函數(shù)了,下一步目標(biāo):sc
29、an_bbt!終于終于把一個(gè)小小的nand_sacn函數(shù)看完了4月21日慚愧,沒(méi)想到隔了這么長(zhǎng)時(shí)間才繼續(xù)學(xué)習(xí)。前面看到在nand_scan()函數(shù)的最后將會(huì)跳至scan_bbt()函數(shù),這個(gè)函數(shù)在nand_scan里面有定義:2415if (!this-scan_bbt)2416this-scan_bbt = nand_default_bbt;nand_default_bbt()位于Nand_bbt.c文件中。1047/* * nand_default_bbt - NAND Interface Select a default bad block table for the device *
30、mtd:MTD device structure * * This function selects the default bad block table * support for the device and calls the nand_scan_bbt function*/int nand_default_bbt (struct mtd_info *mtd)struct nand_chip *this = mtd-priv;這個(gè)函數(shù)的作用是建立默認(rèn)的壞塊表。1059/* Default for AG-AND. We must use a flash based* bad block
31、table as the devices have factory marked* _good_ blocks. Erasing those blocks leads to loss* of the good / bad information, so we _must_ store * this information in a good / bad table during * startup*/if (this-options & NAND_IS_AND) /* Use the default pattern descriptors */if (!this-bbt_td) this-bb
32、t_td = &bbt_main_descr;this-bbt_md = &bbt_mirror_descr;this-options |= NAND_USE_FLASH_BBT;return nand_scan_bbt (mtd, &agand_flashbased);如果Flash的類型是AG-AND(這種Flash類型比較特殊,既不是MLC又不是SLC,因此不去深究了,而且好像瑞薩要把它淘汰掉),需要使用默認(rèn)的模式描述符,最后再進(jìn)入nand_scan_bbt()函數(shù)。1078/* Is a flash based bad block table requested ? */if (thi
33、s-options & NAND_USE_FLASH_BBT) /* Use the default pattern descriptors */if (!this-bbt_td) this-bbt_td = &bbt_main_descr;this-bbt_md = &bbt_mirror_descr;if (!this-badblock_pattern) this-badblock_pattern = (mtd-oobblock 512) ?&largepage_flashbased : &smallpage_flashbased; else this-bbt_td = NULL;this
34、-bbt_md = NULL;if (!this-badblock_pattern) this-badblock_pattern = (mtd-oobblock 512) ?&largepage_memorybased : &smallpage_memorybased;return nand_scan_bbt (mtd, this-badblock_pattern);如果Flash芯片需要使用壞塊表,對(duì)于1208芯片來(lái)說(shuō)是使用smallpage_memorybased。985static struct nand_bbt_descr smallpage_memorybased = .option
35、s = NAND_BBT_SCAN2NDPAGE,.offs = 5,.len = 1,.pattern = scan_ff_pattern;暫時(shí)沒(méi)看到如何使用這些賦值,先放著。后面檢測(cè)壞塊時(shí)用得著。1099return nand_scan_bbt (mtd, this-badblock_pattern);最后將badblock_pattern作為參數(shù),調(diào)用nand_can_bbt函數(shù)。844/* nand_scan_bbt - NAND Interface scan, find, read and maybe create bad block table(s) * mtd:MTD devic
36、e structure * bd:descriptor for the good/bad block search pattern * * The function checks, if a bad block table(s) is/are already * available. If not it scans the device for manufacturer * marked good / bad blocks and writes the bad block table(s) to * the selected place. * * The bad block table mem
37、ory is allocated here. It must be freed * by calling the nand_free_bbt function. */int nand_scan_bbt (struct mtd_info *mtd, struct nand_bbt_descr *bd)檢測(cè)、尋找、讀取甚至建立壞塊表。函數(shù)檢測(cè)是否已經(jīng)存在一張壞塊表,否則建立一張。壞塊表的內(nèi)存分配也在這個(gè)函數(shù)中。860struct nand_chip *this = mtd-priv;int len, res = 0;uint8_t *buf;struct nand_bbt_descr *td =
38、this-bbt_td;struct nand_bbt_descr *md = this-bbt_md;len = mtd-size (this-bbt_erase_shift + 2);/* Allocate memory (2bit per block) */this-bbt = kmalloc (len, GFP_KERNEL);if (!this-bbt) printk (KERN_ERR nand_scan_bbt: Out of memoryn);return -ENOMEM;/* Clear the memory bad block table */memset (this-bb
39、t, 0x00, len);一些賦值、變量聲明、內(nèi)存分配,每個(gè)block分配2bit的空間。1208有4096個(gè)block,應(yīng)該分配4096*2bit的空間。877/* If no primary table decriptor is given, scan the device * to build a memory based bad block table */if (!td) if (res = nand_memory_bbt(mtd, bd) printk (KERN_ERR nand_bbt: Cant scan flash and build the RAM-based BBTn
40、);kfree (this-bbt);this-bbt = NULL;return res;如果沒(méi)有提供ptd,就掃描設(shè)備并建立一張。這里調(diào)用了nand_memory_bbt()這個(gè)內(nèi)聯(lián)函數(shù)。653/* * nand_memory_bbt - GENERIC create a memory based bad block table * mtd:MTD device structure * bd:descriptor for the good/bad block search pattern * * The function creates a memory based bbt by scan
41、ning the device * for manufacturer / software marked good / bad blocks*/static inline int nand_memory_bbt (struct mtd_info *mtd, struct nand_bbt_descr *bd)struct nand_chip *this = mtd-priv;bd-options &= NAND_BBT_SCANEMPTY;return create_bbt (mtd, this-data_buf, bd, -1);函數(shù)的作用是建立一張基于memory的壞塊表。將操作符的NAN
42、D_BBT_SCANEMPTY清除,并繼續(xù)調(diào)用creat_bbt()函數(shù)。271/* create_bbt - GENERIC Create a bad block table by scanning the device * mtd:MTD device structure * buf:temporary buffer * bd:descriptor for the good/bad block search pattern * chip:create the table for a specific chip, -1 read all chips. *Applies only if NAN
43、D_BBT_PERCHIP option is set * * Create a bad block table by scanning the device * for the given good/bad block identify pattern */static int create_bbt (struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd, int chip)真正的建立壞塊表函數(shù)。chip參數(shù)是-1表示讀取所有的芯片。284 struct nand_chip *this = mtd-priv;int i,
44、j, numblocks, len, scanlen;int startblock;loff_t from;size_t readlen, ooblen;printk (KERN_INFO Scanning device for bad blocksn);一些變量聲明,開(kāi)機(jī)時(shí)那句話就是在這兒打印出來(lái)的。292 if (bd-options & NAND_BBT_SCANALLPAGES)len = 1 bbt_erase_shift - this-page_shift);else if (bd-options & NAND_BBT_SCAN2NDPAGE)len = 2;elselen = 1
45、;在前面我們定義了smallpage_memorybased這個(gè)結(jié)構(gòu)體,現(xiàn)在里面NAND_BBT_SCANALLPAGES的終于用上了,對(duì)于1208芯片來(lái)說(shuō),len=2。304 if (!(bd-options & NAND_BBT_SCANEMPTY) /* We need only read few bytes from the OOB area */scanlen = ooblen = 0;readlen = bd-len; else /* Full page content should be read */scanlen= mtd-oobblock + mtd-oobsize;rea
46、dlen = len * mtd-oobblock;ooblen = len * mtd-oobsize;前面已經(jīng)將NAND_BBT_SCANEMPTY清除了,這里肯定執(zhí)行else的內(nèi)容。需要將一頁(yè)內(nèi)容都讀取出來(lái)。316if (chip = -1) /* Note that numblocks is 2 * (real numblocks) here, see i+=2 below as it * makes shifting and masking less painful */numblocks = mtd-size (this-bbt_erase_shift - 1);startbloc
47、k = 0;from = 0; else if (chip = this-numchips) printk (KERN_WARNING create_bbt(): chipnr (%d) available chips (%d)n,chip + 1, this-numchips);return -EINVAL;numblocks = this-chipsize (this-bbt_erase_shift - 1);startblock = chip * numblocks;numblocks += startblock;from = startblock bbt_erase_shift - 1
48、);前面提到chip為-1,實(shí)際上我們只有一顆芯片,numblocks這兒是4096*2。335 for (i = startblock; i options & NAND_BBT_SCANEMPTY)if (ret = nand_read_raw (mtd, buf, from, readlen, ooblen)return ret;for (j = 0; j options & NAND_BBT_SCANEMPTY) size_t retlen;/* Read the full oob until read_oob is fixed to * handle single byte read
49、s for 16 bit buswidth */ret = mtd-read_oob(mtd, from + j * mtd-oobblock,mtd-oobsize, &retlen, buf);if (ret)return ret;if (check_short_pattern (buf, bd) this-bbti 3 |= 0x03 1, (unsigned int) from);break; else if (check_pattern (&bufj * scanlen, scanlen, mtd-oobblock, bd) this-bbti 3 |= 0x03 1, (unsigned int) from);break;i += 2;from += (1 bbt_erase_shift);return 0;檢測(cè)這4096個(gè)block,剛開(kāi)始的nand_read_raw肯定不會(huì)執(zhí)行。len是2,在j循環(huán)要循環(huán)2次。每次循環(huán)真正要做的事情是下面的內(nèi)容:ret = mtd-read_oob(mtd, from + j * mtd-oobblock,mtd-oobsize, &retlen, buf);read_oob()函數(shù)在nand_s
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《建設(shè)工程施工合同糾紛事實(shí)查明的思路與方法》理解與適用
- 2025年銑刨料運(yùn)輸、破碎及再生利用綜合服務(wù)合同3篇
- 2024年心理咨詢師之心理咨詢師基礎(chǔ)知識(shí)題庫(kù)(歷年真題)
- 二零二五版國(guó)際博覽會(huì)現(xiàn)場(chǎng)搭建及設(shè)備租賃合同3篇
- 2024詳盡多條款單項(xiàng)勞務(wù)分包合同范本
- 2025年度裝配式建筑構(gòu)件研發(fā)承包合同4篇
- 2025年度陶瓷藝術(shù)品瓷石采購(gòu)與銷(xiāo)售合同2篇
- 2025年度樁基施工竣工驗(yàn)收合同范本4篇
- 《基金基礎(chǔ)知識(shí)》課件
- 2025年度個(gè)人租賃房屋租賃合同租賃用途變更服務(wù)協(xié)議4篇
- 2024版塑料購(gòu)銷(xiāo)合同范本買(mǎi)賣(mài)
- 【高一上】【期末話收獲 家校話未來(lái)】期末家長(zhǎng)會(huì)
- JJF 2184-2025電子計(jì)價(jià)秤型式評(píng)價(jià)大綱(試行)
- GB/T 44890-2024行政許可工作規(guī)范
- 有毒有害氣體崗位操作規(guī)程(3篇)
- 兒童常見(jiàn)呼吸系統(tǒng)疾病免疫調(diào)節(jié)劑合理使用專家共識(shí)2024(全文)
- 2025屆山東省德州市物理高三第一學(xué)期期末調(diào)研模擬試題含解析
- 《華潤(rùn)集團(tuán)全面預(yù)算管理案例研究》
- 2024-2025高考英語(yǔ)全國(guó)卷分類匯編之完型填空(含答案及解析)
- 二年級(jí)下冊(cè)加減混合豎式練習(xí)360題附答案
- 蘇教版五年級(jí)數(shù)學(xué)下冊(cè)解方程五種類型50題
評(píng)論
0/150
提交評(píng)論