Statistics
| Branch: | Tag: | Revision:

amiro-lld / source / P9221R / v1 / alld_P9221R_v1.c @ 067c98f7

History | View | Annotate | Download (4.683 KB)

1 6ef38c23 Julia Niermann
/*
2
AMiRo-LLD is a compilation of low-level hardware drivers for the Autonomous Mini Robot (AMiRo) platform.
3
Copyright (C) 2016..2019  Thomas Schöpping et al.
4

5
This program is free software: you can redistribute it and/or modify
6
it under the terms of the GNU Lesser General Public License as published by
7
the Free Software Foundation, either version 3 of the License, or
8
(at your option) any later version.
9

10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
GNU Lesser General Public License for more details.
14

15
You should have received a copy of the GNU Lesser General Public License
16
along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
*/
18
19
/**
20
 * @file    alld_P9221R_v1.c
21
 *
22
 * @brief   Power Monitor function implementations
23
 *
24
 * @addtogroup lld_power
25
 * @{
26
 */
27
28 54dbb62d Julia Niermann
#include <alld_P9221R.h>
29 6ef38c23 Julia Niermann
30 54dbb62d Julia Niermann
#if (defined(AMIROLLD_CFG_P9221R) && (AMIROLLD_CFG_P9221R == 1)) || defined(__DOXYGEN__)
31 6ef38c23 Julia Niermann
32
/******************************************************************************/
33
/* LOCAL DEFINITIONS                                                          */
34
/******************************************************************************/
35
36
/******************************************************************************/
37
/* EXPORTED VARIABLES                                                         */
38
/******************************************************************************/
39
40
/******************************************************************************/
41
/* LOCAL TYPES                                                                */
42
/******************************************************************************/
43
44
/******************************************************************************/
45
/* LOCAL VARIABLES                                                            */
46
/******************************************************************************/
47
48
/******************************************************************************/
49
/* LOCAL FUNCTIONS                                                            */
50
/******************************************************************************/
51
52
/******************************************************************************/
53
/* EXPORTED FUNCTIONS                                                         */
54
/******************************************************************************/
55
56
57
/**
58
 * @brief Read the value of one or more of the registers.
59
 * @param[in]   i2cd        i2c driver
60
 * @param[in]   PRd         p9221r driver
61
 * @param[in]   addr        register address
62
 * @param[out]  data        register content
63
 * @param[in]   num         number of subsequent registers to read
64
 * @param[in]   timeout     timeout
65
 * @return                  An indicator whether the call was successfull
66
 */
67
apalExitStatus_t p9221r_lld_read_register(const P9221RDriver* const p9221r, const p9221r_lld_register_t addr, uint16_t* const data, const uint8_t num, const apalTime_t timeout)
68
{
69
  apalDbgAssert(p9221r != NULL);
70
  apalDbgAssert(p9221r->i2cd != NULL);
71
  apalDbgAssert(data != NULL);
72
73 067c98f7 Julia Niermann
  uint16_t address = ((uint16_t)addr << 8) | ((uint16_t)addr & 0x00FF);
74 6ef38c23 Julia Niermann
  uint8_t buffer[num*2];
75 067c98f7 Julia Niermann
  for (uint8_t i = 0; i < num*2; ++i) {
76
      buffer[i] = 1;
77
  }
78
  apalExitStatus_t status = apalI2CMasterTransmit(p9221r->i2cd, (P9221R_LLD_I2C_ADDR_FIXED | p9221r->addr), &address, 2, buffer, 2*num, timeout);
79 6ef38c23 Julia Niermann
  for (uint8_t dataIdx = 0; dataIdx < num; dataIdx++) {
80
    data[dataIdx] = (buffer[2*dataIdx] << 8) | buffer[2*dataIdx+1];
81
  }
82
  return status;
83
}
84
85
/**
86
 * @brief Write the value of one or more of the registers.
87
 * @param[in]   i2cd        i2c driver
88
 * @param[in]   PRd         p9221r driver
89
 * @param[in]   addr        register address
90
 * @param[in]   data        data to write
91
 * @param[in]   num         number of subsequent registers to read
92
 * @param[in]   timeout     timeout
93
 * @return                  An indicator whether the call was successfull
94
 */
95
96 2344a771 Julia Niermann
apalExitStatus_t p9221r_lld_write_register(const P9221RDriver* const p9221r, const p9221r_lld_register_t addr, const uint16_t* const data, const uint8_t num, const apalTime_t timeout)
97 6ef38c23 Julia Niermann
{
98
  apalDbgAssert(p9221r != NULL);
99
  apalDbgAssert(p9221r->i2cd != NULL);
100
  apalDbgAssert(data != NULL);
101
102
  uint8_t buffer[1+2*num];
103
  buffer[0] = addr;
104
  for (uint8_t dataIdx = 0; dataIdx < num; dataIdx++) {
105
    buffer[dataIdx*2+1] = data[dataIdx] >> 8;
106
    buffer[dataIdx*2+2] = data[dataIdx] & (0x00FFu);
107
  }
108 2344a771 Julia Niermann
  return apalI2CMasterTransmit(p9221r->i2cd, (P9221R_LLD_I2C_ADDR_FIXED | p9221r->addr), buffer, 1+2*num, NULL, 0, timeout);
109 6ef38c23 Julia Niermann
}
110
111 54dbb62d Julia Niermann
#endif /* defined(AMIROLLD_CFG_P9221R) && (AMIROLLD_CFG_P9221R == 1) */
112 6ef38c23 Julia Niermann
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139