經過一段時間的奮鬥, 終於對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 個人頁那樣的頁面?總之就是不知道...