2 * Copyright (c) 2016-2017 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
23 #include <sys/ioctl.h>
24 #include <linux/spi/spidev.h>
26 #include "peripheral_interface_spi.h"
27 #include "peripheral_common.h"
28 #include "peripheral_internal.h"
30 #define SYSFS_SPI_DIR "/dev/spidev"
31 #define SYSFS_SPI_BUFSIZ "/sys/module/spidev/parameters/bufsiz"
32 #define SPI_BUFFER_MAX 64
33 #define MAX_ERR_LEN 255
35 int peripheral_interface_spi_close(peripheral_spi_h spi)
39 _D("fd : %d", spi->fd);
40 RETVM_IF(spi->fd < 0, -EINVAL, "Invalid fd");
42 status = close(spi->fd);
44 char errmsg[MAX_ERR_LEN];
45 strerror_r(errno, errmsg, MAX_ERR_LEN);
46 _E("Failed to close fd : %d", spi->fd);
53 int peripheral_interface_spi_set_mode(peripheral_spi_h spi, unsigned char mode)
57 _D("fd : %d, mode : %d", spi->fd, mode);
58 RETVM_IF(spi->fd < 0, -EINVAL, "Invalid fd");
60 status = ioctl(spi->fd, SPI_IOC_WR_MODE, &mode);
62 char errmsg[MAX_ERR_LEN];
63 strerror_r(errno, errmsg, MAX_ERR_LEN);
64 _E("Failed to set mode(%d) : %s", mode, errmsg);
71 int peripheral_interface_spi_set_bit_order(peripheral_spi_h spi, unsigned char lsb)
75 _D("fd : %d, lsb : %d", spi->fd, lsb);
76 RETVM_IF(spi->fd < 0, -EINVAL, "Invalid fd");
78 status = ioctl(spi->fd, SPI_IOC_WR_LSB_FIRST, &lsb);
80 char errmsg[MAX_ERR_LEN];
81 strerror_r(errno, errmsg, MAX_ERR_LEN);
82 _E("Failed to set lsb first(%d), fd : %d, errmsg : %s", lsb, spi->fd, errmsg);
89 int peripheral_interface_spi_set_bits_per_word(peripheral_spi_h spi, unsigned char bits)
93 _D("fd : %d, bits : %d", spi->fd, bits);
94 RETVM_IF(spi->fd < 0, -EINVAL, "Invalid fd");
96 status = ioctl(spi->fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
98 char errmsg[MAX_ERR_LEN];
99 strerror_r(errno, errmsg, MAX_ERR_LEN);
100 _E("Failed to set bits(%d), fd : %d, errmsg : %s", bits, spi->fd, errmsg);
107 int peripheral_interface_spi_set_frequency(peripheral_spi_h spi, unsigned int freq)
111 _D("fd : %d, freq : %d", spi->fd, freq);
112 RETVM_IF(spi->fd < 0, -EINVAL, "Invalid fd");
114 status = ioctl(spi->fd, SPI_IOC_WR_MAX_SPEED_HZ, &freq);
116 char errmsg[MAX_ERR_LEN];
117 strerror_r(errno, errmsg, MAX_ERR_LEN);
118 _E("Failed to set frequency(%d), fd : %d, errmsg : %s", freq, spi->fd, errmsg);
125 int peripheral_interface_spi_read(peripheral_spi_h spi, unsigned char *rxbuf, int length)
128 struct spi_ioc_transfer xfer;
130 RETVM_IF(spi->fd < 0, -EINVAL, "Invalid fd : %d", spi->fd);
132 memset(&xfer, 0, sizeof(struct spi_ioc_transfer));
133 xfer.rx_buf = (unsigned long)rxbuf;
136 status = ioctl(spi->fd, SPI_IOC_MESSAGE(1), &xfer);
138 char errmsg[MAX_ERR_LEN];
139 strerror_r(errno, errmsg, MAX_ERR_LEN);
140 _E("Failed to read data, fd : %d, length : %d, errmsg : %s", spi->fd, length, errmsg);
147 int peripheral_interface_spi_write(peripheral_spi_h spi, unsigned char *txbuf, int length)
150 struct spi_ioc_transfer xfer;
152 RETVM_IF(spi->fd < 0, -EINVAL, "Invalid fd : %d", spi->fd);
154 memset(&xfer, 0, sizeof(struct spi_ioc_transfer));
155 xfer.tx_buf = (unsigned long)txbuf;
158 status = ioctl(spi->fd, SPI_IOC_MESSAGE(1), &xfer);
160 char errmsg[MAX_ERR_LEN];
161 strerror_r(errno, errmsg, MAX_ERR_LEN);
162 _E("Failed to write data(%d) : %s", length, errmsg);
169 int peripheral_interface_spi_transfer(peripheral_spi_h spi, unsigned char *txbuf, unsigned char *rxbuf, int length)
172 struct spi_ioc_transfer xfer;
174 RETVM_IF(spi->fd < 0, -EINVAL, "Invalid fd : %d", spi->fd);
176 if (!txbuf || !rxbuf || length < 0) return -EINVAL;
178 memset(&xfer, 0, sizeof(xfer));
179 xfer.tx_buf = (unsigned long)txbuf;
180 xfer.rx_buf = (unsigned long)rxbuf;
183 status = ioctl(spi->fd, SPI_IOC_MESSAGE(1), &xfer);
185 char errmsg[MAX_ERR_LEN];
186 strerror_r(errno, errmsg, MAX_ERR_LEN);
187 _E("Failed to exchange data(%d) : %s", length, errmsg);