I.MX6 U-boot GPIO hacking

简介: /******************************************************************************* * I.MX6 U-boot GPIO hacking * 说明: * 本文主要记录I.MX6 U-boot是如何设置GPIO口输入输出的,主要是考虑到这个阶段 * 并没有像Linux内核中的gpio_request一系列函数使用。
/*******************************************************************************
 *                          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                                                                

 

目录
相关文章
|
缓存 Linux 程序员
老程序员分享:linux下netlink的使用简介
老程序员分享:linux下netlink的使用简介
|
存储 JSON 程序员
Python基础知识点总结
本文包括python基本知识:简单数据结构,数据结构类型(可变:列表,字典,集合,不可变:数值类型,字符串,元组),分支循环和控制流程,类和函数,文件处理和异常等等。
3414 2
Python基础知识点总结
|
人工智能 监控 搜索推荐
|
Python
python编程-22:BeautifulSoup库入门
python编程-22:BeautifulSoup库入门
206 0
python编程-22:BeautifulSoup库入门
|
存储 SQL NoSQL
Tablestore
Tablestore(表格存储)是阿里云提供的一种云原生、高性能、可扩展的 NoSQL 数据库服务。它支持海量数据存储和快速查询,适用于大数据分析、数据仓库、日志收集等场景。
833 1
|
Windows
bat原创-一键添加host和IE添加受信任站点
我分两段写了,都要用的人就合并就行。地址我瞎写的,需要自己改就行。
874 0
|
数据库
聊聊StarRocks向量化执行引擎-过滤操作
聊聊StarRocks向量化执行引擎-过滤操作
452 0
|
数据安全/隐私保护 安全
个人0元购买无影云桌面操作指南
无影云电脑免费体验季节!个人新老用户可领取2核4G 10M带宽无影云桌面免费体验1周~
39857 5
个人0元购买无影云桌面操作指南
|
人工智能 算法 C++
蓝桥杯第九讲--差分【例/习题】
蓝桥杯第九讲--差分【例/习题】
221 0
蓝桥杯第九讲--差分【例/习题】
|
数据采集 运维 Prometheus
如何在实际场景中使用异常检测?阿里云Prometheus智能检测算子来了
作者|梵登、白玙审核&校对:白玙编辑&排版:雯燕1 背景异常检测作为智能运维(AIOps)系统中基础且重要功能,其旨在通过算法自动地发现 KPI 时间序列数据中的异常波动,为后续的告警、自动止损、根因分析等提供决策依据。那么,我们该如何在实际场景中使用异常检测呢,而异常检测又是什么,今天我们就进行一次深入讲解。什么是异常检测?在一切开始前,我们首先需要了解什么是异常检测。异常检测是
652 0
如何在实际场景中使用异常检测?阿里云Prometheus智能检测算子来了