HI3518linux--GPIO配置

由于海思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)

                

                如上图所示,在手册的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页)

                        

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

        

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

              

              设置管脚输出需要用到寄存器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

        

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

            

   如图,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);
}


//关于驱动链接 在文章开头  
//在此感谢一下 分享驱动的大神
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值