# RK SPI Standalone Bin

This is the readme for the Das U-Boot standalone program rkspi


How To Use
------------------------
### Compile

1.Define the standalone load address in includes/configs/rkxxxxx_common.h

```shell
#define CONFIG_STANDALONE_LOAD_ADDR    0x40000000
```

2.Enable rkspi in defconfig

```
CONFIG_ROCKCHIP_SPI=y
```

### Setting SPI hardware

1.Setting the iomux and spiclk through:

- u-boot shell command
- define it in rkspi.c spi_hw_init

Note:

- spiclk is the clock for spi controller, output to IO after internal frequency division of the controller.

### Load And Executable

1. load the bin by serial or tftp, take tftp as example:

```shell
setenv ipaddr 172.16.12.157
setenv serverip 172.16.12.167
tftp 0x40000000 rkspi.bin		# 0x40000000 is define by CONFIG_STANDALONE_LOAD_ADDR
```

2. execute it

```shell
go 0x40000000		# 0x40000000 is define by CONFIG_STANDALONE_LOAD_ADDR
```

## Abort Codes

### Introduction

```c
int rockchip_spi_probe(u8 bus, uintptr_t base_addr, u32 rsd, u32 clock_div, u32 mode);
```

- bus: spi bus
- base_addr: spi register base address
- rsd: read sample clock shift with spiclk which is controller working rate
- clock_div: internal frequency division of the controller
- mode: spi mode, support:

```c
#define SPI_CPHA	BIT(0)			/* clock phase */
#define SPI_CPOL	BIT(1)			/* clock polarity */
#define SPI_MODE_0	(0 | 0)			/* (original MicroWire) */
#define SPI_MODE_1	(0 | SPI_CPHA)
#define SPI_MODE_2	(SPI_CPOL | 0)
#define SPI_MODE_3	(SPI_CPOL | SPI_CPHA)
```



```c
int rockchip_spi_claim_bus(u8 bus);
```

- bus: spi bus



```c
void rockchip_spi_release_bus(u8 bus);
```

- bus: spi bus



```c
int rockchip_spi_xfer(u8 bus, u8 cs, unsigned int bitlen, const void *dout, void *din, unsigned long flags);
```

- bus: spi bus
- cs: spi cs
- bitlen: the transfer length in bits
- dout: write buffer (if exits)
- din: read buffer (if exits), if the dout and din both defined, spi work in duplex mode
- flags: operation chip select, support:

```c
#define SPI_XFER_BEGIN		BIT(0)	/* Assert CS before transfer */
#define SPI_XFER_END		BIT(1)	/* Deassert CS after transfer */
#define SPI_XFER_ONCE		(SPI_XFER_BEGIN | SPI_XFER_END)
```



```c
int rockchip_spi_write_then_read(u8 bus, u8 cs,
				 const u8 *opcode, size_t n_opcode,
				 const u8 *txbuf, u8 *rxbuf, size_t n_buf);
```

- bus: spi bus
- cs: spi cs
- opcode: command code
- n_opcode: the numbers of command code in bytes
- txbuf: write buffer (if exits)
- rxbuf: read buffer (if exits), if the dout and din both defined, spi work in duplex mode
- n_buf: the transfer length in bytes

### Demo

Is right in the main function of rkspi.