資源簡介
linux下采用模塊方法,添加一個新的設備驅動程序。
要求添加字符設備的驅動。
另附一個應用程序,測試添加的驅動程序
代碼片段和文件信息
#include?“linux/kernel.h“
#include?“linux/module.h“
#include?“linux/fs.h“
#include?“linux/init.h“
#include?“linux/types.h“
#include?“linux/errno.h“
#include?“linux/uaccess.h“
#include?“linux/kdev_t.h“
#define?MAX_SIZE?1024
static?int?my_open(struct?inode?*inode?struct?file?*file);
static?int?my_release(struct?inode?*inode?struct?file?*file);
static?ssize_t?my_read(struct?file?*file?char?__user?*user?size_t?t?loff_t?*f);
static?ssize_t?my_write(struct?file?*file?const?char?__user?*user?size_t?t?loff_t?*f);
static?char?message[MAX_SIZE]?=?“-------congratulations--------!“;
static?int?device_num?=?0;//設備號
static?int?counter?=?0;//計數用
static?int?mutex?=?0;//互斥用
static?char*?devName?=?“myDevice“;//設備名
struct?file_operations?pStruct?=
{?open:my_open?release:my_release?read:my_read?write:my_write?};
/*?注冊模塊?*/
int?init_module()
{
int?ret;
/*?函數中第一個參數是告訴系統,新注冊的設備的主設備號由系統分配,
?*?第二個參數是新設備注冊時的設備名字,
?*?第三個參數是指向file_operations的指針,
?*?當用設備號為0創建時,系統一個可以用的設備號創建模塊?*/
ret?=?register_chrdev(0?devName?&pStruct);
if?(ret?0)
{
printk(“regist?failure!\n“);
return?-1;
}
else
{
printk(“the?device?has?been?registered!\n“);
device_num?=?ret;
printk(“<1>the?virtual?device‘s?major?number?%d.\n“?device_num);
printk(“<1>Or?you?can?see?it?by?using\n“);
printk(“<1>------more?/proc/devices-------\n“);
printk(“<1>To?talk?to?the?drivercreate?a?dev?file?with\n“);
printk(“<1>------‘mknod?/dev/myDevice?c?%d?0‘-------\n“?device_num);
printk(“<1>Use?\“rmmode\“?to?remove?the?module\n“);
return?0;
}
}
/*?注銷模塊,函數名很特殊?*/
void?cleanup_module()
{
unregister_chrdev(device_num?devName);
printk(“unregister?it?success!\n“);
}
static?int?my_open(struct?inode?*inode?struct?file?*file)
{
????????if(mutex)
????????????????return?-EBUSY;
????????mutex?=?1;//上鎖
printk(“<1>main??device?:?%d\n“?MAJOR(inode->i_rdev));
printk(“<1>slave?device?:?%d\n“?MINOR(inode->i_rdev));
printk(“<1>%d?times?to?call?the?device\n“?++counter);
try_module_get(THIS_MODULE);
return?0;
}
/*?每次使用完后會release?*/
static?int?my_release(struct?inode?*inode?struct?file?*file)
{
printk(“Device?released!\n“);
module_put(THIS_MODULE);
????????mutex?=?0;//開鎖
return?0;
}
static?ssize_t?my_read(struct?file?*file?char?__user?*user?size_t?t?loff_t?*f)
{
if(copy_to_user(usermessagesizeof(message)))
{
return?-EFAULT;
}
return?sizeof(message);
}
static?ssize_t?my_write(struct?file?*file?const?char?__user?*user?size_t?t?loff_t?*f)
{
if(copy_from_user(messageusersizeof(message)))
{
return?-EFAULT;
}
return?sizeof(message);
}
評論
共有 條評論