Example Program for EVAL-AD7606
Dependencies: platform_drivers
app/iio_transport.c@5:42b1eeef29d9, 2020-10-19 (annotated)
- Committer:
- Kjansen45
- Date:
- Mon Oct 19 07:54:56 2020 +0000
- Revision:
- 5:42b1eeef29d9
- Parent:
- 1:819ac9aa5667
Repository update
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mahphalke |
1:819ac9aa5667 | 1 | /***************************************************************************//** |
mahphalke |
1:819ac9aa5667 | 2 | * @file iio_transport.c |
mahphalke |
1:819ac9aa5667 | 3 | * @brief Implementation of iio transport layer interface for AD7606 |
mahphalke |
1:819ac9aa5667 | 4 | ******************************************************************************** |
mahphalke |
1:819ac9aa5667 | 5 | * Copyright (c) 2020 Analog Devices, Inc. |
mahphalke |
1:819ac9aa5667 | 6 | * |
mahphalke |
1:819ac9aa5667 | 7 | * This software is proprietary to Analog Devices, Inc. and its licensors. |
mahphalke |
1:819ac9aa5667 | 8 | * By using this software you agree to the terms of the associated |
mahphalke |
1:819ac9aa5667 | 9 | * Analog Devices Software License Agreement. |
mahphalke |
1:819ac9aa5667 | 10 | *******************************************************************************/ |
mahphalke |
1:819ac9aa5667 | 11 | |
mahphalke |
1:819ac9aa5667 | 12 | /******************************************************************************/ |
mahphalke |
1:819ac9aa5667 | 13 | /***************************** Include Files **********************************/ |
mahphalke |
1:819ac9aa5667 | 14 | /******************************************************************************/ |
mahphalke |
1:819ac9aa5667 | 15 | |
mahphalke |
1:819ac9aa5667 | 16 | #include "iio_transport.h" |
mahphalke |
1:819ac9aa5667 | 17 | |
mahphalke |
1:819ac9aa5667 | 18 | /******************************************************************************/ |
mahphalke |
1:819ac9aa5667 | 19 | /********************** Macros and Constants Definition ***********************/ |
mahphalke |
1:819ac9aa5667 | 20 | /******************************************************************************/ |
mahphalke |
1:819ac9aa5667 | 21 | |
mahphalke |
1:819ac9aa5667 | 22 | /* Max buffer length to hold IIO client data/command */ |
mahphalke |
1:819ac9aa5667 | 23 | #define IIO_CMD_DATA_BUFF_SIZE (100) |
mahphalke |
1:819ac9aa5667 | 24 | |
mahphalke |
1:819ac9aa5667 | 25 | /******************************************************************************/ |
mahphalke |
1:819ac9aa5667 | 26 | /*************************** Types Declarations *******************************/ |
mahphalke |
1:819ac9aa5667 | 27 | /******************************************************************************/ |
mahphalke |
1:819ac9aa5667 | 28 | |
mahphalke |
1:819ac9aa5667 | 29 | /* UART descriptor to read/write UART peripheral data */ |
mahphalke |
1:819ac9aa5667 | 30 | static struct uart_desc *uart_desc = NULL; |
mahphalke |
1:819ac9aa5667 | 31 | |
mahphalke |
1:819ac9aa5667 | 32 | /* IIO command buffer */ |
mahphalke |
1:819ac9aa5667 | 33 | static volatile char iio_cmd_buffer[IIO_CMD_DATA_BUFF_SIZE]; |
mahphalke |
1:819ac9aa5667 | 34 | |
mahphalke |
1:819ac9aa5667 | 35 | /* IIO data buffer */ |
mahphalke |
1:819ac9aa5667 | 36 | static volatile char iio_data_buffer[IIO_CMD_DATA_BUFF_SIZE]; |
mahphalke |
1:819ac9aa5667 | 37 | |
mahphalke |
1:819ac9aa5667 | 38 | /* New IIO command detect flag */ |
mahphalke |
1:819ac9aa5667 | 39 | static volatile bool new_iio_cmd_detected = false; |
mahphalke |
1:819ac9aa5667 | 40 | |
mahphalke |
1:819ac9aa5667 | 41 | /* Data buffer index */ |
mahphalke |
1:819ac9aa5667 | 42 | volatile static uint8_t data_buff_indx = 0; |
mahphalke |
1:819ac9aa5667 | 43 | |
mahphalke |
1:819ac9aa5667 | 44 | /* Command buffer index */ |
mahphalke |
1:819ac9aa5667 | 45 | volatile static uint8_t cmd_buff_indx = 0; |
mahphalke |
1:819ac9aa5667 | 46 | |
mahphalke |
1:819ac9aa5667 | 47 | /******************************************************************************/ |
mahphalke |
1:819ac9aa5667 | 48 | /************************ Functions Declarations ******************************/ |
mahphalke |
1:819ac9aa5667 | 49 | /******************************************************************************/ |
mahphalke |
1:819ac9aa5667 | 50 | |
mahphalke |
1:819ac9aa5667 | 51 | /******************************************************************************/ |
mahphalke |
1:819ac9aa5667 | 52 | /************************ Functions Definitions *******************************/ |
mahphalke |
1:819ac9aa5667 | 53 | /******************************************************************************/ |
mahphalke |
1:819ac9aa5667 | 54 | |
mahphalke |
1:819ac9aa5667 | 55 | /** |
mahphalke |
1:819ac9aa5667 | 56 | * @brief IIO Wrapper to initialize the UART peripheral |
mahphalke |
1:819ac9aa5667 | 57 | * @param desc- Pointer UART descriptor structure |
mahphalke |
1:819ac9aa5667 | 58 | * @param param- Pointer to UART init param structure |
mahphalke |
1:819ac9aa5667 | 59 | * @return uart init status (SUCCESS/FAILURE) |
mahphalke |
1:819ac9aa5667 | 60 | */ |
mahphalke |
1:819ac9aa5667 | 61 | int32_t iio_uart_init(struct uart_desc **desc, struct uart_init_param *param) |
mahphalke |
1:819ac9aa5667 | 62 | { |
mahphalke |
1:819ac9aa5667 | 63 | if (uart_init(desc, param) == SUCCESS) { |
mahphalke |
1:819ac9aa5667 | 64 | /* Save the descriptor for data read/write operation */ |
mahphalke |
1:819ac9aa5667 | 65 | uart_desc = *desc; |
mahphalke |
1:819ac9aa5667 | 66 | |
mahphalke |
1:819ac9aa5667 | 67 | return SUCCESS; |
mahphalke |
1:819ac9aa5667 | 68 | } else { |
mahphalke |
1:819ac9aa5667 | 69 | return FAILURE; |
mahphalke |
1:819ac9aa5667 | 70 | } |
mahphalke |
1:819ac9aa5667 | 71 | } |
mahphalke |
1:819ac9aa5667 | 72 | |
mahphalke |
1:819ac9aa5667 | 73 | |
mahphalke |
1:819ac9aa5667 | 74 | /** |
mahphalke |
1:819ac9aa5667 | 75 | * @brief IIO Wrapper to wrire data to UART peripheral |
mahphalke |
1:819ac9aa5667 | 76 | * @param buf- Pointer to buffer containing data |
mahphalke |
1:819ac9aa5667 | 77 | * @param len- Number of bytes to write |
mahphalke |
1:819ac9aa5667 | 78 | * @return bytes len in case of success, 0 otherwise |
mahphalke |
1:819ac9aa5667 | 79 | */ |
mahphalke |
1:819ac9aa5667 | 80 | ssize_t iio_uart_write(const char *buf, size_t len) |
mahphalke |
1:819ac9aa5667 | 81 | { |
mahphalke |
1:819ac9aa5667 | 82 | if (uart_write(uart_desc, (uint8_t *)buf, len) == SUCCESS) { |
mahphalke |
1:819ac9aa5667 | 83 | return len; |
mahphalke |
1:819ac9aa5667 | 84 | } else { |
mahphalke |
1:819ac9aa5667 | 85 | return 0; |
mahphalke |
1:819ac9aa5667 | 86 | } |
mahphalke |
1:819ac9aa5667 | 87 | } |
mahphalke |
1:819ac9aa5667 | 88 | |
mahphalke |
1:819ac9aa5667 | 89 | |
mahphalke |
1:819ac9aa5667 | 90 | /** |
mahphalke |
1:819ac9aa5667 | 91 | * @brief IIO Wrapper to read iio data/command from UART peripheral |
mahphalke |
1:819ac9aa5667 | 92 | * @param buf- Pointer to buffer containing data |
mahphalke |
1:819ac9aa5667 | 93 | * @param len- Number of bytes to read |
mahphalke |
1:819ac9aa5667 | 94 | * @return bytes len in case of success, 0 otherwise |
mahphalke |
1:819ac9aa5667 | 95 | */ |
mahphalke |
1:819ac9aa5667 | 96 | ssize_t iio_uart_read(char *buf, size_t len) |
mahphalke |
1:819ac9aa5667 | 97 | { |
mahphalke |
1:819ac9aa5667 | 98 | size_t i = 0; |
mahphalke |
1:819ac9aa5667 | 99 | |
mahphalke |
1:819ac9aa5667 | 100 | if (len > 1) { |
mahphalke |
1:819ac9aa5667 | 101 | do { |
mahphalke |
1:819ac9aa5667 | 102 | /* Wait until new data of expected length is received |
mahphalke |
1:819ac9aa5667 | 103 | * from UART Rx interrupt event */ |
mahphalke |
1:819ac9aa5667 | 104 | } while (data_buff_indx < len); |
mahphalke |
1:819ac9aa5667 | 105 | |
mahphalke |
1:819ac9aa5667 | 106 | /* Get the data into local buffer (entire data) */ |
mahphalke |
1:819ac9aa5667 | 107 | while (i < len) { |
mahphalke |
1:819ac9aa5667 | 108 | buf[i] = iio_data_buffer[i]; |
mahphalke |
1:819ac9aa5667 | 109 | i++; |
mahphalke |
1:819ac9aa5667 | 110 | } |
mahphalke |
1:819ac9aa5667 | 111 | data_buff_indx = 0; |
mahphalke |
1:819ac9aa5667 | 112 | } else { |
mahphalke |
1:819ac9aa5667 | 113 | /* Get the iio command into local buffer (1 character at a time) */ |
mahphalke |
1:819ac9aa5667 | 114 | buf[i] = iio_cmd_buffer[cmd_buff_indx]; |
mahphalke |
1:819ac9aa5667 | 115 | |
mahphalke |
1:819ac9aa5667 | 116 | /* Reset buffer index after reading whole command */ |
mahphalke |
1:819ac9aa5667 | 117 | if (iio_cmd_buffer[cmd_buff_indx] == '\n') { |
mahphalke |
1:819ac9aa5667 | 118 | cmd_buff_indx = 0; |
mahphalke |
1:819ac9aa5667 | 119 | } else { |
mahphalke |
1:819ac9aa5667 | 120 | cmd_buff_indx++; |
mahphalke |
1:819ac9aa5667 | 121 | } |
mahphalke |
1:819ac9aa5667 | 122 | } |
mahphalke |
1:819ac9aa5667 | 123 | |
mahphalke |
1:819ac9aa5667 | 124 | return len; |
mahphalke |
1:819ac9aa5667 | 125 | } |
mahphalke |
1:819ac9aa5667 | 126 | |
mahphalke |
1:819ac9aa5667 | 127 | |
mahphalke |
1:819ac9aa5667 | 128 | /*! |
mahphalke |
1:819ac9aa5667 | 129 | * @brief Callback function to receive IIO command |
mahphalke |
1:819ac9aa5667 | 130 | * @return None |
mahphalke |
1:819ac9aa5667 | 131 | * @details This function is an UART Rx ISR registered by IIO application |
mahphalke |
1:819ac9aa5667 | 132 | * to invoke upon receipt og new character over UART link. |
mahphalke |
1:819ac9aa5667 | 133 | */ |
mahphalke |
1:819ac9aa5667 | 134 | void iio_uart_rx_callback(void) |
mahphalke |
1:819ac9aa5667 | 135 | { |
mahphalke |
1:819ac9aa5667 | 136 | uint8_t rx_char; |
mahphalke |
1:819ac9aa5667 | 137 | |
mahphalke |
1:819ac9aa5667 | 138 | if (uart_read(uart_desc, &rx_char, 1) == SUCCESS) { |
mahphalke |
1:819ac9aa5667 | 139 | |
mahphalke |
1:819ac9aa5667 | 140 | iio_data_buffer[data_buff_indx++] = rx_char; |
mahphalke |
1:819ac9aa5667 | 141 | |
mahphalke |
1:819ac9aa5667 | 142 | if (rx_char == '\n') { |
mahphalke |
1:819ac9aa5667 | 143 | /* The iio command is identified with new line character */ |
mahphalke |
1:819ac9aa5667 | 144 | memcpy(iio_cmd_buffer, iio_data_buffer, data_buff_indx); |
mahphalke |
1:819ac9aa5667 | 145 | data_buff_indx = 0; |
mahphalke |
1:819ac9aa5667 | 146 | new_iio_cmd_detected = true; |
mahphalke |
1:819ac9aa5667 | 147 | } |
mahphalke |
1:819ac9aa5667 | 148 | } |
mahphalke |
1:819ac9aa5667 | 149 | } |
mahphalke |
1:819ac9aa5667 | 150 | |
mahphalke |
1:819ac9aa5667 | 151 | |
mahphalke |
1:819ac9aa5667 | 152 | /*! |
mahphalke |
1:819ac9aa5667 | 153 | * @brief Function to check for newer IIO command |
mahphalke |
1:819ac9aa5667 | 154 | * @return IIO command status (true/false) |
mahphalke |
1:819ac9aa5667 | 155 | */ |
mahphalke |
1:819ac9aa5667 | 156 | bool is_new_iio_command_detected(void) |
mahphalke |
1:819ac9aa5667 | 157 | { |
mahphalke |
1:819ac9aa5667 | 158 | if (new_iio_cmd_detected) { |
mahphalke |
1:819ac9aa5667 | 159 | new_iio_cmd_detected = false; |
mahphalke |
1:819ac9aa5667 | 160 | return true; |
mahphalke |
1:819ac9aa5667 | 161 | } else { |
mahphalke |
1:819ac9aa5667 | 162 | return false; |
mahphalke |
1:819ac9aa5667 | 163 | } |
mahphalke |
1:819ac9aa5667 | 164 | } |
mahphalke |
1:819ac9aa5667 | 165 | |
mahphalke |
1:819ac9aa5667 | 166 | |
mahphalke |
1:819ac9aa5667 | 167 | /*! |
mahphalke |
1:819ac9aa5667 | 168 | * @brief Function to check for expected IIO command |
mahphalke |
1:819ac9aa5667 | 169 | * @param cmd_str[in] - Expected IIO command string |
mahphalke |
1:819ac9aa5667 | 170 | * @param len[in] - Length of IIO command |
mahphalke |
1:819ac9aa5667 | 171 | * @return IIO command status (true/false) |
mahphalke |
1:819ac9aa5667 | 172 | */ |
mahphalke |
1:819ac9aa5667 | 173 | bool check_iio_cmd(const char *cmd_str, uint8_t len) |
mahphalke |
1:819ac9aa5667 | 174 | { |
mahphalke |
1:819ac9aa5667 | 175 | int ret; |
mahphalke |
1:819ac9aa5667 | 176 | |
mahphalke |
1:819ac9aa5667 | 177 | ret = strncmp(cmd_str, iio_cmd_buffer, len); |
mahphalke |
1:819ac9aa5667 | 178 | if (ret == 0) { |
mahphalke |
1:819ac9aa5667 | 179 | /* String matches, return true */ |
mahphalke |
1:819ac9aa5667 | 180 | return true; |
mahphalke |
1:819ac9aa5667 | 181 | } |
mahphalke |
1:819ac9aa5667 | 182 | |
mahphalke |
1:819ac9aa5667 | 183 | return false; |
mahphalke |
1:819ac9aa5667 | 184 | } |