uboot移植之GPIO上电初始状态的调整
开发板在上电之后,GPIO都有一个默认初始状态,这个状态可能是高电平也可能是低电平。而我们的应用程序在正式接管控制这些GPIO,是在内核起来并成功加载根文件系统之后。所以在内核启动的这段时间内,这些GPIO保持在一种不受控的状态。但是我们实际应用的时候,可能需要这些GPIO在此阶段处于稳定的某种状态,所以我们可以在uboot中设置此状态,并一直保持到应用成功接管之后。
现在以开发板主板上三个LED灯为例,讲解如何在uboot阶段设置GPIO的电平状态。设置LED灯相关GPIO电平状态,一是需要设置GPIO引脚IOMUX复用功能相关寄存器,二是要设置GPIO控制器相关寄存器,如设置GPIO为输出功能,设置输出电平高低。
在前面章节中讲了配置一个引脚IOMUX复用功能需要配置三个寄存器:IOMUXC_SW_MUX_CTL_PAD、IOMUXC_SW_PAD_CTL_PAD、SELECT_INPUT。
但是在配置之前我们需要知道,我们将要配置的是哪一个引脚,以LED_Y黄灯为例。
一、确定LED_Y引脚
我们打开硬件原理图,查找LED_Y,发现该引脚CPU球号为K15。
然后通过球号K15查找该引脚的名称PAD NAME。通过查找ELF 1开发板资料包\05-硬件资料\05-4 管脚分配表/ ELF 1引脚复用对照表.xlsx,我们知道,K15的PAD NAME为UART1_CTS_B。
二、查看IOMUX相关寄存器
在ELF 1开发板资料包\05-硬件资料\05-2 芯片数据手册\IMX6ULLRM手册中查找引脚PAD NAME为UART1_CTS_B的相关寄存器,打开参考手册Chapter 32 IOMUX Controller (IOMUXC)章节,
然后打开IOMUXC Memory Map/Register Definition,可以看到各个引脚按照PAD NAME对应的寄存器:
找到UART1_CTS_B对应IOMUXC_SW_MUX_CTL_PAD寄存器:
IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B
对应的IOMUXC_SW_PAD_CTL_PAD寄存器:
IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B
由于我们使用UART1_CTS_B引脚复用成为GPIO1_IO08,而GPIO1_IO08只能复用到UART1_CTS_B引脚,所以没有相应的SELECT_INPUT寄存器。
打开IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B寄存器的描述:
看到此寄存器地址为0X20E008C。有效位为MUX_MODE[0:3],SION[4]。其中SION是否强制将该引脚复用成为UART1_CTS_B,一般情况下用不到,将其设置成默认的0即可。
MUX_MODE就是选择复用模式配置,这里设置成为0101。所以可设置0X20E008C值为0x05。
打开IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B寄存器的描述:
可以看到该寄存器地址为:0x20E0318。此寄存器很多配置项包括上下拉,驱动能力等,作为GPIO控制LED灯输出功能,我们一般不需要做配置,使用默认配置即可。
三、查看GPIO控制器相关寄存器
在官方参考手册的28章,有GPIO控制器相关寄存器说明:
我们主要需要配置的寄存器是GPIOx_DR设置数据寄存器和GPIOx_GDIR设置输入输出方向的寄存器。
四、在uboot代码中我们设置寄存器
在文件board/freescale/mx6ullevk/mx6ullevk.c中添加:
static iomux_v3_cfg_t const led_pads[] = { MX6_PAD_UART1_CTS_B__GPIO1_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL), }; static void led_init(void){ gpio_direction_output(IMX_GPIO_NR(1,18), 0); }; |
在int board_init(void)函数中添加:
imx_iomux_v3_setup_multiple_pads(led_pads, ARRAY_SIZE(led_pads)); led_init(); |
五、测试
修改完成之后,编译uboot,并使用tftp加载到内存,然后使用mmc write命令将镜像烧写到eMMC Flash。具体的tftp网络环境搭建,请参考之前章节内容。
首先建立编译脚本:
elf@ubuntu:~/work/elf1_uboot/uboot-imx-2016.03$ touch build.sh elf@ubuntu:~/work/elf1_uboot/uboot-imx-2016.03$ vim build.sh |
在脚本中输入以下内容:
#!/bin/bash export CPU='grep -c processor /proc/cpuinfo' source /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi make distclean make imx6ull_elf1_defconfig make -j${CPUS} |
注意:将上面的内容复制到开发环境中可能会存在格式问题,正确格式内容如下图所示,请参考下图进行调整:
给脚本可执行权限:
elf@ubuntu:~/work/elf1_uboot/uboot-imx-2016.03$ chmod u+x build.sh |
然后直接使用build.sh脚本进行编译:
elf@ubuntu:~/work/elf1_uboot/uboot-imx-2016.03$ ./build.sh |
将u-boot.imx复制到/home/elf/tftp下:
elf@ubuntu:~/work/elf1_uboot/uboot-imx-2016.03$ cp u-boot.imx /home/elf/tftp |
在开发板uboot命令行,使用tftp命令将uboot.imx下载到内存:
=> tftp 80800000 u-boot.imx |
设置mmc设备及分区:
=> mmc dev 1 1 switch to partitions #1, OK mmc1(part 1) is current device |
执行命令写入到mmc(该命令的count长度,请根据uboot.imx实际大小设置,具体计算方法可参考8.4.3.3 eMMc/SD卡命令章节)
=> mmc write 80800000 2 346 MMC write: dev # 1,block #2, count 838 ... 838 blocks written: OK |
烧写完成之后,我们执行reset命令,重启:
=> reset |
重启之后可以看到LED_Y黄灯点亮。
六、代码说明
下面分析调用过程,board_init会在commn/board_r.c的初始化序列中调用。
board_init首先调用imx_iomux_v3_setup_multiple_pads(led_pads, ARRAY_SIZE(led_pads));
此函数在arch/arm/imx-common/iomux-v3.c中定义:
该函数又调用imx_iomux_v3_setup_pad函数,imx_iomux_v3_setup_pad函数通过传入的参数获取三个寄存器的地址和要写入的值,最后将值写入到寄存器中。传入的参数为:
MX6_PAD_UART1_CTS_B__GPIO1_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL) |
我们展开第一个宏定义,在arch/arm/include/asm/arch-mx6/mx6ull_pins.h中:
MX6_PAD_UART1_CTS_B__GPIO1_IO18 = IOMUX_PAD(0x0318, 0x008C, 5, 0x0000, 0, 0), |
再次展开IOMUX_PAD宏,在arch/arm/include/asm/imx-common/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)) |
从参数名称可以看出,IOMUX_PAD(0x0318, 0x008C, 5, 0x0000, 0, 0),中的
0x0318是IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B寄存器偏移地址;
0x008C是IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B寄存器偏移地址;
0x0000是SELECT_INPUT偏移地址,这里是0,说明没有此项寄存器;
其中的mux_mode的值5,即是要设置成IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B寄存器的值;
后面第一个0,是设置成SELECT_INPUT的值,这里没有意义;
最后一个参数0表示对该寄存器不做配置,而该寄存器的值由MUX_PAD_CTRL(NO_PAD_CTRL)宏来配置,该宏不再展开看,NO_PAD_CTRL的意思就是,使用寄存器默认的配置参数;
至此,IOMUX寄存器配置值配置完成;
七、输出电平,控制LED
在board_init中通过调用led_init函数,设置GPIO输出低电平,使LED_Y点亮:
gpio_direction_output(IMX_GPIO_NR(1,18), 0); |
按照这四个步骤再将LED_G和LED_R进行初始化配置即可。
相关文章:

uboot移植之GPIO上电初始状态的调整
开发板在上电之后,GPIO都有一个默认初始状态,这个状态可能是高电平也可能是低电平。而我们的应用程序在正式接管控制这些GPIO,是在内核起来并成功加载根文件系统之后。所以在内核启动的这段时间内,这些GPIO保持在一种不受控的状态…...
PasteForm(ABP)框架之实现更加灵活的类似多租户的归属过滤功能,比如只能查看自己的相关数据
需求说明 在开发中,我们常会遇到一个问题,就是归属查询问题,比如只能查看我自己的,往往这个时候还附带了一个规则,比如有人是在这个规则之外的! 1.只能查看创建者自己创建的资料 2.只能查看我店铺的相关内容,不能查看别人店铺的 3.只能查看我部门的相关信息等 可能你会…...

本地id_rsa.pub输入到服务器~/.ssh/authorized_keys后,依然需要输入密码的解决办法
首先检查服务器: sudo vim /etc/ssh/sshd_config 然后把这两个修改为: 如果依然需要输入密码,在本地终端: ssh -v userserver 查看认证过程,例如我这里提示说明客户端已成功尝试使用密钥认证: 进一步…...

【设计模式-3.7】结构型——组合模式
说明:本文介绍结构型设计模式之一的组合模式 定义 组合模式(Composite Pattern)又叫作整体-部分(Part-Whole)模式,它的宗旨是通过将单个对象(叶子节点)和组合对象(树枝…...

Unity Mac 笔记本操作入门
在 macOS 笔记本电脑上使用 Unity Editor 的场景视图 (Scene View) 旋转视角,主要依赖于触摸板手势和键盘修饰键的组合。由于没有物理中键,操作方式会与 Windows 鼠标略有不同。 以下是具体的旋转视角操作: 1. 基本旋转视角 (Orbit) 这是最…...

实时数据仓库是什么?数据仓库设计怎么做?
目录 一、实时数据仓库是什么 (一)实时数据仓库的定义 (二)实时数据仓库的特点 二、实时数据仓库的应用场景 (一)金融行业 (二)电商行业 (三)物联网行…...

Linux(12)——基础IO(下)
目录 六、重定向 📄输出重定向 📄输入重定向 📄追加重定向 📄dup2 七、理解一切皆文件 八、缓冲区 🧠什么是缓冲区 🧠为什么要引入缓冲区 📄缓冲区类型 九、FILE 六、重定向 我们这…...

WPF可拖拽ListView
1.控件描述 WPF实现一个ListView控件Item子项可删除也可拖拽排序,效果如下图所示 2.实现代码 配合 WrapPanel 实现水平自动换行,并开启拖拽 <ListViewx:Name"listView"Grid.Row"1"Width"300"AllowDrop"True&…...
rocketmq索引
索引的理解 索引是什么, 索引实质是 相同数据的另一种存储结构 我们都知道读和写天然是存在矛盾的, 我们希望写的快,当然是顺序写的性能最高, 顺序写造成数据杂乱无章,没法按照一定的规律去找数。 如果想要找数的效率高, 必须要有结构组织的存放数据, 这样方便按规律找…...

[蓝桥杯]倍数问题
倍数问题 题目描述 众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 nn 个数,希望你从这 nn 个数中找到三个数,使得…...
定时任务的 cron 表达式
定时任务的 cron 表达式 一、什么时 cron 表达式 Cron表达式是一种广泛应用于Linux系统的时间表示格式,常用于定时任务的调度。Cron表达式可以通过指定不同的时间参数,描述一个在 未来某个时间点执行的任务。 二、Cron表达式语法 秒 分 时 日 月 周几…...

【MySQL】 约束
一、约束的定义 MySQL 约束是用于限制表中数据的规则,确保数据的 准确性 和 一致性 。约束可以在创建表时定义,也可以在表创建后通过修改表结构添加。 二、常见的约束类型 2.1 NOT NULL 非空约束 加了非空约束的列不能为 NULL 值,如果可以…...
MySQL 的 redo log 和 binlog 区别?
MySQL 的 redo log 和 binlog 区别? 1. 核心概念对比 1.1 redo log(重做日志) go专栏:https://duoke360.com/tutorial/path/golang 定位:InnoDB引擎层的物理日志作用:实现事务的持久性(ACID中的Durability)记录内容:物理页级别的修改(如"在page 5的offset 10…...

前端vue打开多个窗口,关闭窗口后才继续执行后续逻辑
1.打开第一个弹窗 弹窗的按钮代码 2.点击窗口1中按钮,打开新的窗口 // 请领单按钮点击 async cb_6_delClick() {let ls_yfbm this.st_3Value.BMBMlet pstring {}pstring.a ls_yfbmpstring.b this.queryFormDialog.outDepotDeptCodeawait this.openwithparm_w_md…...

「深度拆解」Spring Boot如何用DeepSeek重构MCP通信层?从线程模型到分布式推理的架构进化
什么是MCP? MCP(Model Context Protocol,模型上下文协议)是由Anthropic公司于2024年11月推出的开放标准协议,旨在为大型语言模型(LLM)与外部数据源、工具及系统提供统一的交互接口,被…...
如何避免在前端项目中出现重复的第三方依赖包?
在现代前端开发中,**重复的第三方依赖包(Duplicate Dependencies)**是导致项目体积膨胀、加载速度变慢、构建时间延长的常见问题。尤其在使用模块打包工具(如 Webpack、Vite、Rollup)时,若项目或其依赖的库…...
Java开发中复用公共SQL的方法
在一次Java后端开发的面试中,面试官问了我一个问题:“你在写代码时会复用公共SQL吗?如果会的话,能详细介绍一下你是如何实现的吗?”这个问题让我眼前一亮,因为在实际项目中,SQL复用确实是一个非…...

【西门子杯工业嵌入式-2-点亮一颗LED】
西门子杯工业嵌入式-2-点亮一颗LED 一、课程回顾与目标1.上节课内容回顾2.本节课目标 二、硬件连接与原理1. 硬件连接方式2. 连接实例 三、GPIO原理知识1. GPIO结构2. 推挽输出模式原理 四、软件实现步骤1. 项目结构设置2. 函数定义3. led.c 文件编写初始化函数 led_init交替闪…...

代码随想录算法训练营第60期第五十五天打卡
大家好,我们今天继续我们图论的部分,其实我们昨天是主要讲解了深搜与广搜的理论基础,我们大体上了解了两种算法的差异与适用情景,今天我们就继续我们的图论的章节,以后几天的题目是图论中比较有名的问题叫做岛屿问题&a…...

重磅更新! 基于Gemini 2.5 Pro打造的AI智能体PlantUML-X上线!
目录 图表绘制AI智能体PlantUML-X上线通过简单的提示词创建各种UML图:轻松搞定其它类型的技术图表: AI智能体PlantUML-X功能实测画一个在Java中的一个简单的用户登录功能的时序图效果展示:根据详细内容生成系统架构图效果展示:效果…...

[5-02-04].第01节:Jmeter环境搭建:
JMeter笔记大纲 Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK,并且配置了环境变量 一、JMeter概述: 1.1.JMeter是什么: JMeter是Appache组织使用java开发的一款测试工具 可以用于对服务器、网络或对象模拟巨大的负载…...

AI智能推荐实战之RunnableParallel并行链
导读:在现代AI应用开发中,如何高效处理多维度数据分析始终是开发者面临的核心挑战。当您需要同时进行情感分析、关键词提取和实体识别,或者要对比多个AI模型的输出结果时,传统的串行处理方式往往效率低下。 本文将深入解析LangCha…...
windows server2019 不成功的部署docker经历
由于现场网络限制,需要将docker 容器部署到windows-server 2019上 1.在windows server 2019上安装 docker-desktop,貌似内核版本太低,无法安装,g 然后曲线救国,window server 2019安装docker,折腾了半天,貌…...

Gemini开源项目DeepResearch:基于LangGraph的智能研究代理技术原理与实现
引言 在人工智能快速发展的今天,如何构建一个能够进行深度研究、自主学习和迭代优化的AI系统成为了技术前沿的重要课题。Gemini开源的DeepResearch一周收获7.9k Star,Google的开源项目Gemini DeepResearch技术通过结合LangGraph框架和Gemini大语言模型&…...
React状态管理Context API + useReducer
在 React 中,Context API useReducer 是一种轻量级的状态管理方案,适合中小型应用或需要跨组件共享复杂状态的场景。它避免了 Redux 的繁琐配置,同时提供了清晰的状态更新逻辑。 1. 基本使用步骤 (1) 定义 Reducer 类似于 Redux 的 reduce…...
【无标题】路径着色问题的革命性重构:拓扑色动力学模型下的超越与升华
路径着色问题的革命性重构:拓扑色动力学模型下的超越与升华 一、以色列路径着色模型的根本局限 mermaid graph TB A[以色列路径着色模型] --> B[强连通约束] A --> C[仅实边三角剖分] A --> D[静态色彩分配] B --> E[无法描述非相邻关系] C --> F[忽…...

Doris Catalog 联邦分析查询性能优化:从排查到优化的完整指南
在大数据分析中,Doris 的 Catalog 联邦分析功能为整合多源数据提供了有力支持。然而,在实际应用中,可能会遇到各种问题影响其正常运行。本文将详细剖析这些问题并提供解决方案。 一、联邦分析查询慢:内外表通用排查逻辑 当遇到 …...

01 Deep learning神经网络的编程基础 二分类--吴恩达
二分类 1. 核心定义 二分类任务是监督学习中最基础的问题类型,其目标是将样本划分为两个互斥类别。设样本特征空间为 X ⊆ R n \mathcal{X} \subseteq \mathbb{R}^n X⊆Rn,输出空间为 Y { 0 , 1 } \mathcal{Y} \{0,1\} Y{0,1},学习目标为…...

视频自动化分割方案:支持按时间与段数拆分
在日常视频处理任务中,如何快速将一个较长的视频文件按照指定规则拆分为多个片段,是许多用户都会遇到的问题。尤其对于需要批量处理视频的开发者、自媒体运营者或内容创作者来说,手动剪辑不仅效率低下,还容易出错。这是一款绿色免…...
Open SSL 3.0相关知识以及源码流程分析
Open SSL 3.0相关知识以及源码流程分析 编译 windows环境编译1、工具安装 安装安装perl脚本解释器、安装nasm汇编器(添加到环境变量)、Visual Studio编译工具 安装dmake ppm install dmake # 需要过墙2、开始编译 # 1、找到Visual Studio命令行编译工具目录 或者菜单栏直接…...