# Measure SPI throughput
Source: [https://docs.qualcomm.com/doc/80-88500-1/topic/33_Measure_SPI_throughput.html](https://docs.qualcomm.com/doc/80-88500-1/topic/33_Measure_SPI_throughput.html)
## Before you begin
The following files are required to perform the SPI throughput test:
| File type | Location |
| --- | --- |
| `spidev` driver | system/lib/modules/spidev.ko |
| `spidev` source code | /vendor/qcom/proprietary/kernel-tests/spi |
| `spidevtest` compiled binary | /data/kernel-tests/spidevtest |
## About this task
To perform the SPI throughput test, do the following:
## Procedure
1. Find the number of SPI masters configured in the system.
adb rootCopy to clipboard
adb wait-for-deviceCopy to clipboard
adb shell Copy to clipboard
cd /sys/class/spi_masterCopy to clipboard
lsCopy to clipboard
The `ls` command lists each `spi master` as a folder under `sysfs`.
2. Load the `spidev` driver module.
cd /system/lib/modulesCopy to clipboard
insmod spidev.ko busnum=0 chipselect=1 maxspeed=50000000Copy to clipboard
Where,
- `busnum=0` means `spi0` is selected
- `chipselect=1` means `cs 1` is selected
- `maxspeed=50000000` limits the maximum SPI transfer speed to 50 MHz
Note: The maximum SPI transfer
speed must be less than the maximum speed defined in the device tree of the SPI
master. Otherwise the following error occurs:
----------------- kernel log --------
spi_qsd 7575000.spi: Invalid transfer: 50000000 Hz, 32 bpw
tx=ffffffc042600000, rx=ffffffc03e280000
--------------------------------------- Copy to clipboard
If an error message is displayed after executing the `insmod` command,
it indicates that different builds are used to compile the system image and boot image.
To resolve this issue, recompile the `spidev.ko` file using the same
build that is used to compile the boot image and push the new build to
/system/lib/modules.
3. Enable the necessary ftrace mask of the SPI driver.
echo "" > /d/tracing/set_eventCopy to clipboard
echo "" > /d/tracing/traceCopy to clipboard
echo 1 > /d/tracing/events/spi/spi_message_submit/enableCopy to clipboard
echo 1 > /d/tracing/events/spi/spi_message_start/enableCopy to clipboard
echo 1 > /d/tracing/events/spi/spi_message_done/enableCopy to clipboard
echo 1 > /d/tracing/events/spi/spi_transfer_start/enableCopy to clipboard
echo 1 > /d/tracing/events/spi/spi_transfer_stop/enableCopy to clipboard
To get the transfer time, use the `delta (spi_message_start, spi_message_done)` method.
4. Execute the SPI transfer:
cd /data/kernel-tests/spiCopy to clipboard
chmod 777 spidevtestCopy to clipboard
Sample output:
./spidevtest spidev0.1 -l -t 4 -z 50000000
./spidevtest spidev0.1 -l -t 4 -z 50000000
Test passed
5. Collect the `ftrace` log.
cat /d/tracing/traceCopy to clipboard
---- Trace log ------
spidevtest-3902 [001] d..3 134.138392: spi_message_submit: spi0.1
ffffffc0b9d77da8
spi0-243 [001] ...1 134.138512: spi_transfer_start: spi0.1
ffffffc0b9d4a480 len=32808
spi0-243 [000] ...1 134.147282: spi_transfer_stop: spi0.1
ffffffc0b9d4a480 len=32808
spi0-243 [000] ...1 134.147357: spi_message_done: spi0.1 ffffffc0b9d77da8
len=32808/32808
spidevtest-3902 [001] d..3 134.147985: spi_message_submit: spi0.1
ffffffc0b9d77da8
spi0-243 [000] ...1 134.148275: spi_message_start: spi0.1
ffffffc0b9d77da8
spi0-243 [000] ...1 134.148326: spi_transfer_start: spi0.1
ffffffc0b9d4a480 len=32808
spi0-243 [000] ...1 134.156654: spi_transfer_stop: spi0.1
ffffffc0b9d4a480 len=32808
spi0-243 [000] ...1 134.156715: spi_message_done: spi0.1 ffffffc0b9d77da8
len=32808/32808
spidevtest-3902 [000] d..3 134.157526: spi_message_submit: spi0.1
ffffffc0b9d77da8
spi0-243 [000] ...1 134.157643: spi_message_start: spi0.1
ffffffc0b9d77da8
spi0-243 [000] ...1 134.157685: spi_transfer_start: spi0.1
ffffffc049119580 len=32808
spi0-243 [000] ...1 134.166033: spi_transfer_stop: spi0.1
ffffffc049119580 len=32808
spi0-243 [000] ...1 134.166095: spi_message_done: spi0.1
ffffffc0b9d77da8 len=32808/32808
6. Calculate the throughput, using the formula: Package\_size \*
8/(1000\*Delta\_time) .
Where, `Delta time = spi_message_done - spi_message_start`. The
`Delta_time` is the duration measured in milliseconds. The SPI
throughput is calculated in Mbps.
Delta\_time\_1: 134.147357 - 134.138474 = 8.883 ms
Delta\_time\_2: 134.156715 - 134.148275 = 8.44 ms
Delta\_time\_3: 134.166095 - 134.157643 = 8.452 ms
Average\_Delta = (8.883 + 8.44 + 8.452)/3 = 8.5916 ms
Throughput = 32808 \* 8/(8.5916 \* 1000) = 30.55 Mbps
Note:To achieve the best SPI
throughput, do the following:
1. Set the SPI transfer parameter setting as N = 32 bits per word, transfer speed =
50 MHz, large payload size.
2. Set the Linux OS governor to the Performance mode and disable the idle power
collapse.
**Parent Topic:** [SPI in QUP](https://docs.qualcomm.com/doc/80-88500-1/topic/30_SPI_in_QUP_v3.html)
Last Published: Aug 18, 2023
[Previous Topic
Add delay between SPI\_CS asserting pin and SPI\_CLK](https://docs.qualcomm.com/bundle/publicresource/80-88500-1/topics/32_Add_delay_time_between_SPI_CS_asserting_pin_and_SPI_CLK.md) [Next Topic
Configure SPI in sensor core](https://docs.qualcomm.com/bundle/publicresource/80-88500-1/topics/34_Configure_SPI_in_sensor_core_.md)