platform_device_register和platform_driver_register

简介: http://www.linuxidc.com/Linux/2012-01/51725.htm #include #include #include #include #include #include #include #include #include #...

http://www.linuxidc.com/Linux/2012-01/51725.htm

 

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/spinlock.h>
#include <linux/blkdev.h>
#include <linux/module.h>  
#include <linux/fs.h>  
#include <linux/errno.h>  
#include <linux/mm.h>  
#include <linux/cdev.h>  
#include <linux/platform_device.h>  

static int chrdev_open(struct inode *inode, struct file *file) 
{  
    printk(KERN_ALERT "chrdev open!\n");  
    return 0;  
}  
  
static int chrdev_release(struct inode *inode, struct file *file) 
{  
    printk(KERN_ALERT "chrdev release!\n");  
    return 0;  
}  
  
int temp_data = 0;
static int chrdev_ioctl(struct inode *inode, struct file *file,  unsigned int cmd, unsigned long arg) 
{    
    switch(cmd)
    {
        case 0x100:
            if(copy_from_user(&temp_data,  (int *)arg, sizeof(int))) 
                return -EFAULT;
            break;
        
        case 0x101:
            if(copy_to_user( (int *)arg, &temp_data, sizeof(int))) 
                return -EFAULT;
            break;
    }

    printk(KERN_ALERT "chrdev_ioctl: 0x%x temp_data=%d\n", cmd, temp_data);  
    return 0;
}  
  
// Kernel interface  
static struct file_operations chrdev_fops = {  
    .owner      =   THIS_MODULE,  
    .unlocked_ioctl      =   chrdev_ioctl,  
    .open       =   chrdev_open,  
    .release    =   chrdev_release,  
};  
  
#define CHRDEV_NAME     "miscdriver"  

static struct class *chrdev_class = NULL;  
static struct device *chrdev_device = NULL;  
static dev_t chrdev_devno;  
static struct cdev chrdev_cdev;  
  
static int chrdev_probe(struct platform_device *dev) 
{  
    int ret = 0, err = 0;  
      
    printk(KERN_ALERT "chrdev probe!\n");  
      
    // alloc character device number  
    ret = alloc_chrdev_region(&chrdev_devno, 0, 1, CHRDEV_NAME);  
    if (ret) {  
        printk(KERN_ALERT " alloc_chrdev_region failed!\n");  
        goto PROBE_ERR;  
    }  
    printk(KERN_ALERT " major:%d minor:%d\n", MAJOR(chrdev_devno), MINOR(chrdev_devno));  
      
    // add a character device  
    cdev_init(&chrdev_cdev, &chrdev_fops);  
    chrdev_cdev.owner = THIS_MODULE;  
    err = cdev_add(&chrdev_cdev, chrdev_devno, 1);  
    if (err) {  
        printk(KERN_ALERT " cdev_add failed!\n");  
        goto PROBE_ERR;  
    }  
      
    // create the device class  
    chrdev_class = class_create(THIS_MODULE, CHRDEV_NAME);  
    if (IS_ERR(chrdev_class)) {  
        printk(KERN_ALERT " class_create failed!\n");  
        goto PROBE_ERR;  
    }  
      
    // create the device node in /dev  
    chrdev_device = device_create(chrdev_class, NULL, chrdev_devno,  
        NULL, CHRDEV_NAME);  
    if (NULL == chrdev_device) {  
        printk(KERN_ALERT " device_create failed!\n");  
        goto PROBE_ERR;  
    }  
      
    printk(KERN_ALERT " chrdev probe ok!\n");  
    return 0;  
      
PROBE_ERR:  
    if (err)  
        cdev_del(&chrdev_cdev);  
    if (ret)   
        unregister_chrdev_region(chrdev_devno, 1);  
    return -1;  
}  
  
static int chrdev_remove (struct platform_device *dev) 
{  
    printk(KERN_ALERT " chrdev remove!\n");  
      
    cdev_del(&chrdev_cdev);  
    unregister_chrdev_region(chrdev_devno, 1);  
      
    device_destroy(chrdev_class, chrdev_devno);  
    class_destroy(chrdev_class);  
    return 0;  
}  
  
// platform_device and platform_driver must has a same name!  
// or it will not work normally  
static struct platform_driver chrdev_platform_driver = {  
    .probe  =   chrdev_probe,  
    .remove =   chrdev_remove,  
    .driver =   {  
        .name   =   CHRDEV_NAME,  
        .owner  =   THIS_MODULE,  
    },  
};  
  
static struct platform_device chrdev_platform_device = {  
    .name   =   CHRDEV_NAME,  
    .id     =   0,  
    .dev    =   {  
    }  
};  
  
  
static __init int chrdev_init(void) 
{  
    int ret = 0;  
    printk(KERN_ALERT "chrdev init!\n");  
      
    ret = platform_device_register(&chrdev_platform_device);  
    if (ret) {  
        printk(KERN_ALERT " platform_device_register failed!\n");  
        return ret;  
    }  
      
    ret = platform_driver_register(&chrdev_platform_driver);  
    if (ret) {  
        printk(KERN_ALERT " platform_driver_register failed!\n");  
        return ret;  
    }  
    printk(KERN_ALERT " chrdev_init ok!\n");  
    return ret;  
}  
  
static __exit void chrdev_exit(void) 
{  
    printk(KERN_ALERT "chrdev exit!\n");  
    platform_driver_unregister(&chrdev_platform_driver);  
}  
  
module_init(chrdev_init);  
module_exit(chrdev_exit); 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Decly");

  

目录
相关文章
|
人工智能 缓存 调度
技术改变AI发展:RDMA能优化吗?GDR性能提升方案(GPU底层技术系列二)
随着人工智能(AI)的迅速发展,越来越多的应用需要巨大的GPU计算资源。GPUDirect RDMA 是 Kepler 级 GPU 和 CUDA 5.0 中引入的一项技术,可以让使用pcie标准的gpu和第三方设备进行直接的数据交换,而不涉及CPU。
139733 6
|
传感器 芯片
毕业设计 基于51单片机霍尔电机转速测量温度PWM调速设计
毕业设计 基于51单片机霍尔电机转速测量温度PWM调速设计
401 0
|
人工智能 自然语言处理 开发工具
AI2 开源新 LLM,重新定义 open AI
艾伦人工智能研究所(Allen Institute for AI,简称 AI2)宣布推出一个名为 OLMo 7B 的新大语言模型,并开源发布了预训练数据和训练代码。OLMo 7B 被描述为 “一个真正开放的、最先进的大型语言模型”。
|
前端开发 数据处理 开发者
vuex中mutations详解,与actions的区别
Vuex 的 Mutations 是用于改变 Vuex Store 中状态的一种方式。它是一个同步的操作,用于直接修改 Store 中的状态。
|
存储 物联网 Serverless
玩转 AI 绘图,基于函数计算部署 Stable Diffusion可自定义模型
本文主要将带大家通过使用阿里云产品函数计算 FC 和文件存储 NAS ,快速使用 Stable Diffusion 实现更高质量的图像生成,本方案内置模型库+常用插件+ControlNet ,用户可根据自己的需要更换需要的模型、Lora、增加插件。
69486 27
玩转 AI 绘图,基于函数计算部署 Stable Diffusion可自定义模型
|
数据采集 运维 前端开发
一场始于 Selector Error 的拯救行动:企查查数据采集故障排查记
开发人员小李在使用Python爬虫从企查查抓取公司工商信息时,遇到选择器失效和动态加载内容无法解析的问题。通过分析日志和网页结构变化,发现关键数据由JavaScript动态渲染。解决方案包括引入Selenium模拟浏览器行为、配置代理IP和请求头、调整选择器,并优化代码实现。最终成功解决了数据采集问题,确保了爬虫的稳定性和可靠性。改进方案还涉及动态加载应对策略、选择器稳定性保障及代理池搭建等措施,以应对未来可能的变化。
456 3
一场始于 Selector Error 的拯救行动:企查查数据采集故障排查记
|
C++
基于C++的简易文件管理系统设计与实现
基于C++的简易文件管理系统设计与实现
711 6
|
监控 Linux
mc常用命令
mc常用命令
685 99
|
人工智能 自然语言处理 数据可视化
书生·浦语2.5开源,推理能力再创新标杆,怎么玩都在这里了!
上海人工智能实验室秉持“以持续的高质量开源赋能创新”理念,在为社区始终如一地提供高质量开源模型的同时,也将继续坚持免费商用授权。
|
机器学习/深度学习 Web App开发 文字识别
OCRmypdf安装部署深入详解
1、OCRmypdf简介 OCRmyPDF使用最好的可用开源OCR引擎Tesseract执行OCR。 OCRmyPDF是一个Python 3包,将OCR图层处理结果添加到PDF。 OCRmyPDF是功能最丰富且经过彻底测试的OCR PDF转换工具。 2、OCRmypdf支持的系统 1) macOS 2) Ubuntu 16.04 LTS 3)ArchLinux 4)Windows 此外,OCRmypdf提供了docker镜像,可以直接下载镜像、使用。

热门文章

最新文章