Home | History | Annotate | Download | only in inc
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef __SPI_H
     18 #define __SPI_H
     19 
     20 #include <inttypes.h>
     21 #include <seos.h>
     22 #include <stdlib.h>
     23 
     24 struct SpiDevice;
     25 
     26 typedef uint8_t spi_cs_t;
     27 typedef uint32_t SpiSpeed;
     28 
     29 typedef void (*SpiCbkF)(void *cookie, int err);
     30 
     31 struct SpiMode {
     32     enum {
     33         SPI_CPOL_IDLE_LO,
     34         SPI_CPOL_IDLE_HI,
     35     } cpol;
     36 
     37     enum {
     38         SPI_CPHA_LEADING_EDGE,
     39         SPI_CPHA_TRAILING_EDGE,
     40     } cpha;
     41 
     42     uint8_t bitsPerWord;
     43     enum {
     44         SPI_FORMAT_LSB_FIRST,
     45         SPI_FORMAT_MSB_FIRST,
     46     } format;
     47 
     48     uint16_t txWord;
     49 
     50     SpiSpeed speed;
     51 
     52     bool nssChange;
     53 };
     54 
     55 struct SpiPacket {
     56     void *rxBuf;
     57     const void *txBuf;
     58     size_t size;
     59     uint32_t delay;
     60 };
     61 
     62 /**
     63  * NOTE:
     64  *
     65  * To avoid copies, spiMasterRxTx() and spiSlaveRxTx() transfer ownership of
     66  * packets[] to the SPI driver.  The SPI driver returns ownership when the
     67  * callback is called.
     68  *
     69  * The caller MUST NOT pass packets[] allocated on the stack, and MUST NOT
     70  * deallocate or otherwise mutate packets[] in the meantime.
     71  */
     72 
     73 int spiMasterRequest(uint8_t busId, struct SpiDevice **dev);
     74 
     75 int spiMasterRxTx(struct SpiDevice *dev, spi_cs_t cs,
     76         const struct SpiPacket packets[], size_t n,
     77         const struct SpiMode *mode, SpiCbkF callback,
     78         void *cookie);
     79 
     80 int spiMasterRelease(struct SpiDevice *dev);
     81 
     82 int spiSlaveRequest(uint8_t busId, const struct SpiMode *mode,
     83         struct SpiDevice **dev);
     84 
     85 int spiSlaveRxTx(struct SpiDevice *dev,
     86         const struct SpiPacket packets[], size_t n,
     87         SpiCbkF callback, void *cookie);
     88 
     89 int spiSlaveWaitForInactive(struct SpiDevice *dev, SpiCbkF callback,
     90         void *cookie);
     91 
     92 int spiSlaveRelease(struct SpiDevice *dev);
     93 #endif /* __SPI_H */
     94