I.MX6 U-boot GPIO hacking

/*******************************************************************************
 *                          I.MX6 U-boot GPIO hacking
 * 说明:
 *     本文主要记录I.MX6 U-boot是如何设置GPIO口输入输出的,主要是考虑到这个阶段
 * 并没有像Linux内核中的gpio_request一系列函数使用。
 *
 *                                          2016-3-7 深圳 南山平山村 曾剑锋
 ******************************************************************************/

cat bootable/bootloader/uboot-imx/board/freescale/mx6q_sabresd/mx6q_sabresd.c
    ......
    #ifdef CONFIG_LCD
    void lcd_enable(void)
    {
        ......
        mxc_iomux_v3_setup_pad(MX6DL_PAD_SD1_DAT2__GPIO_1_19);   ---+
        reg = readl(GPIO1_BASE_ADDR + GPIO_GDIR);                ---*---------------+
        reg |= (1 << 19);                                           |               |
        writel(reg, GPIO1_BASE_ADDR + GPIO_GDIR);                   |               |
                                                                    |               |
        reg = readl(GPIO1_BASE_ADDR + GPIO_DR);                     |               |
        reg &= ~(1 << 19);                                          |               |
        writel(reg, GPIO1_BASE_ADDR + GPIO_DR);                     |               |
        ......                                                      |               |
    }                                                               |               |
    ......                                                          |               |
                                                                    |               |
#define MX6DL_PAD_SD1_DAT2__GPIO_1_19                           <---+          \    |
    IOMUX_PAD(0x06D4, 0x02EC, 5, 0x0000, 0, NO_PAD_CTRL)            |               |
                                                                    |               |
/*                                                                  |               |
 * configures a single pad in the iomuxer                           |               |
 */                                                                 |               |
int mxc_iomux_v3_setup_pad(iomux_v3_cfg_t pad)                  <---+               |
{                                                                                   |
    u32 mux_ctrl_ofs = (pad & MUX_CTRL_OFS_MASK) >> MUX_CTRL_OFS_SHIFT;             |
    u32 mux_mode = (pad & MUX_MODE_MASK) >> MUX_MODE_SHIFT;                         |
    u32 sel_input_ofs = (pad & MUX_SEL_INPUT_OFS_MASK) >> MUX_SEL_INPUT_OFS_SHIFT;  |
    u32 sel_input = (pad & MUX_SEL_INPUT_MASK) >> MUX_SEL_INPUT_SHIFT;              |
    u32 pad_ctrl_ofs = (pad & MUX_PAD_CTRL_OFS_MASK) >> MUX_PAD_CTRL_OFS_SHIFT;     |
    u32 pad_ctrl = (pad & MUX_PAD_CTRL_MASK) >> MUX_PAD_CTRL_SHIFT;                 |
                                                                                    |
    if (mux_ctrl_ofs)                                                               |
        __raw_writel(mux_mode, base + mux_ctrl_ofs);                                |
                                                                                    |
    if (sel_input_ofs)                                                              |
        __raw_writel(sel_input, base + sel_input_ofs);                              |
                                                                                    |
    if (!(pad_ctrl & NO_PAD_CTRL) && pad_ctrl_ofs)                                  |
        __raw_writel(pad_ctrl, base + pad_ctrl_ofs);                                |
                                                                                    |
    return 0;                                                                       |
}                                                                                   |
EXPORT_SYMBOL(mxc_iomux_v3_setup_pad);                                              |
                                                                                    |
                                                                                    |
/**                                                                                 |
 * 1. 参考文档:                                                                    |
 *     i.MX 6Dual/6Quad Multimedia Applications Processor Reference Manual          |
 * 2. 30.4 Programmable Registers                                                   |
 *     +------------------------------------------------------+                     |
 *     |                      GPIO memory map                 |                     |
 *     +-----------+-------------------------------+----------+                     |
 *     | Absolute  | Register name                 | Section/ |                     |
 *     | address   |                               | page     |                     |
 *     | (hex)     |                               |          |                     |
 *     +-----------+-------------------------------+----------+                     |
 *     | 0209_C000 | GPIO data register (GPIO1_DR) | 30.4.1/  |                     |
 *     |           |                               |          |                     |
 *     +-----------+-------------------------------+----------+                     |
 * 3. GPIO1_BASE_ADDR = 0x1C000 + 0x80000 + 0x02000000                              |
 *    GPIO1_BASE_ADDR = 0x0209C000                                                  |
 */                                                                                 |
#define GPIO1_BASE_ADDR            (AIPS1_OFF_BASE_ADDR + 0x1C000)         <--------+
#define AIPS1_OFF_BASE_ADDR        (ATZ1_BASE_ADDR + 0x80000)                       |
#define ATZ1_BASE_ADDR            AIPS1_ARB_BASE_ADDR                               |
#define AIPS1_ARB_BASE_ADDR        0x02000000                                       |
                                                                                    |
#define GPIO_GDIR               0x04                                       <--------+
#define GPIO_DR                 0x00                                                                

 

时间: 2024-07-29 14:45:23

I.MX6 U-boot GPIO hacking的相关文章

I.MX6 U-boot lvds display hacking

/*********************************************************************************** * I.MX6 U-boot lvds display hacking * 声明: * 本文主要是为了跟踪I.MX6中的U-boot中显示部分代码,查看是否支持24bit显示. * * 2015-10-8 晴 深圳 南山平山村 曾剑锋 ***********************************************

I.MX6 PWM buzzer driver hacking with Demo test

/***************************************************************************** * I.MX6 PWM buzzer driver hacking with Demo test * 声明: * 1. I.MX6和OK335xS实现PWM驱动函数是不一样的: * 2. 通过分析PWM驱动,了解有哪些驱动函数可以用: * 3. 使用I.MX6提供的PWM函数,编写测试用例buzzer驱动: * 4. 使用C编写测试程序.

I.MX6 android BatteryService jni hacking

/**************************************************************************** * I.MX6 android BatteryService jni hacking * 声明: * 本文主要是为了知道Android的获取的电源管理的数据的jni是从Linux系统的 * 什么位置获取的,获取的机制是什么. * * 2016-2-22 深圳 南山平山村 曾剑锋 ********************************

I.MX6 Ar8031 device register hacking

/***************************************************************************** * I.MX6 Ar8031 device register hacking * 声明: * 主要是为了知道网卡的注册流程,如果需要对网卡中的一些需求进行修改时,能够 * 能够快速的对需求进行分析.修改. * * 2015-8-15 雨 深圳 南山区平山村 曾剑锋 **************************************

I.MX6 change boot partition 1 to User area

/************************************************************************************ * I.MX6 change boot partition 1 to User area * 说明: * 需要在eMMC中切换U-Boot所在的位置,看一下eMMC的驱动,测试一下效果. * * 2017-5-26 台湾 中和区 曾剑锋 *********************************************

I.MX6 天嵌 E9 U-boot menu hacking

/************************************************************************************ * I.MX6 天嵌 E9 U-boot menu hacking * 说明: * 天嵌在U-boot中添加了自己的选择menu,想看一下怎么实现的. * * 2016-8-5 深圳 南山平山村 曽剑锋 **************************************************************

I.MX6 ar1020 SPI device driver hacking

/************************************************************************************ * I.MX6 ar1020 SPI device driver hacking * 声明: * 1. 本文主要是解读I.MX6中ar1020 SPI设备注册,以及驱动调用流程: * 2. 本文主要使用了vim+ctags进行代码跟踪,所以几乎都是函数原型之间的调用: * * 2015-9-5 晴 深圳 南山平山村 曾剑锋 *

I.MX6 AD7606-4 device driver registe hacking

/********************************************************************** * I.MX6 AD7606-4 device driver registe hacking * 说明: * 看一下AD7606的驱动注册上是否存在一些问题. * * 2017-8-4 深圳 龙华樟坑村 曾剑锋 *********************************************************************/ /

I.MX6 gpio-keys driver hacking

/**************************************************************************** * I.MX6 gpio-keys driver hacking * 说明: * 1. 本文解读gpio-keys驱动是如何注册,最终处理函数在哪里. * 2. 从最后生成的设备节点来看,我们直接可以通过操作该设备节点来来让系统 * 进行相关操作,譬如关机.挂起等操作. * * 2016-3-17 深圳 南山平山村 曾剑锋 *********