以配置gpio3_31为例:
查看芯片手册:

这里gpio3_31为复用管脚,首先要配置寄存器将此管脚设置为gpio功能。
vim board/ti/am57xx/mux_data.h 所有多路复寄存器信息都在此定义:

const struct pad_conf_entry core_padconf_array_essential_x15[] = {{GPMC_AD0, (M2 | PIN_INPUT | MANUAL_MODE)},   /*gpmc_ad0.vin3a_d0 */{GPMC_AD1, (M2 | PIN_INPUT | MANUAL_MODE)},    /* gpmc_ad1.vin3a_d1 */{GPMC_AD2, (M2 | PIN_INPUT | MANUAL_MODE)},     /* gpmc_ad2.vin3a_d2 */{GPMC_AD3, (M2 | PIN_INPUT | MANUAL_MODE)},     /* gpmc_ad3.vin3a_d3 */{GPMC_AD4, (M2 | PIN_INPUT | MANUAL_MODE)},     /* gpmc_ad4.vin3a_d4 */...{VIN2A_FLD0, (M14 | PIN_INPUT_PULLUP)}, /* vin2a_fld0.gpio3_30 */{VIN2A_HSYNC0, (M14 | PIN_INPUT_PULLUP)},       /* vin2a_hsync0.gpio    3_31 */{VIN2A_VSYNC0, (M14 | PIN_INPUT)},      /* vin2a_vsync0.gpio4_0 */{VIN2A_D0, (M11 | PIN_INPUT)},  /* vin2a_d0.pr1_uart0_rxd */{VIN2A_D1, (M11 | PIN_OUTPUT)}, /* vin2a_d1.pr1_uart0_txd */...

接下来看看uboot代码中如何设置多路复用的:
vim board/ti/am57xx/board.c

512  *ctrl = &dra7xx_ctrl;
660   pconf = core_padconf_array_essential_x15;
661   pconf_sz =ARRAY_SIZE(core_padconf_array_essential_x15);
678    /* Do the muxing here */
679   do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);

照猫画虎,自己的代码这样写:
1.定义结构体:

const struct pad_conf_entry my_gpio3_31[] = {{VIN2A_HSYNC0, (M14 | PIN_OUTPUT_PULLDOWN)},};

2.设置参数:

struct omap_sys_ctrl_regs const **ctrl = NULL;
*ctrl = &dra7xx_ctrl;
const struct pad_conf_entry *pconf = my_gpio3_31;
nt pconf_sz = ARRAY_SIZE(my_gpio3_31);

3.调用do_set_mux32()函数设置多路复用

do_set_mux32((*ctrl)>control_padconf_core_base,pconf,pconf_sz);

这下用多路复用就设置好了。
配置好多路复用后,就可以调用gpio接口函数设置管脚的高低了。
虽然像gpio_request,gpio_direction_output 这样的老接口还可以用,这里用新的DM框架来配置GPIO口。

1)在设备树文件下添加节点
vim .config, 找到CONFIG_DEFAULT_DEVICE_TREE=”am57xx-beagle-x15”,说am5728用到的设备树文件为am57xx-beagle-x15.dts,在设备树文件下添加如下节点:

 88 /* my code start*/89         set_gpio {90             compatible = "set_gpio,test";91             gpios = <&gpio3 31 GPIO_ACTIVE_HIGH>;92         };93 /*my code end*/

2.通过fdt_node_offset_by_compatible函数找到该节点

struct gpio_desc gpio3_31_desc;
int node;
node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, "set_gpio,test");

该函数通过”set_gpio,test”与设备树的compatible字段进行匹配,如果找到则返回相应的节点。
3.申请GPIO资源

int res = gpio_request_by_name_nodev(gd->fdt_blob, node, "gpios", 0, &gpio3_31_desc, GPIOD_IS_OUT)

该函数通过node节点和gpios字段最终找到gpio3_31,并将这些信息保存到gpio3_31_desc结构体中。
4.设置gpio引脚

dm_gpio_set_value(&gpio3_31_desc, 0)

将此gpio管脚配置为高或低。

至此gpio3_31的配置完成。

可以在uboot中添加命令,通过参数配置任意一个gpio引脚,这里只将配置此引脚的命令添加到uboot中:
在cmd文件下创建setgpio.c文件:

static int do_setgpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]){const struct pad_conf_entry my_gpio3_31[] = {{VIN2A_HSYNC0, (M14 | PIN_OUTPUT_PULLDOWN)},};struct omap_sys_ctrl_regs const **ctrl = NULL;*ctrl = &dra7xx_ctrl;const struct pad_conf_entry *pconf = my_gpio3_31;int pconf_sz = ARRAY_SIZE(my_gpio3_31);do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);/*老版本GPIO接口*/
/*    if(gpio_request(95, "gpio3_31")){printf("request resource error!\n");return 0;}if(!strcmp(argv[1], "down")){gpio_direction_output(95, 0);    }else{gpio_direction_output(95, 1);    }gpio_free(95);*//*新版本GPIO接口*/struct gpio_desc gpio3_31_desc;int node;struct udevice *dev = NULL;node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, "set_gpio,test");if(node < 0){printf("#################\n");printf("node cannot find\n");printf("##################\n");return -1;}int res = gpio_request_by_name_nodev(gd->fdt_blob, node, "gpios", 0, &gpio3_31_desc, GPIOD_IS_OUT);if(res){printf("##################\n");printf("request GPIO resource failure!\n");printf("##################\n");return -1;}dm_gpio_set_value(&gpio3_31_desc, (*argv[1] - '0'));dm_gpio_free(dev, &gpio3_31_desc);return 0;
}
U_BOOT_CMD(setgpio, 2, 0, do_setgpio, "set gpio3_31 pin", "setgpio 0 - set the pins to low\n" "setgpio 1 - set the pins to high\n");

在Makefile中添加:obj-y += setgpio.o
编译uboot便会有setgpio命令:
setgpio 0:将gpio3_31配置为低电平。
setgpio 1:将gpio3_31配置为高电平。

附录:DM框架下的GPIO接口

int gpio_request_by_name(struct udevice *dev, const char *list_name, int index, struct gpio_desc *desc, int flags)
通过对应的udevice找到其dtsi节点中属性名为list_name的GPIO属性并转化为gpio_desc,并且request。

int gpio_request_by_name_nodev(const void *blob, int node, const char *list_name, int index, struct gpio_desc *desc, int flags)
通过对应的dtsi节点中属性名为list_name的GPIO属性并转化为gpio_desc,并且request。

int dm_gpio_request(struct gpio_desc *desc, const char *label)
申请gpio_desc描述的GPIO

int dm_gpio_get_value(const struct gpio_desc *desc)
获取gpio_desc描述的GPIO的值

int dm_gpio_set_value(const struct gpio_desc *desc, int value)
设置gpio_desc描述的GPIO的值

int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags)
设置gpio_desc描述的GPIO的输入输出方向,带标志

int dm_gpio_set_dir(struct gpio_desc *desc)
设置gpio_desc描述的GPIO的输入输出方向

static inline bool dm_gpio_is_valid(const struct gpio_desc *desc)
判断gpio_desc是否可用

am5728通过DM框架配置GPIO管脚相关推荐

  1. STM32F103C8T6配置PB3管脚为普通GPIO的方法

    最近在做课程设计,使用的GPIO口比较多,由于管脚不足,以至于不得不使用PB3.PB4管脚,但发现普通的配置GPIO的方式不能正常的使用,从在不知情的情况下调试了大半天,板子上的一般的GPIO口都能够 ...

  2. STM32学习 3:GPIO管脚配置与第一个STM32实验:LED灯闪烁

    STM32学习 3:GPIO管脚配置与第一个STM32实验:LED灯闪烁 1,GPIO管脚简介与配置 1.1GPIO框图 1.2GPIO不同模式 1.3 GPIO寄存器 1.4 GPIO库函数配置 2 ...

  3. STM32 - CubeMX 的使用实例详细(01)- STM32F103的配置 - GPIO设定

    前言,项目需要STMF103的片子做PWM的控制,感觉ST的新版的IDE的配置功能很强大,想用用看. 项目采用的是STM32F103C8T6 1 端口的配置 1.1 MCU选型 MCU框图可以查阅: ...

  4. 物联网BLE裸机程序开发 -- (1)nRF52840配置GPIO输出驱动LED

    nRF52840配置GPIO输出驱动LED 在大部分的开发板例程里面,都以点亮一个LED作为开发板软件开发例程的起始例程."点亮一个LED"."LED流水灯"似 ...

  5. HAL库配置GPIO

    HAL库配置GPIO HAL库与标准库不同的特点: 使用`CubeMX`配置GPIO底层参数: 总结HAL库中GPIO的相关功能: GPIO的寄存器: 总结 HAL库与标准库不同的特点: 标准库中初始 ...

  6. springboot原生mysql写法_【Rainbond最佳实践】Spring Boot框架配置MySQL

    Rainbond开源软件介绍: Rainbond是国内首个开源的生产级无服务器PaaS. 深度整合基于Kubernetes的容器管理.多类型CI/CD应用构建与交付.多数据中心的资源管理等技术,提供云 ...

  7. python sanic部署_Sanic框架配置操作分析

    本文实例讲述了Sanic框架配置操作.分享给大家供大家参考,具体如下: 简介 Sanic是一个类似Flask的Python 3.5+ Web服务器,它的写入速度非常快.除了Flask之外,Sanic还 ...

  8. Struts2笔记——初次框架配置

    1.Struts2简介   Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与S ...

  9. SSH框架配置及Maven使用

    1.SSH框架配置 1.1. SSH框架介绍 1.2. SSH框架配置 所需资源下载: l jdk; 从Oracle官方网站:http://www.oracle.com/technetwork/cn/ ...

最新文章

  1. Python培训之就业面试题分享
  2. java生成缩略图类源码
  3. 下面我将随机抽取一名幸运女生,XXXXX
  4. HTTP相关知识 - 1
  5. oracle mysql 创建表,Oracle 创建表用户、空间
  6. Gartner:全行业投入人工智能,计算机视觉占比最高
  7. html5 getchildren,jquery children() find()用法
  8. 计算机进程调度论文,计算机操作系统小论文Linux进程调度.doc
  9. android常犯错误记录(一)
  10. python处理一些乱码的中文文本时decode('utf-8')报错的处理
  11. 有人问李嘉诚的儿子李泽楷:“你父亲都教了你哪些成功赚钱的秘诀?”
  12. java多线程-线程安全
  13. c语言输出最大的数ns流程图_ns图(c语言ns流程图怎么画)
  14. warning: setUpNet DNN module was not built with CUDA backend; switching to CPU错误解决
  15. Kerberos原理
  16. 已知起始点坐标、目的地方位角,计算沿着测地线飞行一定距离到达的目的地坐标
  17. h5海报页面定位中的元素居中
  18. 等待事件统计视图 | 全方位认识 sys 系统库
  19. aria2c rpc php,Debian 如何搭建使用 aria2c 作为下载工具
  20. 前端数据处理——行政区域编码

热门文章

  1. 产品设计需求分析研究
  2. 一点资讯app signature
  3. 计算机毕业设计 SSM同学录管理系统 同学聚会报名系统 在线聚会报名系统Java Vue MySQL数据库 远程调试 代码讲解
  4. 【Chrome Extensions】实现一个可以下载图片的Chrome插件
  5. python getopt使用_Python命令行参数解析模块getopt使用实例
  6. python深度学习include框架_搞事情。《用Python实现深度学习框架》已出版上架。...
  7. Java如何进行文件上传与下载
  8. 由浅入深玩转华为WLAN—25 高可用性系列(1)双击热备概述
  9. 每日一录20220816—01
  10. 今日心得:七条人生箴言