亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 6950 | 回復(fù): 3
打印 上一主題 下一主題

求助:關(guān)于uboot寫(xiě)yaffs2文件系統(tǒng)代碼 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-07-24 17:34 |只看該作者 |倒序?yàn)g覽
現(xiàn)在正在看uboot燒寫(xiě)yaffs2的代碼,有點(diǎn)疑問(wèn)
輸入命令后執(zhí)行do_nand,然后執(zhí)行到nand_write_opts


int nand_write_opts(nand_info_t *meminfo, const nand_write_options_t *opts)
{
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。
        memcpy(data_buf, buffer, readlen);
        buffer += readlen;

        if (opts->writeoob) {
            /* read OOB data from input memory block, exit
             * on failure */

            memcpy(oob_buf, buffer, meminfo->oobsize);
            
            buffer += meminfo->oobsize;

            /* write OOB data first, as ecc will be placed
             * in there*/

            result = meminfo->write_oob(meminfo,
                         mtdoffset,
                         meminfo->oobsize,
                         &written,
                         (unsigned char *)
                         &oob_buf);
            。。。。。。。。。。。。。。。。。。。。。。     
            。。。。。。。。。。。。。。。。。。。。。
            }

        result = meminfo->write(meminfo,
                    mtdoffset,
                    meminfo->oobblock,
                    &written,
                    (unsigned char *) &data_buf);

在這段代碼中,opts->writeoob=1,先執(zhí)行了meminfo->write_oob,寫(xiě)了flash的OOB區(qū),然后執(zhí)行到了meminfo->write,meminfo->write=nand_write
static int nand_write (struct mtd_info *mtd, loff_t to, size_t len, size_t * retlen, const u_char * buf)
{
    return (nand_write_ecc (mtd, to, len, retlen, buf, NULL, NULL));
}


static int nand_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)

{。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
     oobbuf = nand_prepare_oobbuf (mtd, eccbuf, oobsel, autoplace, numpages);
     while (written < len) {
           this->data_poi = (u_char*) &buf[written];

            ret = nand_write_page (mtd, this, page, &oobbuf[oob], oobsel, (--numpages > 0));

    。。。。。。。。。。。。。。。。。。
    }
。。。。。。。。。。。。。。。。。。。。。。   
}

在nand_write_page 中又重新寫(xiě)了一遍OOB區(qū),用的是上面函數(shù)的oobbuf,可是nand_prepare_oobbuf返回的指針是nand chip結(jié)構(gòu)體中的oob_buf。所以最終flash的OOB區(qū)寫(xiě)入的是 nand chip結(jié)構(gòu)體中的oob_buf?煽v觀該程序沒(méi)發(fā)現(xiàn)把文件中的OOB區(qū)讀到oob_buf的步驟,所以很不理解

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-07-25 15:39 |只看該作者
自己頂頂
不明白第二次寫(xiě)OOB區(qū)的數(shù)據(jù)是哪來(lái)的

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2009-08-06 18:42 |只看該作者
【解答】
剛看到此問(wèn)題,自己去看了足夠長(zhǎng)的時(shí)間的代碼后,也還是沒(méi)搞懂。
最后是問(wèn)了同事,聽(tīng)了其解釋?zhuān)琶靼资窃趺椿厥隆?br />
【簡(jiǎn)單解釋】
在詳細(xì)解釋之前,用最簡(jiǎn)單的語(yǔ)言解答此疑問(wèn)就是:
第二次寫(xiě)oob的時(shí)候,oob_buf中前半部分都是0xFF,后半部分是ecc數(shù)據(jù),
由于nand flash的特性,0xFF寫(xiě)入之后,原先的數(shù)據(jù),仍然不變,
所以,nand flash上oob的后半部分是你第一次寫(xiě)的時(shí)候,保證是0xFF,此處第二次寫(xiě)ecc數(shù)據(jù),也才能寫(xiě)入。
即,第二次寫(xiě)入的時(shí)候,oob前半部分由于是0xFF,寫(xiě)入nand對(duì)原先oob數(shù)據(jù)無(wú)影響;
Oob后半部分是ecc數(shù)據(jù),可以正常的寫(xiě)入。
這樣,隱晦地,保證了數(shù)據(jù)按照期望的寫(xiě)入nand flash。

【詳細(xì)解釋】
具體一點(diǎn)解釋就是:

在解釋下面內(nèi)容之前,先簡(jiǎn)單說(shuō)一下此處的一些假設(shè),
1.假設(shè)是2K的pagesize的nand flash,對(duì)應(yīng)的oob是64字節(jié)。
2.ECC在oob中的存放位置,按照nand_oob_64定義的,ECC放在32-63。
3.yaffs2數(shù)據(jù)存放在2-31部分,而byte0,byte1,是為了和壞塊標(biāo)記所兼容,放的是0xFF.

此段uboot寫(xiě)yaffs2的程序之所以能實(shí)現(xiàn)我們所期望的功能,最后寫(xiě)入了正確的值,主要是因?yàn),nand flash的特性:
1.        在寫(xiě)入數(shù)據(jù)之前,一定要擦除(成0xFF),也即數(shù)據(jù)只能從1變成0,所以,如果想要寫(xiě)入數(shù)據(jù)(不全是0xFF)的話,就要保證寫(xiě)入前,已經(jīng)全是0xFF。
2.        在nand flash里面已經(jīng)寫(xiě)入數(shù)據(jù)之后,再寫(xiě)入0xFF的時(shí)候,里面的數(shù)據(jù)不變。

1.        第一次寫(xiě)oob數(shù)據(jù)的時(shí)候,前半部分是yaffs2的數(shù)據(jù),后半部分是自己要保證是0xFF,寫(xiě)入后,nand flash上對(duì)應(yīng)的oob就是 yaffs2+0xFF,類(lèi)似于這樣的數(shù)據(jù):
OOB:
        ff ff 00 10 00 00 01 00
        00 00 00 00 00 00 ff ff
        00 00 30 23 84 bf 05 00
        00 00 05 00 00 00 ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
其中,后半部分是你寫(xiě)之前要自己保證是0xFF的,以便后面寫(xiě)ecc的數(shù)據(jù)時(shí)候,能夠?qū)懭搿?br />
2.        
第二次寫(xiě)入的時(shí)候的oob的數(shù)據(jù),即oob_buf,其是從nand_write_page傳進(jìn)來(lái)的參數(shù),是從
前面nand_prepare_oobbuf中返回的指針,看代碼可以知道,即this->oob_buf,
這個(gè)this->oob_buf也就是mtd->priv-> oob_buf,其是在nand_scan的最后,全是賦值0xFF的:
        /* Preset the internal oob buffer */
        memset(this->oob_buf, 0xff, mtd->oobsize << (this->phys_erase_shift - this->page_shift));

此處被上面寫(xiě)完頁(yè)數(shù)據(jù)的同時(shí),在對(duì)應(yīng)位置填充了ECC的數(shù)據(jù)后,就類(lèi)似于這樣的:
OOB:
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        ff ff ff ff ff ff ff ff
        f0 ec 72 7b 9e 2f 0f 00
        07 d1 75 e5 47 72 0f 00
        fd 7d 33 5b 1d 2c 0e 00
        95 26 41 7c 61 aa 08 00

把這樣的數(shù)據(jù)寫(xiě)入nand flash對(duì)應(yīng)的oob的位置,就和上面說(shuō)的,吻合了:
前面半部分是0xFF,寫(xiě)入后,不影響原有的數(shù)據(jù),即不會(huì)影響第一次寫(xiě)入的oob的前半部分,即yaffs2的數(shù)據(jù),
后半部分,正好是我們要寫(xiě)的ECC,由于前面已經(jīng)保證了是0xFF,所以這里可以正常寫(xiě)入。

【總結(jié)】
上述實(shí)現(xiàn),估計(jì)是為了兼容其他不同類(lèi)型的數(shù)據(jù)的寫(xiě)入,而把簡(jiǎn)單的事情,實(shí)現(xiàn)的這么復(fù)雜和隱晦的。
對(duì)于寫(xiě)yaffs2,很簡(jiǎn)單的辦法,實(shí)際應(yīng)該是,和我之前看到的,好像是1.1.6中的uboot中有的,關(guān)于寫(xiě)yaffs的代碼:


                if (opts->writeyaffs)
                {
                        /* read page data from input memory buffer */
                        memcpy(data_buf, buffer, readlen);
                        buffer += readlen;
                        /* read OOB data from input memory block, exit
                                 * on failure */

                        memcpy(oob_buf, buffer, meminfo->oobsize);
                        buffer += meminfo->oobsize;

                        result = meminfo->write_ecc(meminfo,
                                                mtdoffset,
                                                meminfo->oobblock,
                                                &written,
                                                (unsigned char *) &data_buf,
                                                (unsigned char *)&oob_buf,
                                                                NULL);

                        if (result != 0) {
                                printf("writing NAND page at offset 0x%lx failed\n",
                                           mtdoffset);
                                goto restoreoob;
                        }
                        imglen -= meminfo->oobsize;
                        imglen -= readlen;

                } else {。。。。}


此處就是直接把oob數(shù)據(jù),頁(yè)數(shù)據(jù),一次性地準(zhǔn)備好,然后調(diào)用write_ecc,
就可以一次性地寫(xiě)入頁(yè)數(shù)據(jù)和oob數(shù)據(jù)了,就不用像前面那種方法一樣,這么讓人難以看懂了。。。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2012-09-12 11:58 |只看該作者
學(xué)習(xí)中~~~
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP