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