Linux驅動學習之路二

2021-07-25 07:59:23 字數 1869 閱讀 8652

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