在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

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

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

            【 Nand flash 驅(qū)動工作原理】

            在介紹具體如何寫 Nand Flash 驅(qū)動之前,我們先要了解,大概的,整個系統(tǒng),和 Nand Flash 相關(guān)的部分的驅(qū)動工作流程,這樣,對于后面的驅(qū)動實現(xiàn),才能更加清楚機制,才更容易實現(xiàn),否則就是,即使寫完了代碼,也還是沒搞懂系統(tǒng)是如何工作的了。

            讓我們以最常見的, Linux 內(nèi)核中已經(jīng)有的三星的 Nand Flash 驅(qū)動,來解釋 Nand Flash 驅(qū)動具體流程和原理。

            此處是參考 2.6.29 版本的 Linux 源碼中的 /drivers/mtd/nand/s3c2410.c ,以 2410 為例。

            1. 在 nand flash 驅(qū)動加載后,第一步,就是去調(diào)用對應(yīng)的 init 函數(shù), s3c2410_nand_init, 去將在 nand flash 驅(qū)動注冊到 Linux 驅(qū)動框架中。

            2. 驅(qū)動本身,真正開始,是從 probe 函數(shù), s3c2410_nand_probe->s3c24xx_nand_probe,

            在 probe 過程中,去用 clk_enable 打開 nand flash 控制器的 clock 時鐘,用 request_mem_region 去申請驅(qū)動所需要的一些內(nèi)存等相關(guān)資源。然后,在 s3c2410_nand_inithw 中,去初始化硬件相關(guān)的部分,主要是關(guān)于時鐘頻率的計算,以及啟用 nand flash 控制器,使得硬件初始化好了,后面才能正常工作。

            3. 需要多解釋一下的,是這部分代碼:

            for (setno = 0; setno nr_sets; setno++, nmtd++) {

            pr_debug(initialising set %d (%p, info %p)/n, setno, nmtd, info);

            /* 調(diào)用 init chip 去掛載你的 nand 驅(qū)動的底層函數(shù)到 nand flash 的結(jié)構(gòu)體中,以及設(shè)置對應(yīng)的 ecc mode ,掛載 ecc 相關(guān)的函數(shù) */

            s3c2410_nand_init_chip(info, nmtd, sets);

            /* scan_ident ,掃描 nand 設(shè)備,設(shè)置 nand flash 的默認函數(shù),獲得物理設(shè)備的具體型號以及對應(yīng)各個特性參數(shù),這部分算出來的一些值,對于 nand flash 來說,是最主要的參數(shù),比如 nand falsh 的芯片的大小,塊大小,頁大小等。 */

            nmtd->scan_res = nand_scan_ident(nmtd->mtd,

            (sets) ? sets->nr_chips : 1);

            if (nmtd->scan_res == 0) {

            s3c2410_nand_update_chip(info, nmtd);

            /* scan tail ,從名字就可以看出來,是掃描的后一階段,此時,經(jīng)過前面的 scan_ident ,我們已經(jīng)獲得對應(yīng) nand flash 的硬件的各個參數(shù),然后就可以在 scan tail 中,根據(jù)這些參數(shù),去設(shè)置其他一些重要參數(shù),尤其是 ecc 的 layout ,即 ecc 是如何在 oob 中擺放的,最后,再去進行一些初始化操作,主要是根據(jù)你的驅(qū)動,如果沒有實現(xiàn)一些函數(shù)的話,那么就用系統(tǒng)默認的。 */

            nand_scan_tail(nmtd->mtd);

            /* add partion ,根據(jù)你的 nand flash 的分區(qū)設(shè)置,去分區(qū) */

            s3c2410_nand_add_partition(info, nmtd, sets);

            }

            if (sets != NULL)

            sets++;

            }

            4. 等所有的參數(shù)都計算好了,函數(shù)都掛載完畢,系統(tǒng)就可以正常工作了。

            上層訪問你的 nand falsh 中的數(shù)據(jù)的時候,通過 MTD 層,一層層調(diào)用,最后調(diào)用到你所實現(xiàn)的那些底層訪問硬件數(shù)據(jù) / 緩存的函數(shù)中。

            【 Linux 下 nand flash 驅(qū)動編寫步驟簡介】

            關(guān)于上面提到的,在 nand_scan_tail 的時候,系統(tǒng)會根據(jù)你的驅(qū)動,如果沒有實現(xiàn)一些函數(shù)的話,那么就用系統(tǒng)默認的。如果實現(xiàn)了自己的函數(shù),就用你的。

            估計很多人就會問了,那么到底我要實現(xiàn)哪些函數(shù)呢,而又有哪些是可以不實現(xiàn),用系統(tǒng)默認的就可以了呢。

            此問題的,就是我們下面要介紹的,也就是,你要實現(xiàn)的,你的驅(qū)動最少要做哪些工作,才能使整個 nand flash 工作起來。

            1. 對于驅(qū)動框架部分

            其實,要了解,關(guān)于驅(qū)動框架部分,你所要做的事情的話,只要看看三星的整個 nand flash 驅(qū)動中的這個結(jié)構(gòu)體,就差不多了:

            static struct platform_driver s3c2410_nand_driver = {

            .probe = s3c2410_nand_probe,

            .remove = s3c2410_nand_remove,

            .suspend = s3c24xx_nand_suspend,

            .resume = s3c24xx_nand_resume,

            .driver = {

            .name = s3c2410-nand,

            .owner = THIS_MODULE,

            },

            };

            對于上面這個結(jié)構(gòu)體,沒多少要解釋的。從名字,就能看出來:

            ( 1 ) probe 就是系統(tǒng)“探測”,就是前面解釋的整個過程,這個過程中的多數(shù)步驟,都是和你自己的 nand flash 相關(guān)的,尤其是那些硬件初始化部分,是你必須要自己實現(xiàn)的。

            ( 2 ) remove ,就是和 probe 對應(yīng)的,“反初始化”相關(guān)的動作。主要是釋放系統(tǒng)相關(guān)資源和關(guān)閉硬件的時鐘等常見操作了。

            (3)suspend 和 resume ,對于很多沒用到電源管理的情況下,至少對于我們剛開始寫基本的驅(qū)動的時候,可以不用關(guān)心,放個空函數(shù)即可。

            2. 對于 nand flash 底層操作實現(xiàn)部分

            而對于底層硬件操作的有些函數(shù),總體上說,都可以在上面提到的 s3c2410_nand_init_chip 中找到:

            static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,

            struct s3c2410_nand_mtd *nmtd,

            struct s3c2410_nand_set *set)

            {

            struct nand_chip *chip = nmtd->chip;

            void __iomem *regs = info->regs;

            chip->write_buf = s3c2410_nand_write_buf ;

            chip->read_buf = s3c2410_nand_read_buf ;

            chip->select_chip = s3c2410_nand_select_chip ;

            chip->chip_delay = 50;

            chip->priv = nmtd;

            chip->options = 0;

            chip->controller = info->controller;

            switch (info->cpu_type) {

            case TYPE_S3C2410:

            /* nand flash 控制器中,一般都有對應(yīng)的數(shù)據(jù)寄存器,用于給你往里面寫數(shù)據(jù),表示將要讀取或?qū)懭攵嗌賯€字節(jié) (byte,u8)/ 字 (word,u32) ,所以,此處,你要給出地址,以便后面的操作所使用 */

            chip->IO_ADDR_W = regs + S3C2410_NFDATA;



            關(guān)鍵詞:

            評論


            相關(guān)推薦

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

            關(guān)閉