/*****************************
*
* 驱动程序模板
* 版本:V1
* 使用方法(末行模式下):
* :%s/xxx/"你的驱动名称"/g
*
*******************************/

#include <linux/mm.h>
#include <linux/miscdevice.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/mman.h>
#include <linux/random.h>
#include <linux/init.h>
#include <linux/raw.h>
#include <linux/tty.h>
#include <linux/capability.h>
#include <linux/ptrace.h>
#include <linux/device.h>
#include <linux/highmem.h>
#include <linux/crash_dump.h>
#include <linux/backing-dev.h>
#include <linux/bootmem.h>
#include <linux/splice.h>
#include <linux/pfn.h>
#include <linux/export.h>
#include <linux/io.h>
#include <linux/aio.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <asm/uaccess.h>
#include <linux/ioctl.h>

/**************** 基本定义 **********************/
//内核空间缓冲区定义
#if 0
#define KB_MAX_SIZE 20
#define kbuf[KB_MAX_SIZE];
#endif

//加密函数参数内容: _IOW(IOW_CHAR , IOW_NUMn , IOW_TYPE)
//加密函数用于xxx_ioctl函数中
//使用举例:ioctl(fd , _IOW('L',0x80,long) , 0x1);
//#define NUMn xxx , if you need!
#define IOW_CHAR 'L'
#define IOW_TYPE long
#define IOW_NUM1 0x80

//初始化函数必要资源定义
//用于初始化函数当中
//device number;
dev_t dev_num;
//struct dev
struct cdev xxx_cdev;
//auto "mknode /dev/xxx c dev_num minor_num"
struct class *xxx_class = NULL;
struct device *xxx_device = NULL;

/**************** 结构体 file_operations 成员函数 *****************/
//open
static int xxx_open(struct inode *inode, struct file *file)
{
printk("xxx drive open...\n");

return 0;
}

//close
static int xxx_close(struct inode *inode , struct file *file)
{
printk("xxx drive close...\n");

return 0;
}

//read
static ssize_t xxx_read(struct file *file, char __user *buffer,
size_t len, loff_t *pos)
{
int ret_v = 0;
printk("xxx drive read...\n");

return ret_v;
}

//write
static ssize_t xxx_write( struct file *file , const char __user *buffer,
size_t len , loff_t *offset )
{
int ret_v = 0;
printk("xxx drive write...\n");

return ret_v;
}

//unlocked_ioctl
static int xxx_ioctl (struct file *filp , unsigned int cmd , unsigned long arg)
{
int ret_v = 0;
printk("xxx drive ioctl...\n");

switch(cmd)
{
//常规:
//cmd值自行进行修改
case 0x1:
{
if(arg == 0x1) //第二条件;
{

}
}
break;

//带密码保护:
//请在"基本定义"进行必要的定义
case _IOW(IOW_CHAR,IOW_NUM1,IOW_TYPE):
{
if(arg == 0x1) //第二条件
{

}

}
break;

default:
break;
}

return ret_v;
}

/***************** 结构体: file_operations ************************/
//struct
static const struct file_operations xxx_fops = {
.owner = THIS_MODULE,
.open = xxx_open,
.release = xxx_close,
.read = xxx_read,
.write = xxx_write,
.unlocked_ioctl = xxx_ioctl,
};

/************* functions: init , exit*******************/
//条件值变量,用于指示资源是否正常使用
unsigned char init_flag = 0;
unsigned char add_code_flag = 0;

//init
static __init int xxx_init(void)
{
int ret_v = 0;
printk("xxx drive init...\n");

//函数alloc_chrdev_region主要参数说明:
//参数2: 次设备号
//参数3: 创建多少个设备
if( ( ret_v = alloc_chrdev_region(&dev_num,0,1,"xxx") ) < 0 )
{
goto dev_reg_error;
}
init_flag = 1; //标示设备创建成功;

printk("The drive info of xxx:\nmajor: %d\nminor: %d\n",
MAJOR(dev_num),MINOR(dev_num));

cdev_init(&xxx_cdev,&xxx_fops);
if( (ret_v = cdev_add(&xxx_cdev,dev_num,1)) != 0 )
{
goto cdev_add_error;
}

xxx_class = class_create(THIS_MODULE,"xxx");
if( IS_ERR(xxx_class) )
{
goto class_c_error;
}

xxx_device = device_create(xxx_class,NULL,dev_num,NULL,"xxx");
if( IS_ERR(xxx_device) )
{
goto device_c_error;
}
printk("auto mknod success!\n");

//------------ 请在此添加您的初始化程序 --------------//

//如果需要做错误处理,请:goto xxx_error;

add_code_flag = 1;
//---------------------- END ---------------------------//

goto init_success;

dev_reg_error:
printk("alloc_chrdev_region failed\n");
return ret_v;

cdev_add_error:
printk("cdev_add failed\n");
unregister_chrdev_region(dev_num, 1);
init_flag = 0;
return ret_v;

class_c_error:
printk("class_create failed\n");
cdev_del(&xxx_cdev);
unregister_chrdev_region(dev_num, 1);
init_flag = 0;
return PTR_ERR(xxx_class);

device_c_error:
printk("device_create failed\n");
cdev_del(&xxx_cdev);
unregister_chrdev_region(dev_num, 1);
class_destroy(xxx_class);
init_flag = 0;
return PTR_ERR(xxx_device);

//------------------ 请在此添加您的错误处理内容 ----------------//
xxx_error:

add_code_flag = 0;
return -1;
//-------------------- END -------------------//

init_success:
printk("xxx init success!\n");
return 0;
}

//exit
static __exit void xxx_exit(void)
{
printk("xxx drive exit...\n");

if(add_code_flag == 1)
{
//---------- 请在这里释放您的程序占有的资源 ---------//
printk("free your resources...\n");

printk("free finish\n");
//---------------------- END -------------------//
}

if(init_flag == 1)
{
//释放初始化使用到的资源;
cdev_del(&xxx_cdev);
unregister_chrdev_region(dev_num, 1);
device_unregister(xxx_device);
class_destroy(xxx_class);
}
}

/**************** module operations**********************/
//module loading
module_init(xxx_init);
module_exit(xxx_exit);

//some infomation
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("from Jafy");
MODULE_DESCRIPTION("xxx drive");

/********************* The End ***************************/

Linux驱动开发之字符设备模板的更多相关文章

  1. Linux驱动开发2——字符设备驱动

    1.申请设备号 #include <linux/fs.h> int register_chrdev_region(dev_t first, unsigned int count, char ...

  2. Linux驱动开发之字符设备驱动模型之file_operations

    90%的驱动模型都是按照下图开发的 下面来说下设备描述结构是什么东西 打开Linux-2.6.32.2的Source Insight 工程,搜索cdev 比如一个应用程序需要调用read和write这 ...

  3. linux驱动开发之块设备学习笔记

    我的博客主要用来存放我的学习笔记,如有侵权,请与我练习,我会立刻删除.学习参考:http://www.cnblogs.com/yuanfang/archive/2010/12/24/1916231.h ...

  4. 驱动开发--【字符设备、块设备简介】【sky原创】

    驱动开发   字符设备,块设备,网络设备   字符设备 以字节流的方式访问, 不能随机访问 有例外,显卡.EEPROM可以随机访问   EEPROM可以擦写1亿次,是一种字符设备,可以随机访问 读写是 ...

  5. 初入android驱动开发之字符设备(一)

    大学毕业,初入公司,招进去的是android驱动开发工程师的岗位,那时候刚进去,首先学到的就是如何搭建kernel.android的编译环境,然后就是了解如何刷设备以及一些最基本的工具.如adb.fa ...

  6. Linux 驱动框架---cdev字符设备驱动和misc杂项设备驱动

    字符设备 Linux中设备常见分类是字符设备,块设备.网络设备,其中字符设备也是Linux驱动中最常用的设备类型.因此开发Linux设备驱动肯定是要先学习一下字符设备的抽象的.在内核中使用struct ...

  7. 初入android驱动开发之字符设备(四-中断)

    上一篇讲到android驱动开发中,应用是怎样去操作底层硬件的整个流程,实现了按键控制led的亮灭.当然,这是一个非常easy的实例,只是略微演变一下,就能够得到广泛的应用. 如开发扫描头,应用透过监 ...

  8. 【Linux 驱动】简单字符设备驱动架构(LED驱动)

    本文基于icool210开发板,内核版本:linux2.6.35: 驱动代码: (1)头文件:led.h #ifndef __LED_H__ #define __LED_H__ #define LED ...

  9. 【linux驱动笔记】字符设备驱动相关数据结构与算法

    欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...

随机推荐

  1. iOS UIButton 设置图片文字垂直排列

    后面经过测试,如果button的文字长度变更,会导致图片位置变化,经过多次修改UIEdgeInsets的值也没有达到期望效果,最终采用集成UIButton类,重写layoutSubviews函数实现, ...

  2. wmware10安装ghost win7问题处理

    随便找到了ghostwin7.iso, 先建立空的虚拟机, 加载iso, 按F2, 设置启动从光盘启动, 启动进去后点直安装Ghost镜像到C盘, 失盘, 直接跳到dos界面了. 忘记先要分区了, 使 ...

  3. 软件测试入门——测试模型(V型 W型 H型)

    软件测试工程师称为“QA”,质量保证者——这是入门的第一点要学习的. 首先看基本的测试模型 1.“V”型 特点:[活动串行]这是一种古老的瀑布模型,反映了实际和测试之间的关系. 局限:仅仅把测试过程作 ...

  4. OC项目中使用Swift

    1.在OC工程中新建 Swift 文件,会提示的是否创建一个桥接文件,创建不创建都无所谓,这个桥接文件主要是用来包含OC头文件的,主要用于Swift中使用OC         2.在Person.sw ...

  5. MSP430F149学习之路——PWM信号

    代码一: /******************************* 程序功能:ACLK=32768Hz PWM波 T=512/32768 占空比75% ******************** ...

  6. mysql中-e用法

    实际应用中,不仅可以先登陆mysql再使用,还可以在链接的时候进行sql操作,此时需要加参数-e 例: >mysql -hlocalhost -P8080 -uroot -p123456 -e' ...

  7. SQL:认识数据库约束

    讲了关于数据库的很多内容,也讲了很多约束,对唯一和主键.核查和规则.外键约束很感兴趣. 一.唯一和主键(实体完整性) 区别: 数量:一张表只可以有一个主键约束,却可以有多个唯一约束. 是否空值:主键不 ...

  8. hql 关联查询

    HQL 带的连接语句只能是实体与 该实体的属性 进行连接 其意义就是为了优化(通过延迟加载查询关联的属性)需要进行配置 from A left join A.B where (b.flag is nu ...

  9. iptable nat网关

    echo "1" > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -s 192.168.1.0/ ...

  10. C# 加密算法

     public static class Common     {         #region MD5加密         /// <summary>            /// M ...