source: rtems/cpukit/dev/i2c/fpga-i2c-slave.c

Last change on this file was 80cf60e, checked in by Sebastian Huber <sebastian.huber@…>, on 04/15/20 at 07:48:32

Canonicalize config.h include

Use the following variant which was already used by most source files:

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

  • Property mode set to 100644
File size: 2.7 KB
Line 
1/*
2 * Copyright (c) 2016-2017 Chris Johns <chrisj@rtems.org>
3 * All rights reserved.
4 *
5 * The license and distribution terms for this file may be
6 * found in the file LICENSE in this distribution or at
7 * http://www.rtems.org/license/LICENSE.
8 */
9
10/*
11 * I2C slave for testing:
12 *       https://github.com/oetr/FPGA-I2C-Slave
13 */
14
15#ifdef HAVE_CONFIG_H
16#include "config.h"
17#endif
18
19#include <dev/i2c/i2c.h>
20#include <dev/i2c/fpga-i2c-slave.h>
21
22typedef struct {
23  i2c_dev  base;
24  uint16_t address;
25  size_t   size;
26} fpga_i2c_slave;
27
28static ssize_t
29fpga_i2c_slave_read(i2c_dev* base, void* buf, size_t n, off_t offset)
30{
31  fpga_i2c_slave* dev = (fpga_i2c_slave*) base;
32  off_t           avail = dev->size - offset;
33  uint8_t*        in = buf;
34  size_t          todo;
35
36  if (avail <= 0) {
37    return 0;
38  }
39
40  if (n > avail) {
41    n = (size_t) avail;
42  }
43
44  todo = n;
45
46  while (todo > 0) {
47    /*
48     * Limit the transfer size so that it can be stored in 8-bits.  This may
49     * help some bus controllers.
50     */
51    uint16_t cur = (uint16_t) (todo < 255 ?  todo : 255);
52    i2c_msg msgs = {
53      .addr = dev->base.address,
54      .flags = I2C_M_RD,
55      .buf = in,
56      .len = cur
57    };
58    int err;
59    err = i2c_bus_transfer(dev->base.bus, &msgs, 1);
60    if (err != 0) {
61      return err;
62    }
63    todo -= cur;
64    in += cur;
65  }
66
67  return (ssize_t) n;
68}
69
70static ssize_t
71fpga_i2c_slave_write(i2c_dev* base, const void* buf, size_t n, off_t offset)
72{
73  fpga_i2c_slave* dev = (fpga_i2c_slave*) base;
74  off_t           avail = dev->size - offset;
75  const uint8_t*  out = buf;
76  size_t          todo;
77
78  if (avail <= 0) {
79    return 0;
80  }
81
82  if (n > avail) {
83    n = (size_t) avail;
84  }
85
86  todo = n;
87
88  while (todo > 0) {
89    /*
90     * Limit the transfer size so that it can be stored in 8-bits.  This may
91     * help some bus controllers.
92     */
93    uint16_t cur = (uint16_t) (todo < 255 ?  todo : 255);
94    i2c_msg msgs = {
95      .addr = dev->base.address,
96      .flags = 0,
97      .buf = RTEMS_DECONST(uint8_t*, out),
98      .len = cur
99    };
100    int err;
101    err = i2c_bus_transfer(dev->base.bus, &msgs, 1);
102    if (err != 0) {
103      return err;
104    }
105    todo -= cur;
106    out += cur;
107  }
108
109  return (ssize_t) n;
110}
111
112int
113i2c_dev_register_fpga_i2c_slave(const char* bus_path,
114                                const char* dev_path,
115                                uint16_t    address,
116                                size_t      size)
117
118{
119  fpga_i2c_slave* dev;
120
121  dev = (fpga_i2c_slave*)
122    i2c_dev_alloc_and_init(sizeof(*dev), bus_path, address);
123  if (dev == NULL) {
124    return -1;
125  }
126
127  dev->base.read = fpga_i2c_slave_read;
128  dev->base.write = fpga_i2c_slave_write;
129  dev->size = size;
130
131  return i2c_dev_register(&dev->base, dev_path);
132}
Note: See TracBrowser for help on using the repository browser.