3.14内核下GPIO使能(同时支持uboot阶段的配置)

uboot gpio / 调用gpio_request_by_name_nodev来获取node节点中的"lgpio"属性,并转化为gpio_desc描述符,标志为输出。dm_gpio_get_value //获取gpio_desc描述的GPIO的值。dm_gpio_request //申请gpio_desc描述的GPIO。dm_gpio_is_valid //判断该gpio_desc是否可用。---------------操作gpio--------------- 阅读详情

整体简介

如何在uboot下实现GPIO配置,并在最终Linux启动完成之后的阶段生效   
本文编写耗费1小时,阅读本文需要25分钟时间。

环境准备

Linux kernelversion :3.14.43
board: TL-am4379-gp-evm
boot: origin-2017.4._tlv1.4

需求描述

由于为产品新增了充电检测功能,那么经过简单的整理,需要对以下几个GPIO引脚进行配置。
在uboot的启动过程中,我们会在充电的情况下启动boot并显示一张图片在LCD上。主要逻辑如下:

    if(power==in)
    {
        boot_start();
        GPIO_INIT();
        {
            set GPIO0_12 input
            set GPIO0_13 input
            set GPIO0_14 output
            set GPIO0_15 output
        }
        
            if(GPIO0_12==ON)
            {
                goto Init_completed.
                    set GPIO0_14 HIGH
                    show_img( Charging completion );
                    while(button==IN && timer > 3min)
                    {
                        boot_kernel;
                    }
            }
            
            if(GPIO0_13==ON)
            {
                goto Init_completed.
                    set GPIO0_15 HIGH
                    show_img( Charging );
                    while(button==IN && timer > 3min)
                    {
                        boot_kernel;
                    }
            }
    }
序号 原引脚 新引脚 备注 boot kernel app
1 无 GPIO0_12 CHG_END_STAT充电完成检测管脚 √ — √
2 无 GPIO0_13 CHG_ING_STAT正在充电检测管脚 √ — √
3 无 GPIO0_14 CHG_END_LED充电完成指示灯 √ — √
4 无 GPIO0_15 CHG_ING_LED正在充电指示灯 √ — √

结构分析

U-Boot的GPIO系统设计简洁而高效,它采用三层架构来实现功能:

  1. 顶层接口层:这一层面向用户提供了一套通用的接口定义,但并不涉及具体的实现细节。实现工作需要根据具体的芯片型号来定制开发。

  2. 中间接口实现层:在这一层,我们利用特定硬件板的GPIO特性来具体实现顶层定义的接口。

  3. 底层芯片GPIO实现层:这是最接近硬件的一层,直接负责实现与具体芯片GPIO相关的操作。

在实际工程应用中,我们通常需要直接操作硬件寄存器,并根据需要查找相应的寄存器地址。这样的设计既保证了系统的灵活性,又能满足不同硬件平台的需求。

uboot源码编译

1.1 安装 U-Boot 源代码
1.2 清理 U-Boot
  进入 U-Boot 的安装目录"media/tl437x/u-boot"。执行以下命令:
   cd /media/tl437x/u-boot/
   make CROSS_COMPILE=arm-linux-gnueabihf- distclean

1.3 配置 U-Boot
执行以下命令进行 U-Boot 配置:
   make CROSS_COMPILE=arm-linux-gnueabihf- am43xx_evm_config

1.4 编译 U-Boot
执行以下命令进行 U-Boot 编译:
   make CROSS_COMPILE=arm-linux-gnueabihf- -j4

1.5 烧写 U-Boot
由于uboot在nand上启动,那么需要我们启动filesystem之后,运行flashboot脚本
之后是拷贝MLO文件和uboot.img文件到烧写的缓存目录下,笔者这里将个人所使用的目录原样给出,在实践时应当注意改成自己的路径。

cp mlo /run/media/mmcblk0p1/
cp u-boot.img /run/media/mmcblk0p1/

接下来通过 dd指令 和 flash_eraseall指令 对MLO和uboot.img进行烧写

flash_eraseall /dev/mtd0
flash_eraseall /dev/mtd1
flash_eraseall /dev/mtd2
flash_eraseall /dev/mtd3
dd if=/run/media/mmcblk0p1/MLO of=/dev/mtdblock0
dd if=/run/media/mmcblk0p1/MLO of=/dev/mtdblock1
dd if=/run/media/mmcblk0p1/MLO of=/dev/mtdblock2
dd if=/run/media/mmcblk0p1/MLO of=/dev/mtdblock3

flash_eraseall /dev/mtd5
dd if=/run/media/mmcblk0p1/u-boot.img of=/dev/mtdblock5

uboot源码分析

uboot的第一阶段做了哪些工作
在U-Boot的第一阶段,初始化过程涵盖了多个关键步骤,为系统的后续启动奠定了基础。首先,构建异常向量表是确保系统能够正确响应中断和异常的基础。接着,将CPU设置为SVC模式,为操作系统的运行提供了必要的执行环境。此外,关闭看门狗计时器是为了防止在启动过程中不必要的系统重置。开发板供电置锁确保了电源的稳定供应,为系统的持续运行提供了保障。时钟初始化为系统提供了精确的时间基准,而DDR初始化则为内存管理提供了必要的硬件支持。

串口初始化并打印"OK"是验证系统基本功能正常运行的一个简单测试。随后,重定位操作确保了代码和数据在正确的内存地址中执行和存储。建立映射表并开启MMU(内存管理单元)为更复杂的内存管理和虚拟内存提供了支持。最终,通过跳转到第二阶段的入口点,即ldr pc, =main指令,完成了第一阶段的初始化工作,为系统引导的下一阶段做好了准备。在lowlevel_init.S中,除了上述步骤,还额外执行了检查复位状态、IO恢复、开发板供电锁存、tzpc初始化,并在完成这些步骤后分别打印了’O’和’K’,作为系统初始化进度的指示。这些步骤共同确保了系统在启动过程中的稳定性和可靠性。

对于Uboot中具体的改动需求,我们可以将IO的业务逻辑部分写在boot的第二阶段,对应的是board.c这个文件,这样的做法是比较符合规范,也更好移植。
其中,start_armboot() 函数的作用是:第二阶段主要初始化剩下的硬件,主要是外部硬件如iNand和网卡,以及uboot中CLI的支持等。

进一步地,我们的目标应该是start_armboot下的 device_init() 函数中,这里的设备指的就是板上的硬件设备。

在/u-boot/arch/arm/include/asm/arch-am33xx/gpio.h中,有

#define AM33XX_GPIO0_BASE       0x44E07000
#define AM33XX_GPIO1_BASE       0x4804C000
#define AM33XX_GPIO2_BASE       0x481AC000
#define AM33XX_GPIO3_BASE       0x481AE000
#define AM33XX_GPIO4_BASE	    0x48320000
#define AM33XX_GPIO5_BASE	    0x48322000

根据 AM437x_Technical Reference Manual.pdf (TL开发板的参考手册)
GPIO5 0x4832_2000 ~ 0x4832_2FFF size:4KB Description:GPIO5_Registers
在这里插入图片描述

A38h CTRL_CONF_GPIO5_8 Section 7.3.1.194
A3Ch CTRL_CONF_GPIO5_9 Section 7.3.1.195
A40h CTRL_CONF_GPIO5_10 Section 7.3.1.196
A44h CTRL_CONF_GPIO5_11 Section 7.3.1.197
A48h CTRL_CONF_GPIO5_12 Section 7.3.1.198
A4Ch CTRL_CONF_GPIO5_13 Section 7.3.1.199

在跳转宏AM33XX_GPIO5_BASE定义处的时候,我们找到了am437x平台的源码。
如下这段代码存放在src/board/ti/am43xx/board.c下
我们将参考这部分代码进行对GPIO的设置

static void enable_vtt_regulator(void)
{
   
   
	u32 temp;

	/* enable module */
	//#define writel(v,addr)			__readwrite_bug("writel")
	writel(GPIO_CTRL_ENABLEMODULE, AM33XX_GPIO5_BASE + OMAP_GPIO_CTRL);

	/* enable
Tina Linux:uboot里读取gpio的状态并传递字符串到kernel Tina Linux uboot kernel cmdline 阅读详情

相关推荐

嵌入式开发实战:NFS根文件系统挂载与内核驱动调试

本文详细介绍了嵌入式开发中NFS根文件系统挂载与内核驱动调试的实战经验。从硬件驱动加载、内核配置到U-Boot参数设置,提供了全面的解决方案和优化技巧,帮助开发者高效解决常见的网络文件系统挂载问题。

weixin_33711647的博客 469

瑞芯微RK3576 Android14 SD卡启动全记录:从设备树修改到SD卡制作工具V1.78实操

本文详细记录了瑞芯微RK3576开发板实现Android14 SD卡启动的全过程,包括设备树修改、烧录工具V1.78的使用技巧及常见问题排查。通过实战经验分享,帮助开发者快速掌握从配置调整到SD卡制作的完整流程,特别适合需要SD启动方案的产线烧录场景。

weixin_27066963的博客 450

RK3568多屏配置避坑指南:解决uboot启动失败、引脚冲突和mipi_dphy0禁用问题

本文深入解析RK3568多屏配置中的常见问题,包括uboot启动失败、GPIO引脚冲突和mipi_dphy0禁用等关键问题。通过详细的DTS配置示例和调试技巧,帮助开发者优化多屏显示系统,提升硬件兼容性和稳定性。

weixin_30533109的博客 281

RK3568平台入门到精通系列讲解之UBOOT开发篇(GPIO操作)

RK3568平台入门到精通系列讲解之UBOOT开发篇(GPIO操作)

5883

RK356x 在uboot下设置GPIO引脚默认电平

首先打开RK356X的SDK软件包,查看一下uboot源码,这次我先在u-boot/common/board_f.c和board_r.c文件上添加GPIO口设置,虽然添加了gpio_direction_output()或者gpio_set_value()类似的GPIO设置的函数,但是用万用表测量了一下,怎么都不起效果。例如你需要先在系统上设置你刚才的设置参数是否生效,输入指令,用万用表测量,等测量无误后再到uboot上进行修改,这样效率大大增大。

qq_45147279的博客 5112

【树莓派4b的uboot编译移植】

同时,由于u-boot中没有预置rpi4的dts文件(device tree source),因此采用了在u-boot运行时动态传入硬件描述dtb(device tree blob)文件的方式,用于u-boot启动时枚举硬件。由于u-boot中没有预置rpi4的dts文件(device tree source),因此采用了在u-boot运行时动态传入硬件描述dtb(device tree blob)文件的方式,用于u-boot启动时枚举硬件。因此,Linux内核可以在不需要U-Boot的情况下启动。

菜鸟先飞的博客 5243

基于PINN的一个简单的求解偏微分方程实例

本人是做化工模拟的一名学生,最近在学习PINN(Physics-Informed Neural Networks,物理信息神经网络)对管道动力学进行建模研究,PINN由于其对机理与数据的良好兼顾性非常热门,本文是作者对PINN入门研究过程的一个练手小题目,main code也是作者代码是基于pytorch2.6.0写的,发上来供各位参考,欢迎研究管道动力学和PINN的小伙伴一起讨论~

weixin_64491760的博客 1739

【GNSS/Linux】BKG Ntrip Client (BNC) 的编译与安装

【GNSS/Linux】BKG Ntrip Client (BNC) 的编译与安装 1. BNC软件 1.1 软件介绍 The BKG Ntrip Client (BNC) is an Open Source multi-stream client program designed for a variety of real-time GNSS applications. It was primarily designed for receiving data streams from any Ntrip

小马甲的新马甲 7801

告别Keil,在Windows上用VSCode + arm-none-eabi-gcc + Makefile搭建国产MCU开发环境(附JLink配置避坑)

本文详细介绍了如何在Windows上使用VSCode、arm-none-eabi-gcc和Makefile搭建国产MCU开发环境,替代传统的Keil和IAR。内容涵盖工具链配置、工程结构设计、Makefile编写、VSCode集成调试以及高效开发工作流,特别针对国产MCU如复旦微FM33系列提供了优化方案和避坑指南。

weixin_28729205的博客 431

Keil5保姆级安装指南:从破解到STM32开发环境配置(附常见错误解决方案)

本文提供Keil5从安装到STM32开发环境配置的完整指南,包含破解步骤、常见错误解决方案及多芯片支持配置。详细讲解环境预检、核心安装、许可证管理及高效开发环境设置,帮助开发者快速搭建嵌入式开发平台。特别针对安装和卸载过程中的关键问题提供专业解决方案。

weixin_30369041的博客 124

如何设置反馈点

前面的POWER DC仿真都是忽略反馈线进行的仿真,如果单板压降不过,电源会自动调整输出电压,来满足负载的得到额定的电压.可以看到因为设置了反馈点,源端电压就被抬高到满足压降的值了。仿真上也可以自己添加反馈点,以得到抬高后的电源输出电压值。同样以下图的CPU的Core电源为例。按照流程正常设置好参数。

weixin_54787054的博客 1145

MoCap 动作捕捉开源库教程

数据通过 tf2 和支持不同 QoS 设置的 /poses 主题直接发布。该软件包最初是为 Crazyswarm 开发的,用于跟踪多达 50 个飞行机器人。

机器人控制与仿真应用 1307

uniapp [全端兼容] - 实现大文件上传分片/切片+本地选择文件上传超大文件,大文件切片上传+断点续传+上传进度条+失败自动重传,支持单个/批量上传图片、视频、文档各种文件(App、小程序、H5

uniapp 分片 断点续传 大文件上传。uniapp大文件切片上传,uniapp实现大文件上传 分片上传 进度条,分片上传附件,实现大文件上传,实现分片大文件上传,Uniapp实现大文件上传 分片上传 进度条,uniapp文件分片上传,uniapp如何上传很大的文件,在选择文件后,按指定大小将文件切割成独立的文件片,并逐片上传,uniapp 微信小程序上传大文件如何切片,uniapp APP实现大文件分片上传、断点续传、秒传,解决大文件上传问题,大文件上传如何做断点续传,uniapp上传视频,Uniapp

🏆 前端领域优质创作者 1万+

硬核干货|C#+EtherCAT协议:高精度多轴伺服运动控制通信实战

本文摘要: 文章聚焦工业自动化领域多轴伺服运动控制的高精度与实时性需求,基于C#与EtherCAT协议实现完整解决方案。EtherCAT凭借微秒级同步、分布式架构等优势成为首选,而C#通过优化GC策略和实时线程可满足工业控制要求。文章从工程落地角度,详细拆解EtherCAT的PDO/SDO通信机制与多轴同步控制逻辑,提供完整的C#代码实现(主站初始化、伺服配置、运动控制等),所有代码均通过汇川/松下伺服实测验证。核心亮点包括:纯C#原生开发、工业现场高频问题解决方案、硬件适配指南,帮助开发者快速掌握高精度多

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 575

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 架构师Keywords(适用于软考)
下一篇: Unity让摄像机跟随物体的方法(不借助父子关系)
睡不醒的小泽
博客等级 码龄11年 1426粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值