欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HI3518linux--GPIO配置

程序员文章站 2022-04-01 18:40:35
...

由于海思linux没有提供GPIO驱动,但是有himm工具,所以可以直接使用它配置GPIO。

如果需要驱动的话,网上也有资源链接如下

http://bbs.ebaina.com/forum.php?mod=viewthread&tid=8833&highlight=gpio


由于调试的时候还没有正式的板子,所以不知道到底是配置不对还是管脚数错,最终花了两个周末的时间才点亮LED。。。

首先讲一下配置GPIO的流程;

    1.管脚复用设置

    2.设置输入输出

    3.设置管脚状态(高/低)

注:本文只设置GPIO的输出设置,其他功能待添加;不想看原理的直接跳到最后,看代码例子。

例: 设置GPIO7-3 输出为高。

    按照步骤来,

    1、设置管脚复用为GPIO

          查看数据手册(可以直接搜索 7_3)

                HI3518linux--GPIO配置

                如上图所示,在手册的308页,GPIO7_3和PWM1是同一个管脚,如果要使用GPIO功能,则要设置寄存器muxctrl_reg59为1。接下来就是要知道 muxctrl_reg59的地址,可以看到表格上方Offset Address 是0X0EC,意思是从基地址偏移0X0EC个位置就是寄存器muxctrl_reg59。那么基地址是多少,往前翻翻手册(274页)可以得到基地址0x200F_0000 。

那么寄存器muxctrl_reg59的地址就是 (0x200F_0000 | 0X0EC)0X200F00EC。

所以设置GPIO模式 : himm 0X200F00EC 0x1

              pwm1模式:himm  0X200F00EC 0x0

 2、设置GPIO7_3为输出

        查找手册(1587页)

            HI3518linux--GPIO配置            

        如图,可以得到各组GPIO的基地址。GPIO7为0x201B_0000

        HI3518linux--GPIO配置

            如图所示,这个配置管脚功能的寄存器,表格中的偏移地址与之前的用法一样。

              HI3518linux--GPIO配置

              设置管脚输出需要用到寄存器GPIO_DIR,偏移地址为0X400。

               那么GPIO7方向控制寄存器为(0x201B_0000 | 0X400)0x201B0400 ,

                这个寄存器器一共有八位,每一位对应GPIO7_0到GPIO7_7 ,0为输入,1为输出。

                所以设置GPIO7_3为输出:himm 0x201B0400 0x08

                注意:这一次设置相当于是把其他几位都设置为0了,所以实际运用中最好是先读出此寄存器的值 ,然后 或 0X08 ,在写入。

            

3、设置GPIO7_3输出为1

        HI3518linux--GPIO配置

    如图(1588页),寄存器GPIO_DIR是控制管脚输出数据和输入数据的寄存器。可以看到它的偏移地址是不固定的因为用来对应一组(就比如GPIO7)GPIO的不同管脚(比如 GPIO7_1、GPIO_2)的组合。而且它是从低三个位开始的。

            HI3518linux--GPIO配置

   如图,io表示IO号,ad表示PADDR。GPIO7_3就是io行3的位置,(ad行)相应位置设置1,

    ad的值为(00 0010 0000)0x20。这就是GPIOx_3的偏移值。

    那么GPIO7_3的数据寄存器 数据寄存器的地址就是:(0x201B_0000 | 0X20)0x201B0020 

    设置GPIO7_3为输出高:himm 0x201B0020 0x08

    [如果要多个io一起设置的话 ,也是可以,只要把相对应的ad设为1就好]


代码例子:

    1. 设置GPIO7_3输出为高(himm)

        1)himm 0x200F00EC 0x01  //设置管脚复用为GPIO

        2)himm 0x201B0400 0x08  //设为输出状态

        3)himm 0x201B0020 0x08  //设置GPIO7_3输出为1


    2.设置GPIO7_3输出为高(驱动)

     

int gpio_init(void)
{
	int ret, gpiofd;
	gpio_ctl_t val;
	gpiofd = dev_open();
	if(gpiofd < 0)
	{	
		printf("open gpio failed\n");
		return -1;
	}
	//设置管脚复用
	val.uRegAddr = 0x200F00EC;            
	val.uRegValue = 0x01;
	ret = ioctl(gpiofd, DRV_reg_write, &val);
	dev_close(gpiofd);
	return ret;

}

void led_on()
{
	unsigned int regvalue = 8;
	reg_read(0x201B0400, &regvalue);    
	regvalue &= 0xFFFFFFFC;
	reg_write(0x201B0400, regvalue);
	gpioSetMode(7, 3, GPIO_OUTPUT, 0);
}


//关于驱动链接 在文章开头  
//在此感谢一下 分享驱动的大神
相关标签: hi3518gpio gpio