// SPI support. package embd const ( spiCpha = 0x01 spiCpol = 0x02 // SpiMode0 represents the mode0 operation (CPOL=0 CPHA=0) of spi. SpiMode0 = (0 | 0) // SpiMode0 represents the mode0 operation (CPOL=0 CPHA=1) of spi. SpiMode1 = (0 | spiCpha) // SpiMode0 represents the mode0 operation (CPOL=1 CPHA=0) of spi. SpiMode2 = (spiCpol | 0) // SpiMode0 represents the mode0 operation (CPOL=1 CPHA=1) of spi. SpiMode3 = (spiCpol | spiCpha) ) // SPI interface allows interaction with the SPI bus. type SPIBus interface { // TransferAndRecieveData transmits data in a buffer(slice) and receives into it. TransferAndRecieveData(dataBuffer []uint8) error // ReceiveData receives data of length len into a slice. ReceiveData(len int) ([]uint8, error) // TransferAndReceiveByte transmits a byte data and receives a byte. TransferAndReceiveByte(data byte) (byte, error) // ReceiveByte receives a byte data. ReceiveByte() (byte, error) // Close releases the resources associated with the bus. Close() error } // SPIDriver interface interacts with the host descriptors to allow us // control of SPI communication. type SPIDriver interface { Bus(byte, byte, int, int, int) SPIBus Close() error } var spiDriverInitialized bool var spiDriverInstance SPIDriver // InitSPI initializes the SPI driver. func InitSPI() error { if spiDriverInitialized { return nil } desc, err := DescribeHost() if err != nil { return err } if desc.SPIDriver == nil { return ErrFeatureNotSupported } spiDriverInstance = desc.SPIDriver() spiDriverInitialized = true return nil } // CloseSPI releases resources associated with the SPI driver. func CloseSPI() error { return spiDriverInstance.Close() } // NewSPIBus returns a SPIBus. func NewSPIBus(mode, channel byte, speed, bpw, delay int) SPIBus { if err := InitSPI(); err != nil { panic(err) } return spiDriverInstance.Bus(mode, channel, speed, bpw, delay) }