ckfwq/linux-3.0.4/drivers/misc/ant_gpio.c

126 lines
2.6 KiB
C

/*
* gsc3280_gpioparal.c - driver for Gpio Test
* 8bits out, 4bits in
*
* Copyright (C) 2012 Loongson Corporation
*
* 2013-03-15
*/
#include <linux/miscdevice.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/err.h>
#include <linux/rcupdate.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <linux/io.h>
#include <linux/of.h>
#include <linux/completion.h>
#include <asm/io.h>
#include <linux/fs.h>
#include <linux/fcntl.h>
#include <asm/uaccess.h>
#include <linux/gpio.h>
#include <gsc3280/gpio.h>
#include <gsc3280/sysctl.h>
#include <linux/time.h>
#include<linux/ioctl.h>
#define SYSCTL_MOD_CTL0 (volatile unsigned int *)0xBC04A008
#define SYSCTL_MOD_CTL1 (volatile unsigned int *)0xBC04A00C
#define SYSCTL_IOMUX_CFG0 (volatile unsigned int *)0xBC04A0B0
#define SYSCTL_IOMUX_CFG1 (volatile unsigned int *)0xBC04A0B4
#define GPIO79 79
#define MEMDEV_IOC_MAGIC 'k'
#define GPIO79_HI _IO(MEMDEV_IOC_MAGIC,1)
#define GPIO79_LO _IO(MEMDEV_IOC_MAGIC,2)
//gpio初始化
void ant_gpio_init(void)
{
//GPIO模块使能
writel(readl(SYSCTL_MOD_CTL0) | (1<<27), SYSCTL_MOD_CTL0);
gpio_request(GPIO79, "GPIO79");
gpio_direction_output(GPIO79,1);
}
static int ant_open(struct inode *inode, struct file *file)
{
printk(KERN_ALERT"GPIO OPEN OK\n");
return 0;
}
static int ant_close(struct inode *inode, struct file *file)
{
return 0;
}
static ssize_t ant_read(struct file *file, char __user *buf, size_t count, loff_t *ptr)
{
return 0;
}
static long ant_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
//int ret = 0;
switch(cmd)
{
case GPIO79_HI:
gpio_set_value(GPIO79,1);
break;
case GPIO79_LO:
gpio_set_value(GPIO79,0);
break;
default:
printk(KERN_ALERT"cmd error!\n");
return -EINVAL;
}
return -1;
}
static const struct file_operations ant_ops = {
.owner = THIS_MODULE,
.open = ant_open,
.release = ant_close,
.read = ant_read,
.unlocked_ioctl = ant_ioctl,
};
static struct miscdevice ant_miscdev = {
.minor = MISC_DYNAMIC_MINOR,
.name = "ant_gpio",
.fops = &ant_ops,
};
static int __init ant_init(void)
{
ant_gpio_init();
if (misc_register(&ant_miscdev))
{
printk(KERN_ALERT"#######: Couldn't register device 0, %d.\n", 255);
return -EBUSY;
}
return 0;
}
static void __exit ant_exit(void)
{
misc_deregister(&ant_miscdev);
}
module_init(ant_init);
module_exit(ant_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Linss");