Linux MISC驱动示例

misc 的意思是混合、杂项的,因此 MISC 驱动也叫做杂项驱动,也就是当我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动。MISC 驱动其实就是最简单的字符设备驱动,通常嵌套在 platform 总线驱动中,实现复杂的驱动。
 

1、misc_register函数

以前我们需要自己调用一堆的函数去创建设备,比如在以前的字符设备驱动中我们会使用如下几个函数完成设备创建过程:
1 alloc_chrdev_region(); /* 申请设备号 */
2 cdev_init(); /* 初始化 cdev */
3 cdev_add(); /* 添加 cdev */
4 class_create(); /* 创建类 */
5 device_create(); /* 创建设备 */
现在我们可以直接使用 misc_register 一个函数来完成以上 这些步骤
2、 misc_deregister 函数
 
以前注销设备驱动的时候,我们需要调用一堆的函数去删除此前创建的 cdev 、设备等等内
容,如下所示:
1 cdev_del(); /* 删除 cdev */
2 unregister_chrdev_region(); /* 注销设备号 */
3 device_destroy(); /* 删除设备 */
4 class_destroy(); /* 删除类 */

现在我们可以直接使用 misc_deregister一个函数来完成以上这些步骤

 

驱动示例如下所示:



#define MISCBEEP_NAME "miscbeep"
#define MISCBEEP_MINOR 144
#define BEEPOFF 0
#define BEEPON 1

/* miscbeep设备结构体 */
struct miscbeep_dev
{
    struct device_node *nd; /* 设备节点 */
    int beep_gpio;          /* beep gpio */
};

struct miscbeep_dev miscbeep;

static int miscbeep_open(struct inode *inode, struct file *filp)
{
    filp->private_data = &miscbeep;
    return 0;
}

static int miscbeep_release(struct inode *inode, struct file *filp)
{
    return 0;
}

static ssize_t miscbeep_write(struct file *filp, const char __user *buf,
                              size_t count, loff_t *ppos)
{

    int ret;
    unsigned char databuf[1];
    struct miscbeep_dev *dev = filp->private_data;

    return 0;
}

/* 设备操作函数 */
struct file_operations miscbeep_fops = {
    .owner = THIS_MODULE,
    .open = miscbeep_open,
    .release = miscbeep_release,
    .write = miscbeep_write,
};

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

/* probe函数 */
static int miscbeep_probe(struct platform_device *dev)
{
    int ret = 0;
    /* 1、初始化锋鸣器IO */
    miscbeep.nd = dev->dev.of_node;

    miscbeep.beep_gpio = of_get_named_gpio(miscbeep.nd, "beep-gpios", 0);
    if (miscbeep.beep_gpio < 0)
    {
     
    }

    ret = gpio_request(miscbeep.beep_gpio, "beep-gpio");
    if (ret)
    {
      
    }

    ret = gpio_direction_output(miscbeep.beep_gpio, 1); /* 输出,默认高电平 */
    if (ret < 0)
    {
     
    }

    /* 2、misc驱动注册,无需进行字符驱动注册那一系列步骤 */
    ret = misc_register(&beep_miscdev);
    if (ret < 0)
    {
        goto fail_setoutput;
    }

    return 0;

}

/* remove函数 */
static int miscbeep_remove(struct platform_device *dev)
{
    gpio_set_value(miscbeep.beep_gpio, 1); /* 拉高,关闭BEEP */
    gpio_free(miscbeep.beep_gpio);         /* 释放GPIO */

   /* 2、misc驱动注销,无需进行字符驱动注销那一系列步骤 */
    misc_deregister(&beep_miscdev);
    return 0;
}

/* platform匹配表 */
static const struct of_device_id beep_of_match[] = {
    {.compatible = "alientek,beep"},
    {/* Sentinel */},
};

/* platform */
static struct platform_driver miscbeep_driver = {
    .driver = {
        .name = "imx6ul-beep",
        .of_match_table = beep_of_match, /* 设备树匹配表 */
    },
    .probe = miscbeep_probe,
    .remove = miscbeep_remove,
};

/* 驱动入口函数 */
static int __init miscbeep_init(void)
{
    return platform_driver_register(&miscbeep_driver);
}

/* 驱动出口函数 */
static void __exit miscbeep_exit(void)
{
    platform_driver_unregister(&miscbeep_driver);
}

module_init(miscbeep_init);
module_exit(miscbeep_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("supersmart");

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值