?

通用型引導裝載程序中閃存驅動的設計

2011-09-04 06:08葉漢能姚茂群趙武鋒
關鍵詞:通用型基本操作芯片

葉漢能,姚茂群,趙武鋒

(1.杭州師范大學信息科學與工程學院,浙江杭州310036;2.浙江大學信息與電子工程學系,浙江杭州310027)

0 引言

引導裝載程序是嵌入式系統底層的引導軟件,主要作用是引導嵌入式操作系統。Linux建議引導裝載程序最基本的功能包括:初始化RAM,初始化一個串口,檢測處理器類型,建立并向內核傳遞參數列表,引導內核[1]。但以U-Boot為代表的通用型引導裝載程序的功能已遠遠超過了這些,它們擴展了多種其他功能,可以方便地在不同開發平臺上進行移植[2],降低了開發難度。閃存是目前嵌入式系統中最常用的非易失性存儲器件[3],因為其讀寫方式的特殊性,需要相應驅動的支持。通用型引導裝載程序需要支持多種類型的閃存,因此通用的閃存驅動非常有價值,而目前常用的通用型引導裝載程序缺乏明確、通用的閃存驅動[4],在移植時通常要針對特定閃存芯片進行修改。本文基于內存技術設備(Memory Technology Device,MTD)的設計思想,提出一種適合通用型引導裝載程序的閃存驅動設計方案。

1 通用型引導裝載程序中常用的閃存

閃存是目前嵌入式系統中的主流存儲器件,主要有NOR Flash和NAND Flash兩種類型。因此通用型引導裝載程序一般需要在移植時方便地支持這兩種類型的閃存。

NOR Flash分別提供地址總線和數據總線,讀操作類似于隨機存取存儲器,程序可在片內執行。為了避免每個閃存設備都要不同的驅動,閃存制造商提出了公共閃存接口標準,使得系統軟件可方便地查詢閃存內的參數。NAND Flash為大容量內存的實現提供了良好的解決方案[5],它共用地址線與數據線,內部數據以塊為單位存儲,因此無法像NOR Flash一樣簡單地進行數據的隨機訪問。讀寫操作可以頁為單位進行,但擦除操作必須以塊為單位。

2 Linux的MTD技術

Linux的MTD設備是基于閃存抽象出來的,主要目的是為存儲器件設計通用的子系統,在硬件驅動和文件系統間提供通用的接口[6,7],通過該子系統存儲設備驅動的開發更加簡單。

2.1MTD 概述

傳統的Unix系統只識別塊設備和字符設備,字符設備的訪問以字節流的方式進行,塊設備以塊為單位進行。閃存并不符合兩者要求,它以塊為單位訪問,但與塊設備不同的是它區分寫和擦除。MTD設備專門針對閃存的特點而產生。塊設備和MTD設備的對比如表1所示。

表1 塊設備和MTD設備對比

2.2 MTD技術的組織結構

MTD技術將從面向文件系統的接口到底層硬件的基本操作之間的內容分為4層:設備節點、MTD設備層、MTD原始設備層和硬件驅動層[7]。MTD層的結構圖如圖1所示。

圖1 MTD層結構圖

對MTD設備的操作,首先需要確定設備號,以此來確定操作的MTD設備對象。Linux中建立了MTD字符設備節點和MTD塊設備節點,因此通過設備節點層可訪問對應的MTD設備。

MTD設備層分成字符設備和塊設備[8]。節點層的節點號對應相應的設備層設備,每一個設備層設備又對應相應的原始設備層設備。MTD字符設備注冊了一系列統一的文件操作函數,如open、read、write等,這些函數基于原始設備層的基本操作實現。MTD塊設備則定義了結構mtdblk_dev來對自身進行描述,并通過一個mtdblks數組管理mtdblk_dev。

MTD為每一個原始設備定義結構體mtd_info來描述其操作函數及信息。所有原始設備的mtd_info結構體用mtd_table指向的結構體數組統一管理。原始設備與具體設備的映射由結構體map_info描述,它包括了指向驅動程序結構體mtd_chip_driver的指針。

硬件驅動層負責驅動具體的閃存設備,為上層提供不同閃存設備最基本的操作。

3 通用型引導裝載程序中閃存驅動的設計

參照Linux中MTD技術的設計思路,本驅動方案主要考慮4點:驅動結構的分層,各層包括的內容及相互間關系的確定,讀、寫、擦除等函數的建立,初始化過程的實現。

(1)驅動結構的分層

通用型引導裝載程序中閃存的主要操作有讀、寫、擦除等,不需要抽象出字符設備和塊設備。因此本方案層次劃分為設備層、原始設備層和硬件驅動層。

(2)各層中的主要內容及相互關系

設備層為上層應用提供了統一的操作接口:read()、write()、erase()等,這些函數根據特定的原始設備信息調用原始設備層結構體mtd_info中相應的函數實現。

原始設備層主要為每個Flash設備抽象出一個原始設備,定義原始設備結構體mtd_info來組織原始設備對應的信息和操作函數。該結構體的主要成員如下:

mtd_info結構體中type域指示了該原始設備層設備的類型,函數指針(如*read、*write等)根據該類型指向不同設備在原始設備層的操作函數。

mtd_info結構體的priv指針指向該原始設備層設備對應的具體閃存芯片的硬件驅動層結構體,如NAND Flash的結構體主要成員如下:

硬件驅動層結構體中的函數指針指向具體閃存的最基本操作函數。

(3)讀、寫、擦除等函數的建立

設備層的通用接口函數調用原始設備層的讀、寫、擦除等函數實現,而這些原始設備層的函數基于硬件驅動層的基本操作函數實現。設備驅動層的基本操作函數則需要根據具體閃存芯片,采用專門的訪問方式來實現。

(4)驅動的初始化

圖2 驅動框架及主要結構體

初始化過程由初始化函數完成。針對閃存參數的初始化,本驅動以結構體的方式為每種被支持的閃存封裝特定參數,并將所有這些封裝后的參數結構體組成結構體數組,作為一張閃存信息表。根據閃存標準接口設計掃描函數,用于在初始化時讀取閃存內固化的參數,或者讀取制造商ID并與信息表對照,得到相應的閃存參數,完成驅動中閃存參數的初始化。這種方法可以使得驅動支持的芯片在初始化時被自動識別,增加了驅動的靈活性和通用性。

本文驅動方案的框架以及主要結構體之間的關系如圖2所示。

4 驗證

根據本驅動設計方案開發引導裝載程序,并分別在2套開發平臺下進行了驗證:平臺1中CPU為Samsung公司的以ARM920T為內核的S3C2440芯片,閃存芯片為Samsung公司的K9F1208 NAND Flash;平臺2中CPU為Samsung公司的以ARM920T為內核的S3C2410芯片,閃存芯片為Intel公司的28F128J3A NOR Flash。采用GDB和JTAG為基礎的工具鏈進行調試,關鍵代碼處單步執行。調試結果證明驅動能自動識別不同芯片,并對相應芯片提供良好的支持。引導裝載程序的閃存驅動程序在平臺1上調試過程中函數的調用流程如圖3所示。

圖3 驅動程序函數調用流程圖

5 結束語

常用的引導裝載程序在使用時一般在要針對系統中具體的閃存芯片進行相應的配置和修改,編譯后往往只支持同類型的個別芯片。本方案設計的驅動提供自動識別閃存芯片的能力,按照實際閃存芯片完成驅動的初始化,在不進行重新配置的前提下,擴展了對不同種類閃存芯片的支持。由于引導裝載程序功能的擴展,高層模塊需要涉及更多的策略,因此本方案運用Linux中MTD技術的設計思想,結合通用型引導裝載程序的特點,進行了合理的分層,從而對高層屏蔽了低層實現的細節。該方案結構清晰,通用性好,易于升級和維護。

[1] Wolfgang Rominger.Intelligent sensor data logging utilizing Linux[EB/OL].http://www.imp-ortwro.at/romeo/images/Publications/abschlussarbeit.pdf,2011 - 01 - 05.

[2] 王亞剛.嵌入式Bootloader機制的分析與移植[J].計算機工程,2010,36(6):267-269.

[3] 高冰,楊名利,沈毅,等.基于ARM9的恒壓恒速雙缸泵控制系統[J].計算機工程,2009,35(12):211-213.

[4] 劉浩,鄒雪城,李鵬,等.無線傳感器網絡終端引導程序設計[J].計算機工程,2010,36(2):33-35.

[5] 王立峰,胡善清,劉峰,等.基于閃存的高速海量存儲模塊設計[J].計算機工程,2011,37(7):255-257.

[6] 韋斯,丁志剛,張偉宏.Linux下UBI子系統的研究與應用[J].計算機應用與軟件,2010,27(10):68-71.

[7] 唐衛明.大容量NAND閃存存儲管理研究[D].長沙:國防科學技術大學,2009:32-42.

[8] Woodhouse D.Memory Technology Device(MTD)Subsystem for Linux[EB/OL].http://www.linux-mtd.infradead.org/doc/general.html,2008 - 10 - 17.

猜你喜歡
通用型基本操作芯片
芯片會議
致廣大 盡精微——實驗基本操作與氧氣的實驗室制取
點擊化學實驗基本操作
一種新結構的快換通用型插內齒圈夾具
通用型LED信號機構的應用研究
化學常用儀器與基本操作考查
多通道采樣芯片ADS8556在光伏并網中的應用
施耐德電氣睿易系列ATV310通用型變頻器
ABB通用型電動汽車直流充電機Terra 53 Z
鉗工的基本技術與基本操作的分析與研究
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合