Rafał Wolak Posted December 15, 2016 Posted December 15, 2016 Hello i'm begginer in programing, but i'm learning slowly. I need use gpio pins in my Orange Pi Zero, but i can't find any library that work with my board. Google is not very usefull for me. I was using RPi.GPIO on my RPi projects, but this library don't work on OPi Zero. Can anyone link to working library for python? I need use only 6 output pins.
martinayotte Posted December 15, 2016 Posted December 15, 2016 For all my Oranges, I'm using https://github.com/duxingkei33/orangepi_PC_gpio_pyH3 Be aware that on PiZero, the STATUS_LED is not on PA15 but on PA17, therefore you will need to tweak mapping.h to change that. 1
msev Posted December 15, 2016 Posted December 15, 2016 Ok so if I see a project that uses WiringPi, how do I replace the wiringpi code in that project with the code from this library so that it does the same job? Also what about if I need a library in C? (which one works?) 1
martinayotte Posted December 15, 2016 Posted December 15, 2016 In the link I provided, although it is a Python library, but under the hood, it still written in C. So, for GPIO, you can use pyA20/gpio/gpio_lib.h and pyA20/gpio/gpio_lib.c directly. For blink example of PiZero RED LED on PA17, here are the methods needed : sunxi_gpio_init(); sunxi_gpio_set_cfgpin(SUNXI_GPA(17), SUNXI_GPIO_OUTPUT); while(1) { sunxi_gpio_output(SUNXI_GPA(17), 1); sleep(1); sunxi_gpio_output(SUNXI_GPA(17), 0); sleep(1); }
msev Posted December 16, 2016 Posted December 16, 2016 So if we take for example this project (which is with wiringPi) -> https://github.com/rszimm/sprinklers_pi/blob/361946af2e972ac7df639859610d26adaf335624/core.cpp I would replace #include <wiringPi.h> with #include <gpio_lib.h> and then wiringPiSetup() with sunxi_gpio_init() and then digitalWrite(ZoneToIOMap, (outState&(0x01<<i))?1:0); to what? And the pinMode stuff in core.cpp to what? I'd really like to use this software with orange pi zero, I'd be really happy if you could help me. I think I will use only OT_DIRECT_POS or OT_DIRECT_NEG so maybe those pinmodes are not important dunno? Also i found this cool project which uses Rpi.GPIO -> https://github.com/Dan-in-CA/SIP; how would I support here the Orange PI?
martinayotte Posted December 16, 2016 Posted December 16, 2016 Yes, the sunxi_gpio_init() should be called first. Then, setting pinmode is done by sunxi_gpio_set_cfgpin(). sunxi_gpio_output() is the equivalent to digitalWrite(). The code in above link is a bit hard to understand without the schematic of the project. It seems that it is talking to an external shift register with clock/data/latch, probably an 74HC595. The OT_DIRECT_POS/OT_DIRECT_NEG seems to be equivalent of SUNXI_GPIO_OUTPUT/SUNXI_GPIO_INPUT. Personally, I will re-write this code from scratch instead of trying to port it as is.
Michal8 Posted December 18, 2016 Posted December 18, 2016 Hello, I'm trying to work with Orange pi ZERO, and there is only PA7 and PA10 pins available as GPIO, is it possible to disable for example UART2 tx and rx pins and use them as GPIO? How? Thank you very much for reply. M
martinayotte Posted December 18, 2016 Posted December 18, 2016 Of course ! you need to make sure they are properly set in Legacy Fex or Mainline DT as plain GPIO and remove the UART2 definition if present. Same can be done with I2C and/or SPI if you don't need them.
Michal8 Posted December 18, 2016 Posted December 18, 2016 Thank you for reply, now It's switching relay module as expected. I found pin names for orange pi zero here http://www.orangepi.org/orangepibbsen/forum.php?mod=viewthread&tid=2236maybe it helps someone.
martinayotte Posted December 18, 2016 Posted December 18, 2016 Good ! Pinout was also described in the schematic.
msev Posted December 19, 2016 Posted December 19, 2016 I've watched some youtube review and the guys said he couldnt get i2c and spi to work on the orange pi zero...Did you test it already? Does it work? Can you write a mini tutorial regarding those fex's etc.?
martinayotte Posted December 19, 2016 Posted December 19, 2016 If you are talking about this youtube https://m.youtube.com/watch?v=MzxLYGWQddA, the guy didn't even investigate ... I've the I2C working, and for SPI I will probably need to tweak DT, since I'm working exclusively with Mainline. (So, I can't provide recipe for FEX, since I don't use Legacy)
tkaiser Posted December 19, 2016 Posted December 19, 2016 I've watched some youtube review and the guys said he couldnt get i2c and spi to work on the orange pi zero...Did you test it already? Does it work? I2C and SPI works since ages on Oranges. With legacy kernel and thanks to Martin's DT overlay work also with mainline kernel. Just use the Google powered forum search and enter 'spi i2c orange pi' (that's the first attempt if something doesn't work: use a search engine. And 'spi i2c orange pi' entered in any search engine will most probably also show numerous threads here in the forum with real use cases) OPi Zero is just another compatible H2+/H3 device so the only question is how to make the pins accessible or to configure them correctly (the fex stuff -- no idea whether anyone already tested through whether the pin mappings are correct or not in the fex file we ship)
martinayotte Posted December 19, 2016 Posted December 19, 2016 I've done the quick test on PiZero : attached dupont jumper as loopback on miso/mosi, loaded my usual spidev-overlay.dtbo, and ran ./spidev-test with success.
msev Posted December 20, 2016 Posted December 20, 2016 So the default "Jessie server" OPI-0 image uses legacy kernel right? Yeah I was watching that video, that you linked... Would be nice if there was a tutorial regarding this fex's and stuff...Its like alien language to me .
martinayotte Posted December 20, 2016 Posted December 20, 2016 There is this guide : http://linux-sunxi.org/Fex_Guide
Ribster Posted January 7, 2017 Posted January 7, 2017 If you are talking about this youtube https://m.youtube.com/watch?v=MzxLYGWQddA, the guy didn't even investigate ... I've the I2C working, and for SPI I will probably need to tweak DT, since I'm working exclusively with Mainline. (So, I can't provide recipe for FEX, since I don't use Legacy) Hey Martin, In a related question, i'm trying to get the GPIO / SPI working with pi zero. I'm used to A13, so have experience with fex. The objective is to move to mainline tho, but it's pretty hard to find good info what steps to take etc. So my question is: for mainline zero GPIO / SPI access in kernel space(preferably) or user space, where can i find good guides / tutorials ? Thanks in advance!
martinayotte Posted January 7, 2017 Posted January 7, 2017 In Mainline, the devices are defined my Device-Tree loaded by the kernel. There is plenty of docs/tutorial that you can find on Google about DT. Some for different platforms, but it doesn't matter if it to read and learn about DT. For PiZero specific case, the SPIs are already defined in DT, but not visible in userspace until you add an SPIDEV overlay like the following one. The /dev/spidev0.0 will appear and could be used by python library orangepi_PC_gpio_pyH3. The /dev/spidev1.0 won't appear unless you disable led_status and uart3 since they are sharing the same pins. // Enable the spidev interface/dts-v1/;/plugin/;/ { compatible = "allwinner,sun8i-h3"; fragment@0 { target-path = "/aliases"; __overlay__ { /* Path to the SPI controller nodes */ spi0 = "/soc@01c00000/spi@01c68000"; spi1 = "/soc@01c00000/spi@01c69000"; }; }; fragment@1 { target = <&spi0>; __overlay__ { pinctrl-names = "default"; pinctrl-0 = <&spi0_pins_a>, <&spi0_cs0_pins_a>; status = "okay"; #address-cells = <1>; #size-cells = <0>; spidev@0 { compatible = "spidev"; reg = <0x0>; spi-max-frequency = <1000000>; }; }; }; fragment@2 { target = <&spi1>; __overlay__ { pinctrl-names = "default"; pinctrl-0 = <&spi1_pins_a>, <&spi1_cs0_pins_a>; status = "okay"; #address-cells = <1>; #size-cells = <0>; spidev@0 { compatible = "spidev"; reg = <0x0>; spi-max-frequency = <1000000>; }; }; };}; 1
Ribster Posted January 7, 2017 Posted January 7, 2017 (edited) Okay great, this is very valuable. I understand the spidev as it gets mounted and you can just use it like a file system. I guess if i want to make a kernel module, i can just address them by bus 0 and bus 1 and use the spi kernel api to move further. Am i right that i need to delete the spidev@0 { compatible = "spidev"; reg = <0x0>; spi-max-frequency = <1000000>; }; part for using it with my own kernel module ? Else it gets mounted to the spidev ? Edit: Too fast. I will need to remove this piece : // Enable the spidev interface /dts-v1/; /plugin/; Edited January 7, 2017 by Ribster
martinayotte Posted January 7, 2017 Posted January 7, 2017 Right, you don't need my DT overlay shown in the spoiler if you are not using spidev in userspace. In fact, you just need to replace in the main DT the status "disabled" by "okay". For accessing the SPI itself in kernel-space, I'm not fluent with that, but you can take a look at other drivers present in the mainline. 1
msev Posted January 12, 2017 Posted January 12, 2017 Would this work on a opi zero: https://www.npmjs.com/package/node-red-contrib-opi-gpio ?
Serg_K Posted January 19, 2017 Posted January 19, 2017 Of course ! you need to make sure they are properly set in Legacy Fex or Mainline DT as plain GPIO and remove the UART2 definition if present. Same can be done with I2C and/or SPI if you don't need them. Good day Martin, could you explain how to configure ports on OPi Zero as a GPIO ports? What i must to do? Thanks in advance.
martinayotte Posted January 19, 2017 Posted January 19, 2017 If you are using Legacy image, you have to edit FEX and make sure the pins are defined in gpio and SPI/I2C disabled. This Guide will help you : http://linux-sunxi.org/Fex_Guide If you are using Mainline, simply have those SPI/I2C with status = "disabled";
msev Posted January 22, 2017 Posted January 22, 2017 Would be nice if someone could write step by step a tutorial for commands on how to enable gpio's and i2c for example. Since as you see by these questions, we normal users (nonprogrammers), don't understand it. If there was such a tutorial one could then just link to it on subsequent questions. But would really need to be detailed, with the bash commands.
Ribster Posted January 22, 2017 Posted January 22, 2017 Would be nice if someone could write step by step a tutorial for commands on how to enable gpio's and i2c for example. Since as you see by these questions, we normal users (nonprogrammers), don't understand it. If there was such a tutorial one could then just link to it on subsequent questions. But would really need to be detailed, with the bash commands. Since it is python on the A20, you can search the web for examples. They do exist. Even in the official python docs. It's not that hard. You can always make a push request for that A20 python repo to add your examples once you figured it out. https://pypi.python.org/pypi/pyA20
msev Posted January 23, 2017 Posted January 23, 2017 Where did you read that pyA20 works on it? So I just flash armbian and then I use this python library and it works? I don't have to configure stuff inside fex? Can someone post a fex compatible with this library and tell me how I use it?
martinayotte Posted January 23, 2017 Posted January 23, 2017 @msev, in above post #2,' I've mentioned https://github.com/duxingkei33/orangepi_PC_gpio_pyH3, which is an H3 fork of the pyA20 from Olimex.
michal Posted January 24, 2017 Posted January 24, 2017 Hi Martin, I have built and installed the GPIO library on my Orange Pi Zero that you suggested. But unfortunately I noticed that STATUS_LED pin is wrongly mapped after the install. I tried to build and install the library once again after the modification of the mapping.h but after the initialization of led >>> led1 = port.STATUS_LED and print out >>> print led1 I am getting a wrong pin (15) instead of PA17. How shall I fix this problem? Thanks, Michal
msev Posted January 24, 2017 Posted January 24, 2017 Michal so some pins work (for which the mapping is correct)? Like pins 3, 5, 7 ,11, 13 and 15? So with this lib I can do digital high and low? I2c is not connected to this library right, it works standalone? Martinayotte which library would be good to test i2c (do you know if it works on opizero)? Thanks guys for help!
Recommended Posts