linux字元裝置驅動開發模板及Makefile

2021-06-13 18:40:43 字數 3245 閱讀 1237

#include #include #include #include #include //********************===字元裝置驅動模板開始 *************************==//

#define char_dev_device_name "char_dev" // 是應當連線到這個編號範圍的裝置的名字,出現在/proc/devices和sysfs中

#define char_dev_node_name "char_dev" // 節點名,出現在/dev中

#define char_dev_class_name "char_dev_class" //出現在/sys/devices/virtual/和/sys/class/中

struct class *char_dev_class; // class結構用於自動建立裝置結點

static int major = 0; // 0表示動態分配主裝置號,可以設定成未被系統分配的具體的數字。

static struct cdev char_dev_cdev;// 定義乙個cdev結構

// 進行初始化設定,開啟裝置,對應應用空間的open 系統呼叫

int char_dev_open(struct inode *inode, struct file *filp)

// 釋放裝置,關閉裝置,對應應用空間的close 系統呼叫

static int char_dev_release (struct inode *node, struct file *file)

// 實現讀功能,讀裝置,對應應用空間的read 系統呼叫

/*__user. 這種註解是一種文件形式, 注意, 乙個指標是乙個不能被直接解引用的

使用者空間位址. 對於正常的編譯, __user 沒有效果, 但是它可被外部檢查軟體使

用來找出對使用者空間位址的錯誤使用.*/

ssize_t char_dev_read(struct file *file,char __user *buff,size_t count,loff_t *offp)

// 實現寫功能,寫裝置,對應應用空間的write 系統呼叫

ssize_t char_dev_write(struct file *file,const char __user *buff,size_t count,loff_t *offp)

// 實現主要控制功能,控制裝置,對應應用空間的ioctl系統呼叫

static int char_dev_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)

// file_operations 結構體設定,該裝置的所有對外介面在這裡明確,此處只寫出了幾常用的

static struct file_operations char_dev_fops =

;// 裝置建立子函式,被char_dev_init函式呼叫

static void char_dev_setup_cdev(struct cdev *dev, int minor, struct file_operations *fops)

printk("char_dev device setup.\n");

}// 裝置初始化

static int char_dev_init(void)

else

if(result < 0)//獲取裝置號失敗返回

char_dev_setup_cdev(&char_dev_cdev, 0, &char_dev_fops);

printk("the major of the char_dev device is %d.\n", major);

//==== 有中斷的可以在此註冊中斷:request_irq,並要實現中斷服務程式 ===//

// 建立裝置節點

char_dev_class = class_create(this_module,char_dev_class_name);

if (is_err(char_dev_class))

device_create(char_dev_class, null, dev, null, char_dev_node_name);

printk("char_dev device installed.\n");

return 0;

}// 裝置登出

static void char_dev_cleanup(void)

module_init(char_dev_init);//模組初始化介面

module_exit(char_dev_cleanup);//模組登出介面

//所有模組**都應該指定所使用的許可證,該句不能省略,否則模組載入會報錯

module_license("dual bsd/gpl");

module_author("author");

module_description("driver description");

#

# makefile for kernel helloworld drivers

## if kernelrelease is defined, we've been invoked from the

# kernel build system and can use its language.

ifneq ($(kernelrelease),)

obj-m += chardev.o

# otherwise we were called directly from the command

# line; invoke the kernel build system.

else

kernel_dir ?= /lib/modules/$(shell uname -r)/build

android_kernel_dir ?= /home/wzf/amlogic_m1_0427/kernel/

pwd := $(shell pwd)

default:

$(make) -c $(android_kernel_dir) m=$(pwd) modules

modules:

$(make) -c $(kernel_dir) m=$(pwd) modules

clean:

$(make) -c $(kernel_dir) m=$(pwd) clean

endif

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

linux驅動字元裝置模板

基於linux 4.4版本,板載6410 include 包含file operation結構體 include 包含module init module exit include 包含license的巨集 include 包含copy to user之類 include include 包含ior...

linux核心字元裝置驅動開發

1,對驅動的理解 對於一般驅動程式來說,只需要配置控制器的暫存器就可以 但是在linux作業系統中,軟體要讓硬體辦事,就要滿足硬體的規矩,也就是按驅動框架來開發硬體驅動程式 驅動程式就要受到linux的約束,這個約束就被稱為linux驅動框架。linux的驅動框架有很多 字元裝置驅動框架 塊裝置驅動...