當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件
[導(dǎo)讀] 引 言編寫 Linux 設(shè)備驅(qū)動(dòng)程序無(wú)疑是一項(xiàng)復(fù)雜的工作。本文將集中介紹非標(biāo)準(zhǔn)硬件的設(shè)備驅(qū)動(dòng)程序編寫,探討硬件應(yīng)用編程接口,并借用 Cirrus Logic EP9312 片上系統(tǒng)嵌入式平

 

引 言

編寫 Linux 設(shè)備驅(qū)動(dòng)程序無(wú)疑是一項(xiàng)復(fù)雜的工作。本文將集中介紹非標(biāo)準(zhǔn)硬件的設(shè)備驅(qū)動(dòng)程序編寫,探討硬件應(yīng)用編程接口,并借用 Cirrus Logic EP9312 片上系統(tǒng)嵌入式平臺(tái)添加設(shè)備驅(qū)動(dòng)程序這一案例來(lái)進(jìn)行分析。

如果有些編程內(nèi)容未能在本文中涉及,那么讀者亦可以查閱相似的設(shè)備驅(qū)動(dòng)程序編碼,以做參考。還有一種方法,就是檢索歷史檔案或者向 Linux 內(nèi)核問(wèn)訊中心去函問(wèn)訊。

Linux 概述

Linux 是 UNIX 操作系統(tǒng)的翻版,1991 年由 Linus Torvalds 最先開發(fā)出來(lái),并通過(guò)開放源代碼開發(fā)模式不斷得到開放源代碼組織的改進(jìn)。任何使用 Linux 的個(gè)人和團(tuán)體都無(wú)需支付任何版權(quán)費(fèi)用。

只有內(nèi)核還不夠,通常Linux 與一些在內(nèi)核上運(yùn)行的視窗環(huán)境、視窗管理器和應(yīng)用捆綁在一起。然而,由于具備了嵌入式平臺(tái),視窗環(huán)境并非必不可少。與微軟的視窗操作系統(tǒng)不同的是,Linux 并不需要一套固定的、必須采用的應(yīng)用軟件或?qū)嵱贸绦?,因此能夠十分符合嵌入式市?chǎng)終端解決方案的客制化要求。

操作系統(tǒng)最基本的組成部分包括 1個(gè)資源管理器、1個(gè)調(diào)度程序、1個(gè)介于硬件和應(yīng)用軟件之間的接口、1個(gè)網(wǎng)絡(luò)管理器和 1 個(gè)文檔系統(tǒng)管理器。Linux操作系統(tǒng)也包括這些組成部分,當(dāng)然還有其他部分。本文主要闡述介于硬件和應(yīng)用軟件之間的接口--設(shè)備驅(qū)動(dòng)程序。

設(shè)備驅(qū)動(dòng)程序類型

設(shè)備驅(qū)動(dòng)程序可分為2大類:硬件設(shè)備驅(qū)動(dòng)程序和軟件設(shè)備驅(qū)動(dòng)程序。硬件設(shè)備驅(qū)動(dòng)程序和物理硬件設(shè)備相連接,如UART設(shè)備或IDE設(shè)備,而軟件設(shè)備驅(qū)動(dòng)程序則作為低級(jí)數(shù)據(jù)結(jié)構(gòu)間的接口,或硬件設(shè)備驅(qū)動(dòng)程序和高級(jí)數(shù)據(jù)結(jié)構(gòu)間的接口。圖形控制臺(tái)驅(qū)動(dòng)程序就是一個(gè)軟件設(shè)備驅(qū)動(dòng)程序。其中,1個(gè)LCD控制器驅(qū)動(dòng)程序裝載并管理該顯示器,同時(shí)圖形控制臺(tái)對(duì)即將顯示的字符進(jìn)行著色,并獲取從鍵盤輸入的信息。軟件設(shè)備驅(qū)動(dòng)程序的另一個(gè)例子是文檔系統(tǒng)執(zhí)行--文檔系統(tǒng)驅(qū)動(dòng)程序采用1個(gè)硬盤驅(qū)動(dòng)程序存儲(chǔ)數(shù)據(jù),而該硬盤驅(qū)動(dòng)程序直接與物理硬盤相連接。

設(shè)備驅(qū)動(dòng)程序的分類

Linux 設(shè)備驅(qū)動(dòng)程序有幾類:字符、區(qū)塊、網(wǎng)絡(luò)和其他。通常,驅(qū)動(dòng)程序根據(jù)設(shè)備的訪問(wèn)方式分類。然而,也有些設(shè)備無(wú)法按照此類方式得到區(qū)分,因此被歸到"其他類型"。字符設(shè)備包括那些使數(shù)據(jù)成為數(shù)據(jù)流的設(shè)備,可通過(guò)1個(gè)文檔系統(tǒng)的特殊文件獲得(文檔系統(tǒng)的特殊文件將在后文中加以討論)。鑒于字符設(shè)備的特性,該設(shè)備只能根據(jù)順序訪問(wèn)數(shù)據(jù),即無(wú)法往前或往后搜索數(shù)據(jù)。串行端口和音頻設(shè)備都是這種類型。圖2是Cirrus Logic的EP9312 片上系統(tǒng)結(jié)構(gòu)圖,其中Linux字符設(shè)備以綠色標(biāo)出。

區(qū)塊設(shè)備能夠照管1個(gè)文檔系統(tǒng)。該類設(shè)備和字符設(shè)備一樣,也是通過(guò)文檔系統(tǒng)特殊文件訪問(wèn)。但是,區(qū)塊設(shè)備與文檔設(shè)備的差異在于其可被隨機(jī)訪問(wèn)。這意味著,應(yīng)用軟件可查找在該設(shè)備中的隨機(jī)位置。硬盤驅(qū)動(dòng)器和CD驅(qū)動(dòng)器都是區(qū)塊設(shè)備,它們內(nèi)部的文件指針可以指向設(shè)備內(nèi)部的任何位置,惟一的限制來(lái)自設(shè)備本身。當(dāng)區(qū)塊設(shè)備通過(guò)文檔系統(tǒng)特殊文件訪問(wèn)時(shí),該應(yīng)用接口即同字符設(shè)備一樣,只是與內(nèi)核的接口有所差別而已。圖2中的紅色部分即為Cirrus Logic EP9312 片上系統(tǒng)結(jié)構(gòu)中Linux區(qū)塊設(shè)備。

網(wǎng)絡(luò)接口設(shè)備既可以是硬件設(shè)備,也可以是軟件設(shè)備。硬件設(shè)備如以太網(wǎng)卡,軟件設(shè)備如低端網(wǎng)絡(luò)協(xié)議堆棧(本文將此類接口視為軟件設(shè)備)。中間件和協(xié)議堆棧有時(shí)會(huì)被看作是軟件設(shè)備。網(wǎng)絡(luò)接口設(shè)備是信息包數(shù)據(jù)的通信設(shè)備,一般擁有惟一名稱,并且無(wú)法通過(guò)文檔系統(tǒng)特殊文件訪問(wèn)。相反,它們只對(duì)內(nèi)核網(wǎng)絡(luò)堆棧開放。通常,用戶級(jí)應(yīng)用軟件可訪問(wèn)內(nèi)核網(wǎng)絡(luò)堆棧,而不能訪問(wèn)網(wǎng)絡(luò)接口設(shè)備。圖2中的藍(lán)色部分即為Cirrus Logic EP9312 片上系統(tǒng)結(jié)構(gòu)中的Linux網(wǎng)絡(luò)接口設(shè)備。

其他的設(shè)備驅(qū)動(dòng)程序還包括數(shù)據(jù)總線驅(qū)動(dòng)程序(USB, I2C, AMBA等)、 /proc 接口和視頻驅(qū)動(dòng)程序。這些類型的設(shè)備無(wú)法被歸入以上的3個(gè)類型中,但仍然是與Linux內(nèi)核接口的設(shè)備驅(qū)動(dòng)程序。

 

 

文檔系統(tǒng)特殊文件

文檔系統(tǒng)特殊文件提供了從文檔系統(tǒng)訪問(wèn)硬件設(shè)備的可行性。這些訪問(wèn)點(diǎn)使用mknod 命令在文檔系統(tǒng)/dev 目錄中生成。命令如下:mknod 。

其中, 是給予硬件設(shè)備的名稱,如 /dev/hda1 是給予硬盤驅(qū)動(dòng)器的通用名稱。 是設(shè)備驅(qū)動(dòng)程序的類型--字符(char)、區(qū)塊等。 代表設(shè)備類別和與之相配的驅(qū)動(dòng)程序。 表示設(shè)備類別中的一個(gè)實(shí)例,并僅對(duì)設(shè)備驅(qū)動(dòng)程序適用。例如,某個(gè)系統(tǒng)中同時(shí)采用2個(gè)硬盤驅(qū)動(dòng)器,它們都具有同樣的主要編號(hào),使用同樣的設(shè)備驅(qū)動(dòng)軟件,但是該設(shè)備驅(qū)動(dòng)程序軟件卻會(huì)在內(nèi)部根據(jù)次要編號(hào)區(qū)分這2個(gè)硬盤驅(qū)動(dòng)器。

值得注意的是,并非所有的設(shè)備都執(zhí)行特殊文件接口。如同本文前面已經(jīng)提及的,網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序就不采用這種接口訪問(wèn)設(shè)備。

這種情況下,在設(shè)備文檔系統(tǒng)里,就會(huì)使用 devfs來(lái)獲得文檔設(shè)備特殊文件。devfs 目前廣受歡迎,但仍然還不是內(nèi)核的默認(rèn)功能。如果采用devfs 文檔系統(tǒng),那么就無(wú)需mknod 來(lái)生成特殊文件了。相反,設(shè)備驅(qū)動(dòng)程序軟件會(huì)使用直接的devfs 文檔系統(tǒng)接口在空閑時(shí)刻或者設(shè)備剛被初始化時(shí)生成特殊文件。

編程實(shí)例概述

為便于示范非標(biāo)準(zhǔn)嵌入式平臺(tái)的Linux設(shè)備驅(qū)動(dòng)程序,本文將說(shuō)明EP9312的設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)情況。其中,EP9312 IDE設(shè)備驅(qū)動(dòng)程序是區(qū)塊設(shè)備, EP9312觸摸屏為字符設(shè)備,代碼中的高級(jí)API/硬件接口、初始化序列和應(yīng)用軟件編碼均將予以說(shuō)明。

字符設(shè)備驅(qū)動(dòng)程序?qū)嵗河|摸屏設(shè)備驅(qū)動(dòng)程序

EP9312觸摸屏控制器因其數(shù)據(jù)只能按順序獲取而被列為L(zhǎng)inux字符設(shè)備。觸摸屏字符驅(qū)動(dòng)程序的執(zhí)行是相當(dāng)簡(jiǎn)單的--設(shè)備向操作系統(tǒng)注冊(cè),并通過(guò)文檔系統(tǒng)特殊文件進(jìn)行訪問(wèn)。有關(guān)硬件代碼包含在文檔操作表的一套函數(shù)中。我們將從內(nèi)核初始化開始,解釋該驅(qū)動(dòng)程序的執(zhí)行情況。

初始化EP9312觸摸屏的函數(shù)是:

 int __init ep93xx_ts_init(void)
[!--empirenews.page--]

該函數(shù)處理2項(xiàng)工作:當(dāng)設(shè)備被中斷驅(qū)動(dòng)時(shí)獲取設(shè)備IRQ和在操作系統(tǒng)內(nèi)注冊(cè)觸摸屏設(shè)備。

函數(shù)request_irq() 在請(qǐng)求IRQ時(shí)被調(diào)用,并注冊(cè)中斷處理器函數(shù)以在設(shè)備發(fā)生系統(tǒng)中斷時(shí)處理所需的任務(wù)。

而函數(shù) register_chrdev() 則是用來(lái)注冊(cè)字符設(shè)備的。該函數(shù)表現(xiàn)形式如下:

int register_chrdev(unsigned int major,
  const char * name,
  struct file_operations *fops)

該函數(shù)安裝了字符設(shè)備硬件的內(nèi)核接口。主要編號(hào)用于把驅(qū)動(dòng)程序映射到 /dev 目錄中的文檔系統(tǒng)特殊文件。設(shè)備被賦予一個(gè)名稱,以便內(nèi)核識(shí)辨。此外,file_operations 結(jié)構(gòu)具有對(duì)函數(shù)指針表的一個(gè)指針,該表指向硬件的相應(yīng)函數(shù)。

然而,仍然有一些字符設(shè)備不符合預(yù)先確定的字符設(shè)備范疇。這些設(shè)備就用主編號(hào)10一起歸于"其他類型",注冊(cè)設(shè)備用以下函數(shù):

 int misc_register(struct miscdevice * misc)

 

misc_register()用主編號(hào)10調(diào)用 register_chrdev(),設(shè)備名稱和函數(shù)表指針通過(guò)miscdevice數(shù)據(jù)結(jié)構(gòu)獲得。同樣,miscdevice 數(shù)據(jù)結(jié)構(gòu)還保存設(shè)備驅(qū)動(dòng)程序所使用的次要號(hào)碼。

以下是在設(shè)備驅(qū)動(dòng)程序代碼內(nèi)注冊(cè) EP9312 觸摸屏采用的函數(shù)調(diào)用:

misc_register(&ep93xx_ts_miscdev)

數(shù)據(jù)結(jié)構(gòu) ep93xx_ts_miscdev 是對(duì)觸摸屏硬件的內(nèi)核訪問(wèn),定義如下:

static struct miscdevice ep93xx_ts_miscdev = 
  {
EP93XX_TS_MINOR, /* device minor number */
"ep93xx_ts", /* name of the device */
&ep93xx_ts_fops /* device file operations */
/* table pointer */
  }

其他類型設(shè)備驅(qū)動(dòng)程序采用次要號(hào)碼區(qū)分設(shè)備。

硬件接口函數(shù)在設(shè)備驅(qū)動(dòng)器內(nèi)即被靜態(tài)定義,當(dāng)設(shè)備注冊(cè)時(shí),由內(nèi)核通過(guò)傳遞給操作系統(tǒng)的文檔操作函數(shù)指針獲得。指針列表定義如下:

static struct file_operations ep93xx_ts_fops =
  {
owner: THIS_MODULE,
read: ep93xx_ts_read,
write: ep93xx_ts_write,
poll: ep93xx_ts_poll,
open: ep93xx_ts_open,
release: ep93xx_ts_release,
fasync: ep93xx_ts_fasync,
  }

初始化觸摸屏設(shè)備后,即需創(chuàng)建文檔系統(tǒng)特殊文件,以便協(xié)助應(yīng)用程序代碼訪問(wèn)設(shè)備。創(chuàng)建 EP9312 觸摸屏特殊文件的 mknod 命令如下:

mknod /dev/misc/ep93xx_ts c 10 240

該步驟即可在根目錄系統(tǒng)下的初始化文檔初始化 Linux 時(shí)得到執(zhí)行,也可在命令提示里實(shí)現(xiàn)手動(dòng)操作。

以下是用戶級(jí)應(yīng)用代碼的一個(gè)實(shí)例,通過(guò)文檔系統(tǒng)特殊文件訪問(wèn)觸摸屏設(shè)備:

#define TS_DEV "/dev/misc/ep93xx_ts"
  int read_ts() 
  {
int fd, nbytes;
short data[3];
  fd = open("/dev/misc/ep93xx_ts", O_NONBLOCK); 
  if ( fd < 0 ) 
{
printf("Unable to open touch screen device %s!\n", TS_DEV);
exit(1);
}
nbytes = read(pd_fd, data, sizeof(data)); 
close(fd);
if (nbytes != sizeof(data)) 
return 0;
return 1;
  }
[!--empirenews.page--]

 

區(qū)塊設(shè)備驅(qū)動(dòng)器實(shí)例:IDE 設(shè)備驅(qū)動(dòng)

與 EP9312 IDE 控制器接口的 IDE 設(shè)備被劃分為 Linux 區(qū)塊設(shè)備,其中包括硬盤驅(qū)動(dòng)器和 CDROM 驅(qū)動(dòng)器。這些設(shè)備上的數(shù)據(jù)可以隨機(jī)讀取是將其劃分為區(qū)塊設(shè)備的主要原因。

與簡(jiǎn)單的觸摸屏接口執(zhí)行相比,IDE 區(qū)塊設(shè)備驅(qū)動(dòng)器是相當(dāng)復(fù)雜的。該設(shè)備驅(qū)動(dòng)器被分成幾部分,包括 IDE 區(qū)塊設(shè)備內(nèi)核接口、為 IDE 控制器設(shè)置的內(nèi)部驅(qū)動(dòng)器硬件接口(附加的獨(dú)立 IDE 設(shè)備多達(dá) 4 個(gè))、針對(duì)硬盤、軟盤等 IDE 設(shè)備類型的模塊,以及結(jié)構(gòu)特別接口。通過(guò)允許硬件或結(jié)構(gòu)特殊函數(shù)的調(diào)用,IDE 設(shè)備類型數(shù)據(jù)結(jié)構(gòu)內(nèi)的函數(shù)指針可以實(shí)現(xiàn)非標(biāo)準(zhǔn)結(jié)構(gòu)的靈活性和可延展性。圖3為IDE區(qū)塊設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)示意圖。下面從設(shè)備驅(qū)動(dòng)程序初始化開始說(shuō)明該驅(qū)動(dòng)程序。

高級(jí)IDE驅(qū)動(dòng)程序在Linux內(nèi)核初始化或模塊安裝(如果驅(qū)動(dòng)程序被設(shè)置為模塊)時(shí)得到初始化。本文不詳述高級(jí)IDE 驅(qū)動(dòng)程序初始化或安裝細(xì)節(jié),而是著重討論為初始化定制并與硬件接口的驅(qū)動(dòng)程序各片斷。在高級(jí)IDE驅(qū)動(dòng)程序初始化過(guò)程中,以下函數(shù)被用于設(shè)置IDE控制器:

static __inline__ void ide_init_default_hwifs(void)

該函數(shù)在文件中被定義為:include/asm/mach/ide.h,為非標(biāo)準(zhǔn)IDE控制器配置硬件接口數(shù)據(jù)結(jié)構(gòu),注冊(cè)高級(jí)IDE驅(qū)動(dòng)程序EP9312 IDE接口,并為接口設(shè)置IRQ。

在結(jié)構(gòu)特殊初始化代碼內(nèi)完成的IRQ設(shè)置僅僅在硬件接口數(shù)據(jù)結(jié)構(gòu)內(nèi)設(shè)置IDE接口所需的平臺(tái)IRQ號(hào)碼。調(diào)用request_irq() 由高級(jí)IDE驅(qū)動(dòng)程序負(fù)責(zé)。

IDE硬件接口數(shù)據(jù)結(jié)構(gòu)通過(guò)調(diào)用以下函數(shù)得到配置,并同時(shí)在include/asm/mach/ide.h內(nèi)得到定義:

static __inline__ void
  ide_init_hwif_ports(hw_regs_t *hw,
  int data_port,
  int ctrl_port,
  int *irq)

該函數(shù)通過(guò)設(shè)置硬件接口數(shù)據(jù)結(jié)構(gòu)內(nèi)的命令和控制注冊(cè)地址配置了非標(biāo)準(zhǔn)EP9312 IDE 接口,并設(shè)置和實(shí)現(xiàn)EP9312上的接口。

在ide_init_default_hwifs(void) 函數(shù)設(shè)置IDE控制器并由高級(jí)IDE驅(qū)動(dòng)程序注冊(cè)硬件接口后,結(jié)構(gòu)特殊接口通過(guò)以下函數(shù)調(diào)用得到進(jìn)一步初始化:

void ep93xx_ide_init(unsigned int * pointer)

該函數(shù)在文檔驅(qū)動(dòng)器/ide/ide-ep93xx.c 內(nèi)被定義,并同時(shí)執(zhí)行幾個(gè)任務(wù)--把結(jié)構(gòu)特殊函數(shù)映射到硬件接口數(shù)據(jù)結(jié)構(gòu)內(nèi)的函數(shù)指針函數(shù),如果平臺(tái)設(shè)有DMA則設(shè)置DMA接口。

IDE硬件接口數(shù)據(jù)結(jié)構(gòu)的結(jié)構(gòu)特殊函數(shù)指針如下所示:

typedef struct hwif_s
  {
…
ide_rw_proc_t *rwproc; 
ide_ideproc_t *ideproc; 
ide_dmaproc_t *dmaproc; …
  } ide_hwif_t;

ideproc 處理PIO模式轉(zhuǎn)換,并被映射到結(jié)構(gòu)特殊函數(shù) ep93xx_ideproc()。rwproc 和dmaproc 都處理DMA模式轉(zhuǎn)換。rwproc 向ep93xx_rwproc()映射,dmaproc向ep93xx_dmaproc()映射。高級(jí)IDE驅(qū)動(dòng)程序檢測(cè)這些指針是否無(wú)效。如果確為無(wú)效,則放棄結(jié)構(gòu)特殊函數(shù)而采用默認(rèn)函數(shù)。ideproc()和dmaproc()均系基于IOCTL的函數(shù),可執(zhí)行一系列高級(jí)IDE驅(qū)動(dòng)程序定義的ioctls命令。rwproc()函數(shù)為特殊轉(zhuǎn)換速度和方向設(shè)置IDE控制器。這些EP9312結(jié)構(gòu)特殊函數(shù)都在文件驅(qū)動(dòng)程序/ide/ide-ep93xx.c內(nèi)得到定義。函數(shù)原型示意如下:

static void ep93xx_ideproc(ide_ide_action_t action, ide_drive_t * drive, void * buffer, unsigned int count)
  static void ep93xx_dmaproc(ide_dma_action_t action, ide_drive_t *drive)
  static void ep93xx_rwproc(ide_drive_t * drive, ide_dma_action_t action)

此外,一部分結(jié)構(gòu)特殊執(zhí)行命令也是幾個(gè)IDE普通宏命令的再定義。它們是直接讀寫IDE設(shè)備的宏命令。文件 /include/asm/mach/ide.h 下的宏映射到EP9312 定義。

[!--empirenews.page--]#define OUT_BYTE(b, p) ep93xx_ide_outb((b), (p))
  #define OUT_WORD(w, p) ep93xx_ide_outw((w), (p))
  #define IN_BYTE(p) ep93xx_ide_inb((p))
  #define IN_WORD(p) ep93xx_ide_inw((p))

硬件接口(EP9312 IDE控制器接口)被初始化并與高級(jí)IDE驅(qū)動(dòng)程序一起注冊(cè)后,高級(jí)IDE驅(qū)動(dòng)程序通過(guò)探測(cè)相連的IDE設(shè)備硬件接口繼續(xù)初始化。如果設(shè)備被探測(cè)到,則與操作系統(tǒng)一起注冊(cè)。設(shè)備與操作系統(tǒng)一起注冊(cè)后,向能在設(shè)備上執(zhí)行的操作表上映射。這樣,操作系統(tǒng)也獲得了設(shè)備的額外信息,并需要對(duì)設(shè)備進(jìn)行資源管理。這些額外信息包括大小和分區(qū)數(shù)量等。以下是注冊(cè)IDE硬盤的函數(shù)調(diào)用:

register_disk(struct gendisk *gd, int drive,
unsigned minors,
struct block_device_operations *ops,
long size)

高級(jí)IDE驅(qū)動(dòng)程序用探測(cè)設(shè)備時(shí)獲得的的函數(shù)參數(shù)值調(diào)用這個(gè)函數(shù)。第一個(gè)參數(shù)是gd,它是描述盤片布局的數(shù)據(jù)結(jié)構(gòu)。第二個(gè)參數(shù)--drive,是設(shè)備編號(hào)。對(duì)于EP9312而言,設(shè)備編號(hào)或?yàn)?,或?yàn)?,因?yàn)橛布恢С值膬膳_(tái)設(shè)備。第三個(gè)參數(shù)--minors,是設(shè)備被探測(cè)時(shí)發(fā)現(xiàn)的盤片分區(qū)。第四個(gè)參數(shù)--block_device_operations,是函數(shù)指針列表,系IDE驅(qū)動(dòng)程序硬盤執(zhí)行所定義。被映射到該列表中的函數(shù)采用結(jié)構(gòu)特殊函數(shù)執(zhí)行不同任務(wù)。最后一個(gè)參數(shù)--size,是指設(shè)備的扇區(qū)數(shù),它同樣也是從設(shè)備中直接獲得。

設(shè)備指針列表包括以下區(qū)塊設(shè)備操作:

• open - 設(shè)備和驅(qū)動(dòng)程序?qū)嵗跏蓟?/p>

• release - 關(guān)閉設(shè)備或清除驅(qū)動(dòng)程序?qū)嵗?/p>

• ioctl - 填補(bǔ)空白,是通過(guò)內(nèi)核向設(shè)備驅(qū)動(dòng)程序傳遞的一種信息的一種方式

• check media change - 處理支持可移動(dòng)媒體的設(shè)備

• revalidate - 處理支持可移動(dòng)媒體的設(shè)備(通常為設(shè)備指定)

區(qū)塊設(shè)備的設(shè)備操作列表不包括任何輸入輸出操作。對(duì)于區(qū)塊設(shè)備而言,request方法用于處理設(shè)備輸入輸出,并與等待的輸入輸出操作隊(duì)列相關(guān),因此進(jìn)一步與字符設(shè)備有所區(qū)分。Request方法和隊(duì)列均由高級(jí)IDE設(shè)備驅(qū)動(dòng)器定義,與操作系統(tǒng)一起注冊(cè)并與設(shè)備主要編號(hào)相連。

除了將設(shè)備和操作系統(tǒng)一起注冊(cè),高級(jí)IDE設(shè)備驅(qū)動(dòng)程序還通過(guò)數(shù)據(jù)結(jié)構(gòu)在本地管理該設(shè)備,數(shù)據(jù)結(jié)構(gòu)包括映射到IDE設(shè)備特別函數(shù)的函數(shù)指針。下面是映射到針對(duì)IDE硬盤函數(shù)的該數(shù)據(jù)結(jié)構(gòu)的一部分:

static ide_driver_t idedisk_driver = {
…
cleanup: idedisk_cleanup,
standby: do_idedisk_standby,
flushcache: do_idedisk_flushcache,
do_request: do_rw_disk,
end_request: NULL,
ioctl: NULL,
open: idedisk_open,
release: idedisk_release,
media_change: idedisk_media_change,
revalidate: idedisk_revalidate,
pre_reset: idedisk_pre_reset,
capacity: idedisk_capacity,
special: idedisk_special,
proc: idedisk_proc,
reinit: idedisk_reinit,
… 
  };

值得注意的是,一些函數(shù)指針直接向與操作系統(tǒng)一起注冊(cè)的文件操作列表函數(shù)指針映射,而此時(shí)IDE設(shè)備驅(qū)動(dòng)器內(nèi)部使用其他函數(shù)指針。例如,高級(jí)設(shè)備驅(qū)動(dòng)程序內(nèi)部使用函數(shù)指針do_request 和 end_request處理要求方法輸入輸出。

 

 

這就涵蓋了IDE設(shè)備驅(qū)動(dòng)器的結(jié)構(gòu)特殊API。下一步是創(chuàng)建文檔系統(tǒng)特殊文件,從而幫助用戶級(jí)應(yīng)用進(jìn)入該設(shè)備。使用以下命令生成IDE硬盤驅(qū)動(dòng)特殊文件:mknod /dev/hda1 b 3 1

正如在觸摸屏特殊文件創(chuàng)建中談及,可在系統(tǒng)初始化階段安排自動(dòng)執(zhí)行該步驟,或者用戶可以在系統(tǒng)啟動(dòng)運(yùn)行顯示操作提示時(shí)手工操作該命令。

用戶級(jí)應(yīng)用較少直接調(diào)用區(qū)塊設(shè)備。一般而言,區(qū)塊設(shè)備直接通過(guò)內(nèi)核級(jí)文檔系統(tǒng)執(zhí)行接入。用戶級(jí)應(yīng)用通常獲取具有操作系統(tǒng)實(shí)用程序的區(qū)塊設(shè)備,以執(zhí)行文檔系統(tǒng)創(chuàng)建、安裝訪問(wèn)文檔系統(tǒng)的設(shè)備等文檔系統(tǒng)操作。命令行工具涵蓋分割、格式化、安裝和驗(yàn)證區(qū)塊設(shè)備。例如,以下是用mnknod命令創(chuàng)建的設(shè)備的一個(gè)安裝設(shè)備命令:

mount -t ext3 -o rw /dev/hda1 /mnt/drive

-t ext3 指出設(shè)備由一個(gè)Extended 3文檔系統(tǒng)配置;-o rw 則說(shuō)明設(shè)備應(yīng)該具備讀寫函數(shù);/dev/hda1是被安裝設(shè)備的文檔系統(tǒng)特殊文件;/mnt/drive 則是用戶獲取設(shè)備所存文檔系統(tǒng)內(nèi)容的安裝位置。

添加Linux內(nèi)核的新設(shè)備驅(qū)動(dòng)程序支持

Linux內(nèi)核用以下三個(gè)命令建立:

 make menuconfig (config, xconfig, oldconfig, etc.)
  make dep
  make
[!--empirenews.page--]

首先,Linux內(nèi)核針對(duì)目標(biāo)運(yùn)行環(huán)境進(jìn)行配置。用戶還可選擇添加支持各種設(shè)備、支持各種文檔系統(tǒng)和配置引導(dǎo)參數(shù)等。當(dāng)一個(gè)新的設(shè)備驅(qū)動(dòng)程序在Linux內(nèi)核中得到執(zhí)行時(shí),必須增加對(duì)該新設(shè)備的配置支持,所以要先更新驅(qū)動(dòng)程序目錄中合適設(shè)備類型子目錄下的Makefile。在Makefile中,必須增加新選項(xiàng)建立設(shè)備驅(qū)動(dòng)程序二進(jìn)制文件,并且直接與Linux內(nèi)核相連或創(chuàng)建一個(gè)模塊。第二步需要更新驅(qū)動(dòng)程序目錄設(shè)備類型子目錄下的Config. in。此新設(shè)備的配置選項(xiàng)必須加入Config.in。

小結(jié)

本文無(wú)意闡述Linux設(shè)備驅(qū)動(dòng)程序的各個(gè)環(huán)節(jié),因?yàn)榘↙inux源代碼在內(nèi)的各種資源都已對(duì)此做出了解釋。相反,本文旨在探索針對(duì)嵌入式非標(biāo)準(zhǔn)設(shè)備、用以執(zhí)行設(shè)備驅(qū)動(dòng)程序的硬件API。對(duì)于幾個(gè)不同類型的設(shè)備驅(qū)動(dòng)程序,本文以EP9312片上系統(tǒng)平臺(tái)為例,詳解了這些為硬件接口定制的API。了解如何設(shè)計(jì)并執(zhí)行這些API是為新設(shè)備編寫驅(qū)動(dòng)程序的第一步。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉