最近在调试openwrt(rt5350方案) gpio控制功能,系统启动后默认只有一个gpio(gpio0 led专用)口可以控制。于是仿照leds-gpio驱动做了两个相同的驱动,并开启两个不同的gpio口(gpio1 gpio2),程序启动后打印如下:
[ 8.210000] leds-gpio gpio-leds.5: pins are not configured from the driver //这个是leds-gpio驱动打印的,这个gpio0是可以控制的
[ 8.220000] leds-gpio gpio-zigbee0.6: pins are not configured from the driver //这个是仿照leds-gpio些的,gpio1不可控制
[ 8.240000] rt2880-pinmux pinctrl.1: pin 1 is not set to gpio mux //这里说是未设置gpio mux
[ 8.250000] rt2880-pinmux pinctrl.1: request() failed for pin 1
[ 8.260000] rt2880-pinmux pinctrl.1: pin-1 (pio:1) status -22
[ 8.270000] leds-gpio gpio-zigbee1.7: pins are not configured from the driver //这个也是仿照leds-gpio些的,gpio2不可控制
[ 8.290000] rt2880-pinmux pinctrl.1: pin 2 is not set to gpio mux
[ 8.300000] rt2880-pinmux pinctrl.1: request() failed for pin 2
[ 8.310000] rt2880-pinmux pinctrl.1: pin-2 (pio:2) status -22
于是通过打印信息找到\trunk\build_dir\target-mipsel_24kec+dsp_uClibc-0.9.33.2\linux-ramips_rt305x\linux-3.10.36\arch\mips\ralink\Rt305x.c中存在gpio mux相关设置信息
static struct rt2880_pmx_func i2c_func[] = { FUNC("i2c", 0, 1, 2) }; //默认i2c占用了gpio 1 和2
于是做如下调整
static struct rt2880_pmx_group rt5350_pinmux_data[] = {
GRP("i2c", i2c_func, 0,RT305X_GPIO_MODE_JTAG),//此处将第三个参数设置成0,之后上面的pin 1 /2 is not set to gpio mux信息未出现
GRP("spi", spi_func, 1, RT305X_GPIO_MODE_SPI),
GRP("uartf", uartf_func, RT305X_GPIO_MODE_UART0_MASK,
RT305X_GPIO_MODE_UART0_SHIFT),
GRP("uartlite", uartlite_func, 1, RT305X_GPIO_MODE_UART1),
GRP("jtag", jtag_func, 1, RT305X_GPIO_MODE_JTAG),
GRP("led", rt5350_led_func, 1, RT5350_GPIO_MODE_PHY_LED),
{ 0 }
};
此时gpio-zigbee0.6 及gpio-zigbee1.7 leds驱动可以操作gpio1 、2的设备节点,但对其设置高电平或低电平无效,怀疑是驱动问题,于是
删掉我写的驱动,重新编译,用/sys/class/gpio/export系统自带的gpio操作接口导出gpio后,改变其电压也无效,操作过程,及返回结果如下:
root@OpenWrt:/sys/devices/10000000.palmbus/10000600.gpio/gpio/gpio1# cat direction
out
root@OpenWrt:/sys/devices/10000000.palmbus/10000600.gpio/gpio/gpio1# cat value
0
root@OpenWrt:/sys/devices/10000000.palmbus/10000600.gpio/gpio/gpio1# echo "1">value
root@OpenWrt:/sys/devices/10000000.palmbus/10000600.gpio/gpio/gpio1# cat value
0
不知是否有其他位置需要调整,才能正常控制gpio
这段话说的可能有点啰嗦,我想表达的意思是除了gpio0以外,其他的gpio(gpio1-24)均不能被使用,就算我用这个led驱动打开了他,还是无法使用,比如我用led驱动控制gpio1脚 为高电压但用 万用表检测时电压仍为低电压
那你说的“于是仿照leds-gpio驱动做了两个相同的驱动”是怎么做的?
修改leds-gpio的代码或者配置是不是比写新的驱动更合适?一个驱动程序驱动多个GPIO Pin应该是可以实现的
其实关键问题不在 gpio控制程序,相同的控制代码,不同的控制结果,因此问题很有可能是在rt2880-pinmux pinctrl.1 系统中,该模块可能存在bug。多谢版主的耐心回答,这个可能需要个人深入研究了
GPIO都有多种模式,Uboot里面或者kernel里面都可以设置,你最好找到芯片的datasheet看看,再修改kernel中关于gpio的代码
问题已经解决,主要是在 rt5350.dtsi文件中打开gpio功能就行了