1.操作硬體:讓硬體能夠正常工作;
2.要給使用者提供訪問操作硬體的介面;
1.字元裝置:
特點:操作時,資料都是按照位元組流形式進行
訪問:例子:串列埠, led,按鍵,觸控螢幕,lcd顯示屏,藍芽
gps,gprs,各種感測器,攝像頭,音效卡,震子,電源管理ic等
2.塊裝置
特點:操作時,資料按照一定的資料塊來進行訪問,比如一次訪問512位元組或者1k
例子:硬碟,u盤,sd卡,tf卡, nandflash (slc, mlc, tlc)(容易出錯), norflash(很穩定,採用匯流排形式,和記憶體訪問一樣), emmc
注意: linux核心對於塊裝置支援得比較完美,無需做相應的驅動開發
3.網路裝置
特點:操作時,一般都要結合tcp/ip網路協議棧來進行操作
例子:有線網絡卡,無線網絡卡,以太交換晶元
注意:一般來說網絡卡晶元驅動都是由晶元廠家來提供
明確: 對於linux系統,銘記「一切皆檔案」
「一切」:就是指計算機系統的硬體部分;
例如:串列埠裝置將來在使用者空間(rootfs)就是以檔案的形式存在;
將來使用者訪問這個檔案本質上就是在訪問硬體裝置本身!
1.裝置檔案存在於根檔案系統的dev目錄
2.裝置檔案的屬性(包含的內容):
以串列埠為例:
第乙個串列埠的裝置檔案屬性
crw-rw—- 204, 64 s3c2410_serial0
第二個串列埠的裝置檔案屬性
crw-rw—- 204, 65 s3c2410_serial1
說明:
「c」:表示這個裝置是字元裝置
「204」表示裝置的主裝置號
「64或者65」表示裝置的次裝置號
「s3c2410_serial0」:第乙個串列埠的裝置檔案
「s3c2410_serial1」:第二個串列埠的裝置檔案
總結:裝置檔案包含此裝置是字元裝置還是塊裝置,主裝置號,次裝置號,裝置檔名。
以u盤為例:
brw-rw—- 8, 1 /dev/sda1
說明:
「b」:塊裝置
「8」:主裝置號
「1」:次裝置號
「sda1」:裝置檔名
注意:網路裝置沒有裝置檔案,網路裝置的訪問都是通過socket進行
字元裝置或者塊裝置的訪問要利用系統呼叫函式,
例如:
開啟串列埠:
int fd = open ("dev/s3c2410_serial0", o_rdwr);
寫串列埠:
write(fd, "hello,world", 12);
讀串列埠:
char buf[1024] = ;
read(fd, buf, 1024);
關閉串列埠:
close(fd);
總結:linux系統訪問硬體首先獲取硬體裝置的裝置檔案,最後利用系統呼叫進行訪問即可!沒有裝置檔案,網路裝置的訪問都是通過socket進行
1.手動建立
裝置檔名 字元裝置 主裝置號 次裝置號
mknod /dev/mytest c 250 0
2.自動建立
主裝置號作用:應用程式根據裝置檔案中的主裝置號,能夠在茫茫的核心驅動中找到屬於自己的驅動程式;也就說驅動程式要和這個主裝置號進行關聯;也就說明乙個驅動程式僅有乙個主裝置號;也就說主裝置號對於核心來說是一種寶貴的資源;
次裝置號:如果多個硬體裝置共享乙個裝置驅動,裝置驅動將來根據次裝置號來區分使用者具體操作的哪個硬體裝置;如果僅有乙個裝置,一般此裝置號給0
核心描述主,次裝置號是通過裝置號進行描述;
裝置號的資料型別是dev_t (本質就是unsigned int)
裝置號的高12位儲存主裝置號的資訊;
裝置號的低20位儲存次裝置號的資訊;
切記:驅動要和裝置號進行繫結,裝置號對於核心來說是一種寶貴的資源
核心提供了以下函式供驅動來申請裝置號資源:
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
函式功能:讓核心來幫你分配裝置號資源
引數:
dev:儲存這核心幫你分配的裝置號
baseminor:希望的起始此裝置號,一般給0
count:申請的此裝置號的個數
name:裝置名稱,而不是裝置檔名,將來出現在 cat /proc/devices中
函式的返回值無需記憶,只需要看核心別人怎麼用即可
提取主裝置號major
主裝置號 = major(裝置號)
提取此裝置號minor
次裝置號 = minor(裝置號)
合併裝置號:
裝置號 = mkdev(主裝置號,次裝置號);
裝置號不再使用,要記得釋放裝置號
void unregister_chrdev_region(dev_t from, unsigned count)
功能:釋放裝置號
引數:
from:申請的裝置號
count:申請的次裝置號的個數
1.mkdir /opt/drivers/dev/2.0
2.cd /opt/drivers/dev/2.0
3.vim led_drv.c
4.vim makefile
5.make
6.cp led_drv.ko /opt/rootfs
arm執行:
1.insmod led_drv.ko
2.cat /proc/devices //檢視申請的主裝置號
3.rmmod led_drv
#include
#include
#include
#include
static dev_t dev; //儲存申請的裝置號
static
int led_init(void)
static
void led_exit(void)
module_init(led_init);
module_exit(led_exit);
module_license("gpl");
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...
Linux裝置驅動 核心開發
linux裝置驅動需要使用核心api來實現,一般被包含在linux核心原始碼樹中。驅動可以編譯到核心,隨著核心一起在系統啟動的時候被載入。也可以編譯成核心模組,在系統執行起來之後動態地載入到核心中,使得除錯的時候無需重新編譯核心,也無需重啟系統,很大程度上方便了驅動 的除錯。但並不是只有裝置驅動才能...
Linux裝置驅動開發示例
1,編寫乙個最簡單的驅動程式原始檔main.c include include module author edwardshen module license mplbsd gpl static int hello init void static void hello exit void intm...