linux驅動學習之路二
上次我們寫了乙個最簡單的驅動程式,但是那個驅動程式中沒有介面可供linux上層應用程式呼叫
這次讓我們新增乙個linux呼叫驅動的介面,讓上層應用可以呼叫
1.首先讓咱們來了解一下linux 中file_operations結構體,這個結構體在\include\linux\hs.h中包含(所以編寫驅動的時候必須包含此標頭檔案)
這個結構體定義如下
struct file_operations ;
可見這個結構體都是函式指標,所以我們驅動要想向應用層提供讀寫介面的時候,必須把這個結構體的指標填充(用到的填充就行),讓指標指向我們驅動的函式,然後應用層呼叫open、close、write、read等實際上感覺就是操控驅動的讀寫函式
我們現在把上次的**加點東西
#include // linux很重要的標頭檔案之一包含 module_init module_exit 等巨集定義
#include// 在module_init巨集呼叫的函式中去註冊字元裝置驅動
ret = register_chrdev(mymajor, myname, &test_fops);
if (ret)
printk(kern_info "register_chrdev success...\n"); // __init __exit
#define mymajor200
#define myname"testchar"
static int test_chrdev_open(struct inode *inode, struct file *file)
static int test_chrdev_release(struct inode *inode, struct file *file)
// 自定義乙個file_operations結構體變數,並且去填充
static const struct file_operations test_fops = ;
// 模組安裝函式
static int __init chrdev_init(void)
printk(kern_info "register_chrdev success...\n");
printk(kern_info "chrdev_init helloworld init\n");
return 0;
} // 模組解除安裝函式
static void __exit chrdev_exit(void)
//注意:核心中不能用printf
module_init(chrdev_init); //當在linux中命令列輸入insmod的時候進行會自動跳到chrdev_init中載入函式
module_exit(chrdev_exit); //當在linux中命令列輸入rmmod的時候進行會自動跳到chrdev_exit中解除安裝函式
// module_***這種巨集作用是用來新增模組描述資訊
module_license("gpl"); // 描述模組的許可證
module_author("nexyho"); // 描述模組的作者
module_description("module test"); // 描述模組的介紹資訊
module_alias("nexyho***");
然後用上次我們編寫的makefile編譯即可。。。。安裝完驅動後使用"mknod /dev/***x c 主裝置好 次裝置號"建立驅動檔案,然後自己編寫乙個應用程式呼叫open開啟該驅動檔案試一下
Linux驅動學習之路一
linux驅動學習之路一 最簡單的驅動程式 include linux很重要的標頭檔案之一包含 module init module exit 等巨集定義 include init exit 模組安裝函式 static int init chrdev init void 模組解除安裝函式 stati...
嵌入式Linux驅動學習之路 二 u boot體驗
現在的u boot支援powerpc arm x86 mips體系結構的上百種開發板,已經稱為功能最多 靈活性最強,並且開發最積極的開源bootloader。目前由denx的wolfgangdenk維護。u boot郵件列表 denx的u boot主頁 1.安裝好toolchain並設定好環境變數。...
Linux驅動學習(二)
注 基於linux 2.6.38 還是 arch arm mach s3c64xx mach mini6410.c這個檔案,前面有篇文章已經說了裡面的mini6410 machine init 函式是什麼時候被呼叫的,因此在這裡不再重複,直接看這個函式裡面的內容 1 static void init...