#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. 关于加号传递到后端会变为空格的c#例子

    参考博客:http://blog.csdn.net/nsdnresponsibility/article/details/50965262 以前在一次传递参数的情况中遇到,特此记录一下. 之前传递的参 ...

  2. document文档碎片

    var arrText = ["1","2","3","4","5","6",& ...

  3. luogu3980 [NOI2008]志愿者招募

    神题,还不太清楚 #include <iostream> #include <cstring> #include <cstdio> #include <que ...

  4. Apache 流框架 Flink,Spark Streaming,Storm对比分析(1)

    此文已由作者岳猛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.Flink架构及特性分析 Flink是个相当早的项目,开始于2008年,但只在最近才得到注意.Flink是 ...

  5. python算法-栈

    定义: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元 ...

  6. 【java 基础 9】原来我从没有了解过String类

    导读:这两天没有做项目,然后就想着把之前在项目中用到过的东西总结总结.记得之前做今日开讲项目时,在比较学生学号的时候,我最开始用的是"==",但是,实践证明,这个玩意儿吧,总是很奇 ...

  7. 牛腩新闻发布系统(五):VS网站发布及常见问题

    导读:在千万个回眸中,终于看见了牛腩的归途.好吧,牛腩该整合的都整合完毕了,到了发布的时候了.这时候,不得不再次感慨那句不知道感慨了多少次的感慨:为什么,我要遭遇这么多的坎坷?下面,结合自己的情况,说 ...

  8. 彻底解决Request Too Long的问题

    运行regedit,进入 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters , 1. 添加类型为 DWORD(3 ...

  9. hdu6071[最短路+解不等式] 2017多校4

    求出所有,从2走到x所需的花费在对 t = 2*min(d1,2, d2,3) 模运算下,  所有剩余系的最短路即可(把一个点拆成 t 个点, 每个点代表一种剩余系), 知道了所有剩余系就可以凑出答案 ...

  10. BZOJ 3270 博物馆 ——概率DP 高斯消元

    用$F(i,j)$表示A在i,B在j的概率. 然后很容易列出转移方程. 然后可以高斯消元了! 被一个问题困扰了很久,为什么起始点的概率要加上1. (因为其他博客上都是直接写成-1,雾) 考虑初始状态是 ...