我试图在运行am335x的Linux下切换GPIO3 pin17的功能模式。 Linux启动时将此GPIO3配置为模式4(ecap pwm),但在某些情况下,我想将此引脚(17)切换到模式7(gpio模式)。以下是我的代码片段:
// switch mode to 7
off = 0x800 + 0x19c;
val = *(x + off);
*(x + off) = (PIN_OUTPUT | MUX_MODE7);
val = *(x + off);
// 17-th pin must be output - clear it
gv1 = *(gpio + GPIO_OE);
gv2 = (gv1 & ~(1 << 17));
*(gpio + GPIO_OE) = gv2;
// set 17th bit in gpio3
gv2 = (1 << 17);
*(gpio + GPIO_DATAOUT) = gv2;
gv3 = *(gpio + GPIO_DATAOUT);
x和gpio是通过ioremap_nocache()到正确的地址区域实现的指针:0x44e10000(控制模块)和0x481ae000(gpio3)。
问题是此代码无效。我的意思是LCD背光连接到GPIO3 PIN17,它由ECAP PWM功能控制(从SoC的角度来看模式4)。当我通过&#34; echo ...&#34;从用户空间控制这个GPIO3_17引脚时。工作正常(背光正常变化),但我想将ECAP PWM模式切换到GPIO并将GPIO3_17输出设置为逻辑1 - 以实现背光的全功率。
当我尝试调试它时,几乎所有的GPIO3寄存器都有0值,但有一个例外 - GPIO3_REVISION寄存器。它返回正确的值:0x50600801。
我的问题是 - 这个GPIO3模块为GPIO3_REVISION寄存器返回正确值但是所有其他寄存器都为0而GPIO3忽略了我发送到其他GPIO3寄存器的所有内容的原因是什么?
有什么想法吗?如何解决?