Skip to content

Commit 9849c5d

Browse files
eRPC updates 07/2021
-- Fix the order of commands in underlyingReceive and underlyingSend of UART CMSIS transport. -- Fix (revert) the sequence of commands in MUTransport::rx_cb (bug unintentionally introduced by Github pull request #158). -- Identify the used LINK hw during the runtime (LPCLINK2 vs. MCULINK) in transport.py. -- Improve I2cSlaveTransport -- Add reference links into erpc/README.md. -- Update license file.
1 parent 1429add commit 9849c5d

6 files changed

Lines changed: 109 additions & 23 deletions

File tree

LICENSE

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,36 @@ Copyright 2014-2016 Freescale Semiconductor, Inc.
22
Copyright 2016-2021 NXP
33
All rights reserved.
44

5-
SPDX-License-Identifier: BSD-3-Clause
5+
The BSD 3 Clause License
6+
7+
Redistribution and use in source and binary forms, with or without
8+
modification, are permitted provided that the following conditions are met:
9+
10+
1. Redistributions of source code must retain the above copyright notice, this
11+
list of conditions and the following disclaimer.
12+
13+
2. Redistributions in binary form must reproduce the above copyright notice,
14+
this list of conditions and the following disclaimer in the documentation
15+
and/or other materials provided with the distribution.
16+
17+
3. Neither the name of the copyright holder nor the names of its contributors
18+
may be used to endorse or promote products derived from this software without
19+
specific prior written permission.
20+
21+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
22+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
32+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
33+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
34+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
35+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
36+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
37+
SOFTWARE.

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,14 @@ To get the board list with multicore support (eRPC included) use filtering based
9292
<MCUXpressoSDK_install_dir>/boards/<board_name>/multiprocessor_examples for eRPC multiprocessor examples (UART or SPI transports used).<br>
9393
eRPC examples use 'erpc_' name prefix.
9494

95+
## References
96+
97+
This section provides links to interesting erpc-based projects, articles, blogs or guides:
98+
99+
* [erpc (EmbeddedRPC) getting started notes](https://programmersought.com/article/37585084512/)
100+
* [ERPC Linux Local Environment Construction and Use](https://programmersought.com/article/88827920353/)
101+
* [The New Wio Terminal eRPC Firmware](https://www.hackster.io/Salmanfarisvp/the-new-wio-terminal-erpc-firmware-bfd8bd)
102+
95103
## Directories
96104

97105
`doc` - Documentation.

erpc_c/transports/erpc_i2c_slave_transport.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ using namespace erpc;
2626
#error "Please define the ERPC_BOARD_I2C_INT_GPIO used to notify when the I2C Slave is ready to transmit"
2727
#endif
2828

29+
#define I2C_SLAVE_TRANSPORT_ADDR_7BIT (0x7EU)
30+
2931
////////////////////////////////////////////////////////////////////////////////
3032
// Variables
3133
////////////////////////////////////////////////////////////////////////////////
@@ -41,7 +43,7 @@ typedef struct i2c_clb_user_data
4143
uint8_t *rx_buffer;
4244
uint32_t rx_size;
4345
} I2C_CLB_USER_DATA, *I2C_CLB_USER_DATA_PTR;
44-
static I2C_CLB_USER_DATA volatile s_callback_user_data = { NULL, 0 };
46+
static volatile I2C_CLB_USER_DATA s_callback_user_data = { NULL, 0, NULL, 0 };
4547

4648
////////////////////////////////////////////////////////////////////////////////
4749
// Code
@@ -112,18 +114,26 @@ static void I2C_SlaveUserCallback(I2C_Type *base, volatile i2c_slave_transfer_t
112114
/* Update information for transmit process */
113115
transfer->txData = ((I2C_CLB_USER_DATA *)userData)->tx_buffer;
114116
transfer->txSize = ((I2C_CLB_USER_DATA *)userData)->tx_size;
117+
transfer->rxData = NULL;
118+
transfer->rxSize = 0;
115119
break;
116120

117121
/* Setup the slave receive buffer */
118122
case kI2C_SlaveReceiveEvent:
119123
/* Update information for received process */
120124
transfer->rxData = ((I2C_CLB_USER_DATA *)userData)->rx_buffer;
121125
transfer->rxSize = ((I2C_CLB_USER_DATA *)userData)->rx_size;
126+
transfer->txData = NULL;
127+
transfer->txSize = 0;
122128
break;
123129

124130
/* The master has sent a stop transition on the bus */
125131
case kI2C_SlaveCompletionEvent:
126132
transport->transfer_cb();
133+
transfer->rxData = NULL;
134+
transfer->rxSize = 0;
135+
transfer->txData = NULL;
136+
transfer->txSize = 0;
127137
break;
128138

129139
default:
@@ -159,7 +169,7 @@ erpc_status_t I2cSlaveTransport::init(void)
159169
i2c_slave_config_t i2cConfig;
160170

161171
I2C_SlaveGetDefaultConfig(&i2cConfig);
162-
i2cConfig.address0.address = (0x7EU); // I2C_MASTER_SLAVE_ADDR_7BIT
172+
i2cConfig.address0.address = (I2C_SLAVE_TRANSPORT_ADDR_7BIT);
163173

164174
I2C_SlaveInit(m_i2cBaseAddr, &i2cConfig, m_srcClock_Hz);
165175
I2C_SlaveTransferCreateHandle(m_i2cBaseAddr, &s_handle, I2C_SlaveUserCallback, (void *)&s_callback_user_data);
@@ -177,6 +187,8 @@ erpc_status_t I2cSlaveTransport::underlyingReceive(uint8_t *data, uint32_t size)
177187

178188
s_callback_user_data.rx_buffer = data;
179189
s_callback_user_data.rx_size = size;
190+
s_callback_user_data.tx_buffer = NULL;
191+
s_callback_user_data.tx_size = 0;
180192

181193
status =
182194
I2C_SlaveTransferNonBlocking(m_i2cBaseAddr, &s_handle, kI2C_SlaveAddressMatchEvent | kI2C_SlaveCompletionEvent);
@@ -205,6 +217,8 @@ erpc_status_t I2cSlaveTransport::underlyingSend(const uint8_t *data, uint32_t si
205217
status_t status;
206218
s_isTransferCompleted = false;
207219

220+
s_callback_user_data.rx_buffer = NULL;
221+
s_callback_user_data.rx_size = 0;
208222
s_callback_user_data.tx_buffer = (uint8_t *)data;
209223
s_callback_user_data.tx_size = size;
210224

erpc_c/transports/erpc_mu_transport.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,8 @@ void MUTransport::rx_cb(void)
150150
if (m_rxCntBytes >= m_rxMsgSize)
151151
{
152152
m_rxBuffer = NULL;
153-
MU_DisableInterrupts(m_muBase, (1U << (MU_CR_RIEn_SHIFT + MU_RR_COUNT - MU_REG_COUNT)));
154153
#if !ERPC_THREADS_IS(NONE)
154+
MU_DisableInterrupts(m_muBase, (1U << (MU_CR_RIEn_SHIFT + MU_RR_COUNT - MU_REG_COUNT)));
155155
m_rxSemaphore.putFromISR();
156156
#endif
157157
}

erpc_c/transports/erpc_uart_cmsis_transport.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,9 @@ erpc_status_t UartTransport::init(void)
103103
erpc_status_t UartTransport::underlyingReceive(uint8_t *data, uint32_t size)
104104
{
105105
erpc_status_t erpcStatus = kErpcStatus_ReceiveFailed;
106-
int32_t status = (*m_uartDrv).Receive(data, size);
107106

108107
s_isTransferReceiveCompleted = false;
108+
int32_t status = (*m_uartDrv).Receive(data, size);
109109

110110
if (status == ARM_DRIVER_OK)
111111
{
@@ -126,9 +126,9 @@ erpc_status_t UartTransport::underlyingReceive(uint8_t *data, uint32_t size)
126126
erpc_status_t UartTransport::underlyingSend(const uint8_t *data, uint32_t size)
127127
{
128128
erpc_status_t erpcStatus = kErpcStatus_SendFailed;
129-
int32_t status = (*m_uartDrv).Send(data, size);
130129

131130
s_isTransferSendCompleted = false;
131+
int32_t status = (*m_uartDrv).Send(data, size);
132132

133133
if (status == ARM_DRIVER_OK)
134134
{

erpc_python/erpc/transport.py

Lines changed: 49 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -209,12 +209,28 @@ def __init__(self, baudrate = None, cs_gpio_port = None, cs_gpio_pin = None):
209209
self._baudrate = baudrate
210210
self._cs_gpio_port = cs_gpio_port
211211
self._cs_gpio_pin = cs_gpio_pin
212+
self._gpioport = 0
213+
self._gpiopin = 0
214+
self._gpiomode = 0
212215

213216
# Load DLL from default directory without any debugging prints
214217
self.sio = LIBUSBSIO()
215218

216219
# Get number of LIBUSBSIO devices
217-
res = self.sio.GetNumPorts ()
220+
res = self.sio.GetNumPorts(pidvids = [LIBUSBSIO.PIDVID_LPCLINK2])
221+
if res!=0:
222+
self._gpioport = 1
223+
self._gpiopin = 2
224+
self._gpiomode = 1
225+
else:
226+
res = self.sio.GetNumPorts(pidvids = [LIBUSBSIO.PIDVID_MCULINK])
227+
if res!=0:
228+
self._gpioport = 0
229+
self._gpiopin = 4
230+
self._gpiomode = 0x100
231+
else:
232+
print('No LIBUSBSIO devices found \r\n')
233+
return
218234
print('Total LIBUSBSIO devices: %d \r\n' % res)
219235

220236
# Open device at index 0
@@ -237,11 +253,11 @@ def __init__(self, baudrate = None, cs_gpio_port = None, cs_gpio_pin = None):
237253
self._hSPIPort = self.sio.SPI_Open (int(self._baudrate), portNum=0, dataSize=8, preDelay=0)
238254

239255
# Configure GPIO pin for SPI master-slave signalling
240-
res = self.sio.GPIO_ConfigIOPin (1, 2, 1)
256+
res = self.sio.GPIO_ConfigIOPin (self._gpioport, self._gpiopin, self._gpiomode)
241257
print('GPIO_ConfigIOPin res: %d \r\n' % res)
242-
res = self.sio.GPIO_SetPortInDir (1, 2)
258+
res = self.sio.GPIO_SetPortInDir (self._gpioport, self._gpiopin)
243259
print('GPIO_SetPortInDir res: %d \r\n' % res)
244-
res = self.sio.GPIO_GetPin (1, 2)
260+
res = self.sio.GPIO_GetPin (self._gpioport, self._gpiopin)
245261
print('GPIO_GetPin res: %d \r\n' % res)
246262

247263
def close(self):
@@ -252,9 +268,9 @@ def close(self):
252268

253269
def _base_send(self, message):
254270
# Wait for SPI master-slave signalling GPIO pin to be in low state
255-
res = self.sio.GPIO_GetPin (1, 2)
271+
res = self.sio.GPIO_GetPin (self._gpioport, self._gpiopin)
256272
while (1 == res):
257-
res = self.sio.GPIO_GetPin (1, 2)
273+
res = self.sio.GPIO_GetPin (self._gpioport, self._gpiopin)
258274
# Send the header first
259275
data, rxbytesnumber = self._hSPIPort.Transfer (0, 15, message[:self.HEADER_LEN], self.HEADER_LEN, 0 )
260276
if rxbytesnumber>0:
@@ -265,10 +281,10 @@ def _base_send(self, message):
265281
print('SPI transfer error: %d' % rxbytesnumber)
266282

267283
def _base_receive(self, count):
268-
# Wait for SPI master-slave signalling GPIO pin to be in low state
269-
res = self.sio.GPIO_GetPin (1, 2)
284+
# Wait for SPI master-slave signalling GPIO pin to be in low state
285+
res = self.sio.GPIO_GetPin (self._gpioport, self._gpiopin)
270286
while (1 == res):
271-
res = self.sio.GPIO_GetPin (1, 2)
287+
res = self.sio.GPIO_GetPin (self._gpioport, self._gpiopin)
272288
data, rxbytesnumber = self._hSPIPort.Transfer (0, 15, range(count), count, 0 )
273289
if rxbytesnumber>0:
274290
#print('SPI received %d number of bytes' % rxbytesnumber)
@@ -290,12 +306,28 @@ def __init__(self, baudrate = None):
290306
baudrate = 100000
291307

292308
self._baudrate = baudrate
309+
self._gpioport = 0
310+
self._gpiopin = 0
311+
self._gpiomode = 0
293312

294313
# Load DLL from default directory without any debugging prints
295314
self.sio = LIBUSBSIO()
296315

297316
#Get number of LIBUSBSIO devices
298-
res = self.sio.GetNumPorts ()
317+
res = self.sio.GetNumPorts(pidvids = [LIBUSBSIO.PIDVID_LPCLINK2])
318+
if res!=0:
319+
self._gpioport = 1
320+
self._gpiopin = 2
321+
self._gpiomode = 1
322+
else:
323+
res = self.sio.GetNumPorts(pidvids = [LIBUSBSIO.PIDVID_MCULINK])
324+
if res!=0:
325+
self._gpioport = 1
326+
self._gpiopin = 3
327+
self._gpiomode = 0x100
328+
else:
329+
print('No LIBUSBSIO devices found \r\n')
330+
return
299331
print('Total LIBUSBSIO devices: %d \r\n' % res)
300332

301333
# Open device at index 0
@@ -318,11 +350,11 @@ def __init__(self, baudrate = None):
318350
self._hI2CPort = self.sio.I2C_Open (int(self._baudrate), 0, 0)
319351

320352
# Configure GPIO pin for I2C master-slave signalling
321-
res = self.sio.GPIO_ConfigIOPin (1, 2, 1)
353+
res = self.sio.GPIO_ConfigIOPin (self._gpioport, self._gpiopin, self._gpiomode)
322354
print('GPIO_ConfigIOPin res: %d \r\n' % res)
323-
res = self.sio.GPIO_SetPortInDir (1, 2)
355+
res = self.sio.GPIO_SetPortInDir (self._gpioport, self._gpiopin)
324356
print('GPIO_SetPortInDir res: %d \r\n' % res)
325-
res = self.sio.GPIO_GetPin (1, 2)
357+
res = self.sio.GPIO_GetPin (self._gpioport, self._gpiopin)
326358
print('GPIO_GetPin res: %d \r\n' % res)
327359

328360
def close(self):
@@ -333,9 +365,9 @@ def close(self):
333365

334366
def _base_send(self, message):
335367
# Wait for I2C master-slave signalling GPIO pin to be in low state
336-
res = self.sio.GPIO_GetPin (1, 2)
368+
res = self.sio.GPIO_GetPin (self._gpioport, self._gpiopin)
337369
while (1 == res):
338-
res = self.sio.GPIO_GetPin (1, 2)
370+
res = self.sio.GPIO_GetPin (self._gpioport, self._gpiopin)
339371
# Send the header first
340372
data, rxbytesnumber = self._hI2CPort.FastXfer (0x7E, message[:self.HEADER_LEN], self.HEADER_LEN, 0, 0)
341373
if rxbytesnumber>0:
@@ -347,9 +379,9 @@ def _base_send(self, message):
347379

348380
def _base_receive(self, count):
349381
# Wait for I2C master-slave signalling GPIO pin to be in low state
350-
res = self.sio.GPIO_GetPin (1, 2)
382+
res = self.sio.GPIO_GetPin (self._gpioport, self._gpiopin)
351383
while (1 == res):
352-
res = self.sio.GPIO_GetPin (1, 2)
384+
res = self.sio.GPIO_GetPin (self._gpioport, self._gpiopin)
353385
# Issue the I2C_Transfer API
354386
data, rxbytesnumber = self._hI2CPort.FastXfer (0x7E, 0, 0, count, 0)
355387
if rxbytesnumber>0:

0 commit comments

Comments
 (0)