Hi3559AV100获取和设置GPIO管脚的状态Demo

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xclshwd/article/details/87944526

         由于针对海思GPIO管脚调试一下,一般都可以用himm来设置寄存器值,当时还要查找对应管脚寄存器,设置方向和数值,有点麻烦。可是针对hi3559av100中《HiMPP V4.0 媒体处理软件开发参考.pdf》删除了HI_MPI_SYS_SetReg和HI_MPI_SYS_GetReg,所以操作寄存器比较麻烦。通过研究himm源码,自己仿写一个demo,可以设置和获取gpio的状态。

          

1、定义hi3559av100各个GPIO的基地址

#define DEFAULT_MD_LEN 128

static int HiGpioBaseAddrTab[19]={
					0x12140000,0x12141000,0x12142000,0x12143000,0x12144000,/**GPIO0-4*/
					0x12145000,0x12146000,0x12147000,0x12148000,0x12149000,/**GPIO5-9*/
					0x1214A000,0x1214B000,0x1214C000,0x1214D000,0x1214E000,/**GPIO10-14*/
					0x1214F000, 0x12150000, 0x12151000, 0x12152000/**GPIO15-18*/
					};

#define GPIO_DATA_ADDR(gpioGrpBaseAddr, pin)        ((gpioGrpBaseAddr) + 0x000) + (1 << ((pin) + 2))
#define GPIO_GROUP_DIR_ADDR(gpioGrpBaseAddr)        (gpioGrpBaseAddr) + 0x400
2、提供两个获取和设置寄存器函数
HI_S32 SetReg(HI_U32 u32Addr, HI_U32 u32Value)
{
	unsigned long ulOld;
	
	void* pMem  = NULL;

	pMem = memmap(u32Addr, DEFAULT_MD_LEN);
	if (pMem == NULL) {
		printf("memmap failed!\n");
		return -1;
	}
	
	ulOld = *(unsigned int*)pMem;
	*(unsigned int*)pMem = u32Value;
    printf("[SetReg]0x%08lX --> 0x%08lX \n",  ulOld, u32Value);
	memunmap(pMem);
	return 0;
			
	
}
HI_S32 GetReg(HI_U32 u32Addr, HI_U32 *pu32Value)
{
	void* pMem  = NULL;

	pMem = memmap(u32Addr, DEFAULT_MD_LEN);
	if (pMem == NULL) {
		printf("memmap failed!\n");
		return -1;
	}
	
	*pu32Value = *(unsigned int*)pMem;
    printf("[GetReg]0x%08lX =[0x%08lX] \n",  u32Addr, *pu32Value);
	memunmap(pMem);
	return 0;
}
3、封装设置GPIO方向、设置和获取函数
void HisiGpioDirCfg(int group,int pin,bool isOutput)
{
    unsigned int val = 0;
    unsigned int dirAddr = 0;
    dirAddr = GPIO_GROUP_DIR_ADDR(HiGpioBaseAddrTab[group]);

    if( 0 == GetReg(dirAddr,&val) )
    {
		if(isOutput)
		{
			val |= 1 << pin;
		}
		else
		{
			val &= ~(1 << pin);
		}
		if( 0 != SetReg(dirAddr,val) )
		{
			printf("[HisiGpioDirCfg] SetReg Error! val: %d\n",val);
		}
		printf("[HisiGpioDirCfg]addr: 0x%08lX =[0x%08lX] \n", dirAddr, val);
    }
	else
	{
		printf("[HisiGpioDirCfg] GetReg Error! val: %d\n",val);
	}
}

void HisiGpioSetValue(int group,int pin,bool isHeight)
{
    unsigned int val = 0;
    unsigned int dataAddr = 0;
    dataAddr = GPIO_DATA_ADDR(HiGpioBaseAddrTab[group], pin);
    if(isHeight)
    {
    	val = 1 << pin;
    }
    else
    {
    	val = 0;
    }
    if( 0 != SetReg(dataAddr,val) )
    {
        printf("HisiGpioSetValue Error! val: %d\n",val);
    }
}

int HisiGpioGetValue(int group,int pin)
{
    unsigned int val = 0;
    unsigned int dataAddr = 0;
    dataAddr = GPIO_DATA_ADDR(HiGpioBaseAddrTab[group], pin);
    if( 0 == GetReg(dataAddr,&val) )
    {
        if(val & (1 << pin))
        {
            val = 1;
        }
        else
        {
            val = 0;
        }
        return val;
    }
    else
    {
        printf("HisiGpioGetValue Error! val: %d\n",val);
        return -1;
    }
}
4.main函数实现
int main(int argc, char **argv)
{
	if(argc <4)
	{
		printf("usage: gpio_rw <flag 0:read,1:write> <groupnum> <gpio_bit> <dir 0:input,1:output> <value>\n");
		printf("sample: gpio_rw 0 0 3 [获取 GPIO0_3]\n");
		printf("sample: gpio_rw 1 0 3 0 1 [设置 GPIO0_3)]\n");
		return 0;
	}
	int flag = 0;
	unsigned int gpio_groupnum = 0;
	unsigned int gpio_bitnum = 0;
	unsigned int gpio_dir = 0;
	unsigned int bitvalue = 0;
	unsigned int status  = 0;
	flag = atoi(argv[1]);
	gpio_groupnum = atoi(argv[2]);
	gpio_bitnum = atoi(argv[3]);
	
	if (0 == flag)
	{
		if(argc == 4)
		{
			status = HisiGpioGetValue(gpio_groupnum, gpio_bitnum);
			
			printf("get gpio(%d,%d) value=%d\n",gpio_groupnum,gpio_bitnum,status);
		}
	}
	else if (1 == flag)
	{
		if(argc == 6)
		{
			
			if(gpio_dir >= 0)
			{
				gpio_dir = atoi(argv[4]);
				HisiGpioDirCfg(gpio_groupnum, gpio_bitnum, gpio_dir);
				printf("set gpio(%d,%d) dir=%d\n",gpio_groupnum,gpio_bitnum,gpio_dir);
			}
			if(bitvalue >= 0)
			{
				bitvalue = atoi(argv[5]);
				HisiGpioSetValue(gpio_groupnum, gpio_bitnum, bitvalue);
				printf("set gpio(%d,%d) value=%d\n",gpio_groupnum,gpio_bitnum,bitvalue);
			}
		}
	}
	
	return (int)status;
	
}
5、主要借鉴了osdrv\tools\board\reg-tools-1.0.0中的memmap.c和strfunc.c函数,在sdk中自行参考。

猜你喜欢

转载自blog.csdn.net/xclshwd/article/details/87944526