關鍵字:編寫linux字元裝置驅動程式
linux提供了幾種註冊字元裝置的方式。如下:
這裡, major 是感興趣的主編號, name 是驅動的名子(出現在 /proc/devices), fops 是預設的file_operations 結構. 乙個對 register_chrdev 的呼叫為給定的主編號註冊 0 - 255 的次編號, 並且為每乙個建立乙個預設的 cdev 結構. 使用這個介面的驅動必須準備好處理對所有 256 個次編號的 open呼叫( 不管它們是否對應真實裝置 ), 它們不能使用大於 255 的主或次編號.如果你使用 register_chrdev, 從系統中去除你的裝置的正確的函式是:#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 必須和傳遞給 register_chrdev 的相同, 否則呼叫會失敗。
通過register_chrdev去註冊裝置,需要確保主裝置號沒有被占用,也不能自動在/dev下生產裝置節點,需要通過mknod去建立裝置檔案。如:
$ mknod test c 100 0
cdev_add和register_chrdev的區別在於cdev_add可以通過alloc_chrdev_region去動態獲取主裝置號,但同樣不能自動生成裝置節點。這裡使用device_create這個函式,可以幫我們自動建立裝置節點。這個函式需要傳入乙個類class,可以通過class_create這個函式去獲取,並通過device_create將裝置歸入該類。#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"
);
在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...