接上四篇:
【米尔-TIAM62开发板-接替335x-试用评测】+(一)手把手配置Yocto
【米尔-TIAM62开发板-接替335x-试用评测】+(二)配置U-Boot步骤实战
【米尔-TIAM62开发板-接替335x-试用评测】+(三)手把手创建Uboot设备树与内核设备树实战
【米尔-TIAM62开发板-接替335x-试用评测】+(四)手把手根据硬件配置 CPU 功能管脚
感谢电子发烧友william hill官网 提供的试用平台,感谢深圳市米尔科技有限公司提供的试用机会,感谢深圳市米尔科技有限公司茜茜的周日及时回复和帮助!感谢深圳市米尔科技有限公司提供的技术支持与帮助!
谢谢!
嗨,亲爱的工程师、学生和爱好者们,我来啦!今天我们来实战在U-Boot中玩转GPIO管脚。首先,我们要明白,GPIO(General-Purpose Input/Output)管脚就像是我们微控制器上的小灯泡,可以通过编程来控制它的亮与灭,从而实现各种有趣的功能。
在U-Boot的世界里,GPIO管脚仿佛是魔法棒,能让你在硬件和软件之间进行奇妙的互动。这次的学习之旅,希望让一位对U-Boot一无所知的爱好者,到能够熟练地使用GPIO管脚的嵌入式工程师,就仿佛经历了一场“科技魔法秀”。
在U-Boot中,你可以使用GPIO(General Purpose Input/Output)管脚来控制硬件设备或读取硬件状态。这是一个非常常见的任务,通常涉及到直接在U-Boot的源代码中编程。以下是如何在U-Boot中使用GPIO管脚的步骤:
include/linux/gpio.h
文件中。gpio_request()
函数来请求一个GPIO管脚。然后,使用gpio_direction_output()
或gpio_direction_input()
来设置管脚的方向(输入或输出)。gpio_set_value()
来设置GPIO的值。如果管脚设置为输出模式,这个函数会设置管脚为高电平或低电平。如果管脚设置为输入模式,这个函数会读取管脚的当前状态。gpio_free()
来释放它。例如,要设置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
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
如果你是一个喜欢深入代码的朋友,那么在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)
然后,我们可以在代码中创建一个函数来控制这个管脚:
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。
}
以上就是在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日
更多回帖