linux字符设备驱动程序框架(老方法)
#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字符设备驱动程序框架(老方法)的更多相关文章
- 浅析Linux字符设备驱动程序内核机制
前段时间在学习linux设备驱动的时候,看了陈学松著的<深入Linux设备驱动程序内核机制>一书. 说实话.这是一本非常好的书,作者不但给出了在设备驱动程序开发过程中的所须要的知识点(如对 ...
- ARM Linux字符设备驱动程序
1.主设备号和次设备号(二者一起为设备号): 一个字符设备或块设备都有一个主设备号和一个次设备号.主设备号用来标识与设备文件相连的驱动程序,用来反 映设备类型.次设备号被驱动程序用来辨别操作的是哪个 ...
- 一步步理解linux字符设备驱动框架(转)
/* *本文版权归于凌阳教育.如转载请注明 *原作者和原文链接 http://blog.csdn.net/edudriver/article/details/18354313* *特此说明并保留对其追 ...
- 简单linux字符设备驱动程序
本文代码参考<LINUX设备驱动程序>第三章 字符设备驱动程序 本文中的“字符设备”是一段大小为PAGE_SIZE的内存空间 功能:向字符设备写入字符串:从字符设备读出字符串 代码: 1. ...
- 一个简单的演示用的Linux字符设备驱动程序
实现如下的功能:--字符设备驱动程序的结构及驱动程序需要实现的系统调用--可以使用cat命令或者自编的readtest命令读出"设备"里的内容--以8139网卡为例,演示了I/O端 ...
- Linux字符设备驱动框架
字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标.键盘.显示器.串口等等,当我们执行ls -l ...
- Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗?
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- Linux字符设备简单示例
1. Linux字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现open.close.read和write系统调用.例如:串口.Led.按键等. 2. 通过字符设备文件 ...
- 嵌入式Linux驱动学习之路(二十一)字符设备驱动程序总结和块设备驱动程序的引入
字符设备驱动程序 应用程序是调用C库中的open read write等函数.而为了操作硬件,所以引入了驱动模块. 构建一个简单的驱动,有一下步骤. 1. 创建file_operations 2. 申 ...
随机推荐
- **没有规则可以创建“XXX”需要的目标“XXX”问题的解决方案
一.现象 我将之前Redhat9.0编译好的uboot,转到ubuntu12.04环境.在ubuntu环境下对 uboot重新编译提示错误.编译过程如下: root@hailin-virtual-ma ...
- 我的Python分析成长之路9
pandas入门 统计分析是数据分析的重要组成部分,它几乎贯穿整个数据分析的流程.运用统计方法,将定量与定性结合,进行的研究活动叫做统计分析.而pandas是统计分析的重要库. 1.pandas数据结 ...
- python 列表(增删改查)
列表 :(列表可以嵌套,列表的中的元素可以为任意) 列表的创建:1. a = [1, 2, 3] 2. a = list([1, 2, 3]) 1.查: 索引(下标),都是从0开始 切片 .c ...
- DRF filter
filter 配置 fiter定义 自定义filter继承BaseFilterBackend,必须重写filter_queryset,返回值为过滤后的queryset filter在GenericAP ...
- PYDay2-linux基础\常用命令
一.linux 理念 一切皆文件 二.常用命令(150) 2.1.rsync rsync是类unix系统下的数据镜像备份工具, 它的特性如下: 可以镜像保存整个目录树和文件系统. 可以很容易做到保持原 ...
- android 之 View
在进行游戏开发时,需要自定义各种控件和界面. 自定义View的使用: 绘制屏幕 刷新屏幕:后台数据发生了变化,需要开发人员自己刷新屏幕以显示最新数据 例子: MyView开发,绘制界面View内容: ...
- iOS 唯一标示符 卸载后安装值不变
Vindor标示符 (IDFV-identifierForVendor) 这种叫法也是在iOS 6中新增的,不过获取这个IDFV的新方法被添加在已有的UIDevice类中.跟advertisingId ...
- Python第三方库之openpyxl(8)
Python第三方库之openpyxl(8) 饼图 饼图将数据绘制成一个圆片,每个片代表整体的百分比.切片是按顺时针方向绘制的,0在圆的顶部.饼图只能取一组数据.该图表的标题将默认为该系列的标题. 2 ...
- TOJ 2710: 过河 路径压缩
2710: 过河 Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByteTotal Submit: 32 ...
- POJ-2002 Squares,哈希模板+数学公式!
Squares 题意:二维坐标轴给出n个点求有多少个正方形. 要是平时做比赛的话毫无疑问会 ...