娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年07月07日(星期一)

2020年07月07日 | S3C2440 Nor Flash驅(qū)動(dòng)(二十四)

發(fā)布者:JoyfulSpirit5 來(lái)源: eefocus關(guān)鍵字:S3C2440  Nor  Flash驅(qū)動(dòng) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

1、Nor Flash硬件介紹:

從原理圖中我們能看待NOR FLASH有地址線,有數(shù)據(jù)線,它和我們的SDRAM接口類似,能直接讀取數(shù)據(jù),但不能想SDRAM直接寫入數(shù)據(jù),需要有命令才行。


1.1 其中我們2440的地址線共有27根(LADDR0~26),為什么是27根?


因?yàn)?440共有7個(gè)bank內(nèi)存塊,每個(gè)bank=128M=(2^27)B,所以共有27根數(shù)據(jù)線


1.2 為什么Nor Flash的地址線A0是接在2440的LADDR1上?


因?yàn)镹or Flash的數(shù)據(jù)共有16位,也就是每個(gè)地址保存了2B數(shù)據(jù),而我們的2440的每個(gè)地址是保存1B數(shù)據(jù)


比如:


當(dāng)2440訪問0x00地址時(shí),就會(huì)讀取到Nor Flash上0地址的2B數(shù)據(jù),然后2440的內(nèi)存控制器會(huì)根據(jù)0X00找到低8位字節(jié),并返回給CPU


當(dāng)2440訪問0x01地址時(shí),由于2440的LDRR0線未接,所以還是訪問Nor Flash的0地址上的2B數(shù)據(jù),然后內(nèi)存控制器會(huì)根據(jù)0x01來(lái)找到高8位字節(jié),并返回給CPU


1.3 nand和nor的區(qū)別:


nor flash在接個(gè)上比nand貴,且容量很小,擦除和寫數(shù)據(jù)都慢,好處在于接口簡(jiǎn)單,穩(wěn)定,無(wú)位反轉(zhuǎn)、壞塊,常用語(yǔ)保存關(guān)鍵數(shù)據(jù),而nand flash常用于保存大容量數(shù)據(jù)。


在2440中是通過(guò)硬件開關(guān)來(lái)設(shè)置OM0為Nand啟動(dòng)還是Nor啟動(dòng),如下圖所示:

OM0具體參數(shù)如下所示,其中2440的OM1引腳接地

對(duì)于nand啟動(dòng):OM0接地,nand flash的開始4KB會(huì)自動(dòng)地加載到2440內(nèi)置的SRAM緩存器中,就可以直接讀寫


對(duì)于nor啟動(dòng):OM0接電源,2440訪問的內(nèi)存就是nor flash,可以直接讀,但是不能直接寫


2、nor flash命令如下所示(參考:MX29LV800BBTC.pdf和MX29LV160DBTI-70G.pdf)

其中word是針對(duì)16位nand,byte針對(duì)8位nand。


由于我們2440的flash型號(hào)是MX29LV160DB,所以設(shè)備ID為0x2249,廠家ID為C2H。


2.1 比如,當(dāng)我們要讀ID操作:


NOR手冊(cè)上:


往地址555H寫AAH (發(fā)送解鎖地址)


往地址2AAH寫55H (發(fā)送解鎖地址)


往地址555H寫90H (發(fā)送命令)


讀0地址得到廠家ID:C2H


讀1地址得到設(shè)備ID:2249


退出讀ID狀態(tài):給任意地址寫F0H


(2440的A1接到NOR的A0,所以2440發(fā)出(555H<<1,左移1位相當(dāng)于乘以2),NOR才能收到555H這個(gè)地址)


UBOOT的操作:


往地址AAAH寫AAH    mw.w aaa aa 


往地址554H寫55H    mw.w 554 55 


往地址AAAH寫90H    mw.w aaa 90 


讀0地址得到廠家ID:C2H    md.w 0 1 (1:表示讀一次)


讀1地址得到設(shè)備ID:2249    md.w 2 1


退出讀ID狀態(tài):給任意地址寫F0H    mw.w 0 f0


2.2 該NOR FLASH有兩種規(guī)范,jedec,cfi(common flash interface)


jedec


就是和nand flash的一樣,通過(guò)讀ID來(lái)匹配內(nèi)核中drivers/mtd/chips/jedec_probe.c里的jedec_table[]數(shù)組,來(lái)確定nor flash的各個(gè)參數(shù)(名稱、容量、位寬等),如下圖所示

2.2.1 [0] = MTD_UADDR_0x0555_0x02AA


表示解鎖地址為0x555,0x2AAAM,其中數(shù)組[0],表示屬于8位flash


2.2.2 cmdset


使用哪種命令,一般CmdSet=0xFFF0


2.2.3 .NumEraseRegions= 1


只有1個(gè)不同的扇區(qū)區(qū)域


2.2.4 ERASEINFO(0x10000,64)


共有64個(gè)扇區(qū),每個(gè)扇區(qū)都是64KB(0x10000)


cfi


就是將這些參數(shù)保存在cfi模式下指定地址中,往nor的0x55地址寫入0x98即可進(jìn)入cfi模式(從上圖CFI Query可知道)


cfi模式部分命令如下圖所示:

當(dāng)我們?cè)赾fi模式下,比如:讀取nor地址0x27處的數(shù)據(jù),便能讀到nor的容量


NOR手冊(cè):


進(jìn)入CFI模式:往55H寫入98H


讀數(shù)據(jù):讀10H得到0051


讀數(shù)據(jù):讀11H得到0052


讀數(shù)據(jù):讀12H得到0059


nor的容量:讀27H得到容量


退出CFI模式:復(fù)位


(2440的A1接到NOR的A0,所以2440發(fā)出(555H<<1,左移1位相當(dāng)于乘以2),NOR才能收到555H這個(gè)地址)


UBOOT的操作:


進(jìn)入CFI模式:往AAH寫入98H    mw.w aa 98


讀數(shù)據(jù):讀20H得到0051    md.w 20 1 (Q)


讀數(shù)據(jù):讀22H得到0052    md.w 22 1 (R)


讀數(shù)據(jù):讀24H得到0059    md.w 24 1 (Y)


nor的容量:讀4EH得到容量    md.w 4e 1 (15)


退出CFI模式:復(fù)位    mw.w 0 f0


讀到0x15,0x15的十進(jìn)制是21,如下圖,對(duì)應(yīng)我們?cè)韴D的21根nor地址線,所以容量為2^21=2097152=2MB




2.3 為什么上圖的A20引腳沒有接?


對(duì)于2440來(lái)講,因?yàn)榇藭r(shí)的A0~A19的容量剛好為2MB,與cfi模式下讀取的數(shù)據(jù)一致, 所以沒有接A20


2.4 寫數(shù)據(jù)操作:(Program)


在地址0x100000(1M),寫入0x1234

得到的還是原來(lái)的數(shù)據(jù),所以不能像內(nèi)存一樣寫


在地址0x30000000(內(nèi)存),寫入0x1234

得到的數(shù)據(jù)是0x1234


NOR手冊(cè):


往地址555H寫AAH


往地址2AAH寫55H


往地址555H寫A0H


往地址PA寫PD


(2440的A1接到NOR的A0,所以2440發(fā)出(555H<<1,左移1位相當(dāng)于乘以2),NOR才能收到555H這個(gè)地址)


UBOOT的操作:


往地址AAAH寫AAH    mw.w aaa aa


往地址554H寫55H    mw.w 554 55


往地址AAAH寫A0H    mw.w aaa a0


往地址0x100000寫1234h    mw.w 100000 1234


讀數(shù)據(jù):讀0x100000得到1234   md.w 100000 1



3、接下來(lái)便來(lái)分析如何寫nor flash驅(qū)動(dòng)


3.1 先來(lái)回憶一下之前的nand flash驅(qū)動(dòng):


nand flash驅(qū)動(dòng)會(huì)放在內(nèi)核的mtd設(shè)備中,而mtd設(shè)備知道如何通過(guò)命令/地址/數(shù)據(jù)來(lái)操作nand flash,所以我們之前的nand flash驅(qū)動(dòng)只實(shí)現(xiàn)了硬件相關(guān)的操作(構(gòu)造mtd_info,nand_chip結(jié)構(gòu)體、啟動(dòng)nand控制器等)


同樣地,nor flash驅(qū)動(dòng)也是放在內(nèi)核的mtd設(shè)備中,mtd設(shè)備也知道對(duì)nor如何來(lái)讀寫擦除,只是不知道nor flash的位寬(數(shù)據(jù)線個(gè)數(shù)),基地址等,所以我們的nor flash驅(qū)動(dòng)同樣要實(shí)現(xiàn)硬件相關(guān)的操作,供給mtd設(shè)備調(diào)用


3.2 參考內(nèi)核自帶的nor驅(qū)動(dòng):drivers/mtd/maps/physmap.c


進(jìn)入它的init函數(shù):


發(fā)現(xiàn)注冊(cè)了兩個(gè)platform平臺(tái)設(shè)備驅(qū)動(dòng),進(jìn)入physmap_flash結(jié)構(gòu)體中:


發(fā)現(xiàn)3個(gè)未定義的變量:


CONFIG_MTD_PHYSMAP_BANKWIDTH:nor flash的字節(jié)位寬


CONFIG_MTD_PHYSMAP_START:nor flash的物理基地址


CONFIG_MTD_PHYSMAP_LEN:nand flash的容量長(zhǎng)度


這3個(gè)變量是通過(guò)linux的menuconfig菜單配置出來(lái)的,若自己填入值,就不需要用menuconfig菜單配置了


3.3 接下來(lái)我們就來(lái)配置內(nèi)核,然后掛在這個(gè)內(nèi)核自帶的nor flash驅(qū)動(dòng)實(shí)驗(yàn)一番


3.4 首先make menuconfig,配置上面3個(gè)變量,然后設(shè)為模塊


 -> Device Drivers                                                   

          -> Memory Technology Device (MTD) support (MTD [=y])             

          -> Mapping drivers for chip access   //進(jìn)入映射驅(qū)動(dòng)


CFI Flash device in physical memory map                      //支持cfi的nor flash設(shè)置為模塊

  │ │    (0x0) Physical start address of flash mapping             //設(shè)置物理基地址  

  │ │    (0X1000000) Physical length of flash mapping         //設(shè)置容量長(zhǎng)度,必須大于等于nor的2MB(0x1000000=16MB)

  │ │    (2)   Bank width in octets            //設(shè)置字節(jié)位寬,因?yàn)閚or flash為16位,所以等于2(2字節(jié)*8位=16位)


3.5 make modules 編譯模塊


如下圖所示,可以看到physmap.c編譯成.ko模塊了


3.6 然后放在nfs目錄下,啟動(dòng)開發(fā)板


cp drivers/mtd/maps/physmap.ko  /work/nfsroot/first_fs


nfs 30000000 192.168.1.3:/work/nfsroot/uImage_nonand


bootm 30000000


如下圖所示,可以看到創(chuàng)建了2個(gè)mtd0字符設(shè)備,一個(gè)mtd0塊設(shè)備:


4、接下來(lái)我們便分析physmap.c,如何寫出nor flash驅(qū)動(dòng)的


其中physmap.c的probe函數(shù)如下:


struct physmap_flash_info {

       struct mtd_info             *mtd;             //實(shí)現(xiàn)對(duì)flash的讀寫擦除等操作

       struct map_info            map;              //存放硬件相關(guān)的結(jié)構(gòu)體

       struct resource             *res;

#ifdef CONFIG_MTD_PARTITIONS

       int                 nr_parts;

       struct mtd_partition      *parts;

#endif

};

 

static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", "map_rom", NULL };    //芯片名稱

 

... ...

static int physmap_flash_probe(struct platform_device *dev)

{

       const char **probe_type;

       ... ...

       /*1. 分配結(jié)構(gòu)體*/

       info = kzalloc(sizeof(struct physmap_flash_info), GFP_KERNEL);

 

       /*2.設(shè)置map_info 結(jié)構(gòu)體*/

    info->map.name = dev->dev.bus_id;                 //norflash的名字

       info->map.phys = dev->resource->start;          //物理基地址

       info->map.size = dev->resource->end - dev->resource->start + 1;       //容量長(zhǎng)度

       info->map.bankwidth = physmap_data->width;                     //字節(jié)位寬

       info->map.virt = ioremap(info->map.phys, info->map.size);    //虛擬地址

 

       simple_map_init(&info->map);                   //簡(jiǎn)單初始化map_info的其它成員

 

       probe_type = rom_probe_types;

       /*3. 設(shè)置mtd_info 結(jié)構(gòu)體 */

       /*通過(guò)probe_type指向的名稱來(lái)識(shí)別芯片,當(dāng)do_map_probe()函數(shù)返回NULL表示沒找到*/

       /*當(dāng)找到對(duì)應(yīng)的芯片mtd_info結(jié)構(gòu)體,便返回給當(dāng)前的info->mtd */

       for (; info->mtd == NULL && *probe_type != NULL; probe_type++)       

       info->mtd = do_map_probe(*probe_type, &info->map); //通過(guò)do_map_probe ()來(lái)識(shí)別芯片

   

 

       if (info->mtd == NULL) {             //最終還是沒找到芯片,便注銷之前注冊(cè)的東西并退出

              dev_err(&dev->dev, "map_probe failedn");

              err = -ENXIO;

              goto err_out;

       }

 

       info->mtd->owner = THIS_MODULE;        

 

 

 

       /*4.添加mtd設(shè)備*/

 

       add_mtd_device(info->mtd);              

 

       return 0;

 

 

 

err_out:

 

       physmap_flash_remove(dev);                      //該函數(shù)用來(lái)注銷之前注冊(cè)的東西

 

       return err;

 

}

通過(guò)上面的代碼和注釋分析到,和我們上一節(jié)的nand flash驅(qū)動(dòng)相似,這里是map_info結(jié)構(gòu)體和mtd_info結(jié)構(gòu)體來(lái)完成的,當(dāng)我們要對(duì)nor flash分區(qū)就要使用add_mtd_partitions()才行


其中當(dāng)*probe=="cfi_probe"時(shí):


就會(huì)通過(guò)do_map_probe("cfi_probe",&info->map)來(lái)識(shí)別芯片


最終會(huì)進(jìn)入drivers/mtd/chips/cfi_probe.c的cfi_probe_chip()函數(shù)來(lái)進(jìn)入cfi模式,讀取芯片信息


當(dāng)*probe_type=="jedec_probe"時(shí):


最終會(huì)進(jìn)入drivers/mtd/chips/jedec_probe.c中的jedec_probe_chip()函數(shù)來(lái)使用讀ID命令,通過(guò)ID來(lái)匹配jedec_table[]數(shù)組。


所以注冊(cè)一個(gè)塊設(shè)備驅(qū)動(dòng),需要以下步驟:


1. 分配mtd_info 結(jié)構(gòu)體和map_info 結(jié)構(gòu)體


2. 設(shè)置map_info 結(jié)構(gòu)體


3. 設(shè)置mtd_info 結(jié)構(gòu)體


4. 使用add_mtd_partitions()或者add_mtd_device()來(lái)創(chuàng)建MTD字符/塊設(shè)備


5、接下來(lái)我們來(lái)參考physmap.c來(lái)自己寫nor flash驅(qū)動(dòng)


 

/*

 * 參考:driversmtdmapsphysmap.c

 */

 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

static struct map_info *s3c_nor_map;

static struct mtd_info *s3c_nor_mtd;

 

//分區(qū),在common-smdk.c里

static struct mtd_partition s3c_nor_parts[] = {

[0] = {

        .name   = "bootloader_nor",//分區(qū)名

        .size   = 0x00040000,//分區(qū)大小

.offset = 0,//分區(qū)偏移值

},

[1] = {

        .name   = "root_nor",

        .offset = MTDPART_OFS_APPEND,//APPEND緊跟上一個(gè)的分區(qū)

        .size   = MTDPART_SIZ_FULL,//剩下的所有空間

}

};

 

static int s3c_nor_init(void)

{

/* 1. 分配map_info結(jié)構(gòu)體 */

s3c_nor_map = kzalloc(sizeof(struct map_info), GFP_KERNEL);

 

/* 2. 設(shè)置:物理基地址(phys),大小(size),位寬(bank width),虛擬基地址(virt) */

s3c_nor_map->name = "s3c_nor";//名字

s3c_nor_map->phys = 0;//nor啟動(dòng)時(shí),物理地址為0

s3c_nor_map->size = 0x1000000;//0x1000000=16MB,要>=NOR的真正大小2MB

s3c_nor_map->bankwidth = 2;//位寬16位

[1] [2]
關(guān)鍵字:S3C2440  Nor  Flash驅(qū)動(dòng) 引用地址:S3C2440 Nor Flash驅(qū)動(dòng)(二十四)

上一篇:S3C DMA使用方法,2410-2440 dma介紹
下一篇:S3C2440 網(wǎng)卡驅(qū)動(dòng)介紹以及制作虛擬網(wǎng)卡驅(qū)動(dòng)(二十五)

推薦閱讀

GPIO 引腳輸出速度有:GPIO_Speed_2MHz (10MHz, 50MHz) 官方一點(diǎn)的解釋: GPIO口的驅(qū)動(dòng)電路響應(yīng)速度,不是輸出信號(hào)的速度。輸出信號(hào)的速度與程序有關(guān),通過(guò)選擇速度來(lái)選擇不同的驅(qū)動(dòng)電路,降低功耗控制噪聲。又稱輸出驅(qū)動(dòng)電路的響應(yīng)速度:(芯片內(nèi)部在I/O口的輸出部分安排了多個(gè)響應(yīng)速度不同的輸出驅(qū)動(dòng)電路,用戶可以根據(jù)自己的需要選擇合適的驅(qū)動(dòng)電...
2019年7月3日, 現(xiàn)代汽車在韓國(guó)首都首爾西北的高陽(yáng)現(xiàn)代汽車品牌體驗(yàn)館發(fā)布了號(hào)稱是“世界上第一款”連續(xù)可變氣門時(shí)間(Continuously Variable Valve Duration)——簡(jiǎn)稱CVVD技術(shù)的發(fā)動(dòng)機(jī)。CVVD技術(shù)可以根據(jù)駕駛條件自行判斷氣門開啟或關(guān)閉的時(shí)間,稱該能將發(fā)動(dòng)機(jī)性能提升4%,燃油效率提升5%,并減少12%的碳排放量。對(duì)于很多消費(fèi)者來(lái)說(shuō),可變氣門不稀奇...
程序如下:#include <REGX52.H> #define LCD_DB P0 sbit LCD_RS=P2^2;sbit LCD_RW=P2^3;sbit LCD_E=P2^4; //函數(shù)定義#define uchar unsigned char#define uint unsigned int void LCD_init(void); //初始化void LCD_write_command(uchar command); //寫指令void LCD_write_data(uchar dat); //寫數(shù)據(jù)void LCD_disp_char(...
第—問:水中油主要包含哪些油類?答:水中油主要是包含石油類和動(dòng)植物類及其他有機(jī)物。第二問:為什么要測(cè)定水中油含量?答:水環(huán)境中石油類污染物超過(guò)水體的自凈能力會(huì)在表面形成油污,阻擋氧氣進(jìn)入水體,從而使水體中溶解氧含量下降,致使水體變黑發(fā)臭。因此,水中油含量也是國(guó)家嚴(yán)格控制排放的一項(xiàng)重要標(biāo)準(zhǔn)。第三問:水中油測(cè)定的方法有哪些?答:紅外...

史海拾趣

問答坊 | AI 解惑

競(jìng)賽資料2

本帖最后由 paulhyde 于 2014-9-15 09:22 編輯 一些資料  …

查看全部問答∨

手機(jī)控制單片機(jī) 2

想實(shí)現(xiàn)手機(jī)發(fā)送短信,板子上GSM模塊接收短信,給單片機(jī),單片機(jī)處理接收到的信息,然后做輸出控制(其它器件) 可行性和大概步驟   已得到論壇上的朋友幫助。。。 現(xiàn)在想具體實(shí)現(xiàn)步驟了,不過(guò)對(duì)那些器件幾乎都不懂 比如像GPRS或GSM模 ...…

查看全部問答∨

意大利太陽(yáng)能光伏產(chǎn)業(yè)前景簡(jiǎn)析

一、太陽(yáng)能光伏產(chǎn)業(yè)發(fā)展?fàn)顩r ?。ㄒ唬?009年全球太陽(yáng)能光伏發(fā)電產(chǎn)業(yè)情況  根據(jù)歐洲光伏工業(yè)協(xié)會(huì)(EuropeanPhotovoltaicIndustryAssociation,簡(jiǎn)稱EPIA)統(tǒng)計(jì),到2009年年底,全球光伏市場(chǎng)累計(jì)容量已超過(guò)20GW(注1),其中僅2009年全球新增設(shè)備發(fā)電 ...…

查看全部問答∨

有償招代做

基于51單片機(jī)的位移,速度測(cè)量。位移為小位移量,mm級(jí),所測(cè)量的機(jī)械動(dòng)作時(shí)間快,為ms級(jí)。能與pc機(jī)通信的usb串口。價(jià)格和有不明白的地方請(qǐng)給我留言,或加QQ76478918…

查看全部問答∨

求大神答疑,關(guān)于Zigbee的問題

各位大大大神,小弟我是個(gè)zigbee菜鳥,目前學(xué)姐讓我做一個(gè)zigbee組網(wǎng)的東西,要點(diǎn)如下: 例如 協(xié)調(diào)器O連接有A,B,C三個(gè)路由,路由器A又有DEF三個(gè)路由現(xiàn)在發(fā)送,如果O要發(fā)送數(shù)據(jù)給D,應(yīng)該怎么做?  CC2430里面的SAMPLE 組網(wǎng)之后發(fā)送數(shù)據(jù) 其 ...…

查看全部問答∨

驚艷的四軸

$(\'swf_UzK\').innerHTML=AC_FL_RunContent(\'width\', \'600\', \'height\', \'500\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://swf.ws.126.net/movieplayer/-0-2_M84QSBLT3_M84QSF3C ...…

查看全部問答∨

還剩了幾本專業(yè)書(LINUX內(nèi)核,TCPIP),2折出了

4本LINUX內(nèi)核的設(shè)計(jì)與實(shí)現(xiàn),4本TCP/IP協(xié)議族,2本操作系統(tǒng)概念,5本C++, 1本UCOS,  數(shù)據(jù)結(jié)構(gòu)C語(yǔ)言版數(shù)本。還有幾本在這里http://shop104602327.taobao.com/shop/view_shop.htm?tracelog=twddp…

查看全部問答∨

MSP430教程9:MSP430單片機(jī)時(shí)鐘模塊

MSP430的時(shí)鐘模塊由低速晶體振蕩器LFXT1、高速晶體振蕩器XT2(MSP430X11X,MSP430X12X沒有)、數(shù)字控制振蕩器DCO、瑣相環(huán)FLL(MSP430X16X以上包括)和增強(qiáng)型瑣相環(huán)FLL+等部件組成。 MSP430X1XX基本時(shí)鐘模塊有三個(gè)時(shí)鐘輸入源LFXT1CLK(低速32768Hz, ...…

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 延安市| 大石桥市| 广丰县| 香格里拉县| 松阳县| 深水埗区| 蒙山县| 会昌县| 天峨县| 中方县| 南部县| 旬阳县| 芮城县| 九台市| 蛟河市| 句容市| 达州市| 天柱县| 社会| 顺义区| 壶关县| 沙河市| 丹东市| 浑源县| 宁晋县| 石屏县| 师宗县| 定陶县| 饶河县| 灵石县| 波密县| 合山市| 嘉荫县| 门头沟区| 九龙坡区| 平武县| 分宜县| 杭锦后旗| 中牟县| 墨江| 洪雅县|