Linux裝置驅動筆記 字元裝置驅動程式

2021-09-24 22:45:45 字數 3109 閱讀 9663

關鍵字:編寫linux字元裝置驅動程式

linux提供了幾種註冊字元裝置的方式。如下:

#include

#include

#include

#include

#define dev_major 100

#define dev_name "test"

static

intmyopen

(struct inode *inode,

struct file *filp)

static

intmyrelease

(struct inode *inode,

struct file *filp)

static

intmyread

(struct file *filp,

const

char __user *buf, size_t len, loff_t *loff)

static

intmywrite

(struct file *filp,

const

char __user *buf, size_t len, loff_t *loff)

struct file_operations fops =

;static

int __init test_init

(void

)static

void __exit test_exit

(void

)module_init

(test_init)

;module_exit

(test_exit)

;module_license

("gpl");

module_author

("hgl"

);

這裡, major 是感興趣的主編號, name 是驅動的名子(出現在 /proc/devices), fops 是預設的file_operations 結構. 乙個對 register_chrdev 的呼叫為給定的主編號註冊 0 - 255 的次編號, 並且為每乙個建立乙個預設的 cdev 結構. 使用這個介面的驅動必須準備好處理對所有 256 個次編號的 open呼叫( 不管它們是否對應真實裝置 ), 它們不能使用大於 255 的主或次編號.如果你使用 register_chrdev, 從系統中去除你的裝置的正確的函式是:

major 和 name 必須和傳遞給 register_chrdev 的相同, 否則呼叫會失敗。

通過register_chrdev去註冊裝置,需要確保主裝置號沒有被占用,也不能自動在/dev下生產裝置節點,需要通過mknod去建立裝置檔案。如:

$ mknod test c 100 0

#include

#include

#include

#include

#include

dev_t dev_id;

static

struct cdev cdev;

static

struct class *cls =

null

;static

struct device *device;

#define dev_minor 5

#define dev_major 100

#define dev_name "test"

static

intmyopen

(struct inode *inode,

struct file *filp)

static

intmyrelease

(struct inode *inode,

struct file *filp)

static

intmyread

(struct file *filp,

const

char __user *buf, size_t len, loff_t *loff)

static

intmywrite

(struct file *filp,

const

char __user *buf, size_t len, loff_t *loff)

struct file_operations fops =

;static

int __init test_init

(void

)static

void __exit test_exit

(void

)module_init

(test_init)

;module_exit

(test_exit)

;module_license

("gpl");

module_author

("hgl"

);

cdev_add和register_chrdev的區別在於cdev_add可以通過alloc_chrdev_region去動態獲取主裝置號,但同樣不能自動生成裝置節點。這裡使用device_create這個函式,可以幫我們自動建立裝置節點。這個函式需要傳入乙個類class,可以通過class_create這個函式去獲取,並通過device_create將裝置歸入該類。

在init函式中至少需要完成如下工作:

1),申請裝置號。

2),將入口函式(open,read等)與字元驅動程式的cdev抽象相關聯。

3),將裝置號與cdev相關聯。

需要建立裝置檔案讓應用程式去呼叫裝置驅動,可以手動通過mknod去建立,也可以使用device_create自動生成。

在exit函式中需要將init中做的事情都清理掉,需要注意清理的順序。

字元裝置驅動筆記

在所有linux裝置驅動中,字元裝置驅動最為基礎,本筆記將講解linux字元裝置驅動的結構,並解釋其主要組成部分的程式設計方法。cdev結構 struct cdev cdev結構體的dev t成員定義了裝置號,為32位,其中12bit為主裝置號,20bit為次裝置號。使用如下巨集可以從dev t獲得...

linux裝置驅動筆記

雖然並不做linux有關的東西,但是記錄下點點滴滴,以備不時之需 驅動程式的編譯 make 驅動程式按模組安裝 inmod ko 執行這個命令之前首先要獲得root許可權,否則會報錯,1 operation not permmitt 檢視模組安裝情況 lsmod 解除安裝相關模組 rmmod 安裝或...

字元裝置驅動筆記(二)

怎麼寫led驅動 寫框架 完善硬體的操作 1 看原理圖 2 看2440手冊 3 微控制器 直接操作實體地址 驅動程式 操作虛擬位址,實體地址用iorremap對映為虛擬位址 myleds.c include include include include include include includ...