Unable to control some GPIO pins

Post Reply
alone1224
Posts: 27
Joined: Wed Jul 15, 2015 8:50 pm
languages_spoken: Korean
ODROIDs: C4
Has thanked: 6 times
Been thanked: 2 times
Contact:

Unable to control some GPIO pins

Post by alone1224 »

Hello.

I'm trying to control some GPIO pins on Odroid-C4.
(OS image: Ubuntu Minimal 22.04 image)

I haven't tested all the pins, but from what I've tried so far, pins 24 and 27 are unavailable.
(24 and 27 are physical pin numbers.)

Please see the test results using sysfs below.

Code: Select all

root@odroid:/sys/class/gpio# cd /sys/class/gpio
root@odroid:/sys/class/gpio# echo 474 > export
-bash: echo: write error: Invalid argument
root@odroid:/sys/class/gpio# echo 486 > export
-bash: echo: write error: Device or resource busy
Strangely, using wiringPi, 24 is controllable, but 27 is not.

Code: Select all

...

int pin_24 = 10;
int pin_27 = 30;

wiringPiSetup();

pinMode(pin_24, OUTPUT);
digitalWrite(pin_24, HIGH);  // 3.3 volts is output
delay(5000);
digitalWrite(pin_24, LOW);  // No voltage output
delay(5000);

pinMode(pin_27, OUTPUT);
digitalWrite(pin_27, HIGH);  // Approximately 3.2 volts is output
delay(5000);
digitalWrite(pin_27, LOW);  // Continues to output 3.2 volts.
delay(5000);

...
Pins 13, 15, 22, 26, 29, 31 are well controlled by sysfs or wiringPi.

Is there any way to use pins 24 and 27?
(Ultimately, I plan to use pin 24 as an interrupt and pin 27 as an output pin).

User avatar
neal
Posts: 400
Joined: Fri Apr 14, 2017 10:02 am
languages_spoken: Korean, English
Has thanked: 35 times
Been thanked: 64 times
Contact:

Re: Unable to control some GPIO pins

Post by neal »

Can you change Device Tree Overlay sector to overlays="i2c0 uart0" in /media/boot/config.ini, reboot, and try again?

Code: Select all

.
.
     90 overlay_resize=16384
     91 overlay_profile=
     92 ; overlays="spi0 i2c0 i2c1 uart0"
     93 overlays="i2c0 uart0"
 .
 .
These users thanked the author neal for the post:
alone1224 (Tue Jul 02, 2024 7:34 am)

alone1224
Posts: 27
Joined: Wed Jul 15, 2015 8:50 pm
languages_spoken: Korean
ODROIDs: C4
Has thanked: 6 times
Been thanked: 2 times
Contact:

Re: Unable to control some GPIO pins

Post by alone1224 »

neal wrote:
Mon Jul 01, 2024 5:01 pm
Can you change Device Tree Overlay sector to overlays="i2c0 uart0" in /media/boot/config.ini, reboot, and try again?

Code: Select all

.
.
     90 overlay_resize=16384
     91 overlay_profile=
     92 ; overlays="spi0 i2c0 i2c1 uart0"
     93 overlays="i2c0 uart0"
 .
 .
Thank you for your answer.

I removed "spi0" and "i2c1" from the overlays and pins 24 and 27 became available.
I don't need "i2c1", but I do need "spi0".
It looks like I can't use pin 24 as a GPIO when using "spi0", can I?

What is the role of SPI_A_SS0?
Does SS stand for Slave Select?

User avatar
neal
Posts: 400
Joined: Fri Apr 14, 2017 10:02 am
languages_spoken: Korean, English
Has thanked: 35 times
Been thanked: 64 times
Contact:

Re: Unable to control some GPIO pins

Post by neal »

It looks like I can't use pin 24 as a GPIO when using "spi0", can I?
If you made setting the spi0 in device tree overlay, the pin 24 be assigned to the SS0 ( Slave Select 0(zero) ) which is one of the SPI communication hardware-wise.
What is the role of SPI_A_SS0?
You can search for internet what's SPI, you can get so many information for it.

User avatar
tobetter
Posts: 13379
Joined: Mon Feb 25, 2013 10:55 am
languages_spoken: Korean, English
ODROIDs: Many
Location: Paju, South Korea
Has thanked: 1033 times
Been thanked: 2328 times
Contact:

Re: Unable to control some GPIO pins

Post by tobetter »

alone1224 wrote:
Tue Jul 02, 2024 7:34 am
It looks like I can't use pin 24 as a GPIO when using "spi0", can I?
You can but you need to change the device tree overlay for SPI0 in order to move the pin 24 to other pin.
What is the role of SPI_A_SS0?
Does SS stand for Slave Select?
SPI_A_SS0 is for chip select in SPI bus, the device tree overlay for SPI is written to use pin 19/21/23/24 for a SPI bus.

Can you please do share the pinout of your board or module where the pins are connected, so we can help how the device tree can be customised for your project.

alone1224
Posts: 27
Joined: Wed Jul 15, 2015 8:50 pm
languages_spoken: Korean
ODROIDs: C4
Has thanked: 6 times
Been thanked: 2 times
Contact:

Re: Unable to control some GPIO pins

Post by alone1224 »

neal and tobetter, thank you for your responses.

I am not an expert in this area, but I do understand the basic SPI communication behavior and I know what the CS pin does.

I am trying to port code written on a Raspberry Pi 4B using the pigpio library to the Odroid-C4.
(Hopefully the Odroid-C4 will be more energy efficient and more rugged than the Raspberry Pi 4B ;-))
The code uses 3 pins as CS pins and 3 pins as interrupts and retrieves data from 3 ADCs over SPI communication.

Since pigpio is not available on Odroid, I've been looking at alternative libraries like spidev and libgpiod and experimenting with controlling the pins I need.
If pin 24 is the CS pin of spi0, it would be nice to use 24, 26, and 28 as CS pins, but how do I control pin 24?
As far as I've seen, the spidev library doesn't have a function to control the CS pin. (please let me know if I'm wrong)

I saw that controlling pin 24 is possible using WiringPi, so is that the only way to do it?
I realize it might be easier with WiringPi, but I would like to write the code using spidev and libgpiod if possible.

User avatar
tobetter
Posts: 13379
Joined: Mon Feb 25, 2013 10:55 am
languages_spoken: Korean, English
ODROIDs: Many
Location: Paju, South Korea
Has thanked: 1033 times
Been thanked: 2328 times
Contact:

Re: Unable to control some GPIO pins

Post by tobetter »

alone1224 wrote:
Tue Jul 02, 2024 10:49 pm
If pin 24 is the CS pin of spi0, it would be nice to use 24, 26, and 28 as CS pins, but how do I control pin 24?
As far as I've seen, the spidev library doesn't have a function to control the CS pin. (please let me know if I'm wrong)

I saw that controlling pin 24 is possible using WiringPi, so is that the only way to do it?
I realize it might be easier with WiringPi, but I would like to write the code using spidev and libgpiod if possible.
What you are misunderstanding is how device tree overlay works. As mentioned earlier, pins 19/21/23/24 are dedicated to SPI bus include the pin #24 what you are interesting. In order to use the pin as GPIO, we/you have to change the device tree in order to assign the chip select to another pin and remains pin #24 runs as GPIO. Please clarify pin connections for your hardware so that we can help you what can be changed, otherwise it's hard to tell what to change for your project.

alone1224
Posts: 27
Joined: Wed Jul 15, 2015 8:50 pm
languages_spoken: Korean
ODROIDs: C4
Has thanked: 6 times
Been thanked: 2 times
Contact:

Re: Unable to control some GPIO pins

Post by alone1224 »

tobetter wrote:
Tue Jul 02, 2024 11:31 pm
What you are misunderstanding is how device tree overlay works. As mentioned earlier, pins 19/21/23/24 are dedicated to SPI bus include the pin #24 what you are interesting. In order to use the pin as GPIO, we/you have to change the device tree in order to assign the chip select to another pin and remains pin #24 runs as GPIO. Please clarify pin connections for your hardware so that we can help you what can be changed, otherwise it's hard to tell what to change for your project.
1. I will briefly describe the hardware setup of my device.

First, there are three ADCs that digitize signals from analog sensors.
The Odroid-C4 should read the data digitized by the ADCs via SPI communication.
The SPI bus configuration is the multidrop bus configuration.
It connects Odroid's MOSI, MISO, and SCKL (pins 19, 21, and 23, respectively) to the three ADCs simultaneously.
Then connect the three CSs (pins 24, 26, and 28) to each ADC.

Each ADC gives a signal whenever digitizing is complete.
To receive this signal, Odroid uses pins 27, 29, and 31 as interrupts.
In addition, pins 13 and 15 are also connected to all three ADCs simultaneously.
Both pins are output pins, pin 13 is used to synchronize the ADCs and pin 15 is used to reset the ADCs.

2. My last question in the above post is how to use that SS0.
If pin 24 is the CS pin that I know, then it should be able to be set active low when needed.
The method doesn't necessarily have to be a GPIO.

It would be helpful if others could tell me what libraries they use for SPI communication on the Odroid and how they control the CSs.
The wiki page shows how to communicate with SPI useing spidev, but it doesn't use the CS.
(Is WiringPi the only way to go?)

Using other pin besides pin 24 would be an alternative, but I'd like to keep the pin configuration as is if possible for compatibility with the Raspberry Pi.

User avatar
mctom
Posts: 4321
Joined: Wed Nov 11, 2020 4:44 am
languages_spoken: english, polski
ODROIDs: XU4, M1, H3+, SP3, N2L, M1S, N2
Location: Gdańsk, Poland
Has thanked: 638 times
Been thanked: 872 times
Contact:

Re: Unable to control some GPIO pins

Post by mctom »

There are two ways to do SPI on single board computers, in general. One is to use a hardware SPI peripheral, the other is to bitbang SPI interface (which isn't hard to do).

The hardware SPI peripheral is connected to some physical GPIO pins and that cannot be changed. As far as I know there is only one CS pin exposed and you can't move it elsewhere or make more of them.
When using hardware SPI, all you do is writing or reading data. SCK or CS are driven automatically by the Linux driver and you have no control over that.
In general, you shouldn't consider this approach if you have more than one slave on SPI bus.

If you bitbang SPI, your code generates all the waveforms. Below is a link to my SPI master implementation in C++. It reaches some 200kHz on Odroid M1S and uses libgpiod (which is the reason behind this poor performance).
https://github.com/tomek-szczesny/spi-bitbanger

If you develop your own set of low level GPIO-driving functions, you could count on 10-100x better performance. C4 and M1 pin toggle tests reported on this forum maxed at 7-10 MHz.
These users thanked the author mctom for the post:
alone1224 (Thu Jul 04, 2024 9:37 pm)
Punk ain't no religious cult, punk means thinking for yourself!
OpenUPS
PiStackMon

User avatar
tobetter
Posts: 13379
Joined: Mon Feb 25, 2013 10:55 am
languages_spoken: Korean, English
ODROIDs: Many
Location: Paju, South Korea
Has thanked: 1033 times
Been thanked: 2328 times
Contact:

Re: Unable to control some GPIO pins

Post by tobetter »

alone1224 wrote:
Wed Jul 03, 2024 11:10 pm
tobetter wrote:
Tue Jul 02, 2024 11:31 pm
What you are misunderstanding is how device tree overlay works. As mentioned earlier, pins 19/21/23/24 are dedicated to SPI bus include the pin #24 what you are interesting. In order to use the pin as GPIO, we/you have to change the device tree in order to assign the chip select to another pin and remains pin #24 runs as GPIO. Please clarify pin connections for your hardware so that we can help you what can be changed, otherwise it's hard to tell what to change for your project.
1. I will briefly describe the hardware setup of my device.

First, there are three ADCs that digitize signals from analog sensors.
The Odroid-C4 should read the data digitized by the ADCs via SPI communication.
The SPI bus configuration is the multidrop bus configuration.
It connects Odroid's MOSI, MISO, and SCKL (pins 19, 21, and 23, respectively) to the three ADCs simultaneously.
Then connect the three CSs (pins 24, 26, and 28) to each ADC.

Each ADC gives a signal whenever digitizing is complete.
To receive this signal, Odroid uses pins 27, 29, and 31 as interrupts.
In addition, pins 13 and 15 are also connected to all three ADCs simultaneously.
Both pins are output pins, pin 13 is used to synchronize the ADCs and pin 15 is used to reset the ADCs.

2. My last question in the above post is how to use that SS0.
If pin 24 is the CS pin that I know, then it should be able to be set active low when needed.
The method doesn't necessarily have to be a GPIO.

It would be helpful if others could tell me what libraries they use for SPI communication on the Odroid and how they control the CSs.
The wiki page shows how to communicate with SPI useing spidev, but it doesn't use the CS.
(Is WiringPi the only way to go?)

Using other pin besides pin 24 would be an alternative, but I'd like to keep the pin configuration as is if possible for compatibility with the Raspberry Pi.
Since OP's profile shows that the primary language is Korean, let me response in Korean in order to help this thread.

우선, 24번핀을 GPIO로 사용하실 수 없다는 의미로 질문을 첫 질문을 올리신 것으로 알고 24번핀 SPI의 CS핀으로 할당되어 있기 때문에 일반 GPIO로 사용하려면 SPI의 CS핀을 24번에서 다른 핀으로 옮겨야 24번핀이 일반 GPIO로 변경이 된다는 의미로 답변을 드렸습니다. 그런데, 이번에 주신 회신의 내용을 보면 외부에 SPI 버스로 연결되는 ADC 부품을 연결하시고, 내용을 보면 아마도 동일한 부품 3개를 연결하신 것으로 보입니다. 그리고 24번 핀을 GPIO로 컨트롤 하려는 이유가 아마도 3개의 ADC칩을 드라이버나 혹은 어플리케이션에서 직접 LOW ACTIVE시켜서 버스에 접근하려고 하시는데, 24번 핀을 WiringPi나 SYSFS로 제어가 안되서 질문을 올리신 것으로 최종적으로 이해가 되었습니다. 혹시 지금까지의 이해가 틀리면 알려주시기 바랍니다.

제가 위에 이해한대로 말씀을 드리면, 특별한 이유가 없고 WiringPi가 아니라 말씀하신 바와 같이 spidev등으로 직접 접근을 하시려면 의도하신 바와같이 24번핀을 LOW로 직접 안내려도 됩니다. 그 이유는 말씀드린 바와 같이 24번핀은 SPI버스의 CS/SS핀으로 이미 할당이 되어 있고 /dev/spi0.0을 오픈하여 해당 노드로 SPI통신을 진행하면 24번핀은 SPI버스의 CS/SS핀으로 ACTIVE하게 H/W적으로 동작하게 됩니다. 즉, SPI버스를 spidev드라이버로 동작하도록 되어 있고 CS핀을 device tree에 이미 할당한 경우라면 CS/SS핀을 어떻게 제어하는가에 대한 고민은 소프트웨어적으로 할 필요가 없어집니다.

위의 내용을 좀 더 진행해서, ADC칩 3개를 연결해야 하는 경우가 맞다면 질문은 3개의 CS/SS핀을 각 ADC칩에 연결하여 각각의 ADC칩을 어떻게 접근하는가가 질문이 됩니다.

변경된 질문을 기반으로 설명을 드리면, 현재 기본적으로 하나의 SPI버스에 2개의 CS/SS핀이 설정되어 있고 이는 2개의 독립적인 SPI부품이 개별적으로 연결 가능하다는 의미입니다. 그리고, 각 부품은 /dev/spidev0.0 그리고 /dev/spidev0.1로 각각 구별된 디바이스 노드로 접근이 가능해집니다. 그리고, 제가 이해한 바에 의하면 3개의 ADC를 접근해야 하기 때문에 /dev/spidev0.2가 필요하신 상황입니다. 말씀드린 바와 같이 현재는 2개의 CS/SS핀이 할당되어 있기 때문에 하나의 CS/SS핀을 추가하기 위해 device tree를 수정해야 하며, 이는 아래 링크의 코드를 확인해보시기 바랍니다. 아래 링크의 내용을 보시면, cs-gpios = ...라인에 GPIOX_10과 GPIOH_6이 정의되어 있고, 이는 ODROID-C4의 GPIO핀 24번/26번 핀에 해당합니다.
https://github.com/hardkernel/linux/blo ... 4.dts#L993

하나의 CS/SS핀을 추가하기 위해서는 위 라인을 수정해야 하고 질문 중에 설명주신 내용에 따라 28번 핀에 CS/SS핀을 설정해야 하는 경우라면 아래와 같이 수정한 후 device tree를 새로 빌드해야 할 것으로 보입니다.

Code: Select all

	num_chipselect = <3>;

	cs-gpios = <&gpio GPIOX_10 GPIO_ACTIVE_LOW>,
		<&gpio GPIOH_6 GPIO_ACTIVE_LOW>,
		<&gpio GPIOA_15 GPIO_ACTIVE_LOW>;
수정되지 않은 현재의 device tree를 사용한 경우 /dev/spi0.0/dev/spi0.1이 존재하는지 먼저 확인하시고, 각각의 노드를 통해서 SPI버스의 디바이스에 접근이 되는지 먼저 확인해보시기 바랍니다. 그리고, 만약에 각각의 노드를 접근해서 SPI통신을 하는 경우 CS/SS핀이 정상적으로 움직이는 것이 보이지 않는다거나 하는 부분이 발견되면 알려주시기 바랍니다. 제가 이해하는 내용이 틀릴 수 있기 때문에 제가 설명드린 내용과 다르다면 조금 더 확인하고 보충하도록 하겠습니다.

그리고, 어떤 ADC를 사용하시는지 모르겠습니다만 만약에 현재 사용하는 커널버전에 해당 ADC에 대한 드라이버가 있다면 그 드라이버를 이용하는 것이 오버헤드를 줄이는 것 아닌가 싶습니다. 기존에 어떤 방식으로 ADC칩을 사용하셨는지 모르겠습니다만, spidev를 통해서 SPI버스를 접근하는 경우 인터럽트를 어떻게 제어할 수 있는지 궁금합니다.
These users thanked the author tobetter for the post:
alone1224 (Thu Jul 04, 2024 9:37 pm)

alone1224
Posts: 27
Joined: Wed Jul 15, 2015 8:50 pm
languages_spoken: Korean
ODROIDs: C4
Has thanked: 6 times
Been thanked: 2 times
Contact:

Re: Unable to control some GPIO pins

Post by alone1224 »

mctom wrote:
Wed Jul 03, 2024 11:34 pm
There are two ways to do SPI on single board computers, in general. One is to use a hardware SPI peripheral, the other is to bitbang SPI interface (which isn't hard to do).

The hardware SPI peripheral is connected to some physical GPIO pins and that cannot be changed. As far as I know there is only one CS pin exposed and you can't move it elsewhere or make more of them.
When using hardware SPI, all you do is writing or reading data. SCK or CS are driven automatically by the Linux driver and you have no control over that.
In general, you shouldn't consider this approach if you have more than one slave on SPI bus.

If you bitbang SPI, your code generates all the waveforms. Below is a link to my SPI master implementation in C++. It reaches some 200kHz on Odroid M1S and uses libgpiod (which is the reason behind this poor performance).
https://github.com/tomek-szczesny/spi-bitbanger

If you develop your own set of low level GPIO-driving functions, you could count on 10-100x better performance. C4 and M1 pin toggle tests reported on this forum maxed at 7-10 MHz.
I didn't realize there were 2 ways to communicate with SPI, thanks for the clarification. It helped me to understand.

alone1224
Posts: 27
Joined: Wed Jul 15, 2015 8:50 pm
languages_spoken: Korean
ODROIDs: C4
Has thanked: 6 times
Been thanked: 2 times
Contact:

Re: Unable to control some GPIO pins

Post by alone1224 »

tobetter wrote:
Thu Jul 04, 2024 12:06 am
Since OP's profile shows that the primary language is Korean, let me response in Korean in order to help this thread.

우선, 24번핀을 GPIO로 사용하실 수 없다는 의미로 질문을 첫 질문을 올리신 것으로 알고 24번핀 SPI의 CS핀으로 할당되어 있기 때문에 일반 GPIO로 사용하려면 SPI의 CS핀을 24번에서 다른 핀으로 옮겨야 24번핀이 일반 GPIO로 변경이 된다는 의미로 답변을 드렸습니다. 그런데, 이번에 주신 회신의 내용을 보면 외부에 SPI 버스로 연결되는 ADC 부품을 연결하시고, 내용을 보면 아마도 동일한 부품 3개를 연결하신 것으로 보입니다. 그리고 24번 핀을 GPIO로 컨트롤 하려는 이유가 아마도 3개의 ADC칩을 드라이버나 혹은 어플리케이션에서 직접 LOW ACTIVE시켜서 버스에 접근하려고 하시는데, 24번 핀을 WiringPi나 SYSFS로 제어가 안되서 질문을 올리신 것으로 최종적으로 이해가 되었습니다. 혹시 지금까지의 이해가 틀리면 알려주시기 바랍니다.

제가 위에 이해한대로 말씀을 드리면, 특별한 이유가 없고 WiringPi가 아니라 말씀하신 바와 같이 spidev등으로 직접 접근을 하시려면 의도하신 바와같이 24번핀을 LOW로 직접 안내려도 됩니다. 그 이유는 말씀드린 바와 같이 24번핀은 SPI버스의 CS/SS핀으로 이미 할당이 되어 있고 /dev/spi0.0을 오픈하여 해당 노드로 SPI통신을 진행하면 24번핀은 SPI버스의 CS/SS핀으로 ACTIVE하게 H/W적으로 동작하게 됩니다. 즉, SPI버스를 spidev드라이버로 동작하도록 되어 있고 CS핀을 device tree에 이미 할당한 경우라면 CS/SS핀을 어떻게 제어하는가에 대한 고민은 소프트웨어적으로 할 필요가 없어집니다.

위의 내용을 좀 더 진행해서, ADC칩 3개를 연결해야 하는 경우가 맞다면 질문은 3개의 CS/SS핀을 각 ADC칩에 연결하여 각각의 ADC칩을 어떻게 접근하는가가 질문이 됩니다.

변경된 질문을 기반으로 설명을 드리면, 현재 기본적으로 하나의 SPI버스에 2개의 CS/SS핀이 설정되어 있고 이는 2개의 독립적인 SPI부품이 개별적으로 연결 가능하다는 의미입니다. 그리고, 각 부품은 /dev/spidev0.0 그리고 /dev/spidev0.1로 각각 구별된 디바이스 노드로 접근이 가능해집니다. 그리고, 제가 이해한 바에 의하면 3개의 ADC를 접근해야 하기 때문에 /dev/spidev0.2가 필요하신 상황입니다. 말씀드린 바와 같이 현재는 2개의 CS/SS핀이 할당되어 있기 때문에 하나의 CS/SS핀을 추가하기 위해 device tree를 수정해야 하며, 이는 아래 링크의 코드를 확인해보시기 바랍니다. 아래 링크의 내용을 보시면, cs-gpios = ...라인에 GPIOX_10과 GPIOH_6이 정의되어 있고, 이는 ODROID-C4의 GPIO핀 24번/26번 핀에 해당합니다.
https://github.com/hardkernel/linux/blo ... 4.dts#L993

하나의 CS/SS핀을 추가하기 위해서는 위 라인을 수정해야 하고 질문 중에 설명주신 내용에 따라 28번 핀에 CS/SS핀을 설정해야 하는 경우라면 아래와 같이 수정한 후 device tree를 새로 빌드해야 할 것으로 보입니다.

Code: Select all

	num_chipselect = <3>;

	cs-gpios = <&gpio GPIOX_10 GPIO_ACTIVE_LOW>,
		<&gpio GPIOH_6 GPIO_ACTIVE_LOW>,
		<&gpio GPIOA_15 GPIO_ACTIVE_LOW>;
수정되지 않은 현재의 device tree를 사용한 경우 /dev/spi0.0/dev/spi0.1이 존재하는지 먼저 확인하시고, 각각의 노드를 통해서 SPI버스의 디바이스에 접근이 되는지 먼저 확인해보시기 바랍니다. 그리고, 만약에 각각의 노드를 접근해서 SPI통신을 하는 경우 CS/SS핀이 정상적으로 움직이는 것이 보이지 않는다거나 하는 부분이 발견되면 알려주시기 바랍니다. 제가 이해하는 내용이 틀릴 수 있기 때문에 제가 설명드린 내용과 다르다면 조금 더 확인하고 보충하도록 하겠습니다.

그리고, 어떤 ADC를 사용하시는지 모르겠습니다만 만약에 현재 사용하는 커널버전에 해당 ADC에 대한 드라이버가 있다면 그 드라이버를 이용하는 것이 오버헤드를 줄이는 것 아닌가 싶습니다. 기존에 어떤 방식으로 ADC칩을 사용하셨는지 모르겠습니다만, spidev를 통해서 SPI버스를 접근하는 경우 인터럽트를 어떻게 제어할 수 있는지 궁금합니다.
안녕하세요. 답변 감사합니다.
(아무래도 영어 커뮤니티가 더 크다보니 힘들게 영어로 질문했는데, 저도 설명하기 어려웠던 부분이 있었습니다.)

질문은 이해하신 바가 맞습니다.
처음에는 sysfs로 24번 핀 컨트롤이 안 되서 첫 질문을 올린것인데, 그 다음은 24번이 SS핀이라면 어떤 방식으로든 컨트롤이 가능해야 한다고 생각해서 그 부분을 질문드렸었습니다.

제가 임베디드 경험이 많지 않다보니 SPI를 편법(?)으로 이용하고 있었나보네요. 저는 하나의 spi device로 3개의 ADC와 통신을 하려고 했습니다;;
실제로 Raspberry Pi에서는 이 방법으로도 통신을 잘 했습니다. 어차피 SPI 라인은 모든 slave에 동시에 연결되어 있고, 내가 통신하고 싶은 녀석의 CS만 active low 시키는 방식으로...
pigpio로 하나의 spi 채널만 오픈하고 CS는 GPIO 다루듯 컨트롤 하니 원하는 대로 잘 동작 하였었습니다.

/dev/spi0.1 존재 유무, device tree 컴파일 결과 등은 확인되는대로 올리도록 하겠습니다.

당초 계획은 spidev와 libgpiod를 함께 사용하여 코드를 작성할 계획이었습니다.
(spidev로 SPI 통신을 하고, 인터럽트는 libgpiod로 처리)

ADC는 TI사의 ADS1256을 사용하고 있습니다.
죄송한데 이런 드라이버는 어디서 찾아야 하나요?;;
(드라이버가 없더라도 기존에 Raspberry Pi에서 사용하던 C 코드가 있어서 pigpio만 spidev와 libgpiod로 대체할 수 있으면 괜찮을 것 같습니다.)

항상 답변을 통해 많이 배웁니다.
감사합니다.

User avatar
tobetter
Posts: 13379
Joined: Mon Feb 25, 2013 10:55 am
languages_spoken: Korean, English
ODROIDs: Many
Location: Paju, South Korea
Has thanked: 1033 times
Been thanked: 2328 times
Contact:

Re: Unable to control some GPIO pins

Post by tobetter »

alone1224 wrote:
Thu Jul 04, 2024 11:21 pm
안녕하세요. 답변 감사합니다.
(아무래도 영어 커뮤니티가 더 크다보니 힘들게 영어로 질문했는데, 저도 설명하기 어려웠던 부분이 있었습니다.)

질문은 이해하신 바가 맞습니다.
처음에는 sysfs로 24번 핀 컨트롤이 안 되서 첫 질문을 올린것인데, 그 다음은 24번이 SS핀이라면 어떤 방식으로든 컨트롤이 가능해야 한다고 생각해서 그 부분을 질문드렸었습니다.
제가 이해한 바가 맞다니 다행입니다. :)
제가 임베디드 경험이 많지 않다보니 SPI를 편법(?)으로 이용하고 있었나보네요. 저는 하나의 spi device로 3개의 ADC와 통신을 하려고 했습니다;;
SPI버스가 동작하는 방식에서 벗어나지 않으므로 편법은 아닌 것 같습니다. 다만, 24번 핀의 목적에 대한 물음표가 생겼는데 일단 해결의 실마리가 보이는 듯 합니다.
실제로 Raspberry Pi에서는 이 방법으로도 통신을 잘 했습니다. 어차피 SPI 라인은 모든 slave에 동시에 연결되어 있고, 내가 통신하고 싶은 녀석의 CS만 active low 시키는 방식으로...
pigpio로 하나의 spi 채널만 오픈하고 CS는 GPIO 다루듯 컨트롤 하니 원하는 대로 잘 동작 하였었습니다.
pigpio는 어떻게 통신을 하는지 보질 않아서 잘 모르겠습니다만, 오드로이드에 포팅된 WiringPi에서 SPI는 spidev를 사용하는 것으로 알고 있습니다. 그래서, WiringPi로 SPI를 사용하나 spidev드라이버를 직접 이용하는 방법이나 결과적으로는 동일합니다. 제가 이해하는 바로는 RPi는 single bus single channel로 동작하기 때문에 의도적으로 CS를 제어해서 통신하는게 맞는 것 같습니다.
/dev/spi0.1 존재 유무, device tree 컴파일 결과 등은 확인되는대로 올리도록 하겠습니다.
확인해서 알려주시면 그에 따른 도움을 드릴 수 있도록 하겠습니다.
당초 계획은 spidev와 libgpiod를 함께 사용하여 코드를 작성할 계획이었습니다.
(spidev로 SPI 통신을 하고, 인터럽트는 libgpiod로 처리)
이해했습니다. 감사합니다.
ADC는 TI사의 ADS1256을 사용하고 있습니다.
죄송한데 이런 드라이버는 어디서 찾아야 하나요?;;
ADC드라이버 같은 경우는 보통 리눅스 커널 소스 트리의 drivers/iio/adc 아래에 있거나 간혹 다른 카테고리로 분류되어 다른 디렉토리에 있기도 합니다.
ADS1256을 찾아보니 해당 칩에 대한 드라이버는 없어보이고, 레지스터 맵이 호환되는 다른 ADC드라이버가 있는 경우라면 일부 수정해서 사용 가능할 것 같다는 생각이 듭니다.
(드라이버가 없더라도 기존에 Raspberry Pi에서 사용하던 C 코드가 있어서 pigpio만 spidev와 libgpiod로 대체할 수 있으면 괜찮을 것 같습니다.)
libgpiod로 인터럽트를 처리하는 것에 대한 직접적인 경험이 없어 현재는 도움을 드릴 수 있는 내용이 없으나, libgpiod로 인터럽트를 처리하면서 ADC의 데이터 수집 성능이 어떤지 궁금합니다.
항상 답변을 통해 많이 배웁니다.
감사합니다.
저 또한 올려주시는 글들과 질문들로 다시 한 번 살펴보고 찾아보는 계기가 되고 있습니다.
궁금하신 내용 있으시면 한글로 올려주셔도 됩니다. 지금 검토하시는 내용들은 국내 개발자들이 도움을 드려야 하는 내용이 많은 듯 싶습니다.
감사합니다.
These users thanked the author tobetter for the post:
alone1224 (Fri Jul 05, 2024 7:52 am)

User avatar
mctom
Posts: 4321
Joined: Wed Nov 11, 2020 4:44 am
languages_spoken: english, polski
ODROIDs: XU4, M1, H3+, SP3, N2L, M1S, N2
Location: Gdańsk, Poland
Has thanked: 638 times
Been thanked: 872 times
Contact:

Re: Unable to control some GPIO pins

Post by mctom »

I don't even have Korean fonts installed but let's try this. :)

나는 이 흥미로운 대화를 계속할 기회를 놓치고 싶지 않습니다.

내가 기억하는 바에 따르면 pigpio는 GPIO에 매우 빠르게 액세스할 수 있는 RasPi의 DMA 기능을 사용합니다. 이 경우 SPI 포트가 비트뱅 처리되었다고 가정합니다. 즉, SPI 신호는 프로세서 내부의 전용 SPI 하드웨어를 사용하지 않고 시뮬레이션됩니다.
이 때문에 pigpio 구현에서는 모든 GPIO 핀을 사용할 수 있습니다. 이것이 바로 이전 구현에서 3개의 독립적인 CS 신호를 사용할 수 있는 이유라고 생각합니다. RasPi의 핀 28은 하드웨어 CS 핀이 아니며 이는 비트뱅킹을 더욱 나타냅니다.

비트뱅잉은 전용 프로세서 하드웨어를 사용하지 않고 SPI 동작을 에뮬레이트하도록 GPIO 핀을 프로그래밍하는 기술이라는 점을 분명히 해야 합니다. 이러한 이유로 비트뱅킹은 전용 핀뿐만 아니라 모든 GPIO 핀을 사용할 수 있습니다. 또한 이를 사용하기 위해 장치 트리를 수정할 필요가 없습니다. 그러나 이 접근 방식은 전용 하드웨어보다 느린 경우가 많습니다.

이전에는 libgpiod를 사용하는 spi_bitbanger 코드에 대한 링크를 포함했습니다. 이로 인해 모든 ARM Odroid를 포함하여 libgpiod가 지원하는 모든 컴퓨터에서 작동해야 합니다. M1S 테스트에서 내 코드가 초당 200kb에 도달했습니다.

이러한 ADC 칩의 사용 의도에 따라 속도가 너무 느릴 수 있습니다. 각각에는 8개의 입력 채널이 있고 각각 24비트의 데이터가 있습니다. 대략적인 추정으로는 모든 채널에서 초당 약 200개의 샘플만 수집할 수 있을 것입니다.

pigpio 코드를 재사용하려면 libgpiod를 사용하는 것이 가장 좋은 생각일 수 있지만 ADC에서 더 빠른 샘플링 속도가 필요한 경우 하드웨어 SPI 컨트롤러를 사용해야 합니다(spidev 또는 다른 방법을 통해). 그러나 각 ADC의 CS 핀을 비트뱅잉합니다. 다른 기술을 사용하는 칩. 나는 이것이 @tobetter가 제안한 것임을 이해합니다.

SPI는 정적(동적이 아닌)이며 모든 클럭 속도에서 작동할 수 있으므로 이 두 메커니즘을 동기화하는 것은 쉽습니다.

인터럽트는 입력 핀을 폴링하여 처리할 수 있습니다. 이는 주기적으로 상태를 확인하는 것을 의미합니다. 이는 sleep() 명령을 포함하는 루프를 사용하여 달성할 수 있습니다.
These users thanked the author mctom for the post:
alone1224 (Fri Jul 05, 2024 7:52 am)
Punk ain't no religious cult, punk means thinking for yourself!
OpenUPS
PiStackMon

alone1224
Posts: 27
Joined: Wed Jul 15, 2015 8:50 pm
languages_spoken: Korean
ODROIDs: C4
Has thanked: 6 times
Been thanked: 2 times
Contact:

Re: Unable to control some GPIO pins

Post by alone1224 »

mctom wrote:
Fri Jul 05, 2024 12:42 am
I don't even have Korean fonts installed but let's try this. :)

나는 이 흥미로운 대화를 계속할 기회를 놓치고 싶지 않습니다.
Sorry for the Korean language.
I admire your interest and passion.
Thanks to you, I understand the difference between SPI communication using H/W and SPI communication using S/W (bitbanging).
mctom wrote:
Fri Jul 05, 2024 12:42 am
내가 기억하는 바에 따르면 pigpio는 GPIO에 매우 빠르게 액세스할 수 있는 RasPi의 DMA 기능을 사용합니다. 이 경우 SPI 포트가 비트뱅 처리되었다고 가정합니다. 즉, SPI 신호는 프로세서 내부의 전용 SPI 하드웨어를 사용하지 않고 시뮬레이션됩니다.
이 때문에 pigpio 구현에서는 모든 GPIO 핀을 사용할 수 있습니다. 이것이 바로 이전 구현에서 3개의 독립적인 CS 신호를 사용할 수 있는 이유라고 생각합니다. RasPi의 핀 28은 하드웨어 CS 핀이 아니며 이는 비트뱅킹을 더욱 나타냅니다.

비트뱅잉은 전용 프로세서 하드웨어를 사용하지 않고 SPI 동작을 에뮬레이트하도록 GPIO 핀을 프로그래밍하는 기술이라는 점을 분명히 해야 합니다. 이러한 이유로 비트뱅킹은 전용 핀뿐만 아니라 모든 GPIO 핀을 사용할 수 있습니다. 또한 이를 사용하기 위해 장치 트리를 수정할 필요가 없습니다. 그러나 이 접근 방식은 전용 하드웨어보다 느린 경우가 많습니다.

이전에는 libgpiod를 사용하는 spi_bitbanger 코드에 대한 링크를 포함했습니다. 이로 인해 모든 ARM Odroid를 포함하여 libgpiod가 지원하는 모든 컴퓨터에서 작동해야 합니다. M1S 테스트에서 내 코드가 초당 200kb에 도달했습니다.

이러한 ADC 칩의 사용 의도에 따라 속도가 너무 느릴 수 있습니다. 각각에는 8개의 입력 채널이 있고 각각 24비트의 데이터가 있습니다. 대략적인 추정으로는 모든 채널에서 초당 약 200개의 샘플만 수집할 수 있을 것입니다.
Thanks for the details.
I think it will be difficult to use bitbang SPI for my system due to the speed issue you mentioned.
(The current SPI speed is 1.92 MHz).
Also, I have a lot of other tasks, so I think it would be best to handle SPI with H/W if possible.

When I was developing on the Raspberry Pi, I didn't worry too much about the internal behavior because pigpio allowed me to do whatever I wanted.
Whether the Raspberry Pi was doing SPI as H/W or S/W, I got the speed I wanted (The max. speed is 125 MHz according to the documentation).
I only controlled the CS with gpio and chose which ADC to communicate with on the fly.
This was probably the way I was able to do it because the ADS1256 is not very sensitive (according to its datasheet, the CS can be tied low even).
mctom wrote:
Fri Jul 05, 2024 12:42 am
pigpio 코드를 재사용하려면 libgpiod를 사용하는 것이 가장 좋은 생각일 수 있지만 ADC에서 더 빠른 샘플링 속도가 필요한 경우 하드웨어 SPI 컨트롤러를 사용해야 합니다(spidev 또는 다른 방법을 통해). 그러나 각 ADC의 CS 핀을 비트뱅잉합니다. 다른 기술을 사용하는 칩. 나는 이것이 @tobetter가 제안한 것임을 이해합니다.

SPI는 정적(동적이 아닌)이며 모든 클럭 속도에서 작동할 수 있으므로 이 두 메커니즘을 동기화하는 것은 쉽습니다.
I'll try the normal(?) way of using only spidev for SPI communication first, and if there are too much things to do, I'll consider bitbanging only CS using libgpiod or something.
(This is what you're talking about, right?).
mctom wrote:
Fri Jul 05, 2024 12:42 am
인터럽트는 입력 핀을 폴링하여 처리할 수 있습니다. 이는 주기적으로 상태를 확인하는 것을 의미합니다. 이는 sleep() 명령을 포함하는 루프를 사용하여 달성할 수 있습니다.
I was thinking of polling for interrupts using libgpiod's gpiod_line_event_read function.
But I need to recognize and timestamp the interrupt as quickly as possible.
If there is a better way to do this, please comment.

alone1224
Posts: 27
Joined: Wed Jul 15, 2015 8:50 pm
languages_spoken: Korean
ODROIDs: C4
Has thanked: 6 times
Been thanked: 2 times
Contact:

Re: Unable to control some GPIO pins

Post by alone1224 »

mctom와 같은 외국인 사용자를 위해 어렵지만 영어로 작성하였습니다. :o
tobetter wrote:
Thu Jul 04, 2024 12:06 am
수정되지 않은 현재의 device tree를 사용한 경우 /dev/spi0.0과 /dev/spi0.1이 존재하는지 먼저 확인하시고, 각각의 노드를 통해서 SPI버스의 디바이스에 접근이 되는지 먼저 확인해보시기 바랍니다. 그리고, 만약에 각각의 노드를 접근해서 SPI통신을 하는 경우 CS/SS핀이 정상적으로 움직이는 것이 보이지 않는다거나 하는 부분이 발견되면 알려주시기 바랍니다. 제가 이해하는 내용이 틀릴 수 있기 때문에 제가 설명드린 내용과 다르다면 조금 더 확인하고 보충하도록 하겠습니다.
1. I checked my Odroid-C4 and only have /dev/spi0.0 (OS image: Ubuntu Minimal 22.04 image)
Do I need to do anything extra to enable /dev/spi0.1?
And looking at the pinout on the Odroid-C4 product page, pin 26 is just labeled as a GPIO. Could this be related?

2. I wrote simpe spidev test code that using /dev/spi0.0 and oscilloscoped pin 24, and it works fine. :D

------------------------------------------------------------------------------------------------------------------------------
tobetter wrote:
Fri Jul 05, 2024 12:07 am
libgpiod로 인터럽트를 처리하는 것에 대한 직접적인 경험이 없어 현재는 도움을 드릴 수 있는 내용이 없으나, libgpiod로 인터럽트를 처리하면서 ADC의 데이터 수집 성능이 어떤지 궁금합니다.
I'm new to libgpiod and have only done simple functional tests so far, so I'm not sure how it performs.

In my system, it is important to quickly recognize and timestamp interrupts.
(These interrupts are signaling that data is ready from the ADC, which is important because it leads to time information in the sensor data).
If anyone has a better way than libgpiod, please comment.

WiringPi seems to use memory mapped GPIO registers, would this be faster in terms of interrupt recognition compared to libgpiod?
Googling around, there seems to be something called gpiomem, but I'm having trouble finding documentation on it, so I haven't reviewed it.

User avatar
tobetter
Posts: 13379
Joined: Mon Feb 25, 2013 10:55 am
languages_spoken: Korean, English
ODROIDs: Many
Location: Paju, South Korea
Has thanked: 1033 times
Been thanked: 2328 times
Contact:

Re: Unable to control some GPIO pins

Post by tobetter »

alone1224 wrote:
Fri Jul 05, 2024 9:47 am
mctom와 같은 외국인 사용자를 위해 어렵지만 영어로 작성하였습니다. :o
tobetter wrote:
Thu Jul 04, 2024 12:06 am
수정되지 않은 현재의 device tree를 사용한 경우 /dev/spi0.0과 /dev/spi0.1이 존재하는지 먼저 확인하시고, 각각의 노드를 통해서 SPI버스의 디바이스에 접근이 되는지 먼저 확인해보시기 바랍니다. 그리고, 만약에 각각의 노드를 접근해서 SPI통신을 하는 경우 CS/SS핀이 정상적으로 움직이는 것이 보이지 않는다거나 하는 부분이 발견되면 알려주시기 바랍니다. 제가 이해하는 내용이 틀릴 수 있기 때문에 제가 설명드린 내용과 다르다면 조금 더 확인하고 보충하도록 하겠습니다.
1. I checked my Odroid-C4 and only have /dev/spi0.0 (OS image: Ubuntu Minimal 22.04 image)
Do I need to do anything extra to enable /dev/spi0.1?
And looking at the pinout on the Odroid-C4 product page, pin 26 is just labeled as a GPIO. Could this be related?
Let me check, my understanding is that it suppose to be /dev/spi0.1 must be present. Maybe I am wrong.
2. I wrote simpe spidev test code that using /dev/spi0.0 and oscilloscoped pin 24, and it works fine. :D
Thank you for confirmation, which means you do not have the headache about pin 24 any more. When another SPI channel is added, same CS/SS will be observed at another pins probably at pin 26 and pin 28. :crossfinger:
------------------------------------------------------------------------------------------------------------------------------
tobetter wrote:
Fri Jul 05, 2024 12:07 am
libgpiod로 인터럽트를 처리하는 것에 대한 직접적인 경험이 없어 현재는 도움을 드릴 수 있는 내용이 없으나, libgpiod로 인터럽트를 처리하면서 ADC의 데이터 수집 성능이 어떤지 궁금합니다.
I'm new to libgpiod and have only done simple functional tests so far, so I'm not sure how it performs.

In my system, it is important to quickly recognize and timestamp interrupts.
(These interrupts are signaling that data is ready from the ADC, which is important because it leads to time information in the sensor data).
If anyone has a better way than libgpiod, please comment.
As mention in my previous reply, I am not sure how the interrupt works in libgpiod but in general understanding about Linux system, specifically in user space, the interrupt response is slower than how interrupt works in Linux driver. But you have success to manage it with RPi, it probably have no issue. Quick idea to handle interrupt using libgpiod would be to manage a thread per an interrupt so that the thread collect a data from the ADC chip. Maybe @mctom can response if he has an experience.
WiringPi seems to use memory mapped GPIO registers, would this be faster in terms of interrupt recognition compared to libgpiod?
Googling around, there seems to be something called gpiomem, but I'm having trouble finding documentation on it, so I haven't reviewed it.
Technically accessing GPIO register directly from user space is way faster than using libgpiod. But even this way won't let you execute interrupt handler in Linux user space other than polling.

One example to handle an interrupt through GPIO is here, but this does not use libgpiod but it could work for your use case.
viewtopic.php?f=218&t=48700

I wished I can find out a break out board with TI ADS1256, unfortunately not have any. :(

User avatar
mctom
Posts: 4321
Joined: Wed Nov 11, 2020 4:44 am
languages_spoken: english, polski
ODROIDs: XU4, M1, H3+, SP3, N2L, M1S, N2
Location: Gdańsk, Poland
Has thanked: 638 times
Been thanked: 872 times
Contact:

Re: Unable to control some GPIO pins

Post by mctom »

I'll try to contribute some clarification again.

/dev/spi0.1 is the file for communicating through spi0 port, with device number 1 (CS1 is asserted).
I checked C4 schematic and there seem to be no SS1 / CS1 pins in Amlogic chip, only SS0 that we are already aware of.
That's why I think /dev/spi0.1 will not appear. Unless the driver can bitbang additional CS lines, which would be great. :)

I think that the safest way to proceed is to use hardware SPI as discussed before, with CS0 disabled.
Each CS pin (CS0, CS1, CS2) can be separate GPIO that will be asserted manually before and after each SPI transaction.

(By the way, CS pins, or Chip Select, notify chips to ignore SPI transactions, so only one listens at a time).

libgpiod is only one of many ways of interacting with GPIO. It is often preferred because the library works with many ARM computers. However it is relatively slow due to its own overhead.
You can also access GPIO by directly reading certain memory addresses. This is the fastest possible method, and looped pin toggle tests usually reach more than 5MHz.

My old project pistackmon supports a few Odroids and uses direct memory reads and writes to manipulate GPIO quickly and precisely.
It bitbanged precise PWM for 16 LEDs on pistackmon module. In order to achieve this, I used the fastest known to me GPIO manipulation method and placed the PWM into a separate thread with real time priority. See code here:
https://github.com/tomek-szczesny/pista ... ain/sw/src

Unfortunately there is no C4 support because I never owned one, but I believe this could be adapted from N2, which also has Amlogic processor.
This may be the best way for you to poll interrupt inputs very quickly. If the interrupt inputs happen to be represented in the same memory location (which is likely), you could poll all three at the same time.
I think that 10-100us resolution is feasible.

To make things easier, I would drive CS lines with the same memmap method, to avoid mixing three techniques in one project (spidev, libgpiod, direct memory map access).
My SPI bitbanging code converted into memmap approach would also reach about 3MHz data rate, but I've never done it because it's meant to be universal.

I'm sorry if I forgot to address any question, I'm in the office right now, waiting for Windows Update to complete :evil:
Punk ain't no religious cult, punk means thinking for yourself!
OpenUPS
PiStackMon

User avatar
tobetter
Posts: 13379
Joined: Mon Feb 25, 2013 10:55 am
languages_spoken: Korean, English
ODROIDs: Many
Location: Paju, South Korea
Has thanked: 1033 times
Been thanked: 2328 times
Contact:

Re: Unable to control some GPIO pins

Post by tobetter »

@alone1224, can you try this change that creates 3 SPI channels with different 3 CS/SS pins at #24, #26, #28? If you like to test my change, download attached file spi0-2.tar.gz and extract it on your ODROID-C4 and device tree files.

Code: Select all

tar xzvf spi0-2.tar.gz
sudo cp meson64_odroidc4.dtb /media/boot/amlogic/
sudo cp overlays/odroidc4/spi0.dtbo /media/boot/amlogic/overlays/odroidc4/
sudo reboot
If you success to run new device tree blobs, you can find 3 SPI device nodes like below. Unfortunately, I've not tested all three channels but you could try them with your ADC board. Please let me know how it works, we can discuss more if you found an issue.

Code: Select all

$ ls -l /dev/spi*
crw------- 1 root root 153, 0 Nov 21  2023 /dev/spidev0.0
crw------- 1 root root 153, 1 Nov 21  2023 /dev/spidev0.1
crw------- 1 root root 153, 2 Nov 21  2023 /dev/spidev0.2
Here is the code changes for the attached device tree blobs, you can build it by yourself on top of the Linux kernel source tree for ODROID-C4.

Code: Select all

diff --git a/arch/arm64/boot/dts/amlogic/meson64_odroidc4.dts b/arch/arm64/boot/dts/amlogic/meson64_odroidc4.dts
index 328232352b625..1fbe0e5c301db 100644
--- a/arch/arm64/boot/dts/amlogic/meson64_odroidc4.dts
+++ b/arch/arm64/boot/dts/amlogic/meson64_odroidc4.dts
@@ -991,7 +991,32 @@
 	num_chipselect = <2>;
 
 	cs-gpios = <&gpio GPIOX_10 GPIO_ACTIVE_LOW>,
-		   <&gpio GPIOH_6 GPIO_ACTIVE_LOW>;
+		   <&gpio GPIOH_6 GPIO_ACTIVE_LOW>,
+		   <&gpio GPIOA_15 GPIO_ACTIVE_LOW>;
+
+	spidev0: spidev@0 {
+		status = "disabled";
+		compatible = "linux,spidev";
+		reg = <0>;
+		/* spi default max clock 100Mhz */
+		spi-max-frequency = <100000000>;
+	};
+
+	spidev1: spidev@1 {
+		status = "disabled";
+		compatible = "linux,spidev";
+		reg = <1>;
+		/* spi default max clock 100Mhz */
+		spi-max-frequency = <100000000>;
+	};
+
+	spidev2: spidev@2 {
+		status = "disabled";
+		compatible = "linux,spidev";
+		reg = <2>;
+		/* spi default max clock 100Mhz */
+		spi-max-frequency = <100000000>;
+	};
 };
 
 &i2c2 {
diff --git a/arch/arm64/boot/dts/amlogic/overlays/odroidc4/spi0.dts b/arch/arm64/boot/dts/amlogic/overlays/odroidc4/spi0.dts
index 7c6a43b6209a0..39d8ffe8504df 100644
--- a/arch/arm64/boot/dts/amlogic/overlays/odroidc4/spi0.dts
+++ b/arch/arm64/boot/dts/amlogic/overlays/odroidc4/spi0.dts
@@ -7,17 +7,30 @@
 
 		__overlay__ {
 			status = "okay";
+		};
+	};
+
+	fragment@1 {
+		target = <&spidev0>;
+
+		__overlay__ {
+			status = "okay";
+		};
+	};
 
-			#address-cells = <1>;
-			#size-cells = <0>;
+	fragment@2 {
+		target = <&spidev1>;
 
-			spidev: spidev@0 {
-				status = "okay";
-				compatible = "linux,spidev";
-				reg = <0>;
-				/* spi default max clock 100Mhz */
-				spi-max-frequency = <100000000>;
-			};
+		__overlay__ {
+			status = "okay";
+		};
+	};
+
+	fragment@3 {
+		target = <&spidev2>;
+
+		__overlay__ {
+			status = "okay";
 		};
 	};
 };
Attachments
spi0-2.tar.gz
(18.39 KiB) Downloaded 1 time
These users thanked the author tobetter for the post:
mctom (Fri Jul 05, 2024 9:33 pm)

User avatar
mctom
Posts: 4321
Joined: Wed Nov 11, 2020 4:44 am
languages_spoken: english, polski
ODROIDs: XU4, M1, H3+, SP3, N2L, M1S, N2
Location: Gdańsk, Poland
Has thanked: 638 times
Been thanked: 872 times
Contact:

Re: Unable to control some GPIO pins

Post by mctom »

Wow! I really hope this works!
Punk ain't no religious cult, punk means thinking for yourself!
OpenUPS
PiStackMon

Post Reply

Return to “Ubuntu”

Who is online

Users browsing this forum: No registered users and 1 guest