<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > NAND Flash內存設備的讀寫(xiě)控制設計

NAND Flash內存設備的讀寫(xiě)控制設計

作者: 時(shí)間:2013-01-17 來(lái)源:網(wǎng)絡(luò ) 收藏


圖3 讀頁(yè)流程


圖4 讀頁(yè)時(shí)序

2.2.2 讀頁(yè)主要函數

   讀頁(yè)的主要函數有nand_read、nand_do_read_ops、nand_command_lp、nand_read_page_hwecc、read_buf。MTD上層會(huì )調用struct mtd_info中的讀page函數,即nand_read函數,然后調用nand_do_read_ops,接著(zhù)會(huì )調用struct nand_chip中的cmdfunc函數。這個(gè)cmdfunc函數與具體的 controller相關(guān),它的作用是使 controller向NAND芯片發(fā)出讀命令,NAND芯片收到命令后,就會(huì )做好準備等待NAND controller下一步的讀取。接著(zhù)nand_read函數又會(huì )調用struct nand_ecc_ctrl中的read_page函數,而read_page函數又會(huì )調用struct nand_chip中read_buf函數,從而真正把NAND芯片中的數據讀取到buffer中。read_buf函數返回后,read_page函數就會(huì )對buffer中的數據做一些處理,比如ECC校驗。讀頁(yè)主要函數代碼如下:

static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops) {
  ……
  while(1) {
    ……
    /*先發(fā)送對應的讀頁(yè)(read page)的命令*/
    chip博cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
    ……
    /*發(fā)送完命令,接著(zhù)去調用read_page函數讀取對應的數據*/
    ret=chip博ecc.read_page(mtd, chip, bufpoi);
    buf+=bytes;
    ……
    readlen-=bytes;
    if(!readlen)
      break;
    col=0;/*頁(yè)內地址對齊*/
    ealpage++;/*頁(yè)號加1*/
    page=realpage chip博pagemask;
    ……
  }
  ……
}

2.3 NAND 的寫(xiě)頁(yè)流程

2.3.1 寫(xiě)頁(yè)時(shí)序


圖5 寫(xiě)頁(yè)時(shí)序

  從圖5寫(xiě)頁(yè)時(shí)序可以看到,如果要實(shí)現寫(xiě)一個(gè)頁(yè)的數據,就要發(fā)送Page program的命令,而且是分兩個(gè)周期,即分兩次發(fā)送對應的命令。第一次是80h,第二次是10h,而兩次命令中間,需要發(fā)送對應的要寫(xiě)的頁(yè)的地址和數據。第3個(gè)周期是發(fā)送讀狀態(tài)寄存器命令70h, 如果I/O口為低電平,表示數據寫(xiě)入成功,否則失敗。寫(xiě)頁(yè)流程如圖6所示。

圖6 寫(xiě)頁(yè)流程

2.3.2 寫(xiě)頁(yè)主要函數

  以寫(xiě)NAND 芯片為例,其寫(xiě)數據的工作過(guò)程:首先,MTD上層會(huì )調用struct mtd_info中的寫(xiě)page函數,即nand_write函數,然后調用nand_do_read_ops。接著(zhù)函數會(huì )調用struct nand_chip中cmdfunc函數,這個(gè)cmdfunc函數與具體的NAND controller相關(guān),它的作用是使NAND controller向NAND芯片發(fā)出寫(xiě)命令,NAND芯片收到命令后,就會(huì )做好準備等待NAND controller下一步的讀取。接著(zhù)nand_write函數又會(huì )調用struct nand_ecc_ctrl中的write_page函數,而write_page函數又會(huì )調用struct nand_chip中write_buf函數,從而真正把數據寫(xiě)到NAND Flash芯片中。

  MTD讀取數據的入口是nand_write,然后調用nand_do_write_ops,此函數主體代碼如下:
static int nand_do_write_ops(struct mtd_info *mtd, loff_t to, struct mtd_oob_ops *ops){
  ……
  if (nand_check_wp(mtd))/*檢測,寫(xiě)保護*/
    return -EIO;
  ……
  while(1){
    ……
    ret=chip博write_page(mtd, chip, wbuf, page, cached,(ops博mode==MTD_OOB_RAW));/*寫(xiě)頁(yè)數據*/
    writelen-=bytes;
    if (!writelen)
      break;
    column=0; /*頁(yè)內地址對齊*/
    buf+=bytes;
    realpage++; /*頁(yè)號加1*/
    page=realpage chip博pagemask;
    ……
    }
……
}

本文引用地址:http://dyxdggzs.com/article/148135.htm

上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>