6. Uboot的GPIO控制

6.1. 简介

Uboot的GPIO是常用的功能,在开发中常常需要在上电时进行控制。

6.2. 下载安装编译镜像系统

使用平台:Ubuntu 18.04.5 LTS 版本

可以使用我们提供的虚拟机镜像 https://doc.embedfire.com/products/link/zh/latest/linux/ebf_i.mx6ull.html#id4

也可以自己下载ubuntu 18.04.5 LTS官方镜像搭建

https://mirrors.aliyun.com/ubuntu-releases/bionic/ubuntu-18.04.5-desktop-amd64.iso

6.3. 安装编译工具和依赖

使用apt工具能快速安装好我们需要的工具和依赖

1
  sudo apt install make git gcc-arm-none-eabi gcc bison flex libssl-dev dpkg-dev lzop libncurses5-dev vim

6.4. 下载Uboot源代码

可以到我们的gitee上下载我们的源码,也可以下载NXP官方的源码进行配置,本教程就以我们野火修改过的Uboot进行讲解

我们的UBOOT地址:https://gitee.com/Embedfire/ebf_linux_uboot/tree/ebf_v2020_10_imx/

NXP官方的UBOOT地址:https://source.codeaurora.org/external/imx/uboot-imx/

1
     git clone https://gitee.com/Embedfire/ebf_linux_uboot.git

6.5. 查找引脚

对于控制引脚,我们首先得认的出哪个是我们要使用的引脚

我这里用拨盘的3号位为例,在原理图(如果没有原理图可以从这里下载 野火_EBF6ULL S1 Pro 底板_原理图_20200729.pdf )中可以看出它的名称为:LCD_DATA4

可以到用户手册查询,也可以到 ebf_linux_uboot/arch/arm/dts/imx6ul-pinfunc.h 下查询

我们这里就在源码里查找,找到如图

未找到图片gpioz

我们主要看的是GPIOX_IOXX

#define MX6UL_PAD_LCD_DATA04__GPIO3_IO09 是我们拨盘上的3号拨盘。

这里看出分别是3和9,等会我们调用代码会使用到。

我们再看一下板子上的三色灯

未找到图片lightgpio2

我们就控制红灯引脚即可,查原理图得知,相应管脚为GPIO1_IO4

未找到图片lightgpio

6.6. 编写代码

我们写一份调用GPIO库控制GPIO口的代码存在 ebf_linux_uboot/cmd目录下

新建一个c文件

文件位置:ebf_linux_uboot/cmd/ebf_gpio.c

1
  vim ./cmd/ebf_gpio.c

然后把代码复制进去,也可以下载这里提供的代码 ebf_gpio.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    #include <command.h>
    #include <fdt_support.h>
    #include <linux/string.h>
    #include <fs.h>
    #include <asm/gpio.h>

    int gpiox=-1,iox=-1,ebf_lhf=-1,put_value=-1;


    static int do_ebfgpio(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[])
    {


      if(strcmp(argv[1], "get") == 0)
      {
        gpiox=*argv[2]-'0';
        iox=*argv[3]-'0';
        gpio_request(IMX_GPIO_NR(gpiox, iox), "ebf_get");//初始化管脚
        gpio_direction_input(IMX_GPIO_NR(gpiox, iox));//设置为输入管脚
        ebf_lhf = gpio_get_value(IMX_GPIO_NR(gpiox, iox));//获取输入

        if(ebf_lhf)
        {
          printf("Get! GPIO%d_IO%d:High level\r\n",gpiox,iox);
        }
        else
        {
          printf("Get! GPIO%d_IO%d:LOW level\r\n",gpiox,iox);
        }

      }
      else if(strcmp(argv[1], "put") == 0)
      {
        gpiox=*argv[2]-'0';
        iox=*argv[3]-'0';
        put_value=*argv[4]-'0';
        if(put_value!=1&&put_value!=0)
        {
          printf("put value err!\r\n");
          return -1;
        }
        gpio_request(IMX_GPIO_NR(gpiox, iox), "ebf_put");//初始化管脚
        gpio_direction_output(IMX_GPIO_NR(gpiox, iox),put_value);//设置为输出管脚
        gpio_set_value(IMX_GPIO_NR(gpiox, iox),put_value);//输出电平


      }
      else
      {
        printf("Nothing to do\r\n");
      }
        return 0;
    }

    static char ebfgpio_help_text[] =
      "[way GPIO IO [OUTPUT_VALUE]]\n"
      "\tway:\"get\"or\"put\"\n"
      "\tGPIO:GPIO Group\n"
      "\tIO:IO NUMB\n"
      "\tOUTPUT_VALUE:\"0\"or\"1\""
      ;

    U_BOOT_CMD(
      ebfgpio,        5,      0,      do_ebfgpio,
      "EBF control GPIO ", ebfgpio_help_text
    );

代码较为简单结合注释理解即可。

6.7. 修改Makefile

修改Makefile的目的是让编译器知道我们要把这个文件编进uboot

文件位置:ebf_linux_uboot/cmd/Makefile

添加 obj-y += ebf_gpio.o 到如图位置

未找到图片makefile

6.8. 编译

1
2
3
4
  make distclean
  make mx6ull_fire_mmc_defconfig CROSS_COMPILE=arm-none-eabi-
  #编译uboot
  make CROSS_COMPILE=arm-none-eabi- -j4

烧录进板子,烧录详细请看

uboot烧录

6.9. 演示

6.9.1. 输入演示

当我们将拨盘3拨到如图位置

未找到图片p1

在uboot命令行中调用命令

1
  ebfgpio get 3 9

显示如图

未找到图片mdev 未找到图片p2

当我们将拨盘3拨到如图位置

在uboot命令行中调用命令

1
  ebfgpio 3 9

显示如图

未找到图片mdev

6.9.1.1. 输出演示

1
  ebfgpio put 1 4 0
未找到图片liangdengml 未找到图片p1
1
  ebfgpio put 1 4 1
未找到图片miedengml 未找到图片lm