linux2 6字元裝置驅動開發模板

2021-07-12 06:58:05 字數 3868 閱讀 4229

[cpp]view plain

copy

#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

intmajor = 0;"white-space:pre"

>   

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

static

struct

cdev char_dev_cdev;

// 定義乙個cdev結構

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

intchar_dev_open(

struct

inode *inode, 

struct

file *filp)  

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

static

intchar_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

intchar_dev_ioctl(

struct

inode *inode,

struct

file *file,unsigned 

intcmd,unsigned 

long

arg)  

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

static

struct

file_operations char_dev_fops =   

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

static

void

char_dev_setup_cdev(

struct

cdev *dev, 

intminor, 

struct

file_operations *fops)  

printk("char_dev device setup.\n"

);  

}  //   裝置初始化 

static

intchar_dev_init(

void

)    

else

if(result 

//獲取裝置號失敗返回

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"

);  

[cpp]view plain

copy

## 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 2 6字元裝置驅動程式樣例

寫這些東西還真是花時間啊,繼續昨天的內容。我寫驅動的時候總希望能找到乙個樣例參考一下,可惜網上的例子基本找不到。還好友善之臂的文件裡有些例子,但是說的很不詳細,要是直接輸入會有很多的編譯錯誤。我的這個例子是乙個控制led的例子,用linux就控制led,當然是相當的弱智的哈哈。我用的是s3c2410...

2 6字元裝置驅動

chardev.c include include for file f op include include for copy to user include for cdev cdev init,cdev add module license gpl module author helight ...

linux2 6 裝置驅動編寫

從2.6版本開始引入了platform這個概念,在開發底層驅動程式時,首先要確認的就是裝置的資源資訊,例如裝置的位址,在2.6核心中將每個裝置的資源用結構platform device來描述,該結構體定義在kernel include linux platform device.h中,struct ...