api:
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
int main(void)
{
int fd;
fd=open("dev/test_led",0);
printf("start the system");
while(1);
close(fd);
printf("bye the system/n");
return 0;
}
#include<linux/fs.h>
#include<linux/module.h>
#include<linux/cdev.h>
#include<linux/types.h>
#include<linux/init.h>
#include<mach/regs-gpio.h>
#include<mach/hardware.h>
#include<linux/irqreturn.h>
#include<linux/interrupt.h>
#include<linux/delay.h>
#define TEST_LED_MAJOR 243
#define LED_ON 0
#define LED_OFF 1
struct test_led_dev{
struct cdev cdev;
};
struct test_led_dev *test_led_devp;
int test_led_major=TEST_LED_MAJOR;
void gpio_init(void)
{
s3c2410_gpio_cfgpin(S3C2410_GPB5,S3C2410_GPB5_OUTP);
s3c2410_gpio_cfgpin(S3C2410_GPB8,S3C2410_GPB8_OUTP);
s3c2410_gpio_cfgpin(S3C2410_GPF1,S3C2410_GPF1_EINT1);
}
//void irqreturn_t
static irqreturn_t test_irq_hander(int irq,void *dev_id)
{
int i;
for(i=0;i<5;i++)
{
s3c2410_gpio_setpin(S3C2410_GPB8,1);ssleep(1);
s3c2410_gpio_setpin(S3C2410_GPB8,0);ssleep(1);
}
return IRQ_RETVAL(IRQ_HANDLED);
}
ssize_t test_led_open(struct inode *inodep,struct file *filp)
{
int err;
err=request_irq(IRQ_EINT1,test_irq_hander,IRQF_TRIGGER_FALLING,"KEY1",NULL);
if(err)
{
free_irq(IRQ_EINT1,NULL);
}
return 0;
}
ssize_t test_led_release(struct inode *inodep,struct file *filep)
{
free_irq(IRQ_EINT1,NULL);
return 0;
}
ssize_t test_led_ioctl(struct inode *inodep,struct file * filp,size_t cmd,loff_t arct)
{
int ret=0;
switch(cmd)
{
case LED_OFF:
s3c2410_gpio_setpin(S3C2410_GPB5,1);break;
case LED_ON:
s3c2410_gpio_setpin(S3C2410_GPB5,0);break;
default:
ret=-EINVAL;break;
}
return ret;
}
struct file_operations test_led_fops={
.owner=THIS_MODULE,
.open=test_led_open,
.release=test_led_release,
.ioctl=test_led_ioctl,
};
static void test_led_setup(struct test_led_dev *dev,int index)
{
int err;
dev_t devno=MKDEV(test_led_major,index);
cdev_init(&dev->cdev,&test_led_fops);
dev->cdev.owner=THIS_MODULE;
dev->cdev.ops=&test_led_fops;
err=cdev_add(&dev->cdev,devno,1);
if(err)printk("cdev failed /n");
else printk("cdev ok /n");
}
int test_led_init(void)
{
int ret;
dev_t devno;
if(test_led_major)
{
devno=MKDEV(test_led_major,0);
ret=register_chrdev_region(devno,1,"test_led");
}
else
{
ret=alloc_chrdev_region(&devno,0,1,"test_led");
test_led_major=MAJOR(devno);
}
if(ret<0){printk("register dev faild/n");return ret;}
else printk("register dev ok/n");
test_led_devp=kmalloc(sizeof(struct test_led_dev),GFP_KERNEL);
if(!test_led_devp){printk("malloc failed/n");return -EINVAL;}
else printk("malloc ok /n");
test_led_setup(test_led_devp,0);
gpio_init();
return 0;
}
void test_led_exit(void)
{
cdev_del(&test_led_devp->cdev);
kfree(test_led_devp);
unregister_chrdev_region(MKDEV(test_led_major,0),1);
printk("bye bye the world");
}
module_init(test_led_init);
module_exit(test_led_exit);
MODULE_LICENSE("Dual BSD/GPL");