一,核心結構簡單概述
上層程式操作裝置驅動簡單概述:
在使用者空間使用相關的c庫,比如open函式會造成乙個中斷,系統會去呼叫sys_call函式(系統呼叫),然後會去呼叫相關的sys_open函式,在核心空間的時候會去驅動鏈表裡面查詢對應的外設驅動,我們編寫完驅動程式,載入到核心,核心會去呼叫相關的驅動open函式
二,字元裝置驅動簡單概述
字元裝置是3大類裝置(字元裝置、塊裝置、網路裝置)中較簡單的一類裝置、其驅動程式中完成的主要工作是初始化、新增和刪除struct cdev
結構體,申請和釋放裝置號,以及填充struct file_operations
結構體中斷的操作函式,實現struct file_operations
結構體中的read()
、write()
和ioctl()
等函式是驅動設計的主體工作。
如圖,在linux核心**中:
使用struct cdev結構體來抽象乙個字元裝置;
通過乙個dev_t型別的裝置號(分為主(major)、次裝置號(minor))一確定字元裝置唯一性;
通過struct file_operations型別的操作方法集來定義字元裝置提供個vfs的介面函式。
三,編寫驅動程式**
注:乙個簡單的驅動程式框架
#include
//file_operation所在的標頭檔案
#include
//module_init mmodule_exit宣告
#include
//__init __exit巨集定義申明
#include
//class device宣告
#include
//copy_from_user的標頭檔案
#include
//裝置號dev_t的宣告
#include
//ioremap iounmap的標頭檔案
static
struct class *pin4_class;
static
struct device *pin4_class_dev;
static dev_t devno;
//裝置號
static
int major =
231;
//主裝置號
static
int minor =0;
//次裝置號
static
char
*module_name =
"pin4"
;//模組名
//open函式
static
intpin4_open
(struct inode *inode,
struct file *file)
//函式模型都在file operations結構體裡面
//write函式
static ssize_t pin4_write
(struct file *file,
const
char __user *buf,size_t count,loff_t *ppos)
static
struct file_operations pin4_fops =
;int __init pin4_drv_init
(void
)//真實驅動入口
void __exit pin4_drv_exit
(void
)//解除安裝驅動
module_init
(pin4_drv_init)
;//核心載入驅動時,這個巨集會被呼叫
module_exit
(pin4_drv_exit)
;module_license
("gpl v2"
);
四,編譯驅動**
1,進入核心原始碼字元裝置驅動裡面
cd /home/user/linux-kernal/linux-rpi-
4.14
.y/drivers/
char
2,拷貝編寫的驅動**到當前目錄
cp /home/user/hello.c .
/
3,修改字元裝置裡面的makefile
在前面加上
obj-m +
=hello.o//驅動**檔名.o
4,回到linux核心原始碼目錄
cd ../../
5,編譯驅動為乙個模組
arch=arm cross_compile=arm-linux-gnueabihf- kernel=kernel7 make modules
注意:/*核心架構
交叉編譯工具
核心版本*/
注:zsh編譯時會報錯,主要是對環境變數配置不成功,一般預設時bash,正常配置交叉編譯工具時候並不會報錯
五,載入核心驅動
1,將.ko檔案拿到樹莓派並且載入核心驅動
scp /drivers/
char
/hello.ko [email protected]
.0.0
:/home/pi
2,在樹莓派載入.ko檔案到裝置驅動
sudo insmod hello.ko
3,檢視裝置驅動是否被成功載入
ls /dev/pin4
4,修改裝置檔案許可權,讓他可以開啟和讀寫許可權對於普通使用者
sudo chmod 666
/dev/pin4
#include
#include
#include
#include
intmain()
else
write
(fd,
'1',1)
;return0;
}
2,在樹莓派上執行編譯的驗證**
結果如下:
在終端會列印dev open sucess
乙個簡單的Linux字元驅動
這個是win驅動課的作業,題目是設計乙個通用的io埠讀寫驅動,因為我的電腦配置太低無法執行虛擬機器,就用linux完成了作業。read和write的處理併發讀寫的部分來自ldd3。1.驅動程式 通用io埠讀寫驅動 include include include include include inc...
乙個最簡單的Linux核心模組
include include static int init hello init void static void exit hello exit module init hello init module exit hello exit module license gpl 這個最簡單的核心模...
第乙個核心驅動
測試驅動開發平台 為了後續學習的順利進行,我們利用最簡單的hello,world程式,在核心上掛載和解除安裝我們自己編寫的hello模組。說明 本文除錯環境vmware workstation 5.0 turbolinux 10,教材是 linux device drivers 第3版英文電子圖書。...