Linux裝置驅動開發

2021-08-08 05:29:11 字數 3405 閱讀 1685

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...