日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]我們先查看內(nèi)核的啟動(dòng)信息,以搞清楚從哪個(gè)文件著手來(lái)分析:S3C24XX NAND Driver, (c) 2004 Simtec Electronicss3c2440-nand s3c2440-nand: Tacls=3, 30ns Twrph0=7 70ns, Twrph1=3 30nsNAND device: Manufacturer I

我們先查看內(nèi)核的啟動(dòng)信息,以搞清楚從哪個(gè)文件著手來(lái)分析:


S3C24XX NAND Driver, (c) 2004 Simtec Electronics

s3c2440-nand s3c2440-nand: Tacls=3, 30ns Twrph0=7 70ns, Twrph1=3 30ns

NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)

Scanning device for bad blocks

Bad eraseblock 408 at 0x03300000

Bad eraseblock 441 at 0x03720000

Bad eraseblock 804 at 0x06480000

Bad eraseblock 1155 at 0x09060000

Bad eraseblock 1236 at 0x09a80000

Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":

0x00000000-0x00040000 : "bootloader"

0x00040000-0x00060000 : "params"

0x00060000-0x00260000 : "kernel"

0x00260000-0x10000000 : "root"


我們來(lái)搜索:S3C24XX NAND Driver

結(jié)果我們?cè)赿riversmtdnands3c2410.c文件里發(fā)現(xiàn)了打印這句話(huà)的函數(shù):

static struct platform_driver s3c2440_nand_driver = {

.probe = s3c2440_nand_probe,

.remove = s3c2410_nand_remove,

.suspend = s3c24xx_nand_suspend,

.resume = s3c24xx_nand_resume,

.driver = {

.name = "s3c2440-nand",

.owner = THIS_MODULE,

},

};

static int __init s3c2410_nand_init(void)

{

printk("S3C24XX NAND Driver, (c) 2004 Simtec Electronicsn");


platform_driver_register(&s3c2412_nand_driver);

platform_driver_register(&s3c2440_nand_driver);

return platform_driver_register(&s3c2410_nand_driver);

}

我們看到了,nandflash采用的是平臺(tái)總線(xiàn)設(shè)備機(jī)制,當(dāng)發(fā)現(xiàn)名字是s3c2440-nand的設(shè)備的時(shí)候,就會(huì)調(diào)用probe函數(shù),那么我們就從probe函數(shù)入手了:

s3c24xx_nand_probe

s3c2410_nand_inithw(info, pdev);//初始化硬件

s3c2410_nand_init_chip(info, nmtd, sets);//初始化芯片,這里設(shè)置了chip的一些信息

nand_scan(&nmtd->mtd, (sets) ? sets->nr_chips : 1);//掃描芯片

nand_scan_ident(struct mtd_info *mtd, int maxchips)

nand_set_defaults(chip, busw);//設(shè)置默認(rèn)函數(shù)

nand_get_flash_type(mtd, chip, busw, &nand_maf_id);//獲取nandflash類(lèi)型

chip->select_chip(mtd, 0);//選中芯片

chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);//發(fā)出讀ID的命令,NAND_CMD_READID為90h

*maf_id = chip->read_byte(mtd);//讀廠(chǎng)家ID

dev_id = chip->read_byte(mtd);//讀設(shè)備ID

for (i = 0; nand_flash_ids[i].name != NULL; i++)//根據(jù)設(shè)備id在nand_flash_ids[i]數(shù)組中找到其類(lèi)型

{

if (dev_id == nand_flash_ids[i].id)

{

type = &nand_flash_ids[i];

break;

}

}

nand_scan_tail(mtd);//這里設(shè)置了讀寫(xiě)和擦除函數(shù)

mtd->erase = nand_erase;

mtd->read = nand_read;

mtd->write = nand_write;

s3c2410_nand_add_partition(info, nmtd, sets);//添加分區(qū)

add_mtd_partitions(&mtd->mtd, set->partitions, set->nr_partitions);

add_mtd_device(&mtd->mtd);

list_for_each(this, &mtd_notifiers)//詳見(jiàn)注釋1

{

struct mtd_notifier *not = list_entry(this, struct mtd_notifier, list);

not->add(mtd);

}

注釋1:

list_for_each(this, &mtd_notifiers)

{

struct mtd_notifier *not = list_entry(this, struct mtd_notifier, list);

not->add(mtd);

}

首先我們要搞清楚這個(gè)宏:list_entry(this, struct mtd_notifier, list);它會(huì)返回一個(gè)指向mtd_notifier結(jié)構(gòu)體的指針

這樣我們就明白了,我們需要知道在哪里定義了mtd_notifier這個(gè)東西,這樣才能知道它的成員add函數(shù)。我們發(fā)現(xiàn):

void register_mtd_user (struct mtd_notifier *new)

{

..........................................................

list_add(&new->list, &mtd_notifiers);

...........................................................

}

那么是誰(shuí)調(diào)用了register_mtd_use函數(shù)呢?我們發(fā)現(xiàn):

driversmtdMtd_blkdevs.c和driversmtdMtdchar.c文件里面都調(diào)用了這個(gè)函數(shù),這兩個(gè)文件一個(gè)對(duì)應(yīng)字符設(shè)備一個(gè)對(duì)應(yīng)塊設(shè)備,這也說(shuō)明了nandflash既可以作為字符設(shè)備,也可以作為塊設(shè)備。我們先進(jìn)入字符設(shè)備看看吧:

很快我們發(fā)現(xiàn)了add函數(shù)的定義:

static void mtd_notify_add(struct mtd_info* mtd)

{

if (!mtd)

return;

class_device_create(mtd_class, NULL, MKDEV(MTD_CHAR_MAJOR, mtd->index*2),NULL, "mtd%d", mtd->index);//創(chuàng)建設(shè)備節(jié)點(diǎn)

class_device_create(mtd_class, NULL,MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1),NULL, "mtd%dro", mtd->index);//創(chuàng)建只讀設(shè)備節(jié)點(diǎn)

}

我們有必要分析一下這個(gè)文件:

register_chrdev(MTD_CHAR_MAJOR, "mtd", &mtd_fops);//注冊(cè)字符設(shè)備

class_create(THIS_MODULE, "mtd");//創(chuàng)建類(lèi),但是并沒(méi)有在類(lèi)下創(chuàng)建設(shè)備節(jié)點(diǎn)哦,這個(gè)節(jié)點(diǎn)要在適當(dāng)?shù)臅r(shí)候才來(lái)創(chuàng)建

mtd_notify_add(struct mtd_info* mtd);


我們?cè)賮?lái)看一下塊設(shè)備驅(qū)動(dòng)的吧:

很快我們就發(fā)下了add函數(shù)的定義:

static void blktrans_notify_add(struct mtd_info *mtd)

{

struct list_head *this;

if (mtd->type == MTD_ABSENT)

return;

list_for_each(this, &blktrans_majors) {

struct mtd_blktrans_ops *tr = list_entry(this, struct mtd_blktrans_ops, list);

tr->add_mtd(tr, mtd);

}

}

不過(guò)我們好像還得繼續(xù)向上搜尋,我們要看一看是誰(shuí)設(shè)置了blktrans_majors:

int register_mtd_blktrans(struct mtd_blktrans_ops *tr)

{

..........................................................

list_add(&tr->list, &blktrans_majors);

..........................................................

}

那么我們還要看看register_mtd_blktrans這個(gè)函數(shù)在哪里調(diào)用:

我們?cè)赿riversmtdMtdblock.c文件里面發(fā)現(xiàn)了調(diào)用:

很快我們找到了add函數(shù)的定義:
mtdblock_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)

add_mtd_blktrans_dev(dev);

alloc_disk(1 << tr->part_bits);//申請(qǐng)磁盤(pán),一下就可以看出和我們上節(jié)課編寫(xiě)的驅(qū)動(dòng)程序掛鉤了哦!

gd->queue = tr->blkcore_priv->rq;//設(shè)置隊(duì)列

add_disk;//注冊(cè)磁盤(pán)

針對(duì)上面的分析,我們?cè)谶@里整理一下,首先來(lái)說(shuō)一說(shuō)將nandflash當(dāng)作塊設(shè)備來(lái)用的時(shí)候,其工作流程:

我們其實(shí)是分成了幾個(gè)層次的,一個(gè)是塊設(shè)備,我們?cè)谥耙呀?jīng)知道了,應(yīng)用程序?qū)K設(shè)備的讀寫(xiě)請(qǐng)求被放放入隊(duì)列里面,也就是說(shuō)塊設(shè)備對(duì)請(qǐng)求作了優(yōu)化。而我們從s3c2410_nand_add_partition函數(shù)分析出來(lái),mtdblock_add_mtd里面注冊(cè)了這個(gè)隊(duì)列,那么請(qǐng)求就可以放在這個(gè)隊(duì)列里面,并且這個(gè)函數(shù)里面還分配的磁盤(pán)并且注冊(cè)了磁盤(pán)。下面還差

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

關(guān)于使用燒錄器燒錄Nand Flash,一直都是很多用戶(hù)頭疼的難點(diǎn),他們強(qiáng)調(diào)已經(jīng)使用了正確的壞塊管理方案,也制定了規(guī)范的操作流程,但是燒錄的良品率還是無(wú)法提高,只能每天眼睜睜看著一盤(pán)盤(pán)&ldqu

關(guān)鍵字: nandflash 燒錄器

5月26日消息,據(jù)國(guó)外媒體報(bào)道,集邦咨詢(xún)半導(dǎo)體研究中心(DRAMeXchange)在周一發(fā)布的一份報(bào)告中稱(chēng),今年第一季度,三星在全球NAND Flash市場(chǎng)上的份額為33.3%,與前一季度相比,環(huán)比略

關(guān)鍵字: nandflash 三星 芯片

華為作為美光最大的客戶(hù)之一,美國(guó)將華為列入實(shí)體名單一事對(duì)美光產(chǎn)生了非常嚴(yán)重的影響,美光業(yè)績(jī)已經(jīng)逐漸露出下滑趨勢(shì),上周五美光股價(jià)大跌近7%,南亞科、華邦電、威剛等存儲(chǔ)器企業(yè)也紛紛走低。 近期DRAM及N

關(guān)鍵字: DRAM nandflash 美光 芯片

6月24日消息 日前全球第二大閃存供應(yīng)商?hào)|芝位于日本三重縣的閃存工廠(chǎng)因地震遭遇斷電事故,雖然停電過(guò)程非常短,13分鐘之后就恢復(fù)供電了,但是工廠(chǎng)卻一直停產(chǎn),直到21日上午才恢復(fù),至少停工了5天時(shí)間。 根

關(guān)鍵字: nandflash 東芝 臺(tái)積電 芯片 閃存

Nandflash芯片以其高性?xún)r(jià)比,大存儲(chǔ)容量在電子產(chǎn)品中廣泛應(yīng)用。但是,在此量大質(zhì)優(yōu)的應(yīng)用領(lǐng)域,很多客戶(hù)卻痛苦于批量質(zhì)量問(wèn)題:專(zhuān)用工具無(wú)法滿(mǎn)足量產(chǎn),量產(chǎn)工具卻可能出現(xiàn)極大的不良品率,那么究竟要如何解決呢?

關(guān)鍵字: nandflash 芯片 燒錄技巧

一、 首先先來(lái)看看核心板的原理圖我們發(fā)現(xiàn)數(shù)據(jù)線(xiàn)才有8條,而并沒(méi)有地址信號(hào),所以該8條線(xiàn)一定是可以傳數(shù)據(jù),也可以傳地址。而地址線(xiàn)肯定又不夠,那么,地址肯定又是多次發(fā)出的。從datasheet可以看到它要發(fā)出5個(gè)周期的

關(guān)鍵字: nandflash ok6410 硬件

它包含7個(gè)文件:head.Sinit.cmain.cMakefilenand.cnand.lds我們之前的程序都是在nandflash的前4k放代碼,上電后自動(dòng)拷貝到SRAM中,之后將SRAM中的代碼拷貝到SDRAM中。...

關(guān)鍵字: nandflash 裸機(jī)程序

注:此文為部分摘錄,并且在原文基礎(chǔ)上有改動(dòng)link這幾天一直在摸索s3c2410的啟動(dòng)過(guò)程,幾天的困惑終于在昨天晚上基本解決.下面詳細(xì)分析一下它的最前面的啟動(dòng)過(guò)程.1.在板子上電的一開(kāi)始,首先自動(dòng)判斷是否是autoboo...

關(guān)鍵字: nandflash s3c2410 啟動(dòng)過(guò)程
關(guān)閉