驱动代码
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>
#include "head.h"
#include <linux/of_irq.h>
#include <linux/interrupt.h>
struct device_node *dev;
struct device_node *dev_irq;
struct gpio_desc* gpiono_led1;
struct gpio_desc* gpiono_led2;
struct gpio_desc* gpiono_led3;
unsigned int major;
struct class *cls;
struct device *dev1;
unsigned int irqno_led1;
unsigned int irqno_led2;
unsigned int irqno_led3;
irqreturn_t led1_handler(int irq,void* dev)
{
gpiod_set_value(gpiono_led1,!gpiod_get_value(gpiono_led1));
return IRQ_HANDLED;
}
irqreturn_t led2_handler(int irq,void* dev)
{
gpiod_set_value(gpiono_led2,!gpiod_get_value(gpiono_led2));
return IRQ_HANDLED;
}
irqreturn_t led3_handler(int irq,void* dev)
{
gpiod_set_value(gpiono_led3,!gpiod_get_value(gpiono_led3));
return IRQ_HANDLED;
}
long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
switch(arg)
{
case 0:
switch(cmd)
{
case LED1_ON:
gpiod_set_value(gpiono_led1,1);
break;
case LED1_OFF:
gpiod_set_value(gpiono_led1,0);
break;
}
break;
case 1:
switch(cmd)
{
case LED2_ON:
gpiod_set_value(gpiono_led2,1);//LED2开灯
break;
case LED2_OFF:
gpiod_set_value(gpiono_led2,0);;
break;
}
break;
case 2:
switch(cmd)