當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]我們先查看內(nèi)核的啟動(dòng)信息,以搞清楚從哪個(gè)文件著手來分析: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è)文件著手來分析:


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"


我們來搜索:S3C24XX NAND Driver

結(jié)果我們?cè)赿riversmtdnands3c2410.c文件里發(fā)現(xiàn)了打印這句話的函數(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)總線設(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類型

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);//讀廠家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ù)組中找到其類型

{

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

{

type = &nand_flash_ids[i];

break;

}

}

nand_scan_tail(mtd);//這里設(shè)置了讀寫和擦除函數(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)//詳見注釋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);

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

}

那么是誰調(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è)備,這也說明了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)建類,但是并沒有在類下創(chuàng)建設(shè)備節(jié)點(diǎn)哦,這個(gè)節(jié)點(diǎn)要在適當(dāng)?shù)臅r(shí)候才來創(chuàng)建

mtd_notify_add(struct mtd_info* mtd);


我們?cè)賮砜匆幌聣K設(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);

}

}

不過我們好像還得繼續(xù)向上搜尋,我們要看一看是誰設(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)磁盤,一下就可以看出和我們上節(jié)課編寫的驅(qū)動(dòng)程序掛鉤了哦!

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

add_disk;//注冊(cè)磁盤

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

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

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉