驅動10.nor flash

来源:http://www.cnblogs.com/Lwd-linux/archive/2017/01/13/6284111.html
-Advertisement-
Play Games

1 比較nor/nand flash NOR NAND介面: RAM-Like,引腳多 引腳少,復用容量: 小 1M 2M 3M 大:128M 256M G讀: 簡單 複雜寫: 發出特定命令 慢 發出特定命令 快價格: 貴 便宜特點: 無位反轉、壞塊 位反轉、壞塊 關鍵重要的程式 大數據、容忍可以出 ...


1 比較nor/nand flash

               NOR                                  NAND
介面:    RAM-Like,引腳多                 引腳少,復用
容量:  小 1M 2M 3M               大:128M 256M G
讀:        簡單                                   複雜
寫:        發出特定命令 慢               發出特定命令 快
價格:    貴                                         便宜
特點:    無位反轉、壞塊                 位反轉、壞塊                                              
                關鍵重要的程式         大數據、容忍可以出錯的程式
xip            可以                                 不可以

2 使用UBOOT體驗NOR FLASH的操作(開發板設為NOR啟動,進入UBOOT)

 1 1. 讀數據
 2 md.b 0 
 3 
 4 2. 讀ID
 5 NOR手冊上:
 6 往地址555H寫AAH
 7 往地址2AAH寫55H
 8 往地址555H寫90H
 9 讀0地址得到廠家ID: C2H
10 讀1地址得到設備ID: 22DAH或225BH
11 退出讀ID狀態: 給任意地址寫F0H
12 
13 2440的A1接到NOR的A0,所以2440發出(555h<<1), NOR才能收到555h這個地址
14 UBOOT怎麼操作?
15 
16 往地址AAAH寫AAH                      mw.w aaa aa
17 往地址554寫55H                       mw.w 554 55
18 往地址AAAH寫90H                      mw.w aaa 90
19 讀0地址得到廠家ID: C2H               md.w 0 1
20 讀2地址得到設備ID: 22DAH或225BH      md.w 2 1
21 退出讀ID狀態:                        mw.w 0 f0
22 
23 3. NOR有兩種規範, jedec, cfi(common flash interface)
24    讀取CFI信息
25 
26 NOR手冊:   
27 進入CFI模式    往55H寫入98H
28 讀數據:        讀10H得到0051
29                讀11H得到0052
30                讀12H得到0059
31                讀27H得到容量
32 
33 2440的A1接到NOR的A0,所以2440發出(555h<<1), NOR才能收到555h這個地址
34 UBOOT怎麼操作?
35 進入CFI模式    往AAH寫入98H            mw.w aa 98
36 讀數據:        讀20H得到0051           md.w 20 1
37                讀22H得到0052           md.w 22 1
38                讀24H得到0059           md.w 24 1
39                讀4EH得到容量           md.w 4e 1
40                退出CFI模式             mw.w 0 f0
41 
42 4. 寫數據: 在地址0x100000寫入0x1234
43 md.w 100000 1     // 得到ffff
44 mw.w 100000 1234
45 md.w 100000 1     // 還是ffff
46 
47 NOR手冊:
48 往地址555H寫AAH 
49 往地址2AAH寫55H 
50 往地址555H寫A0H 
51 往地址PA寫PD
52 
53 2440的A1接到NOR的A0,所以2440發出(555h<<1), NOR才能收到555h這個地址
54 UBOOT怎麼操作?
55 往地址AAAH寫AAH               mw.w aaa aa
56 往地址554H寫55H               mw.w 554 55
57 往地址AAAH寫A0H               mw.w aaa a0
58 往地址0x100000寫1234h         mw.w 100000 1234
使用uboot體驗nor flash的讀寫

3 NOR FLASH識別過程:
do_map_probe("cfi_probe", s3c_nor_map);
    drv = get_mtd_chip_driver(name)
    ret = drv->probe(map);  // cfi_probe.c
            cfi_probe
                mtd_do_chip_probe(map, &cfi_chip_probe);
                    cfi = genprobe_ident_chips(map, cp);
                                genprobe_new_chip(map, cp, &cfi)
                                    cp->probe_chip(map, 0, NULL, cfi)
                                            cfi_probe_chip
                                                // 進入CFI模式
                                                cfi_send_gen_cmd(0x98, 0x55, base, map, cfi, cfi->device_type, NULL);
                                                // 看是否能讀出"QRY"
                                                qry_present(map,base,cfi)
                                                .....
                                                
do_map_probe("jedec_probe", s3c_nor_map);
    drv = get_mtd_chip_driver(name)
    ret = drv->probe(map);  // jedec_probe
            jedec_probe
                mtd_do_chip_probe(map, &jedec_chip_probe);
                    genprobe_ident_chips(map, cp);
                        genprobe_new_chip(map, cp, &cfi)
                            cp->probe_chip(map, 0, NULL, cfi)
                                    jedec_probe_chip
                                        // 解鎖
                                        cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
                                        cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL);
                                        
                                        // 讀ID命令
                                        cfi_send_gen_cmd(0x90, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);                                      
                            
                                        // 得到廠家ID,設備ID
                                        cfi->mfr = jedec_read_mfr(map, base, cfi);
                                        cfi->id = jedec_read_id(map, base, cfi);
                                        
                                        // 和數組比較
                                        jedec_table    

 

4 寫代碼

 1 /*
 2  * 參考 drivers\mtd\maps\physmap.c
 3  */
 4 
 5 #include <linux/module.h>
 6 #include <linux/types.h>
 7 #include <linux/kernel.h>
 8 #include <linux/init.h>
 9 #include <linux/slab.h>
10 #include <linux/device.h>
11 #include <linux/platform_device.h>
12 #include <linux/mtd/mtd.h>
13 #include <linux/mtd/map.h>
14 #include <linux/mtd/partitions.h>
15 #include <asm/io.h>
16 
17 static struct map_info *s3c_nor_map;
18 static struct mtd_info *s3c_nor_mtd;
19 
20 static struct mtd_partition s3c_nor_parts[] = {
21     [0] = {
22         .name   = "bootloader_nor",
23         .size   = 0x00040000,
24         .offset    = 0,
25     },
26     [1] = {
27         .name   = "root_nor",
28         .offset = MTDPART_OFS_APPEND,
29         .size   = MTDPART_SIZ_FULL,
30     }
31 };
32 
33 
34 static int s3c_nor_init(void)
35 {
36     /* 1. 分配map_info結構體 */
37     s3c_nor_map = kzalloc(sizeof(struct map_info), GFP_KERNEL);;
38     
39     /* 2. 設置: 物理基地址(phys), 大小(size), 位寬(bankwidth), 虛擬基地址(virt) */
40     s3c_nor_map->name = "s3c_nor";
41     s3c_nor_map->phys = 0;
42     s3c_nor_map->size = 0x1000000; /* >= NOR的真正大小 */
43     s3c_nor_map->bankwidth = 2;
44     s3c_nor_map->virt = ioremap(s3c_nor_map->phys, s3c_nor_map->size);
45 
46     simple_map_init(s3c_nor_map);
47     
48     /* 3. 使用: 調用NOR FLASH協議層提供的函數來識別 */
49     printk("use cfi_probe\n");
50     s3c_nor_mtd = do_map_probe("cfi_probe", s3c_nor_map);
51     if (!s3c_nor_mtd)
52     {
53         printk("use jedec_probe\n");
54         s3c_nor_mtd = do_map_probe("jedec_probe", s3c_nor_map);
55     }
56 
57     if (!s3c_nor_mtd)
58     {        
59         iounmap(s3c_nor_map->virt);
60         kfree(s3c_nor_map);
61         return -EIO;
62     }
63     
64     /* 4. add_mtd_partitions */
65     add_mtd_partitions(s3c_nor_mtd, s3c_nor_parts, 2);
66     
67     return 0;
68 }
69 
70 static void s3c_nor_exit(void)
71 {
72     del_mtd_partitions(s3c_nor_mtd);
73     iounmap(s3c_nor_map->virt);
74     kfree(s3c_nor_map);
75 }
76 
77 module_init(s3c_nor_init);
78 module_exit(s3c_nor_exit);
79 
80 MODULE_LICENSE("GPL");
View Code

 

 1 測試1:通過配置內核支持NOR FLASH
 2 1. make menuconfig
 3 -> Device Drivers
 4   -> Memory Technology Device (MTD) support
 5     -> Mapping drivers for chip access
 6     <M> CFI Flash device in physical memory map
 7     (0x0) Physical start address of flash mapping  // 物理基地址
 8     (0x1000000) Physical length of flash mapping   // 長度
 9     (2)   Bank width in octets (NEW)               // 位寬
10     
11 2. make modules
12    cp drivers/mtd/maps/physmap.ko /work/nfs_root/first_fs
13 3. 啟動開發板
14    ls /dev/mtd*
15    insmod physmap.ko
16    ls /dev/mtd*
17    cat /proc/mtd
18 
19 測試2: 使用自己寫的驅動程式:
20 
21 1. ls /dev/mtd*
22 2. insmod s3c_nor.ko
23 3. ls /dev/mtd*
24 4. 格式化: flash_eraseall -j /dev/mtd1
25 5. mount -t jffs2 /dev/mtdblock1 /mnt
26    在/mnt目錄下操作文件
測試方法

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • IP:10.104.0.101 [root@localhost network-scripts]# cat ifcfg-em1 [root@localhost network-scripts]# iptables -F [root@localhost network-scripts]# iptabl ...
  • 配置環境: 操作系統:Windows Server 2003 sp2企業版 Web伺服器:系統自帶的IIS6.0 所需工具: PHP:php-5.2.12-Win32.zip(官方網址:http://www.php.net) 資料庫:mysql-5.0.22-win32.zip(官方網址:http: ...
  • 用MSI安裝包安裝 根據自己的操作系統下載對應的32位或64位安裝包。按如下步驟操作: MySQL資料庫官網的下載地址http://dev.mysql.com/downloads/mysql,第一步: 安裝許可 雙擊安裝文件,在如下圖所示界面中勾選“I accept the license term ...
  • 這篇文章將對linux下udp socket編程重要知識點進行總結,無論是開發人員應知應會的,還是說udp socket的一些偏僻知識點,本文都會講到。儘可能做到,讀了一篇文章之後,大家對udp socket有一個比較全面的認識。本文分為兩個專題,第一個是常用的upd socket框架,第二個是一些 ...
  • redhat 的更新包只對註冊的用戶生效,所以我們需要自己手動更改成CentOS 的更新包,CentOS幾乎和redhat是一樣的,所以無需擔心軟體包是否可安裝,安裝之後是否有問題。 ...
  • linux教學輔助訓練(第二階段) 標簽(空格分隔):Linux輔助訓練 [更多資料點我查看][1] 提示 :本階段性練習題是對《實戰教學筆記》相應章節知識的歸納與擴展部分,必須要會,是面試前必須重溫的一套基礎練習。(第一階段即為實戰教學筆記第四節 Linux命令基礎)。 一,問答考試 1.1 解釋 ...
  • 第十節 正則表達式 標簽(空格分隔):Linux實戰教學筆記 [更多資料點我查看][1] 第1章 什麼是正則表達式 1. 正則表達式就是為了處理大量的文本|字元串而定義的一套規則和方法 2. 通過定義的這些特殊符號的輔助,系統管理員就可以快速過濾,替換或輸出需要的字元串。Linux正則表達式一般以行 ...
  • 這裡說的“後門”並不是教你做壞事,而是讓你做好事,搭建自己的調試工具更好地進行調試開發。我們都知道,當程式發生異常錯誤時,我們需要定位到錯誤,有時我們還想,我們在不修改程式的前提下,就能通過log來定位錯誤呢?有人會說,我在我的程式裡加多點列印就好了,程式每做一步我就加一行列印,到時一查log就知道 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...