网上看迅为的视频,是用的iTop的开发板,我手里面是rk3288的开发板,所以硬件操作上会有些出入,点个灯不容易,记录一下。说明一下,这里不适用于GPIO0,因为GPIO0的操作寄存器和GPIO1-8不太一样。
1.首先看电路板的原理图,找到预留的LED的线路连接,看一下POWER_LED连到了哪里
连到了GPIO8_A2上面。
2.看一下芯片手册CRU部分,GPIO有时钟使能,保险起见,需要使能一下GPIO8的时钟,这里G14_8指的是GATE14,下面寄存器会看到。
往下翻找到CRU_CLKGATE14,搜索一下,看到寄存器描述
CRU:
这个寄存器的bit31:16是写使能,当对bit0:15操作时,需要将对应的bit+16位置1,才能写成功,如这里我需要操作bit8,那么应该同时将bit(8+16)也就是bit24置1。
GRF:
看上面的原理图能知道,GPIO8_A2是复用的,那我们怎么知道用的是GPIO功能,那么需要配置复用寄存器,进到这一章直接就能看到复用寄存器的偏移地址,我们找到GPIO8A的寄存器
搜索一下看寄存器描述,同样,有个写使能。
往下找,找到我们需要的GPIO8_A2,OK在bit4上面,1为gpio功能
接下来,我们需要配置IO口是输入还是输出,看一下GPIO章节
GPIO_SWPORTA_DDR是IO口的方向寄存器,DR是IO口的数据寄存器,也就是控制高低。
DDR/DR 寄存器的 bit31:0 分别对应rk3288的GPIO8
bit[31:24]->D7-D0 bit[23:16]->C7-C0 bit[15:8]->B7-B0 bit[7:0]->A7-A0
一共32个IO口,不管它实际有没有,但是它就是这样控制的,配置完方向之后,那么就可以控制DR寄存器输出高低电平了。
哦对了还有个问题,这些寄存器只是偏移地址,哪里去看基地址?在第一张的address mapping里面找一下就好了
控制rk3288 power_led的伪代码如下:
//定义虚拟地址指针
static volatile unsigned int *GPIO8_CLKGATE_CON;
static volatile unsigned int *GPIO_PORT_DR;
static volatile unsigned int *GPIO_PORT_DDR;
static volatile unsigned int *GRF_GPIO8A_IOMUX;
//申请虚拟地址
GPIO8_CLKGATE_CON = ioremap(0xFF760000+0x0198,4); //GPIO8A clk 控制
GRF_GPIO8A_IOMUX = ioremap(0xFF770000+0x0080,4); //GPIO8A复用控制
GPIO_PORT_DDR = ioremap(0xFF7F0000+0x0004,4); //input/output控制
GPIO_PORT_DR = ioremap(0xFF7F0000+0x0000,4); //data output
//IO初始化,使能时钟,复用配置为io,方向为output
*GPIO8_CLKGATE_CON = (1<<(16+8))|(0<<8); //31:16 write mask :8 gpio8 clk gate,0:enable
*GRF_GPIO8A_IOMUX = (1<<(16+4))|(~(1<<4));//31:16 write mask :4 0:fuc gpio
*GPIO_PORT_DDR |= (1<<2); //gpio8_A2 set output
//IO控制
*GPIO_PORT_DR &= ~(1<<2); // 0点亮
*GPIO_PORT_DR |= (1<<2); //1 熄灭