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 * This document contains proprietary information belonging to Czech
8 * Technical University in Prague. Passing on and copying of this
9 * document, and communication of its contents is not permitted
10 * without prior written authorization.
14 * FlexRay Communication RPP API implementation file.
18 * RPP API documentation.
24 #ifndef FREERTOS_POSIX
29 #include "drv/spi_tms570.h"
30 #include "rpp/mutex.h"
32 RPP_MUTEX_DEFINE(mutex_fr);
34 static rpp_fr_state_t rpp_fr_state = RPP_FR_NOT_INITIALIZED; /**< Stores the actual state of the FlexRay module */
36 /* AUTOSAR-like API */
38 int8_t rpp_fr_init_driver(const Fr_ConfigType *config_ptr, uint32_t *error)
40 if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED)
42 #ifndef FREERTOS_POSIX
45 if (!RPP_MUTEX_INIT(mutex_fr))
48 rpp_fr_state = RPP_FR_DRV_INITIALIZED;
52 int8_t rpp_fr_init_controller(uint8_t ctrl, uint32_t *error)
54 Std_ReturnType retVal = ERR_PARAM_NO_ERROR;
55 RPP_MUTEX_LOCK(mutex_fr);
56 if (rpp_fr_state == RPP_FR_DRV_INITIALIZED ||
57 rpp_fr_state == RPP_FR_HALTED ||
58 rpp_fr_state == RPP_FR_ABORTED) {
59 retVal = Fr_ControllerInit(ctrl);
61 rpp_fr_state = RPP_FR_CTR_INITIALIZED;
62 RPP_MUTEX_UNLOCK(mutex_fr);
67 RPP_MUTEX_UNLOCK(mutex_fr);
71 RPP_MUTEX_UNLOCK(mutex_fr);
76 int8_t rpp_fr_start_communication(uint8_t ctrl, uint32_t *error)
78 Std_ReturnType retVal = ERR_PARAM_NO_ERROR;
80 RPP_MUTEX_LOCK(mutex_fr);
81 if (rpp_fr_state == RPP_FR_CTR_INITIALIZED) {
82 retVal = Fr_StartCommunication(ctrl);
84 rpp_fr_state = RPP_FR_RUNNING;
85 RPP_MUTEX_UNLOCK(mutex_fr);
91 RPP_MUTEX_UNLOCK(mutex_fr);
95 RPP_MUTEX_UNLOCK(mutex_fr);
99 int8_t rpp_fr_all_slots(uint8_t ctrl)
103 RPP_MUTEX_LOCK(mutex_fr);
104 ret = (rpp_fr_state == RPP_FR_RUNNING && Fr_AllSlots(ctrl) & E_OK);
105 RPP_MUTEX_UNLOCK(mutex_fr);
107 return ret ? SUCCESS : FAILURE;
110 int8_t rpp_fr_halt_communication(uint8_t ctrl)
112 RPP_MUTEX_LOCK(mutex_fr);
113 if (rpp_fr_state == RPP_FR_RUNNING && Fr_HaltCommunication(ctrl) & E_OK) {
114 rpp_fr_state = RPP_FR_HALTED;
115 RPP_MUTEX_UNLOCK(mutex_fr);
119 RPP_MUTEX_UNLOCK(mutex_fr);
123 int8_t rpp_fr_abort_communication(uint8_t ctrl)
125 RPP_MUTEX_LOCK(mutex_fr);
126 if (rpp_fr_state == RPP_FR_RUNNING && Fr_AbortCommunication(ctrl) & E_OK) {
127 rpp_fr_state = RPP_FR_ABORTED;
128 RPP_MUTEX_UNLOCK(mutex_fr);
132 RPP_MUTEX_UNLOCK(mutex_fr);
136 int8_t rpp_fr_send_wup(uint8_t ctrl)
138 RPP_MUTEX_LOCK(mutex_fr);
139 if (rpp_fr_state == RPP_FR_CTR_INITIALIZED && Fr_SendWUP(ctrl) & E_OK) {
140 RPP_MUTEX_UNLOCK(mutex_fr);
144 RPP_MUTEX_UNLOCK(mutex_fr);
148 int8_t rpp_fr_set_wu_channel(uint8_t ctrl, Fr_ChannelType channel)
150 RPP_MUTEX_LOCK(mutex_fr);
151 if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_SetWakeupChannel(ctrl, channel) & E_OK) {
152 RPP_MUTEX_UNLOCK(mutex_fr);
156 RPP_MUTEX_UNLOCK(mutex_fr);
160 int8_t rpp_fr_get_poc_status(uint8_t ctrl, Fr_POCStatusType *poc_status_ptr)
162 RPP_MUTEX_LOCK(mutex_fr);
163 if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_GetPOCStatus(ctrl, poc_status_ptr) & E_OK) {
164 RPP_MUTEX_UNLOCK(mutex_fr);
168 RPP_MUTEX_UNLOCK(mutex_fr);
172 int8_t rpp_fr_transmit_lpdu(uint8_t ctrl, uint16_t lpdu_idx, const uint8_t *lsdu, uint8_t lsdu_length)
174 RPP_MUTEX_LOCK(mutex_fr);
175 if (rpp_fr_state == RPP_FR_RUNNING && Fr_TransmitTxLPdu(ctrl, lpdu_idx, lsdu, lsdu_length) & E_OK) {
176 RPP_MUTEX_UNLOCK(mutex_fr);
180 RPP_MUTEX_UNLOCK(mutex_fr);
185 int8_t rpp_fr_cancel_transmit_lpdu(uint8_t ctrl, uint16_t lpdu_idx)
187 RPP_MUTEX_LOCK(mutex_fr);
188 if (rpp_fr_state == RPP_FR_RUNNING && Fr_CancelTxLPdu(ctrl, lpdu_idx) & E_OK) {
189 RPP_MUTEX_UNLOCK(mutex_fr);
193 RPP_MUTEX_UNLOCK(mutex_fr);
198 int8_t rpp_fr_receive_lpdu(uint8_t ctrl, uint16_t lpdu_idx, uint8_t *lsdu, Fr_RxLPduStatusType *lpdu_status, uint8_t *lsdu_length)
200 RPP_MUTEX_LOCK(mutex_fr);
201 if (rpp_fr_state == RPP_FR_RUNNING && Fr_ReceiveRxLPdu(ctrl, lpdu_idx, lsdu, lpdu_status, lsdu_length) & E_OK) {
202 RPP_MUTEX_UNLOCK(mutex_fr);
206 RPP_MUTEX_UNLOCK(mutex_fr);
211 int8_t rpp_fr_check_tx_lpdu_status(uint8_t ctrl, uint16_t lpdu_idx, Fr_TxLPduStatusType *lpdu_status)
213 RPP_MUTEX_LOCK(mutex_fr);
214 if (rpp_fr_state == RPP_FR_RUNNING && Fr_CheckTxLPduStatus(ctrl, lpdu_idx, lpdu_status) & E_OK) {
215 RPP_MUTEX_UNLOCK(mutex_fr);
219 RPP_MUTEX_UNLOCK(mutex_fr);
224 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)
226 RPP_MUTEX_LOCK(mutex_fr);
227 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) {
228 RPP_MUTEX_UNLOCK(mutex_fr);
232 RPP_MUTEX_UNLOCK(mutex_fr);
237 int8_t rpp_fr_disable_lpdu(uint8_t ctrl, uint16_t lpdu_idx)
239 RPP_MUTEX_LOCK(mutex_fr);
240 if (rpp_fr_state == RPP_FR_RUNNING && Fr_DisableLPdu(ctrl, lpdu_idx) & E_OK) {
241 RPP_MUTEX_UNLOCK(mutex_fr);
245 RPP_MUTEX_UNLOCK(mutex_fr);
250 int8_t rpp_fr_get_global_time(uint8_t ctrl, uint8_t *cycle, uint16_t *macroticks)
252 RPP_MUTEX_LOCK(mutex_fr);
253 if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_GetGlobalTime(ctrl, cycle, macroticks) & E_OK) {
254 RPP_MUTEX_UNLOCK(mutex_fr);
258 RPP_MUTEX_UNLOCK(mutex_fr);
263 int8_t rpp_fr_get_network_management_vector(uint8_t ctrl, uint8_t *nm_vector)
265 RPP_MUTEX_LOCK(mutex_fr);
266 if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_GetNmVector(ctrl, nm_vector) & E_OK) {
267 RPP_MUTEX_UNLOCK(mutex_fr);
271 RPP_MUTEX_UNLOCK(mutex_fr);
276 int8_t rpp_fr_get_channel_status(uint8_t ctrl, uint16_t *channel_a_status, uint16_t *channel_b_status)
278 RPP_MUTEX_LOCK(mutex_fr);
279 if (rpp_fr_state >= RPP_FR_CTR_INITIALIZED && Fr_GetChannelStatus(ctrl, channel_a_status, channel_b_status) & E_OK) {
280 RPP_MUTEX_UNLOCK(mutex_fr);
284 RPP_MUTEX_UNLOCK(mutex_fr);
289 int8_t rpp_fr_get_clock_correction(uint8_t ctrl, int16_t *rate_correction, int32_t *offset_correction)
291 RPP_MUTEX_LOCK(mutex_fr);
292 if (rpp_fr_state >= RPP_FR_RUNNING && Fr_GetClockCorrection(ctrl, rate_correction, offset_correction) & E_OK) {
293 RPP_MUTEX_UNLOCK(mutex_fr);
297 RPP_MUTEX_UNLOCK(mutex_fr);
302 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)
304 RPP_MUTEX_LOCK(mutex_fr);
305 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) {
306 RPP_MUTEX_UNLOCK(mutex_fr);
310 RPP_MUTEX_UNLOCK(mutex_fr);
315 int8_t rpp_fr_get_wakeup_rx_status(uint8_t ctrl, uint8_t *status)
317 RPP_MUTEX_LOCK(mutex_fr);
318 if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_GetWakeupRxStatus(ctrl, status) & E_OK) {
319 RPP_MUTEX_UNLOCK(mutex_fr);
323 RPP_MUTEX_UNLOCK(mutex_fr);
328 int8_t rpp_fr_set_timer(uint8_t ctrl, uint8_t timer_idx, uint8_t cycle_set, uint16_t offset_threshold)
330 RPP_MUTEX_LOCK(mutex_fr);
331 if (rpp_fr_state == RPP_FR_RUNNING && Fr_SetAbsoluteTimer(ctrl, timer_idx, cycle_set, offset_threshold) & E_OK) {
332 RPP_MUTEX_UNLOCK(mutex_fr);
336 RPP_MUTEX_UNLOCK(mutex_fr);
341 int8_t rpp_fr_cancel_timer(uint8_t ctrl, uint8_t timer_idx)
343 RPP_MUTEX_LOCK(mutex_fr);
344 if (rpp_fr_state == RPP_FR_RUNNING && Fr_CancelAbsoluteTimer(ctrl, timer_idx) & E_OK) {
345 RPP_MUTEX_UNLOCK(mutex_fr);
349 RPP_MUTEX_UNLOCK(mutex_fr);
354 int8_t rpp_fr_clear_timer_irq(uint8_t ctrl, uint8_t timer_idx)
356 RPP_MUTEX_LOCK(mutex_fr);
357 if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_AckAbsoluteTimerIRQ(ctrl, timer_idx) & E_OK) {
358 RPP_MUTEX_UNLOCK(mutex_fr);
362 RPP_MUTEX_UNLOCK(mutex_fr);
367 int8_t rpp_fr_get_timer_irq_status(uint8_t ctrl, uint8_t timer_idx, boolean_t *irq_pending)
369 RPP_MUTEX_LOCK(mutex_fr);
370 if (rpp_fr_state >= RPP_FR_DRV_INITIALIZED && Fr_GetAbsoluteTimerIRQStatus(ctrl, timer_idx, irq_pending) & E_OK) {
371 RPP_MUTEX_UNLOCK(mutex_fr);
375 RPP_MUTEX_UNLOCK(mutex_fr);
380 int8_t rpp_fr_get_driver_version(Std_VersionInfoType *version)
382 Fr_GetVersionInfo(version);
386 int8_t rpp_fr_read_com_ctrl_config(uint8_t ctrl, uint8_t param_idx, uint32_t *param_value)
388 RPP_MUTEX_LOCK(mutex_fr);
389 if (Fr_ReadCCConfig(ctrl, param_idx, param_value) & E_OK) {
390 RPP_MUTEX_UNLOCK(mutex_fr);
394 RPP_MUTEX_UNLOCK(mutex_fr);
399 #endif /* FREERTOS_POSIX */