iTop4412驱动开发之四:注册字符设备驱动

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/kdev_t.h>
#include <linux/device.h>

#include <linux/gpio.h>
#include <plat/gpio-cfg.h>
#include <mach/gpio.h>
#include <mach/gpio-exynos4.h>

MODULE_LICENSE("GPL");

static int param1, param2;
module_param(param1, int, S_IRUSR);
module_param(param2, int, S_IRUSR);

#define NODE_NAME   "request_cdev_node"
#define DEV_MAJOR	100
#define DEV_MINOR	0

static dev_t g_dev_no;


static int request_cdev_open(struct inode *node, struct file *fp)
{
    printk("request_cdev open.\n");

    return 0;
}

static int request_cdev_release(struct inode *node, struct file *fp)
{
    printk("request_cdev release.\n");

    return 0;
}

static int request_cdev_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
{
    printk("request_cdev ioctl, cmd: %d, arg: %d\n", cmd, arg);

	switch (cmd)
	{
		case 0:
			gpio_direction_output(EXYNOS4_GPL2(0), arg);
			break;
		default:
			break;
	}

    return 0;
}

struct file_operations request_cdev_ops = {
    .owner = THIS_MODULE,
    .open = request_cdev_open,
    .release = request_cdev_release,
    .unlocked_ioctl = request_cdev_ioctl,
};

static struct cdev g_cdev = {
	.owner = THIS_MODULE,
};

struct class *g_cdev_class = NULL;
struct device *g_cdev_device = NULL;

static int request_cdev_init()
{
    printk(KERN_EMERG "request_cdev init.\n");

    int ret = gpio_request(EXYNOS4_GPL2(0), "request_cdev");
	if (ret)
	{
		printk("gpio request gpl0(2) failed.\n");

		return -1;
	}

	//gpio_direction_output(EXYNOS4_GPL2(0), 1);
	s3c_gpio_cfgpin(EXYNOS4_GPL2(0), GPIO_OUTPUT);
	//注册字符设备号
	//一种方式静态申请,需要提前设置好主、次设备号
	//g_dev_no = MKDEV(DEV_MAJOR, DEV_MINOR);
	//register_chrdev_region(g_dev_no, 1, "REQUEST_CDEV");

	//另一种动态申请,生成随机设备号
	alloc_chrdev_region(&g_dev_no, 0, 1, "REQUEST_CDEV");

	//初始化字符设备
	cdev_init(&g_cdev, &request_cdev_ops);
    
    //添加字符设备到内核
	ret = cdev_add(&g_cdev, g_dev_no, 1);
    if (ret == 0)
    {
        printk("add cdev success.\n");
    }

	//创建类
    g_cdev_class = class_create(THIS_MODULE, "request_cdev_class");
    if (g_cdev_class)
    {
        printk("class create success.\n");
    }

	//创建字符设备
    g_cdev_device = device_create(g_cdev_class, NULL, g_dev_no, NULL, NODE_NAME);
    if (g_cdev_device)
    {
        printk("device create success.\n");
    }

    return 0;
}

static void request_cdev_exit()
{
    printk(KERN_EMERG "request_cdev exit.\n");
    device_destroy(g_cdev_class, g_dev_no);
    class_destroy(g_cdev_class);
    unregister_chrdev_region(g_dev_no, 1);
	cdev_del(&g_cdev);    
}

module_init(request_cdev_init);
module_exit(request_cdev_exit);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值