2 * Copyright (C) 2012-2013 Czech Technical University in Prague
4 * Created on: 28.2.2013
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 * This file contains commands for LIN control.
33 #include "commands/cmd_lin.h"
35 /** Semaphore used to stop command, until message is received */
36 xSemaphoreHandle linMsgReceived;
37 /** Semaphore used to stop command, until ID is received */
38 xSemaphoreHandle linIDReceived;
41 * @brief Function called by LIN ISR
42 * Gives semaphores according the type of interrupt
44 * @param[in] lin Pointer to LIN registers
45 * @param[in] flags Type of interrupt
47 void linNotification(linBASE_t *lin, uint32_t flags)
49 if (flags & LIN_ID_INT) {
50 xSemaphoreGiveFromISR(linIDReceived, NULL);
52 if (flags & LIN_RX_INT) {
54 xSemaphoreGiveFromISR(linMsgReceived, NULL);
58 /** @brief Command for testing LIN loopback
60 * Command sends short data chunk and counts errors when receiving through loopback.
62 * @param[in] cmd_io Pointer to IO functions
63 * @param[in] cmd_des Pointer to command descriptor
64 * @param[in] param Pointer to an array of parameters
68 int cmd_do_lin_loop_back(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]) {
69 uint8_t txData[8] = {'L', 'I', 'N', ' ', 'T', 'E', 'S', 'T'};
74 linEnableLoopback(linREG, Digital);
75 hal_gpio_pin_set_value(PIN_DSC_LIN1NSLP, 1);
76 linIDReceived = xSemaphoreCreateCounting(1, 0);
77 linMsgReceived = xSemaphoreCreateCounting(1, 0);
79 linSetLength(linREG, 8);
80 linSendHeader(linREG, txID);
81 while(!linIsTxReady(linREG)) ;
82 xSemaphoreTake(linIDReceived, portMAX_DELAY);
83 rxID = linGetIdentifier(linREG);
85 linSend(linREG, txData);
86 while(!linIsTxReady(linREG)) ;
87 xSemaphoreTake(linMsgReceived, portMAX_DELAY);
88 linGetData(linREG, rxData);
91 for (i = 0; i < 8; i++) {
92 if (txData[i] != rxData[i]) errCnt++;
99 rpp_sci_printf("Transmission errors: %d\r\n", errCnt);
103 rpp_sci_printf("FAILED: Sent and Received ID does not match.");
105 vSemaphoreDelete(linIDReceived);
106 vSemaphoreDelete(linMsgReceived);
107 hal_gpio_pin_set_value(PIN_DSC_LIN1NSLP, 0);
111 /** Descriptor of command for lin loopback test */
112 cmd_des_t const cmd_des_lin_loop_back={
114 "testlin","Test digital loopback on LIN",
115 cmd_do_lin_loop_back, (void *)&cmd_list_lin
118 /** List of commands for lin, defined as external */
119 cmd_des_t const *cmd_list_lin[]={
120 &cmd_des_lin_loop_back,