Statistics
| Branch: | Tag: | Revision:

amiro-os / components / bus / i2c / VI2CDriver.cpp @ e2002d0e

History | View | Annotate | Download (1.496 KB)

1
#include <chdebug.h>
2
#include <amiro/bus/i2c/I2CMultiplexer.hpp>
3
#include <amiro/bus/i2c/VI2CDriver.hpp>
4

    
5
namespace amiro {
6

    
7
VI2CDriver::
8
VI2CDriver(I2CMultiplexer *driver, const uint8_t bus_id) :
9
  driver(driver),
10
  id(bus_id) {
11

    
12
#if CH_USE_MUTEXES
13
  chMtxInit(&this->mutex);
14
#else
15
  chSemInit(&this->semaphore, 1);
16
#endif /* CH_USE_MUTEXES */
17

    
18
};
19

    
20

    
21
void
22
VI2CDriver::
23
start(const I2CConfig* config) {
24

    
25
  /* silently discard config */
26
  (void) config;
27
  /* ignore starts */
28

    
29
}
30

    
31
void
32
VI2CDriver::
33
stop() {
34

    
35
  /* ignore stops */
36

    
37
}
38

    
39
i2cflags_t
40
VI2CDriver::
41
getErrors() {
42

    
43
  return this->driver->getErrors();
44

    
45
}
46

    
47
msg_t
48
VI2CDriver::
49
masterTransmit(const I2CTxParams *params, systime_t timeout) {
50

    
51
  msg_t ret;
52

    
53
  this->driver->acquireBus();
54

    
55
  if (!(ret = this->driver->select(this->id))) {
56
    ret = this->driver->masterTransmit(params, timeout);
57
  }
58

    
59
  this->driver->deselect();
60
  this->driver->releaseBus();
61

    
62
  return ret;
63
}
64

    
65
msg_t
66
VI2CDriver::
67
masterReceive(const I2CRxParams *params, systime_t timeout) {
68

    
69
  msg_t ret;
70

    
71
  this->driver->acquireBus();
72

    
73
  if (!(ret = this->driver->select(this->id)))
74
    ret = this->driver->masterReceive(params, timeout);
75

    
76
  this->driver->deselect();
77
  this->driver->releaseBus();
78

    
79
  return ret;
80

    
81
}
82

    
83

    
84
void
85
VI2CDriver::
86
acquireBus() {
87

    
88
#if CH_USE_MUTEXES
89
  chMtxLock(&this->mutex);
90
#elif CH_USE_SEMAPHORES
91
  chSemWait(&this->semaphore);
92
#endif
93

    
94
}
95

    
96
void
97
VI2CDriver::
98
releaseBus() {
99

    
100
#if CH_USE_MUTEXES
101
  chMtxUnlock();
102
#elif CH_USE_SEMAPHORES
103
  chSemSignal(&this->semaphore);
104
#endif
105

    
106
}
107

    
108
}
109
/* amiro */