# Rockchip Linux SPI
---
本文介绍 Linux SPI 驱动原理和基本调试方法。
**产品版本**
| **芯片名称** | **内核版本** |
| ------------ | --------------- |
| 采用 linux4.4 的所有芯片 | Linux4.4 |
| 采用 linux4.19 的所有芯片 | Linux4.19 |
**读者对象**
本文档(本指南)主要适用于以下工程师:
技术支持工程师
软件开发工程师
---
[TOC]
---
## Rockchip SPI 功能特点
SPI (serial peripheral interface),以下是 linux 4.4 spi 驱动支持的一些特性︰
* 默认采用摩托罗拉 SPI 协议
* 支持 8 位和 16 位
* 软件可编程时钟频率和传输速率高达 50MHz
* 支持 SPI 4 种传输模式配置
* 每个 SPI 控制器支持一个到两个片选
除以上支持,linux 4.19 新增以下特性:
* 框架支持 slave 和 master 两种模式
## 内核软件
### 代码路径
```c
drivers/spi/spi.c spi驱动框架
drivers/spi/spi-rockchip.c rk spi各接口实现
drivers/spi/spidev.c 创建spi设备节点,用户态使用。
drivers/spi/spi-rockchip-test.c spi测试驱动,需要自己手动添加到Makefile编译
Documentation/spi/spidev_test.c 用户态spi测试工具
```
### 内核配置
```c
Device Drivers --->
[*] SPI support --->
<*> Rockchip SPI controller driver
```
### DTS 节点配置
```c
&spi1 { //引用spi 控制器节点
status = "okay";
max-freq = <48000000>; //spi内部工作时钟
dma-names = "tx","rx"; //使能DMA模式,一般通讯字节少于32字节的不建议用
spi_test@10 {
compatible ="rockchip,spi_test_bus1_cs0"; //与驱动对应的名字
reg = <0>; //片选0或者1
spi-max-frequency = <24000000>; //spi clk输出的时钟频率,不超过50M
status = "okay"; //使能设备节点
};
};
```
一般只需配置以下几个属性就能工作了。
```
spi_test@11 {
compatible ="rockchip,spi_test_bus1_cs1";
reg = <1>;
spi-max-frequency = <24000000>;
status = "okay";
};
```
max-freq 和 spi-max-frequency 的配置说明:
* spi-max-frequency 是 SPI 的输出时钟,是 max-freq 分频后输出的,关系是 max-freq >= 2*spi-max-frequency。
* max-freq 不要低于 24M,否则可能有问题。
* 如果需要配置 spi-cpha 的话, max-freq <= 6M, 1M <= spi-max-frequency >= 3M。
### SPI 设备驱动
设备驱动注册:
```c
static int spi_test_probe(struct spi_device *spi)
{
int ret;
int id = 0;
if(!spi)