【海思篇】【Hi3516DV300】十三、添加GPIO管理接口和手动实现一个GPIO调试工具

本文介绍了在海思Hi3516DV300芯片上添加GPIO管理接口的方法,包括GPIO工作方式、接口设计与实现,并展示了一个用于调试的GPIO工具,该工具支持读取和配置GPIO的方向与值。此外,还讨论了其他GPIO配置方式的优缺点。
摘要由CSDN通过智能技术生成

目的:应用层快捷、方便的配置gpio

1 gpio工作方式-通用输入输出

gpio获取步骤:
1 管脚复用
2 获取gpio方向和值
gpio配置步骤:
1 管脚复用
2 配置gpio方向
3 如果是输出方向,可以配置gpio值

2 接口设计

typedef struct _tagPINMUX_REG_S
{
   
    HI_U32 u32Reg;
    HI_U32 u32Val;
}PINMUX_REG_S;

HI_S32 HI_GPIOMNG_Init(PINMUX_REG_S *paPinmuxReg, HI_U8 u8PinmuxRegSize);
HI_S32 HI_GPIOMNG_Denit();
HI_S32 HI_GPIOMNG_SetDir(HI_U8 u8Gpio, HI_U8 u8Dir);
HI_S32 HI_GPIOMNG_GetDir(HI_U8 u8Gpio);
HI_S32 HI_GPIOMNG_SetVal(HI_U8 u8Gpio, HI_U8 u8Val);
HI_S32 HI_GPIOMNG_GetVal(HI_U8 u8Gpio);

HI_GPIOMNG_Init:管脚复用和gpio寄存器地址映射到应用层
HI_GPIOMNG_Denit:关闭gpio寄存器地址映
HI_GPIOMNG_SetDir:配置gpio方向(0输入,1输出)
HI_GPIOMNG_GetDir:获取gpio方向(0输入,1输出)
HI_GPIOMNG_SetVal:配置gpio值(0 低,1 高)
HI_GPIOMNG_GetVal:获取gpio值(0 低,1 高)
u8Gpio:海思gpio号计算公式:u8Gpio=GpioGroup*8+GpioBit

3 接口实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>

#include "hi_type.h"
#include "hi_gpiomng.h"

#define GPIO_BASE_ADDR                            (0x120D0000)
#define GPIO_GRP(group_id)                        (g_pGpioBaseAddr+0x1000*group_id)
#define GPIO_DATA(group_reg_base, gpio_offset)    (((group_reg_base) + 0x000) + (1 << ((gpio_offset) + 2)))
#define GPIO_DIR(group_reg_base)                  ((group_reg_base) + 0x400)
#define GPIO_IS(group_reg_base)                   ((group_reg_base) + 0x404)
#define GPIO_IBE(group_reg_base)                  ((group_reg_base) + 0x408)
#define GPIO_IEV(group_reg_base)                  ((group_reg_base) + 0x40C)
#define GPIO_IE(group_reg_base)                   ((group_reg_base) + 0x410)
#define GPIO_RIS(group_reg_base)                  ((group_reg_base) + 0x414)
#define GPIO_MIS(group_reg_base)                  ((group_reg_base) + 0x418)
#define GPIO_IC(group_reg_base)                   ((group_reg_base) + 0x41C)

#define PAGE_SIZE_MASK (~(0xfff))
#define PAGE_SIZE 0x1000
#define GPIO_MAP_MEM_SIZE 0xC000

static const char dev[]="/dev/mem";
static HI_VOID *g_pGpioBaseAddr = NULL;
static HI_BOOL g_bGpioInit = HI_FALSE;

HI_VOID * COMM_MMAP(HI_U32 u32RetAddr, HI_U32 u32MapMemSize)
{
   
	HI_S32 fd = open (dev, O_RDWR | O_SYNC);
	if (fd < 0)
	{
   
	    printf("open %s error!\n", dev);
	    return NULL;
	}
    
	/* addr align in page_size(4K) */
	unsigned long phy_addr_in_page;
	unsigned long page_diff;
	phy_addr_in_page = u32RetAddr & PAGE_SIZE_MASK;
	page_diff = u32RetAddr - phy_addr_in_page;

	/* size in page_size */
	unsigned long size_in_page;
	unsigned long size = u32MapMemSize;
	size_in_page =((size + page_diff - 1) & PAGE_SIZE_MASK) + PAGE_SIZE;

	void *addr = mmap((void *)0, size_in_page, PROT_READ|PROT_WRITE, MAP_SHARED, fd, phy_addr_in_page);
	if (addr == MAP_FAILED)
	{
   
	    printf("mmap @ 0x%x error!\n", phy_addr_in_page);
	    close(fd);
	    return NULL;
	}

  close(fd);
  
	return addr+page_diff;
}

HI_VOID COMM_MUNMAP(HI_VOID *pRegAddr, HI_U32 u32MapMemSize)
{
   
	munmap(pRegAddr, u32MapMemSize);
}


HI_S32 
海思hi3516dv300硬件设计用户指南是一本针对海思公司推出的hi3516dv300芯片的硬件设计的指导手册。该手册的目的是帮助用户了解hi3516dv300芯片的硬件设计要求和规范,并提供相关的设计指导和建议。 hi3516dv300芯片是一款高性能、低功耗的视频处理芯片,主要应用于视频监控、智能交通和安防等领域。硬件设计是确保芯片正常工作和发挥最佳性能的基础,因此对于使用hi3516dv300芯片的设计人员来说,掌握硬件设计指南是非常重要的。 在这本指南中,首先介绍了hi3516dv300芯片的主要特性和功能,包括处理能力、视频编解码、音频处理等。然后详细讲解了芯片的外部接口和引脚分配,包括视频输入、输出接口、音频接口、以太网接口等。同时,还对时钟、电源、存储器和外设等方面的设计进行了说明和建议。 此外,指南中还提供了关于PCB设计的一些建议,包括地域分布、信号电源分离、阻抗匹配、电磁兼容性等方面,帮助设计人员提高设计质量和可靠性。 总之,海思hi3516dv300硬件设计用户指南是一本重要的参考资料,它提供了关于hi3516dv300芯片硬件设计方面的详尽说明和建议,对于希望使用该芯片进行设计的用户来说是不可或缺的。通过认真阅读和遵循指南中的规范和要求,设计人员可以更好地实现hi3516dv300芯片的应用,提高产品的性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值