Skip to content
View in the app

A better way to browse. Learn more.

Armbian Community Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Implementing own DTO to use a 2nd custom CS pin with SPI - output not what I expected

Featured Replies

I am using a Linux rockpi-4cplus with 5.15.93-rockchip64 (bullseye).

 

I plan to use SPI1 (GPIO1_A7, GPIO1_B0, GPIO1_B1, GPIO1_B2), and then add in a 2nd device on this SPI bus via a custom CS GPIO pin (GPIO4_D5).

 

I could not find the corresponding script file (.DTS) online (on Github) associated with the object file (rockchip-spi-spidev.dtbo). Please could someone point me to it - I can only find files for "sunxi-DT-overlays".

 

So I decided to create my own DTS file, as follows:


 

/dts-v1/;
/plugin/;

/ {
    fragment@0 {
        target = <&spi1>;

        __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;
            cs-gpio = <0>, <&gpio4 29 0>;
            status = "okay";

            spidev@0 {
                reg = <0>;
                compatible = "spidev";
                status = "okay";
                spi-max-frequency = <5000000>;
            };            
            
            spidev@1 {
                reg = <1>;
                compatible = "spidev";
                status = "okay";
                spi-max-frequency = <50000000>;
            };
        };
    };
};

 

This compiles and I then added in my own DTBO reference inside armbianEnv.txt (under #overlays=). I also included param_spidev_spi_bus=1, as I discovered this is still needed (where is this check made, btw).

 

When I reboot the following shows up for SPI in the device tree:
 

/proc/device-tree/spi@ff1c0000/status: disabled
/proc/device-tree/spi@ff1d0000/spidev@0/status: okay
/proc/device-tree/spi@ff1d0000/status: okay
/proc/device-tree/spi@ff1d0000/spidev@1/status: okay
/proc/device-tree/spi@ff1e0000/status: disabled
/proc/device-tree/spi@ff1f0000/status: disabled
/proc/device-tree/spi@ff200000/status: disabled

 

So far so good.

 

Interestingly you have to use spidev@0 or spidev@1 in an overlay otherwise it won't compile. So already I am at odds with the current Armbian configuration setup logic (as per overlays readme text for using a different CS and armbian just relies on spidev and not spidev@...).

 

I learnt from another Linux board that I can "bind" the spidev to the correct spi drivers and add in a script (e.g. within rc.local to automate). But first I needed to check what has been setup for the spi drivers. This is where I got a surprise.

 

root@rockpi-4cplus:/boot$ ls -l /sys/bus/spi/devices
total 0
lrwxrwxrwx 1 root root 0 Aug  5  2017 spi0.0 -> ../../../devices/platform/ff1d0000.spi/spi_master/spi0/spi0.0
lrwxrwxrwx 1 root root 0 Aug  5  2017 spi0.1 -> ../../../devices/platform/ff1d0000.spi/spi_master/spi0/spi0.1

 

My SPI1 reference in my device tree overlay (i.e. <&spi1>) was showing up here as spi0.

 

How/ why so??

 

(In my opinion this messes other things up... as shown below when using Python).

 

I assume you have done something similar as per sunxi-DT-overlays where you are using aliases (this really is unnecessary, IMHO)
 

fragment@0 {
  target-path = "/aliases";
  __overlay__ {
    spi0 = "/soc/spi@01c68000";
    spi1 = "/soc/spi@01c69000";
  };
};

 

I then bound these by using the following commands:


 

echo spidev > /sys/bus/spi/devices/spi0.0/driver_override
echo spi0.0 > /sys/bus/spi/drivers/spidev/bind

echo spidev > /sys/bus/spi/devices/spi0.1/driver_override
echo spi0.1 > /sys/bus/spi/drivers/spidev/bind

 

Now after a reboot I get:

 

root@rockpi-4cplus:~$ ls -l /dev/spi*
crw------- 1 root root 153, 0 Apr 15 11:17 /dev/spidev0.0
crw------- 1 root root 153, 1 Apr 15 11:17 /dev/spidev0.1

 

I thought this was good enough.

 

However, when I use Python3 together when SPI pin references it does not like it.

It throws an error "OSError: /dev/spidev1.0 does not exist".

 

Any suggestions.

 

Edited by GoGerriko

@GoGerriko To get started, check out this patch:

patch/kernel/archive/rockchip64-5.15/drv-spi-spidev-remove-warnings.patch

 

And then do it by analogy with sunxi64

Скрытый текст
/dts-v1/;
/plugin/;

/ {
	compatible = "allwinner,sun50i-a64";

	fragment@0 {
		target-path = "/aliases";
		__overlay__ {
			spi0 = "/soc/spi@1c68000";
			spi1 = "/soc/spi@1c69000";
		};
	};

	fragment@1 {
		target = <&spi0>;
		__overlay__ {
			#address-cells = <1>;
			#size-cells = <0>;
			spidev@0 {
				compatible = "armbian,spi-dev";
				status = "disabled";
				reg = <0>;
				spi-max-frequency = <1000000>;
			};
		};
	};

	fragment@2 {
		target = <&spi1>;
		__overlay__ {
			#address-cells = <1>;
			#size-cells = <0>;
			spidev@0 {
				compatible = "armbian,spi-dev";
				status = "disabled";
				reg = <0>;
				spi-max-frequency = <1000000>;
			};
		};
	};
};

 

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.