想使用SPI0的CS管脚作为普通gpio使用,控制LED闪烁。在驱动内使用
gpio_request(gpio_num,"CS_165_GPIO");
gpio_direction_output(gpio_num,0);
gpio_set_value(gpio_num,1);
申请引脚,从返回值看,申请成功,设置输出成功。
但是系统启动后,该管脚无输出波形,不可控。之后通过cat /sys/kernel/debug/pinctrl/44e…./pins查看,该引脚状态为0x62,依然为模式0输入状态,与驱动内设置为输出模式不符。不知道为什么?
之后尝试在设备树内spi引脚设置内,加入AM33XX_IOPAD(0x95c, PIN_OUTPUT | MUX_MODE7 ),重新编译,启动,该引脚才可以作为普通gpio使用,并且可以在驱动内通过gpio_set_value(gpio_num,1);控制。
疑问:要想通过gpio_set_value函数在驱动内控制某个GPIO输出,必须在设备树内通过AM33XX_IOPAD将对应引脚设置为输出么?驱动内的gpio_direction_output不是已经将其设置为输出了么,为何不行?
请问这是为什么?
大家帮分析下,谢谢。
Denny%20Yang99373:
查看一下PINMUX配置
估计在device tree里被配成CS使用了
user5217710:
回复 Denny%20Yang99373:
你好,谢谢你的回复。 dts spi节点下有一个设备,引脚设置如下 spi0_pins: pinmux_spi0_pins { pinctrl-single,pins = < AM33XX_IOPAD(0x950, PIN_INPUT_PULLDOWN | MUX_MODE0 ) //spi-clk AM33XX_IOPAD(0x954, PIN_INPUT_PULLDOWN | MUX_MODE0 ) //spi-d0 AM33XX_IOPAD(0x958, PIN_INPUT_PULLDOWN | MUX_MODE0 ) //spi-d1 >; };
像上面,并没有配置cs引脚。而此时led驱动内申请cs脚作为普通脚,然后设置输出,引脚状态无变化。
spi0_pins: pinmux_spi0_pins{pinctrl-single,pins = <AM33XX_IOPAD(0x950, PIN_INPUT_PULLDOWN | MUX_MODE0 ) //spi-clkAM33XX_IOPAD(0x954, PIN_INPUT_PULLDOWN | MUX_MODE0 ) //spi-d0AM33XX_IOPAD(0x958, PIN_INPUT_PULLDOWN | MUX_MODE0 ) //spi-d1
AM33XX_IOPAD(0x95c, PIN_OUTPUT | MUX_MODE7 )//设置cs脚为模式7,普通gpio。>;};
像上面这样,将cs脚在spi的引脚设置内 设置一下,led驱动内才可以申请并且翻转该cs引脚输出的状态。
内核设备树内其他地方并无对该cs脚的配置。
user5217710:
回复 Denny%20Yang99373:
使用这种方法
gpio_request(gpio_num,"CS_165_GPIO");gpio_direction_output(gpio_num,0);
gpio_set_value(gpio_num,1);
在驱动内控制gpio,还需要在dts内配置相应管脚?
Denny%20Yang99373:
回复 user5217710:
需要的
user5217710:
回复 Denny%20Yang99373:
谢谢回复。
这样的话。
gpio_request
gpio_direction_output
岂不是做了多余的事情。
设备树内已经进行配置为输出,然后驱动内还配置为输出一次。