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 下查询
我们这里就在源码里查找,找到如图
我们主要看的是GPIOX_IOXX
#define MX6UL_PAD_LCD_DATA04__GPIO3_IO09 是我们拨盘上的3号拨盘。
这里看出分别是3和9,等会我们调用代码会使用到。
我们再看一下板子上的三色灯
我们就控制红灯引脚即可,查原理图得知,相应管脚为GPIO1_IO4
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 到如图位置
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
|
烧录进板子,烧录详细请看