【迅为iMX6Q】开发板:IMX6Q的GPIO PIN的定义的理解与GPIO的操作方式
操作系统: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代码,从最基...
操作系统: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,应该有思路了。
更多推荐
所有评论(0)