OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9965|回复: 9

IMX6ULL按键控制LED灯亮灭

[复制链接]

11

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
499
金钱
499
注册时间
2015-10-26
在线时间
125 小时
发表于 2021-1-29 13:32:01 | 显示全部楼层 |阅读模式
50金钱
在单片机上面一个非常简单的应用,按键控制LED灯亮灭,如果换做是在Linux下的IMX6ULL,需要通过哪些操作才能实现呢?请大佬们多多指教,谢谢!

最佳答案

查看完整内容[请看2#楼]

我之前试过,同时控制蜂鸣器和LED,你参考这个即可 1、先设置pinctrl pinctrl_beep: beepgrp { fsl,pins = < // 测试使用 一个驱动控制多个IO MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0x10B0 MX6ULL_PAD_SNVS_TAMPER1__GPIO5_IO01 0x10B0 >; }; 2、设置设备节点 beep { #address-cells = ; #size-cells = ; compatible = "atkalpha-beep"; pinctrl-names = "default"; pinctr ...
我想好好学习RTOS,不管哪一种,学会一种就行
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

96

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3222
金钱
3222
注册时间
2016-5-7
在线时间
531 小时
发表于 2021-1-29 13:32:02 | 显示全部楼层
我之前试过,同时控制蜂鸣器和LED,你参考这个即可

1、先设置pinctrl
pinctrl_beep: beepgrp {
    fsl,pins = <
    // 测试使用 一个驱动控制多个IO
    MX6UL_PAD_GPIO1_IO03__GPIO1_IO03        0x10B0
    MX6ULL_PAD_SNVS_TAMPER1__GPIO5_IO01        0x10B0
    >;
};
2、设置设备节点
beep {
    #address-cells = <1>;
    #size-cells = <1>;
    compatible = "atkalpha-beep";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_beep>;
    //测试使用
    led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;
    beep-gpio = <&gpio5 1 GPIO_ACTIVE_HIGH>;
    status = "okay";
};

此时beep节点有两个gpio,分别是led-gpio和beep-gpio
3、在驱动加载函数init中获取节点并设置gpio
static int __init beep_init(void)
{
    int ret;
   
    beepdev.nd = of_find_node_by_path("/beep");
    if(beepdev.nd == NULL) {
                printk("beep node not find!\r\n");
                return -EINVAL;
    }
   
    beepdev.beep_gpio = of_get_named_gpio(beepdev.nd,"beep-gpio",0);
    if(beepdev.beep_gpio < 0)
    {
        printk("beep gpio get failed\n");
        return -EINVAL;
    }

    beepdev.led_gpio = of_get_named_gpio(beepdev.nd,"led-gpio",0);
    if(beepdev.led_gpio < 0)
    {
        printk("led gpio get failed\n");
        return -EINVAL;
    }
   
        //printk("beep-gpio num = %d\r\n", beepdev.beep_gpio);

    ret = gpio_request(beepdev.beep_gpio,"beep");
    if(ret)
    {
        printk("beep gpio request failed\n");
        return -EINVAL;
    }

    ret = gpio_request(beepdev.led_gpio,"led");
    if(ret)
    {
        printk("led gpio request failed\n");
        return -EINVAL;
    }

    ret = gpio_direction_output(beepdev.beep_gpio,1);
    if(ret < 0)
    {
        printk("beep gpio set output failed\n");
        return -EINVAL;
    }

    ret = gpio_direction_output(beepdev.led_gpio,1);
    if(ret < 0)
    {
        printk("led gpio set output failed\n");
        return -EINVAL;
    }
    .......
}
4、在write函数中设置gpio输出
gpio_set_value(dev->led_gpio,0);
gpio_set_value(dev->beep_gpio,0);
5、在驱动卸载函数exit中释放gpio
gpio_free(beepdev.beep_gpio);
gpio_free(beepdev.led_gpio);


回复

使用道具 举报

34

主题

252

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
473
金钱
473
注册时间
2020-5-11
在线时间
217 小时
发表于 2021-1-29 13:56:23 | 显示全部楼层
原子的教程里面有写,可以看看
回复

使用道具 举报

11

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
499
金钱
499
注册时间
2015-10-26
在线时间
125 小时
 楼主| 发表于 2021-1-29 14:06:47 | 显示全部楼层
asshole 发表于 2021-1-29 13:56
原子的教程里面有写,可以看看

兄弟帮忙看看是哪章,我找了几圈了,也没找到,看的文档是1.5版本
我单独点灯,或按键都调通了
现在想搞按键控制灯的联动,不知道在Linux上面怎么搞了
我想好好学习RTOS,不管哪一种,学会一种就行
回复

使用道具 举报

7

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-9-18
在线时间
27 小时
发表于 2021-2-5 09:45:42 | 显示全部楼层
直接干寄存器或者设备树
回复

使用道具 举报

3

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
422
金钱
422
注册时间
2020-5-25
在线时间
44 小时
发表于 2021-3-12 17:33:03 | 显示全部楼层
原子的的教程有led的也有key的,但但是单独的,用key控制led的好像没有,不过可以结合这两个例程,先按教程的安装好led驱动与key驱动,然后将keyAPP修改一下,比如为testApp.c,内容如下面我改的,最后进入开发板进行测试:./test_app /dev/dtsplatled /dev/key,结果是按一下按键灯亮,再按一下灯灭,如此反复!
int main(int argc, char *argv[])
{
        int fd_led, fd_key, retvalue;
        char *ledname,*keyname;
        unsigned char databuf[1];
        int keyvalue;
        static char bLed = 0;
       
        if(argc != 3){
                printf("Error Usage!\r\n");
                return -1;
        }

        ledname = argv[1];
        keyname = argv[2];
       
        /* 打开led驱动 */
        fd_led = open(ledname, O_RDWR);
        if(fd_led < 0){
                printf("file %s open failed!\r\n", argv[1]);
                return -1;
        }
        /* 打开key驱动 */
        fd_key = open(keyname, O_RDWR);
        if(fd_key < 0){
                printf("file %s open failed! error code:%d\r\n", \
                                keyname, fd_key);
                return -1;
        }
       
        /* 循环读取按键值数据! */
        while(1) {
                read(fd_key, &keyvalue, sizeof(keyvalue));

                if (keyvalue == KEY0VALUE) {        /* KEY0 */
                        bLed = !bLed;
                        printf("KEY0 Press, value = %#X\r\n", keyvalue);        /* 按下 */
                        databuf[0] = bLed;/* 向/dev/led文件写入数据 */
                        retvalue = write(fd_led, databuf, sizeof(databuf));
                        if(retvalue < 0) {
                                printf("KEY Press Fail:%d\r\n", keyvalue);
                                close(fd_led); /* 关闭文件 */
                        }
                }
        }
        close(fd_led); /* 关闭文件 */
        close(fd_key); /* 关闭文件 */

        return 0;
}
回复

使用道具 举报

11

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
499
金钱
499
注册时间
2015-10-26
在线时间
125 小时
 楼主| 发表于 2021-3-15 15:58:35 | 显示全部楼层
mstar666 发表于 2021-3-12 17:33
原子的的教程有led的也有key的,但但是单独的,用key控制led的好像没有,不过可以结合这两个例程,先按教程 ...

谢谢兄弟
我想好好学习RTOS,不管哪一种,学会一种就行
回复

使用道具 举报

3

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2021-1-16
在线时间
52 小时
发表于 2021-3-16 17:53:34 | 显示全部楼层
mstar666 发表于 2021-3-12 17:33
原子的的教程有led的也有key的,但但是单独的,用key控制led的好像没有,不过可以结合这两个例程,先按教程 ...

这个是通过加载两个驱动,应用来实现的联动;
在驱动里也可以,方法类似,在key的驱动里添加led的操作
回复

使用道具 举报

3

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
422
金钱
422
注册时间
2020-5-25
在线时间
44 小时
发表于 2021-3-20 10:59:17 | 显示全部楼层
jzhang123 发表于 2021-3-16 17:53
这个是通过加载两个驱动,应用来实现的联动;
在驱动里也可以,方法类似,在key的驱动里添加led的操作

是的,我这个就是不需要改原来驱动,只需要写应用测试的办法
回复

使用道具 举报

0

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2021-1-12
在线时间
50 小时
发表于 2022-12-22 16:52:28 | 显示全部楼层
jzhang123 发表于 2021-3-16 17:53
这个是通过加载两个驱动,应用来实现的联动;
在驱动里也可以,方法类似,在key的驱动里添加led的操作

都是高手呀  厉害厉害
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 06:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表