新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Linux下NAND FLASH驅動開發

        Linux下NAND FLASH驅動開發

        作者: 時間:2016-10-08 來源:網絡 收藏

        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 ;

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

        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;

        }

        而我們要實現的底層函數,也就是上面藍色標出來的一些函數而已:

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

        ( 2 ) s3c2410_nand_select_chip : 實現 Nand Flash 的片選。

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

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

        ( 5 ) s3c2410_nand_enable_hwecc : 在硬件支持的前提下,前面設置了硬件 ECC 的話,要實現這個函數,用于每次在讀寫操作前,通過設置對應的硬件寄存器的某些位,使得啟用硬件 ECC ,這樣在讀寫操作完成后,就可以去讀取硬件校驗產生出來的 ECC 數值了。

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

        ( 7 ) s3c2410_nand_correct_data :當實際操作過程中,讀取出來的數據所對應的硬件或軟件計算出來的 ECC ,和從 oob 中讀出來的 ECC 不一樣的時候,就是說明數據有誤了,就需要調用此函數去糾正錯誤。對于現在 SLC 常見的 ECC 算法來說,可以發現 2 位,糾正 1 位。如果錯誤大于 1 位,那么就無法糾正回來了。一般情況下,出錯超過 1 位的,好像幾率不大。至少我看到的不是很大。更復雜的情況和更加注重數據安全的情況下,一般是需要另外實現更高效和檢錯和糾錯能力更強的 ECC 算法的。

        當然,除了這些你必須實現的函數之外,在你更加熟悉整個框架之后,你可以根據你自己的 nand flash 的特點,去實現其他一些原先用系統默認但是效率不高的函數,而用自己的更高效率的函數替代他們,以提升你的 nand flash 的整體性能和效率。


        上一頁 1 2 3 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 汶川县| 光泽县| 年辖:市辖区| 绍兴市| 阿尔山市| 雷波县| 尼玛县| 甘南县| 会理县| 内江市| 大庆市| 宜黄县| 马公市| 文山县| 甘肃省| 虞城县| 青神县| 华安县| 常山县| 莆田市| 钟山县| 西平县| 海安县| 武穴市| 自治县| 平湖市| 乌拉特后旗| 慈溪市| 深水埗区| 武强县| 漳浦县| 故城县| 和平县| 郴州市| 东港市| 从江县| 沈丘县| 改则县| 太保市| 曲周县| 防城港市|