1c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu/* 22f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * portbase.h, port base class 330bd6062e4b295f5f7bcaeb98165065310d29269Ho-Eun Ryu * 42f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Copyright (c) 2009-2010 Wind River Systems, Inc. 52f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * 62f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Licensed under the Apache License, Version 2.0 (the "License"); 72f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * you may not use this file except in compliance with the License. 82f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * You may obtain a copy of the License at 92f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * 102f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * http://www.apache.org/licenses/LICENSE-2.0 112f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * 122f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Unless required by applicable law or agreed to in writing, software 132f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * distributed under the License is distributed on an "AS IS" BASIS, 142f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 152f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * See the License for the specific language governing permissions and 162f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * limitations under the License. 17c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu */ 18c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu 19c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#ifndef __PORTBASE_H 20c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#define __PORTBASE_H 21c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu 22974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu#include <pthread.h> 23974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu 24c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#include <OMX_Core.h> 25c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#include <OMX_Component.h> 26c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu 27974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu#include <list.h> 287951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu#include <queue.h> 29974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu 30ab52c3ff446a8712299a0d866f8ac8372491cdcbAndy Qiutypedef OMX_U8* CustomMemAlloc(OMX_U32 nSizeBytes, OMX_PTR pUserData); 31ab52c3ff446a8712299a0d866f8ac8372491cdcbAndy Qiutypedef void CustomMemFree(OMX_U8 *pBuffer, OMX_PTR pUserData); 32ab52c3ff446a8712299a0d866f8ac8372491cdcbAndy Qiu 33c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryuclass PortBase 34c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu{ 35c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryupublic: 36c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu /* 37c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu * constructor & destructor 38c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu */ 39c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu PortBase(); 4076e479a9ee63cff7cf200aceb2f52296fe63c588Ho-Eun Ryu PortBase(const OMX_PARAM_PORTDEFINITIONTYPE *portdefinition); 41c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu virtual ~PortBase(); 42c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu 43c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu /* end of constructor & destructor */ 44c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu 45cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu /* 467b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu * accessor 477b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu */ 487b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu /* owner */ 497b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu void SetOwner(OMX_COMPONENTTYPE *handle); 507b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu OMX_COMPONENTTYPE *GetOwner(void); 517b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu 5219b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu /* for ReturnThisBuffer() */ 5319b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu OMX_ERRORTYPE SetCallbacks(OMX_HANDLETYPE hComponent, 5419b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu OMX_CALLBACKTYPE *pCallbacks, 5519b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu OMX_PTR pAppData); 5619b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu /* end of accessor */ 5719b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu 58ab52c3ff446a8712299a0d866f8ac8372491cdcbAndy Qiu OMX_ERRORTYPE SetMemAllocator(CustomMemAlloc *pMemAlloc, CustomMemFree *pMemFree, OMX_PTR pUserData); 59ab52c3ff446a8712299a0d866f8ac8372491cdcbAndy Qiu 60229ae5acfb89e9c1559c0394190e77ca6f23f24bZhao Liang /* set port buffer alignment, nAlignment=0 means alignment disabled */ 61229ae5acfb89e9c1559c0394190e77ca6f23f24bZhao Liang OMX_ERRORTYPE SetMemAlignment(OMX_U32 nAlignment); 62229ae5acfb89e9c1559c0394190e77ca6f23f24bZhao Liang 637b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu /* 64cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu * component methods & helpers 65cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu */ 66cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu /* Get/SetParameter */ 678b0c69f6315328521b722a6ceb19f354e867124aHo-Eun Ryu OMX_ERRORTYPE SetPortDefinition(const OMX_PARAM_PORTDEFINITIONTYPE *p, 683759c620f3e8325d1fdd741caad7c397e797ad2cHo-Eun Ryu bool overwrite_readonly); 698b0c69f6315328521b722a6ceb19f354e867124aHo-Eun Ryu const OMX_PARAM_PORTDEFINITIONTYPE *GetPortDefinition(void); 70cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu 71cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu /* Use/Allocate/FreeBuffer */ 72cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu OMX_ERRORTYPE UseBuffer(OMX_BUFFERHEADERTYPE **ppBufferHdr, 73cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu OMX_U32 nPortIndex, 74cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu OMX_PTR pAppPrivate, 75cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu OMX_U32 nSizeBytes, 76cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu OMX_U8 *pBuffer); 77cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu OMX_ERRORTYPE AllocateBuffer(OMX_BUFFERHEADERTYPE **ppBuffer, 78cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu OMX_U32 nPortIndex, 79cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu OMX_PTR pAppPrivate, 80cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu OMX_U32 nSizeBytes); 81cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu OMX_ERRORTYPE FreeBuffer(OMX_U32 nPortIndex, 82cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu OMX_BUFFERHEADERTYPE *pBuffer); 83cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu 846fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu /* 856fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu * called in ComponentBase::TransStateToLoaded(OMX_StateIdle) or 866fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu * in ComponentBase::TransStateToIdle(OMX_StateLoaded) 876fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu * wokeup by Use/Allocate/FreeBuffer 886fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu */ 896fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu void WaitPortBufferCompletion(void); 906fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu 9141e08b779bbfab77f59765aa470aa93e2d81b877ywan OMX_ERRORTYPE WaitPortBufferCompletionTimeout(int64_t mSec); 927951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu /* Empty/FillThisBuffer */ 937951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu OMX_ERRORTYPE PushThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer); 947951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu OMX_BUFFERHEADERTYPE *PopBuffer(void); 957951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu OMX_U32 BufferQueueLength(void); 96a081918af785d476df2da1342eabe245eab468d0Zhao Liang OMX_U32 RetainedBufferQueueLength(void); 977951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu 98fa693d49884f9188809c3a185ecd4cd38a878cb7Ho-Eun Ryu /* Empty/FillBufferDone */ 997951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu OMX_ERRORTYPE ReturnThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer); 1007951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu 101705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen OMX_ERRORTYPE RetainAndReturnBuffer(OMX_BUFFERHEADERTYPE *pRetain, OMX_BUFFERHEADERTYPE *pReturn); 102705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen 1031e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu /* retain buffer */ 1041e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu OMX_ERRORTYPE RetainThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer, 1051e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu bool accumulate); 1061e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu /* 1071e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu * components have responsibilty of calling this function to return all 1081e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu * accumulated buffers to omx-il clients. 1091e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu */ 1101e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu void ReturnAllRetainedBuffers(void); 111a081918af785d476df2da1342eabe245eab468d0Zhao Liang void ReturnOneRetainedBuffer(void); 1121e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu 113fa693d49884f9188809c3a185ecd4cd38a878cb7Ho-Eun Ryu /* flush all buffers not under processing */ 114fa693d49884f9188809c3a185ecd4cd38a878cb7Ho-Eun Ryu OMX_ERRORTYPE FlushPort(void); 115fa693d49884f9188809c3a185ecd4cd38a878cb7Ho-Eun Ryu 116b2b1b8e0c1425cde2025791cfb74d9053170845cHo-Eun Ryu bool IsEnabled(void); 117b2b1b8e0c1425cde2025791cfb74d9053170845cHo-Eun Ryu 1184f4d5a8c4138b7ebfa624eaad8dea29332ed97a0Ho-Eun Ryu OMX_DIRTYPE GetPortDirection(void); 11937787374d75727678e1f9d19191fdad363ee6c54Ho-Eun Ryu OMX_U32 GetPortBufferCount(void); 1204f4d5a8c4138b7ebfa624eaad8dea29332ed97a0Ho-Eun Ryu 1215e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu OMX_ERRORTYPE PushMark(OMX_MARKTYPE *mark); 1225170f7519e52abd32252552df72fa16b12651a39Ho-Eun Ryu OMX_MARKTYPE *PopMark(void); 1235e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu 124df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu /* SendCommand(OMX_CommandPortDisable/Enable) */ 125df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu OMX_ERRORTYPE TransState(OMX_U8 state); 126df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu 1273ca48681b349388346b10abce74c98497d231d04Ho-Eun Ryu /* EventHandler(OMX_EventPortSettingChanged) */ 1283ca48681b349388346b10abce74c98497d231d04Ho-Eun Ryu OMX_ERRORTYPE ReportPortSettingsChanged(void); 129ecc877a1dd44921dff3f300bc5559841f0c44ac6ywan OMX_ERRORTYPE ReportOutputCrop(void); 130f17c91825c5ef8ac1dd211e8f641b3851dccbc4cxli /* get frame size */ 131f17c91825c5ef8ac1dd211e8f641b3851dccbc4cxli OMX_U32 getFrameBufSize(OMX_COLOR_FORMATTYPE colorFormat, OMX_U32 width, OMX_U32 height); 1323ca48681b349388346b10abce74c98497d231d04Ho-Eun Ryu 133cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu /* end of component methods & helpers */ 134cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu 135df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu /* TransState, state */ 1366eef19eccd390d878724188ac5b62f4656a97110Ho-Eun Ryu static const OMX_U8 OMX_PortDisabled = 0; 1376eef19eccd390d878724188ac5b62f4656a97110Ho-Eun Ryu static const OMX_U8 OMX_PortEnabled = 1; 138df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu 139c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryuprivate: 140c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu /* common routines for constructor */ 141c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu void __PortBase(void); 142cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu 14365f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu /* 14465f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu * component methods & helpers 14565f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu */ 14665f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu OMX_STATETYPE GetOwnerState(void); 14765f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu 14865f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu /* end of component methods & helpers */ 14965f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu 150974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu /* buffer headers */ 151974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu struct list *buffer_hdrs; 152974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu OMX_U32 nr_buffer_hdrs; 153974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu bool buffer_hdrs_completion; /* Use/Allocate/FreeBuffer completion flag */ 154974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu pthread_mutex_t hdrs_lock; 155974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu pthread_cond_t hdrs_wait; 156974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu 1577951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu struct queue bufferq; 1587951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu pthread_mutex_t bufferq_lock; 1597951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu 1601e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu /* retained buffers (only accumulated buffer) */ 1611e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu struct queue retainedbufferq; 1621e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu pthread_mutex_t retainedbufferq_lock; 1631e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu 1645e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu struct queue markq; 1655e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu pthread_mutex_t markq_lock; 1665e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu 167df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu /* state */ 168df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu OMX_U8 state; 169df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu pthread_mutex_t state_lock; 170df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu 171ab52c3ff446a8712299a0d866f8ac8372491cdcbAndy Qiu CustomMemAlloc *custom_mem_alloc; 172ab52c3ff446a8712299a0d866f8ac8372491cdcbAndy Qiu CustomMemFree *custom_mem_free; 173ab52c3ff446a8712299a0d866f8ac8372491cdcbAndy Qiu OMX_PTR custom_mem_userdata; 174ab52c3ff446a8712299a0d866f8ac8372491cdcbAndy Qiu 175229ae5acfb89e9c1559c0394190e77ca6f23f24bZhao Liang OMX_U32 mem_alignment; 176229ae5acfb89e9c1559c0394190e77ca6f23f24bZhao Liang 177cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu /* parameter */ 1786c7f4263fbe4a642fb0a5c21b9e98c5c59c05468Ho-Eun Ryu OMX_PARAM_PORTDEFINITIONTYPE portdefinition; 1796c7f4263fbe4a642fb0a5c21b9e98c5c59c05468Ho-Eun Ryu /* room for portdefinition.format.*.cMIMEType */ 1806c7f4263fbe4a642fb0a5c21b9e98c5c59c05468Ho-Eun Ryu char definition_format_mimetype[OMX_MAX_STRINGNAME_SIZE]; 1816c7f4263fbe4a642fb0a5c21b9e98c5c59c05468Ho-Eun Ryu 182cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam; 1837b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu 1847b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu /* owner handle */ 1857b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu OMX_COMPONENTTYPE *owner; 18619b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu 18719b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu /* omx standard callbacks */ 18819b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu OMX_PTR appdata; 18919b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu OMX_CALLBACKTYPE *callbacks; 1906bda193e1851c89a63c0cda1992de30c1a1c4716Ho-Eun Ryu 1916bda193e1851c89a63c0cda1992de30c1a1c4716Ho-Eun Ryu /* wrs component handle */ 1926bda193e1851c89a63c0cda1992de30c1a1c4716Ho-Eun Ryu class ComponentBase *cbase; 193c3e26983a72fa51f0dff98bc66234b73f74adc17wfeng 194c3e26983a72fa51f0dff98bc66234b73f74adc17wfeng /* Input port size limit. The limit is set to be the size of a 1080P 4:4:4 raw image size, 195c3e26983a72fa51f0dff98bc66234b73f74adc17wfeng which is 1920x1080x3. */ 196c3e26983a72fa51f0dff98bc66234b73f74adc17wfeng enum { 197c3e26983a72fa51f0dff98bc66234b73f74adc17wfeng MAX_INPUT_PORT_SIZE = 6220800 198c3e26983a72fa51f0dff98bc66234b73f74adc17wfeng }; 199c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu}; 200c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu 201904a08909b5c3870414fde9faec0d74d0edd536cHo-Eun Ryu/* end of PortBase */ 202904a08909b5c3870414fde9faec0d74d0edd536cHo-Eun Ryu 203c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#endif /* __PORTBASE_H */ 204