1 //<MStar Software> 2 //****************************************************************************** 3 // MStar Software 4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved. 5 // All software, firmware and related documentation herein ("MStar Software") are 6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by 7 // law, including, but not limited to, copyright law and international treaties. 8 // Any use, modification, reproduction, retransmission, or republication of all 9 // or part of MStar Software is expressly prohibited, unless prior written 10 // permission has been granted by MStar. 11 // 12 // By accessing, browsing and/or using MStar Software, you acknowledge that you 13 // have read, understood, and agree, to be bound by below terms ("Terms") and to 14 // comply with all applicable laws and regulations: 15 // 16 // 1. MStar shall retain any and all right, ownership and interest to MStar 17 // Software and any modification/derivatives thereof. 18 // No right, ownership, or interest to MStar Software and any 19 // modification/derivatives thereof is transferred to you under Terms. 20 // 21 // 2. You understand that MStar Software might include, incorporate or be 22 // supplied together with third party`s software and the use of MStar 23 // Software may require additional licenses from third parties. 24 // Therefore, you hereby agree it is your sole responsibility to separately 25 // obtain any and all third party right and license necessary for your use of 26 // such third party`s software. 27 // 28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as 29 // MStar`s confidential information and you agree to keep MStar`s 30 // confidential information in strictest confidence and not disclose to any 31 // third party. 32 // 33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any 34 // kind. Any warranties are hereby expressly disclaimed by MStar, including 35 // without limitation, any warranties of merchantability, non-infringement of 36 // intellectual property rights, fitness for a particular purpose, error free 37 // and in conformity with any international standard. You agree to waive any 38 // claim against MStar for any loss, damage, cost or expense that you may 39 // incur related to your use of MStar Software. 40 // In no event shall MStar be liable for any direct, indirect, incidental or 41 // consequential damages, including without limitation, lost of profit or 42 // revenues, lost or damage of data, and unauthorized system use. 43 // You agree that this Section 4 shall still apply without being affected 44 // even if MStar Software has been modified by MStar in accordance with your 45 // request or instruction for your use, except otherwise agreed by both 46 // parties in writing. 47 // 48 // 5. If requested, MStar may from time to time provide technical supports or 49 // services in relation with MStar Software to you for your use of 50 // MStar Software in conjunction with your or your customer`s product 51 // ("Services"). 52 // You understand and agree that, except otherwise agreed by both parties in 53 // writing, Services are provided on an "AS IS" basis and the warranty 54 // disclaimer set forth in Section 4 above shall apply. 55 // 56 // 6. Nothing contained herein shall be construed as by implication, estoppels 57 // or otherwise: 58 // (a) conferring any license or right to use MStar name, trademark, service 59 // mark, symbol or any other identification; 60 // (b) obligating MStar or any of its affiliates to furnish any person, 61 // including without limitation, you and your customers, any assistance 62 // of any kind whatsoever, or any information; or 63 // (c) conferring any license or right under any intellectual property right. 64 // 65 // 7. These terms shall be governed by and construed in accordance with the laws 66 // of Taiwan, R.O.C., excluding its conflict of law rules. 67 // Any and all dispute arising out hereof or related hereto shall be finally 68 // settled by arbitration referred to the Chinese Arbitration Association, 69 // Taipei in accordance with the ROC Arbitration Law and the Arbitration 70 // Rules of the Association by three (3) arbitrators appointed in accordance 71 // with the said Rules. 72 // The place of arbitration shall be in Taipei, Taiwan and the language shall 73 // be English. 74 // The arbitration award shall be final and binding to both parties. 75 // 76 //****************************************************************************** 77 //<MStar Software> 78 //////////////////////////////////////////////////////////////////////////////// 79 // 80 // Copyright (c) 2008-2009 MStar Semiconductor, Inc. 81 // All rights reserved. 82 // 83 // Unless otherwise stipulated in writing, any and all information contained 84 // herein regardless in any format shall remain the sole proprietary of 85 // MStar Semiconductor Inc. and be kept in strict confidence 86 // ("MStar Confidential Information") by the recipient. 87 // Any unauthorized act including without limitation unauthorized disclosure, 88 // copying, use, reproduction, sale, distribution, modification, disassembling, 89 // reverse engineering and compiling of the contents of MStar Confidential 90 // Information is unlawful and strictly prohibited. MStar hereby reserves the 91 // rights to any and all damages, losses, costs and expenses resulting therefrom. 92 //////////////////////////////////////////////////////////////////////////////// 93 94 /*! \defgroup G_PWS PWS interface 95 \ingroup G_PERIPHERAL 96 97 \brief 98 Load power settings of demo atop and video atop at a specified source. 99 100 <b>Features</b> 101 102 - Load power settings. 103 104 <b> PWS Block Diagram: </b> \n 105 106 NA 107 108 \defgroup G_PWS_INIT Initialization Task relative 109 \ingroup G_PWS 110 \defgroup G_PWS_COMMON Common Task relative 111 \ingroup G_PWS 112 \defgroup G_PWS_CONTROL Control relative 113 \ingroup G_PWS 114 \defgroup G_PWS_OTHER other relative 115 \ingroup G_PWS 116 \defgroup G_PWS_ToBeModified PWS api to be modified 117 \ingroup G_PWS 118 \defgroup G_PWS_ToBeRemove PWS api to be removed 119 \ingroup G_PWS 120 */ 121 122 #ifndef _DRVPWS_H_ 123 #define _DRVPWS_H_ 124 125 //////////////////////////////////////////////////////////////////////////////// 126 /// @file drvPWS.h 127 /// @author MStar Semiconductor Inc. 128 /// @brief power saving driver 129 //////////////////////////////////////////////////////////////////////////////// 130 131 //------------------------------------------------------------------------------ 132 // Header Files 133 //------------------------------------------------------------------------------ 134 #ifdef __cplusplus 135 extern "C" 136 { 137 #endif 138 139 #include "MsCommon.h" 140 #include "MsTypes.h" 141 142 //------------------------------------------------------------------------------------------------- 143 // Macro and Define 144 //------------------------------------------------------------------------------------------------- 145 #define MSIF_PWS_LIB_CODE {'P','W','S','_'} //Lib code 146 #define MSIF_PWS_LIBVER {'0','2'} //LIB version 147 #define MSIF_PWS_BUILDNUM {'0','9'} //Build Number 148 #define MSIF_PWS_CHANGELIST {'0','0','4','4','8','1','7','6'} //P4 ChangeList Number 149 150 #define PWS_API_VERSION /* Character String for DRV/API version */ \ 151 MSIF_TAG, /* 'MSIF' */ \ 152 MSIF_CLASS, /* '00' */ \ 153 MSIF_CUS, /* 0x0000 */ \ 154 MSIF_MOD, /* 0x0000 */ \ 155 MSIF_CHIP, \ 156 MSIF_CPU, \ 157 MSIF_PWS_LIB_CODE, /* IP__ */ \ 158 MSIF_PWS_LIBVER, /* 0.0 ~ Z.Z */ \ 159 MSIF_PWS_BUILDNUM, /* 00 ~ 99 */ \ 160 MSIF_PWS_CHANGELIST, /* CL# */ \ 161 MSIF_OS 162 163 #define SIOCDEVON 0x89F1 164 #define SIOCDEVOFF 0x89F2 165 166 #define PWS_VERSION 0x00000001 167 168 169 //------------------------------------------------------------------------------------------------- 170 // Type and Structure 171 //------------------------------------------------------------------------------------------------- 172 173 typedef enum 174 { 175 PWS_FAIL = 0, 176 PWS_SUCCESS = 1 177 } E_PWS_Result; 178 179 #if defined (MSOS_TYPE_LINUX) 180 typedef enum 181 { 182 PHY_OFF = 0, 183 PHY_ON = 1 184 } E_PWS_PHY; 185 #endif 186 187 typedef enum 188 { 189 PWS_ADD_SOURCE = 0, 190 PWS_DEL_SOURCE = 1, 191 PWS_INVAILD_OP = 2 192 } E_PWS_Operation; 193 194 typedef enum 195 { 196 PWS_FULL = 0, 197 PWS_OFF_LINE_DETECT = 1 198 } E_PWS_Sync; 199 200 typedef enum 201 { 202 _NO_SOURCE_ = 0, 203 _USB_ = BIT_(0), 204 _SV_ = BIT_(1), 205 _HDMI4_ = BIT_(2), 206 _HDMI3_ = BIT_(3), 207 _HDMI2_ = BIT_(4), 208 _HDMI1_ = BIT_(5), 209 _YPbPr_ = BIT_(6), 210 _SCART_ = BIT_(7), 211 _RGB_ = BIT_(8), 212 _CVBS_ = BIT_(9), 213 _ATV_SSIF_ = BIT_(10), 214 _ATV_VIF_ = BIT_(11), 215 _DTV_ATSC_ = BIT_(12), 216 _DTV_DVB_ = BIT_(13), 217 _CVBSOe_ = BIT_(14), 218 _CVBSOi_ = BIT_(15), 219 _UNKNOWN_ = BIT_(16) 220 } E_PWS_SouceInfo; 221 222 typedef enum 223 { 224 E_PWS_DBGLV_NONE, //no debug message 225 E_PWS_DBGLV_ERR_ONLY, //show error only 226 E_PWS_DBGLV_REG_DUMP, //show error & reg dump 227 E_PWS_DBGLV_INFO, //show error & informaiton 228 E_PWS_DBGLV_ALL //show error, information & funciton name 229 } E_PWS_DBG_LEVEL; 230 231 typedef struct 232 { 233 E_PWS_DBG_LEVEL u8DbgLevel; 234 MS_BOOL bInit; 235 } PWS_Status; 236 237 typedef struct 238 { 239 E_PWS_SouceInfo SourceList; 240 MS_U32 u32IOMap; 241 } PWS_Info; 242 243 typedef enum 244 { 245 E_PWS_API_UNUSED = 0, 246 E_PWS_USE_HANDLE_SOURCE = 1, 247 E_PWS_USE_HANDLE_IP = 2 248 } E_PWS_Use; 249 250 typedef enum 251 { 252 E_PWS_IP_ON = 0, 253 E_PWS_IP_OFF = 1, 254 E_PWS_IP_RESET = 2, 255 } E_PWS_IpPowerCtrl; 256 257 typedef enum 258 { 259 E_PWS_IP_CALLBACK_BEFORE_ON = 0, 260 E_PWS_IP_CALLBACK_BEFORE_OFF = 1, 261 E_PWS_IP_CALLBACK_AFTER_ON = 2, 262 E_PWS_IP_CALLBACK_AFTER_OFF = 3, 263 E_PWS_IP_CALLBACK_UNKNOWN = 4 264 } E_PWS_CallbackCtrl; 265 266 #define STR_LEN 32 267 typedef void (*P_PWS_Callback)(void); 268 typedef struct 269 { 270 E_PWS_CallbackCtrl ctrl; 271 unsigned char regName[STR_LEN]; 272 P_PWS_Callback _PWSCallback; 273 } PWS_RegisterCallback; 274 275 typedef enum 276 { 277 E_PWS_VIF_NO_SAW = 0, 278 E_PWS_VIF_SINGLE_SAW = 1, 279 E_PWS_VIF_DUAL_SAW = 2, 280 E_PWS_VIF_SINGLE_SAW_DIF = 3, 281 E_PWS_VIF_UNKNOWN = 3 282 } E_PWS_VIF_type; 283 284 #define PWS_Register_CB_size 2 285 286 287 typedef enum 288 { 289 E_PWS_IP_AUDIO = 0, 290 E_PWS_IP_DEMOD, 291 E_PWS_IP_AUPLL, 292 E_PWS_IP_USB_PORT0, 293 E_PWS_IP_USB_PORT1, 294 E_PWS_IP_USB_PORT2, 295 E_PWS_IP_USB_PORT3, 296 E_PWS_IP_USB_3, 297 E_PWS_IP_MHL, 298 E_PWS_IP_VEDIO, 299 E_PWS_IP_ATSC_DVBTC, 300 E_PWS_IP_GME, 301 E_PWS_IP_GMAC, 302 E_PWS_IP_IDAC, 303 E_PWS_IP_ETH, 304 E_PWS_IP_TSP, 305 E_PWS_IP_CLK_R2_SECURE, 306 E_PWS_IP_VE, 307 E_PWS_IP_AUDIO_R2, 308 E_PWS_IP_MAX 309 } E_PWS_IP_name; 310 311 typedef enum 312 { 313 E_PWS_SCENE_MM_MAIN = 0, 314 E_PWS_SCENE_MM_SUB, 315 E_PWS_SCENE_MAX 316 } E_PWS_SCENE_name; 317 318 //------------------------------------------------------------------------------ 319 // Extern Function 320 //------------------------------------------------------------------------------ 321 //------------------------------------------------------------------------------------------------- 322 /// MOBF Encrypt 323 /// @ingroup G_PWS_COMMON 324 /// @param u32Key \b IN: Key 325 /// @param bEnable \b IN: TRUE/FLASE 326 /// @return DRVAESDMA_OK : Success 327 /// @return Others : Fail 328 //------------------------------------------------------------------------------------------------- 329 E_PWS_Result MDrv_PWS_GetLibVer(const MSIF_Version **ppVersion); 330 //------------------------------------------------------------------------------------------------- 331 /// MOBF Encrypt 332 /// @ingroup G_PWS_COMMON 333 /// @param u32Key \b IN: Key 334 /// @param bEnable \b IN: TRUE/FLASE 335 /// @return DRVAESDMA_OK : Success 336 /// @return Others : Fail 337 //------------------------------------------------------------------------------------------------- 338 E_PWS_Result MDrv_PWS_SetDbgLevel(E_PWS_DBG_LEVEL eLEVEL); 339 //------------------------------------------------------------------------------------------------- 340 /// MOBF Encrypt 341 /// @ingroup G_PWS_COMMON 342 /// @param u32Key \b IN: Key 343 /// @param bEnable \b IN: TRUE/FLASE 344 /// @return DRVAESDMA_OK : Success 345 /// @return Others : Fail 346 //------------------------------------------------------------------------------------------------- 347 void MDrv_PWS_GetInfo(PWS_Info *pInfo); // ToBeRemove 348 //------------------------------------------------------------------------------------------------- 349 /// MOBF Encrypt 350 /// @ingroup G_PWS_COMMON 351 /// @param u32Key \b IN: Key 352 /// @param bEnable \b IN: TRUE/FLASE 353 /// @return DRVAESDMA_OK : Success 354 /// @return Others : Fail 355 //------------------------------------------------------------------------------------------------- 356 void MDrv_PWS_GetStatus(PWS_Status *pStatus); 357 //------------------------------------------------------------------------------------------------- 358 /// MOBF Encrypt 359 /// @ingroup G_PWS_COMMON 360 /// @param u32Key \b IN: Key 361 /// @param bEnable \b IN: TRUE/FLASE 362 /// @return DRVAESDMA_OK : Success 363 /// @return Others : Fail 364 //------------------------------------------------------------------------------------------------- 365 E_PWS_SouceInfo MDrv_PWS_GetSourceInfo(void); 366 //------------------------------------------------------------------------------------------------- 367 /// MOBF Encrypt 368 /// @ingroup G_PWS_COMMON 369 /// @param u32Key \b IN: Key 370 /// @param bEnable \b IN: TRUE/FLASE 371 /// @return DRVAESDMA_OK : Success 372 /// @return Others : Fail 373 //------------------------------------------------------------------------------------------------- 374 MS_U16 MDrv_PWS_Read2Byte(MS_U32 u32RegAddr ); 375 //------------------------------------------------------------------------------------------------- 376 /// MOBF Encrypt 377 /// @ingroup G_PWS_COMMON 378 /// @param u32Key \b IN: Key 379 /// @param bEnable \b IN: TRUE/FLASE 380 /// @return DRVAESDMA_OK : Success 381 /// @return Others : Fail 382 //------------------------------------------------------------------------------------------------- 383 E_PWS_Result MDrv_PWS_IpPowerControl(E_PWS_IP_name eIpName, E_PWS_IpPowerCtrl pwr_type); 384 //------------------------------------------------------------------------------------------------- 385 /// MOBF Encrypt 386 /// @ingroup G_PWS_COMMON 387 /// @param u32Key \b IN: Key 388 /// @param bEnable \b IN: TRUE/FLASE 389 /// @return DRVAESDMA_OK : Success 390 /// @return Others : Fail 391 //------------------------------------------------------------------------------------------------- 392 E_PWS_Result MDrv_PWS_ScenePowerControl(E_PWS_SCENE_name eSceneName, E_PWS_IpPowerCtrl pwr_type); 393 //------------------------------------------------------------------------------------------------- 394 /// MOBF Encrypt 395 /// @ingroup G_PWS_INIT 396 /// @param u32Key \b IN: Key 397 /// @param bEnable \b IN: TRUE/FLASE 398 /// @return DRVAESDMA_OK : Success 399 /// @return Others : Fail 400 //------------------------------------------------------------------------------------------------- 401 E_PWS_Result MDrv_PWS_Init(E_PWS_VIF_type eVifType); 402 //------------------------------------------------------------------------------------------------- 403 /// MOBF Encrypt 404 /// @ingroup G_PWS_CONTROL 405 /// @param u32Key \b IN: Key 406 /// @param bEnable \b IN: TRUE/FLASE 407 /// @return DRVAESDMA_OK : Success 408 /// @return Others : Fail 409 //------------------------------------------------------------------------------------------------- 410 E_PWS_Result MDrv_PWS_HandleSource(E_PWS_Operation operation,E_PWS_SouceInfo source,E_PWS_Sync sync_type); 411 //------------------------------------------------------------------------------------------------- 412 /// MOBF Encrypt 413 /// @ingroup G_PWS_ToBeRemove 414 /// @param u32Key \b IN: Key 415 /// @param bEnable \b IN: TRUE/FLASE 416 /// @return DRVAESDMA_OK : Success 417 /// @return Others : Fail 418 //------------------------------------------------------------------------------------------------- 419 E_PWS_Result MDrv_PWS_HandleIP(E_PWS_IpPowerCtrl IpPowerCtrl,const unsigned char *RegName); // ToBeRemove 420 //------------------------------------------------------------------------------------------------- 421 /// MOBF Encrypt 422 /// @ingroup G_PWS_COMMON 423 /// @param u32Key \b IN: Key 424 /// @param bEnable \b IN: TRUE/FLASE 425 /// @return DRVAESDMA_OK : Success 426 /// @return Others : Fail 427 //------------------------------------------------------------------------------------------------- 428 E_PWS_Result MDrv_PWS_RegisterCallback(MS_U8 index,E_PWS_CallbackCtrl cb_ctrl,unsigned char *RegName,P_PWS_Callback pfCallback); 429 //------------------------------------------------------------------------------------------------- 430 /// MOBF Encrypt 431 /// @ingroup G_PWS_COMMON 432 /// @param u32Key \b IN: Key 433 /// @param bEnable \b IN: TRUE/FLASE 434 /// @return DRVAESDMA_OK : Success 435 /// @return Others : Fail 436 //------------------------------------------------------------------------------------------------- 437 E_PWS_Result MDrv_PWS_CancelCallback(MS_U8 index); 438 //------------------------------------------------------------------------------------------------- 439 /// MOBF Encrypt 440 /// @ingroup G_PWS_COMMON 441 /// @param u32Key \b IN: Key 442 /// @param bEnable \b IN: TRUE/FLASE 443 /// @return DRVAESDMA_OK : Success 444 /// @return Others : Fail 445 //------------------------------------------------------------------------------------------------- 446 MS_U32 MDrv_PWS_SetPowerState(EN_POWER_MODE u16PowerState); 447 #if defined (MSOS_TYPE_LINUX) 448 //------------------------------------------------------------------------------------------------- 449 /// MOBF Encrypt 450 /// @ingroup G_PWS_ToBeRemove 451 /// @param u32Key \b IN: Key 452 /// @param bEnable \b IN: TRUE/FLASE 453 /// @return DRVAESDMA_OK : Success 454 /// @return Others : Fail 455 //------------------------------------------------------------------------------------------------- 456 E_PWS_Result MDrv_PWS_PHYPower(E_PWS_PHY bSetFlag); // ToBeRemove 457 #endif 458 459 //------------------------------------------------------------------------------------ 460 // Utopia 2.0 461 //------------------------------------------------------------------------------------ 462 typedef enum { 463 MDrv_CMD_PWS_GetLibVer, 464 MDrv_CMD_PWS_SetDbgLevel, 465 MDrv_CMD_PWS_HandleSource, 466 MDrv_CMD_PWS_PHYPower, 467 } ePwsIoctlOpt; 468 469 typedef E_PWS_Result (*IOCTL_PWS_GETLIBVER)(const MSIF_Version **); 470 typedef E_PWS_Result (*IOCTL_PWS_SETDBGLEVEL)(E_PWS_DBG_LEVEL); 471 typedef E_PWS_Result (*IOCTL_PWS_HANDLESOURCE)(E_PWS_Operation, E_PWS_SouceInfo, E_PWS_Sync); 472 #if defined (MSOS_TYPE_LINUX) 473 typedef E_PWS_Result (*IOCTL_PWS_PHYPOWER)(E_PWS_PHY); 474 #endif 475 476 typedef struct _PWS_INSTANT_PRIVATE 477 { 478 IOCTL_PWS_GETLIBVER fpPWSGetLibVer; 479 IOCTL_PWS_SETDBGLEVEL fpPWSSetDbgLevel; 480 IOCTL_PWS_HANDLESOURCE fpPWSHandleSource; 481 #if defined (MSOS_TYPE_LINUX) 482 IOCTL_PWS_PHYPOWER fpPWSPHYPower; 483 #endif 484 }PWS_INSTANT_PRIVATE; 485 486 // for pws MDrv_PWS_GetLibVer 487 typedef struct _PWS_GETLIBVER_PARAM 488 { 489 const MSIF_Version **ppVersion; 490 }PWS_GETLIBVER_PARAM, *PPWS_GETLIBVER_PARAM; 491 492 // for pws MDrv_PWS_SetDbgLevel 493 typedef struct _PWS_SETDBGLEVEL_PARAM 494 { 495 E_PWS_DBG_LEVEL DbgLevel; 496 }PWS_SETDBGLEVEL_PARAM, *PPWS_SETDBGLEVEL_PARAM; 497 498 // for pws MDrv_PWS_HandleSource 499 typedef struct _PWS_HANDLESOURCE_PARAM 500 { 501 E_PWS_Operation operation; 502 E_PWS_SouceInfo source; 503 E_PWS_Sync sync_type; 504 }PWS_HANDLESOURCE_PARAM, *PPWS_HANDLESOURCE_PARAM; 505 506 #if defined (MSOS_TYPE_LINUX) 507 // for pws MDrv_PWS_PHYPower 508 typedef struct _PWS_PHYPOWER_PARAM 509 { 510 E_PWS_PHY bSetFlag; 511 }PWS_PHYPOWER_PARAM, *PPWS_PHYPOWER_PARAM; 512 #endif 513 514 void PWSRegisterToUtopia(FUtopiaOpen ModuleType); 515 //------------------------------------------------------------------------------------------------- 516 /// MOBF Encrypt 517 /// @ingroup G_PWS_ToBeRemove 518 /// @param u32Key \b IN: Key 519 /// @param bEnable \b IN: TRUE/FLASE 520 /// @return DRVAESDMA_OK : Success 521 /// @return Others : Fail 522 //------------------------------------------------------------------------------------------------- 523 MS_U32 PWSOpen(void** pInstance, MS_U32 u32ModuleVersion, void* pAttribute); 524 //------------------------------------------------------------------------------------------------- 525 /// MOBF Encrypt 526 /// @ingroup G_PWS_ToBeRemove 527 /// @param u32Key \b IN: Key 528 /// @param bEnable \b IN: TRUE/FLASE 529 /// @return DRVAESDMA_OK : Success 530 /// @return Others : Fail 531 //------------------------------------------------------------------------------------------------- 532 MS_U32 PWSClose(void* pInstance); 533 //------------------------------------------------------------------------------------------------- 534 /// MOBF Encrypt 535 /// @ingroup G_PWS_ToBeRemove 536 /// @param u32Key \b IN: Key 537 /// @param bEnable \b IN: TRUE/FLASE 538 /// @return DRVAESDMA_OK : Success 539 /// @return Others : Fail 540 //------------------------------------------------------------------------------------------------- 541 MS_U32 PWSIoctl(void* pInstance, MS_U32 u32Cmd, void *pArgs); 542 543 //PWS_Private 544 typedef struct _PWS_RESOURCE_PRIVATE 545 { 546 MS_U32 Dummy; 547 }PWS_RESOURCE_PRIVATE; 548 549 #ifdef __cplusplus 550 } 551 #endif 552 553 #endif 554