色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux下NAND FLASH驅(qū)動(dòng)開發(fā)

          Linux下NAND FLASH驅(qū)動(dòng)開發(fā)

          作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò) 收藏

          info->sel_reg = regs + S3C2410_NFCONF;

          info->sel_bit = S3C2410_NFCONF_nFCE;

          chip->cmd_ctrl = s3c2410_nand_hwcontrol ;

          chip->dev_ready = s3c2410_nand_devready ;

          break;

          。。。。。。

          }

          chip->IO_ADDR_R = chip->IO_ADDR_W;

          nmtd->info = info;

          nmtd->mtd.priv = chip;

          nmtd->mtd.owner = THIS_MODULE;

          nmtd->set = set;

          if (hardware_ecc) {

          chip->ecc.calculate = s3c2410_nand_calculate_ecc ;

          chip->ecc.correct = s3c2410_nand_correct_data ;

          /* 此處,多數(shù)情況下,你所用的 Nand Flash 的控制器,都是支持硬件 ECC 的,所以,此處設(shè)置硬件 ECC(HW_ECC) ,也是充分利用硬件的特性,而如果此處不用硬件去做的 ECC 的話,那么下面也會(huì)去設(shè)置成 NAND_ECC_SOFT ,系統(tǒng)會(huì)用默認(rèn)的軟件去做 ECC 校驗(yàn),相比之下,比硬件 ECC 的效率就低很多,而你的 nand flash 的讀寫,也會(huì)相應(yīng)地要慢不少 */

          chip->ecc.mode = NAND_ECC_HW;

          switch (info->cpu_type) {

          case TYPE_S3C2410:

          chip->ecc.hwctl = s3c2410_nand_enable_hwecc ;

          chip->ecc.calculate = s3c2410_nand_calculate_ecc;

          break;

          。。。。。

          }

          } else {

          chip->ecc.mode = NAND_ECC_SOFT;

          }

          if (set->ecc_layout != NULL)

          chip->ecc.layout = set->ecc_layout;

          if (set->disable_ecc)

          chip->ecc.mode = NAND_ECC_NONE;

          }

          而我們要實(shí)現(xiàn)的底層函數(shù),也就是上面藍(lán)色標(biāo)出來(lái)的一些函數(shù)而已:

          ( 1 ) s3c2410_nand_write_buf 和 s3c2410_nand_read_buf :這是兩個(gè)最基本的操作函數(shù),其功能,就是往你的 nand flash 的控制器中的 FIFO 讀寫數(shù)據(jù)。一般情況下,是 MTD 上層的操作,比如要讀取一頁(yè)的數(shù)據(jù),那么在發(fā)送完相關(guān)的讀命令和等待時(shí)間之后,就會(huì)調(diào)用到你底層的 read_buf ,去 nand Flash 的 FIFO 中,一點(diǎn)點(diǎn)把我們要的數(shù)據(jù),讀取出來(lái),放到我們制定的內(nèi)存的緩存中去。寫操作也是類似,將我們內(nèi)存中的數(shù)據(jù),寫到 Nand Flash 的 FIFO 中去。具體的數(shù)據(jù)流向,參考上面的圖 4 。

          ( 2 ) s3c2410_nand_select_chip : 實(shí)現(xiàn) Nand Flash 的片選。

          ( 3 ) s3c2410_nand_hwcontrol :給底層發(fā)送命令或地址,或者設(shè)置具體操作的模式,都是通過此函數(shù)。

          ( 4 ) s3c2410_nand_devready : Nand Flash 的一些操作,比如讀一頁(yè)數(shù)據(jù),寫入(編程)一頁(yè)數(shù)據(jù),擦除一個(gè)塊,都是需要一定時(shí)間的,在命發(fā)送完成后,就是硬件開始忙著工作的時(shí)候了,而硬件什么時(shí)候完成這些操作,什么時(shí)候不忙了,變就緒了,就是通過這個(gè)函數(shù)去檢查狀態(tài)的。一般具體實(shí)現(xiàn)都是去讀硬件的一個(gè)狀態(tài)寄存器,其中某一位是否是 1 ,對(duì)應(yīng)著是出于“就緒 / 不忙”還是“忙”的狀態(tài)。這個(gè)寄存器,也就是我們前面分析時(shí)序圖中的 R/B# 。

          ( 5 ) s3c2410_nand_enable_hwecc : 在硬件支持的前提下,前面設(shè)置了硬件 ECC 的話,要實(shí)現(xiàn)這個(gè)函數(shù),用于每次在讀寫操作前,通過設(shè)置對(duì)應(yīng)的硬件寄存器的某些位,使得啟用硬件 ECC ,這樣在讀寫操作完成后,就可以去讀取硬件校驗(yàn)產(chǎn)生出來(lái)的 ECC 數(shù)值了。

          ( 6 ) s3c2410_nand_calculate_ecc :如果是上面提到的硬件 ECC 的話,就不用我們用軟件去實(shí)現(xiàn)校驗(yàn)算法了,而是直接去讀取硬件產(chǎn)生的 ECC 數(shù)值就可以了。

          ( 7 ) s3c2410_nand_correct_data :當(dāng)實(shí)際操作過程中,讀取出來(lái)的數(shù)據(jù)所對(duì)應(yīng)的硬件或軟件計(jì)算出來(lái)的 ECC ,和從 oob 中讀出來(lái)的 ECC 不一樣的時(shí)候,就是說(shuō)明數(shù)據(jù)有誤了,就需要調(diào)用此函數(shù)去糾正錯(cuò)誤。對(duì)于現(xiàn)在 SLC 常見的 ECC 算法來(lái)說(shuō),可以發(fā)現(xiàn) 2 位,糾正 1 位。如果錯(cuò)誤大于 1 位,那么就無(wú)法糾正回來(lái)了。一般情況下,出錯(cuò)超過 1 位的,好像幾率不大。至少我看到的不是很大。更復(fù)雜的情況和更加注重?cái)?shù)據(jù)安全的情況下,一般是需要另外實(shí)現(xiàn)更高效和檢錯(cuò)和糾錯(cuò)能力更強(qiáng)的 ECC 算法的。

          當(dāng)然,除了這些你必須實(shí)現(xiàn)的函數(shù)之外,在你更加熟悉整個(gè)框架之后,你可以根據(jù)你自己的 nand flash 的特點(diǎn),去實(shí)現(xiàn)其他一些原先用系統(tǒng)默認(rèn)但是效率不高的函數(shù),而用自己的更高效率的函數(shù)替代他們,以提升你的 nand flash 的整體性能和效率。


          上一頁(yè) 1 2 3 下一頁(yè)

          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉