资源简介
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);
}
相关资源
- uboot到linux logo显示不间断 补丁
- UNIX/LINUX编程实践教程的源码
- Linux任务管理器
- linux应用层的华容道游戏源代码
- ubuntu9.10 可加载内核模块和字符设备驱
- MP3文件ID3v2ID3v2APEv2标签读取
- 操作系统实验——虚存管理实验
- linux下的发包工具sendip
- 尚观培训linux许巍关于c 的笔记和讲义
- 尚观培训linux董亮老师关于数据结构的
- linux 线程池源码 c 版
- linux C 电梯程序练习
- linux下用多进程同步方法解决生产者
- 学生管理系统的添加、修改、删除、
- ListBox动态添加数据删除数据和上移下
- Linux 操作系统实验(全)
- Linux From Scratch 中文手册
- linux 网络实验 ftp程序
- Linux命令大全离线版&在线版
- 操作系统共享内存实验
- dos 下运行Linux 命令--gnu_utils
- linux 0.12内核源代码
- linux简易shell C实现
- linux实验报告及心得体会
- 基于GTK的Linux环境下的简易任务管理器
- linux扫雷游戏代码
- CAN Linux驱动代码
- Linux系统教材
- intel 82579LM 网卡驱动Linux系统版 v1.9.
- SA1110处理器掌上电脑液晶显示器设计
评论
共有 条评论