embox
1/**
2* @file spi_devfs.c
3* @brief
4* @author Denis Deryugin <deryugin.denis@gmail.com>
5* @version
6* @date 05.12.2018
7*/
8
9#include <assert.h>
10#include <stdint.h>
11#include <sys/uio.h>
12
13#include <drivers/char_dev.h>
14#include <drivers/spi.h>
15#include <util/log.h>
16
17static ssize_t spi_read(struct char_dev *cdev, void *buf, size_t nbyte) {
18struct spi_device *dev;
19
20assert(cdev);
21assert(buf);
22
23dev = (struct spi_device *)cdev;
24
25spi_transfer(dev, NULL, buf, nbyte);
26
27return nbyte;
28}
29
30static ssize_t spi_write(struct char_dev *cdev, const void *buf, size_t nbyte) {
31struct spi_device *dev;
32
33assert(cdev);
34assert(buf);
35
36dev = (struct spi_device *)cdev;
37
38spi_transfer(dev, (void *)buf, NULL, nbyte);
39
40return nbyte;
41}
42
43static int spi_ioctl(struct char_dev *cdev, int request, void *data) {
44struct spi_transfer_arg *transfer_arg;
45struct spi_device *dev;
46
47assert(cdev);
48
49dev = (struct spi_device *)cdev;
50
51log_debug("request=0x%x data=%p", request, data);
52
53switch (request) {
54case SPI_IOCTL_CS:
55spi_select(dev, (int)(intptr_t)data);
56break;
57case SPI_IOCTL_TRANSFER:
58transfer_arg = data;
59spi_transfer(dev, transfer_arg->in, transfer_arg->out,
60transfer_arg->count);
61break;
62case SPI_IOCTL_CS_MODE:
63dev->flags = (int)(intptr_t)data;
64break;
65}
66
67return 0;
68}
69
70const struct char_dev_ops __spi_cdev_ops = {
71.read = spi_read,
72.write = spi_write,
73.ioctl = spi_ioctl,
74};
75