资源简介
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);
}
相关资源
- weblogic集群部署步骤详细相关文档资料
- LINUX下的MODBUS-RTU驱动程序
- jdk-8u261-x64(含linuxwindowsmacos)
- linux下基于QT和v4l2驱动的USB摄像头视频
- 添加WIN7 Print Spooler服务
- Zedboard ov7725板端Linux下tcp视频发送
- Linux上实现基于Socket_的多进程实时通
- xgcom-0.04.2源码
- linux下的一个异步通信的串口类
- fullcalendar1.5.1 添加双击事件版本
- Linux设备驱动
- Linux内存分配与回收
- linux gsm0710 CMUX串口多路复用源码
- Linux Socket 基于GTK+聊天软件
- v4l2采集视频并保存和lcd显示
- Linux基于Live555从共享内存 获取rstp实时
- linux下二进制拆弹
- 《Linux环境编程》编程题答案及实验报
- linux平台基于socket图形化网络聊天
- 用链表实现的一个电话本小程序
- linux系统iftop命令所有安装包依赖包
- Linux系统操作实习报告
- 基于嵌入式Linux的车载定位系统设计
- 添加运动(motion blur)与去运动模糊(
- 基于嵌入式Linux系统的远程数据采集
- 实验2 Linux内核编译及系统调用添加
- 支持VMWare Esxi6.7虚拟机操作系统,VM
- Linux下Nao环境搭建及其运行调试
- linuxcnc插补算法函数调用关系图
- 百度网盘qimo for kids带中文版qimo 2.0
评论
共有 条评论