ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

platform_device+cdev 样例(支持休眠唤醒)

2022-01-09 13:00:06  阅读:161  来源: 互联网

标签:样例 rwbuffer rwbuff dev platform cdev edog device


platform_device+cdev 样例(支持休眠唤醒):  

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/device.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <linux/gpio.h>
#include <linux/platform_device.h>

#define DEV_DBG_EN 1
#if(DEV_DBG_EN == 1)
#define rwbuffer_dev_dbg(x,arg...) printk(KERN_INFO"[LS_DEBUG][RWBUFF]"x,##arg)
#else
#define rwbuffer_dev_dbg(x,arg...)
#endif
#define rwbuffer_dev_err(x,arg...) printk(KERN_ERR"[LS_ERR][RWBUFF]"x,##arg)
#define rwbuffer_dev_print(x,arg...) printk(KERN_INFO"[LS_PRINT][RWBUFF]"x,##arg)


#define CHRDEV_NAME "rwbuffer"
#define CLASS_NAME "rwbuffer"
#define DEVICE_NAME "rwbuffer"

static dev_t devid;
static struct cdev* rwbuff_cdev;
static struct class* rwbuff_class;

#define EDOG_POWER_GPIO (GPIOH(07))


static int rwbuff_open(struct inode *inode,struct file *file) {
rwbuffer_dev_dbg("open rwbuffer device!");

return 0;
}

static ssize_t rwbuff_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) {
rwbuffer_dev_dbg("write rwbuffer device!");

return count;
}


static int rwbuff_release(struct inode *inode, struct file *file)
{
rwbuffer_dev_dbg("close rwbuffer device!");

return 0;
}

static int __init edog_power_probe(struct platform_device *pdev) {
rwbuffer_dev_dbg("call %s\n",__func__);

return 0;
}

static int __exit edog_power_remove(struct platform_device *pdev) {
rwbuffer_dev_dbg("call %s\n",__func__);

return 0;
}

static int edog_power_suspend(struct platform_device *pdev, pm_message_t mesg) {
rwbuffer_dev_dbg("call %s\n",__func__);
return 0;
}

static int edog_power_resume(struct platform_device *pdev) {
rwbuffer_dev_dbg("call %s\n",__func__);

return 0;
}

static struct platform_driver rwbuffer_driver = {
.driver = {
.name = "rwbuffer",
.owner = THIS_MODULE,
},
.probe = edog_power_probe,
.remove = __exit_p(edog_power_remove),
.suspend = edog_power_suspend,
.resume = edog_power_resume,
};

static struct platform_device rwbuff_device = {
.name = "rwbuffer",
.id = 0,
};

static struct file_operations fops_rwbuff = {
.owner = THIS_MODULE,
.open = rwbuff_open,
.release = rwbuff_release,
.write = rwbuff_write,
};

/*
* @function:edog_power_init
* This function is a init function of this modules,it such as module_init.
* @return unknown.
*/
static int __init edog_power_init(void) {
int ret;

//get dev number.
ret = alloc_chrdev_region(&devid,0,1,CHRDEV_NAME);
if(ret) {
rwbuffer_dev_err("alloc char driver error!\n");
return ret;
}
//register char dev.
rwbuff_cdev = cdev_alloc();
cdev_init(rwbuff_cdev,&fops_rwbuff);
rwbuff_cdev->owner = THIS_MODULE;
ret = cdev_add(rwbuff_cdev,devid,1);
if(ret) {
rwbuffer_dev_err("cdev create error!\n");
goto regiseter_clean;
}
//create device.
rwbuff_class = class_create(THIS_MODULE,CLASS_NAME);
if(IS_ERR(rwbuff_class)) {
rwbuffer_dev_err("create class error\n");
goto cdev_clean;
}
device_create(rwbuff_class,NULL,devid,NULL,DEVICE_NAME);

ret = platform_device_register(&rwbuff_device);
if (ret) {
rwbuffer_dev_err("platform device register failed\n");
goto device_clean;
}
return platform_driver_probe(&rwbuffer_driver, edog_power_probe);;

device_clean:
device_destroy(rwbuff_class,devid);
class_clean:
class_destroy(rwbuff_class);
cdev_clean:
cdev_del(rwbuff_cdev);
regiseter_clean:
unregister_chrdev_region(devid,1);

return -ENOMEM;
}

/**
* @function:edog_power_exit
* This function is a clean function of this module.
*/
static void __exit edog_power_exit(void) {
rwbuffer_dev_dbg("edog driver exit is ok!\n");

platform_driver_unregister(&rwbuffer_driver);
device_destroy(rwbuff_class,devid);
class_destroy(rwbuff_class);
cdev_del(rwbuff_cdev);
unregister_chrdev_region(devid,1);
}

module_init(edog_power_init);
module_exit(edog_power_exit);

MODULE_AUTHOR("arvinfei@landsem.com.cn");
MODULE_DESCRIPTION("landsem sysconfig driver.");
MODULE_LICENSE("GPL");

标签:样例,rwbuffer,rwbuff,dev,platform,cdev,edog,device
来源: https://www.cnblogs.com/alone153/p/15780733.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有