p-i-u.de Posted November 11, 2019 Posted November 11, 2019 Hi, i really tried to get SPI as spidev to work on my RockPI 4A (Rev. 1.4), using armbianEnv.txt and DT overlays however nothing works as it seems it is just ignored. So does anybody have an idea of how to get SPI working in spidev mode? Because I have board which I want to connect via SPI.
martinayotte Posted November 11, 2019 Posted November 11, 2019 2 hours ago, p-i-u.de said: using armbianEnv.txt and DT overlays You not only need to add overlays to /boot/armbianEnv.txt, but also parameters, check /boot/dtb/rockchip/overlay/README.rockchip-overlays : ### spi-spidev Activates SPIdev device node (/dev/spidevX.Y) for userspace SPI access, where X is the bus number and Y is the CS number SPI 0 pins (MOSI, MISO, SCK, CS): GPIO3_A5, GPIO3_A4, GPIO3_A6, GPIO3_A7 SPI 1 pins (MOSI, MISO, SCK, CS): GPIO1_A7, GPIO1_B0, GPIO1_B1, GPIO1_B2 SPI 2 pins (MOSI, MISO, SCK, CS): GPIO1_C0, GPIO1_B7, GPIO1_C1, GPIO1_C2 SPI 3 pins (MOSI, MISO, SCK, CS): GPIO2_B2, GPIO2_B1, GPIO2_B3, GPIO2_B4 Parameters: param_spidev_spi_bus (int) SPI bus to activate SPIdev support on Required Supported values: 0, 1 param_spidev_spi_cs (int) SPI chip select number Optional Default: 0 Supported values: 0, 1 Using chip select 1 requires using "spi-add-cs1" overlay param_spidev_max_freq (int) Maximum SPIdev frequency Optional Default: 1000000 Range: 3000 - 100000000
p-i-u.de Posted November 11, 2019 Author Posted November 11, 2019 Somehow the README.rockchip-overlays seems to be lost on my system. Does this also work on stable 4.4 or just in Dev Branch? Currently I'm on stable 4.4 branch. So if this is just in Dev is there any timeframe it is expected to get into stable? Otherwise great it works, as I really thought this is just not working
martinayotte Posted November 12, 2019 Posted November 12, 2019 14 hours ago, p-i-u.de said: Does this also work on stable 4.4 or just in Dev Branch? No overlay stuff in 4.4, only in DEV ...
p-i-u.de Posted November 12, 2019 Author Posted November 12, 2019 OK, I've installed DEV Branch now, and now I see what's the reason that I did not see the README, because it is simply not there in 4.4 stable :-)
p-i-u.de Posted November 17, 2019 Author Posted November 17, 2019 On 11/11/2019 at 10:23 PM, martinayotte said: You not only need to add overlays to /boot/armbianEnv.txt, but also parameters, check /boot/dtb/rockchip/overlay/README.rockchip-overlays : param_spidev_spi_cs (int) SPI chip select number Optional Default: 0 Supported values: 0, 1 Using chip select 1 requires using "spi-add-cs1" overlay I'm using the DEV branch right now and the overlay spi-add-cs1 is missing, do you have any idea how to get the information to create that overlay for RockPI? Furthermore I looked into rk3399-rock-pi-4.dts from there I see that CS1 is only in the section for SPI0, however when I use SPI0 I have no ethernet device anymore, so I thought I use SPI2 and CS1. Currently I'm not sure if this will work at all. Do you know if SPI2 and CS1 will work and how to get it to work? I connected my board which has definatley worked on Raspberry Pi before but I get no output
martinayotte Posted November 17, 2019 Posted November 17, 2019 1 hour ago, p-i-u.de said: I'm using the DEV branch right now and the overlay spi-add-cs1 is missing This is things on the TODO list ... BTW, what is your hat board ? Do you have schematic for it ?
p-i-u.de Posted November 17, 2019 Author Posted November 17, 2019 4 hours ago, martinayotte said: This is things on the TODO list ... BTW, what is your hat board ? Do you have schematic for it ? I'm using this board https://widgetlords.com/products/pi-spi-8ai-raspberry-pi-analog-input-interface the Pi-SPi-8AI 4-20 mA Variant, till now I've not found any way to get it working. Do you have any hints how to make the correct overlay or where to start? That is the overlay what they use for Raspberry PI https://github.com/widgetlords/libwidgetlords/blob/master/overlays/pi-spi.dts however I was not able to translate it to rk3399. Note I have an older Variant with 2 Jumpers to select CE1 and 22
martinayotte Posted November 17, 2019 Posted November 17, 2019 1 hour ago, p-i-u.de said: Do you have any hints how to make the correct overlay or where to start? With a quick look, it seems to be difficult to achieve : CE_1/pin26 is the default, but on RockPi, it is ADC_IN0, so unusable ... You will need to to some of the CS_Spare by moving jumper. But I'm not even sure if RK3399 support SPI "cs-gpios", I will have to try to figure out. Second option is to not connect that board directly to RockPi header, but create an adaptor which will re-route the SPI to use SPI2 available in RockPi at pins GPIO2_B1 to GPIO2_B4.
p-i-u.de Posted November 17, 2019 Author Posted November 17, 2019 13 minutes ago, martinayotte said: With a quick look, it seems to be difficult to achieve : CE_1/pin26 is the default, but on RockPi, it is ADC_IN0, so unusable ... You will need to to some of the CS_Spare by moving jumper. But I'm not even sure if RK3399 support SPI "cs-gpios", I will have to try to figure out. Second option is to not connect that board directly to RockPi header, but create an adaptor which will re-route the SPI to use SPI2 available in RockPi at pins GPIO2_B1 to GPIO2_B4. I already used jumper cables and tried to exacty do that which also doesn't work, as far as my understanding of the Chip Select = 1 is, that CS = 1 means active high getting to low and CS = 0 being active low, so it seems without spi-add-cs1 overlay I am quite lost on this BTW, could it be that the uart4 overlay is also not yet functioning? as I get Input/Output error on ttyS4
martinayotte Posted November 17, 2019 Posted November 17, 2019 2 hours ago, p-i-u.de said: I already used jumper cables and tried to exacty do that GPIO2_B1 = SPI2_MISO GPIO2_B2 = SPI2_MOSI GPIO2_B3 = SPI2_CLK GPIO2_B4 = SPI2_CS0 So, you don't need spi-add-cs1 overlay in such case. 2 hours ago, p-i-u.de said: BTW, could it be that the uart4 overlay is also not yet functioning? as I get Input/Output error on ttyS4 The UART4 overlay is working fine on both my RockPro64 and RockPi. Check "dmesg | grep tty" to see if it became active. You can also use a looback wire to test it. EDIT: I've just tested UART4 overlay also on my NanoPiM4 ...
p-i-u.de Posted November 17, 2019 Author Posted November 17, 2019 1 hour ago, martinayotte said: The UART4 overlay is working fine on both my RockPro64 and RockPi. Check "dmesg | grep tty" to see if it became active. You can also use a looback wire to test it. Yes, that's what I've done to see if it's active after I got the Input/Output error and it was not there only ttyS0, ttyS2 Regarding SPI, thanx I'll try that above once again, maybe the error lies somewhere else, as i had cabling like that already before but get always "Bad address" however /dev/spidev2.0 is there
martinayotte Posted November 18, 2019 Posted November 18, 2019 14 hours ago, p-i-u.de said: Yes, that's what I've done to see if it's active after I got the Input/Output error and it was not there only ttyS0, ttyS2 How did you specified UART4 overlay in /boot/armbianEnv.txt ? It should be : overlays=uart4 EDIT: Also, "uart4" should be placed AFTER any spi-spidev, since this UART sharing pins with SPI.
p-i-u.de Posted November 18, 2019 Author Posted November 18, 2019 8 hours ago, martinayotte said: overlays=uart4 How did you specified UART4 overlay in /boot/armbianEnv.txt ? It should be : EDIT: Also, "uart4" should be placed AFTER any spi-spidev, since this UART sharing pins with SPI. That part with AFTER seems an important one, however here comes the sad story short in hope that maybe at least another one who has this specific setup reads this post and finds this helpful. So the reason why i was always getting "Failed to perform SPI transfer": Bad Address had nothing to do with hardware but with the fact that we are on aarch64 on Rock PI and simply the libwidgetlords libraries where obiously not tested under 64bit as they used (uint32_t) instead of (unsigned long) in their code. So everybody who has a RockPI 4 and Pi-SPi-8AI Raspberry Pi Analog Input (4 - 20 mA) Interface follow this to get it to work Note you currently have to use the Armbian DEV branch so that overlays work put this in /boot/armbianEnv.txt (Note I also enabled uart4 as I use this for another device), you cannot use the 40 gpio to 26gpio Ribbon cable as we use SPI2 instead of SPI0 so you have to connect the board using jumper cables. So connect PIN 26 of the 8AI Board to PIN 33 of the RockPI, Pin 19 to 29 on RockPI, Pin 21 to 31 on RockPI and Pin 23 to 7 on RockPI For those of you who wonder how to connect the sensors to this board, using 2 wire sensors INPUT (voltage supply) goes in the V+ Terminal and the Output from the sensor goes into A1 - A8 overlays=spi-spidev uart4 param_spidev_spi_bus=2 Clone the git repository git clone https://github.com/widgetlords/libwidgetlords.git change includes (don't know if that's necessary but these are the ones used in spidev_test.c program by Linus Torvalds) and the following in src/spi.c #include <errno.h> #include <fcntl.h> #include <linux/spi/spidev.h> #include <stdint.h> #include <stdio.h> #include <string.h> #include <sys/ioctl.h> #include <linux/ioctl.h> #include <unistd.h> from this static const char prefix[] = "/dev/spidev0."; spi.tx_buf = (uint32_t)data; spi.rx_buf = (uint32_t)data; to this static const char prefix[] = "/dev/spidev2."; spi.tx_buf = (unsigned long)data; spi.rx_buf = (unsigned long)data; change SPI_8AI to 0 because we use /dev/spidev2.0 not /dev/spidev2.1 include/pi_spi.h #define SPI_8AI 0 Please find also attached a Java Implementation using MRAA to get access to this board (then there is in fact no need anymore for the libwidgetloard libraries at all) pi_spi.h spi.c SensorMRAA.java
richardk Posted November 19, 2019 Posted November 19, 2019 Instead of (unsigned long) you might choose (intptr_t); specifically, that's the C data type for "an int the same size as a pointer".
p-i-u.de Posted November 23, 2019 Author Posted November 23, 2019 On 11/19/2019 at 11:54 AM, richardk said: Instead of (unsigned long) you might choose (intptr_t); specifically, that's the C data type for "an int the same size as a pointer". Thanx for the tip, I've used what Linus Torvalds used in his spidev_test.c program so I thought that is the correct way (I'm not a C Coder)
Recommended Posts