#define DEVICE_NAME "led"
#define DEVICE_MAJOR 212
static int led_major=DEVICE_MAJOR;
#define LED1 S3C2410_GPB5
#define LED1_OUTP S3C2410_GPB5_OUTP
#define LED_ON 0
#define LED_OFF 1
struct s3c2410_led_dev
{
struct cdev cdev;
int status;
};
static struct s3c2410_led_dev dev;
void s3c2410_led_InitIO(void);
void s3c2410_led_InitIO(void)
{
s3c2410_gpio_cfgpin(LED1,LED1_OUTP);
s3c2410_gpio_setpin(LED1,LED_OFF);
}
static int s3c2410_led_open(struct inode *inode,struct file *filp)
{
return 0;
}
static int s3c2410_led_release(struct inode *inode,struct file *filp)
{
return 0;
}
static int s3c2410_led_ioctl(struct inode *inode,struct file *filp,unsigned int cmd ,unsigned long arg)
{
switch (cmd)
{
case LED_ON:
s3c2410_gpio_setpin(LED1,LED_ON);
dev.status=1;
break;
case LED_OFF:
s3c2410_gpio_setpin(LED1,LED_OFF);
dev.status=0;
break;
default:
return -EINVAL;
}
return 0;
}
static ssize_t s3c2410_led_read(struct file *filp,char *buffer,size_t count,loff_t *ppos)
{
put_user(dev.status,(int *)buffer);
return 1;
}
static ssize_t s3c2410_led_write(struct file *filp,char *buffer, size_t count,loff_t *ppos)
{
get_user(dev.status,(int *)buffer);
if(dev.status==0)
s3c2410_gpio_setpin(LED1,LED_OFF);
else if(dev.status==1)
s3c2410_gpio_setpin(LED1,LED_ON);
return 1;
}
static struct file_operations s3c2410_led_fops={
.owner =THIS_MODULE,
.open =s3c2410_led_open,
.release=s3c2410_led_release,
.ioctl =s3c2410_led_ioctl,
.read =s3c2410_led_read,
.write =s3c2410_led_write,
};
static void led_setup_cdev(void)
{
int err,devno=MKDEV(led_major,0);
cdev_init(&dev.cdev,&s3c2410_led_fops);
dev.cdev.owner=THIS_MODULE;
dev.cdev.ops=&s3c2410_led_fops;
err=cdev_add(&dev.cdev,devno,1);
if(err)
printk("Error %d adding LED %d",err);
}
static int s3c2410_led_init(void)
{
int result;
dev_t devno=MKDEV(led_major,0);
if(led_major)
result=register_chrdev_region(devno,1,DEVICE_NAME);
else
{
result=alloc_chrdev_region(&devno,0,1,DEVICE_NAME);
led_major=MAJOR(devno);
}
if(result<0)
return result;
led_setup_cdev();
s3c2410_led_InitIO();
dev.status=0;
printk(DEVICE_NAME"initialized\n");
return 0;
}
static void s3c2410_led_exit(void)
{
cdev_del(&dev.cdev);
unregister_chrdev_region(MKDEV(led_major,0),1);
}
联系客服