日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下nand flash驱动工作原理,Linux下Nand Flash 驱动代码分析

發(fā)布時間:2025/3/20 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux下nand flash驱动工作原理,Linux下Nand Flash 驱动代码分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

隨著越來越多的平臺支持從Nand Flash 中啟動,掌握Nand Flash 的驅(qū)動編寫有著重要的現(xiàn)實意義,由于內(nèi)核已經(jīng)完成了大部分的工作,實際工作中大部分工程師對Nand Flash 驅(qū)動只是簡單的修改。

下面分析一下Nand Flash 的代碼流程:

學(xué)習(xí)Nand Flash 之前,需要對塊設(shè)備中下面2點有個認(rèn)識:

1, gendisk: 描述塊設(shè)備實體(一整個Nand Flash 芯片)的結(jié)構(gòu)體,整個塊設(shè)備的注冊過程都是圍繞gendisk 來開展的;

2, add_disk(): 將一個分區(qū)信息(如:/dev/mtdblock3)注冊到內(nèi)核列表中

下面分析具體的驅(qū)動:

1, s3c2410 nandflash 控制器初始化步驟

s3c2410_nand_init(&s3c2410_nand_driver)

->driver_register->bus_add_driver()->driver_attach->bus_for_each_dev(_driver_attach)->driver_probe_device()->dev->probe()? /*最后這個函數(shù)實質(zhì)是 s3c2410_nand_probe() */

->s3c2410_nand_probe()

->s3c24xx_nand_probe()

->s3c2410_nand_inithw()?? /* 初始化nandflash 控制器 */

->s3c2410_nand_init_chip()? /* 初始化s3c2410 nandflash 驅(qū)動最底層的訪問控制函數(shù) */

->chip->write_buf = s3c2410_nand_write_buf;

->chip->read_buf = s3c2410_nand_read_buf;

->chip->select_chip = s3c2410_nand_select_chip;

->chip->cmd_ctrl = s3c2410_nand_hwcontrol()

->nand_scan()

->s3c2410_nand_add_partition()

->add_mtd_device()

將nandflash 的一個分區(qū)注冊成一個塊設(shè)備,并通過IO請求來訪問的步驟: /*塊設(shè)備驅(qū)動程序的注冊過程*/

module_init(init_mtdblock)

->init_mtdblock()

->register_mtd_blktrans(&mtdblock_tr)

->register_blkdev()? /* 注冊為塊設(shè)備 */

->blk_init_queue()?? /* IO請求隊列初始化 */

->kernel_thread(mtd_blktrans_thread) /* 塊設(shè)備(nandflash)讀寫訪問io請求處理線程 */

->tr->add_mtd()

mtdblock_add_mtd()

->add_mtd_blktrans_dev()

->alloc_disk()

->add_disk()?? /* 初始化一個gendisk 結(jié)構(gòu)體并注冊成一個disk */

->blk_register_region()

->register_disk()

->blk_register_queue()

1, nandflash io 請求處理線程mtd_blktrans_thread()等在一個等待隊列上

mtd_blktrans_thread()

->DECLARE_WAITQUEUE(wait,current);

->elv_next_request()? /* 檢查有沒有IO請求 */

->add_wait_queue(&tr->blkcore_priv->thread_wq)? /* 等在等待隊列上 */

->set_current_state(TASK_INTERRUPTIBLE)

->schedule();?? /* 讓出cpu使用權(quán) */

->??? /* 等待,直到有IO請求到來被喚醒 */

->do_blktrans_request()

->blk_fs_request();

->???/* 檢查訪問的偏移量不能大于整個nandflash 的容量 */

->?? /* 假設(shè)為讀訪問: */

->tr->readsect()

mtdblock_readsect()?? /* mtd_block.c */

->do_cached_read()??? /* mtd_block.c */

->mtd->read()

nand_read()?? /* nand_base.c */

->nand_do_read_ops()

->nand_read_page_raw()

->s3c2410_nand_read_buf()? /* 通過s3c2410 nandflash控制器發(fā)命令讀取nandflash 內(nèi)容*/??//s3c2410.c

->? /* 假設(shè)為寫訪問 */

->tr->writesect()

mtdblock_writesect()

->end_request()

2, 當(dāng)IO請求來時,喚醒線程 mtd_blktrans_thread()

mtd_blktrans_request()

->wake_up(&tr->blkcore_priv->thread_wq)

3, nandflash IO請求處理線程mtd_blktrans_thread()開始處理IO請求

->do_blktrans_request()

->/* 見上 */

從上面的代碼流程可見,Nand Flash 驅(qū)動作為一個塊設(shè)備的典型案例,為位于MTD的下層,其數(shù)據(jù)的讀寫通過mtd_blktrans_thread內(nèi)核線程來處理IO請求。

來源:oschina

鏈接:https://my.oschina.net/u/51715/blog/57930

總結(jié)

以上是生活随笔為你收集整理的linux下nand flash驱动工作原理,Linux下Nand Flash 驱动代码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。