Weitere Àhnliche Inhalte
Ăhnlich wie SPI Drivers (20)
Mehr von SysPlay eLearning Academy for You (13)
KĂŒrzlich hochgeladen (20)
SPI Drivers
- 1. © 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Serial Peripheral Interface (SPI) Drivers
- 2. 2© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
What to Expect?
SPI Prologue
SPI Framework
SPI Framework Components
SPI Client Driver
- 3. 3© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
SPI Prologue
Suitable for small slow devices
SPI is a 4-wire protocol unlike I2
C
Apart from Serial Clock, Data Lines are 2
And an additional Chip Select
- 4. 4© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
SPI Protocol
Memory Memory
0 1 2 3 5 6 7 0 1 2 3 5 6 7
SCLK
MISO
MOSI
CS
Master Slave
- 5. 5© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
SPI Character Driver Framework
User Space
/dev/spi0
cat, echo
my_open() my_read() my_write()
Char Driver
Low Level
SPI Driver
spi_rw() test.c, s1.c
App
open(), read(), write()
- 6. 6© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
AM335X Registers
Module Control Register
For configuring the SPI interface
Single / Multi channel, Master / Slave, Chip select pins
Channel Configuration Register
Used to configure the SPI channel (0-3)
Clock Divider, FIFO for Rx / TX, Pins for TX / RX, DMA RX / TX, SPI Mode (Full
Duplex, Half Duplex), Word Length, SPI Mode
Channel Status Register
Status information for channel (0â3)
RX / TX FIFO Full / Empty
Channel Control Register
Enabling / Disabling the channel
- 7. 7© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
AM335X SPI APIs
omap2_mcspi_set_enable(struct omap2_mcspi *, int enable)
Enable / Disable the channel
int mcspi_wait_for_reg_bit(void __iomem *reg, unsigned
long bit)
Wait for register bit to set
__raw_writel(ch, tx_reg)
For writing into tx_reg
char ch = __raw_readl(rx_reg)
For reading rx_reg
- 8. 8© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
SPI Framework
spi.c â Implements the SPI core layer
include/linux/spi/spi.h
spidev.c â Provides the char interface for spi
devices
include/linux/spi/spidev.h
spi-omap2-mcspi â Controller driver for omap
based chips
- 9. 9© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
SPI Framework
SPI Core
driver/spi/spi.c
mcp320x.c
drivers/iio/adc
SPI based ADC
driver
SPI Client Driver
m25p80.c
drivers/mtd/
SPI based Flash
driver
spi-omap2-mcspi.c
omap SPI Adapter
Driver
atmel-spi.c
Atmel SPI Adapter
Driver
spi-imx.c
IMX SPI Adapter
Driver
spidev.c
drivers/spi
Char driver for
SPI
Industrial IO
Framework
rtc-ds1505.c
drivers/rtc
SPI based RTC
driver
MTD
Framework
RTC
Framework
Char Driver
Framework
spi-altera.c
Altera SPI Adapter
Driver
- 10. 10© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Framework Components
SPI Master
Bus controller which handles the low level h/w transactions
struct spi_master
dev â device interface to this driver
list â linked with global spi_master list
Board specific bus number
min_speed_hz
max_speed_hz
setup â updates the device mode and clock
transfer â adds a message to the controllerâs transfer queue
cleanup â frees up controller specific state
transfer_one_message â the subsystem calls the driver
spi_register_master(spi_master)
- 11. 11© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Framework Components ...
SPI Device
Represents the SPI Slave in the Kernel
struct spi_device
dev â device interface to this driver
master â SPI controller used with the device
max_speed_hz â Maximum clock rate to be used with this device
mode â Defines how the data is clocked out and in
bits_per_word
controller_state â Controllerâs runtime state
controller_data â Board specific definitions for controller such as FIFO
modalias â name of the driver to use with this device
cs_gpio â gpio signal used for chip select line
- 12. 12© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
SPI Client Driver
Host side protocol driver
struct spi_driver
probe â Binds the driver to SPI device
remove â unbinds the driver from the SPI device
id_table â List of SPI devices supported by this driver
driver â name of this driver. This will be used to bind
with SPI slaves
- 13. 13© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
SPI Client Driver ...
Register probe() & remove() with SPI Core
Optionally, register suspend() & resume()
Header: <linux/spi/spi.h>
API
int spi_register_driver(struct spi_driver *);
void spi_unregister_driver(struct spi_driver *);
module_spi_driver()
Device Access APIs
spi_sync(struct spi_device *, struct spi_message *);
spi_async(struct spi_device *, struct spi_message *);
- 14. 14© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
SPI Device Access
/* struct spi_device *spi â obtained through probe */
struct spi_transfer xfer;
struct spi_message sm;
u8 *cmd_buf;
int len;
⊠/* Ready the cmd_buf & its len */ ...
spi_message_init(&sm);
xfer.tx_buf = cmd_buf;
xfer.len = len;
spi_message_add_tail(&xfer, &sm);
spi_sync(spi, &sm); /* Blocking transfer request */
spi_transfer_del(&xfer);
- 15. 15© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
SPI Master Registration Flow
- 17. 17© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
DTB changes for MCP3008
mcp3x0x@0 {
compatible = "mcp3208";
reg = <0>;
spi-max-frequency = <1000000>;
};
- 18. 18© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
SPI Driver Example
Driver: ADC (drivers/iio/adc/mcp320x.c)
Path: <kernel_source>/drivers/spi
Browse & Discuss
- 19. 19© 2010-19 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
What all have we learnt?
SPI Prologue
SPI Framework
SPI Framework Components
SPI Client Driver