#include
#include
#include
#include
#include
#include
#include
#include
#include
#include //class_create
#include
#include
#include
#include
#include
#include
volatile unsigned int *gpio_con_mod = NULL;
volatile unsigned int *gpio_3_oe = NULL;
volatile unsigned int *gpio_3_out = NULL;
static dev_t dev;
static struct cdev cdev;
static struct class *led_class;
static int module_dev_open(struct inode *inode, struct file *filp)
{
gpio_con_mod = (volatile unsigned int *)ioremap(GPIO_CONTROL_MODULE,4);
gpio_3_oe = (volatile unsigned int *)ioremap(GPIO_3_OE,4);
gpio_3_out = (volatile unsigned int *)ioremap(GPIO_3_DATAOUT,4);
printk("success open\n");
*gpio_con_mod |= 0x07;
*gpio_3_oe &= ~(1<<16);
return 0;
}
static int module_dev_release(struct inode *inode, struct file *filp)
{
printk("success release\n");
return 0;
}
ssize_t module_dev_write(struct file *filp, const char __user *ubuf, size_t count, long * loff)
{
int ret = -1;
ret = copy_from_user(kbuf,ubuf,count);
IF(ret)
{
printk("there is a error in program \n");
return -EINVAL;
}
/*
* in the app:
* define "1" led_on
* define "0" led_off
*/
switch(kbuf[0])
{
case '1':
*gpio_3_out |=(1<<16);
break;
case '0':
*gpio_3_out &=(0<<16);
break;
default:
printk("write a error \n");
break;
}
return 0;
}
static const struct file_operations fops =
{
.owner = THIS_MODULE,
.open = module_dev_open,
.release = module_dev_release,
.write = module_dev_write,
};
static int __init module_dev_init(void)
{
int retval = -1;
retval = alloc_chrdev_region(&dev,0,1,"led_module");
if(retval < 0)
{
return -EINVAL;
}
cdev_init(&cdev, &fops);
cdev.owner = THIS_MODULE;
retval = cdev_add(&cdev,dev,1);
if(retval < 0)
{
//goto failed;
}
led_class = class_create(THIS_MODULE,"led_module");
device_create(led_class,NULL,dev,NULL,"led_module");
printk("success init the led module\n");
return 0;
}
static void __exit module_dev_exit(void)
{
iounmap(gpio_con_mod);
iounmap(gpio_3_oe);
iounmap(gpio_3_out);
device_destroy(led_class,dev);
class_destroy(led_class);
cdev_del(&cdev);
unregister_chrdev_region(dev,1);
printk("success exit kernel\n");
}
module_init(module_dev_init);
module_exit(module_dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("jackeyt@bbs.elecfans.com");