myled.c
#define LED_ON _IOW('l',1,int)
#define LED_OFF _IOW('l',0,int)
struct device_node *dnode;
struct gpio_desc *gpiono0,*gpiono1,*gpiono2;
int mycdev_open(struct inode *inode,struct file *file)
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
gpiod_set_value(gpiono0,1);
gpiod_set_value(gpiono1,1);
gpiod_set_value(gpiono2,1);
gpiod_set_value(gpiono0,0);
gpiod_set_value(gpiono1,0);
gpiod_set_value(gpiono2,0);
int mycdev_close(struct inode *inode,struct file *file)
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
struct file_operations fops = {
.unlocked_ioctl = mycdev_ioctl,
static int __init mycdev_init(void)
major = register_chrdev(0,"myled",&fops);
printk("字符设备驱动注册成功:major=%d\n",major);
cls = class_create(THIS_MODULE,"myled");
dev=device_create(cls,NULL,MKDEV(major,i),NULL,"myled%d",i);
printk("向上提交设备节点的信息失败\n");
printk("向上提交设备节点信息成功\n");
dnode=of_find_node_by_path("/myled");
gpiono0=gpiod_get_from_of_node(dnode,"led1-gpio",0,GPIOD_OUT_LOW,NULL);
gpiono1=gpiod_get_from_of_node(dnode,"led2-gpio",0,GPIOD_OUT_LOW,NULL);
gpiono2=gpiod_get_from_of_node(dnode,"led3-gpio",0,GPIOD_OUT_LOW,NULL);
if(IS_ERR(gpiono0) || IS_ERR(gpiono1) ||IS_ERR(gpiono2))
printk("申请gpio信息对象成功\n");
static void __exit mycdev_exit(void)
device_destroy(cls,MKDEV(major,i));
unregister_chrdev(major,"myled");
gpiod_set_value(gpiono0,0);
gpiod_set_value(gpiono1,0);
gpiod_set_value(gpiono2,0);
module_init(mycdev_init);
module_exit(mycdev_exit);

app.c
#define LED_ON _IOW('l',1,int)
#define LED_OFF _IOW('l',0,int)
int main(int argc, const char *argv[])
fd = open("/dev/myled0", O_RDWR);
printf("亲输入对LED灯的控制:1(开灯)0(关灯)\n");