【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
不管是对mcu,还是对soc来说,gpio肯定是越多越好。但是一个芯片上,它的引脚总是有限的,特别对于非BGA的soc来说,芯片又要做的小,引脚又要多,这几乎是不可能的。因此,在芯片领域,很多引脚功能都是复用的,至于选用哪一个功能完全看客户自己的选择,很多时候只能2选1,或者3选1。
对于v3s也是一样的,从全志的芯片手册,也就是Allwinner_V3s_Datasheet_V1.0.pdf中的第53页,我们看到v3s中很多的功能也是复用的,
所以,大家如果在荔枝派中看到,给客户的引脚只有那么几个,这其实是误解。有很多的pin,如果不使用,完全可以拿过来直接当成gpio使用。
1、使用spi接口当成gpio口
这张图我们已经使用过很多次。图中有一个spi接口,之前主要是用作norflash访问使用的。现在因为所有系统都保存在sd卡里面,因此完全可以用这个当成gpio使用。
2、修改sun8i-v3s.dtsi文件
首先注释掉之前spi0_pins这个部分,
/*spi0_pins: spi0 {
pins = "PC0", "PC1", "PC2", "PC3";
function = "spi0";
};*/
接着注释掉spi0,
/*spi0: spi@1c68000 {
compatible = "allwinner,sun8i-h3-spi";
reg = <0x01c68000 0x1000>;
interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_SPI0>, <&ccu CLK_SPI0>;
clock-names = "ahb", "mod";
pinctrl-names = "default";
pinctrl-0 = <&spi0_pins>;
resets = <&ccu RST_BUS_SPI0>;
status = "disabled";
#address-cells = <1>;
#size-cells = <0>;
};*/
注释掉这两部分呢,重新编译成sun8i-v3s-licheepi-zero-dock.dtb文件就可以了。细心的同学也许会看到sun8i-v3s-licheepi-zero.dts和sun8i-v3s-licheepi-zero-dock.dts这两个文件中均有leds的配置,是不是status设置为okay就好了?要注意它们的状态都是写死的,后期不能通过命令和配置的方法来解决,虽然启动后也可以在/sys/kernel/debug/gpio下面看到映射关系,这个需要注意下。
3、重启开发板
重启开发板之后,首先需要查看一下端口使用情况,没有debug信息,先要mount debugfs系统,
mount -t debugfs debugfs /sys/kernel/debug
加载好了之后,就可以看看端口的使用情况了,
# cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-223, parent: platform/1c20800.pinctrl, 1c20800.pinctrl:
gpio-166 ( |usb0_id_det ) in lo
看上去gpio情况还算正常。
4、创建通道,开始设备外设
看过上面一篇文章的同学,对于/sys/class/pwm里面的export不会陌生。但是pwm只有两个,分别是0和1,gpio这么多,我们怎么把这些pin和通道bind在一起呢?其实这里面是有规律的。首先我们找到一个pin,但不知道它的序号是多少,那可以先找到名称,比如SPI_CS,
接着看Allwinner_V3s_Datasheet_V1.0.pdf中的第54页,获取引脚名称,
找到了这个信号叫PC2,下面就好办了。所有的端口一般都是channel = 32*x+y来实现的。PA、PB、PC...,这些代表x,分别是0、1、2...。而PC2中的2就代表y,如果是PB9,那么y就是9。所以对于PC2来说,channel = 32 * 2+ 2,也就是66,就是这么简单。那么,刚才说的PB9呢,它的channel = 32 * 1 + 9,应该就是41。
说了这么多,下面开始实验,
echo 66 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio66/direction
echo 1 > /sys/class/gpio/gpio66/value
echo 0 > /sys/class/gpio/gpio66/value
四条命令依次解释下,第一条创建channel 66。第二条呢,设定chanel 66的方向为输出。第三条,设置高电平,与此相对的,第四条就是设置低电平。
为了验证设置的电平是不是正确,一个靠谱的办法就是在spi_cs处于高电平和低电平的时候都测量下,这样就知道电压有没有设置对了。