米尔电子
直播中

jf_39110170

1年用户 343经验值
擅长:可编程逻辑 嵌入式技术 EDA/IC设计
私信 关注
[技术]

【米尔-TIAM62开发板-接替335x-试用评测】+(五)手把手玩转U-Boot控制CPU管脚

接上四篇:

【米尔-TIAM62开发板-接替335x-试用评测】+(一)手把手配置Yocto

【米尔-TIAM62开发板-接替335x-试用评测】+(二)配置U-Boot步骤实战

【米尔-TIAM62开发板-接替335x-试用评测】+(三)手把手创建Uboot设备树与内核设备树实战

【米尔-TIAM62开发板-接替335x-试用评测】+(四)手把手根据硬件配置 CPU 功能管脚
image.png

感谢电子发烧友william hill官网 提供的试用平台,感谢深圳市米尔科技有限公司提供的试用机会,感谢深圳市米尔科技有限公司茜茜的周日及时回复和帮助!感谢深圳市米尔科技有限公司提供的技术支持与帮助!

谢谢!
image.png

嗨,亲爱的工程师、学生和爱好者们,我来啦!今天我们来实战在U-Boot中玩转GPIO管脚。首先,我们要明白,GPIO(General-Purpose Input/Output)管脚就像是我们微控制器上的小灯泡,可以通过编程来控制它的亮与灭,从而实现各种有趣的功能。
image.png

在U-Boot的世界里,GPIO管脚仿佛是魔法棒,能让你在硬件和软件之间进行奇妙的互动。这次的学习之旅,希望让一位对U-Boot一无所知的爱好者,到能够熟练地使用GPIO管脚的嵌入式工程师,就仿佛经历了一场“科技魔法秀”。
image.png

在U-Boot中,你可以使用GPIO(General Purpose Input/Output)管脚来控制硬件设备或读取硬件状态。这是一个非常常见的任务,通常涉及到直接在U-Boot的源代码中编程。以下是如何在U-Boot中使用GPIO管脚的步骤:
image.png

  1. 获取GPIO驱动:首先,确保你的U-Boot源代码中包含了GPIO驱动。这通常在include/linux/gpio.h文件中。
  2. 配置GPIO:使用gpio_request()函数来请求一个GPIO管脚。然后,使用gpio_direction_output()gpio_direction_input()来设置管脚的方向(输入或输出)。image.png
  3. 设置/清除GPIO值:使用gpio_set_value()来设置GPIO的值。如果管脚设置为输出模式,这个函数会设置管脚为高电平或低电平。如果管脚设置为输入模式,这个函数会读取管脚的当前状态。
  4. 释放GPIO:使用完GPIO后,使用gpio_free()来释放它。
    image.png

例如,要设置GPIO0_31为高电平并读取其值,你可以这样做:

#include <linux/gpio.h>

int main(void)
{
    int err;
    int gpio = GPIO_TO_PIN(0, 31); // 根据你的硬件配置,这可能是GPIO0_31

    err = gpio_request(gpio, "test_gpio");
    if (err < 0) {
        printf("Error requesting GPIO %d\n", gpio);
        return -1;
    }

    err = gpio_direction_output(gpio, 1); // 设置输出为高电平
    if (err < 0) {
        printf("Error setting direction of GPIO %d\n", gpio);
        gpio_free(gpio);
        return -1;
    }

    printf("GPIO %d value: %d\n", gpio, gpio_get_value(gpio)); // 读取并打印GPIO的值

    gpio_free(gpio); // 释放GPIO
    return 0;
}

请注意,你需要查阅你的硬件平台的文档和U-Boot的文档,以确保正确使用GPIO。所以我接下来以米尔-TIAM62开发板为例,手把手实战U-Boot控制CPU管脚:

1.U-Boot终端命令玩转GPIO
image.png

U-Boot可不是吃素的,它可以直接用命令来控制GPIO的设置。想象一下,你坐在一个神奇的魔法终端前,只需输入几个命令,就能控制GPIO的开关。是不是很酷?在U-Boot中,我们就可以这样做!

比如,你想要控制GPIO0_31这个管脚,你可以输入以下命令:

u-boot=> gpio set 31
gpio: pin 31 (gpio 31) value is 1

这条命令就像是为管脚插上了电源,它的值变成了1。如果你想关闭这个管脚,可以输入:

u-boot=> gpio clear 31
gpio: pin 31 (gpio 31) value is 0

这时候,你可以用万用表测量到J11上5脚的电压是高还是低哦!

2. U-Boot代码里玩转GPIO
image.png

如果你是一个喜欢深入代码的朋友,那么在U-Boot代码中直接控制GPIO会更吸引你。这里有一个关于phy(物理层)电源复位控制的例子:

myir-ti-uboot/board/myir/myc_am62x/som.c文件中,你可以加入一些关于lvds(低电压差分信号)电源控制的代码。首先,我们需要定义一个宏来帮助我们找到对应的GPIO管脚:

#define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))
#define DUAL_LVDS_POWER GPIO_TO_PIN(0,4)

image.png

然后,我们可以在代码中创建一个函数来控制这个管脚:

static void gpio_rst_and_power(void) {
    int ret;
    int lvds_power;
    lvds_power = DUAL_LVDS_POWER;
    ret = gpio_request(lvds_power, "lvds_power");  // 向U-Boot申请这个GPIO管脚的使用权。
    if (ret < 0) {  // 如果申请失败...
        printf("Unable to get GPIO %d\n", lvds_power);  // 打印一个错误消息。
        return;  // 结束函数。
    }
    /* Configure as output */  // 将这个管脚设置为输出模式。
    gpio_direction_output(lvds_power, 0);  // 输出0的值。
    gpio_set_value(lvds_power, 1);  // 设置管脚值为1。
}

image.png

以上就是在U-Boot中玩转GPIO管脚的一些基本方法啦!希望你们能从中找到乐趣,创造出更多有趣的项目!但我的魔法之旅并没有止步于此。在深入学习后,我发现用户还可以在U-Boot代码中直接实现IO功能。例如,对于phy的电源复位控制,你可以直接在代码中设置。这简直太神奇了!就像是有一种直接与硬件对话的能力。在myir-ti-uboot/board/myir/myc_am62x/som.c文件中,加入一些代码,你就可以控制LVDS的电源了。这次的旅程让我深刻体会到了U-Boot的强大和魅力。从简单的命令行操作到复杂的代码控制,GPIO管脚仿佛成为了我与硬件设备之间的桥梁。这次的经历不仅让我收获了知识,更让我对科技有了更深的理解和敬畏。感谢深圳市米尔科技有限公司,让我体验了一次如此美妙的科技之旅!

本人在本william hill官网 内的试读[经验] :

《电子工程师必备——九大系统威廉希尔官方网站 识图宝典》+附录2化整为零和集零为整威廉希尔官方网站 分析方法

《运算放大器参数解析与LTspice应用仿真》+学习心得4第三章专用放大器

《Android Runtime源码解析》+深入体会第六章ART的执行(4)

希望上面的经验能对您有所帮助!

谢谢!

还没吃饭
2024年1月8日

更多回帖

发帖
×
20
完善资料,
赚取积分