驅動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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...