nandflash學習經歷

2021-06-09 19:11:58 字數 2792 閱讀 7690

經過一段時間的奮鬥,  終於對nandflash的框架有點了解!

首先從/drivers/mtd/nand/at91_nand.c開始分析

at91_nand_probe

//獲得nandflash 的型別

//drivers/mtd/nand/nand_base.c

nand_scan

//獲得真正nandflash   的型別

nand_scan_ident

nand_get_flash_type

//初始化nandflash使用的函式

nand_scan_tail

mtd->read = nand_read;

mtd->write = nand_write;

//新增分割槽資訊

//drivers/mtd/nand/mtdpart.c

add_mtd_partitions

//drivers/mtd/mtdcore.c

add_mtd_device

list_for_each(this, &mtd_notifiers)

//drivers\mtd\mtdchar.c

//初始化時呼叫register_mtd_user 函式對 mtd_notifiers進行註冊

init_mtdchar

register_mtd_user(¬ifier);

//註冊鍊錶的時候,  上面的not->add(mtd); 實際上就是呼叫下面結構mtd_notify_add的函式

//static struct mtd_notifier notifier = ;

mtd_notify_add

//建立兩個裝置節點  mtd*   mtd*ro

class_device_create

class_device_create

//drivers\mtd\mtd_blkdevs.c

//呼叫 register_mtd_blktrans對mtd_notifiers進行註冊

register_mtd_blktrans 

register_mtd_user(&blktrans_notifier);

//註冊鍊錶的時候, 上面的not->add(mtd);實際就是呼叫blktrans_notify_add此函式

// static struct mtd_notifier blktrans_notifier = ;

//新增函式中又出現個鍊錶blktrans_majors      

blktrans_notify_add  

//list_for_each(this, &blktrans_majors)

register_mtd_blktrans   被誰呼叫呢?

//drivers\mtd\mtdblock.c   和  drivers\mtd\mtdblock_ro.c

//這兩個檔案初始化的時候,呼叫register_mtd_blktrans此函式對鍊錶進行初始化

init_mtdblock(void)

register_mtd_blktrans(&mtdblock_tr);

//但是上面鍊錶的.add呼叫誰呢?

//答:會呼叫mtdblock_tr 結構中mtdblock_add_mtd    drivers\mtd\mtdblock.c

static struct mtd_blktrans_ops mtdblock_tr = ;

//上面的.add_mtd會呼叫此函式

mtdblock_add_mtd

//那這個函式中會做寫什麼呢?

//drivers/mtd/mtd_blkdev.c

add_mtd_blktrans_dev

//分配乙個struct gendisk  結構,又回到用記憶體模仿nandflsh那一套

alloc_disk

//設定容量

set_capacity

//初始化乙個預設的佇列

gd->queue = tr->blkcore_priv->rq;//blk_init_queue(mtd_blktrans_request, &tr->blkcore_priv->queue_lock);

add_disk(gd);

//那佇列mtd_blktrans_request  喚醒函式做些什麼呢?

//喚醒佇列,那執行等待佇列在哪實現的呢?

wake_up_process(tr->blkcore_priv->thread);

register_mtd_blktrans

//在register_mtd_blktrans註冊函式中,有個執行緒mtd_blktrans_thread

tr->blkcore_priv->thread = kthread_run(mtd_blktrans_thread,

tr,"%sd", tr->name);

mtd_blktrans_thread

//電梯排程演算法

req = elv_next_request(rq);

//喚醒後執行do_blktrans_request,沒有一直在這休眠

do_blktrans_request

//最終還是呼叫讀、寫塊函式    

struct mtd_blktrans_ops *tr

tr->readsect(dev, block, buf)

//實際上就是呼叫

.readsect = mtdblock_readsect,

//而mtdblock_readsect  實際上內部就是呼叫

//mtd->read(mtd, pos, size, &retlen, buf);

Qt學習經歷

乙個qt的小例子 qpushbutton button new qpushbutton quit connect editor new qtextedit editor setfont font highlighter new highlighter editor document 其中connec...

LINUX學習經歷

工作兩年了,想利用空餘時間做點想做的事情。做點噻好呢?由於自己的工作與自己研究生階段學習的內容相差很遠。所以就想利用空餘時間做點與研究生階段學習的東西相關的內容。由於研究生階段主要做懸架控制器的硬軟體設計,當時軟體用的是ucosii系統,一直想研究linux或者wince。後來查了很多資料,還是li...

ios學習經歷

不知不覺作為 ios 開發也有兩年多的時間了,記得當初看到 oc 的語法時,愣是被嚇了回去,隔了好久才重新耐下心去啃一啃。啃了一陣,覺得大概有了點概念,看到 cocoa 那麼多的 class,又懵了,怎麼才能呼叫系統的相機?怎麼儲存資訊?怎麼做乙個像 twitter 個人頁那樣的頁面?總之就是不知道...