test public

Dependencies:   HttpServer_snapshot_mbed-os

Committer:
anhtran
Date:
Fri Oct 18 03:09:43 2019 +0000
Revision:
0:e9fd5575b10e
abc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
anhtran 0:e9fd5575b10e 1 /*******************************************************************************
anhtran 0:e9fd5575b10e 2 * DISCLAIMER
anhtran 0:e9fd5575b10e 3 * This software is supplied by Renesas Electronics Corporation and is only
anhtran 0:e9fd5575b10e 4 * intended for use with Renesas products. No other uses are authorized. This
anhtran 0:e9fd5575b10e 5 * software is owned by Renesas Electronics Corporation and is protected under
anhtran 0:e9fd5575b10e 6 * all applicable laws, including copyright laws.
anhtran 0:e9fd5575b10e 7 * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
anhtran 0:e9fd5575b10e 8 * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
anhtran 0:e9fd5575b10e 9 * LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
anhtran 0:e9fd5575b10e 10 * AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
anhtran 0:e9fd5575b10e 11 * TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
anhtran 0:e9fd5575b10e 12 * ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
anhtran 0:e9fd5575b10e 13 * FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
anhtran 0:e9fd5575b10e 14 * ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
anhtran 0:e9fd5575b10e 15 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
anhtran 0:e9fd5575b10e 16 * Renesas reserves the right, without notice, to make changes to this software
anhtran 0:e9fd5575b10e 17 * and to discontinue the availability of this software. By using this software,
anhtran 0:e9fd5575b10e 18 * you agree to the additional terms and conditions found by accessing the
anhtran 0:e9fd5575b10e 19 * following link:
anhtran 0:e9fd5575b10e 20 * http://www.renesas.com/disclaimer*
anhtran 0:e9fd5575b10e 21 * Copyright (C) 2015 Renesas Electronics Corporation. All rights reserved.
anhtran 0:e9fd5575b10e 22 *******************************************************************************/
anhtran 0:e9fd5575b10e 23
anhtran 0:e9fd5575b10e 24 #include "cmsis_os.h"
anhtran 0:e9fd5575b10e 25 #include "r_typedefs.h"
anhtran 0:e9fd5575b10e 26 #include "r_errno.h"
anhtran 0:e9fd5575b10e 27 #include "aioif.h"
anhtran 0:e9fd5575b10e 28 #include "R_BSP_Aio.h"
anhtran 0:e9fd5575b10e 29
anhtran 0:e9fd5575b10e 30 typedef int32_t (*rbsp_read_write_a_func_t)(void* const p_fd, AIOCB* const p_aio, int32_t* const p_errno);
anhtran 0:e9fd5575b10e 31
anhtran 0:e9fd5575b10e 32 R_BSP_Aio::R_BSP_Aio() {
anhtran 0:e9fd5575b10e 33 }
anhtran 0:e9fd5575b10e 34
anhtran 0:e9fd5575b10e 35 R_BSP_Aio::~R_BSP_Aio() {
anhtran 0:e9fd5575b10e 36 if (write_ctl.MaxNum != 0) {
anhtran 0:e9fd5575b10e 37 delete [] (rbsp_sival_t *)write_ctl.p_sival_top;
anhtran 0:e9fd5575b10e 38 delete [] (AIOCB *)write_ctl.p_aio_top;
anhtran 0:e9fd5575b10e 39 delete write_ctl.p_sem_ctl;
anhtran 0:e9fd5575b10e 40 }
anhtran 0:e9fd5575b10e 41 if (read_ctl.MaxNum != 0) {
anhtran 0:e9fd5575b10e 42 delete [] (rbsp_sival_t *)read_ctl.p_sival_top;
anhtran 0:e9fd5575b10e 43 delete [] (AIOCB *)read_ctl.p_aio_top;
anhtran 0:e9fd5575b10e 44 delete read_ctl.p_sem_ctl;
anhtran 0:e9fd5575b10e 45 }
anhtran 0:e9fd5575b10e 46 }
anhtran 0:e9fd5575b10e 47
anhtran 0:e9fd5575b10e 48 void R_BSP_Aio::init(rbsp_serial_ctl_t * p_ctl, void * handle, void * p_func_a, int32_t max_buff_num) {
anhtran 0:e9fd5575b10e 49 if (handle != NULL) {
anhtran 0:e9fd5575b10e 50 p_ctl->ch_handle = handle;
anhtran 0:e9fd5575b10e 51 p_ctl->MaxNum = max_buff_num;
anhtran 0:e9fd5575b10e 52 p_ctl->p_aio_top = NULL;
anhtran 0:e9fd5575b10e 53 p_ctl->index = 0;
anhtran 0:e9fd5575b10e 54 p_ctl->p_async_func = p_func_a;
anhtran 0:e9fd5575b10e 55 if (p_ctl->MaxNum != 0) {
anhtran 0:e9fd5575b10e 56 p_ctl->p_sem_ctl = new Semaphore(p_ctl->MaxNum);
anhtran 0:e9fd5575b10e 57 p_ctl->p_aio_top = new AIOCB[p_ctl->MaxNum];
anhtran 0:e9fd5575b10e 58 p_ctl->p_sival_top = new rbsp_sival_t[p_ctl->MaxNum];
anhtran 0:e9fd5575b10e 59 }
anhtran 0:e9fd5575b10e 60 }
anhtran 0:e9fd5575b10e 61 }
anhtran 0:e9fd5575b10e 62
anhtran 0:e9fd5575b10e 63 int32_t R_BSP_Aio::write(void * const p_data, uint32_t data_size, const rbsp_data_conf_t * const p_data_conf) {
anhtran 0:e9fd5575b10e 64 if (p_data_conf == NULL) {
anhtran 0:e9fd5575b10e 65 return sync_trans(&write_ctl, p_data, data_size);
anhtran 0:e9fd5575b10e 66 } else {
anhtran 0:e9fd5575b10e 67 return aio_trans(&write_ctl, p_data, data_size, p_data_conf);
anhtran 0:e9fd5575b10e 68 }
anhtran 0:e9fd5575b10e 69 }
anhtran 0:e9fd5575b10e 70
anhtran 0:e9fd5575b10e 71 int32_t R_BSP_Aio::read(void * const p_data, uint32_t data_size, const rbsp_data_conf_t * const p_data_conf) {
anhtran 0:e9fd5575b10e 72 if (p_data_conf == NULL) {
anhtran 0:e9fd5575b10e 73 return sync_trans(&read_ctl, p_data, data_size);
anhtran 0:e9fd5575b10e 74 } else {
anhtran 0:e9fd5575b10e 75 return aio_trans(&read_ctl, p_data, data_size, p_data_conf);
anhtran 0:e9fd5575b10e 76 }
anhtran 0:e9fd5575b10e 77 }
anhtran 0:e9fd5575b10e 78
anhtran 0:e9fd5575b10e 79 /* static */ int32_t R_BSP_Aio::sync_trans(rbsp_serial_ctl_t * p_ctl, void * const p_data, uint32_t data_size) {
anhtran 0:e9fd5575b10e 80 rbsp_sync_t sync_info;
anhtran 0:e9fd5575b10e 81 rbsp_data_conf_t data_conf;
anhtran 0:e9fd5575b10e 82 Semaphore * p_sem_wait = new Semaphore(0);
anhtran 0:e9fd5575b10e 83
anhtran 0:e9fd5575b10e 84 sync_info.result = -1;
anhtran 0:e9fd5575b10e 85 if (p_sem_wait != NULL) {
anhtran 0:e9fd5575b10e 86 sync_info.p_sem = p_sem_wait;
anhtran 0:e9fd5575b10e 87
anhtran 0:e9fd5575b10e 88 data_conf.p_notify_func = &callback_sync_trans;
anhtran 0:e9fd5575b10e 89 data_conf.p_app_data = &sync_info;
anhtran 0:e9fd5575b10e 90
anhtran 0:e9fd5575b10e 91 if (aio_trans(p_ctl, p_data, data_size, &data_conf) == ESUCCESS) {
anhtran 0:e9fd5575b10e 92 p_sem_wait->wait(osWaitForever);
anhtran 0:e9fd5575b10e 93 }
anhtran 0:e9fd5575b10e 94 delete p_sem_wait;
anhtran 0:e9fd5575b10e 95 }
anhtran 0:e9fd5575b10e 96
anhtran 0:e9fd5575b10e 97 return sync_info.result;
anhtran 0:e9fd5575b10e 98 }
anhtran 0:e9fd5575b10e 99
anhtran 0:e9fd5575b10e 100 /* static */ void R_BSP_Aio::callback_sync_trans(void * p_data, int32_t result, void * p_app_data) {
anhtran 0:e9fd5575b10e 101 rbsp_sync_t * p_sync_info = (rbsp_sync_t *)p_app_data;
anhtran 0:e9fd5575b10e 102
anhtran 0:e9fd5575b10e 103 p_sync_info->result = result;
anhtran 0:e9fd5575b10e 104 p_sync_info->p_sem->release();
anhtran 0:e9fd5575b10e 105 }
anhtran 0:e9fd5575b10e 106
anhtran 0:e9fd5575b10e 107 /* static */ int32_t R_BSP_Aio::aio_trans(rbsp_serial_ctl_t * const p_ctl,
anhtran 0:e9fd5575b10e 108 void * const p_data, uint32_t data_size, const rbsp_data_conf_t * const p_data_conf) {
anhtran 0:e9fd5575b10e 109 int32_t wk_errno;
anhtran 0:e9fd5575b10e 110 AIOCB * p_rbsp_aio;
anhtran 0:e9fd5575b10e 111 rbsp_sival_t * p_sival;
anhtran 0:e9fd5575b10e 112 rbsp_read_write_a_func_t p_func = (rbsp_read_write_a_func_t)p_ctl->p_async_func;
anhtran 0:e9fd5575b10e 113
anhtran 0:e9fd5575b10e 114 if ((p_data_conf == NULL) || (p_data == NULL)) {
anhtran 0:e9fd5575b10e 115 wk_errno = ENOSPC_RBSP;
anhtran 0:e9fd5575b10e 116 } else if (p_ctl->p_sem_ctl->wait(osWaitForever) == -1) {
anhtran 0:e9fd5575b10e 117 wk_errno = EIO_RBSP;
anhtran 0:e9fd5575b10e 118 } else {
anhtran 0:e9fd5575b10e 119 p_rbsp_aio = (AIOCB *)p_ctl->p_aio_top + p_ctl->index;
anhtran 0:e9fd5575b10e 120 p_sival = p_ctl->p_sival_top + p_ctl->index;
anhtran 0:e9fd5575b10e 121
anhtran 0:e9fd5575b10e 122 p_sival->p_cb_func = p_data_conf->p_notify_func;
anhtran 0:e9fd5575b10e 123 p_sival->p_cb_data = p_data_conf->p_app_data;
anhtran 0:e9fd5575b10e 124 p_sival->p_sem = p_ctl->p_sem_ctl;
anhtran 0:e9fd5575b10e 125 p_sival->p_aio = p_rbsp_aio;
anhtran 0:e9fd5575b10e 126
anhtran 0:e9fd5575b10e 127 p_rbsp_aio->aio_fildes = 0;
anhtran 0:e9fd5575b10e 128 p_rbsp_aio->aio_buf = p_data;
anhtran 0:e9fd5575b10e 129 p_rbsp_aio->aio_nbytes = data_size;
anhtran 0:e9fd5575b10e 130 p_rbsp_aio->aio_offset = 0;
anhtran 0:e9fd5575b10e 131 p_rbsp_aio->aio_sigevent.sigev_notify = SIGEV_THREAD;
anhtran 0:e9fd5575b10e 132 p_rbsp_aio->aio_sigevent.sigev_value.sival_ptr = (void*)p_sival;
anhtran 0:e9fd5575b10e 133 p_rbsp_aio->aio_sigevent.sigev_notify_function = &callback_aio_trans;
anhtran 0:e9fd5575b10e 134 p_func(p_ctl->ch_handle, p_rbsp_aio, &wk_errno);
anhtran 0:e9fd5575b10e 135
anhtran 0:e9fd5575b10e 136 if (wk_errno == ESUCCESS) {
anhtran 0:e9fd5575b10e 137 if ((p_ctl->index + 1) >= p_ctl->MaxNum) {
anhtran 0:e9fd5575b10e 138 p_ctl->index = 0;
anhtran 0:e9fd5575b10e 139 } else {
anhtran 0:e9fd5575b10e 140 p_ctl->index++;
anhtran 0:e9fd5575b10e 141 }
anhtran 0:e9fd5575b10e 142 } else {
anhtran 0:e9fd5575b10e 143 p_ctl->p_sem_ctl->release();
anhtran 0:e9fd5575b10e 144 }
anhtran 0:e9fd5575b10e 145 }
anhtran 0:e9fd5575b10e 146
anhtran 0:e9fd5575b10e 147 return wk_errno;
anhtran 0:e9fd5575b10e 148 }
anhtran 0:e9fd5575b10e 149
anhtran 0:e9fd5575b10e 150 /* static */ void R_BSP_Aio::callback_aio_trans(union sigval signo) {
anhtran 0:e9fd5575b10e 151 rbsp_sival_t * p_sival = (rbsp_sival_t *)signo.sival_ptr;
anhtran 0:e9fd5575b10e 152 AIOCB * p_aio_result = (AIOCB *)p_sival->p_aio;
anhtran 0:e9fd5575b10e 153
anhtran 0:e9fd5575b10e 154 if ((p_sival->p_cb_func != NULL) && (p_aio_result != NULL)) {
anhtran 0:e9fd5575b10e 155 p_sival->p_cb_func((void *)p_aio_result->aio_buf, p_aio_result->aio_return, p_sival->p_cb_data);
anhtran 0:e9fd5575b10e 156 }
anhtran 0:e9fd5575b10e 157 p_sival->p_sem->release();
anhtran 0:e9fd5575b10e 158 }