|  /***************************************************************************** | 
 | *  Copyright Statement: | 
 | *  -------------------- | 
 | *  This software is protected by Copyright and the information contained | 
 | *  herein is confidential. The software may not be copied and the information | 
 | *  contained herein may not be used or disclosed except with the written | 
 | *  permission of MediaTek Inc. (C) 2005 | 
 | * | 
 | *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES | 
 | *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") | 
 | *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON | 
 | *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, | 
 | *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF | 
 | *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. | 
 | *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE | 
 | *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR | 
 | *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH | 
 | *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO | 
 | *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S | 
 | *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. | 
 | * | 
 | *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE | 
 | *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, | 
 | *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, | 
 | *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO | 
 | *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.  | 
 | * | 
 | *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE | 
 | *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF | 
 | *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND | 
 | *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER | 
 | *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). | 
 | * | 
 | *****************************************************************************/ | 
 |  | 
 | /***************************************************************************** | 
 |  * | 
 |  * Filename: | 
 |  * --------- | 
 |  *    bmd.h | 
 |  * | 
 |  * Project: | 
 |  * -------- | 
 |  *   Maui_Software | 
 |  * | 
 |  * Description: | 
 |  * ------------ | 
 |  *   This file is intends for ring-buffer API. | 
 |  * | 
 |  * Author: | 
 |  * ------- | 
 |  * ------- | 
 |  * | 
 |  *============================================================================ | 
 |  *             HISTORY | 
 |  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! | 
 |  *------------------------------------------------------------------------------ | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  * removed! | 
 |  *------------------------------------------------------------------------------ | 
 |  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! | 
 |  *============================================================================ | 
 |  ****************************************************************************/ | 
 | #ifndef BMD_H | 
 | #define BMD_H | 
 |  | 
 | #include "drv_comm.h" | 
 |  | 
 | typedef struct __BUFFER_INFO | 
 | { | 
 | 	volatile kal_uint16	Read;		/* @field Current Read index. */ | 
 | 	volatile kal_uint16	Write;		/* @field Current Write index. */ | 
 | 	volatile kal_uint16	Length;		/* @field Length of buffer */ | 
 | 	volatile kal_uint8	*CharBuffer;		/* @field Start of buffer */ | 
 | }BUFFER_INFO; | 
 |  | 
 | #define ResetFifo(Buffer)   		(Buffer.Write = Buffer.Read = 0) | 
 | #define BWrite(Buffer)	   		(Buffer->Write) | 
 | #define BRead(Buffer)		   	(Buffer->Read) | 
 | #define BLength(Buffer)	   		(Buffer->Length) | 
 | #define BStartAddr(Buffer)     (Buffer->CharBuffer) | 
 | #define BuffWrite(Buffer)   		(Buffer->CharBuffer+Buffer->Write) | 
 | #define BuffRead(Buffer)	   	(Buffer->CharBuffer+Buffer->Read) | 
 |  | 
 | #define BWrite_addr(Buffer)	   (Buffer.Write) | 
 | #define BRead_addr(Buffer)		   (Buffer.Read) | 
 | #define BLength_addr(Buffer)	   (Buffer.Length) | 
 | #define BuffWrite_addr(Buffer)   (Buffer.CharBuffer+Buffer.Write) | 
 | #define BuffRead_addr(Buffer)	   (Buffer.CharBuffer+Buffer.Read) | 
 | #define Buff_EndAddr(Buffer)     (Buffer.CharBuffer+Buffer.Length-1) | 
 | #define Buff_StartAddr(Buffer)     (Buffer.CharBuffer) | 
 |  | 
 | #define Buff_isEmpty	1 | 
 | #define Buff_notEmpty	0 | 
 | #define Buff_isFull	1 | 
 | #define Buff_notFull	0 | 
 | #define Buff_PushOK	0 | 
 | #define Buff_PushErr	1 | 
 | #define Buff_PopOK	0 | 
 | #define Buff_PopErr	1 | 
 |  | 
 | #define Buf_init(_Buffer,_Buffaddr,_uTotalSize) \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf=_Buffer;\ | 
 |    _Buf->Read = 0;\ | 
 | 	_Buf->Write = 0;\ | 
 | 	_Buf->Length = _uTotalSize;\ | 
 | 	_Buf->CharBuffer = _Buffaddr;\ | 
 | }\ | 
 |  | 
 | #define Buf_IsFull(_Buffer,_result)   \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf=_Buffer;\ | 
 | 	kal_uint16 _tmp = BRead(_Buf);\ | 
 | 	if (_tmp == 0)\ | 
 | 		_tmp = BLength(_Buf);\ | 
 | 	if ( (_tmp-BWrite(_Buf)) == 1)\ | 
 | 	{\ | 
 | 		_result = Buff_isFull;\ | 
 | 	}\ | 
 | 	else\ | 
 | 	{\ | 
 | 		_result = Buff_notFull;\ | 
 | 	}\ | 
 | }\ | 
 |  | 
 | #define Buf_GetRoomLeft(_Buffer,_RoomLeft)   \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf=_Buffer;\ | 
 |    if ( BRead(_Buf) <= BWrite(_Buf) ) \ | 
 | 	{\ | 
 |       _RoomLeft = BLength(_Buf) - BWrite(_Buf) + BRead(_Buf) - 1;\ | 
 | 	}\ | 
 | 	else\ | 
 | 	{\ | 
 | 		_RoomLeft = BRead(_Buf) - BWrite(_Buf) - 1;\ | 
 | 	}\ | 
 | }\ | 
 |  | 
 | #define Buf_Push_Multi(_Buffer,_pushDataPointer,_multi,offset) \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf=_Buffer;\ | 
 |    if( (BWrite(_Buf) + _multi) >= BLength(_Buf) ){\ | 
 |       kal_mem_cpy(BuffWrite(_Buf), _pushDataPointer + offset, (BLength(_Buf) - BWrite(_Buf))*sizeof(kal_uint8));\ | 
 |       kal_mem_cpy(BStartAddr(_Buf) , _pushDataPointer + offset + (BLength(_Buf) - BWrite(_Buf)), (_multi- (BLength(_Buf) - BWrite(_Buf)))*sizeof(kal_uint8));\ | 
 |       BWrite(_Buf) = (BWrite(_Buf) + _multi) - BLength(_Buf);\ | 
 |    }\ | 
 |    else{\ | 
 |    kal_mem_cpy(BuffWrite(_Buf), _pushDataPointer + offset, _multi*sizeof(kal_uint8));\ | 
 |          BWrite(_Buf) += _multi;\ | 
 | }\ | 
 | }\ | 
 |  | 
 | #define Buf_Push(_Buffer,_pushData) \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf=_Buffer;\ | 
 |    *BuffWrite(_Buf) = _pushData;\ | 
 |    if(BWrite(_Buf) >= (BLength(_Buf) - 1))\ | 
 |    {\ | 
 |    	BWrite(_Buf) = 0;\ | 
 |    }\ | 
 |    else\ | 
 |    {\ | 
 | 	BWrite(_Buf)++;\ | 
 |    }\ | 
 | }\ | 
 |  | 
 | #define Buf_GetBytesAvail(_Buffer,_BytesAvail) \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf = _Buffer;\ | 
 | 	_BytesAvail = 0;\ | 
 | 	if (BWrite(_Buf) >= BRead(_Buf))\ | 
 | 		_BytesAvail = BWrite(_Buf) - BRead(_Buf);\ | 
 | 	else\ | 
 | 		_BytesAvail = BLength(_Buf) - BRead(_Buf) + BWrite(_Buf);	\ | 
 | }\ | 
 |  | 
 | #define Buf_GetBytesAvail_DMA(_Buffer,_BytesAvail) \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf = _Buffer;\ | 
 | 	_BytesAvail = 0;\ | 
 | 	if (BWrite(_Buf) >= BRead(_Buf))\ | 
 | 		_BytesAvail = BWrite(_Buf) - BRead(_Buf);\ | 
 | 	else\ | 
 | 		_BytesAvail = BLength(_Buf) - BRead(_Buf);	\ | 
 | }\ | 
 |  | 
 | #define Buf_Pop_Multi(_Buffer,_popDataPointer,_multi,offset) \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf=_Buffer;\ | 
 |    if( (BRead(_Buf) + _multi) >= BLength(_Buf) ){\ | 
 |    	kal_mem_cpy(_popDataPointer + offset, BuffRead(_Buf), (BLength(_Buf) - BRead(_Buf))*sizeof(kal_uint8));\ | 
 |    	kal_mem_cpy(_popDataPointer + offset + (BLength(_Buf) - BRead(_Buf)), BStartAddr(_Buf), (_multi- (BLength(_Buf) - BRead(_Buf)))*sizeof(kal_uint8));\ | 
 |          BRead(_Buf) = BRead(_Buf) + _multi - BLength(_Buf) ;)\ | 
 |    else{\ | 
 |    	 kal_mem_cpy(_popDataPointer + offset, BuffRead(_Buf), _multi);\ | 
 |          BRead(_Buf) += _multi;}\ | 
 | }\ | 
 |  | 
 | #define Buf_Pop(_Buffer,_popData)   \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf = _Buffer;\ | 
 | 	_popData= *BuffRead(_Buf);\ | 
 | 	BRead(_Buf)++;\ | 
 | 	if (BRead(_Buf) >= BLength(_Buf))\ | 
 | 	{\ | 
 | 		BRead(_Buf) -= BLength(_Buf);\ | 
 | 	}\ | 
 | }\ | 
 |  | 
 | /* should be deleted */ | 
 | #define Buf_IsEmpty(_Buffer,_result)   \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf = _Buffer;\ | 
 | 	if ( BRead(_Buf) == BWrite(_Buf) ) \ | 
 | 	{\ | 
 | 		_result = Buff_isEmpty;\ | 
 | 	}\ | 
 | 	else\ | 
 | 	{\ | 
 | 		_result = Buff_notEmpty;\ | 
 | 	}\ | 
 | }\ | 
 |  | 
 | /* void Get32FromBuff(BUFFER_INFO *Buf,kal_uint32 DATA) */ | 
 | #define Get32FromBuf(_Buffer,_DATA)    \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf = _Buffer;\ | 
 | 	kal_uint8	_tmp,_index;\ | 
 | 	kal_uint32 	_tmp32;\ | 
 | 	_DATA =0;\ | 
 | 	for (_index =0;_index < 4;_index++)\ | 
 | 	{\ | 
 | 		Buff_Pop(_Buf,&_tmp);\ | 
 | 		_tmp32 = (kal_uint32)_tmp;\ | 
 | 		(_DATA) |= (_tmp32 << (8*_index));\ | 
 | 	}\ | 
 | }\ | 
 |  | 
 | /*void Put32toBuff(BUFFER_INFO *Buf,kal_uint32 *DATA)*/ | 
 | #define Put32toBuf(_Buffer,_DATA)    \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf = _Buffer;\ | 
 | 	kal_uint8	_tmp,_index;\ | 
 | 	kal_uint32 	_tmp32;\ | 
 | 	for (_index =0;_index < 4;_index++)\ | 
 | 	{\ | 
 | 		_tmp32 = ((*_DATA) >> (8*_index));\ | 
 | 		_tmp = (kal_uint8)_tmp32;\ | 
 | 		Buff_Push(_Buf,&_tmp);\ | 
 | 	}\ | 
 | }\ | 
 |  | 
 | #define Buf_Flush(_Buffer) \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf = _Buffer;\ | 
 | 	_Buf->Write = _Buf->Read = 0;\ | 
 | } | 
 |  | 
 | #define Buf_look(_Buffer,_popData,_num)   \ | 
 | {\ | 
 |    BUFFER_INFO *_Buf = _Buffer;\ | 
 |    kal_uint8 _index;\ | 
 |    kal_uint16 _tmp;\ | 
 |    _tmp = BRead(Buf);\ | 
 |    for(_index=0;_index<_num;_index++)\ | 
 |    {\ | 
 | 	   *_popData= *(Buf->CharBuffer+_tmp);\ | 
 | 	   _tmp++;\ | 
 | 	   if (_tmp >= BLength(Buf))\ | 
 | 	   {\ | 
 | 		   _tmp -= BLength(Buf);\ | 
 | 	   }\ | 
 | 	}\ | 
 | } | 
 |  | 
 | // MoDIS parser skip start | 
 | #if 1 | 
 | extern void Buff_init(BUFFER_INFO *Buf,kal_uint8 *Buffaddr, kal_uint16 uTotalSize); | 
 | extern void Buff_Push(BUFFER_INFO *Buf,kal_uint8 *pushData); | 
 | extern void Buff_Pop(BUFFER_INFO *Buf,kal_uint8 *popData); | 
 | extern kal_uint8 Buff_IsEmpty(BUFFER_INFO *Buf); | 
 | extern kal_uint8 Buff_IsFull (BUFFER_INFO *Buf); | 
 | extern kal_uint16 Buff_GetRoomLeft (BUFFER_INFO *Buf); | 
 | extern kal_uint16 Buff_GetBytesAvail (BUFFER_INFO *Buf); | 
 | extern kal_uint16 Buff_GetLength(BUFFER_INFO *Buf); | 
 | extern void Buff_Flush (BUFFER_INFO *Buf); | 
 | extern void Buff_look(BUFFER_INFO *Buf,kal_uint8 *popData,kal_uint8 num); | 
 | extern void Get32FromBuff(BUFFER_INFO *Buf,kal_uint32 *DATA); | 
 | extern void Put32toBuff(BUFFER_INFO *Buf,kal_uint32 *DATA); | 
 | extern void MemCPY(kal_uint8 *dst,kal_uint8 *src,kal_uint32 len); | 
 | extern void MemSET(kal_uint8 *dst,kal_uint8 data,kal_uint32 len); | 
 | #endif | 
 | // MoDIS parser skip end | 
 |  | 
 | #endif | 
 |  |