linux MISC 驱动实验详解(代码)

MISC驱动叫作杂项驱动,就是当我们板子上的某些外设无法进行分类的时候就可以使用MISC驱动。其实就是最简单的字符设备驱动,通常嵌套在platform总线驱动中。

 

关于设备号:MISC设备驱动的主设备号都为10,不同的设备使用不同的从设备号。

MSIC驱动会自动创建cdev

 

miscdevice结构体:

其中minor/name/fops需要我们设置

 

设置好misdevice结构体之后,需要使用misc_register函数向系统注册一个MISC设备

使用这个函数相当于完成了以下几个步骤:

 

当卸载驱动时,需要调用misc_deregister函数来注销MISC设备:

使用这个函数相当于完成了以下几个步骤:

 

下面我们就使用platform+MISC驱动框架来实现对一个字符设备驱动实验,

代码如下:

注:省略了设备操作函数集合

#include <linux/module.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <linux/slab.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
#include <linux/string.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/ide.h>
#include <linux/fcntl.h>
#include <linux/poll.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>

#define MISCBEEP_MINOR 144
#define MISCBEEP_NAME "miscbeep"

/*beep结构体*/
struct miscbeep_dev{
    dev_t devid;
    struct cdev cdev;
    struct class *class;
    struct device *device;
    struct device_node *nd;
    int beep_gpio;
};

struct miscbeep_dev miscbeep;


/*设备操作函数集合*/
static const struct file_operations miscbeep_fops ={
    .owner = THIS_MODULE,
};


/*misc设备结构体*/
static struct miscdevice beep_miscdev ={
    .minor = MISCBEEP_MINOR,
    .name = MISCBEEP_NAME,
    .fops = &miscbeep_fops,
};


static int miscbeep_probe(struct platform_device *dev){
    int ret = 0;

    printk("beep driver and device was matched\r\n");

    miscbeep.nd = of_find_node_by_path("/beep");
    if(miscbeep.nd == NULL){
        printk("beep nd not find\r\n");
        return -EINVAL;
    }
    miscbeep.beep_gpio = of_get_named_gpio(miscbeep.nd,"beep-gpios",0);
    if(miscbeep.beep_gpio < 0){
        printk("can not get beep gpio\r\n");
        return -EINVAL;
    }

    gpio_request(miscbeep.beep_gpio,"miscbeep");
    gpio_direction_output(miscbeep.beep_gpio,0);
    ret = misc_register(&beep_miscdev);
    if(ret<0){
        printk("misc device register failed\r\n");
        return -EINVAL;
    }
    return 0;
}

static int miscbeep_remove(struct platform_device *dev){
    gpio_set_value(miscbeep.beep_gpio,1);
    gpio_free(miscbeep.beep_gpio);
    misc_deregister(&beep_miscdev);
    return 0;
}


static const struct of_device_id beep_of_match[] ={
    {.compatible = "alientek,beep"},
    {},
};

static struct platform_driver beep_driver={
    .driver = {
        .name = "misc-beep",  /*驱动名字*/
        .of_match_table = beep_of_match, /*设备树匹配表*/
    },
    .probe = miscbeep_probe,
    .remove = miscbeep_remove,
};


static int __init beep_init(void){
    
    return platform_driver_register(&beep_driver);


}
static void __exit beep_exit(void){
    platform_driver_unregister(&beep_driver);
}
module_init(beep_init);xxx
module_exit(beep_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("xxx");

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值