Example Program for EVAL-AD7606

Dependencies:   platform_drivers

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?

UserRevisionLine numberNew 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 }