版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、tiny210-U-Boot 實(shí)現(xiàn) NAND 的擦除tiny210-U-Boot 實(shí)現(xiàn) NAND 的擦除(型號(hào): K9GAG08U0F ) 管理提醒: 本帖被 xoom 執(zhí)行加亮操 作(2013-03-12) (我是菜鳥,貢獻(xiàn)點(diǎn)微薄之力)1、NAND 的初始化: #ifdefined(CONFIG_CMD_NAND)puts("NAND: ");nand_init(); /* go init the NAND */#endif 調(diào)用函數(shù): nand_init_chip(&nand_info, &nand_chip, base_address)
2、; 參數(shù) base_address=OxBOEOOOOOO。函數(shù)功能:設(shè)置 nand_chip 結(jié)構(gòu) 體: nand->IO_ADDR_R = 0xB0E000000 ;還有調(diào)用 board_nand_init 函數(shù),這個(gè)函數(shù)和芯片操作息息相關(guān),也是 設(shè)置 nand_chip 結(jié)構(gòu)體,設(shè)置初始化好了 NAND ?,F(xiàn)在看看 核心代碼: 先獲取 NAND 的 ID 號(hào)的 1st Cycle 和 2nd Cycle, 然后通過 nand_flash_ids 數(shù)組來匹配,找出我們芯片對(duì)應(yīng)的 成員: for (i = 0; nand_flash_ != NULL; i+)
3、if (tmp = nand_flash_ids.id) type = &nand_flash_ids;break; 找 出我們芯片對(duì)應(yīng)的成員: "NAND 2GiB 3,3V 8-bit", 0xD5, 0, 2048, 0, LP_OPTIONS, nand_flash_ids 結(jié)構(gòu)體原型: struct nand_flash_dev char *name;int id;unsigned long pagesize;unsigned long chipsize;unsigned longerasesize;unsigned long options; 再
4、獲取 NAND 的 ID 號(hào)的 3st Cycle 和 4nd Cycle ,這次的數(shù)據(jù)主要是體現(xiàn)該芯片的內(nèi) 部信息,如頁大小,有多少塊等,然后用這些值來設(shè)置 nand->ecc 結(jié)構(gòu)體: 這里說明一下芯片內(nèi)部一個(gè)信息: Cell Type : SLC / MLC bit2&bit3 表示的是芯片的類型, 是 SLC 還是某種 MLC : Bit2,bit3=0x00 : SLC ,簡單說就是內(nèi)部單個(gè)存儲(chǔ)單元,存 儲(chǔ)一位的數(shù)據(jù),所能表示的數(shù)值只有 0,1,也就需要兩種不 同的電壓來表示,所以叫做 2 Level 的 Cell 。 Bit2,bit3=0x01/0x
5、10/0x11 : 4 /8/16 LevelCell,都叫做MLC,其含義是內(nèi)部單個(gè)存儲(chǔ)單元設(shè)計(jì)成可以 表示多個(gè), 即 4/8/16 個(gè)不同的電壓, 對(duì)應(yīng)地, 可以表示 2, 3, 4 位的數(shù)據(jù)。這類的 MLC 的 nandflash,由于單個(gè)存儲(chǔ)單元,要存儲(chǔ)更多的數(shù)據(jù),所以內(nèi)部結(jié) 構(gòu)更復(fù)雜,讀取和寫入數(shù)據(jù)的邏輯更復(fù)雜,相對(duì)數(shù)據(jù)出錯(cuò)的 幾率也比 SLC 要大。所以,一般 MLC 的使用,都需要檢錯(cuò) 和糾錯(cuò)能力更強(qiáng)的硬件或軟件算法,以保證數(shù)據(jù)的正確性。 軟件實(shí)現(xiàn)此類的多位數(shù)據(jù)的檢錯(cuò)和糾錯(cuò)的效率相對(duì)較低,一 般是硬件本身就已經(jīng)提供此功能。對(duì)應(yīng)的其為硬件 ECC,也就是 Linux 內(nèi)核 MTD
6、中的 HW_ECC 。 遇到的問題:讀取 設(shè)備 ID 為 0,說明我們的 NNAD 讀操作有誤,經(jīng)過檢測得 到解決辦法:在讀操作之前沒有先復(fù)位 NAND ,導(dǎo)致操作 NAND 出錯(cuò),在 NAND 操作前添加代碼: /*Reset*/s3c_nand_hwcontrol(0,NAND_CMD_RESET, NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);s3c_nand_device_ready(0);s3c_nan d_hwcontrol(0, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);/*/ (后來發(fā)現(xiàn), 這部分可
7、以 不加,因?yàn)楹竺娲a還會(huì)在讀一次,那次就有復(fù)位)這樣打 印的設(shè)備 ID 就是 NAND: ID=d5 由于六次 ID 數(shù)據(jù)包含了該 芯片的很多信息, 所以打印出來: 1st Cycle(Maker Code)=ecH, 2st Cycle(Device Code)=d5H, 3st Cycle(cellinfo)=94H, 4st Cycle(Page Size, Block Size,Redundant Area Size)=76H, 5st Cycle(Plane Number, ECC Level, Organization.)=54H, 6st Cycle(Device Techno
8、logy, EDO, Interface.)=43H, 我們的芯片 是 MLC 會(huì)調(diào)用下面代碼: nand_type = S3C_NAND_TYPE_MLC;nand->options |= NAND_NO_SUBPAGE_WRITE; /* NOP = 1 if MLC */nand->ecc.read_page = s3c_nand_read_page_4bit;nand->ecc.write_page = s3c_nand_write_page_4bit;nand->ecc.size = 512;nand->ecc.b
9、ytes = 8; /* really 7 bytes*/nand->ecc.layout = &s3c_nand_oob_mlc_64; 到了 函數(shù) nand_scan(struct mtd_info *mtd, int maxchips)Mtd : nand_info;Maxchips:1 函數(shù)核心代碼: nand_set_defaults(chip, busw); / 設(shè)置 NAND 的操作函數(shù)集 type = nand_get_flash_type(mtd, chip, busw, &nand_maf_id, &nand_d
10、ev_id, table);/ 讀取 NAND 的型號(hào),并且最終根 據(jù) "NAND 2GiB 3,3V 8-bit", 0xD5, 0, 2048, 0, LP_OPTIONS, 來設(shè)置 nand_chip 結(jié)構(gòu)體。 Uboot 已經(jīng)定義 好了 NAND 命令: U_BOOT_CMD(nand, CONFIG_SYS_MAXARGS, 1, do_nand,"NAND sub-system","info - show available NAND devicesn""nand device dev - show or set
11、 current devicen""nand read - addr off|partition sizen""nand write - addr off|partition sizen"" read/write 'size' bytes starting at offset 'off'n"" to/from memory address 'addr', skipping bad blocks.n") 所以 nand 的操作都是從 do_nand 函數(shù)開始的
12、: 啟動(dòng)結(jié)果: NAND: NAND device: Manufacturer ID: 0xec, Chip ID: 0xd5 (Samsung NAND 2GiB 3,3V 8-bit)NAND bus width 8 instead 16 bit 隨便測試一下: 210 # nand write.eno devices available 解決:屏蔽 nand_base函數(shù)里:#if 0if (IS_ERR(type)#ifndef CONFIG_SYS_NAND_QUIET_TEST printk(KERN_WARNING "No NAND devicefound!n"
13、;);#endifchip->select_chip(mtd, -1); return PTR_ERR(type); #endif 到此 NAND 的初始化就結(jié) 束了?,F(xiàn)在不如 NAND 的三大重頭戲: 1、nand 的擦除函數(shù) 的實(shí)現(xiàn):核心代碼: if (strncmp(cmd, "erase", 5) = 0 | strncmp(cmd, "scrub", 5) = 0) nand_erase_options_t opts;/ 核 心結(jié)構(gòu)體 struct nand_chip *chip = meminfo->priv;/
14、取出初始化設(shè)置好的 nand_chip;int ret = meminfo->block_isbad(meminfo, erase.addr); / 檢測壞塊 result = meminfo->erase(meminfo, &erase); / 擦除函數(shù) 現(xiàn)在看看 meminfo->erase(meminfo, &erase) ,就是函 數(shù) nand_erase(struct mtd_info *mtd, struct erase_info *instr) 。 參數(shù): mtd 結(jié)構(gòu)體,這個(gè)負(fù)責(zé)調(diào)用 nand_chip
15、的擦除函數(shù), 擦除大小信息放在 instr 結(jié)構(gòu)體。 根據(jù)下面的問題: 問題:210 # nand erase 0 100000nand_curr_device=0NAND erase: device 0 offset 0x0, size 0x100000Skipping bad block at 0x00000000 BUG: failure at nand_base.c:187/nand_select_chip()! 經(jīng)過打印 知道問題所在: if (busw != (chip->options & NAND_BUSWIDTH_16) printk(KERN_
16、INFO "NAND device: Manufacturer ID:"" 0x%02x, Chip ID: 0x%02x(%s %s)n", *maf_id,*dev_id, nand_manuf_idsmaf_,mtd->name);printk(KERN_WARNING "NAND bus width %d instead %d bitn",(chip->options &NAND_BUSWIDTH_16) ? 16 : 8,busw ? 16 : 8);returnE
17、RR_PTR(-EINV AL); 由 于我們執(zhí)行這個(gè)函數(shù),進(jìn)入 if 語句了,這樣就會(huì)返回,導(dǎo)致 后面的 chip->page_shift = ffs(mtd->writesize) - 1; 沒有執(zhí)行,這樣 chip->page_shift 0,這問題就大了,在檢測壞塊的時(shí)候nand_block_bad 函數(shù):chipnr = (int)(ofs >>chip->chip_shift);chip->select_chip(mtd, chipnr); 而 select_chip: static
18、void nand_select_chip(struct mtd_info *mtd, int chipnr)struct nand_chip *chip = mtd->priv;switch (chipnr) case -1:chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);break;case 0:break;default:BUG(); 這明顯就出錯(cuò)。 在 if (busw != (chip->options & NAND_BUSWIDTH_16)就返回了,導(dǎo)致后面的
19、 chip->page_shift 沒有操作,結(jié)果為 0。這 樣, chipnr = (int)(ofs >> chip->chip_shift) 得到的 chipnr 就有問題, nand_select_chip 函數(shù)的 switch 函數(shù)就會(huì)跑 到 default:BUG(); 所以屏蔽這部分: #if 0 if (busw != (chip->options & NAND_BUSWIDTH_16)Manufacturer ID:" " 0x%02x, Chip ID: 0x%02x
20、(%s %s)n", *maf_id, *dev_id, nand_manuf_idsmaf_, mtd->name); printk(KERN_WARNING "NAND bus width %d instead %d bitn", (chip->options & NAND_BUSWIDTH_16) ? 16 : 8, busw ? 16 : 8);/returnERR_PTR(-EINV AL);#endif函數(shù) nand_flash_detect_non_onfi 是個(gè)很重要的函數(shù),我們的 芯片重
21、要信息設(shè)置(修改的重點(diǎn)) : if (!type->pagesize) int extid;chip->cellinfo = chip->read_byte(mtd); extid = chip->read_byte(mtd); /mtd->writesize = 1024 << (extid &0x3);我們的NAND 頁是8k,所以修改:mtd->writesize = 2048<< (extid & 0x3); extid >>= 2;/mtd->oobsize = (8 << (extid & 0x01)*
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國封口包裝系統(tǒng)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年企業(yè)策劃合同修訂協(xié)議書
- 2025年市場策劃代理合同樣本
- 2025年企業(yè)與個(gè)人租賃合同示范文本
- 2025年醫(yī)療衛(wèi)生承包合同責(zé)任范圍
- 2025年度生態(tài)旅游區(qū)外施工合同
- 2025年度電子商務(wù)掛靠運(yùn)營合同范本
- 2025年度國際貿(mào)易爭議調(diào)解與仲裁服務(wù)合同
- 2025年度國內(nèi)航空貨物保險(xiǎn)全面服務(wù)合同
- 2025年度戶外廣告牌租賃與廣告內(nèi)容制作合同
- 胸腰椎骨折中醫(yī)護(hù)理
- 解剖臺(tái)市場發(fā)展預(yù)測和趨勢分析
- DB14∕T 92-2010 M5、M15車用甲醇汽油
- 2024年醫(yī)師定期考核臨床類人文醫(yī)學(xué)知識(shí)考試題庫及答案(共280題)
- 2024年廣東省公務(wù)員考試《行測》真題及答案解析
- 上海市2024年中考化學(xué)真題(含答案)
- 油氣儲(chǔ)運(yùn)節(jié)能優(yōu)化方案
- 物流公司員工守則以及管理制度
- 2024人形機(jī)器人產(chǎn)業(yè)半年研究報(bào)告
- 購買演唱會(huì)門票的合同模板
- 燃燒爆炸理論及應(yīng)用 課件 第1-3章 緒論、燃燒及其災(zāi)害、物質(zhì)的燃燒
評(píng)論
0/150
提交評(píng)論