關(guān)于嵌入式設(shè)備上的Linux 系統(tǒng)開(kāi)發(fā)
};
setup_arch 還需要對(duì)閃存存儲(chǔ)庫(kù)、系統(tǒng)寄存器和其它特定設(shè)備執(zhí)行內(nèi)存映射。一旦完成了特定于體系結(jié)構(gòu)的設(shè)置,控制就返回到初始化系統(tǒng)其余部分的 start_kernel 函數(shù)。這些附加的初始化任務(wù)包含:
設(shè)置陷阱
初始化中斷
初始化計(jì)時(shí)器
初始化控制臺(tái)
調(diào)用 mem_init ,它計(jì)算各種區(qū)域、高內(nèi)存區(qū)等內(nèi)的頁(yè)面數(shù)量
初始化 slab 分配器并為 VFS、緩沖區(qū)高速緩存等創(chuàng)建 slab 高速緩存
建立各種文件系統(tǒng),如 proc、ext2 和 JFFS2
創(chuàng)建 kernel_thread ,它執(zhí)行文件系統(tǒng)中的 init 命令并顯示 lign 提示符。 如果在 /bin、/sbin 或 /etc 中沒(méi)有 init 程序,那么內(nèi)核將執(zhí)行文件系統(tǒng)的 /bin 中的 shell。
設(shè)備驅(qū)動(dòng)程序
嵌入式系統(tǒng)通常有許多設(shè)備用于與用戶交互,象觸摸屏、小鍵盤(pán)、滾動(dòng)輪、傳感器、RA232 接口、LCD 等等。除了這些設(shè)備外,還有許多其它專用設(shè)備,包括閃存、USB、GSM 等。內(nèi)核通過(guò)所有這些設(shè)備各自的設(shè)備驅(qū)動(dòng)程序來(lái)控制它們,包括 GUI 用戶應(yīng)用程序也通過(guò)訪問(wèn)這些驅(qū)動(dòng)程序來(lái)訪問(wèn)設(shè)備。本節(jié)著重討論通常幾乎在每個(gè)嵌入式環(huán)境中都會(huì)使用的一些重要設(shè)備的設(shè)備驅(qū)動(dòng)程序。
幀緩沖區(qū)驅(qū)動(dòng)程序
這是最重要的驅(qū)動(dòng)程序之一,因?yàn)橥ㄟ^(guò)這個(gè)驅(qū)動(dòng)程序才能使系統(tǒng)屏幕顯示內(nèi)容。幀緩沖區(qū)驅(qū)動(dòng)程序通常有三層。最底層是基本控制臺(tái)驅(qū)動(dòng)程序 drivers/char/console.c,它提供了文本控制臺(tái)常規(guī)接口的一部分。通過(guò)使用控制臺(tái)驅(qū)動(dòng)程序函數(shù),我們能將文本打印到屏幕上 D 但圖形或動(dòng)畫(huà)還不能(這樣做需要使用視頻模式功能,通常出現(xiàn)在中間層,也就是 drivers/video/fbcon.c 中)。這個(gè)第二層驅(qū)動(dòng)程序提供了視頻模式中繪圖的常規(guī)接口。
幀緩沖區(qū)是顯卡上的內(nèi)存,需要將它內(nèi)存映射到用戶空間以便可以將圖形和文本能寫(xiě)到這個(gè)內(nèi)存段上:然后這個(gè)信息將反映到屏幕上。幀緩沖區(qū)支持提高了繪圖的速度和整體性能。這也是頂層驅(qū)動(dòng)程序引人注意之處:頂層是非常特定于硬件的驅(qū)動(dòng)程序,它需要支持顯卡不同的硬件方面 D 象啟用/禁用顯卡控制器、深度和模式的支持以及調(diào)色板等。所有這三層都相互依賴以實(shí)現(xiàn)正確的視頻功能。與幀緩沖區(qū)有關(guān)的設(shè)備是 /dev/fb0(主設(shè)備號(hào) 29,次設(shè)備號(hào) 0)。
輸入設(shè)備驅(qū)動(dòng)程序
可觸摸板是用于嵌入式設(shè)備的最基本的用戶交互設(shè)備之一 D 小鍵盤(pán)、傳感器和滾動(dòng)輪也包含在許多不同設(shè)備中以用于不同的用途。
觸摸板設(shè)備的主要功能是隨時(shí)報(bào)告用戶的觸摸,并標(biāo)識(shí)觸摸的坐標(biāo)。這通常在每次發(fā)生觸摸時(shí),通過(guò)生成一個(gè)中斷來(lái)實(shí)現(xiàn)。
然后,這個(gè)設(shè)備驅(qū)動(dòng)程序的角色是每當(dāng)出現(xiàn)中斷時(shí)就查詢觸摸屏控制器,并請(qǐng)求控制器發(fā)送觸摸的坐標(biāo)。一旦驅(qū)動(dòng)程序接收到坐標(biāo),它就將有關(guān)觸摸和任何可用數(shù)據(jù)的信號(hào)發(fā)送給用戶應(yīng)用程序,并將數(shù)據(jù)發(fā)送給應(yīng)用程序(如果可能的話)。然后用戶應(yīng)用程序根據(jù)它的需要處理數(shù)據(jù)。
幾乎所有輸入設(shè)備 D 包括小鍵盤(pán) D 都以類(lèi)似原理工作。
閃存 MTD 驅(qū)動(dòng)程序
MTD 設(shè)備是象閃存芯片、小型閃存卡、記憶棒等之類(lèi)的設(shè)備,它們?cè)谇度胧皆O(shè)備中的使用正在不斷增長(zhǎng)。
MTD 驅(qū)動(dòng)程序是在 Linux 下專門(mén)為嵌入式環(huán)境開(kāi)發(fā)的新的一類(lèi)驅(qū)動(dòng)程序。相對(duì)于常規(guī)塊設(shè)備驅(qū)動(dòng)程序,使用 MTD 驅(qū)動(dòng)程序的主要優(yōu)點(diǎn)在于 MTD 驅(qū)動(dòng)程序是專門(mén)為基于閃存的設(shè)備所設(shè)計(jì)的,所以它們通常有更好的支持、更好的管理和基于扇區(qū)的擦除和讀寫(xiě)操作的更好的接口。Linux 下的 MTD 驅(qū)動(dòng)程序接口被劃分為兩類(lèi)模塊:用戶模塊和硬件模塊。
用戶模塊
這些模塊提供從用戶空間直接使用的接口:原始字符訪問(wèn)、原始?jí)K訪問(wèn)、FTL(閃存轉(zhuǎn)換層,F(xiàn)lash Transition Layer D 用在閃存上的一種文件系統(tǒng))和 JFS(即日志文件系統(tǒng),Journaled File System D 在閃存上直接提供文件系統(tǒng)而不是模擬塊設(shè)備)。用于閃存的 JFS 的當(dāng)前版本是 JFFS2(稍后將在本文中描述)。
硬件模塊
這些模塊提供對(duì)內(nèi)存設(shè)備的物理訪問(wèn),但并不直接使用它們。通過(guò)上述的用戶模塊來(lái)訪問(wèn)它們。這些模塊提供了在閃存上讀、擦除和寫(xiě)操作的實(shí)際例程。
MTD 驅(qū)動(dòng)程序設(shè)置
為了訪問(wèn)特定的閃存設(shè)備并將文件系統(tǒng)置于其上,需要將 MTD 子系統(tǒng)編譯到內(nèi)核中。這包括選擇適當(dāng)?shù)?MTD 硬件和用戶模塊。當(dāng)前,MTD 子系統(tǒng)支持為數(shù)眾多的閃存設(shè)備 D 并且有越來(lái)越多的驅(qū)動(dòng)程序正被添加進(jìn)來(lái)以用于不同的閃存芯片。
有兩個(gè)流行的用戶模塊可啟用對(duì)閃存的訪問(wèn): MTD_CHAR 和 MTD_BLOCK 。
MTD_CHAR 提供對(duì)閃存的原始字符訪問(wèn),而 MTD_BLOCK 將閃存設(shè)計(jì)為可以在上面創(chuàng)建文件系統(tǒng)的常規(guī)塊設(shè)備(象 IDE 磁盤(pán))。與 MTD_CHAR 關(guān)聯(lián)的設(shè)備是 /dev/mtd0、mtd1、mtd2(等等),而與 MTD_BLOCK 關(guān)聯(lián)的設(shè)備是 /dev/mtdblock0、mtdblock1(等等)。由于 MTD_BLOCK 設(shè)備提供象塊設(shè)備那樣的模擬,通常更可取的是在這個(gè)模擬基礎(chǔ)上創(chuàng)建象 FTL 和 JFFS2 那樣的文件系統(tǒng)。
為了進(jìn)行這個(gè)操作,可能需要?jiǎng)?chuàng)建分區(qū)表將閃存設(shè)備分拆到引導(dǎo)裝載程序節(jié)、內(nèi)核節(jié)和文件系統(tǒng)節(jié)中。樣本分區(qū)表可能包含以下信息:
清單 5. MTD 的簡(jiǎn)單閃存設(shè)備分區(qū)
struct mtd_partition sample_partition = {
{
/* First partition */
name : bootloader, /* Bootloader section */
size : 0x00010000, /* Size */
offset : 0, /* Offset from start of flash- location 0x0*/
mask_flags : MTD_WRITEABLE /* This partition is not writable */
},
{ /* Second partition */
name : Kernel, /* Kernel section */
size : 0x00100000, /* Size */
offset : MTDPART_OFS_APPEND, /* Append after bootloader section */
mask_flags : MTD_WRITEABLE /* This partition is not writable */
},
{ /* Third partition */
name : JFFS2, /* JFFS2 filesystem */
size : MTDPART_SIZ_FULL, /* Occupy rest of flash */
offset : MTDPART_OFS_APPEND /* Append after kernel section */
}
}
上面的分區(qū)表使用了 MTD_BLOCK 接口對(duì)閃存設(shè)備進(jìn)行分區(qū)。這些分區(qū)的設(shè)備節(jié)點(diǎn)是:
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論