国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

通用型引導(dǎo)裝載程序中閃存驅(qū)動(dòng)的設(shè)計(jì)

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

葉漢能,姚茂群,趙武鋒

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

0 引言

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

1 通用型引導(dǎo)裝載程序中常用的閃存

閃存是目前嵌入式系統(tǒng)中的主流存儲(chǔ)器件,主要有NOR Flash和NAND Flash兩種類(lèi)型。因此通用型引導(dǎo)裝載程序一般需要在移植時(shí)方便地支持這兩種類(lèi)型的閃存。

NOR Flash分別提供地址總線(xiàn)和數(shù)據(jù)總線(xiàn),讀操作類(lèi)似于隨機(jī)存取存儲(chǔ)器,程序可在片內(nèi)執(zhí)行。為了避免每個(gè)閃存設(shè)備都要不同的驅(qū)動(dòng),閃存制造商提出了公共閃存接口標(biāo)準(zhǔn),使得系統(tǒng)軟件可方便地查詢(xún)閃存內(nèi)的參數(shù)。NAND Flash為大容量?jī)?nèi)存的實(shí)現(xiàn)提供了良好的解決方案[5],它共用地址線(xiàn)與數(shù)據(jù)線(xiàn),內(nèi)部數(shù)據(jù)以塊為單位存儲(chǔ),因此無(wú)法像NOR Flash一樣簡(jiǎn)單地進(jìn)行數(shù)據(jù)的隨機(jī)訪(fǎng)問(wèn)。讀寫(xiě)操作可以頁(yè)為單位進(jìn)行,但擦除操作必須以塊為單位。

2 Linux的MTD技術(shù)

Linux的MTD設(shè)備是基于閃存抽象出來(lái)的,主要目的是為存儲(chǔ)器件設(shè)計(jì)通用的子系統(tǒng),在硬件驅(qū)動(dòng)和文件系統(tǒng)間提供通用的接口[6,7],通過(guò)該子系統(tǒng)存儲(chǔ)設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)更加簡(jiǎn)單。

2.1MTD 概述

傳統(tǒng)的Unix系統(tǒng)只識(shí)別塊設(shè)備和字符設(shè)備,字符設(shè)備的訪(fǎng)問(wèn)以字節(jié)流的方式進(jìn)行,塊設(shè)備以塊為單位進(jìn)行。閃存并不符合兩者要求,它以塊為單位訪(fǎng)問(wèn),但與塊設(shè)備不同的是它區(qū)分寫(xiě)和擦除。MTD設(shè)備專(zhuān)門(mén)針對(duì)閃存的特點(diǎn)而產(chǎn)生。塊設(shè)備和MTD設(shè)備的對(duì)比如表1所示。

表1 塊設(shè)備和MTD設(shè)備對(duì)比

2.2 MTD技術(shù)的組織結(jié)構(gòu)

MTD技術(shù)將從面向文件系統(tǒng)的接口到底層硬件的基本操作之間的內(nèi)容分為4層:設(shè)備節(jié)點(diǎn)、MTD設(shè)備層、MTD原始設(shè)備層和硬件驅(qū)動(dòng)層[7]。MTD層的結(jié)構(gòu)圖如圖1所示。

圖1 MTD層結(jié)構(gòu)圖

對(duì)MTD設(shè)備的操作,首先需要確定設(shè)備號(hào),以此來(lái)確定操作的MTD設(shè)備對(duì)象。Linux中建立了MTD字符設(shè)備節(jié)點(diǎn)和MTD塊設(shè)備節(jié)點(diǎn),因此通過(guò)設(shè)備節(jié)點(diǎn)層可訪(fǎng)問(wèn)對(duì)應(yīng)的MTD設(shè)備。

MTD設(shè)備層分成字符設(shè)備和塊設(shè)備[8]。節(jié)點(diǎn)層的節(jié)點(diǎn)號(hào)對(duì)應(yīng)相應(yīng)的設(shè)備層設(shè)備,每一個(gè)設(shè)備層設(shè)備又對(duì)應(yīng)相應(yīng)的原始設(shè)備層設(shè)備。MTD字符設(shè)備注冊(cè)了一系列統(tǒng)一的文件操作函數(shù),如open、read、write等,這些函數(shù)基于原始設(shè)備層的基本操作實(shí)現(xiàn)。MTD塊設(shè)備則定義了結(jié)構(gòu)mtdblk_dev來(lái)對(duì)自身進(jìn)行描述,并通過(guò)一個(gè)mtdblks數(shù)組管理mtdblk_dev。

MTD為每一個(gè)原始設(shè)備定義結(jié)構(gòu)體mtd_info來(lái)描述其操作函數(shù)及信息。所有原始設(shè)備的mtd_info結(jié)構(gòu)體用mtd_table指向的結(jié)構(gòu)體數(shù)組統(tǒng)一管理。原始設(shè)備與具體設(shè)備的映射由結(jié)構(gòu)體map_info描述,它包括了指向驅(qū)動(dòng)程序結(jié)構(gòu)體mtd_chip_driver的指針。

硬件驅(qū)動(dòng)層負(fù)責(zé)驅(qū)動(dòng)具體的閃存設(shè)備,為上層提供不同閃存設(shè)備最基本的操作。

3 通用型引導(dǎo)裝載程序中閃存驅(qū)動(dòng)的設(shè)計(jì)

參照Linux中MTD技術(shù)的設(shè)計(jì)思路,本驅(qū)動(dòng)方案主要考慮4點(diǎn):驅(qū)動(dòng)結(jié)構(gòu)的分層,各層包括的內(nèi)容及相互間關(guān)系的確定,讀、寫(xiě)、擦除等函數(shù)的建立,初始化過(guò)程的實(shí)現(xiàn)。

(1)驅(qū)動(dòng)結(jié)構(gòu)的分層

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

(2)各層中的主要內(nèi)容及相互關(guān)系

設(shè)備層為上層應(yīng)用提供了統(tǒng)一的操作接口:read()、write()、erase()等,這些函數(shù)根據(jù)特定的原始設(shè)備信息調(diào)用原始設(shè)備層結(jié)構(gòu)體mtd_info中相應(yīng)的函數(shù)實(shí)現(xiàn)。

原始設(shè)備層主要為每個(gè)Flash設(shè)備抽象出一個(gè)原始設(shè)備,定義原始設(shè)備結(jié)構(gòu)體mtd_info來(lái)組織原始設(shè)備對(duì)應(yīng)的信息和操作函數(shù)。該結(jié)構(gòu)體的主要成員如下:

mtd_info結(jié)構(gòu)體中type域指示了該原始設(shè)備層設(shè)備的類(lèi)型,函數(shù)指針(如*read、*write等)根據(jù)該類(lèi)型指向不同設(shè)備在原始設(shè)備層的操作函數(shù)。

mtd_info結(jié)構(gòu)體的priv指針指向該原始設(shè)備層設(shè)備對(duì)應(yīng)的具體閃存芯片的硬件驅(qū)動(dòng)層結(jié)構(gòu)體,如NAND Flash的結(jié)構(gòu)體主要成員如下:

硬件驅(qū)動(dòng)層結(jié)構(gòu)體中的函數(shù)指針指向具體閃存的最基本操作函數(shù)。

(3)讀、寫(xiě)、擦除等函數(shù)的建立

設(shè)備層的通用接口函數(shù)調(diào)用原始設(shè)備層的讀、寫(xiě)、擦除等函數(shù)實(shí)現(xiàn),而這些原始設(shè)備層的函數(shù)基于硬件驅(qū)動(dòng)層的基本操作函數(shù)實(shí)現(xiàn)。設(shè)備驅(qū)動(dòng)層的基本操作函數(shù)則需要根據(jù)具體閃存芯片,采用專(zhuān)門(mén)的訪(fǎng)問(wèn)方式來(lái)實(shí)現(xiàn)。

(4)驅(qū)動(dòng)的初始化

圖2 驅(qū)動(dòng)框架及主要結(jié)構(gòu)體

初始化過(guò)程由初始化函數(shù)完成。針對(duì)閃存參數(shù)的初始化,本驅(qū)動(dòng)以結(jié)構(gòu)體的方式為每種被支持的閃存封裝特定參數(shù),并將所有這些封裝后的參數(shù)結(jié)構(gòu)體組成結(jié)構(gòu)體數(shù)組,作為一張閃存信息表。根據(jù)閃存標(biāo)準(zhǔn)接口設(shè)計(jì)掃描函數(shù),用于在初始化時(shí)讀取閃存內(nèi)固化的參數(shù),或者讀取制造商ID并與信息表對(duì)照,得到相應(yīng)的閃存參數(shù),完成驅(qū)動(dòng)中閃存參數(shù)的初始化。這種方法可以使得驅(qū)動(dòng)支持的芯片在初始化時(shí)被自動(dòng)識(shí)別,增加了驅(qū)動(dòng)的靈活性和通用性。

本文驅(qū)動(dòng)方案的框架以及主要結(jié)構(gòu)體之間的關(guān)系如圖2所示。

4 驗(yàn)證

根據(jù)本驅(qū)動(dòng)設(shè)計(jì)方案開(kāi)發(fā)引導(dǎo)裝載程序,并分別在2套開(kāi)發(fā)平臺(tái)下進(jìn)行了驗(yàn)證:平臺(tái)1中CPU為Samsung公司的以ARM920T為內(nèi)核的S3C2440芯片,閃存芯片為Samsung公司的K9F1208 NAND Flash;平臺(tái)2中CPU為Samsung公司的以ARM920T為內(nèi)核的S3C2410芯片,閃存芯片為Intel公司的28F128J3A NOR Flash。采用GDB和JTAG為基礎(chǔ)的工具鏈進(jìn)行調(diào)試,關(guān)鍵代碼處單步執(zhí)行。調(diào)試結(jié)果證明驅(qū)動(dòng)能自動(dòng)識(shí)別不同芯片,并對(duì)相應(yīng)芯片提供良好的支持。引導(dǎo)裝載程序的閃存驅(qū)動(dòng)程序在平臺(tái)1上調(diào)試過(guò)程中函數(shù)的調(diào)用流程如圖3所示。

圖3 驅(qū)動(dòng)程序函數(shù)調(diào)用流程圖

5 結(jié)束語(yǔ)

常用的引導(dǎo)裝載程序在使用時(shí)一般在要針對(duì)系統(tǒng)中具體的閃存芯片進(jìn)行相應(yīng)的配置和修改,編譯后往往只支持同類(lèi)型的個(gè)別芯片。本方案設(shè)計(jì)的驅(qū)動(dòng)提供自動(dòng)識(shí)別閃存芯片的能力,按照實(shí)際閃存芯片完成驅(qū)動(dòng)的初始化,在不進(jìn)行重新配置的前提下,擴(kuò)展了對(duì)不同種類(lèi)閃存芯片的支持。由于引導(dǎo)裝載程序功能的擴(kuò)展,高層模塊需要涉及更多的策略,因此本方案運(yùn)用Linux中MTD技術(shù)的設(shè)計(jì)思想,結(jié)合通用型引導(dǎo)裝載程序的特點(diǎn),進(jìn)行了合理的分層,從而對(duì)高層屏蔽了低層實(shí)現(xiàn)的細(xì)節(jié)。該方案結(jié)構(gòu)清晰,通用性好,易于升級(jí)和維護(hù)。

[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ī)制的分析與移植[J].計(jì)算機(jī)工程,2010,36(6):267-269.

[3] 高冰,楊名利,沈毅,等.基于A(yíng)RM9的恒壓恒速雙缸泵控制系統(tǒng)[J].計(jì)算機(jī)工程,2009,35(12):211-213.

[4] 劉浩,鄒雪城,李鵬,等.無(wú)線(xiàn)傳感器網(wǎng)絡(luò)終端引導(dǎo)程序設(shè)計(jì)[J].計(jì)算機(jī)工程,2010,36(2):33-35.

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

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

[7] 唐衛(wèi)明.大容量NAND閃存存儲(chǔ)管理研究[D].長(zhǎng)沙:國(guó)防科學(xué)技術(shù)大學(xué),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.

猜你喜歡
通用型基本操作芯片
芯片會(huì)議
致廣大 盡精微——實(shí)驗(yàn)基本操作與氧氣的實(shí)驗(yàn)室制取
點(diǎn)擊化學(xué)實(shí)驗(yàn)基本操作
一種新結(jié)構(gòu)的快換通用型插內(nèi)齒圈夾具
通用型LED信號(hào)機(jī)構(gòu)的應(yīng)用研究
化學(xué)常用儀器與基本操作考查
多通道采樣芯片ADS8556在光伏并網(wǎng)中的應(yīng)用
施耐德電氣睿易系列ATV310通用型變頻器
ABB通用型電動(dòng)汽車(chē)直流充電機(jī)Terra 53 Z
鉗工的基本技術(shù)與基本操作的分析與研究
上林县| 博客| 文水县| 淮北市| 光泽县| 乡宁县| 高阳县| 罗田县| 乃东县| 卢龙县| 农安县| 巴南区| 万荣县| 南康市| 安义县| 禄丰县| 海原县| 涿州市| 通榆县| 台州市| 本溪市| 山东| 贵南县| 牟定县| 安陆市| 松江区| 黔西| 韶山市| 古交市| 莱州市| 同德县| 临江市| 通海县| 博客| 潞城市| 青冈县| 青河县| 宁陕县| 双辽市| 长汀县| 垦利县|