#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);
iTop4412驱动开发之四:注册字符设备驱动
最新推荐文章于 2020-07-03 21:44:10 发布