操作系统:win10 64位

虚拟机:VMware® Workstation 14 Pro

虚拟机操作系统:ubuntu 18.04 64位  ubuntu-18.04.2-desktop-amd64.iso

开发板:迅为 iMX6Q

本次目标:了解IMX6Q的GPIO PIN定义与使用方法

代码:【U-Boot 2015.04 】

 

目前正在研究IMX6Q的Uboot代码,从最基本的GPIO的操作开始吧。

 

一、IMX6Q GPIO PIN引脚定义:

如uboot debug串口定义:

static iomux_v3_cfg_t const uart1_pads[] = {
    MX6_PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
    MX6_PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
};

 

        这里如果使用Source Insight 查看代码,发现直接搜索 MX6_PAD_CSI0_DAT10__UART1_TX_DATA  是没有定义的,那编译能正常的通过,说明,有预编译宏的处理,如【字符的连接】等宏定义。也就是,上面这样的引脚名称,或许是一个组合。

 

我直接搜索:CSI0_DAT10__UART1_TX_DATA,找到了引脚对应的寄存器的定义

mx6q_pins.h

MX6_PAD_DECL(CSI0_DAT10__UART1_TX_DATA,    0x0650, 0x0280, 3, 0x0000, 0, 0)

 

看来,有一个宏:【MX6_PAD_DECL】,它处理了,比如加了一个【MX6_PAD_】的前导字符。

查看了一下MX6_PAD_DECL】,

mx6-pins.h里有定义:

#define MX6_PAD_DECLARE(prefix, name, pco, mc, mm, sio, si, pc) \
    prefix##name = IOMUX_PAD(pco, mc, mm, sio, si, pc)

 

#ifdef CONFIG_MX6QDL
enum {
#define MX6_PAD_DECL(name, pco, mc, mm, sio, si, pc) \
    MX6_PAD_DECLARE(MX6Q_PAD_,name, pco, mc, mm, sio, si, pc),
#include "mx6q_pins.h"
#undef MX6_PAD_DECL
#define MX6_PAD_DECL(name, pco, mc, mm, sio, si, pc) \
    MX6_PAD_DECLARE(MX6DL_PAD_,name, pco, mc, mm, sio, si, pc),
#include "mx6dl_pins.h"
};
#elif defined(CONFIG_MX6Q)
enum {
#define MX6_PAD_DECL(name, pco, mc, mm, sio, si, pc) \
    MX6_PAD_DECLARE(MX6_PAD_,name, pco, mc, mm, sio, si, pc),

#include "mx6q_pins.h"
};

 

这里是【enum枚举类型】,说明最终引脚定义应该为一个数值。

继续跟进宏定义:【MX6_PAD_DECLARE】

iomux-v3.h中,找到最终的实现方式:

#define IOMUX_PAD(pad_ctrl_ofs, mux_ctrl_ofs, mux_mode, sel_input_ofs,	\
		sel_input, pad_ctrl)					\
	(((iomux_v3_cfg_t)(mux_ctrl_ofs) << MUX_CTRL_OFS_SHIFT)     |	\
	((iomux_v3_cfg_t)(mux_mode)      << MUX_MODE_SHIFT)         |	\
	((iomux_v3_cfg_t)(pad_ctrl_ofs)  << MUX_PAD_CTRL_OFS_SHIFT) |	\
	((iomux_v3_cfg_t)(pad_ctrl)      << MUX_PAD_CTRL_SHIFT)     |	\
	((iomux_v3_cfg_t)(sel_input_ofs) << MUX_SEL_INPUT_OFS_SHIFT)|	\
	((iomux_v3_cfg_t)(sel_input)     << MUX_SEL_INPUT_SHIFT))

看来GPIO PIN引脚的宏定义,基本清楚了。操作一个引脚,其实就是操作了一个寄存器(地址)。

 

二、IMX6Q GPIO PIN引脚操作:

 

如何操作一个GPIO PIN脚呢?这其实是嵌入式软件最hello world的入门知识。

(1)一个GPIO PIN引脚,首先要通过原理图找到PIN脚,初始化为GPIO(一些GPIO还有复用功能)功能。

(2)GPIO输出高还是低。

 

查看原理图:

 

 

通过imx6q 的datasheet,找到 F18引脚对应的 GPIO,这里为GPIO1_IO21。

 

 

这里操作一个LCD电源使能的GPIO

(1)#define DISP0_PWR_EN    IMX_GPIO_NR(1, 21)   //定义引脚

(2)初始化GPIO,这里为: GPIO1_21,在rgb_pads定义:

MX6_PAD_SD1_DAT3__GPIO1_IO21 | MUX_PAD_CTRL(NO_PAD_CTRL),

imx_iomux_v3_setup_multiple_pads(rgb_pads, ARRAY_SIZE(rgb_pads));  //初始化GPIO

(3)gpio_direction_output(DISP0_PWR_EN, 1);   //输出高电平

 

 

以上部分代码,【迅为IMX6Q】提供的uboot代码里已经实现了。通过了解GPIO的PIN脚定义与操作,如果自己想控制一个GPIO,应该有思路了。

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐