查看: 3819|回復: 0
打印 上一主題 下一主題

嵌入式驅動(dòng)開(kāi)發(fā)流程

[復制鏈接]
跳轉到指定樓層
樓主
發(fā)表于 2018-11-24 10:31:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
嵌入式系統中,操作系統是通過(guò)各種驅動(dòng)程序來(lái)駕馭硬件設備的。設備驅動(dòng)程序是操作系統內核和硬件設備之間的接口,它為應用程序屏蔽了硬件的細節,這樣在應用程序看來(lái),硬件設備只是一個(gè)設備文件,可以像操作普通文件一樣對硬件設備進(jìn)行操作。設備驅動(dòng)程序是內核的一部分,完成以下功能:

· 驅動(dòng)程序的注冊和注銷(xiāo)。

· 設備的打開(kāi)和釋放。

· 設備的讀寫(xiě)操作。

· 設備的控制操作。

· 設備的中斷和輪詢(xún)處理。

Linux主要將設備分為三類(lèi):字符設備、塊設備和網(wǎng)絡(luò )設備。字符設備是指發(fā)送和接收數據以字符的形式進(jìn)行,沒(méi)有緩沖區的設備;塊設備是指發(fā)送和接收數據以整個(gè)數據緩沖區的形式進(jìn)行的設備;網(wǎng)絡(luò )設備是指網(wǎng)絡(luò )設備訪(fǎng)問(wèn)的BSD socket 接口。下面以字符設備為例,寫(xiě)出其驅動(dòng)編寫(xiě)框架:

一、 編寫(xiě)驅動(dòng)程序初始化函數
驅動(dòng)程序的初始化在函數xxx_init()中完成,包括對硬件初始化、中斷函數、向內核注冊驅動(dòng)程序等。

首先理解硬件結構,搞清楚其功能,接口寄存器以及CPU怎么訪(fǎng)問(wèn)控制這些寄存器等。

其次向內核注冊驅動(dòng)程序。設備驅動(dòng)程序可以直接編譯進(jìn)內核,在系統啟動(dòng)的時(shí)候初始化,也可以在需要的時(shí)候以模塊的方式動(dòng)態(tài)加載到內核中去。每個(gè)字符設備或是塊設備都是通過(guò)register_chrdev()函數注冊,調用該函數后就可以向系統申請主設備號,操作成功,設備名就會(huì )出現在/proc/devices里。

此外,在關(guān)閉設備時(shí),需要先解除原先設備的注冊,需要有清除函數,在xxx_exit()中通過(guò)unregister_chrdev()函數在實(shí)現,此后設備就會(huì )從/proc/devices里消失。

當驅動(dòng)程序被編譯成模塊時(shí),使用insmod加載模塊,模塊的初始化函數xxx_init()被調用,向內核注冊驅動(dòng)程序;使用rmmod卸載模塊,模塊的清除函數xxx_exit()被調用。

二、 構造file_operations結構中要用到的各個(gè)成員函數

Linux操作系統將所有的設備都看成文件,以操作文件的方式訪(fǎng)問(wèn)設備。應用程序不能直接操作硬件,使用統一的接口函數調用硬件驅動(dòng)程序,這組接口被成為系統調用。每個(gè)系統調用中都有一個(gè)與之對應的函數(open、release、read、write、ioctl等),在字符驅動(dòng)程序中,這些函數集合在一個(gè)file_operations類(lèi)型的數據結構中。以一個(gè)鍵盤(pán)驅動(dòng)程序為例:
struct file_operations Key7279_fops =
{
.open = Key7279_Open,
.ioctl = Key7279_Ioctl,
.release = Key7279_Close,
.read = Key7279_Read,
};
1、 設備的打開(kāi)和釋放

打開(kāi)設備是由open()函數來(lái)完成,在大部分設備驅動(dòng)中open完成如下工作:
◇ 遞增計數器

◇ 檢查特定設備的特殊情況

◇ 初始化設備

◇ 識別次設備號

釋放設備由release()函數來(lái)完成。當一個(gè)進(jìn)程釋放設備時(shí),其它進(jìn)程還能繼續使用該設備,只是該進(jìn)程暫時(shí)停止對該設備的的使用,而當一個(gè)進(jìn)程關(guān)閉設備時(shí),其它進(jìn)程必須重新打開(kāi)此設備才能使用。Release完成如下工作:

◇ 遞減計數

◇ 在最后一次釋放設備操作時(shí)關(guān)閉設備

2、 設備的讀寫(xiě)操作
讀寫(xiě)設備的主要任務(wù)就是把內核空間的數據復制到用戶(hù)空間,或者是從用戶(hù)空間復制到內核空間,也就是將內核空間緩沖區里的數據復制到用戶(hù)空間的緩沖區中或者相反。字符設備使用各自的read()函數和write()函數來(lái)進(jìn)行數據讀寫(xiě)。

3、 設備的控制操作
大部分設備除了讀寫(xiě)能力,還可進(jìn)行超出簡(jiǎn)單的數據傳輸之外的操作,所以設備驅動(dòng)也必須具備進(jìn)行各種硬件控制操作的能力. 這些操作常常通過(guò) ioctl 方法來(lái)支持。與讀寫(xiě)操作不同,ioctl()的用法與具體設備密切相關(guān)。以鍵盤(pán)Key7279_Ioctl為例:
static int Key7279_Ioctl(struct inode *inode,struct file *file,unsigned int cmd, unsigned long arg)
{
switch(cmd)
{
case Key7279_GETKEY:
return key7279_getkey();
default:
printk("Unkown Keyboard Command ID.\n");
}
return 0;
}
cmd的取值及含義都與具體的設備有關(guān),除了ioctl(),設備驅動(dòng)程序還可能有其他控制函數,比如llseek()等。

當應用程序使用open、release等函數打開(kāi)某個(gè)設備時(shí),設備驅動(dòng)程序的file_operations結構中的相應成員就會(huì )被調用。

三、設備的中斷和輪詢(xún)處理

對于不支持中斷的設備,讀寫(xiě)時(shí)需要輪詢(xún)設備狀態(tài),以及是否需要繼續進(jìn)行數據傳輸。例如,打印機。如果設備支持中斷,則可按照中斷方式進(jìn)行。

模塊在使用中斷前要先請求一個(gè)中斷通道(或者 IRQ中斷請求),并在使用后釋放它。通過(guò)request_irq()函數來(lái)注冊中斷,free_irq()函數來(lái)釋放。

四、驅動(dòng)程序的測試
對驅動(dòng)程序的調試可以通過(guò)打印的方式來(lái)進(jìn)行,就是通過(guò)在驅動(dòng)程序中添加printk()打印函數,來(lái)跟蹤驅動(dòng)程序的執行過(guò)程,以此來(lái)判斷問(wèn)題。

以上是我根據自己的學(xué)習總結的,可能寫(xiě)的比較簡(jiǎn)單,對于比較復雜的驅動(dòng)函數,會(huì )添加更多的函數,但是大體的框架就是這樣了。

基于操作系統的驅動(dòng)就是在無(wú)操作系統下的硬件接口函數加上操作系統外套

實(shí)現一個(gè)嵌入式Linux設備驅動(dòng)程序的大致流程如下:

(l)查看原理圖,理解設備的工作原理。

(2)定義主設備號。設備由一個(gè)主設備號和一個(gè)次設備號來(lái)標識。主設備號唯一標識了設

備類(lèi)型,即設備驅動(dòng)程序類(lèi)型,它是塊設備表或字符設備表中設備表項的索引。次設備號僅

由設備驅動(dòng)程序解釋?zhuān)瑓^分被一個(gè)設備驅動(dòng)控制下的某個(gè)獨立的設備。

(3)實(shí)現初始化函數。在驅動(dòng)程序中實(shí)現驅動(dòng)的注冊和卸載。

(4)設計所要實(shí)現的文件操作,定義file--operations結構。

(5)實(shí)現所需的文件操作調用,如read,write等。

(6)實(shí)現中斷服務(wù),并用request--irq向內核注冊,中斷并不是每個(gè)設備驅動(dòng)所必需的。

(7)編譯該驅動(dòng)程序到內核中,或者用insmod命令加載模塊。

(8)測試該設備,編寫(xiě)應用程序,對驅動(dòng)程序進(jìn)行測試。

典型字符設備驅動(dòng)編寫(xiě)框架:

1 編寫(xiě)硬件接口函數

2 建立文件系統與設備驅動(dòng)程序間的接口,如:struct file_operations結構體

3 注冊設備到chrdevfs全局數組中,注冊或注銷(xiāo)設備可以在任何時(shí)候,但一般在模塊加載時(shí)注冊設備,在模塊退出時(shí)注銷(xiāo)設備。(module_init();module_exit();)

4 以模塊方式編譯驅動(dòng)源碼,并將其加載到內核中

5 創(chuàng )建設備節點(diǎn),mknode

6 編寫(xiě)應用程序訪(fǎng)問(wèn)底層設備

想要了解嵌入式、物聯(lián)網(wǎng)相關(guān)技術(shù)的可以聯(lián)系宋工企鵝號三五二四六五九零八八Tel:173--1795--1908


您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页