目的:給空模組新增驅動殼子;
核心工作量:file_operations及其元素填充、註冊驅動。
腦海裡先有框架,知道自己要幹嘛;
細節**不需要乙個字乙個字敲,可以到核心中去尋找參考**複製過來改;
寫下的所有**必須心裡清楚明白,不能似懂非懂。
先定義file_operations結構體變數;
// 自定義乙個file_operations結構體變數,並且去填充
static const struct file_operations test_fops = ;
open和close函式原型確定、內容填充;
static int test_chrdev_open(struct inode *inode, struct file *file)
static int test_chrdev_release(struct inode *inode, struct file *file)
makefile
# ubuntu的核心原始碼樹,如果要編譯在ubuntu中安裝的模組就開啟這2個
# kern_ver = $(shell uname -r)
# kern_dir = /lib/modules/$(kern_ver)/build
# 開發板的linux核心的原始碼樹目錄
kern_dir = /root/qt/kernel
obj-m += module_test.o
all:
make -c $(kern_dir) m=`pwd` modules
cp:cp *.ko /root/removal/rootfs/root/driver_test
.phony: clean
clean:
make -c $(kern_dir) m=`pwd` modules clean
module_test.c
// 為了module_init,module_exit相關的,加入下面標頭檔案
#include // 為了__init,__exit相關的,加入下面標頭檔案
#include #include #define mymajor 250
#define myname "test_chrdev"
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");
return 0;
}// 模組解除安裝函式
static void __exit chrdev_exit(void)
module_init(chrdev_init);
module_exit(chrdev_exit);
// module_***這種巨集作用是用來新增模組描述資訊
// 描述模組的許可證
module_license("gpl");
// 描述模組的作者
module_author("aston");
// 描述模組的介紹資訊
module_description("module test");
// 描述模組的別名資訊
module_alias("alias ***");
主裝置號的選擇?
返回值的檢測?
編譯等 make && make cp?
insmod並且檢視裝置註冊的現象?
rmmod並且檢視裝置登出的現象?
為什麼要讓核心自動分配?
如何實現?
int mymajor;
// major傳0進去表示要讓核心幫我們自動分配乙個合適的空白的沒被使用的主裝置號
// 核心如果成功分配就會返回分配的主裝置號;如果分配失敗會返回負數
mymajor = register_chrdev(0, myname, &test_fops);
if (mymajor < 0)
printk(kern_info "register_chrdev success... mymajor = %d.\n", mymajor);
測試?
實現的完整**見下述檔案:
module_test.c
// 為了module_init,module_exit相關的,加入下面標頭檔案
#include // 為了__init,__exit相關的,加入下面標頭檔案
#include #include #define mymajor 250
#define myname "test_chrdev"
int mymajor;
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... mymajor = %d.\n", mymajor);
return 0;
}// 模組解除安裝函式
static void __exit chrdev_exit(void)
module_init(chrdev_init);
module_exit(chrdev_exit);
// module_***這種巨集作用是用來新增模組描述資訊
// 描述模組的許可證
module_license("gpl");
// 描述模組的作者
module_author("aston");
// 描述模組的介紹資訊
module_description("module test");
// 描述模組的別名資訊
module_alias("alias ***");
嵌入式linux字元裝置註冊裝置驅動
包含初始化巨集定義的標頭檔案,中的module init和module exit在此檔案中 include 包含初始化載入模組的標頭檔案,中的module license在此標頭檔案中 include 定義module param module param array的標頭檔案 include 定義...
linux驅動開發擴充套件 字元裝置註冊詳解
在2.4的核心我們使用 register chrdev來進行字元裝置裝置驅動 file operations 的註冊和主裝置號的分配以及兩者的繫結,這種方式每乙個主裝置號只能繫結乙個裝置驅動程式,也就是說核心最多支援 255 不一定是255個 個字元裝置驅動程式。但並不代表它只支援255個字元裝置,...
Linux驅動開發之動態分配字元裝置 註冊
一 驅動源 include include include include include static int hello major 248 主裝置號 static int hello minor 0 次裝置號 static int number of devices 1 裝置的數量 struc...