設備驅動程序是操作系統內核和機器硬件之間的接口,設備驅動程序為應用程序屏蔽了硬件的細節,這樣在應用程序看來,硬件設備只是一個設備文件,應用程序可以像操作普通文件一樣對硬件設備進行操作。設備驅動程序是內核的一部分,它主要完成的功能有:對設備進行初始化和釋放;把數據從內核傳送到硬件和從硬件讀取數據;讀取應用程序傳送給設備文件的數據、回送應用程序請求的數據以及檢測和處理設備出現的錯誤。
Linux將設備分為最基本的兩大類:一類是字符設備,另一類是塊設備。字符設備和塊設備的主要區別是:在對字符設備發出讀/寫請求時,實際的硬件I/O一般就緊接著發生了。字符設備以單個字節為單位進行順序讀寫操作,通常不使用緩沖技術;塊設備則是以固定大小的數據塊進行存儲和讀寫的,如硬盤、軟盤等,並利用一塊系統內存作為緩沖區。為提高效率,系統對於塊設備的讀寫提供了緩存機制,由於涉及緩沖區管理、調度和同步等問題,實現起來比字符設備復雜得多。LCD是以字符設備方式加以訪問和管理的,Linux把顯示驅動看做字符設備,把要顯示的數據一字節一字節地送往LCD驅動器。
Linux的設備管理是和文件系統緊密結合的,各種設備都以文件的形式存放在/dev目錄下,稱為設備文件。應用程序可以打開、關閉和讀寫這些設備文件,完成對設備的操作,就像操作普通的數據文件一樣。為了管理這些設備,系統為設備編了號,每個設備號又分為主設備號和次設備號。主設備號用來區分不同種類的設備,而次設備號用來區分同一類型的多個設備。對於常用設備,Linux有約定俗成的編號,如硬盤的主設備號是3。Linux為所有的設備文件都提供了統一的操作函數接口,方法是使用數據結構struct file_operations。這個數據結構中包括許多操作函數的指針,如open()、close()、read()和write()等,但由於外設的種類較多,操作方式各不相同。Struct file_operations結構體中的成員為一系列的接口函數,如用於讀/寫的read/write函數和用於控制的ioctl等。打開一個文件就是調用這個文件file_operations中的open操作。不同類型的文件有不同的file_operations成員函數,如普通的磁盤數據文件,接口函數完成磁盤數據塊讀寫操作;而對於各種設備文件,則最終調用各自驅動程序中的I/O函數進行具體設備的操作。這樣,應用程序根本不必考慮操作的是設備還是普通文件,可一律當作文件處理,具有非常清晰統一的I/O接口。所以file_operations是文件層次的I/O接口。
二 開始寫了
采用了在代碼裡加注釋的方法,同時把幾個文件上傳了一下,喜歡的朋友可以下載當作模板。每個文件以==隔開
一共需要寫寫3個文件,1個驅動頭文件,1個驅動文件,一個驅動測試用程序文件
分別是test.h,test.c和ledtest.c
簡單說說驅動都做什麼,怎麼做
1 系統加載驅動
2 應用程序裡打開設備(文件)
3 應用程序對設備操作
4 應用程序關閉設備(文件)
5 系統關閉設備
應用程序如何對設備操作?
記得C語言裡怎麼寫文件嗎?這裡很相象的。對於一般的字符設備(還有塊設備,網絡設備等等)主要有3個函數(還有很多,可以看)llseek read: write: ioctl: 這裡只用ioctl:控制函數,當然也可以使用讀寫函數操作IO 口,但ioctl:似乎更適合。
具體實現可以看ledtest.c文件了。
test.c中主要有幾個函數 分別負責初始化和清除,打開和關閉。以及ioctl對串口寄存器寫一些數據。
初始化和清除,打開和關閉函數裡都各有一句主要句,已經分別作了注釋。只要記住就好了。
對寄存器操作就不單獨說了,需要看44B0數據手冊了。好了 剩下的看代碼吧。
==============================
==========test.h==================
==============================
/****************************************Copyright (c)**************************************************
** FREE
**
**--------------File Info-------------------------------
** File Name: config.h
** Last modified Date: 2006-9-9
** Last Version: 1.0
** Descriptions: User Configurable File
**
**----------------------------------------------------
** Created By: ZLG CHENMINGJI
** Created date: 2006-9-9
** Version: 1.0
** Descriptions: First version
**
**-------------------------------------------------
** Modified by:MAMAJINCO
** Modified date:2006-9-9
** Version:1.0
** Descriptions:在此忠心感謝ZLG的模版 我的高質量編程意識起源於此
**
*****************************************************/
//防止重復包含此文件而設置的宏
#ifndef __CONFIG_H
#define __CONFIG_H
//包含必要的頭文件
#i nclude
#i nclude //模塊必須包含的頭文件
#i nclude /* printk()函數,用於向內核輸出信息 */
#i nclude /* 很重要 其中包含了如file_opration等結構 此結構用於文件層接口 */
#i nclude /* 錯誤代碼*/
#i nclude
#i nclude
#i nclude
#i nclude
/********************************/
/* 應用程序配置 */
/********************************/
//以下根據需要改動
//定義主設備號 設備名稱
#define LED_MAJOR_NR 231 //231~239 240~255都可以
#define DEVICE_NAME "led" /* name for messaging */
#define SET_LED_OFF 0
#define SET_LED_ON 1
#endif
/************************ End Of File
*********************************************************/
=============END===============
==============================
============test.c================
==============================
/*************Copyright (c)**************************