Jump to content

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


GoGerriko

Recommended Posts

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
Link to comment
Share on other sites

@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>;
			};
		};
	};
};

 

 

Link to comment
Share on other sites

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...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...

Important Information

Terms of Use - Privacy Policy - Guidelines