一、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的主/从 设备的设备树配置。