好久沒寫部落格了,今天再次分析nandflash驅動程式,每一次讀原始碼總有一點的收穫
1、首先從入口函式開始
probe函式將是我們遇到的第乙個與具體硬體打交道,同時也相對複雜的函式對於很多外設的driver來說,只要能成功實現probe函式,那基本上完成這個外設的driver也就成功了一多半,基於mtd的nand driver就是乙個典型的例子。稍後就可以看到,在nand driver的probe函式中,就已經涉及到了對nand晶元的讀寫。
在基於mtd的nand driver的probe函式中,主要可以分為兩部分內容,其一是與很多外設driver類似的一些工作,如申請位址,中斷,dma等資源,kzalloc及初始化一些結構體,分配dma用的記憶體等等;其二就是與mtd相關的一
if (err != 0)
goto exit_error;
sets = (plat != null) ? plat->sets : null;
nr_sets = (plat != null) ? plat->nr_sets : 1;
info->mtd_count = nr_sets;
/* allocate our information */
/****分配mtd裝置結構*****/
size = nr_sets * sizeof(*info->mtds);
info->mtds = kzalloc(size, gfp_kernel);
if (info->mtds == null)
/* initialise all possible chips */
nmtd = info->mtds;
for (setno = 0; setno < nr_sets; setno++, nmtd++)
if (sets != null)
sets++;
}err = s3c2410_nand_cpufreq_register(info);
if (err < 0)
if (allow_clk_stop(info))
pr_debug("initialised ok\n");
return 0;
exit_error:
s3c24xx_nand_remove(pdev);
if (err == 0)
err = -einval;
return err;}
static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,
struct s3c2410_nand_mtd *nmtd,
struct s3c2410_nand_set *set)
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)
} else
if (set->ecc_layout != null)
chip->ecc.layout = set->ecc_layout;
if (set->disable_ecc)
chip->ecc.mode = nand_ecc_none;
switch (chip->ecc.mode)
/* if you use u-boot bbt creation code, specifying this flag will
* let the kernel fish out the bbt from the nand, and also skip the
* full nand scan that can take 1/2s or so. little things... */
if (set->flash_bbt)
chip->options |= nand_use_flash_bbt | nand_skip_bbtscan;
}
MTD原始裝置與NANDFLASH硬體驅動互動
好久沒寫部落格了,今天再次分析nandflash驅動程式,每一次讀原始碼總有一點的收穫 1 首先從入口函式開始 probe函式將是我們遇到的第乙個與具體硬體打交道,同時也相對複雜的函式對於很多外設的driver來說,只要能成功實現probe函式,那基本上完成這個外設的driver也就成功了一多半,基...
記憶體技術裝置,MTD
mtd,是linux的儲存裝置中的乙個子系統。其設計此系統的目的是,對於記憶體類的裝置,提供乙個抽象層,乙個介面,使得對於硬體驅動設計者來說,可以盡量少的去關心儲存格式,比如ftl,ffs2等,而只需要去提供最簡單的底層硬體裝置的讀 寫 擦除函式就可以了。而資料對於上層使用者來說是如何表示的,硬體驅...
驅動中訪問mtd裝置
今天解決了乙個小問題,如何在linux驅動中訪問mtd裝置。正常的訪問,都是使用者空間通過,open dev mtd read write close 來訪問的。這次由於在驅動中需要讀取 dev mtd4的乙個sector,這個sector是之前用來備份sd 卡的mbr的。1.訪問的第一步是獲得mt...