#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>
#include <linux/cdev.h>
#include <linux/types.h> #define xxx_DEVICE_COUNT 1 /*自己主动创建设备节点类*/
static struct class *xxx_dev_class;
static struct class_device *xxx_dev_class_dev; /*
xxx设备相关的相关操作函数:open、read、write、close、ioctl等
*/
static int xxx_dev_open(struct inode *inode, struct file *filp)
{
printk("Open xxx device OK.\n");
return 0;
} static int xxx_dev_close(struct inode *inode, struct file *filp)
{
printk("Close xxx device OK.\n");
return 0;
} static int xxx_dev_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{
printk("Write xxx device OK.\n");
return 0;
} static int xxx_dev_read(struct file *file, const char __user *buf, size_t count, loff_t ppos)
{
printk("Read xxx device OK.\n");
return 0;
} static int xxx_dev_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
printk("DRIVER : Get cmd %d.\n", cmd);
return 0;
} /*
xxx设备操作函数结构体
*/
struct file_operations xxx_fops = {
.owner = THIS_MODULE,
.open = xxx_dev_open,
.release = xxx_dev_close,
.read = xxx_dev_read,
.write = xxx_dev_write,
.ioctl = xxx_dev_ioctl,
}; /*
xxx设备驱动模块的注冊和卸载
*/
int xxx_major = 0;
static int __init initialization_xxx_dev(void)
{
/* 注冊设备号 */
printk("Before register xxx Major = %d\n", xxx_major);
if (xxx_major) {
register_chrdev(xxx_major, "xxx", &xxx_fops);
} else {
xxx_major = register_chrdev(0, "xxx", &xxx_fops);
}
printk("After register xxx Major = %d\n", xxx_major); /* 自己主动生成设备节点 */
xxx_dev_class = class_create(THIS_MODULE, "xxx_dev");
xxx_dev_class_dev = class_device_create(xxx_dev_class, NULL, MKDEV(xxx_major, 0), NULL, "xxx");
/* 模块初始化成功必须返回0 */
printk("Module register OK.\n");
return 0;
} static void __exit cleanup_xxx_dev(void)
{
/* 删除设备文件 */
unregister_chrdev(xxx_major, "xxx");
class_device_unregister(xxx_dev_class_dev);
class_destroy(xxx_dev_class); printk("Module unregister OK.\n");
} /*
模块注冊与卸载
*/
module_init(initialization_xxx_dev);
module_exit(cleanup_xxx_dev); /*
模块传參:insmod char_driver_frame_old.ko xxx_major=xxx
*/
module_param(xxx_major, int, S_IRUGO); /*
模块的相关声明
*/
MODULE_AUTHOR("lhbo");
MODULE_DESCRIPTION("GPIO Driver for xxx");
MODULE_LICENSE("GPL");

linux字符设备驱动程序框架(老方法)的更多相关文章

  1. 浅析Linux字符设备驱动程序内核机制

    前段时间在学习linux设备驱动的时候,看了陈学松著的<深入Linux设备驱动程序内核机制>一书. 说实话.这是一本非常好的书,作者不但给出了在设备驱动程序开发过程中的所须要的知识点(如对 ...

  2. ARM Linux字符设备驱动程序

    1.主设备号和次设备号(二者一起为设备号): 一个字符设备或块设备都有一个主设备号和一个次设备号.主设备号用来标识与设备文件相连的驱动程序,用来反  映设备类型.次设备号被驱动程序用来辨别操作的是哪个 ...

  3. 一步步理解linux字符设备驱动框架(转)

    /* *本文版权归于凌阳教育.如转载请注明 *原作者和原文链接 http://blog.csdn.net/edudriver/article/details/18354313* *特此说明并保留对其追 ...

  4. 简单linux字符设备驱动程序

    本文代码参考<LINUX设备驱动程序>第三章 字符设备驱动程序 本文中的“字符设备”是一段大小为PAGE_SIZE的内存空间 功能:向字符设备写入字符串:从字符设备读出字符串 代码: 1. ...

  5. 一个简单的演示用的Linux字符设备驱动程序

    实现如下的功能:--字符设备驱动程序的结构及驱动程序需要实现的系统调用--可以使用cat命令或者自编的readtest命令读出"设备"里的内容--以8139网卡为例,演示了I/O端 ...

  6. Linux字符设备驱动框架

    字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标.键盘.显示器.串口等等,当我们执行ls -l ...

  7. Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗?

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  8. Linux字符设备简单示例

    1. Linux字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现open.close.read和write系统调用.例如:串口.Led.按键等. 2. 通过字符设备文件 ...

  9. 嵌入式Linux驱动学习之路(二十一)字符设备驱动程序总结和块设备驱动程序的引入

    字符设备驱动程序 应用程序是调用C库中的open read write等函数.而为了操作硬件,所以引入了驱动模块. 构建一个简单的驱动,有一下步骤. 1. 创建file_operations 2. 申 ...

随机推荐

  1. python--内置函数03

    一 . 正则表达式 匹配字符串 元字符 . 除了换行 \w 数字, 字母, 下划线 \d 数字 \s 空白符 \n \t \b 单词的边界 \W 非xxx \D \S [ ] 字符组 or的关系 [^ ...

  2. Python9-day3-作业

    ascli  字母,数字.特殊字符,1个字节.8位 unicode:16位 两个字节,升级32位,四个字节 utf-8:最少一个字节 8位,英文字母, 1,有变量name = "aleX l ...

  3. C#中何时使用dynamic

    背景:比如说,有一个方法,有很多参数,且有时候只需要其中的某几个参数,有时候需要使用全部,甚至有时候一个都不需要,这时候写一个长长的参数列表一点都不酷,且容易 出错,这时候就需要考虑C#的dynami ...

  4. python基础学习笔记——collections模块

    在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict.namedtuple和Ord ...

  5. python基础学习笔记——方法返回值

    字符串中(需要有变量接收) 判断是不是阿拉伯数字,返回的是布尔值 1 2 3 4 name = 'alexdasx' new_name = name.isdigit() print(new_name) ...

  6. 1,python初识

    什么是变量? 变量:将程序的中间结果暂时存储起来,以便后续程序调用. 什么是字符串类型? python中被引号引起来的数据就是字符串.字符串类型,也简称str类型. 在python中 int是什么? ...

  7. WordPress 多语言支持(本地化)

    本博客将介绍WordPress的多语言制作 首先需要在wp-content目录下创建一个languages文件夹,用于存放语言包文件. 然后在模板目录下的functions.php,然后在代码中添加函 ...

  8. BNUOJ 1055 走迷宫2

    走迷宫2 Time Limit: 1000ms Memory Limit: 65535KB   64-bit integer IO format: %lld      Java class name: ...

  9. “玲珑杯”ACM比赛 Round #13 B -- 我也不是B,倍增+二分!

    B  我也不是B   这个题做了一下午,比赛两个小时还是没做出来,比完赛才知道要用一个倍增算法确定区间,然后再二分右端点.   题意:定义一个序列的混乱度为累加和:b[i]*v[i],b[i]为这个序 ...

  10. [UOJ#223][BZOJ4654][Noi2016]国王饮水记

    [UOJ#223][BZOJ4654][Noi2016]国王饮水记 试题描述 跳蚤国有 n 个城市,伟大的跳蚤国王居住在跳蚤国首都中,即 1 号城市中.跳蚤国最大的问题就是饮水问题,由于首都中居住的跳 ...