RK3568驱动 SPI主/从 配置

发布于:2025-04-05 ⋅ 阅读:(30) ⋅ 点赞:(0)

一、SPI 控制器基础配置(先说主的配置,后面说从的配置)

RK3568 集成高性能 SPI 控制器,支持主从双模式,最高传输速率 50MHz。设备树配置文件路径通常为K3568/rk356x_linux_release_v1.3.1_20221120/kernel/arch/arm64/boot/dts/rockchip

首先内核配置 make menuconfig

Device Drivers --->
[*] SPI support --->
[*] User mode SPI device driver support

用户空间直接操作 SPI 接口,这样方便众多的 SPI 外设驱动跑在用户空间,不需要改到内核,方便驱动移植开发。在/dev下就能看到spi设备。

RK3568 平台共集成4 组 SPI 控制器,每组均支持主从双模式,其中的SPI已经有厂家做好了基础配置如下:


	spi0: spi@fe610000 {
		compatible = "rockchip,rk3066-spi";
		reg = <0x0 0xfe610000 0x0 0x1000>;
		interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;
		#address-cells = <1>;
		#size-cells = <0>;
		clocks = <&cru CLK_SPI0>, <&cru PCLK_SPI0>;
		clock-names = "spiclk", "apb_pclk";
		dmas = <&dmac0 20>, <&dmac0 21>;
		dma-names = "tx", "rx";
		pinctrl-names = "default", "high_speed";
		pinctrl-0 = <&spi0m0_cs0 &spi0m0_cs1 &spi0m0_pins>;
		pinctrl-1 = <&spi0m0_cs0 &spi0m0_cs1 &spi0m0_pins_hs>;
		status = "disabled";
	};

	spi1: spi@fe620000 {
		compatible = "rockchip,rk3066-spi";
		reg = <0x0 0xfe620000 0x0 0x1000>;
		interrupts = <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>;
		#address-cells = <1>;
		#size-cells = <0>;
		clocks = <&cru CLK_SPI1>, <&cru PCLK_SPI1>;
		clock-names = "spiclk", "apb_pclk";
		dmas = <&dmac0 22>, <&dmac0 23>;
		dma-names = "tx", "rx";
		pinctrl-names = "default", "high_speed";
		pinctrl-0 = <&spi1m0_cs0 &spi1m0_cs1 &spi1m0_pins>;
		pinctrl-1 = <&spi1m0_cs0 &spi1m0_cs1 &spi1m0_pins_hs>;
		status = "disabled";
	};

	spi2: spi@fe630000 {
		compatible = "rockchip,rk3066-spi";
		reg = <0x0 0xfe630000 0x0 0x1000>;
		interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
		#address-cells = <1>;
		#size-cells = <0>;
		clocks = <&cru CLK_SPI2>, <&cru PCLK_SPI2>;
		clock-names = "spiclk", "apb_pclk";
		dmas = <&dmac0 24>, <&dmac0 25>;
		dma-names = "tx", "rx";
		pinctrl-names = "default", "high_speed";
		pinctrl-0 = <&spi2m0_cs0 &spi2m0_cs1 &spi2m0_pins>;
		pinctrl-1 = <&spi2m0_cs0 &spi2m0_cs1 &spi2m0_pins_hs>;
		status = "disabled";
	};

	spi3: spi@fe640000 {
		compatible = "rockchip,rk3066-spi";
		reg = <0x0 0xfe640000 0x0 0x1000>;
		interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
		#address-cells = <1>;
		#size-cells = <0>;
		clocks = <&cru CLK_SPI3>, <&cru PCLK_SPI3>;
		clock-names = "spiclk", "apb_pclk";
		dmas = <&dmac0 26>, <&dmac0 27>;
		dma-names = "tx", "rx";
		pinctrl-names = "default", "high_speed";
		pinctrl-0 = <&spi3m0_cs0 &spi3m0_cs1 &spi3m0_pins>;
		pinctrl-1 = <&spi3m0_cs0 &spi3m0_cs1 &spi3m0_pins_hs>;
		status = "disabled";
	};

我目前手上的开发板 的/dev/目录下是没有spi设备的

下面我们修改一下设备树

可以看到 status = "disabled";只需要把 status = "okay";  即可

第一次修改可行的 spi  主 
&spi0 {
        pinctrl-names = "default";
        status = "okay";
        max-freq = <48000000>;
        pinctrl-0 = <&spi0m1_cs0  &spi0m1_pins>;
        pinctrl-1 = <&spi0m1_cs0  &spi0m1_pins_hs>;
        spi_test@0 {
                pinctrl-names = "default";
                reg = <0>;
                compatible = "rockchip,spidev";
                spi-max-frequency = <12000000>;
        };
};

修改完成以后,重新编译内核./build.sh kernel

将编译好的内核烧到板子上,或者再编译成 ./build.sh 直接编译成update.img烧写到板子上

通过pinctrl配置引脚复用

每组 SPI 在设备树中的节点名称为spiX(X=0~3),需通过pinctrl配置引脚复用:

如果要使用spi0m0,那就改一下

        pinctrl-0 = <&spi0m0_cs0  &spi0m0_pins>;
        pinctrl-1 = <&spi0m0_cs0  &spi0m0_pins_hs>;

这两个即可.

可以使用spidev_test工具测试一下,该spidev_test可以自己下载编译,rk源码包里也有(内核 4.19 及以后 tools/spi/spidev_test.c)

可以把spi的输入和输出用杜邦线接在一起,TX和RX的数据就一样了,我这里没接。

二、SPI 控制器 从的配置

主从模式配置需通过以下步骤实现

从首先需要内核先配置一下  make menuconfig

Device Drivers --->
[*] SPI support --->
[*] SPI slave protocol handlers

选中以后 设备树的写法需要更改一下,增加一个

spi-slave; //使能 slave 模式

并且按照框架要求,SPI slave子节点的命名需以 "slave" 开始

&spi0 {
        pinctrl-names = "default";
        status = "okay";
        max-freq = <48000000>;
        pinctrl-0 = <&spi0m1_cs0  &spi0m1_pins>;
        pinctrl-1 = <&spi0m1_cs0  &spi0m1_pins_hs>;
        spi-slave; 
        slave@0 {
                pinctrl-names = "default";
                reg = <0>;
                compatible = "rockchip,spidev";
                spi-max-frequency = <12000000>;
        };
};

必须要这样写,不然 /dev下不出现 spi的设备

可以看到 spi已经是从设备了,因为我当前的设备没有外接别的spi主设备,所以内核打印了没有传输消息的 告警信息。

至此 就完成了RK3568 spi的主/从 设备的设备树配置。


网站公告

今日签到

点亮在社区的每一天
去签到