资源简介
很好的东西和大家分享,是基于linux2.6内核的。很好用的!
代码片段和文件信息
//模块定义
#include
#include
#include
#include
#include
#include
#include
MODULE_LICENSE(“GPL“);
static int chdr_major = 150;//主设备号
static int chdr_minor = 0;//次设备号
static int chdr_nr_devs = 1;
static int open_nr=0;//打开设备的进程数
static struct cdev *chdr_cdev;//设备定义声明
static char buffer[100];//缓冲区
//函数声明
static int chdr_open(struct inode *inode struct file *filp);
static int chdr_release(struct inode *inode struct file* filp);
static ssize_t chdr_read(struct file *file char __user *buf size_t count loff_t *f_pos);
static ssize_t chdr_write(struct file *file const char __user *buf size_t count loff_t *f_pos);
//设备模块接口
static struct file_operations chdr_fops = {
.owner = THIS_MODULE
.read = chdr_read
.write = chdr_write
.open = chdr_open
.release = chdr_release
};
//打开函数
static int chdr_open(struct inode *inode struct file *filp)
{
if (open_nr == 0) {
open_nr++;
} else {
printk(KERN_ALERT “Another process open the char device.\n“);//进程挂起
return -1;
}
return 0;
}
//阅读函数
static ssize_t chdr_read(struct file *file char __user *buf size_t count loff_t *f_pos)
{
if (buf == NULL)
return 0;
if (count > 100)
count = 100;
copy_to_user(buf buffer count);//读缓冲
return count;
}
//写入函数
static ssize_t chdr_write(struct file *file const char __user *buf size_t count loff_t *f_pos)
{
if (buf == NULL)
return 0;
if (count > 100)
count = 100;
copy_from_user(buffer buf count);//写缓冲
return count;
}
//释放设备函数
static int chdr_release(struct inode *inode struct file* filp)
{
open_nr--;//进程数减1
return 0;
}
//注册设备函数
static int __init chdr_init(void)
{
int result err;
dev_t dev = 0;
printk(KERN_ALERT “Begin to init Char Device!\n%d“open_nr);
//注册设备
if (chdr_major) {
dev = MKDEV(chdr_major chdr_minor);
result = register_chrdev_region(dev chdr_nr_devs “chdr“);
} else {
result = alloc_chrdev_region(&dev chdr_minor chdr_nr_devs “chdr“);
chdr_major = MAJOR(dev);
}
if (result < 0) {
printk(KERN_WARNING “chdr: cannot get major %d\n“ chdr_major);
return result;
}
chdr_cdev = cdev_alloc();
if (chdr_cdev == NULL) {
printk(KERN_WARNING “chdr: alloc cdev failed.\n“);
return -1;
}
//初始化设备
chdr_cdev->owner = THIS_MODULE;
chdr_cdev->ops = &chdr_fops;
cdev_init(chdr_cdev &chdr_fops);
err = cdev_add(chdr_cdev dev 1);
if (err) {
printk(KERN_NOTICE “Error %d adding chdr.\n“ err);
}
open_nr = 0;
printk(“%d“open_nr);
return 0;
}
//注销设备函数
static void __exit chdr_exit(void)
{
dev_t dev;
printk(KERN_ALERT “Unloading...\n“);
dev = MKDEV(chdr_major chdr_minor);
unregister_chrdev_region(dev chdr_nr_devs);//注销设备
cdev_del(chdr_cd
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 206 2009-06-03 13:21 驱动设计\Makefile
文件 3294 2009-06-03 13:31 驱动设计\mydrive.c
文件 875 2009-06-03 13:32 驱动设计\test.c
文件 24251 2009-06-15 23:34 驱动设计\设备驱动实习报告.docx
目录 0 2009-06-15 23:35 驱动设计
----------- --------- ---------- ----- ----
28626 5
相关资源
- telnet-server-0.17-47.el6.x86_64.rpm和telnet-
- 微信JS-SDK微信分享接口开发实用版代
- ST7701_854*480显示屏初始化参数
- STM32多路数据采集源代码
- SCE-UA代码
- 《编程风格:好代码的逻辑》随书代
- 最新vivado2019版本,win和linux都有,安
- 字典学习PPT和源码
- openCL编程指导随书源代码
- 树莓派控制RGB LED源代码softPwm
- spring ioc+mvc代码
- 马赛克效果的JS图片切换代码.rar
- js左右切换鼠标可控的无缝图片滚动代
- oc学生成绩管理系统和计算器
- Cef3博文配套源代码
- CADENCE DRC错误代码
- TS解析源代码
- 智能交通灯 系统 源代码
- AES256 c代码及demo例程
- 基于单片机的频率计设计
- 5行代码实现微信网页中扫一扫,域名
- 生成gold序列和m序列的Verilog代码实现
- 智能交通灯控制器keil程序代码+Prote
- 数字信号-IIR数字滤波器设计
- 《OSPF协议完全实现》随书源代码官方
- linux上实现多进程和多线程实现同步互
- linux下使用minicom连接开发板.doc
- STM32蓝牙模块测试代码
- ARM linux 和上位机windows10进行TCP/IP网络
- Linux系统下基于Qt的局域网即时通信系
评论
共有 条评论