RZ/A1H CMSIS-RTOS RTX BSP for GR-PEACH.

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:
Tue May 31 01:45:35 2016 +0000
Revision:
11:fb9eda52224e
Parent:
0:702bf7b2b7d8
"inline" of the ssif_init function is removed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:702bf7b2b7d8 1 /****** ************************************************************************
dkato 0:702bf7b2b7d8 2 *
dkato 0:702bf7b2b7d8 3 * $Rev: 891 $
dkato 0:702bf7b2b7d8 4 * $Date: 2012-12-07 20:36:39 +0900#$
dkato 0:702bf7b2b7d8 5 *
dkato 0:702bf7b2b7d8 6 * Description : errno for POSIX IEEE Std 1003.1-2001
dkato 0:702bf7b2b7d8 7 *
dkato 0:702bf7b2b7d8 8 * (C) Copyright RENESAS ELECTRONICS Ltd 2012 All Rights Reserved
dkato 0:702bf7b2b7d8 9 *****************************************************************************/
dkato 0:702bf7b2b7d8 10
dkato 0:702bf7b2b7d8 11 /* Detect if SHC include errno.h has been included first, this is not supported */
dkato 0:702bf7b2b7d8 12 #ifdef _ERRNO
dkato 0:702bf7b2b7d8 13 #error Renesas/Sh/9_x_x/include/errno.h has been included before SDK errno.h. Please specify SDK include path first.
dkato 0:702bf7b2b7d8 14 #endif
dkato 0:702bf7b2b7d8 15
dkato 0:702bf7b2b7d8 16 #ifndef SDK_ERRNO
dkato 0:702bf7b2b7d8 17 #define SDK_ERRNO
dkato 0:702bf7b2b7d8 18
dkato 0:702bf7b2b7d8 19 /* Include std headers to override _errno with SDK version */
dkato 0:702bf7b2b7d8 20 #include <stdio.h>
dkato 0:702bf7b2b7d8 21 #include <string.h>
dkato 0:702bf7b2b7d8 22 #include <stdlib.h>
dkato 0:702bf7b2b7d8 23 #include <stddef.h>
dkato 0:702bf7b2b7d8 24 #include <math.h>
dkato 0:702bf7b2b7d8 25
dkato 0:702bf7b2b7d8 26 #ifdef __cplusplus
dkato 0:702bf7b2b7d8 27 extern "C" {
dkato 0:702bf7b2b7d8 28 #endif
dkato 0:702bf7b2b7d8 29
dkato 0:702bf7b2b7d8 30 #define _REENTRANT 1
dkato 0:702bf7b2b7d8 31
dkato 0:702bf7b2b7d8 32 /***********************************************************************************
dkato 0:702bf7b2b7d8 33 System Includes
dkato 0:702bf7b2b7d8 34 ***********************************************************************************/
dkato 0:702bf7b2b7d8 35 #ifdef EBADF
dkato 0:702bf7b2b7d8 36 #undef EBADF
dkato 0:702bf7b2b7d8 37 #endif
dkato 0:702bf7b2b7d8 38 #ifdef EDOM
dkato 0:702bf7b2b7d8 39 #undef EDOM
dkato 0:702bf7b2b7d8 40 #endif
dkato 0:702bf7b2b7d8 41
dkato 0:702bf7b2b7d8 42 /* SDK errno extension, SDK returns 0 as success, and -1 when errno set */
dkato 0:702bf7b2b7d8 43 #define ESUCCESS (0)
dkato 0:702bf7b2b7d8 44 #define EERROR (-1)
dkato 0:702bf7b2b7d8 45
dkato 0:702bf7b2b7d8 46 #define EBADF (-17) /* Bad file descriptor */
dkato 0:702bf7b2b7d8 47 #define EINVAL (-28) /* Invalid argument */
dkato 0:702bf7b2b7d8 48 #define ENOMEM (-33) /* No memory available */
dkato 0:702bf7b2b7d8 49 #define ENOLCK (-34) /* No lock available */
dkato 0:702bf7b2b7d8 50 #define ENOENT (-42) /* No such file or directory */
dkato 0:702bf7b2b7d8 51 #define ETIMEDOUT (-50) /* Timed out */
dkato 0:702bf7b2b7d8 52 #define EACCES (-64) /* Access denied */
dkato 0:702bf7b2b7d8 53 #define EAGAIN (-65) /* Resource unavailable. Try again */
dkato 0:702bf7b2b7d8 54 #define EBUSY (-67) /* Device or resource busy */
dkato 0:702bf7b2b7d8 55 #define ECANCELED (-68) /* Operation was cancelled */
dkato 0:702bf7b2b7d8 56 #define EDOM (-69) /* Maths argument out of domain */
dkato 0:702bf7b2b7d8 57 #define EEXIST (-70) /* File, directory or mount exists */
dkato 0:702bf7b2b7d8 58 #define EFBIG (-71) /* File too big */
dkato 0:702bf7b2b7d8 59 #define EINPROGRESS (-72) /* Operation in progress */
dkato 0:702bf7b2b7d8 60 #define EIO (-74) /* Input or Output error (possibly recoverable)*/
dkato 0:702bf7b2b7d8 61 #define EISDIR (-75) /* Is a directory */
dkato 0:702bf7b2b7d8 62 #define EMFILE (-76) /* Too many open files */
dkato 0:702bf7b2b7d8 63 #define ENAMETOOLONG (-77) /* File name too long */
dkato 0:702bf7b2b7d8 64 #define ENFILE (-78) /* Too many files are open in the system */
dkato 0:702bf7b2b7d8 65 #define ENOBUFS (-79) /* No buffers available */
dkato 0:702bf7b2b7d8 66 #define ENODEV (-80) /* Not a valid device */
dkato 0:702bf7b2b7d8 67 #define ENOSPC (-84) /* No space available on device */
dkato 0:702bf7b2b7d8 68 #define ENOTDIR (-85) /* Not a directory */
dkato 0:702bf7b2b7d8 69 #define ENOTEMPTY (-86) /* Directory not empty */
dkato 0:702bf7b2b7d8 70 #define ENOTSUP (-87) /* Not supported */
dkato 0:702bf7b2b7d8 71 #define ENOTTY (-88) /* No TTY available */
dkato 0:702bf7b2b7d8 72 #define ENXIO (-89) /* Not valid IO address or device (unrecoverable)*/
dkato 0:702bf7b2b7d8 73 #define EPERM (-90) /* Operation not permitted */
dkato 0:702bf7b2b7d8 74 #define EROFS (-91) /* Read only file system */
dkato 0:702bf7b2b7d8 75 #define ESPIPE (-92) /* Invalid seek on pipe */
dkato 0:702bf7b2b7d8 76 #define EXDEV (-93) /* Device cross linked */
dkato 0:702bf7b2b7d8 77 #define ENOTSOCK (-94) /* Not a socket */
dkato 0:702bf7b2b7d8 78 #define EMSGSIZE (-95) /* Message too large */
dkato 0:702bf7b2b7d8 79 #define EINTR (-96) /* Function interrupted */
dkato 0:702bf7b2b7d8 80 #define EFAULT (-97) /* Section fault, bad address */
dkato 0:702bf7b2b7d8 81 #define EPIPE (-98) /* Broken pipe */
dkato 0:702bf7b2b7d8 82 #define EALREADY (-99) /* Connection already started */
dkato 0:702bf7b2b7d8 83 #define EDESTADDRREQ (-100) /* Destination address requred */
dkato 0:702bf7b2b7d8 84 #define EPROTOTYPE (-101) /* Wrong protocol or codec type */
dkato 0:702bf7b2b7d8 85 #define ENOPROTOOPT (-102) /* Protocol or codec not available */
dkato 0:702bf7b2b7d8 86 #define EPROTONOSUPPORT (-103) /* Protocol or codec not supported */
dkato 0:702bf7b2b7d8 87 #define EOPNOTSUPP (-104) /* Operation not supported */
dkato 0:702bf7b2b7d8 88 #define EAFNOSUPPORT (-105) /* Address family not supported */
dkato 0:702bf7b2b7d8 89 #define EADDRINUSE (-106) /* Address already in use */
dkato 0:702bf7b2b7d8 90 #define EADDRNOTAVAIL (-107) /* Address not available */
dkato 0:702bf7b2b7d8 91 #define ECONNRESET (-108) /* Connection reset */
dkato 0:702bf7b2b7d8 92 #define EISCONN (-109) /* Connected */
dkato 0:702bf7b2b7d8 93 #define ENOTCONN (-110) /* Not connected */
dkato 0:702bf7b2b7d8 94 #define ECONNREFUSED (-112) /* Connection refused */
dkato 0:702bf7b2b7d8 95 #define EPROCLIM (-113) /* Too many processes */
dkato 0:702bf7b2b7d8 96 #define EUSERS (-114) /* Too many users */
dkato 0:702bf7b2b7d8 97 #define EDEADLK (-115) /* Resource deadlock would occur */
dkato 0:702bf7b2b7d8 98 #define EPROTO (-116) /* Protocol or codec error */
dkato 0:702bf7b2b7d8 99 #define EOVERFLOW (-117) /* Value too large to store in data type */
dkato 0:702bf7b2b7d8 100 #define ESRCH (-118) /* No such task */
dkato 0:702bf7b2b7d8 101 #define EILSEQ (-119) /* Illegal byte sequence format */
dkato 0:702bf7b2b7d8 102 #define EBADMSG (-120) /* Bad message */
dkato 0:702bf7b2b7d8 103 #define ENOSYS (-121) /* Function not supported */
dkato 0:702bf7b2b7d8 104 #define ECRC (-122) /* CRC failure */
dkato 0:702bf7b2b7d8 105 #define EEOF (-123) /* Position is End Of File */
dkato 0:702bf7b2b7d8 106 #define ESEEKPASTEND (-124) /* Seek past EOF */
dkato 0:702bf7b2b7d8 107 #define EMEDIUMTYPE (-127) /* Wrong medium type */
dkato 0:702bf7b2b7d8 108 #define ENOMEDIUM (-128) /* No medium present */
dkato 0:702bf7b2b7d8 109 #define ESEEKRANGE (-129) /* seek setting error */ /* Source Merge 11-1 */
dkato 0:702bf7b2b7d8 110
dkato 0:702bf7b2b7d8 111 /***********************************************************************************
dkato 0:702bf7b2b7d8 112 Defines
dkato 0:702bf7b2b7d8 113 ***********************************************************************************/
dkato 0:702bf7b2b7d8 114 /* errno is a macro so it is re-entrant (per thread/task value) - this
dkato 0:702bf7b2b7d8 115 * definition works with SH C libs. The errno returns an l-value so
dkato 0:702bf7b2b7d8 116 * it can be used on the left of an assignment as it is legal for an
dkato 0:702bf7b2b7d8 117 * application to assign to errno.
dkato 0:702bf7b2b7d8 118 *
dkato 0:702bf7b2b7d8 119 * Note: Application code should not call ioif_get_errno directly. All
dkato 0:702bf7b2b7d8 120 * access to errno should be made using the POSIX "errno" macro.
dkato 0:702bf7b2b7d8 121 */
dkato 0:702bf7b2b7d8 122 extern int *ioif_get_errno(void);
dkato 0:702bf7b2b7d8 123
dkato 0:702bf7b2b7d8 124 /* Remove SHC definitions so SDK can be used instead */
dkato 0:702bf7b2b7d8 125 #ifdef _errno
dkato 0:702bf7b2b7d8 126 #undef _errno
dkato 0:702bf7b2b7d8 127 #endif
dkato 0:702bf7b2b7d8 128
dkato 0:702bf7b2b7d8 129 #define _errno (*ioif_get_errno())
dkato 0:702bf7b2b7d8 130
dkato 0:702bf7b2b7d8 131 #ifndef errno
dkato 0:702bf7b2b7d8 132 #define errno _errno
dkato 0:702bf7b2b7d8 133 #endif
dkato 0:702bf7b2b7d8 134
dkato 0:702bf7b2b7d8 135 #define iserrno(e)((unsigned int)(e) >= 0xffffff80UL)
dkato 0:702bf7b2b7d8 136
dkato 0:702bf7b2b7d8 137 #ifdef __cplusplus
dkato 0:702bf7b2b7d8 138 }
dkato 0:702bf7b2b7d8 139 #endif
dkato 0:702bf7b2b7d8 140
dkato 0:702bf7b2b7d8 141 #endif