第二部分:具體的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...