zte's code,first commit
Change-Id: I9a04da59e459a9bc0d67f101f700d9d7dc8d681b
diff --git a/ap/os/linux/linux-3.4.x/drivers/misc/zcat/ringbuf.c b/ap/os/linux/linux-3.4.x/drivers/misc/zcat/ringbuf.c
new file mode 100644
index 0000000..6e56633
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/drivers/misc/zcat/ringbuf.c
@@ -0,0 +1,303 @@
+/**
+ *
+ * @file ringbuf.c
+ * @brief
+ * This file is part of tools.
+ * ring buffer
+ *
+ * @details
+ * @author Tools Team.
+ * @email
+ * @copyright Copyright (C) 2013 Sanechips Technology Co., Ltd.
+ * @warning
+ * @date 2019/02/02
+ * @version 1.1
+ * @pre
+ * @post
+ *
+ * @par
+ * Change History :
+ * ---------------------------------------------------------------------------
+ * date version author description
+ * ---------------------------------------------------------------------------
+ * 2013/01/21 1.0 lu.xieji Create file
+ * 2019/02/02 1.1 jiang.fenglin ÐÞ¸Ä×¢ÊÍ·½Ê½Îªdoxygen
+ * ---------------------------------------------------------------------------
+ *
+ *
+ */
+
+#include "ringbuf.h"
+#include <linux/uaccess.h>
+
+#define SYMBOL_VALUE ZCAT_IPC_ESTABLISHED
+
+/**
+ * @brief Åжϻº³åÇøÊÇ·ñÓÐЧ
+ * @param[in] ringBuf »·Ðλº³å
+ * @return ÊÇ·µ»ØTRUE,·ñ·µ»ØFALSE
+ * @note
+ * @see
+ */
+BOOL IsRingBufferValid(T_RINGBUFFER *ringBuf)
+{
+ return (ringBuf != NULL && ringBuf->symbol == SYMBOL_VALUE);
+}
+
+/**
+ * @brief ´´½¨ÐèÒªµÄ»º³åÇø,²¢ÇÒÖ¸¶¨±ê¼ÇλµÄÖµ
+ * Èç¹ûbuf²»ÎªNULL£¬ÔòÔÚÖ¸¶¨µØÖ·´´½¨»º³åÇø£»·ñÔò£¬ÉêÇëÒ»¿éÄÚ´æ×÷Ϊ»º³åÇø
+ * @param[in] buf »º³åÇøµØÖ·
+ * @param[in] bufSize »º³åÇø´óС
+ * @param[in] bufSize ±ê¼Çλ
+ * @return ³É¹¦·µ»ØÖ¸Ïò»º³åÇø½á¹¹ÌåµÄÖ¸Õ룬·ñÔò·µ»ØNULL
+ * @note
+ * @see
+ */
+T_RINGBUFFER *CreateRingBufferWithSymbol(UINT8 *buf, UINT32 bufSize, UINT32 symbol)
+{
+ T_RINGBUFFER *ringBuf = NULL;
+
+ if (bufSize <= sizeof(T_RINGBUFFER))
+ {
+ return NULL;
+ }
+
+ if (buf == NULL)
+ {
+ //ringBuf = (T_RINGBUFFER *)kmalloc(ALIGNED_SIZE(bufSize, 3), GFP_KERNEL);
+
+ //if (ringBuf == NULL)
+ {
+ return NULL;
+ }
+ }
+ else
+ {
+ ringBuf = (T_RINGBUFFER *)buf;
+ }
+
+ ringBuf->capacity = bufSize - sizeof(T_RINGBUFFER);
+ ringBuf->readPoint = 0;
+ ringBuf->writePoint = 0;
+ ringBuf->symbol = symbol;
+
+ return ringBuf;
+}
+
+
+/**
+ * @brief ´´½¨ÐèÒªµÄ»º³åÇø
+ * Èç¹ûbuf²»ÎªNULL£¬ÔòÔÚÖ¸¶¨µØÖ·´´½¨»º³åÇø£»·ñÔò£¬ÉêÇëÒ»¿éÄÚ´æ×÷Ϊ»º³åÇø
+ * @param[in] buf »º³åÇøµØÖ·
+ * @param[in] bufSize »º³åÇø´óС
+ * @return ³É¹¦·µ»ØÖ¸Ïò»º³åÇø½á¹¹ÌåµÄÖ¸Õ룬·ñÔò·µ»ØNULL
+ * @note
+ * @see
+ */
+T_RINGBUFFER *CreateRingBuffer(UINT8 *buf, UINT32 bufSize)
+{
+ T_RINGBUFFER *ringBuf = NULL;
+
+ if (bufSize <= sizeof(T_RINGBUFFER))
+ {
+ return NULL;
+ }
+
+ if (buf == NULL)
+ {
+ //ringBuf = (T_RINGBUFFER *)kmalloc(ALIGNED_SIZE(bufSize, 3), GFP_KERNEL);
+
+ //if (ringBuf == NULL)
+ {
+ return NULL;
+ }
+ }
+ else
+ {
+ ringBuf = (T_RINGBUFFER *)buf;
+ }
+
+ ringBuf->capacity = bufSize - sizeof(T_RINGBUFFER);
+ ringBuf->readPoint = 0;
+ ringBuf->writePoint = 0;
+ ringBuf->symbol = SYMBOL_VALUE;
+
+ return ringBuf;
+}
+
+
+/**
+* @brief ½«Êý¾ÝдÈë»·Ðλº³å
+* @param[in] ringBuf »·Ðλº³åÖ¸Õë
+* @param[in] buf Êý¾Ý»º´æÖ¸Õë
+* @param[in] len Êý¾Ý³¤¶È
+* @param[in] flags Êý¾Ý»º´æÄÚ´æÀàÐÍ£º0:ÄÚºË̬,1:Óû§Ì¬
+* @return ·µ»ØÐ´ÈëµÄʵ¼Ê³¤¶È
+* @note
+* @see
+*/
+UINT32 WriteRingBuffer(T_RINGBUFFER *ringBuf, UINT8 *buf, UINT32 len, UINT32 flags)
+{
+ UINT32 writeLen = 0;
+ UINT32 writePoint = ringBuf->writePoint;
+ UINT32 readPoint = ringBuf->readPoint;
+
+ /* Èë²ÎÅÐ¶Ï */
+ if (!IsRingBufferValid(ringBuf) || buf == NULL || len == 0)
+ {
+ return 0;
+ }
+ if( writePoint >= ringBuf->capacity || readPoint >= ringBuf->capacity )
+ {
+ return 0;
+ }
+
+ if (writePoint >= readPoint)
+ {
+ if (ringBuf->capacity - writePoint > len)
+ {
+ if (ZCAT_MEM_TYPE_USER == flags) { copy_from_user(ringBuf->buf + writePoint, buf, len); }
+ else { memcpy(ringBuf->buf + writePoint, buf, len); }
+ ringBuf->writePoint += len;
+ writeLen = len;
+ }
+ else if ((ringBuf->capacity - writePoint + readPoint - 1) >= len)
+ {
+ UINT32 copyLen = ringBuf->capacity - writePoint;
+ if (ZCAT_MEM_TYPE_USER == flags) { copy_from_user(ringBuf->buf + writePoint, buf, copyLen); }
+ else { memcpy(ringBuf->buf + writePoint, buf, copyLen); }
+
+ copyLen = len - copyLen;
+
+ if (copyLen > 0)
+ {
+ if (ZCAT_MEM_TYPE_USER == flags) { copy_from_user(ringBuf->buf, buf + (len - copyLen), copyLen); }
+ else { memcpy(ringBuf->buf, buf + (len - copyLen), copyLen); }
+ }
+
+ ringBuf->writePoint = copyLen;
+ writeLen = len;
+ }
+ }
+ else
+ {
+ if (readPoint - writePoint - 1 >= len)
+ {
+ if (ZCAT_MEM_TYPE_USER == flags) { copy_from_user(ringBuf->buf + writePoint, buf, len); }
+ else { memcpy(ringBuf->buf + writePoint, buf, len); }
+ ringBuf->writePoint += len;
+ writeLen = len;
+ }
+ }
+
+ return writeLen;
+}
+
+/**
+* @brief ¶Áȡһ¶Î»·Ðλº³åÇøµÄÊý¾Ýµ½Ä¿±ê»º´æ
+* @param[in] ringBuf »·Ðλº³åÇøÖ¸Õë
+* @param[in] buf Ä¿±ê»º´æÖ¸Õë
+* @param[in] len Ä¿±ê»º´æ³¤¶È
+* @param[in] flags Ä¿±ê»º´æÄÚ´æÀàÐÍ£º0:ÄÚºË̬,1:Óû§Ì¬
+* @return ·µ»Ø¶ÁÈ¡³¤¶È
+* @note
+* @see
+*/
+UINT32 ReadRingBuffer(T_RINGBUFFER *ringBuf, UINT8 *buf, UINT32 len, UINT32 flags)
+{
+ UINT32 readLen = 0;
+ UINT32 writePoint = ringBuf->writePoint;
+ UINT32 readPoint = ringBuf->readPoint;
+
+ /* ²ÎÊý¼ì²é */
+ if (!IsRingBufferValid(ringBuf) || buf == NULL || len == 0)
+ {
+ return 0;
+ }
+ if( writePoint >= ringBuf->capacity || readPoint >= ringBuf->capacity )
+ {
+ return 0;
+ }
+ if (writePoint > readPoint)
+ {
+ readLen = writePoint - readPoint;
+ readLen = (readLen >= len) ? len : readLen;
+
+ if (ZCAT_MEM_TYPE_USER == flags) { copy_to_user(buf, ringBuf->buf + readPoint, readLen); }
+ else { memcpy(buf, ringBuf->buf + readPoint, readLen); }
+ ringBuf->readPoint += readLen;
+ }
+ else if (writePoint < readPoint)
+ {
+ readLen = ringBuf->capacity - readPoint + writePoint;
+ readLen = (readLen >= len) ? len : readLen;
+
+ if (ringBuf->capacity - readPoint >= readLen)
+ {
+ if (ZCAT_MEM_TYPE_USER == flags) { copy_to_user(buf, ringBuf->buf + readPoint, readLen); }
+ else { memcpy(buf, ringBuf->buf + readPoint, readLen); }
+ ringBuf->readPoint = (ringBuf->readPoint + readLen) % ringBuf->capacity;
+ }
+ else
+ {
+ UINT32 copyLen = ringBuf->capacity - readPoint;
+ if (ZCAT_MEM_TYPE_USER == flags) { copy_to_user(buf, ringBuf->buf + readPoint, copyLen); }
+ else { memcpy(buf, ringBuf->buf + readPoint, copyLen); }
+
+ copyLen = readLen - copyLen;
+ if (ZCAT_MEM_TYPE_USER == flags) { copy_to_user(buf + (readLen - copyLen), ringBuf->buf, copyLen); }
+ else { memcpy(buf + (readLen - copyLen), ringBuf->buf, copyLen);}
+
+ ringBuf->readPoint = copyLen;
+ }
+ }
+
+ return readLen;
+}
+
+/**
+* @brief »ñÈ¡µ±Ç°Ring BufferÖпÕÏÐÇøµÄ´óС
+* @param[in] ringBuf »·Ðλº³åÇøÖ¸Õë
+* @return ·µ»Ø×Ö½ÚÊý
+* @note
+* @see
+*/
+UINT32 GetRingBufferSize(T_RINGBUFFER *ringBuf)
+{
+ UINT32 writePoint = ringBuf->writePoint;
+ UINT32 readPoint = ringBuf->readPoint;
+ UINT32 bufSize = 0;
+
+ if (!IsRingBufferValid(ringBuf))
+ {
+ return 0;
+ }
+
+ if (writePoint > readPoint)
+ {
+ bufSize = writePoint - readPoint;
+ }
+ else if (writePoint < readPoint)
+ {
+ bufSize = ringBuf->capacity - readPoint + writePoint;
+ }
+
+ return bufSize;
+}
+
+/**
+* @brief ½«»º³åÇøÖÿÕ
+* @param[in] ringBuf »·Ðλº³åÇøÖ¸Õë
+* @return void
+* @note
+* @see
+*/
+VOID EmptyRingBuffer(T_RINGBUFFER *ringBuf)
+{
+ if (IsRingBufferValid(ringBuf))
+ {
+ ringBuf->readPoint = ringBuf->writePoint;
+ }
+}
+