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
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, ®value);
regvalue &= 0xFFFFFFFC;
reg_write(0x201B0400, regvalue);
gpioSetMode(7, 3, GPIO_OUTPUT, 0);
}
//关于驱动链接 在文章开头
//在此感谢一下 分享驱动的大神
上一篇: 美国宣布对华为更严厉制裁(芯片切断5G和手机业务)
下一篇: 麒麟9000相当于骁龙多少?