1 /* Copyright (C) 2013, 2015 Czech Technical University in Prague
4 * - Carlos Jenkins <carlos@jenkins.co.cr>
5 * - Michal Horn <hornmich@fel.cvut.cz>
7 * Permission is hereby granted, free of charge, to any person
8 * obtaining a copy of this software and associated documentation
9 * files (the "Software"), to deal in the Software without
10 * restriction, including without limitation the rights to use,
11 * copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following
16 * The above copyright notice and this permission notice shall be
17 * included in all copies or substantial portions of the Software.
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
21 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
23 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
24 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
26 * OTHER DEALINGS IN THE SOFTWARE.
30 * FlexRay Communication RPP API implementation file.
34 * RPP API documentation.
40 #ifndef FREERTOS_POSIX
45 #include "drv/spi_def.h"
46 #include "rpp/mutex.h"
48 RPP_MUTEX_DEFINE(mutex_fr);
50 static rpp_fr_state_t rpp_fr_state = RPP_FR_NOT_INITIALIZED; /**< Stores the actual state of the FlexRay module */
52 /* AUTOSAR-like API */
54 int8_t rpp_fr_init_driver(const Fr_ConfigType *config_ptr, uint32_t *error)
56 if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED)
58 #ifndef FREERTOS_POSIX
61 if (!RPP_MUTEX_INIT(mutex_fr))
64 rpp_fr_state = RPP_FR_DRV_INITIALIZED;
68 int8_t rpp_fr_init_controller(uint8_t ctrl, uint32_t *error)
70 Std_ReturnType retVal = ERR_PARAM_NO_ERROR;
71 RPP_MUTEX_LOCK(mutex_fr);
72 if (rpp_fr_state == RPP_FR_DRV_INITIALIZED ||
73 rpp_fr_state == RPP_FR_HALTED ||
74 rpp_fr_state == RPP_FR_ABORTED) {
75 retVal = Fr_ControllerInit(ctrl);
77 rpp_fr_state = RPP_FR_CTR_INITIALIZED;
78 RPP_MUTEX_UNLOCK(mutex_fr);
83 RPP_MUTEX_UNLOCK(mutex_fr);
87 RPP_MUTEX_UNLOCK(mutex_fr);
92 int8_t rpp_fr_start_communication(uint8_t ctrl, uint32_t *error)
94 Std_ReturnType retVal = ERR_PARAM_NO_ERROR;
96 RPP_MUTEX_LOCK(mutex_fr);
97 if (rpp_fr_state == RPP_FR_CTR_INITIALIZED) {
98 retVal = Fr_StartCommunication(ctrl);
100 rpp_fr_state = RPP_FR_RUNNING;
101 RPP_MUTEX_UNLOCK(mutex_fr);
107 RPP_MUTEX_UNLOCK(mutex_fr);
111 RPP_MUTEX_UNLOCK(mutex_fr);
115 int8_t rpp_fr_all_slots(uint8_t ctrl)
119 RPP_MUTEX_LOCK(mutex_fr);
120 ret = (rpp_fr_state == RPP_FR_RUNNING && Fr_AllSlots(ctrl) & E_OK);
121 RPP_MUTEX_UNLOCK(mutex_fr);
123 return ret ? SUCCESS : FAILURE;
126 int8_t rpp_fr_halt_communication(uint8_t ctrl)
128 RPP_MUTEX_LOCK(mutex_fr);
129 if (rpp_fr_state == RPP_FR_RUNNING && Fr_HaltCommunication(ctrl) & E_OK) {
130 rpp_fr_state = RPP_FR_HALTED;
131 RPP_MUTEX_UNLOCK(mutex_fr);
135 RPP_MUTEX_UNLOCK(mutex_fr);
139 int8_t rpp_fr_abort_communication(uint8_t ctrl)
141 RPP_MUTEX_LOCK(mutex_fr);
142 if (rpp_fr_state == RPP_FR_RUNNING && Fr_AbortCommunication(ctrl) & E_OK) {
143 rpp_fr_state = RPP_FR_ABORTED;
144 RPP_MUTEX_UNLOCK(mutex_fr);
148 RPP_MUTEX_UNLOCK(mutex_fr);
152 int8_t rpp_fr_send_wup(uint8_t ctrl)
154 RPP_MUTEX_LOCK(mutex_fr);
155 if (rpp_fr_state == RPP_FR_CTR_INITIALIZED && Fr_SendWUP(ctrl) & E_OK) {
156 RPP_MUTEX_UNLOCK(mutex_fr);
160 RPP_MUTEX_UNLOCK(mutex_fr);
164 int8_t rpp_fr_set_wu_channel(uint8_t ctrl, Fr_ChannelType channel)
166 RPP_MUTEX_LOCK(mutex_fr);
167 if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_SetWakeupChannel(ctrl, channel) & E_OK) {
168 RPP_MUTEX_UNLOCK(mutex_fr);
172 RPP_MUTEX_UNLOCK(mutex_fr);
176 int8_t rpp_fr_get_poc_status(uint8_t ctrl, Fr_POCStatusType *poc_status_ptr)
178 RPP_MUTEX_LOCK(mutex_fr);
179 if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_GetPOCStatus(ctrl, poc_status_ptr) & E_OK) {
180 RPP_MUTEX_UNLOCK(mutex_fr);
184 RPP_MUTEX_UNLOCK(mutex_fr);
188 int8_t rpp_fr_transmit_lpdu(uint8_t ctrl, uint16_t lpdu_idx, const uint8_t *lsdu, uint8_t lsdu_length)
190 RPP_MUTEX_LOCK(mutex_fr);
191 if (rpp_fr_state == RPP_FR_RUNNING && Fr_TransmitTxLPdu(ctrl, lpdu_idx, lsdu, lsdu_length) & E_OK) {
192 RPP_MUTEX_UNLOCK(mutex_fr);
196 RPP_MUTEX_UNLOCK(mutex_fr);
201 int8_t rpp_fr_cancel_transmit_lpdu(uint8_t ctrl, uint16_t lpdu_idx)
203 RPP_MUTEX_LOCK(mutex_fr);
204 if (rpp_fr_state == RPP_FR_RUNNING && Fr_CancelTxLPdu(ctrl, lpdu_idx) & E_OK) {
205 RPP_MUTEX_UNLOCK(mutex_fr);
209 RPP_MUTEX_UNLOCK(mutex_fr);
214 int8_t rpp_fr_receive_lpdu(uint8_t ctrl, uint16_t lpdu_idx, uint8_t *lsdu, Fr_RxLPduStatusType *lpdu_status, uint8_t *lsdu_length)
216 RPP_MUTEX_LOCK(mutex_fr);
217 if (rpp_fr_state == RPP_FR_RUNNING && Fr_ReceiveRxLPdu(ctrl, lpdu_idx, lsdu, lpdu_status, lsdu_length) & E_OK) {
218 RPP_MUTEX_UNLOCK(mutex_fr);
222 RPP_MUTEX_UNLOCK(mutex_fr);
227 int8_t rpp_fr_check_tx_lpdu_status(uint8_t ctrl, uint16_t lpdu_idx, Fr_TxLPduStatusType *lpdu_status)
229 RPP_MUTEX_LOCK(mutex_fr);
230 if (rpp_fr_state == RPP_FR_RUNNING && Fr_CheckTxLPduStatus(ctrl, lpdu_idx, lpdu_status) & E_OK) {
231 RPP_MUTEX_UNLOCK(mutex_fr);
235 RPP_MUTEX_UNLOCK(mutex_fr);
240 int8_t rpp_fr_reconfigure_lpdu(uint8_t ctrl, uint16_t lpdu_idx, uint16_t frame_id, Fr_ChannelType channel, uint8_t cycle_set, uint8_t cycle_offset, uint8_t payload, uint16_t header_crc)
242 RPP_MUTEX_LOCK(mutex_fr);
243 if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_ReconfigLPdu(ctrl, lpdu_idx, frame_id, channel, cycle_set, cycle_offset, payload, header_crc) & E_OK) {
244 RPP_MUTEX_UNLOCK(mutex_fr);
248 RPP_MUTEX_UNLOCK(mutex_fr);
253 int8_t rpp_fr_disable_lpdu(uint8_t ctrl, uint16_t lpdu_idx)
255 RPP_MUTEX_LOCK(mutex_fr);
256 if (rpp_fr_state == RPP_FR_RUNNING && Fr_DisableLPdu(ctrl, lpdu_idx) & E_OK) {
257 RPP_MUTEX_UNLOCK(mutex_fr);
261 RPP_MUTEX_UNLOCK(mutex_fr);
266 int8_t rpp_fr_get_global_time(uint8_t ctrl, uint8_t *cycle, uint16_t *macroticks)
268 RPP_MUTEX_LOCK(mutex_fr);
269 if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_GetGlobalTime(ctrl, cycle, macroticks) & E_OK) {
270 RPP_MUTEX_UNLOCK(mutex_fr);
274 RPP_MUTEX_UNLOCK(mutex_fr);
279 int8_t rpp_fr_get_network_management_vector(uint8_t ctrl, uint8_t *nm_vector)
281 RPP_MUTEX_LOCK(mutex_fr);
282 if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_GetNmVector(ctrl, nm_vector) & E_OK) {
283 RPP_MUTEX_UNLOCK(mutex_fr);
287 RPP_MUTEX_UNLOCK(mutex_fr);
292 int8_t rpp_fr_get_channel_status(uint8_t ctrl, uint16_t *channel_a_status, uint16_t *channel_b_status)
294 RPP_MUTEX_LOCK(mutex_fr);
295 if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_GetChannelStatus(ctrl, channel_a_status, channel_b_status) & E_OK) {
296 RPP_MUTEX_UNLOCK(mutex_fr);
300 RPP_MUTEX_UNLOCK(mutex_fr);
305 int8_t rpp_fr_get_clock_correction(uint8_t ctrl, int16_t *rate_correction, int32_t *offset_correction)
307 RPP_MUTEX_LOCK(mutex_fr);
308 if (rpp_fr_state >= RPP_FR_RUNNING && Fr_GetClockCorrection(ctrl, rate_correction, offset_correction) & E_OK) {
309 RPP_MUTEX_UNLOCK(mutex_fr);
313 RPP_MUTEX_UNLOCK(mutex_fr);
318 int8_t rpp_fr_get_sync_frame_list(uint8_t ctrl, uint8_t list_size, uint16_t *channel_a_even_list, uint16_t *channel_b_even_list, uint16_t *channel_a_odd_list, uint16_t *channel_b_odd_list)
320 RPP_MUTEX_LOCK(mutex_fr);
321 if (rpp_fr_state >= RPP_FR_RUNNING && Fr_GetSyncFrameList(ctrl, list_size, channel_a_even_list, channel_b_even_list, channel_a_odd_list, channel_b_odd_list) & E_OK) {
322 RPP_MUTEX_UNLOCK(mutex_fr);
326 RPP_MUTEX_UNLOCK(mutex_fr);
331 int8_t rpp_fr_get_wakeup_rx_status(uint8_t ctrl, uint8_t *status)
333 RPP_MUTEX_LOCK(mutex_fr);
334 if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_GetWakeupRxStatus(ctrl, status) & E_OK) {
335 RPP_MUTEX_UNLOCK(mutex_fr);
339 RPP_MUTEX_UNLOCK(mutex_fr);
344 int8_t rpp_fr_set_timer(uint8_t ctrl, uint8_t timer_idx, uint8_t cycle_set, uint16_t offset_threshold)
346 RPP_MUTEX_LOCK(mutex_fr);
347 if (rpp_fr_state == RPP_FR_RUNNING && Fr_SetAbsoluteTimer(ctrl, timer_idx, cycle_set, offset_threshold) & E_OK) {
348 RPP_MUTEX_UNLOCK(mutex_fr);
352 RPP_MUTEX_UNLOCK(mutex_fr);
357 int8_t rpp_fr_cancel_timer(uint8_t ctrl, uint8_t timer_idx)
359 RPP_MUTEX_LOCK(mutex_fr);
360 if (rpp_fr_state == RPP_FR_RUNNING && Fr_CancelAbsoluteTimer(ctrl, timer_idx) & E_OK) {
361 RPP_MUTEX_UNLOCK(mutex_fr);
365 RPP_MUTEX_UNLOCK(mutex_fr);
370 int8_t rpp_fr_clear_timer_irq(uint8_t ctrl, uint8_t timer_idx)
372 RPP_MUTEX_LOCK(mutex_fr);
373 if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_AckAbsoluteTimerIRQ(ctrl, timer_idx) & E_OK) {
374 RPP_MUTEX_UNLOCK(mutex_fr);
378 RPP_MUTEX_UNLOCK(mutex_fr);
383 int8_t rpp_fr_get_timer_irq_status(uint8_t ctrl, uint8_t timer_idx, boolean_t *irq_pending)
385 RPP_MUTEX_LOCK(mutex_fr);
386 if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_GetAbsoluteTimerIRQStatus(ctrl, timer_idx, irq_pending) & E_OK) {
387 RPP_MUTEX_UNLOCK(mutex_fr);
391 RPP_MUTEX_UNLOCK(mutex_fr);
396 int8_t rpp_fr_get_driver_version(Std_VersionInfoType *version)
398 Fr_GetVersionInfo(version);
402 int8_t rpp_fr_read_com_ctrl_config(uint8_t ctrl, uint8_t param_idx, uint32_t *param_value)
404 RPP_MUTEX_LOCK(mutex_fr);
405 if (Fr_ReadCCConfig(ctrl, param_idx, param_value) & E_OK) {
406 RPP_MUTEX_UNLOCK(mutex_fr);
410 RPP_MUTEX_UNLOCK(mutex_fr);
415 #endif /* FREERTOS_POSIX */