SPI 软件说明
===============

软件构架图
-------------

.. image:: ./media/image03_01_zh_CN.png
   :align: center

.. raw:: html

   <html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><center>
       <p>图3-1 SPI软件架构图</p>
   </center></body></html>

如上图3-1为SPI软件架构图，从下到上依次可以分为硬件IP层，内核层和用户空间层，下面依次对各层进行介绍。

-  硬件IP层：该层为SPI硬件层。

-  内核层：又可以细分为3层。

   -  spi driver层：主要实现对SPI硬件IP的操作，另外还实现了spi
      framework定义的接口。

   -  spi framework层：可以理解为spi
      driver的适配层，对下层定义了一组driver层需要实现的接口，对上提供了通用接口屏蔽了硬件细节。

   -  spi char
      device层：为用户空间提供节点，方便用户空间与内核空间进行数据交换。

      -  spidev驱动：kernel自带的spidev字符设备，用于操作Acore控制的spi硬件。（默认配置项已关闭）

      -  hobot_spidev驱动：针对hobotspi协议做了很多定制，改写了read和writer接口，ioctl功能保持与内核一致。用于操作Acore控制的spi硬件。（默认配置项已打开）

      -  spi-prot驱动：该驱动包含两部分功能，一部分功能是做虚拟通道的管理；另一部分功能实现了我司自定义的spi协议；只有7线SPI传输才会用到这部分代码。

-  app层：为各种应用程序，这些应用程序通过调用字符设备驱动达到与内核空间数据交换的目的。

SPI 相关代码位置
-------------------

Hobot SPI 协议代码
~~~~~~~~~~~~~~~~~~~~~

hobot spi驱动相关代码都放在\ **$project/hobot-drivers/spi**\ 目录下

.. code:: bash

   oops@tiger$ tree . -L 1

   ├── Kconfig                       # Kconfig相关

   ├── README.md

   ├── spi_drv                       # spi driver相关

   └── spi_protocol                  # spi protocol相关

**$project/hobot-drivers/spi/spi_drv**\ 目录说明

.. code:: bash

   oops@tiger$ tree . -L 1

   ├── hobot_spidev.c                 # hobot_spidev驱动

   ├── Makefile

   ├── spi-dw.c                       # spi驱动核心代码

   ├── spi-dw.h

   ├── spi-dw-mmio.c                  # spi驱动mmio代码

   └── spi-dw-mmio-dma.c              # spi驱动dma代码

**$project/hobot-drivers/spi/spi_protocol**\ 目录说明

.. code:: bash

  oops@tiger$ tree . -L 1

   ├── Makefile

   ├── spi-dw-stl.c

   ├── spi-hobot-protocol.c            # 1. hobot spi协议实现代

   ├── spi-manage.c                    # 2. 虚拟通道管理代码

   ├── spi-manage.h

   ├── spi-prot-module.c               # 3. spi-prot驱动入口

   ├── spi-protocol.c                  # 4. hobot spi协议抽象层

   └── spi-protocol.h


spi 配置config可以参考一下图片

.. image:: ./media/image03_N0_zh_CN.png
   :align: center

Linux SPI 框架代码
~~~~~~~~~~~~~~~~~~~~~

Linux spi协议相关代码都放在\ **$project/kernel/drivers/spi**\ 目录下

.. code:: bash

   oops@tiger$ tree kernel/drivers/spi/
   drivers/spi/
   ├── spi.c                             # spi框架代码

   oops@tiger$

SPI 设备树代码
~~~~~~~~~~~~~~~~~

如下dts是J6X相关的dts文件：

.. code:: bash

   oops@tiger$ tree hobot-drivers/kernel-dts
   hobot-drivers/kernel-dts (spi-test) $ tree

   ├── hobot-j6e-camsys.dtsi
   ├── hobot-j6e-cvb.dts
   ├── hobot-j6e-evm-camsys.dtsi
   ├── hobot-j6e-evm.dts
   ├── hobot-j6e-fchm.dtsi
   ├── hobot-j6e-ipc.dtsi
   ├── hobot-j6e-irq-r0p5.dtsi
   ├── hobot-j6e-irq-r0p9e2.dtsi
   ├── hobot-j6e-matrix-camsys.dtsi
   ├── hobot-j6e-matrix.dts             # matrix设备树
   ├── hobot-j6e-matrix-sip.dts
   ├── hobot-j6e-pdma.dtsi
   ├── hobot-j6e-pm.dtsi
   ├── hobot-j6e-regmap.dtsi
   ├── hobot-j6e-scmi.dtsi
   ├── hobot-j6e-soc.dtsi
   ├── hobot-j6e-uio.dtsi
   ├── hobot-j6e-videosys.dtsi
   ├── hobot-pinctrl-j6e.dtsi
   ├── hobot-pinctrl-j6p.dtsi
   ├── include
   │   ├── hb_pwr_recovery.h
   │   ├── hb_reboot_mode.h
   │   ├── hb_reboot_reason.h
   │   ├── hb_regmap.h
   │   ├── hb_suspend_mode.h
   │   ├── hobot_j6e_clk.h
   │   ├── hobot_j6e_pd.h
   │   ├── hobot_j6e_perf.h
   │   ├── hobot_j6e_rst.h
   │   ├── hobot_j6e_sensor.h
   │   └── hobot_j6e_volt.h
   ├── Makefile
   └── README.md


SPI 设备树配置说明
---------------------

.. code:: bash

   # hobot-drivers/kernel-dts/hobot-j6e-matrix.dts
   spi0: spi@39800000 {
           compatible = "hobot,hb-dw-spi";
           reg-io-width = <4>;
           #address-cells = <1>;
           #size-cells = <0>;
           reg = <0x0 0x39800000 0x0 0x1000>;
           interrupts = <GIC_SPI PERISYS_SPI0_SSI_INTR PERISYS_SPI0_SSI_INTR_TRIG_TYPE>;
           status = "okay";
           num-cs = <2>;
           clocks = <&clk_62p5m>;
           clock-names = "apb_pclk";
           freq-pclk = <200000000>;
           sample-delay = <1>;
           pinctrl-names = "default";
           pinctrl-0 = <&peri_spi0>;
           dmas = <&pdma0 8			/* read channel */
           &pdma0 9	>;		/* write channel */
           dma-names = "rx", "tx";
           spidev@0 {
           compatible = "rohm,dh2228fv";
           spi-max-frequency = <50000000>;
           reg = <0>;
           };
   };

   spi1: spi@39810000 {
           compatible = "hobot,hb-dw-spi";
           reg-io-width = <4>;
           #address-cells = <1>;
           #size-cells = <0>;
           reg = <0x0 0x39810000 0x0 0x1000>;
           interrupts = <GIC_SPI PERISYS_SPI1_SSI_INTR PERISYS_SPI1_SSI_INTR_TRIG_TYPE>;
           status = "okay";
           num-cs = <2>;
           clocks = <&clk_62p5m>;
           clock-names = "apb_pclk";
           freq-pclk = <13000000>;
           sample-delay = <1>;
           pinctrl-names = "default";
           pinctrl-0 = <&peri_spi1>;
           dmas = <&pdma0 10			/* read channel */
           &pdma0 11	>;		/* write channel */
           dma-names = "rx", "tx";
           spidev@0 {
           compatible = "rohm,dh2228fv";
           spi-max-frequency = <13000000>;
           reg = <0>;
           };
   };

SPI 设备树配置项说明
~~~~~~~~~~~~~~~~~~~~~~~

这里着重说明J6X SPI新增的配置项

-  sample-delay：spi控制器作master时，对接收数据的采样延迟值，如果出现数据bit位错位的情况，可以调整该值。

-  num-cs：spi控制器作master时，支持cs个数，J6X SPI作master时，最多支持两个片选。

