资源简介
Linux增加字符设备驱动实验,可以打印出一个hello world
代码片段和文件信息
/*
* devDrv.c
* threeProcess
* Created on: 2012-2-24
* Author: zhushengben
*/
#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(message
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3230 2017-05-09 19:42 Linux增加字符设备驱动实验\devDrv.c
文件 803 2017-05-09 19:43 Linux增加字符设备驱动实验\Makefile
文件 1211 2017-05-09 19:44 Linux增加字符设备驱动实验\test.c
目录 0 2017-05-09 19:44 Linux增加字符设备驱动实验
----------- --------- ---------- ----- ----
5244 4
- 上一篇:燕山大学软件工程编译原理实验报告
- 下一篇:计算机体系结构论文作业
相关资源
- linux tcp udp 调试工具
- linux 下c实现简单的网络嗅探器
- rm.bat 在win下模拟linux rm命令的bat文件
- Linux下串口读写例程
- 《嵌入式Linux应用程序开发标准教程》
- linux的arpSpoof源代码加编译好的程序
- linux和win32下通用的互斥锁Mutex封装
- 在Linux下添加系统调用
- ARM&linux嵌入式系统教程每章答案-马忠
- Vsftp2.3.4 for linux
- intel_parallel_studio_xe_2013_update2_intel64_
- 最新 socks5-v1.0r11.tar.gz linux代理配置源
- linux ftp服务器安装包vsftpd-1.1.3-8.i386
- Linux常用Shell脚本珍藏
- Linux运维工程师成长必经之路.pdf
- 基于linux下用c编写的socket通信传输文
- linux rootkit源码
- linux下shell编程实验报告-考勤系统
- Linux网络编程 第2版带详细目录
- Linux JDK 1.6 1.7 1.8 齐全
- debian-10.4.0-amd64-netinst.iso
- linux Qt4 软键盘
- cuda_9.0.103_384.59_linux.run 百度网盘地址
- cudnn-9.0-linux-x64-v7 百度网盘地址
- linux ov5640驱动源码
- mp3 播放器的linux c代码
- 自己总结的Linux_Shell_脚本讲解+
- linux,windosarm 三版本lcx
- Linux更换JDK+weblogic更换JDK
- Linux 实验8
评论
共有 条评论