im6 gpio分析

本文主要介绍如何配置IOMUX寄存器,设置IO复用寄存器,配置为GPIO功能。参考:  http://www.jianshu.com/p/3c2053508342  http://www.embest-tech.com/community/index.php?topic=2822.0

查看板级文件
kernel/arch/arm/mach-mx6/board_mx6q_sabresd.c

MACHINE_START(MX6Q_SABRESD, "Freescale i.MX 6Quad/DualLite/Solo Sabre-SD Board")
    /* Maintainer: Freescale Semiconductor, Inc. */
    .boot_params = MX6_PHYS_OFFSET + 0x100,
    .fixup = fixup_mxc_board,
    .map_io = mx6_map_io,
    .init_irq = mx6_init_irq,
    .init_machine = mx6_sabresd_board_init,    //-------------------------------->>>  mx6_sabresd_board_init
    .timer = &mx6_sabresd_timer,
    .reserve = mx6q_sabresd_reserve,
MACHINE_END

static void __init mx6_sabresd_board_init(void)  //<<<--------------------------------  mx6_sabresd_board_init
{
    ... ...
    //这里已经将大部分寄存器都进行了配置。
    if (cpu_is_mx6q())
        mxc_iomux_v3_setup_multiple_pads(mx6q_sabresd_pads,    // ------------------>>> mxc_iomux_v3_setup_multiple_pads
            ARRAY_SIZE(mx6q_sabresd_pads));             //  ----------------->>> mx6q_sabresd_pads
    else if (cpu_is_mx6dl()) {
        mxc_iomux_v3_setup_multiple_pads(mx6dl_sabresd_pads,
            ARRAY_SIZE(mx6dl_sabresd_pads));
    }
    ... ...
}
mx6q_sabresd_pads结构体。
kernel/arch/arm/mach-mx6/board_mx6q_sabresd.h
static iomux_v3_cfg_t mx6q_sabresd_pads[] = {          // <<<---------------------  mx6q_sabresd_pads
    /* AUDMUX */
    MX6Q_PAD_CSI0_DAT4__AUDMUX_AUD3_TXC,
    MX6Q_PAD_CSI0_DAT5__AUDMUX_AUD3_TXD,
    MX6Q_PAD_CSI0_DAT6__AUDMUX_AUD3_TXFS,
    MX6Q_PAD_CSI0_DAT7__AUDMUX_AUD3_RXD,

    MX6Q_PAD_SD1_DAT1__GPIO_1_17,       /* FT5X06 RESET */

    MX6Q_PAD_NANDF_CS3__GPIO_6_16,      //FT5X06_INT
    ... ...
}

以MX6Q_PAD_SD1_DAT1__GPIO_1_17举例。
#define  MX6Q_PAD_SD1_DAT1__GPIO_1_17       \
        (_MX6Q_PAD_SD1_DAT1__GPIO_1_17 | MUX_PAD_CTRL(MX6Q_HIGH_DRV))
#define _MX6Q_PAD_SD1_DAT1__GPIO_1_17           \
        IOMUX_PAD(0x0724, 0x033C, 5, 0x0000, 0, 0)
#define MUX_PAD_CTRL(x)     ((iomux_v3_cfg_t)(x) << MUX_PAD_CTRL_SHIFT)

#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))

int mxc_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t *pad_list, unsigned count)   // <<<-------- mxc_iomux_v3_setup_multiple_pads()
{
    iomux_v3_cfg_t *p = pad_list;
    int i;
    int ret;

    for (i = 0; i < count; i++) {
        ret = mxc_iomux_v3_setup_pad(*p);          // ------------------------------>>>  mxc_iomux_v3_setup_pad()
        if (ret)
            return ret;
        p++;
    }
    return 0;
}
EXPORT_SYMBOL(mxc_iomux_v3_setup_multiple_pads);

/* 将定义的宏解析,提取其中数据,设置到寄存器中 */
int mxc_iomux_v3_setup_pad(iomux_v3_cfg_t pad)       // <<<---------------------------- mxc_iomux_v3_setup_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);
时间: 2024-10-27 12:30:27

im6 gpio分析的相关文章

友坚4412开发板基于Timed_out框架的GPIO驱动分析

Timed GPIO驱动程序分析 Timed GPIO驱动程序是android系统基于linux内核新增加的一类驱动程序,这类驱动程序主要是运用了内核定时器,与内核定时器进行绑定,使得控制GPIO口的高低电平与时间打上关系,既可以实现在一定的时间实现GPIO口为高或者低电平.Timed GPIO驱动被实现为平台设备驱动,Timed GPIO驱动源码位于如下目录:\kernel\drivers\staging\android Timed GPIO驱动程序主要包括如下几个文件: Timed_gpio

树莓派官方自带gpio中断驱动bcm2708_gpio.c原理分析 linux 中断架构 中断子系统

上一篇记录了树莓派自带的gpio驱动(http://www.cnblogs.com/umbrellary/p/5164148.html),在bcm2708_gpio.c实现gpio驱动的同时其实也实现了中断控制器的驱动,本文记录bcm2708_gpio.c中驱动的实现. 一·bcm2708_gpio_irq_init中断初始化函数建立gpio中断描述表 static void bcm2708_gpio_irq_init(struct bcm2708_gpio *ucb) { unsigned i

Android(Java)控制GPIO的方法及耗时分析

前面两篇分别介绍了通过脚本和C代码读写/sys/class/gpio以控制GPIO.实际项目调试时经常还需要在Java代码里控制GPIO,其实现与C代码类似,唯一不同是Android权限.本文重点介绍Android6.0权限的配置并对在Java层控制GPIO的耗时做简单分析. 以高通平台为例,权限配置主要修改HLOS/device/qcom/sepolicy/common目录下的file.te.file_contexts和system_app.te三个文件. file.te修改如下, # GPI

Android(Linux)控制GPIO的方法及实时性分析

Linux下控制GPIO的方法有N种,详细请参考<RPi GPIO Code Samples>,文中用十多种语言演示了如何控制GPIO,非常全面详尽.因此,这里不再多做赘述,仅把调试过程中整理的脚本贴上并做简单的分析.特别说明,Linux必须有root权限!!!否则会出现/system/bin/sh: can't create /sys/class/gpio/export: Permission denied等错误. @echo off echo adb root adb root >%

GPIO模拟IIC接口信号质量分析

信号质量有问题的波形001: 信号质量有问题的波形002: 从上图可以看出,GPIO口模拟的I2C接口,电平都存在半高的情况. 因为MFI芯片的I2C采用的GPIO口模拟I2C接口来实现的此功能,原SCL采用的GPB7(内部默认为上拉状态),因为GPIO资源的调整,SCL改为GPD12(内部默认为下拉状态),因SCL对应的GPIO口内部有下拉电阻,导致在输出为高电平时,上升沿慢的台阶出现.软件后面把GPD12的内部下拉电阻disable之后,测试的波形如上图所示,从上图可以看出SCL时钟信号已经

Linux内核中的GPIO系统之(3):pin controller driver代码分析--devm_kzalloc使用【转】

转自:http://www.wowotech.net/linux_kenrel/pin-controller-driver.html 一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datasheet会把pin controller的内容放入GPIO controller的章节中),主要功能包括: (1)pin multiplexing.基于ARM core

LInux-3.0.8中基于S5PV210的GPIO模块代码追踪和分析

编写按键驱动时,想知道内核是如何管理GPIO的,所以开始追踪代码,中间走了一些弯路,现记录于此. 追踪代码之前,我猜测:第一,这部分代码应该在系统set up阶段执行:第二,GPIO的代码应该在machine或者platform或者vendor相关的目录下.事实证明,第一点是正确的,第二点基本是错误的,因为内核依靠对GPIO的抽象来管理之,这层抽象层给具体的machine留出了一些它们需要是实现的接口,这与其他的设备驱动框架在使用上是很类似的,当然,GPIO也是一种设备啊... ...所以,管理

【Allwinner ClassA20类库分析】4.GPIO类的使用

从本节起,开始使用ClassA20类库完成操作外设的功能,请先在https://github.com/tjCFeng/ClassA20下载ClassA20类库. 封装的目的就是简化操作,试想一下,如果想在Linux中直接设置GPIO寄存器需要做什么工作?基本上计算物理地址.获取映射地址.了解每个寄存器的作用.设置对应的位......很是繁琐.而使用了封装的类库之后,只需要这样做: 只要从原理图上找到了对应的IO口,其他的可以不必考虑,这种开发效率我就不多说了(说的这段时间IO口已经操作完了,呵呵

bcm53344 gpio驱动分析

/********************************************************************************* * 1.查看代码是在vim下,使用ctags进行的.也可以使用SourceInsight * 2.为方便查找,使用“------->>>"加数字/字母进行标记,表示后面会进行详解. * 使用“<<<------"加数字/字母,表示详解或相同的地方, * 查看时找到相同的标记进行阅读 *