/*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」);
#define dp_major 250 /*the major number of the chardev*/
#define dp_minor 0 /*the minor number of the chardev*/
static int char_read(struct file *filp,char __user *buffer,size_t,loff_t *); /*the read operation of the chardev—-read the data from kernel*/
static int char_open(struct inode *,struct file *); /*open the chardev*/
static int char_write(struct file *filp,const char __user *buffer,size_t ,loff_t*); /*write data to kernel*/
static int char_release(struct inode *,struct file *); /*release the chardev*/
static int chropen; /*the chardev open or not*/
struct cdev *chardev; /*define a char device*/
static int len;
static const struct file_operations char_ops = ;
static int __init char_init(void)
if(register_chrdev_region(dev,10,」chardev」))
chropen=0;
len=0;
cdev_init(chardev,&char_ops);
if(cdev_add(chardev,dev,1))
return 0;
}static int char_open(struct inode *inode,struct file *file)
try_module_get(this_module);
return 0;
}static int char_release(struct inode *inode,struct file *file)
static int char_read(struct file *filp,char __user *buffer,size_t length,loff_t *offset)
}else
}return -1;
}static int char_write(struct file *filp,const char __user *buffer,size_t length,loff_t *offset)
static void __exit module_close(void)
module_init(char_init);
module_exit(module_close);
使用者測試程式:
/*main.c*/
#include
#include
#include
#include
#include
#include
#include
int main(void)
rf=read(testdev,buf,12);
if(rf<0)
perror("read error/n");
printf("r:%s/n",buf);
close(testdev);
return 0;
}編譯載入和使用:
<1>程式chardev.c是字元驅動程式,是以核心模組的形式插入核心的,所以編譯方法和核心模組的編譯方法一致。
<2>模組的載入和解除安裝也和上面所述的核心模組的載入和解除安裝方法一致。
<3>裝置節點的建立,mknod /dev/chardev0 c 250 0
命令解釋:
mknod是建立裝置節點的命令;
/dev/chardev0:在/dev/目錄下建立chardev0這樣乙個節點。
c:這個節點是指向乙個字元裝置的節點
250:這個裝置的主裝置號
0:次裝置號
<3>編譯使用者程式gcc -o chardev_test main.c
<4>執行chmod 666 /dev/chardev0 使其它使用者也可以對這個裝置進行讀寫操作,否則只有root使用者可以對它進行讀寫。
<5>執行chardev_test,如果沒有什麼問題的話應該要輸出這幾個字元。
r:hello world!
linux2 6字元裝置驅動開發模板
cpp view plain copy include include include include include 字元裝置驅動模板開始 define char dev device name char dev 是應當連線到這個編號範圍的裝置的名字,出現在 proc devices和sysfs中...
Linux 2 6字元裝置驅動程式樣例
寫這些東西還真是花時間啊,繼續昨天的內容。我寫驅動的時候總希望能找到乙個樣例參考一下,可惜網上的例子基本找不到。還好友善之臂的文件裡有些例子,但是說的很不詳細,要是直接輸入會有很多的編譯錯誤。我的這個例子是乙個控制led的例子,用linux就控制led,當然是相當的弱智的哈哈。我用的是s3c2410...
字元裝置驅動3 字元類裝置驅動框架分析
前面的博文循規蹈矩按照無驅動框架的步驟分析了乙個簡單的字元裝置驅動,但是現如今更多是使用核心開發者提供的驅動框架來完成驅動的註冊,這樣的做法即可減少 的錯誤率,也能避免錯誤例如記憶體申請忘記釋放的問題,更能簡化驅動的開發難度,這裡就以乙個簡答的led類裝置驅動架構為例,分析字元裝置驅動框架 驅動框架...