Renesas / R_BSP Featured

Dependents:   GR-PEACH_Azure_Speech ImageZoomInout_Sample ImageRotaion_Sample ImageScroll_Sample ... more

Fork of R_BSP by Daiki Kato

SSIF

The SSIF driver implements transmission and reception functionality which uses the SSIF in the RZ/A Series.

Hello World!

Import program

00001 #include "mbed.h"
00002 #include "R_BSP_Ssif.h"
00003 #include "sine_data_tbl.h"
00004 
00005 //I2S send only, The upper limit of write buffer is 8.
00006 R_BSP_Ssif ssif(P4_4, P4_5, P4_7, P4_6, 0x80, 8, 0);
00007 
00008 static void callback_ssif_write_end(void * p_data, int32_t result, void * p_app_data) {
00009     if (result < 0) {
00010         printf("ssif write callback error %d\n", result);
00011     }
00012 }
00013 
00014 int main() {
00015     rbsp_data_conf_t   ssif_write_end_conf = {&callback_ssif_write_end, NULL};
00016     ssif_channel_cfg_t ssif_cfg;
00017     int32_t            result;
00018 
00019     //I2S Master, 44.1kHz, 16bit, 2ch
00020     ssif_cfg.enabled                = true;
00021     ssif_cfg.int_level              = 0x78;
00022     ssif_cfg.slave_mode             = false;
00023     ssif_cfg.sample_freq            = 44100u;
00024     ssif_cfg.clk_select             = SSIF_CFG_CKS_AUDIO_X1;
00025     ssif_cfg.multi_ch               = SSIF_CFG_MULTI_CH_1;
00026     ssif_cfg.data_word              = SSIF_CFG_DATA_WORD_16;
00027     ssif_cfg.system_word            = SSIF_CFG_SYSTEM_WORD_32;
00028     ssif_cfg.bclk_pol               = SSIF_CFG_FALLING;
00029     ssif_cfg.ws_pol                 = SSIF_CFG_WS_LOW;
00030     ssif_cfg.padding_pol            = SSIF_CFG_PADDING_LOW;
00031     ssif_cfg.serial_alignment       = SSIF_CFG_DATA_FIRST;
00032     ssif_cfg.parallel_alignment     = SSIF_CFG_LEFT;
00033     ssif_cfg.ws_delay               = SSIF_CFG_DELAY;
00034     ssif_cfg.noise_cancel           = SSIF_CFG_DISABLE_NOISE_CANCEL;
00035     ssif_cfg.tdm_mode               = SSIF_CFG_DISABLE_TDM;
00036     ssif_cfg.romdec_direct.mode     = SSIF_CFG_DISABLE_ROMDEC_DIRECT;
00037     ssif_cfg.romdec_direct.p_cbfunc = NULL;
00038     result = ssif.ConfigChannel(&ssif_cfg);
00039     if (result < 0) {
00040         printf("ssif config error %d\n", result);
00041     }
00042 
00043     while (1) {
00044         //The upper limit of write buffer is 8.
00045         result = ssif.write((void *)sin_data_44100Hz_16bit_2ch, 
00046                             sizeof(sin_data_44100Hz_16bit_2ch), &ssif_write_end_conf);
00047         if (result < 0) {
00048             printf("ssif write api error %d\n", result);
00049         }
00050     }
00051 }

API

Import library

Public Member Functions

R_BSP_Ssif (PinName sck, PinName ws, PinName tx, PinName rx, uint8_t int_level=0x80, int32_t max_write_num=16, int32_t max_read_num=16)
Constructor.
virtual ~R_BSP_Ssif ()
Destructor.
int32_t GetSsifChNo (void)
Get a value of SSIF channel number.
bool ConfigChannel (const ssif_channel_cfg_t *const p_ch_cfg)
Save configuration to the SSIF driver.
bool GetStatus (uint32_t *const p_status)
Get a value of SSISR register.
int32_t write (void *const p_data, uint32_t data_size, const rbsp_data_conf_t *const p_data_conf=NULL)
Write count bytes to the file associated.
int32_t read (void *const p_data, uint32_t data_size, const rbsp_data_conf_t *const p_data_conf=NULL)
Read count bytes to the file associated.

Protected Member Functions

void write_init (void *handle, void *p_func_a, int32_t max_buff_num=16)
Write init.
void read_init (void *handle, void *p_func_a, int32_t max_buff_num=16)
Read init.

Interface

See the Pinout page for more details


SCUX

The SCUX module consists of a sampling rate converter, a digital volume unit, and a mixer.
The SCUX driver can perform asynchronous and synchronous sampling rate conversions using the sampling rate converter. The SCUX driver uses the DMA transfer mode to input and output audio data.

Hello World!

Import program

00001 #include "mbed.h"
00002 #include "R_BSP_Scux.h"
00003 #include "USBHostMSD.h"
00004 
00005 R_BSP_Scux scux(SCUX_CH_0);
00006 
00007 #define WRITE_SAMPLE_NUM (128)
00008 #define READ_SAMPLE_NUM  (2048)
00009 
00010 const short sin_data[WRITE_SAMPLE_NUM] = {
00011  0x0000,0x0000,0x0C8C,0x0C8C,0x18F9,0x18F9,0x2528,0x2528
00012 ,0x30FB,0x30FB,0x3C56,0x3C56,0x471C,0x471C,0x5133,0x5133
00013 ,0x5A82,0x5A82,0x62F1,0x62F1,0x6A6D,0x6A6D,0x70E2,0x70E2
00014 ,0x7641,0x7641,0x7A7C,0x7A7C,0x7D89,0x7D89,0x7F61,0x7F61
00015 ,0x7FFF,0x7FFF,0x7F61,0x7F61,0x7D89,0x7D89,0x7A7C,0x7A7C
00016 ,0x7641,0x7641,0x70E2,0x70E2,0x6A6D,0x6A6D,0x62F1,0x62F1
00017 ,0x5A82,0x5A82,0x5133,0x5133,0x471C,0x471C,0x3C56,0x3C56
00018 ,0x30FB,0x30FB,0x2528,0x2528,0x18F9,0x18F9,0x0C8C,0x0C8C
00019 ,0x0000,0x0000,0xF374,0xF374,0xE707,0xE707,0xDAD8,0xDAD8
00020 ,0xCF05,0xCF05,0xC3AA,0xC3AA,0xB8E4,0xB8E4,0xAECD,0xAECD
00021 ,0xA57E,0xA57E,0x9D0F,0x9D0F,0x9593,0x9593,0x8F1E,0x8F1E
00022 ,0x89BF,0x89BF,0x8584,0x8584,0x8277,0x8277,0x809F,0x809F
00023 ,0x8001,0x8001,0x809F,0x809F,0x8277,0x8277,0x8584,0x8584
00024 ,0x89BF,0x89BF,0x8F1E,0x8F1E,0x9593,0x9593,0x9D0F,0x9D0F
00025 ,0xA57E,0xA57E,0xAECD,0xAECD,0xB8E4,0xB8E4,0xC3AA,0xC3AA
00026 ,0xCF05,0xCF05,0xDAD8,0xDAD8,0xE707,0xE707,0xF374,0xF374
00027 };
00028 
00029 #if defined(__ICCARM__)
00030 #pragma data_alignment=4
00031 short write_buff[WRITE_SAMPLE_NUM]@ ".mirrorram";
00032 #pragma data_alignment=4
00033 short read_buff[READ_SAMPLE_NUM]@ ".mirrorram";
00034 #else
00035 short write_buff[WRITE_SAMPLE_NUM] __attribute((section("NC_BSS"),aligned(4)));
00036 short read_buff[READ_SAMPLE_NUM] __attribute((section("NC_BSS"),aligned(4)));
00037 #endif
00038 
00039 void scux_setup(void);
00040 void write_task(void const*);
00041 void file_output_to_usb(void);
00042 
00043 int main(void) {
00044     // set up SRC parameters.
00045     scux_setup();
00046 
00047     printf("Sampling rate conversion Start.\n");
00048     // start accepting transmit/receive requests.
00049     scux.TransStart();
00050 
00051     // create a new thread to write to SCUX.
00052     Thread writeTask(write_task, NULL, osPriorityNormal, 1024 * 4);
00053 
00054     // receive request to the SCUX driver.
00055     scux.read(read_buff, sizeof(read_buff));
00056     printf("Sampling rate conversion End.\n");
00057 
00058     // output binary file to USB port 0.
00059     file_output_to_usb();
00060 }
00061 
00062 void scux_setup(void) {
00063     scux_src_usr_cfg_t src_cfg;
00064 
00065     src_cfg.src_enable           = true;
00066     src_cfg.word_len             = SCUX_DATA_LEN_16;
00067     src_cfg.mode_sync            = true;
00068     src_cfg.input_rate           = SAMPLING_RATE_48000HZ;
00069     src_cfg.output_rate          = SAMPLING_RATE_96000HZ;
00070     src_cfg.select_in_data_ch[0] = SELECT_IN_DATA_CH_0;
00071     src_cfg.select_in_data_ch[1] = SELECT_IN_DATA_CH_1;
00072 
00073     scux.SetSrcCfg(&src_cfg);
00074 }
00075 
00076 void scux_flush_callback(int scux_ch) {
00077     // do nothing
00078 }
00079 
00080 void write_task(void const*) {
00081     memcpy(write_buff, sin_data, sizeof(write_buff));
00082     // send request to the SCUX driver.
00083     scux.write(write_buff, sizeof(write_buff));
00084 
00085     // stop the acceptance of transmit/receive requests.
00086     scux.FlushStop(&scux_flush_callback);
00087 }
00088 
00089 void file_output_to_usb(void) {
00090     FILE * fp = NULL;
00091     int i;
00092 
00093     USBHostMSD msd("usb");
00094 
00095     // try to connect a MSD device
00096     for(i = 0; i < 10; i++) {
00097         if (msd.connect()) {
00098             break;
00099         }
00100         wait(0.5);
00101     }
00102 
00103     if (msd.connected()) {
00104         fp = fopen("/usb/scux_input.dat", "rb");
00105         if (fp == NULL) {
00106             fp = fopen("/usb/scux_input.dat", "wb");
00107             if (fp != NULL) {
00108                 fwrite(write_buff, sizeof(short), WRITE_SAMPLE_NUM, fp);
00109                 fclose(fp);
00110                 printf("Output binary file(Input data) to USB.\n");
00111             } else {
00112                 printf("Failed to output binary file(Input data).\n");
00113             }
00114         } else {
00115             printf("Binary file(Input data) exists.\n");
00116             fclose(fp);
00117         }
00118 
00119         fp = fopen("/usb/scux_output.dat", "rb");
00120         if (fp == NULL) {
00121             fp = fopen("/usb/scux_output.dat", "wb");
00122             if (fp != NULL) {
00123                 fwrite(read_buff, sizeof(short), READ_SAMPLE_NUM, fp);
00124                 fclose(fp);
00125                 printf("Output binary file(Output data) to USB.\n");
00126             } else {
00127                 printf("Failed to output binary file(Output data).\n");
00128             }
00129         } else {
00130             printf("Binary file(Output data) exists.\n");
00131             fclose(fp);
00132         }
00133     } else {
00134         printf("Failed to connect to the USB device.\n");
00135     }
00136 } 

API

Import library

Public Member Functions

R_BSP_Scux ( scux_ch_num_t channel, uint8_t int_level=0x80, int32_t max_write_num=16, int32_t max_read_num=16)
Constructor: Initializes and opens the channel designated by the SCUX driver.
virtual ~R_BSP_Scux (void)
Destructor: Closes the channel designated by the SCUX driver and exits.
bool TransStart (void)
Sets up the SCUX HW and starts operation, then starts accepting write/read requests.
bool FlushStop (void(*const callback)(int32_t))
Stops accepting write/read requests, flushes out all data in the SCUX that is requested for transfer, then stops the HW operation.
bool ClearStop (void)
Discards all data in the SCUX that is requested for transfer before stopping the hardware operation and stops accepting write/read requests.
bool SetSrcCfg (const scux_src_usr_cfg_t *const p_src_param)
Sets up SRC parameters.
bool GetWriteStat (uint32_t *const p_write_stat)
Obtains the state information of the write request.
bool GetReadStat (uint32_t *const p_read_stat)
Obtains the state information of the read request.
int32_t write (void *const p_data, uint32_t data_size, const rbsp_data_conf_t *const p_data_conf=NULL)
Write count bytes to the file associated.
int32_t read (void *const p_data, uint32_t data_size, const rbsp_data_conf_t *const p_data_conf=NULL)
Read count bytes to the file associated.

Protected Member Functions

void write_init (void *handle, void *p_func_a, int32_t max_buff_num=16)
Write init.
void read_init (void *handle, void *p_func_a, int32_t max_buff_num=16)
Read init.

Write request state transition diagram

/media/uploads/dkato/scux_write_state_transition.png

Read request state transition diagram

/media/uploads/dkato/scux_read_state_transition.png

Committer:
dkato
Date:
Wed Dec 16 07:29:42 2015 +0000
Revision:
8:cbb9d60c8748
Parent:
5:1390bfcb667c
minor changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:702bf7b2b7d8 1 /******************************************************************************
dkato 0:702bf7b2b7d8 2 *
dkato 5:1390bfcb667c 3 * $Rev: 1674 $
dkato 0:702bf7b2b7d8 4 * $Date: 2012-12-18 11:09:19 +0900#$
dkato 0:702bf7b2b7d8 5 *
dkato 0:702bf7b2b7d8 6 * Description : ITRON support functions for IOIF Asynchronous I/O header file
dkato 0:702bf7b2b7d8 7 *
dkato 0:702bf7b2b7d8 8 * (C) Copyright RENESAS ELECTRONICS EUROPE Ltd 2012 All Rights Reserved
dkato 0:702bf7b2b7d8 9 *****************************************************************************/
dkato 0:702bf7b2b7d8 10
dkato 0:702bf7b2b7d8 11 /*************************************************************************
dkato 0:702bf7b2b7d8 12 System Includes
dkato 0:702bf7b2b7d8 13 *************************************************************************/
dkato 0:702bf7b2b7d8 14
dkato 0:702bf7b2b7d8 15 #include <r_errno.h>
dkato 0:702bf7b2b7d8 16 #include <cmsis_os.h>
dkato 0:702bf7b2b7d8 17 #include <aioif.h>
dkato 0:702bf7b2b7d8 18 #if(1) /* mbed */
dkato 0:702bf7b2b7d8 19 #include "cmsis.h"
dkato 8:cbb9d60c8748 20 #else /* not mbed */
dkato 0:702bf7b2b7d8 21 #include <ipcb.h>
dkato 0:702bf7b2b7d8 22 #include <ioif_aio_helper.h>
dkato 8:cbb9d60c8748 23 #endif /* end mbed */
dkato 0:702bf7b2b7d8 24 #include <misratypes.h>
dkato 0:702bf7b2b7d8 25 #include "bsp_drv_cmn.h"
dkato 5:1390bfcb667c 26 #if defined (__ICCARM__)
dkato 5:1390bfcb667c 27 #include <intrinsics.h>
dkato 5:1390bfcb667c 28 #include "Renesas_RZ_A1.h"
dkato 5:1390bfcb667c 29 #endif
dkato 0:702bf7b2b7d8 30
dkato 0:702bf7b2b7d8 31 /*************************************************************************
dkato 0:702bf7b2b7d8 32 OS Resources
dkato 0:702bf7b2b7d8 33 *************************************************************************/
dkato 0:702bf7b2b7d8 34
dkato 0:702bf7b2b7d8 35
dkato 0:702bf7b2b7d8 36 /*************************************************************************
dkato 0:702bf7b2b7d8 37 Functions
dkato 0:702bf7b2b7d8 38 *************************************************************************/
dkato 0:702bf7b2b7d8 39 static void ahf_lock(AHF_S * const ahf);
dkato 0:702bf7b2b7d8 40 static void ahf_unlock(AHF_S * const ahf);
dkato 0:702bf7b2b7d8 41
dkato 0:702bf7b2b7d8 42 static void ahf_lock(AHF_S * const ahf)
dkato 0:702bf7b2b7d8 43 {
dkato 0:702bf7b2b7d8 44 if(ahf->flags & AHF_LOCKSEM)
dkato 0:702bf7b2b7d8 45 {
dkato 0:702bf7b2b7d8 46 osMutexWait(ahf->semid, 0);
dkato 0:702bf7b2b7d8 47 }
dkato 0:702bf7b2b7d8 48 else if (ahf->flags & AHF_LOCKINT)
dkato 0:702bf7b2b7d8 49 {
dkato 5:1390bfcb667c 50 #if defined (__ICCARM__)
dkato 5:1390bfcb667c 51 ahf->saved_int_mask = __disable_irq_iar();
dkato 5:1390bfcb667c 52 #else
dkato 0:702bf7b2b7d8 53 ahf->saved_int_mask = __disable_irq();
dkato 5:1390bfcb667c 54 #endif
dkato 0:702bf7b2b7d8 55 }
dkato 0:702bf7b2b7d8 56 else
dkato 0:702bf7b2b7d8 57 {
dkato 0:702bf7b2b7d8 58 ; /* MISRA compliance. */
dkato 0:702bf7b2b7d8 59 }
dkato 0:702bf7b2b7d8 60 }
dkato 0:702bf7b2b7d8 61
dkato 0:702bf7b2b7d8 62 static void ahf_unlock(AHF_S * const ahf)
dkato 0:702bf7b2b7d8 63 {
dkato 0:702bf7b2b7d8 64 if(ahf->flags & AHF_LOCKSEM)
dkato 0:702bf7b2b7d8 65 {
dkato 0:702bf7b2b7d8 66 osMutexRelease(ahf->semid);
dkato 0:702bf7b2b7d8 67 }
dkato 0:702bf7b2b7d8 68 else if (ahf->flags & AHF_LOCKINT)
dkato 0:702bf7b2b7d8 69 {
dkato 0:702bf7b2b7d8 70 if (0 == ahf->saved_int_mask)
dkato 0:702bf7b2b7d8 71 {
dkato 0:702bf7b2b7d8 72 __enable_irq();
dkato 0:702bf7b2b7d8 73 }
dkato 0:702bf7b2b7d8 74 }
dkato 0:702bf7b2b7d8 75 else
dkato 0:702bf7b2b7d8 76 {
dkato 0:702bf7b2b7d8 77 ; /* MISRA compliance. */
dkato 0:702bf7b2b7d8 78 }
dkato 0:702bf7b2b7d8 79 }
dkato 0:702bf7b2b7d8 80
dkato 0:702bf7b2b7d8 81 /***********************************************************************************
dkato 0:702bf7b2b7d8 82 Function Name: ahf_create
dkato 0:702bf7b2b7d8 83
dkato 0:702bf7b2b7d8 84 Description: Creates an empty aio control queue pointer.
dkato 0:702bf7b2b7d8 85 Creates a mutex if AHF_CREATESEM bit flag is set.
dkato 0:702bf7b2b7d8 86
dkato 0:702bf7b2b7d8 87 Parameters: ahf - aio queue structure pointer.
dkato 0:702bf7b2b7d8 88 f - flag indicating that at semaphore is to be created.
dkato 0:702bf7b2b7d8 89
dkato 0:702bf7b2b7d8 90 Return value: 0 on success. negative error code on error.
dkato 0:702bf7b2b7d8 91 ***********************************************************************************/
dkato 0:702bf7b2b7d8 92 int32_t ahf_create (AHF_S * const ahf, const uint32_t f)
dkato 0:702bf7b2b7d8 93 {
dkato 0:702bf7b2b7d8 94 osMutexDef_t* p_mutex_def;
dkato 0:702bf7b2b7d8 95 uint32_t* p_mutex_data;
dkato 5:1390bfcb667c 96 #if defined (__GNUC__)
dkato 5:1390bfcb667c 97 int_t was_masked;
dkato 5:1390bfcb667c 98 #endif/*__GNUC__*/
dkato 0:702bf7b2b7d8 99
dkato 0:702bf7b2b7d8 100 if (ahf == NULL)
dkato 0:702bf7b2b7d8 101 {
dkato 0:702bf7b2b7d8 102 return EFAULT;
dkato 0:702bf7b2b7d8 103 }
dkato 0:702bf7b2b7d8 104
dkato 0:702bf7b2b7d8 105 ahf->head = NULL;
dkato 0:702bf7b2b7d8 106 ahf->tail = NULL;
dkato 0:702bf7b2b7d8 107 ahf->flags = f;
dkato 0:702bf7b2b7d8 108
dkato 0:702bf7b2b7d8 109 /* create the mutex if required */
dkato 0:702bf7b2b7d8 110 if (f & AHF_CREATESEM)
dkato 0:702bf7b2b7d8 111 {
dkato 5:1390bfcb667c 112 #if defined (__GNUC__)
dkato 5:1390bfcb667c 113 /* disable all irq */
dkato 5:1390bfcb667c 114 was_masked = __disable_irq();
dkato 5:1390bfcb667c 115 #endif/*__GNUC__*/
dkato 0:702bf7b2b7d8 116 p_mutex_def = calloc(1, sizeof(osMutexDef_t));
dkato 5:1390bfcb667c 117 #if defined (__GNUC__)
dkato 5:1390bfcb667c 118 if (0 == was_masked)
dkato 5:1390bfcb667c 119 {
dkato 5:1390bfcb667c 120 /* enable all irq */
dkato 5:1390bfcb667c 121 __enable_irq();
dkato 5:1390bfcb667c 122 }
dkato 5:1390bfcb667c 123 #endif/*__GNUC__*/
dkato 0:702bf7b2b7d8 124 if ( NULL == p_mutex_def )
dkato 0:702bf7b2b7d8 125 {
dkato 0:702bf7b2b7d8 126 return ENOMEM;
dkato 0:702bf7b2b7d8 127 }
dkato 5:1390bfcb667c 128 #if defined (__GNUC__)
dkato 5:1390bfcb667c 129 /* disable all irq */
dkato 5:1390bfcb667c 130 was_masked = __disable_irq();
dkato 5:1390bfcb667c 131 #endif/*__GNUC__*/
dkato 0:702bf7b2b7d8 132 p_mutex_data = calloc(3, sizeof(uint32_t));
dkato 5:1390bfcb667c 133 #if defined (__GNUC__)
dkato 5:1390bfcb667c 134 if (0 == was_masked)
dkato 5:1390bfcb667c 135 {
dkato 5:1390bfcb667c 136 /* enable all irq */
dkato 5:1390bfcb667c 137 __enable_irq();
dkato 5:1390bfcb667c 138 }
dkato 5:1390bfcb667c 139 #endif/*__GNUC__*/
dkato 0:702bf7b2b7d8 140 if ( NULL == p_mutex_data )
dkato 0:702bf7b2b7d8 141 {
dkato 5:1390bfcb667c 142 #if defined (__GNUC__)
dkato 5:1390bfcb667c 143 /* disable all irq */
dkato 5:1390bfcb667c 144 was_masked = __disable_irq();
dkato 5:1390bfcb667c 145 #endif/*__GNUC__*/
dkato 0:702bf7b2b7d8 146 free(p_mutex_def);
dkato 5:1390bfcb667c 147 #if defined (__GNUC__)
dkato 5:1390bfcb667c 148 if (0 == was_masked)
dkato 5:1390bfcb667c 149 {
dkato 5:1390bfcb667c 150 /* enable all irq */
dkato 5:1390bfcb667c 151 __enable_irq();
dkato 5:1390bfcb667c 152 }
dkato 5:1390bfcb667c 153 #endif/*__GNUC__*/
dkato 0:702bf7b2b7d8 154 return ENOMEM;
dkato 0:702bf7b2b7d8 155 }
dkato 0:702bf7b2b7d8 156 p_mutex_def->mutex = p_mutex_data;
dkato 0:702bf7b2b7d8 157 ahf->p_cmtx = p_mutex_def;
dkato 0:702bf7b2b7d8 158 ahf->semid = osMutexCreate (p_mutex_def);
dkato 0:702bf7b2b7d8 159 if ( NULL == ahf->semid )
dkato 0:702bf7b2b7d8 160 {
dkato 5:1390bfcb667c 161 #if defined (__GNUC__)
dkato 5:1390bfcb667c 162 /* disable all irq */
dkato 5:1390bfcb667c 163 was_masked = __disable_irq();
dkato 5:1390bfcb667c 164 #endif/*__GNUC__*/
dkato 0:702bf7b2b7d8 165 free(p_mutex_data);
dkato 0:702bf7b2b7d8 166 free(p_mutex_def);
dkato 5:1390bfcb667c 167 #if defined (__GNUC__)
dkato 5:1390bfcb667c 168 if (0 == was_masked)
dkato 5:1390bfcb667c 169 {
dkato 5:1390bfcb667c 170 /* enable all irq */
dkato 5:1390bfcb667c 171 __enable_irq();
dkato 5:1390bfcb667c 172 }
dkato 5:1390bfcb667c 173 #endif/*__GNUC__*/
dkato 0:702bf7b2b7d8 174 return ENOMEM;
dkato 0:702bf7b2b7d8 175 }
dkato 0:702bf7b2b7d8 176 }
dkato 0:702bf7b2b7d8 177
dkato 0:702bf7b2b7d8 178 return 0;
dkato 0:702bf7b2b7d8 179 }
dkato 0:702bf7b2b7d8 180
dkato 0:702bf7b2b7d8 181 /***********************************************************************************
dkato 0:702bf7b2b7d8 182 Function Name: ahf_destroy
dkato 0:702bf7b2b7d8 183
dkato 0:702bf7b2b7d8 184 Description: Delete aio control block mutex (if it exists).
dkato 0:702bf7b2b7d8 185 Note: This function does not delete the aio control block queue.
dkato 0:702bf7b2b7d8 186
dkato 0:702bf7b2b7d8 187 Parameters: ahf - aio queue structure pointer.
dkato 0:702bf7b2b7d8 188
dkato 0:702bf7b2b7d8 189 Return value: void
dkato 0:702bf7b2b7d8 190
dkato 0:702bf7b2b7d8 191 ***********************************************************************************/
dkato 0:702bf7b2b7d8 192 void ahf_destroy (AHF_S const * const ahf)
dkato 0:702bf7b2b7d8 193 {
dkato 5:1390bfcb667c 194 #if defined (__GNUC__)
dkato 5:1390bfcb667c 195 int_t was_masked;
dkato 5:1390bfcb667c 196 #endif/*__GNUC__*/
dkato 5:1390bfcb667c 197
dkato 0:702bf7b2b7d8 198 if (ahf == NULL)
dkato 0:702bf7b2b7d8 199 {
dkato 0:702bf7b2b7d8 200 return;
dkato 0:702bf7b2b7d8 201 }
dkato 0:702bf7b2b7d8 202
dkato 0:702bf7b2b7d8 203 if (ahf->flags & AHF_CREATESEM)
dkato 0:702bf7b2b7d8 204 {
dkato 0:702bf7b2b7d8 205 osMutexDelete (ahf->semid);
dkato 5:1390bfcb667c 206 #if defined (__GNUC__)
dkato 5:1390bfcb667c 207 /* disable all irq */
dkato 5:1390bfcb667c 208 was_masked = __disable_irq();
dkato 5:1390bfcb667c 209 #endif/*__GNUC__*/
dkato 0:702bf7b2b7d8 210 free(ahf->p_cmtx->mutex);
dkato 0:702bf7b2b7d8 211 free(ahf->p_cmtx);
dkato 5:1390bfcb667c 212 #if defined (__GNUC__)
dkato 5:1390bfcb667c 213 if (0 == was_masked)
dkato 5:1390bfcb667c 214 {
dkato 5:1390bfcb667c 215 /* enable all irq */
dkato 5:1390bfcb667c 216 __enable_irq();
dkato 5:1390bfcb667c 217 }
dkato 5:1390bfcb667c 218 #endif/*__GNUC__*/
dkato 0:702bf7b2b7d8 219 }
dkato 0:702bf7b2b7d8 220 }
dkato 0:702bf7b2b7d8 221
dkato 0:702bf7b2b7d8 222 /***********************************************************************************
dkato 0:702bf7b2b7d8 223 Function Name: ahf_addtail
dkato 0:702bf7b2b7d8 224
dkato 0:702bf7b2b7d8 225 Description: Add an aio control block to the queue.
dkato 0:702bf7b2b7d8 226
dkato 0:702bf7b2b7d8 227 Parameters: ahf - aio queue structure pointer.
dkato 0:702bf7b2b7d8 228 aio - pointer to queue structure.
dkato 0:702bf7b2b7d8 229
dkato 0:702bf7b2b7d8 230 Return value: void
dkato 0:702bf7b2b7d8 231
dkato 0:702bf7b2b7d8 232 ***********************************************************************************/
dkato 0:702bf7b2b7d8 233 void ahf_addtail (AHF_S * const ahf, struct aiocb * const aio)
dkato 0:702bf7b2b7d8 234 {
dkato 0:702bf7b2b7d8 235 if (ahf == NULL)
dkato 0:702bf7b2b7d8 236 {
dkato 0:702bf7b2b7d8 237 return;
dkato 0:702bf7b2b7d8 238 }
dkato 0:702bf7b2b7d8 239
dkato 0:702bf7b2b7d8 240 ahf_lock (ahf);
dkato 0:702bf7b2b7d8 241 if (ahf->tail != NULL)
dkato 0:702bf7b2b7d8 242 {
dkato 0:702bf7b2b7d8 243 ahf->tail->pNext = aio;
dkato 0:702bf7b2b7d8 244 }
dkato 0:702bf7b2b7d8 245 aio->pPrev = ahf->tail;
dkato 0:702bf7b2b7d8 246 aio->pNext = NULL;
dkato 0:702bf7b2b7d8 247 ahf->tail = aio;
dkato 0:702bf7b2b7d8 248 if (ahf->head == NULL)
dkato 0:702bf7b2b7d8 249 {
dkato 0:702bf7b2b7d8 250 /* list was empty */
dkato 0:702bf7b2b7d8 251 ahf->head = aio;
dkato 0:702bf7b2b7d8 252 }
dkato 0:702bf7b2b7d8 253
dkato 0:702bf7b2b7d8 254 ahf_unlock (ahf);
dkato 0:702bf7b2b7d8 255 }
dkato 0:702bf7b2b7d8 256
dkato 0:702bf7b2b7d8 257 /***********************************************************************************
dkato 0:702bf7b2b7d8 258 Function Name: ahf_removehead
dkato 0:702bf7b2b7d8 259
dkato 0:702bf7b2b7d8 260 Description: Remove an aio control block from the queue.
dkato 0:702bf7b2b7d8 261
dkato 0:702bf7b2b7d8 262 Parameters: ahf - aio queue structure pointer.
dkato 0:702bf7b2b7d8 263
dkato 0:702bf7b2b7d8 264 Return value: aio control block, or NULL if queue is empty.
dkato 0:702bf7b2b7d8 265
dkato 0:702bf7b2b7d8 266 ***********************************************************************************/
dkato 0:702bf7b2b7d8 267 struct aiocb *ahf_removehead (AHF_S * const ahf)
dkato 0:702bf7b2b7d8 268 {
dkato 0:702bf7b2b7d8 269 struct aiocb *aio;
dkato 0:702bf7b2b7d8 270
dkato 0:702bf7b2b7d8 271 if (ahf == NULL)
dkato 0:702bf7b2b7d8 272 {
dkato 0:702bf7b2b7d8 273 return(NULL);
dkato 0:702bf7b2b7d8 274 }
dkato 0:702bf7b2b7d8 275
dkato 0:702bf7b2b7d8 276 ahf_lock (ahf);
dkato 0:702bf7b2b7d8 277
dkato 0:702bf7b2b7d8 278 aio = ahf->head;
dkato 0:702bf7b2b7d8 279 if (aio != NULL)
dkato 0:702bf7b2b7d8 280 {
dkato 0:702bf7b2b7d8 281 ahf->head = aio->pNext;
dkato 0:702bf7b2b7d8 282 if (aio->pNext != NULL)
dkato 0:702bf7b2b7d8 283 {
dkato 0:702bf7b2b7d8 284 aio->pNext->pPrev = NULL;
dkato 0:702bf7b2b7d8 285 }
dkato 0:702bf7b2b7d8 286 if (ahf->tail == aio)
dkato 0:702bf7b2b7d8 287 {
dkato 0:702bf7b2b7d8 288 /* the list is now empty */
dkato 0:702bf7b2b7d8 289 ahf->tail = NULL;
dkato 0:702bf7b2b7d8 290 }
dkato 0:702bf7b2b7d8 291 }
dkato 0:702bf7b2b7d8 292
dkato 0:702bf7b2b7d8 293 ahf_unlock (ahf);
dkato 0:702bf7b2b7d8 294 return aio;
dkato 0:702bf7b2b7d8 295 }
dkato 0:702bf7b2b7d8 296
dkato 0:702bf7b2b7d8 297 /***********************************************************************************
dkato 0:702bf7b2b7d8 298 Function Name: ahf_peekhead
dkato 0:702bf7b2b7d8 299
dkato 0:702bf7b2b7d8 300 Description: Get an aio control block from the queue, but do not remove from the queue.
dkato 0:702bf7b2b7d8 301
dkato 0:702bf7b2b7d8 302 Parameters: ahf - aio queue structure pointer.
dkato 0:702bf7b2b7d8 303
dkato 0:702bf7b2b7d8 304 Return value: aio control block, or NULL if queue is empty.
dkato 0:702bf7b2b7d8 305
dkato 0:702bf7b2b7d8 306 ***********************************************************************************/
dkato 0:702bf7b2b7d8 307 struct aiocb *ahf_peekhead (AHF_S * const ahf)
dkato 0:702bf7b2b7d8 308 {
dkato 0:702bf7b2b7d8 309 struct aiocb *aio;
dkato 0:702bf7b2b7d8 310
dkato 0:702bf7b2b7d8 311 ahf_lock (ahf);
dkato 0:702bf7b2b7d8 312
dkato 0:702bf7b2b7d8 313 aio = ahf->head;
dkato 0:702bf7b2b7d8 314
dkato 0:702bf7b2b7d8 315 ahf_unlock (ahf);
dkato 0:702bf7b2b7d8 316 return aio;
dkato 0:702bf7b2b7d8 317 }
dkato 0:702bf7b2b7d8 318
dkato 0:702bf7b2b7d8 319 /***********************************************************************************
dkato 0:702bf7b2b7d8 320 Function Name: ahf_cancelall
dkato 0:702bf7b2b7d8 321
dkato 0:702bf7b2b7d8 322 Description: Empty an aio control block queue.
dkato 0:702bf7b2b7d8 323
dkato 0:702bf7b2b7d8 324 Parameters: ahf - aio queue structure pointer.
dkato 0:702bf7b2b7d8 325
dkato 0:702bf7b2b7d8 326 Return value: void
dkato 0:702bf7b2b7d8 327
dkato 0:702bf7b2b7d8 328 ***********************************************************************************/
dkato 0:702bf7b2b7d8 329 void ahf_cancelall (AHF_S * const ahf)
dkato 0:702bf7b2b7d8 330 {
dkato 0:702bf7b2b7d8 331 struct aiocb *cur, *next;
dkato 0:702bf7b2b7d8 332
dkato 0:702bf7b2b7d8 333 ahf_lock (ahf);
dkato 0:702bf7b2b7d8 334
dkato 0:702bf7b2b7d8 335 /* cancel all pending requests */
dkato 0:702bf7b2b7d8 336 cur = ahf->head;
dkato 0:702bf7b2b7d8 337 while (cur != NULL)
dkato 0:702bf7b2b7d8 338 {
dkato 0:702bf7b2b7d8 339 next = cur->pNext;
dkato 0:702bf7b2b7d8 340 cur->aio_return = ECANCELED;
dkato 0:702bf7b2b7d8 341 ahf_complete (ahf, cur);
dkato 0:702bf7b2b7d8 342 cur = next;
dkato 0:702bf7b2b7d8 343 }
dkato 0:702bf7b2b7d8 344 /* mark the list as empty */
dkato 0:702bf7b2b7d8 345 ahf->head = NULL;
dkato 0:702bf7b2b7d8 346 ahf->tail = NULL;
dkato 0:702bf7b2b7d8 347
dkato 0:702bf7b2b7d8 348 ahf_unlock (ahf);
dkato 0:702bf7b2b7d8 349 }
dkato 0:702bf7b2b7d8 350
dkato 0:702bf7b2b7d8 351 /***********************************************************************************
dkato 0:702bf7b2b7d8 352 Function Name: ahf_complete
dkato 0:702bf7b2b7d8 353
dkato 0:702bf7b2b7d8 354 Description: Flag that the operation is complete.
dkato 0:702bf7b2b7d8 355 If required by the sigev_notify variable contents, the calling task is
dkato 0:702bf7b2b7d8 356 notified.
dkato 0:702bf7b2b7d8 357 If a notify was setup, it is signalled.
dkato 0:702bf7b2b7d8 358
dkato 0:702bf7b2b7d8 359 Parameters: ahf - aio queue structure pointer.
dkato 0:702bf7b2b7d8 360 aio - pointer to queue structure.
dkato 0:702bf7b2b7d8 361
dkato 0:702bf7b2b7d8 362 Return value: 0 on success. negative error code on error.
dkato 0:702bf7b2b7d8 363
dkato 0:702bf7b2b7d8 364 ***********************************************************************************/
dkato 0:702bf7b2b7d8 365 void ahf_complete (AHF_S *ahf, struct aiocb * const aio)
dkato 0:702bf7b2b7d8 366 {
dkato 0:702bf7b2b7d8 367 #if(1) /* mbed */
dkato 8:cbb9d60c8748 368 #else /* not mbed */
dkato 0:702bf7b2b7d8 369 int rv;
dkato 8:cbb9d60c8748 370 #endif /* end mbed */
dkato 0:702bf7b2b7d8 371 UNUSED_ARG(ahf);
dkato 0:702bf7b2b7d8 372
dkato 0:702bf7b2b7d8 373 if (NULL == aio)
dkato 0:702bf7b2b7d8 374 {
dkato 0:702bf7b2b7d8 375 return;
dkato 0:702bf7b2b7d8 376 }
dkato 0:702bf7b2b7d8 377
dkato 0:702bf7b2b7d8 378 /* Flag that the operation is complete */
dkato 0:702bf7b2b7d8 379 /* This function must be here
dkato 0:702bf7b2b7d8 380 because another task may release AIOCB block
dkato 0:702bf7b2b7d8 381 after the task changed by an iTRON function in the switch statement */
dkato 0:702bf7b2b7d8 382 aio->aio_complete = 1;
dkato 0:702bf7b2b7d8 383 switch (aio->aio_sigevent.sigev_notify)
dkato 0:702bf7b2b7d8 384 {
dkato 0:702bf7b2b7d8 385 case SIGEV_EVENT:
dkato 0:702bf7b2b7d8 386 osSignalSet ((osThreadId)aio->aio_sigevent.sigev_value.sival_int,
dkato 0:702bf7b2b7d8 387 (int32_t)aio->aio_sigevent.sigev_signo);
dkato 0:702bf7b2b7d8 388 break;
dkato 0:702bf7b2b7d8 389
dkato 0:702bf7b2b7d8 390 case SIGEV_THREAD:
dkato 0:702bf7b2b7d8 391 if (aio->aio_sigevent.sigev_notify_function)
dkato 0:702bf7b2b7d8 392 {
dkato 0:702bf7b2b7d8 393 (aio->aio_sigevent.sigev_notify_function)
dkato 0:702bf7b2b7d8 394 (aio->aio_sigevent.sigev_value);
dkato 0:702bf7b2b7d8 395 }
dkato 0:702bf7b2b7d8 396 break;
dkato 0:702bf7b2b7d8 397
dkato 0:702bf7b2b7d8 398 #if(1) /* mbed */
dkato 8:cbb9d60c8748 399 #else /* not mbed */
dkato 0:702bf7b2b7d8 400 case SIGEV_CALLBACK:
dkato 0:702bf7b2b7d8 401 rv = ipcb_callback ((ipcb_id_t*)aio->aio_sigevent.sigev_signo, &aio->aio_sigevent);
dkato 0:702bf7b2b7d8 402 break;
dkato 8:cbb9d60c8748 403 #endif /* end mbed */
dkato 0:702bf7b2b7d8 404
dkato 0:702bf7b2b7d8 405 default:
dkato 0:702bf7b2b7d8 406 /* No notify function */
dkato 0:702bf7b2b7d8 407 break;
dkato 0:702bf7b2b7d8 408
dkato 0:702bf7b2b7d8 409 }
dkato 0:702bf7b2b7d8 410
dkato 0:702bf7b2b7d8 411 /* Wakeup any suspended tasks */
dkato 0:702bf7b2b7d8 412 #if(1) /* mbed */
dkato 8:cbb9d60c8748 413 #else /* not mbed */
dkato 0:702bf7b2b7d8 414 aio_complete_suspended(aio);
dkato 8:cbb9d60c8748 415 #endif /* end mbed */
dkato 0:702bf7b2b7d8 416 }
dkato 0:702bf7b2b7d8 417
dkato 0:702bf7b2b7d8 418 /***********************************************************************************
dkato 0:702bf7b2b7d8 419 Function Name: ahf_cancel
dkato 0:702bf7b2b7d8 420
dkato 0:702bf7b2b7d8 421 Description: Remove an aio control block from the queue.
dkato 0:702bf7b2b7d8 422 Signal completion to the calling task and wake it up.
dkato 0:702bf7b2b7d8 423 If aio is NULL, cancel all.
dkato 0:702bf7b2b7d8 424
dkato 0:702bf7b2b7d8 425 Parameters: ahf - aio queue structure pointer.
dkato 0:702bf7b2b7d8 426 aio - pointer to queue structure.
dkato 0:702bf7b2b7d8 427
dkato 0:702bf7b2b7d8 428 Return value: 0 on success. negative error code on error.
dkato 0:702bf7b2b7d8 429
dkato 0:702bf7b2b7d8 430 ***********************************************************************************/
dkato 0:702bf7b2b7d8 431 int32_t ahf_cancel (AHF_S * const ahf, struct aiocb * const aio)
dkato 0:702bf7b2b7d8 432 {
dkato 0:702bf7b2b7d8 433 struct aiocb *cur;
dkato 0:702bf7b2b7d8 434 int32_t rv = EINVAL;
dkato 0:702bf7b2b7d8 435
dkato 0:702bf7b2b7d8 436 if (ahf == NULL)
dkato 0:702bf7b2b7d8 437 {
dkato 0:702bf7b2b7d8 438 return EFAULT;
dkato 0:702bf7b2b7d8 439 }
dkato 0:702bf7b2b7d8 440
dkato 0:702bf7b2b7d8 441 /* If aio is NULL, must cancel all. */
dkato 0:702bf7b2b7d8 442 if(NULL == aio)
dkato 0:702bf7b2b7d8 443 {
dkato 0:702bf7b2b7d8 444 ahf_cancelall(ahf);
dkato 0:702bf7b2b7d8 445 rv = 0;
dkato 0:702bf7b2b7d8 446 }
dkato 0:702bf7b2b7d8 447
dkato 0:702bf7b2b7d8 448 else
dkato 0:702bf7b2b7d8 449 {
dkato 0:702bf7b2b7d8 450 ahf_lock (ahf);
dkato 0:702bf7b2b7d8 451
dkato 0:702bf7b2b7d8 452 cur = ahf->head;
dkato 0:702bf7b2b7d8 453 while ((cur != NULL) && (cur != aio))
dkato 0:702bf7b2b7d8 454 {
dkato 0:702bf7b2b7d8 455 cur = cur->pNext;
dkato 0:702bf7b2b7d8 456 }
dkato 0:702bf7b2b7d8 457
dkato 0:702bf7b2b7d8 458 if (cur == aio)
dkato 0:702bf7b2b7d8 459 {
dkato 0:702bf7b2b7d8 460 if (aio->pPrev != NULL)
dkato 0:702bf7b2b7d8 461 {
dkato 0:702bf7b2b7d8 462 aio->pPrev->pNext = aio->pNext;
dkato 0:702bf7b2b7d8 463 }
dkato 0:702bf7b2b7d8 464
dkato 0:702bf7b2b7d8 465 if (aio->pNext != NULL)
dkato 0:702bf7b2b7d8 466 {
dkato 0:702bf7b2b7d8 467 aio->pNext->pPrev = aio->pPrev;
dkato 0:702bf7b2b7d8 468 }
dkato 0:702bf7b2b7d8 469
dkato 0:702bf7b2b7d8 470 if (ahf->head == cur)
dkato 0:702bf7b2b7d8 471 {
dkato 0:702bf7b2b7d8 472 ahf->head = cur->pNext;
dkato 0:702bf7b2b7d8 473 }
dkato 0:702bf7b2b7d8 474
dkato 0:702bf7b2b7d8 475 if (ahf->tail == cur)
dkato 0:702bf7b2b7d8 476 {
dkato 0:702bf7b2b7d8 477 ahf->tail = cur->pPrev;
dkato 0:702bf7b2b7d8 478 }
dkato 0:702bf7b2b7d8 479
dkato 0:702bf7b2b7d8 480 cur->aio_return = ECANCELED;
dkato 0:702bf7b2b7d8 481 ahf_complete (ahf, aio);
dkato 0:702bf7b2b7d8 482 rv = 0;
dkato 0:702bf7b2b7d8 483 }
dkato 0:702bf7b2b7d8 484
dkato 0:702bf7b2b7d8 485 ahf_unlock (ahf);
dkato 0:702bf7b2b7d8 486 }
dkato 0:702bf7b2b7d8 487 return rv;
dkato 0:702bf7b2b7d8 488 }