首页 > 其他分享 >字符驱动框架

字符驱动框架

时间:2023-12-19 20:57:58浏览次数:32  
标签:字符 NAME 框架 char static 驱动 cdev class struct

Hello World

/*字符驱动框架*/
//*****************相关的头文件和宏定义*******************
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <linux/version.h>

#define CLASS_NAME "char_cdev_class" /* 定义类名称 */
#define DEVICE_NAME "char_cdev"		 /* 定义设备名称 */

static int major = 232; /* 静态设备号方式的默认值 */
static int minor = 0;	/* 静态设备号方式的默认值 */
static dev_t devno;		/* 设备编号 */
static struct class *char_cdev_class;
module_param(major, int, S_IRUGO);
module_param(minor, int, S_IRUGO);

//*********** 文件操作接口函数定义 *********
398 static int char_cdev_open(struct inode *inode, struct file *filp)
{
	// 打开设备操作
	try_module_get(THIS_MODULE);
	printk(KERN_INFO DEVICE_NAME " opened!\n");
	return 0;
}

static int char_cdev_release(struct inode *inode, struct file *filp)
{
	// 关闭设备操作
	printk(KERN_INFO DEVICE_NAME " closed!\n");
	module_put(THIS_MODULE);
	return 0;
}

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
static long char_cdev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
	// 设备 I/O 控制
	printk(KERN_INFO DEVICE_NAME " ioctl method!\n");
	return 0;
}
#else
static int char_cdev_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
	// 设备 I/O 控制
	printk(KERN_INFO DEVICE_NAME " ioctl method!\n");
	return 0;
}
#endif

static ssize_t char_cdev_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{
	// 设备读操作
	printk(KERN_INFO DEVICE_NAME " read method!\n");
	return count;
}

static ssize_t char_cdev_write(struct file *filp, const char *buffer, size_t count, loff_t *ppos)
{
	// 设备写操作
	printk(KERN_INFO DEVICE_NAME " write method!\n");
	399 return count;
}

//*********** fops 文件操作结构体 *********
static struct file_operations char_cdev_fops = {
	.owner = THIS_MODULE,
	.open = char_cdev_open,
	.release = char_cdev_release,
	.read = char_cdev_read,
	.write = char_cdev_write,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
	.unlocked_ioctl = char_cdev_ioctl,
#else
	.ioctl = char_cdev_ioctl,
#endif
};

//**********设备驱动模块加载函数***********
static int char_cdev_init(void)
{
	int ret;
	/* 动态或静态申请设备号和注册设备 */
	ret = register_chrdev(major, DEVICE_NAME, &char_cdev_fops);
	if (major > 0) /* major=232,静态设备号 */
	{
		if (ret < 0) /* 申请、注册设备失败 */
		{
			printk(KERN_INFO " Can't get major number!\n");
			return ret;
		}
	}
	else /* major=0,动态设备号 */
	{
		printk(KERN_INFO " ret is %d\n", ret);
		major = ret; /* 保存动态获取到的主设备号 */
	}
	devno = MKDEV(major, minor);
	/* 在/sys/class/下创建 char_cdev_class 目录 */
	char_cdev_class = class_create(THIS_MODULE, CLASS_NAME);
	if (IS_ERR(char_cdev_class))
	{
		printk(KERN_INFO "create class error!\n");
		return -1;
	}
	400
		/* 将创建/dev/char_cdev 文件 */
		device_create(char_cdev_class, NULL, devno, NULL, DEVICE_NAME);
	printk(KERN_INFO "%s ok!\n", __func__);
	return ret;
}

//**********设备驱动模块卸载函数***********
static void char_cdev_exit(void)
{
	// 注销设备和释放设备号
	device_destroy(char_cdev_class, devno);
	class_destroy(char_cdev_class);
	unregister_chrdev(major, DEVICE_NAME);
	printk(KERN_INFO "%s\n", __func__);
}
module_init(char_cdev_init);
module_exit(char_cdev_exit);
//*********** 设备驱动许可证 ***********
MODULE_LICENSE("GPL");

标签:字符,NAME,框架,char,static,驱动,cdev,class,struct
From: https://www.cnblogs.com/zxz-FINE/p/17914611.html

相关文章

  • 字符串属性和方法
    一、什么叫字符串?String(字符串)数据类型表示零或多个16位Unicode字符系列二、字符串的声明?使用双引号("")、单引号(’’)或反引号(`)标示。三、字符串的属性和方法1.属性length使用length属性可以获取字符串的长度conststr='abcdefg'str.length//7字符串虽然有长度,但是......
  • STM32驱动步进电机
    一、步进电机的介绍17HS4401步进电机是一种步进电机,也称为双级四相混合式步进电机。它是一种旋转电机,可以控制旋转角度和速度,17HS4401步进电机通常被应用于一些需要精准控制转动的场合,例如打印机、CNC机床等。参数:1.步距角度:1.8度2.驱动方式:双级四相混合式3.工作电压:12V4.......
  • Oracle 截取指定字符串
    --INSTR定位指定字符串--第一次出现的位置3(没有的话返回0)SELECTINSTR('某某/123/abc','/',1)FROMDUAL;--从第四个位置开始第一次出现的位置7SELECTINSTR('某某/123/abc','/',4,1)FROMDUAL;--从右向左第一个字符开始第一次出现的位置7SELECTINSTR('某某......
  • gin框架是如何处理panic
    保护gin构建的webapp不panic的方式,简单来说:1)主程中的panic本身是会被gin拦截的2)协程中的panic需要手动使用defer和recover进行保护情景在用gin构建项目,运行webapp并上线了之后,或许有一些请求会经过业务,在特定的情况下出发会触发golang中的panic按照golang的设定,一旦panic,如果......
  • 世微 APS54085 22W高辉度调光降压恒流芯片 LED驱动IC
    产品描述       APS54085是一款PWM工作模式,简单、内置功率MOS管,适用于5-100V输入的高精度降压LED恒流驱动芯片。电流2.0A。APS54085可实现线性调光和PWM调光,线性调光有效电压范围0.52-2.55V.PWM调光频率范围100HZ-30KHZ。APS54085工作频率可以通过......
  • 更改Oracle字符集
    1、selectuserenv('language')fromdual; --查询字符集 2、shutdownimmediate; 关闭数据库实例 3、STARTUPMOUNT; --挂载  4、(依次执行以下命令)ALTER SESSION SETsql_TRACE=TRUE;ALTERSYSTEMENABLERESTRICTEDSESSION;ALTERSYSTEMSETJOB_QUEUE......
  • php mvc框架怎么实现路由的?
    都知道路由是实现框架重要的一步。如果对怎么实现框架感兴趣那必须要了解,而且对自己对正则表达是更加深刻了解。m----------模型v-----------视图c-----------控制器mvc模式就不想多说,网上解释的一大堆,各种理解。这个标准还是比较宽松的,看自己怎么理解。本文重点是是......
  • 企业数字化转型升级框架和全景图
            ......
  • IT发展趋势:数字化时代的技术驱动力
    摘要:随着技术的不断进步和创新,信息技术(IT)领域在当今数字化时代变得越发重要。本文将探讨当前IT行业的发展趋势,包括人工智能(AI)、大数据、云计算、物联网(IoT)和区块链等关键技术,并讨论它们对各行各业的影响以及未来的发展前景。引言:在信息爆炸和数字化转型的背景下,IT技术正逐渐成为......
  • 【C语言】结束符’\0‘ & gets()字符串输入函数
    ......