基於linux2 6 16的nand驅動開發(二)

2021-06-05 19:54:36 字數 3295 閱讀 5105

第二部分:具體的nand flash驅動

搞清楚了mtd,核心,nandflash裝置驅動的關係後,現在就是如何編寫針對我們這款處理器的驅動,首先介紹一下nandflash結構struct nand_chip

●. struct nand_chip{

void  __iomem      *io_addr_r;  //這是nandflash的讀寫暫存器,對於我們的晶元是

void  __iomem     *io_addr_w;  //emi_nand_data

//以下都是nandflash的操作函式,這些函式將根據相應的配置進行過載,也是在nand_scan這個函式中,nand_scan這個函式非常重要,在下文講詳細闡述

u_char    (*read_byte)(struct mtd_info *mtd);

void        (*write_byte)(struct mtd_info *mtd, u_char byte);

u16         (*read_word)(struct mtd_info *mtd);

void        (*write_word)(struct mtd_info *mtd, u16 word);

void        (*write_buf)(struct mtd_info *mtd, const u_char *buf, int len);

void        (*read_buf)(struct mtd_info *mtd, u_char *buf, int len);

int           (*verify_buf)(struct mtd_info *mtd, const u_char *buf, int len);

void        (*select_chip)(struct mtd_info *mtd, int chip);

int           (*block_bad)(struct mtd_info *mtd, loff_t ofs, int getchip);

int           (*block_markbad)(struct mtd_info *mtd, loff_t ofs);

void              (*hwcontrol)(struct mtd_info *mtd, int cmd);

int                (*dev_ready)(struct mtd_info *mtd);

void              (*cmdfunc)(struct mtd_info *mtd, unsigned command, int column, int page_addr);

int          (*waitfunc)(struct mtd_info *mtd, struct nand_chip *this, int state);

int           (*calculate_ecc)(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code);

int          (*correct_data)(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc);

void        (*enable_hwecc)(struct mtd_info *mtd, int mode);

void        (*erase_cmd)(struct mtd_info *mtd, int page);

int           (*scan_bbt)(struct mtd_info *mtd);

int           eccmode;   //ecc是軟體校驗?硬體校驗?無?

int          chip_delay;  //晶元時序延遲引數

int          page_shift;  //頁偏移,對於512/頁的,一般是9

u_char           *data_buf; //資料快取區

(其它引數解釋詳解linux核心原始碼)

●其實我們需要做的事情,就是將上述這些函式,根據我們sep4020的特性,將其過載。

主要過載的函式有:

this->hwcontrol = sep4020_hwcontrol;

這是乙個硬體操作函式,由於在nandflash中對暫存器的操作都是通過io_addr_r和io_addr_w來實現的,而我們需要根據需要在位址暫存器,資料暫存器,命令暫存器,id暫存器,狀態暫存器之間切換,通過這個函式來實現對io_addr_r和io_addr_w的變動。

this->dev_ready = sep4020_nand_dev_ready;

nandflash是否完成的函式,通過讀取emi_nand_idle暫存器位來判斷。

this->write_buf      = sep4020_nand_write_buf;

nandflash的寫函式,nandflash的最基本也是最重要的命令之一。

this->read_buf  = sep4020_nand_read_buf;

nanflash的讀函式,功能同上。

this->write_byte = sep4020_nand_write_byte;

this->read_byte =  sep4020_nand_read_byte;

實際這兩個函式實現了讀取和寫入暫存器乙個byte的功能,

this->eccmode = nand_ecc_soft;//軟體ecc校驗

this->select_chip = sep4020_nand_select_chip;//無此功能,空留

this->cmdfunc = sep4020_nand_command;

在linux中對nand的操作都是通過兩個函式來實現的,乙個是發命令也就是此處的cmdfuc,還有乙個就是讀寫函式,由於sep4020nandflash控制器的特殊,需要將這個函式過載(下文會介紹我們nandflash的特性)

this->erase_cmd = sep4020_nand_cmd_erase;

擦除命令,理由同上。

關於nand_scan函式

nand_scan是在初始化nand的時候對nand進行的一步非常好重要的操作,在nand_scan中會對我們所寫的關於特定晶元的讀寫函式過載到nand_chip結構中去,並會將mtd_info結構體中的函式用nand的函式來過載,實現了mtd到底層驅動的聯絡。

並且在nand_scan函式中會通過讀取nand晶元的裝置號和廠家號自動在晶元列表中尋找相應的型號和引數,並將其註冊進去。

linux系統c c 中的inf和nan

測試環境 ubuntu16.04 inf表示無窮大的數。nan表示 not a number 不是乙個整數。判斷表示式的結果是否為inf include include intmain else 方式二if isinf a else float b b nan std cout b endl if ...

基於Linux的Microsoft Edge瀏覽器

近年來隨著瀏覽器市場的變革,ie的地位越來越低,終於微軟在windows 10作業系統中推出了全新的edge瀏覽器,但是在剛開始的階段edge瀏覽器並不友好,很多人都無法適應edge的工作方式。而為了吸引更多使用者來使用 edge 瀏覽器,微軟終於決定將其 徹底大改版 將引擎替換成效能和相容性俱佳的...

基於Linux系統的病毒

儘管在linux裡傳播的病毒不多,但也是存在一些,我從一些 安全站點蒐集了一些資料。1 病毒名稱 類別 蠕蟲 病毒資料 感染系統 linux 不受影響系統 windows 3.x,windows 95,windows 98,windows nt,windows 2000,windows xp,win...