am5728通过DM框架配置GPIO管脚
以配置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管脚相关推荐
- STM32F103C8T6配置PB3管脚为普通GPIO的方法
最近在做课程设计,使用的GPIO口比较多,由于管脚不足,以至于不得不使用PB3.PB4管脚,但发现普通的配置GPIO的方式不能正常的使用,从在不知情的情况下调试了大半天,板子上的一般的GPIO口都能够 ...
- STM32学习 3:GPIO管脚配置与第一个STM32实验:LED灯闪烁
STM32学习 3:GPIO管脚配置与第一个STM32实验:LED灯闪烁 1,GPIO管脚简介与配置 1.1GPIO框图 1.2GPIO不同模式 1.3 GPIO寄存器 1.4 GPIO库函数配置 2 ...
- STM32 - CubeMX 的使用实例详细(01)- STM32F103的配置 - GPIO设定
前言,项目需要STMF103的片子做PWM的控制,感觉ST的新版的IDE的配置功能很强大,想用用看. 项目采用的是STM32F103C8T6 1 端口的配置 1.1 MCU选型 MCU框图可以查阅: ...
- 物联网BLE裸机程序开发 -- (1)nRF52840配置GPIO输出驱动LED
nRF52840配置GPIO输出驱动LED 在大部分的开发板例程里面,都以点亮一个LED作为开发板软件开发例程的起始例程."点亮一个LED"."LED流水灯"似 ...
- HAL库配置GPIO
HAL库配置GPIO HAL库与标准库不同的特点: 使用`CubeMX`配置GPIO底层参数: 总结HAL库中GPIO的相关功能: GPIO的寄存器: 总结 HAL库与标准库不同的特点: 标准库中初始 ...
- springboot原生mysql写法_【Rainbond最佳实践】Spring Boot框架配置MySQL
Rainbond开源软件介绍: Rainbond是国内首个开源的生产级无服务器PaaS. 深度整合基于Kubernetes的容器管理.多类型CI/CD应用构建与交付.多数据中心的资源管理等技术,提供云 ...
- python sanic部署_Sanic框架配置操作分析
本文实例讲述了Sanic框架配置操作.分享给大家供大家参考,具体如下: 简介 Sanic是一个类似Flask的Python 3.5+ Web服务器,它的写入速度非常快.除了Flask之外,Sanic还 ...
- Struts2笔记——初次框架配置
1.Struts2简介 Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与S ...
- SSH框架配置及Maven使用
1.SSH框架配置 1.1. SSH框架介绍 1.2. SSH框架配置 所需资源下载: l jdk; 从Oracle官方网站:http://www.oracle.com/technetwork/cn/ ...
最新文章
- Python培训之就业面试题分享
- java生成缩略图类源码
- 下面我将随机抽取一名幸运女生,XXXXX
- HTTP相关知识 - 1
- oracle mysql 创建表,Oracle 创建表用户、空间
- Gartner:全行业投入人工智能,计算机视觉占比最高
- html5 getchildren,jquery children() find()用法
- 计算机进程调度论文,计算机操作系统小论文Linux进程调度.doc
- android常犯错误记录(一)
- python处理一些乱码的中文文本时decode('utf-8')报错的处理
- 有人问李嘉诚的儿子李泽楷:“你父亲都教了你哪些成功赚钱的秘诀?”
- java多线程-线程安全
- c语言输出最大的数ns流程图_ns图(c语言ns流程图怎么画)
- warning: setUpNet DNN module was not built with CUDA backend; switching to CPU错误解决
- Kerberos原理
- 已知起始点坐标、目的地方位角,计算沿着测地线飞行一定距离到达的目的地坐标
- h5海报页面定位中的元素居中
- 等待事件统计视图 | 全方位认识 sys 系统库
- aria2c rpc php,Debian 如何搭建使用 aria2c 作为下载工具
- 前端数据处理——行政区域编码
热门文章
- 产品设计需求分析研究
- 一点资讯app signature
- 计算机毕业设计 SSM同学录管理系统 同学聚会报名系统 在线聚会报名系统Java Vue MySQL数据库 远程调试 代码讲解
- 【Chrome Extensions】实现一个可以下载图片的Chrome插件
- python getopt使用_Python命令行参数解析模块getopt使用实例
- python深度学习include框架_搞事情。《用Python实现深度学习框架》已出版上架。...
- Java如何进行文件上传与下载
- 由浅入深玩转华为WLAN—25 高可用性系列(1)双击热备概述
- 每日一录20220816—01
- 今日心得:七条人生箴言