zte's code,first commit

Change-Id: I9a04da59e459a9bc0d67f101f700d9d7dc8d681b
diff --git a/cp/ps/plat/src/oss/osa/com/makefile b/cp/ps/plat/src/oss/osa/com/makefile
new file mode 100644
index 0000000..60bcaf9
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/makefile
@@ -0,0 +1,110 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: Makefile

+#* ÄÚÈÝÕªÒª: commonÄ£¿é±àÒë

+#* ʹÓ÷½·¨:     

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2013/01/01      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+include $(PRJ_PATH)/config/project.mk

+

+#===============================================================================

+#·¾¶ÉèÖÃ

+#===============================================================================

+_MDL_NAME = com

+

+_MDL_SRC_PATH = $(PLAT_PATH)/src/oss/osa/com

+_MDL_INC_PATH = $(PLAT_PATH)/src/oss/osa/com

+_MDL_OBJ_PATH = $(OBJ_PATH)/plat/oss/osa/$(_MDL_NAME)

+

+#===============================================================================

+#¸÷Ä£¿éÒÀÀµ¹«¹²Í·ÎļþÉèÖÃ

+#===============================================================================

+INCLUDE += -I$(PLAT_PATH)/inc               \

+           -I$(PLAT_PATH)/inc/oss           \

+           -I$(PLAT_PATH)/inc/drv           \

+           -I$(COMMOM_PATH)/inc/config      \

+           -I$(PLAT_PATH)/src/oss/osa/inc   \

+           -I$(PLAT_PATH)/src/oss/sup/inc   \

+           -I$(_MDL_INC_PATH)

+

+#ifeq ($(OSTYPE),ose)

+#INCLUDE += -I$(PLAT_PATH)/src/oss/sup/inc

+#endif

+

+#ifeq ($(OSTYPE),windows)

+#INCLUDE += -I$(PLAT_PATH)/src/oss/sup/inc

+#endif

+

+#===============================================================================

+#×ÓϵͳÀ©Õ¹¶¨Òå

+#===============================================================================

+DEFINE += 

+

+#===============================================================================

+#Ä£¿éÎļþÐÅÏ¢ 

+#===============================================================================

+_C_SOURCE  = $(wildcard $(_MDL_SRC_PATH)/oss_cfg.c)     \

+             $(wildcard $(_MDL_SRC_PATH)/oss_clib.c)    \

+             $(wildcard $(_MDL_SRC_PATH)/oss_defcfg.c)  \

+             $(wildcard $(_MDL_SRC_PATH)/oss_list.c)    \

+             $(wildcard $(_MDL_SRC_PATH)/oss_posix.c)   \

+             $(wildcard $(_MDL_SRC_PATH)/oss_pub.c)     \

+             $(wildcard $(_MDL_SRC_PATH)/oss_queue.c)   \

+             $(wildcard $(_MDL_SRC_PATH)/oss_ring.c)    \

+             $(wildcard $(_MDL_SRC_PATH)/oss_timer.c)

+                

+ifeq ($(OSTYPE),ose)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/oss_event.c)   \

+             $(wildcard $(_MDL_SRC_PATH)/oss_fs.c)      \

+             $(wildcard $(_MDL_SRC_PATH)/oss_trace.c)   \

+             $(wildcard $(_MDL_SRC_PATH)/oss_mem.c)

+endif

+

+ifeq ($(OSTYPE),windows)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/oss_event.c)   \

+             $(wildcard $(_MDL_SRC_PATH)/oss_mem.c)

+endif

+

+ifeq ($(OSTYPE),tos)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/oss_fs.c)      \

+             $(wildcard $(_MDL_SRC_PATH)/oss_trace.c)   \

+             $(wildcard $(_MDL_SRC_PATH)/oss_mem.c)

+endif

+

+ifeq ($(OSTYPE),linux)

+

+ifeq ($(UB_USE),pool)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/oss_pool.c)

+endif

+

+ifeq ($(USE_OSS_FS),yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/oss_fs.c)

+endif

+

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/oss_trace.c)       \

+             $(wildcard $(_MDL_SRC_PATH)/oss_math.c)        \

+             $(wildcard $(_MDL_SRC_PATH)/oss_math_ceil.c)   \

+             $(wildcard $(_MDL_SRC_PATH)/oss_math_sqrt.c)   \

+             $(wildcard $(_MDL_SRC_PATH)/oss_math_pow.c)    \

+             $(wildcard $(_MDL_SRC_PATH)/oss_math_scalbn.c) \

+             $(wildcard $(_MDL_SRC_PATH)/oss_math_log.c)    \

+             $(wildcard $(_MDL_SRC_PATH)/oss_math_log10.c)  \

+             $(wildcard $(_MDL_SRC_PATH)/oss_math_div.c)    \

+             $(wildcard $(_MDL_SRC_PATH)/oss_mem.c)

+endif

+

+_s_SOURCE =

+_S_SOURCE =

+

+#===============================================================================

+# ±àÒë¹æÔò

+#===============================================================================

+include $(FRAME_PATH)/rules/mdl_rules.mk

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_clib.c b/cp/ps/plat/src/oss/osa/com/oss_clib.c
new file mode 100644
index 0000000..dec6eda
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_clib.c
@@ -0,0 +1,381 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : oss_clib.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ossµÄC¿â½Ó¿Ú

+* ×÷    Õß : µËÄþˆÒ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2013/01/12

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 

+* ÐÞ ¸Ä ÈË : 

+* ÐÞ¸ÄÈÕÆÚ : 

+* ÐÞ¸ÄÄÚÈÝ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#if defined _OS_TOS || defined _OS_OSE

+#include "drv_api.h"

+#elif defined (_OS_LINUX)

+#include <linux/time.h>

+#endif

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+#if defined _OS_OSE || defined _OS_WIN

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmem_memcpy

+* ¹¦ÄÜÃèÊö£ºÄڴ濽±´

+* ²ÎÊý˵Ã÷£º(IN) dest_ptr:Ö¸ÏòÄ¿µÄÄÚ´æ¿éµÄÖ¸Õë

+                 src_ptr:Ö¸ÏòÔ´ÄÚ´æ¿éµÄÖ¸Õë

+                 size:¿½±´µÄ×Ö½ÚÊý

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID *mem_memcpy(VOID *dest_ptr, const VOID *src_ptr, UINT32 size, const CHAR *file, UINT32 line)

+{

+    if(size == 0)

+    {

+        return dest_ptr;

+    }

+    zOss_AssertEx(dest_ptr != NULL, NULL);

+    zOss_AssertEx(src_ptr != NULL, NULL);

+

+    return memcpy(dest_ptr, src_ptr, size);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmem_memset

+* ¹¦ÄÜÃèÊö£ºÄڴ渳ֵ

+* ²ÎÊý˵Ã÷£º(IN) dest_ptr:Òª¸³ÖµµÄÄ¿µÄÄÚ´æ¿éÖ¸Õë

+                 value:¸³ÖµÄÚÈÝ

+                 size:¸³Öµ×Ö½ÚÊý

+* ·µ »Ø Öµ£º·µ»Ødest_ptrÖ¸Õë

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID *mem_memset(VOID *dest_ptr, SINT32 value, UINT32 size, const CHAR *file, UINT32 line)

+{

+    if (size == 0)

+    {

+        return dest_ptr;

+    }

+

+    zOss_AssertEx(dest_ptr != NULL, NULL);

+

+    return memset(dest_ptr, value, size);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmem_memmove

+* ¹¦ÄÜÃèÊö£ºÄÚ´æ¸´ÖÆ

+* ²ÎÊý˵Ã÷£º(IN)    dest_ptr:Ä¿µÄÄÚ´æÇøÓòÖ¸Õë

+                    src_ptr:Ô´ÄÚ´æÇøÓòÖ¸Õë

+                    count:¸´ÖƵÄ×Ö½Ú¸öÊý

+* ·µ »Ø Öµ£ºÄ¿µÄÄÚ´æÖ¸Õë

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID* mem_memmove(VOID* dest_ptr, const VOID* src_ptr, UINT32 count)

+{

+    if(count == 0)

+    {

+        return  dest_ptr;

+    }

+    zOss_AssertEx(dest_ptr != NULL, NULL);

+    zOss_AssertEx(src_ptr != NULL, NULL);

+

+    return memmove( dest_ptr, src_ptr, count);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmem_memcmp

+* ¹¦ÄÜÃèÊö£ºÄÚ´æ±È½Ï

+* ²ÎÊý˵Ã÷£º(IN)    f_buf_ptr:µÚÒ»¿éÄÚ´æÇøÓòµÄÖ¸Õë

+                    s_buf_ptr: µÚ¶þ¿éÄÚ´æÇøÓòµÄÖ¸Õë

+                    count:±È½ÏµÄ×Ö½Ú¸öÊý

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+SINT32 mem_memcmp(const VOID *f_buf_ptr, const VOID* s_buf_ptr, UINT32 count)

+{

+    if(count == 0)

+    {

+        return 0;

+    }

+    zOss_AssertEx(f_buf_ptr != NULL, -1);

+    zOss_AssertEx(s_buf_ptr != NULL, -1);    

+

+    return memcmp(f_buf_ptr, s_buf_ptr, count);

+}

+#endif

+

+#ifdef _OS_OSE

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ·µ»Ø´Ó¹«Ôª1970Äê1ÔÂ1ÈÕµÄUTCʱ¼ä´Ó0ʱ0·Ö0ÃëËãÆðµ½ÏÖÔÚËù¾­¹ýµÄÃëÊý¡£

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  t:  ±£´æ´Ó¹«Ôª1970Äê1ÔÂ1ÈÕµÄUTCʱ¼ä´Ó0ʱ0·Ö0ÃëËãÆðµ½ÏÖÔÚËù¾­¹ýµÄ

+                    ÃëÊý£¬¸Ã²ÎÊý¿ÉΪNULL¡£

+* ·µ »Ø Öµ:     ´Ó¹«Ôª1970Äê1ÔÂ1ÈÕµÄUTCʱ¼ä´Ó0ʱ0·Ö0ÃëËãÆðµ½ÏÖÔÚËù¾­¹ýµÄÃëÊý¡£

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+ZOSS_TIME_T zOss_Time(ZOSS_TIME_T *t)

+{

+#ifdef _USE_CP_RTC

+    struct tm           timeTab = {0};

+    T_ZDrvRtc_TimeDate  rtc     = {0};

+    ZOSS_TIME_T         secNum  = 0;

+    SINT32              ret     = 0;

+

+    ret = Rtc_GetDateTime(&rtc);

+    if (ret != 0)

+    {

+        return 0x00;

+    }

+

+    timeTab.tm_sec  = rtc.second;

+    timeTab.tm_min  = rtc.minute;

+    timeTab.tm_hour = rtc.hour;

+    timeTab.tm_mday = rtc.day;

+    timeTab.tm_mon  = rtc.month - 1;

+    timeTab.tm_year = rtc.year - 1900;

+

+    secNum = (ZOSS_TIME_T)mktime(&timeTab);

+    if (t)

+    {

+        *t = secNum;

+    }

+

+    return secNum;

+#else

+    return 0x00;

+#endif

+}

+#endif

+

+#ifdef _OS_LINUX

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ·µ»Ø´Ó¹«Ôª1970Äê1ÔÂ1ÈÕµÄUTCʱ¼ä´Ó0ʱ0·Ö0ÃëËãÆðµ½ÏÖÔÚËù¾­¹ýµÄÃëÊý¡£

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  t:  ±£´æ´Ó¹«Ôª1970Äê1ÔÂ1ÈÕµÄUTCʱ¼ä´Ó0ʱ0·Ö0ÃëËãÆðµ½ÏÖÔÚËù¾­¹ýµÄ

+                    ÃëÊý£¬¸Ã²ÎÊý¿ÉΪNULL¡£

+* ·µ »Ø Öµ:     ´Ó¹«Ôª1970Äê1ÔÂ1ÈÕµÄUTCʱ¼ä´Ó0ʱ0·Ö0ÃëËãÆðµ½ÏÖÔÚËù¾­¹ýµÄÃëÊý¡£

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+ZOSS_TIME_T zOss_Time(ZOSS_TIME_T *t)

+{

+    return 0x00;

+}

+

+time_t time(time_t *__timer)

+{

+    return jiffies;

+}

+

+#ifndef USE_CPPS_KO

+int raise(int signo)

+{

+    return 0x00;

+}

+#endif

+#endif

+

+#if defined (_OS_TOS) || defined (_OS_OSE) || defined (_OS_LINUX)

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ½«intµÄÊýת»»Îª×Ö·û´®

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  num:    Ҫת»»µÄÊý

+                str:    ´æ·Å×Ö·û´®µÄµØÖ·

+                radix:  ½øÖÆ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦:·µ»Ø´æ·Å×Ö·û´®µÄµØÖ·;ʧ°Ü:NULL

+* ÆäËü˵Ã÷:     ¾ßÌåÓ÷¨²Î¼û±ê×¼µÄitoa()

+**************************************************************************/

+char *itoa(int num, char *str, int radix)

+{

+    char            string[]    = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

+    char            *ptr        = str;

+    char            *gptr       = str;

+    unsigned int    pnum        = 0;

+    int             i           = 0;

+    int             j           = 0;

+    int             n           = 0;

+    

+    if (radix < 2 || radix > 36 || str == NULL)

+    {

+        return NULL;

+    }

+    

+    if (num < 0 && radix == 10)

+    {

+        *ptr = '-';

+        ptr++;

+        gptr = ptr;

+        i = 1;

+        pnum = (unsigned int)(-num);

+    }

+    else

+    {

+        i = 0;

+        pnum = (unsigned int)num;

+    }

+    

+    while (pnum || gptr == ptr)

+    {

+        *ptr = string[(unsigned)(pnum % (unsigned int)radix)];

+        ptr++;

+        pnum /= (unsigned int)radix;

+        

+        if (pnum < (unsigned int)radix)

+        {

+            if (pnum != 0)

+            {

+                *ptr = string[pnum];

+                ptr++;

+            }

+            *ptr = '\0';

+            break;

+        }

+    }

+    

+    j = (ptr - str) - 1;

+    

+    for (n = 0; n < (ptr - gptr) / 2; n++)

+    {

+        char temp = str[i];

+        str[i] = str[j];

+        str[j--] = temp;

+        i++;

+    }

+    

+    return str;

+}

+

+#endif

+

+#ifdef _OS_WIN

+/**************************************************************************

+* º¯ÊýÃû³Æ:  zOss_Time

+* ¹¦ÄÜÃèÊö:  ·µ»Ø´Ó¹«Ôª1970Äê1ÔÂ1ÈÕµÄUTCʱ¼ä´Ó0ʱ0·Ö0ÃëËã

+             Æðµ½ÏÖÔÚËù¾­¹ýµÄÃëÊý

+* ²ÎÊý˵Ã÷:  (IN) t:This parameter may be NULL, in which case the return value is not stored

+* ·µ »Ø Öµ:³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR.

+* ÆäËü˵Ã÷:

+**************************************************************************/

+ZOSS_TIME_T zOss_Time(ZOSS_TIME_T *t)

+{

+    return (ZOSS_TIME_T)time((long *)t);

+}

+#endif

+

+#ifdef _OS_LINUX

+char *strtok_r(char *s, const char *delim, char **last)

+{

+	char *spanp;

+	int c, sc;

+	char *tok;

+

+

+	if (s == NULL && (s = *last) == NULL)

+		return (NULL);

+

+	/*

+	 * Skip (span) leading delimiters (s += strspn(s, delim), sort of).

+	 */

+cont:

+	c = *s++;

+	for (spanp = (char *)delim; (sc = *spanp++) != 0;) {

+		if (c == sc)

+			goto cont;

+	}

+

+	if (c == 0) {		/* no non-delimiter characters */

+		*last = NULL;

+		return (NULL);

+	}

+	tok = s - 1;

+

+	/*

+	 * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).

+	 * Note that delim must have one NUL; we stop if we see that, too.

+	 */

+	for (;;) {

+		c = *s++;

+		spanp = (char *)delim;

+		do {

+			if ((sc = *spanp++) == c) {

+				if (c == 0)

+					s = NULL;

+				else

+					s[-1] = 0;

+				*last = s;

+				return (tok);

+			}

+		} while (sc != 0);

+	}

+	/* NOTREACHED */

+}

+

+char *strtok(char *s, const char *delim)

+{

+	static char *last;

+

+	return strtok_r(s, delim, &last);

+}

+

+void perror(const char *s)

+{

+	

+}

+  

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef __cplusplus

+ }

+#endif

+

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_defcfg.c b/cp/ps/plat/src/oss/osa/com/oss_defcfg.c
new file mode 100644
index 0000000..7d97102
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_defcfg.c
@@ -0,0 +1,138 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : oss_defcfg.c

+* ÎÄ ¼þ Ãû : oss_defcfg.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ĬÈÏÅäÖÃÎļþ

+* ×÷    Õß : ºÎº£½¨

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2008/04/21

+* ÆäËü˵Ã÷ :          

+**************************************************************************/

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/09/15

+* ÐÞ¸ÄÄÚÈÝ : PC-LINT¼ì²éÓÚ±àÂë¹æ·¶ÐÞ¸Ä EC: 617001781881  

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC: 617001781957

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "ThreadPriority.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/**************************************************************************

+* #includeÇø                                     

+**************************************************************************/

+#define ZOSS_MAX_TASKTAB_NUM            100     

+#define ZOSS_MAX_THREAD_NUM             4           /* µ÷¶ÈÏß³ÌÊý                   */

+#define ZOSS_MAX_MSGQUEUE_LEN           1023        /* ÈÎÎñÏûÏ¢¶ÓÁг¤¶È             */

+

+/* ÍøÂçÅäÖà */                                 

+#define ZOSS_MAX_TCPIP_NETIF_NUM        10          /* ÍøÂç½Ó¿Ú×î´óÊýÄ¿             */

+#define ZOSS_MAX_TCPIP_PACK_SIZE        1500        /* Êý¾Ý°ü×î´ó³¤¶È£¨»º³åÇø´óС£© */

+

+/* ¶¨Ê±Æ÷ÅäÖà */

+#define ZOSS_TIMER_SCHEDULE_PRIORITY    THR_TIMER_PRI                       /* ¶¨Ê±Æ÷µ÷¶ÈÏß³ÌÓÅÏȼ¶0-9   */

+#define ZOSS_TIMER_CALLBACK_STACK       2048                                /* ¶¨Ê±Æ÷»Øµ÷º¯ÊýÏ̶߳ÑÕ»    */

+#define ZOSS_TIMER_CALLBACK_PRIORITY    (ZOSS_TIMER_SCHEDULE_PRIORITY + 1)  /* ¶¨Ê±Æ÷»Øµ÷º¯ÊýÏ̶߳ÑÕ»    */

+#define ZOSS_TIMER_MINTIMELEN           1                                   /* ¶¨Ê±Æ÷×îСʱ¼ä²î,µ¥Î»ºÁÃë */

+#define ZOSS_MAX_TIMER_NUM              146                                 /* ×î´ó¶¨Ê±Æ÷¸öÊý            */

+

+/* Òì³£, ϵͳ¼à¿Ø */

+#define ZOSS_EXCEP_DEAMONSTARTTIME      1000        /* ÊÕµ½power_onºóÉèÖÃWDTµÄʱ¼ä(ms)  */  

+#define ZOSS_EXCEP_DEADLOOPCHECKTIME    5000        /* ËÀÑ­»·¼ì²âʱ¼ä¼ä¸ô(ms)           */

+#define ZOSS_EXCEP_UPDATECPUTIME        4000        /* ¸üÐÂCPUʹÓÃÂÊʱ¼ä                */

+

+/* ËÀÑ­»·ÅжÏʱ¼ä, µ¥Î»s */

+#define ZOSS_DEADLOOP_TIME              30              

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+/*

+¶ÔÄÚ´æ³Ø½øÐÐÅäÖÃʱ£¬ÄÚ´æ³Ø¸öÊý, ×î´ó²»Äܳ¬¹ý255 

+µÚÒ»ÏîÊÇÄÚ´æ³Ø´óС£¬ÄÚ´æ³Ø´óС±ØÐè´óÓÚ0£¬°´ÕÕ´ÓСµ½´óµÄ˳Ðò£¬µ¥Î»Îªbyte

+µÚ¶þÏîÊǸÃÄÚ´æ³ØµÄÔ¤¶¨ÄÚ´æ¿é¸öÊý£¬±ØÐëΪ´óÓÚ0µÄÕûÊý£¬È¡Öµ·¶Î§Îª1-65535

+µÚÈýÏîÊǸÃÄÚ´æ³ØµÄ¼«ÏÞÄÚ´æ¿é¸öÊý£¬±ØÐëΪ´óÓÚ0µÄÕûÊý£¬È¡Öµ·¶Î§Îª1-65535

+*/

+static T_ZOss_UBPOOL gUBDefPool[]=

+{

+    { 32,    500 },

+    { 64,    400 },

+    { 128,   300 },

+    { 256,   300 },

+    { 512,   300 },

+    { 1024,  300 },

+    { 2048,  100 },

+    { 8192,  50  },

+    { 65535, 3   }  

+};

+

+static T_OSS_PARAM g_OssDefCfg  = {0};  /* ȱʡĬÈÏÅäÖÃÈ«¾Ö±äÁ¿ */

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  zOss_GetOssCfg

+* ¹¦ÄÜÃèÊö:  »ñÈ¡OSS¶¯Ì¬¼ÓÔØÈ«¾Ö±äÁ¿Ö¸Õë

+* ²ÎÊý˵Ã÷: 

+* ·µ »Ø Öµ:  

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+T_OSS_PARAM* zOss_GetOssCfg(VOID)

+{

+    static BOOL bInit = TRUE;

+

+    if(bInit)

+    {

+        /* osaÅäÖÃ */

+        g_OssDefCfg.OsaCfg.pPrioMap             = NULL;

+        

+        /* ÄÚ´æÅäÖà */

+        g_OssDefCfg.MemCfg.ub_pool_num          = sizeof(gUBDefPool) / sizeof(T_ZOss_UBPOOL);

+        g_OssDefCfg.MemCfg.UBPool               = gUBDefPool;

+

+       /* ÈÎÎñÅäÖà */

+        g_OssDefCfg.TaskCfg.max_task_num        = ZOSS_MAX_TASKTAB_NUM;

+        g_OssDefCfg.TaskCfg.max_schthread_num   = ZOSS_MAX_THREAD_NUM;

+        g_OssDefCfg.TaskCfg.max_msg_queue_len   = ZOSS_MAX_MSGQUEUE_LEN;

+        g_OssDefCfg.TaskCfg.deadloop_time       = ZOSS_DEADLOOP_TIME;

+

+        /* ¶¨Ê±Æ÷Ä£¿é */

+        g_OssDefCfg.TimerCfg.SchPrio            = ZOSS_TIMER_SCHEDULE_PRIORITY;

+        g_OssDefCfg.TimerCfg.CallBackStack      = ZOSS_TIMER_CALLBACK_STACK;

+        g_OssDefCfg.TimerCfg.CallBackPrio       = ZOSS_TIMER_CALLBACK_PRIORITY;

+        g_OssDefCfg.TimerCfg.MinTimeLen         = ZOSS_TIMER_MINTIMELEN;

+        g_OssDefCfg.TimerCfg.MaxTimeNum         = ZOSS_MAX_TIMER_NUM;

+

+        /* Òì³£ÅäÖà */

+        g_OssDefCfg.ExcepCfg.DeamonStartTime    = ZOSS_EXCEP_DEAMONSTARTTIME;

+        g_OssDefCfg.ExcepCfg.DeadLoopCheckTime  = ZOSS_EXCEP_DEADLOOPCHECKTIME;

+        g_OssDefCfg.ExcepCfg.UpdateCPUTime      = ZOSS_EXCEP_UPDATECPUTIME;

+

+        bInit = FALSE;

+    }

+    

+    return &g_OssDefCfg;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_event.c b/cp/ps/plat/src/oss/osa/com/oss_event.c
new file mode 100644
index 0000000..5bcb885
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_event.c
@@ -0,0 +1,447 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : oss_event.c 

+* ÎÄ ¼þ Ãû : oss_event.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ʵÏÖ32λʼþ×é½Ó¿Ú

+* ×÷    Õß : ºÎº£½¨

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2008/05/18

+* ÆäËü˵Ã÷ :          

+**************************************************************************/

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ÎäÏþ»Û

+* ÐÞ¸ÄÈÕÆÚ : 2009/03/19

+* ÐÞ¸ÄÄÚÈÝ : ÐÞ¸ÄʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/09/15

+* ÐÞ¸ÄÄÚÈÝ : PC-LINT¼ì²éÓÚ±àÂë¹æ·¶ÐÞ¸Ä EC: 617001781881  

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC: 617001781957

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define EVENT_CLEAR (ZOSS_EVENTS_OR_CLEAR & ZOSS_EVENTS_AND_CLEAR)  /* ÇåÁã */

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/ 

+typedef struct 

+{

+    UINT32              currentEvents;      /* ʼþ×鵱ǰ±ê¼Ç               */

+    T_ZOss_List         eventSuspendList;   /* µ±Ç°¹ÒÆðÏß³ÌÁ´±í             */

+    ZOSS_MUTEX_ID       ListWriteMutex;     /* Á´±íд²Ù×÷»¥³âÁ¿±£»¤         */

+}T_ZOss_Event;                              /* ʼþ¿ØÖÆ¿é                   */

+

+/* ¹ÒÆðÏß³ÌÐÅÏ¢½áµã */

+typedef struct

+{

+    T_ZOss_Node         eventNode;          /* Á´±í½áµãÍ·                    */

+    ZOSS_SEMAPHORE_ID   threadSem;          /* Ïß³ÌÐźÅÁ¿£¬ÓÃÓÚ×èÈû¼¤»îÏß³Ì  */

+    UINT32              suspendOption;      /* ¹ÒÆðÏ̷߳½Ê½                  */

+    UINT32              events;             /* Òª»ñÈ¡µÄʼþ±ê¼Ç              */

+    UINT32              eventsReceived;     /* »ñÈ¡µ½µÄʼþ±ê¼Ç              */

+}T_ZOssSuspendThreadsNode;

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_CreateEvent

+* ¹¦ÄÜÃèÊö: ´´½¨Ò»¸ö32λµÄʼþ×é.ʼþ×éÄÚ²¿ÓÐÒ»¸ö32λµÄÊÂ

+            ¼þ±êÖ¾±äÁ¿£¬32λʼþ±ê¼Çλ¶¼³õʼ»¯Îª0

+* ²ÎÊý˵Ã÷: (IN)

+                name:ʼþ×éÃû

+* ·µ »Ø Öµ: ³É¹¦:ʼþ×éID;ʧ°Ü:NULL

+* ÆäËü˵Ã÷:

+**************************************************************************/

+ZOSS_EVENT_ID zOss_CreateEvent(const CHAR *name)

+{

+    /* ·ÖÅäʼþ¿ØÖÆ¿é¿Õ¼ä */

+    T_ZOss_Event *pEvent = (T_ZOss_Event *)zOss_Malloc(sizeof(T_ZOss_Event));

+    zOss_AssertEx(pEvent != NULL, NULL);

+    zOss_Memset(pEvent, 0, sizeof(T_ZOss_Event));

+    

+    /* ³õʼ»¯Ê¼þ¿ØÖÆ¿é */

+    pEvent->currentEvents = 0;

+    

+    pEvent->ListWriteMutex = zOss_CreateMutex(name, ZOSS_INHERIT);

+    if(pEvent->ListWriteMutex == NULL)

+    {

+        zOss_ASSERT(pEvent->ListWriteMutex);

+        zOss_Free(pEvent);

+        return NULL;

+    }

+    zOss_ListInit(&pEvent->eventSuspendList); /* ³õʼ»¯¹ÒÆðÏß³ÌÁ´±í */

+    

+    return (ZOSS_EVENT_ID)pEvent;             /* ·µ»ØÊ¼þ×éid */

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_GetEvent

+* ¹¦ÄÜÃèÊö: »ñȡʼþ×é

+* ²ÎÊý˵Ã÷: (IN)

+                event_id:ʼþ×éid

+                events:32λʼþ±ê¼Ç

+                get_options:ÃèÊöÈçºÎ»ñÈ¡¸Ãʼþ±ê¼Ç×éºÏ

+                            ZOSS_EVENTS_AND:±íʾeventsÖ¸¶¨µÄËùÓÐʼþ±ê¼Ç¶¼Òª·ûºÏ

+                            ZOSS_EVENTS_OR:±íʾeventsÖ¸¶¨µÄʼþ±ê¼ÇÖ»ÒªÓÐÈκÎÒ»

+                                                    ¸ö·ûºÏ¼´¿É

+                            ZOSS_EVENTS_AND_CLEAR:±íʾ°´ZOSS_EVENTS_AND·½Ê½»ñÈ¡Íêºó,

+                                                  ½«·ûºÏÌõ¼þµÄʼþ±ê¼ÇÖÃΪ0

+                            ZOSS_EVENTS_OR_CLEAR:±íʾ°´ZOSS_EVENTS_OR·½Ê½»ñÈ¡Íêºó,

+                                                 ½«·ûºÏÌõ¼þµÄʼþ±ê¼ÇÖÃΪ0

+                pEventsReceived:´æ·Å»ñÈ¡µ½µÄʼþ±êÖ¾Ö¸Õë,²»ÄÜΪ¿Õ

+                timeout:³¬Ê±ÊôÐÔ.ZOSS_WAIT_FOREVER, ZOSS_NO_WAIT,»ò¾ßÌåʱ¼ä

+                        µ¥Î»ºÁÃë

+* ·µ »Ø Öµ: ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_GetEvent(ZOSS_EVENT_ID eventId, UINT32  events, UINT32 getOptions,

+                     UINT32 *pEventsReceived, UINT32 timeout)

+{

+    T_ZOss_Event    *pEvent     = NULL;

+    BOOL            isSatisfied = FALSE;

+    UINT32          result      = 0;

+    

+    zOss_AssertEx(eventId != NULL && pEventsReceived != NULL && events > 0, ZOSS_ERROR);

+

+    if (getOptions > ZOSS_EVENTS_AND_CLEAR)

+    {

+        return ZOSS_ERROR;  /* ´íÎóÂ붨ÒåÈë²Î´íÎó */

+    }

+    

+    pEvent = (T_ZOss_Event *)eventId;

+

+    result = pEvent->currentEvents & events;

+    /* ¸ù¾Ý²»Í¬µÄ»ñÈ¡·½Ê½£¬ÅжÏʼþÊÇ·ñ·¢Éú */

+    if(ZOSS_EVENTS_AND & getOptions)

+    {

+        isSatisfied = (BOOL)(result == events);

+    }

+    else

+    {

+        isSatisfied = (BOOL)result;

+    }

+    /* ÅжÏʼþÊÇ·ñ·¢Éú */

+    if(isSatisfied)                  /* ·¢Éú */

+    {

+        *pEventsReceived = result;

+        if(EVENT_CLEAR & getOptions) /* ÐèÒªÇåÁã */ 

+        {

+            pEvent->currentEvents &= ~result;

+        }

+        return ZOSS_SUCCESS;

+    }

+    else /* δ·¢Éú */

+    {

+        if(!timeout)

+        {

+            /* Á¢¼´·µ»Ø */

+            *pEventsReceived = 0;

+            return ZOSS_ERROR;

+        }

+        else  /* µÈ´ý·½Ê½ */

+        {

+            static UINT32    semNameNum  = 0;

+            CHAR             semName[20] = {0};

+            

+            /* ±£´æÐèÒª¹ÒÆðÏ̵߳Ļù±¾ÐÅÏ¢¿ªÊ¼ */

+            T_ZOssSuspendThreadsNode *susThreadNode = (T_ZOssSuspendThreadsNode *)zOss_Malloc(sizeof(T_ZOssSuspendThreadsNode));

+            zOss_AssertEx(susThreadNode != NULL, ZOSS_ERROR);

+            

+            zOss_Memset(susThreadNode, 0, sizeof(T_ZOssSuspendThreadsNode));

+            sprintf((char *)semName, "%d", (unsigned int)(++semNameNum));

+            susThreadNode->events        = events;

+            susThreadNode->suspendOption = getOptions;

+            /* ´´½¨ÐźÅÁ¿ */

+            susThreadNode->threadSem = zOss_CreateSemaphore(semName, 0);

+            if(susThreadNode->threadSem == NULL)

+            {

+                zOss_ASSERT(susThreadNode->threadSem);

+                zOss_Free(susThreadNode);

+                return ZOSS_ERROR;

+            }

+            /* ±£´æ¹ÒÆðÏ̵߳Ļù±¾ÐÅÏ¢½áÊø */

+            

+            /* »ñÈ¡»¥³âÁ¿ */

+            zOss_GetMutex(pEvent->ListWriteMutex, ZOSS_WAIT_FOREVER);

+            /* Ïß³ÌÐÅÏ¢Èë¹ÒÆðÏ̶߳ÓÁÐ */

+            zOss_ListAdd(&pEvent->eventSuspendList, &susThreadNode->eventNode);

+            /* ÊÍ·Å»¥³âÁ¿ */

+            zOss_PutMutex(pEvent->ListWriteMutex);

+            

+            /* »ñÈ¡ÐźÅÁ¿£¬¹ÒÆðÏß³Ì */           

+            if((zOss_GetSemaphore(susThreadNode->threadSem, timeout) == ZOSS_ERROR) && (susThreadNode->threadSem != NULL)) /* ³¬Ê±£¬É¾³ý¹ÒÆðÏß³ÌÁ´±íÖÐµÄ¹ÒÆðÏ߳̽áµã */

+            {

+                /* »ñÈ¡»¥³âÁ¿ */

+                zOss_GetMutex(pEvent->ListWriteMutex, ZOSS_WAIT_FOREVER);

+                zOss_ListDelete(&pEvent->eventSuspendList, &susThreadNode->eventNode);

+                zOss_PutMutex(pEvent->ListWriteMutex);

+            }

+            /* ɾ³ýÐźÅÁ¿£¬ÐźÅÁ¿Ö¸ÕëÖÃ¿Õ */

+            zOss_DeleteSemaphore(susThreadNode->threadSem);

+            susThreadNode->threadSem = NULL;

+            

+            if(ZOSS_EVENTS_AND & getOptions)     /* ËùÓÐʼþ¶¼±ØÐë·¢Éú */

+            {

+                isSatisfied = (BOOL)(susThreadNode->eventsReceived == events);

+            }

+            else                         /* ÖÁÉÙÒ»¸ö·¢Éú */

+            {

+                isSatisfied = (BOOL)(susThreadNode->eventsReceived);

+            }

+            *pEventsReceived = susThreadNode->eventsReceived;

+            

+            zOss_Free((T_ZOssSuspendThreadsNode *)susThreadNode);

+            

+            if(isSatisfied)

+            {

+                return ZOSS_SUCCESS;

+            }

+            else

+            {

+                return ZOSS_ERROR;

+            }

+        }        

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetEvent

+* ¹¦ÄÜÃèÊö: ÉèÖÃʼþ×éʼþ±ê־룬Ó뵱ǰʼþ×é½øÐÐλ»ò

+* ²ÎÊý˵Ã÷: (IN)

+                 eventId:ʼþ×éid

+                 events:32-bit unsigned variable that represents the requested event flags.

+                 setOptions:ÃèÊöÈçºÎÉèÖøÃʼþ±ê¼Ç×é

+                            ZOSS_EVENTS_AND: ÓëeventsÅäºÏʹÓã¬Íê³É32Ϊ±ê¼ÇÇåÁ㹦ÄÜ¡£´Ëʱevents±ØÐëΪ0¡£

+                            ZOSS_EVENTS_OR ½«eventsͬµ±Ç°Öµ½øÐлòÔËËã

+* ·µ »Ø Öµ: ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_SetEvent(ZOSS_EVENT_ID eventId, UINT32  events, UINT32 setOptions)

+{

+    T_ZOss_Event                *pEvent     = NULL;

+    BOOL                        isSatisfied = FALSE;

+    UINT32                      result      = 0;

+    UINT32                      status      = 0;

+    T_ZOssSuspendThreadsNode    *pNode      = NULL;

+    T_ZOssSuspendThreadsNode    *pNodeCopy  = NULL;

+

+    zOss_AssertEx(eventId != NULL, ZOSS_ERROR);

+    

+    if((setOptions != ZOSS_EVENTS_AND) && (setOptions != ZOSS_EVENTS_OR))

+    {

+        return ZOSS_ERROR;

+    }

+    pEvent = (T_ZOss_Event *)eventId;

+    

+    if(setOptions == ZOSS_EVENTS_AND)

+    {

+        if(events == 0)

+        {

+            pEvent->currentEvents &= events;

+            return ZOSS_SUCCESS;

+        }

+        else

+        {

+            return ZOSS_ERROR;

+        }

+    }

+

+    /* ´¥·¢Ê¼þ */   

+    result = pEvent->currentEvents;

+    pEvent->currentEvents |= events;

+    if ((result == pEvent->currentEvents) || (pEvent->eventSuspendList.HEAD == NULL))   /* ±ê¼ÇÎ޸ıä,ÎÞ¹ÒÆðÏß³Ì*/

+    {

+        return ZOSS_SUCCESS;

+    }

+

+    pNode = (T_ZOssSuspendThreadsNode *)pEvent->eventSuspendList.HEAD;

+    /* »ñÈ¡»¥³âÁ¿,½«½áµãÒÆ³ö¹ÒÆðÏß³ÌÁ´±í */

+    zOss_GetMutex(pEvent->ListWriteMutex, ZOSS_WAIT_FOREVER);

+    

+    /* ±éÀú¹ÒÆðÏß³ÌÁ´±í */

+    while(pNode != NULL)

+    {

+        UINT32 eventResult = pEvent->currentEvents & pNode->events;

+        /* ¸ù¾Ý²»Í¬µÄ»ñÈ¡·½Ê½£¬ÅжÏʼþÊÇ·ñ·¢Éú */

+        if(ZOSS_EVENTS_AND & pNode->suspendOption)

+        {

+            isSatisfied = (BOOL)(eventResult == pNode->events);

+        }

+        else

+        {

+            isSatisfied = (BOOL)eventResult;

+        }

+        if(isSatisfied)   /* ʼþ·¢Éú */

+        {

+            pNodeCopy = pNode;

+

+            pNodeCopy->eventsReceived = eventResult; /* ±£´æ»ñµÃµÄʼþ±ê¼Ç */

+                

+            if(EVENT_CLEAR & pNodeCopy->suspendOption) /* ÐèÒªÇåÁã */ 

+            {

+                pEvent->currentEvents &= ~pNodeCopy->eventsReceived;

+            }

+

+            if(pNode == (T_ZOssSuspendThreadsNode *)pEvent->eventSuspendList.HEAD)

+            {

+                /* ¹ÒÆðÏ߳̽áµã´ÓÁ´±íÖÐÒÆ³ý */

+                zOss_ListDelete(&pEvent->eventSuspendList, &pNodeCopy->eventNode);

+

+                pNode = (T_ZOssSuspendThreadsNode *)pEvent->eventSuspendList.HEAD;

+                

+                /* ÊÍ·ÅÐźÅÁ¿ */

+                if(pNodeCopy->threadSem == NULL)

+                {

+                    zOss_ASSERT(pNodeCopy->threadSem);

+                    return ZOSS_ERROR;

+                }

+                status = zOss_PutSemaphore(pNodeCopy->threadSem);

+                if(status == ZOSS_ERROR)

+                {

+                    zOss_ASSERT(status);

+                    return status;

+                }

+                continue;

+            }

+            else

+            {

+                /* ¹ÒÆðÏ߳̽áµã´ÓÁ´±íÖÐÒÆ³ý */

+                zOss_ListDelete(&pEvent->eventSuspendList, &pNodeCopy->eventNode);

+                pNode = (T_ZOssSuspendThreadsNode *)pNodeCopy->eventNode.previous;

+                

+                /* ÊÍ·ÅÐźÅÁ¿ */

+                if(pNodeCopy->threadSem == NULL)

+                {

+                    zOss_ASSERT(pNodeCopy->threadSem);

+                    return ZOSS_ERROR;

+                }

+                status = zOss_PutSemaphore(pNodeCopy->threadSem);

+                if(status == ZOSS_ERROR)

+                {

+                    zOss_ASSERT(status);

+                    return status;

+                }

+            }

+        }

+        pNode = (T_ZOssSuspendThreadsNode *)pNode->eventNode.next;

+    }

+    

+    zOss_PutMutex(pEvent->ListWriteMutex);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_DeleteEvent

+* ¹¦ÄÜÃèÊö: ɾ³ýʼþ×é

+* ²ÎÊý˵Ã÷: (IN)

+                event_id:ʼþ×éid

+* ·µ »Ø Öµ: ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_DeleteEvent(ZOSS_EVENT_ID eventId)

+{

+    T_ZOss_Event    *pEvent = NULL;

+    SINT32          i       = 0;

+    

+    zOss_AssertEx(eventId != NULL, ZOSS_ERROR);

+

+    pEvent = (T_ZOss_Event *)eventId;

+

+    /* ¹ÒÆðÏß³ÌÁ´±íΪ¿Õ£¬Ö±½Óɾ³ýʼþ¿ØÖÆ¿é */

+    if(pEvent->eventSuspendList.HEAD == NULL)

+    { 

+        zOss_DeleteMutex(pEvent->ListWriteMutex);  /* ɾ³ý»¥³âÐźÅÁ¿ */

+        zOss_Free(pEvent);

+        return ZOSS_SUCCESS;

+    }

+    else     /* ¹ÒÆðÏß³ÌÁ´±í²»Îª¿Õ */

+    {

+        SINT32 suspendCount = 0;

+        zOss_GetMutex(pEvent->ListWriteMutex, ZOSS_WAIT_FOREVER);

+        suspendCount = pEvent->eventSuspendList.count;

+        for(i = 0 ; i < suspendCount; i++)

+        {

+            T_ZOssSuspendThreadsNode *pNode = (T_ZOssSuspendThreadsNode *)pEvent->eventSuspendList.HEAD;

+            zOss_ListDelete(&pEvent->eventSuspendList, &pNode->eventNode);

+            /* »Ö¸´±»¹ÒÆðỊ̈߳¬±ê¼Ç»ñȡʧ°Ü¡£ */

+            if(pNode->threadSem == NULL)

+            {

+                zOss_ASSERT(pNode->threadSem);

+                return ZOSS_ERROR;

+            }

+            zOss_PutSemaphore(pNode->threadSem);

+        }

+        zOss_PutMutex(pEvent->ListWriteMutex); 

+    }

+    

+    if(pEvent->eventSuspendList.HEAD == NULL)

+    {

+        zOss_DeleteMutex(pEvent->ListWriteMutex);  /* ÊÍ·Å»¥³âÐźÅÁ¿ */

+        zOss_Free(pEvent);

+        return ZOSS_SUCCESS;

+    }

+    

+    return ZOSS_ERROR ;

+

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_QueryEvent

+* ¹¦ÄÜÃèÊö:²éѯʼþ×鵱ǰ±êÖ¾Öµ

+* ²ÎÊý˵Ã÷: (IN)	

+                event_id:ʼþ×éid

+* ·µ »Ø Öµ: ʼþ×鵱ǰ±êÖ¾Öµ

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+UINT32 zOss_QueryEvent(ZOSS_EVENT_ID eventId)

+{

+    zOss_AssertEx(eventId != NULL, ZOSS_ERROR);

+

+    return ((T_ZOss_Event *)eventId)->currentEvents;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_WaitingEvent

+* ¹¦ÄÜÃèÊö:²éѯÊÇ·ñÓÐÏ̵߳ȴýʼþ×é

+* ²ÎÊý˵Ã÷: (IN)	

+                event_id:ʼþ×éid

+* ·µ »Ø Öµ: ÓÐÏ̵߳ȴý:True ;ÎÞÏ̵߳ȴý:False

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+BOOL zOss_WaitingEvent(ZOSS_EVENT_ID eventId)

+{

+    zOss_AssertEx(eventId != NULL, FALSE);

+

+    return (((T_ZOss_Event *)eventId)->eventSuspendList.HEAD != NULL);

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_fs.c b/cp/ps/plat/src/oss/osa/com/oss_fs.c
new file mode 100644
index 0000000..8fab86c
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_fs.c
@@ -0,0 +1,2104 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : oss_fs.c

+* Ïà¹ØÎļþ : ose_file_api.c,tos_file_api.c

+* ʵÏÖ¹¦ÄÜ : ºÏ²¢oseºÍtos²Ù×÷ϵͳÏÂÏà¹ØÎļþ

+* ×÷    Õß : zhangxiaofei

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/10/19

+* ÆäËü˵Ã÷ :          

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef _OS_OSE

+#include "efs.h"

+#include "fss.h"

+#include "efs.sig"

+#include "fm.sig"

+#include "sys/stat.h"

+#elif defined _OS_TOS

+#include <cyg/io/file.h>

+#include <cyg/fileio/fileio.h>

+#endif

+

+#ifdef _OS_LINUX

+#include <linux/unistd.h>

+#include <linux/ctype.h>

+#include <linux/syscalls.h>

+#include <linux/statfs.h>

+#else

+#include <unistd.h>

+#include <string.h>

+#include <ctype.h>

+#include <dirent.h>

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+#ifdef USE_CPPS_KO

+#define CPPS_KO_FUNC(func) kernel_##func

+#else

+#define CPPS_KO_FUNC(func) func

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* #define DEBUG */

+#ifdef DEBUG

+# define DBG(fmt...)    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, fmt)

+#else

+# define DBG(fmt...)

+#endif

+

+#ifndef _OS_WIN

+#ifndef stricmp

+#define stricmp strcasecmp

+#endif

+#endif

+

+#define ZOSS_FS_WINPATH_LEN     3

+#define ZOSS_FS_LINUXPATH_LEN   19

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+#ifdef _OS_LINUX

+struct old_linux_dirent

+{

+    unsigned long   d_ino;

+    unsigned long   d_offset;

+    unsigned short  d_namlen;

+    char            d_name[1];

+};

+

+typedef struct

+{

+    int     fd;

+    long    offset;

+    long    total_len;

+    char    *buf;

+    long    size;

+} oss_dir_t;

+#endif

+

+typedef struct

+{

+    T_ZOss_Node node;

+    CHAR        winPath[ZOSS_FS_WINPATH_LEN+1];       /* windows·¾¶     */

+    CHAR        linuxPath[ZOSS_FS_LINUXPATH_LEN+1];   /* Ààlinux·¾¶     */

+}T_zOss_FsPathMapNode;

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static T_DISK_PARAM *gDiskParam                 = NULL;

+static T_ZOss_List   g_zFsPathDynamicMapList    = {0}; /* ´ÅÅÌ·¾¶¶¯Ì¬Ó³ÉäÁ´±í */

+static ZOSS_MUTEX_ID g_zFsPathMapMutex          = NULL;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºOsa_GetLinuxPathByWinPath

+* ¹¦ÄÜÃèÊö£º¸ù¾ÝwinPath»ñÈ¡LinuxPath

+* ²ÎÊý˵Ã÷£º(IN) 

+*               pWinPath:window·ç¸ñ·¾¶

+* ·µ »Ø Öµ£º³É¹¦:·µ»ØlinuxPath;ʧ°Ü:NULL.

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+static CHAR* Osa_GetLinuxPathByWinPath(const CHAR *pWinPath)

+{    

+    UINT32 i;

+    T_zOss_FsPathMapNode *pFsPathNode = NULL;

+

+    zOss_AssertEx(pWinPath, NULL);

+    DBG("Osa_GetLinuxPathByWinPath windows path: %s\n", pWinPath);

+

+    /*ËÑË÷¾²Ì¬Ó³Éä±í*/

+    for (i = 0; i < gDiskParam->diskNum; i++)

+    {

+        if (tolower(pWinPath[0]) == tolower(gDiskParam->diskMap[i].WinDisk[0]))

+            return gDiskParam->diskMap[i].LinuxPath;

+    }

+

+    /*ËÑË÷¶¯Ì¬Ó³Éä±í*/

+    zOss_GetMutex(g_zFsPathMapMutex, ZOSS_WAIT_FOREVER);

+    pFsPathNode = (T_zOss_FsPathMapNode *)zOss_ListFirst(&g_zFsPathDynamicMapList);

+    while( pFsPathNode != NULL)

+    {

+       if (tolower(pFsPathNode->winPath[0]) == tolower(pWinPath[0])) //±È½ÏÅÌ·û£»

+       {

+            zOss_PutMutex(g_zFsPathMapMutex);

+            return pFsPathNode->linuxPath;

+       }

+       pFsPathNode = (T_zOss_FsPathMapNode *)zOss_ListNext(&(pFsPathNode->node));

+    }

+    zOss_PutMutex(g_zFsPathMapMutex);

+

+    zOss_AssertEx(0, NULL);

+

+    return NULL;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºOsa_GetWinPathByLinuxPath

+* ¹¦ÄÜÃèÊö£º¸ù¾ÝLinuxPath»ñÈ¡winPath

+* ²ÎÊý˵Ã÷£º(IN) 

+*               pWinPath:   linux·ç¸ñ·¾¶

+*               pPath:      linux·ç¸ñÏà¶Ô·¾¶

+* ·µ »Ø Öµ£º³É¹¦:·µ»ØZOSS_SUCCESS;ʧ°Ü:NULL.

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+static CHAR* Osa_GetWinPathByLinuxPath(const CHAR *pLinuxPath, CHAR **pPath)

+{    

+    UINT32 i;

+    T_zOss_FsPathMapNode *pFsPathNode = NULL;

+

+    zOss_AssertEx(pLinuxPath && pPath, NULL);

+    DBG("Osa_GetWinPathByLinuxPath linux path: %s\n", pLinuxPath);

+

+    /*ËѾ²Ì¬Ó³Éä±í*/

+    for (i = 0; i < gDiskParam->diskNum; i++ )

+    {

+        if (0 == strncasecmp(pLinuxPath, (char *)gDiskParam->diskMap[i].LinuxPath, strlen(gDiskParam->diskMap[i].LinuxPath)))

+        {

+            *pPath = (CHAR *)(pLinuxPath + strlen(gDiskParam->diskMap[i].LinuxPath));

+            DBG("Osa_GetWinPathByLinuxPath windows path: %s\n", *pPath);

+            return gDiskParam->diskMap[i].WinDisk;

+        }

+    }

+

+    /*ËѶ¯Ì¬Ó³Éä±í*/

+    zOss_GetMutex(g_zFsPathMapMutex, ZOSS_WAIT_FOREVER);

+    pFsPathNode = (T_zOss_FsPathMapNode *)zOss_ListFirst(&g_zFsPathDynamicMapList);

+    while( pFsPathNode != NULL)

+    {

+       if (0 == strncasecmp(pLinuxPath, pFsPathNode->linuxPath, strlen(pFsPathNode->linuxPath)))

+       {

+            zOss_PutMutex(g_zFsPathMapMutex);

+            *pPath = (CHAR *)(pLinuxPath + strlen(gDiskParam->diskMap[i].LinuxPath));

+            DBG("Osa_GetWinPathByLinuxPath windows path: %s\n", *pPath);

+            return pFsPathNode->winPath;

+       }

+       pFsPathNode = (T_zOss_FsPathMapNode *)zOss_ListNext(&(pFsPathNode->node));

+    }

+    zOss_PutMutex(g_zFsPathMapMutex);

+

+    zOss_AssertEx(0, NULL);

+

+    return NULL;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºOsa_WinToLinuxPathMap

+* ¹¦ÄÜÃèÊö£º½«windows·ç¸ñ·¾¶Ó³Éä³ÉÀàlinux·ç¸ñ·¾¶

+* ²ÎÊý˵Ã÷£º(IN) 

+*               pWinPath:window·ç¸ñ·¾¶

+*               pLinuxPath:Ààlinux·ç¸ñ·¾¶

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR.

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+static UINT32 Osa_WinToLinuxPathMap(const CHAR *pWinPath, CHAR *pLinuxPath)

+{

+    CHAR    *pSrcPos        = NULL;

+    CHAR    *pDestPos       = NULL;

+#ifdef DEBUG

+    CHAR    *str            = pLinuxPath;

+#endif

+

+    zOss_AssertEx(pWinPath && *pWinPath && pLinuxPath, ZOSS_ERROR);

+    DBG("Osa_WinToLinuxPathMap windows path: %s\n", pWinPath);

+

+    if (pWinPath[1] == ':') //¾ø¶Ô·¾¶

+    {

+        pDestPos = Osa_GetLinuxPathByWinPath(pWinPath);

+        if (pDestPos == NULL)

+        {

+            zOss_AssertEx(0, ZOSS_ERROR);

+            return ZOSS_ERROR;

+        }

+        strcpy((char *)pLinuxPath, (char *)pDestPos);

+        pLinuxPath += strlen((char *)pDestPos);

+        pSrcPos    =  (CHAR *)&pWinPath[2];

+    }

+    else //Ïà¶Ô·¾¶ºÍÅÌ·û¶àÓàÒ»¸ö×ÖĸµÄÇé¿ö

+    {

+        pSrcPos = (CHAR *)strchr((char *)pWinPath, ':');

+        if (pSrcPos != NULL)

+        {

+            zOss_AssertEx(0, ZOSS_ERROR);

+            return ZOSS_ERROR;

+        }

+        pSrcPos = (CHAR *)pWinPath;

+    }

+    

+    while (*pSrcPos != '\0')

+    {

+        *pLinuxPath = '\\' != *pSrcPos ? *pSrcPos : '/';

+        pLinuxPath++;

+        pSrcPos++;

+    }

+    *pLinuxPath = '\0';

+

+    DBG("Osa_WinToLinuxPathMap linux path: %s\n", str);

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºOsa_LinuxToWinPathMap

+* ¹¦ÄÜÃèÊö£º½«Ààlinux·ç¸ñ·¾¶Ó³Éä³Éwindows·ç¸ñ·¾¶

+* ²ÎÊý˵Ã÷£º(IN) 

+*               pLinuxPath : Ààlinux·ç¸ñ·¾¶

+*               pWinPath   : window·ç¸ñ·¾¶

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR.

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+static UINT32 Osa_LinuxToWinPathMap(const CHAR *pLinuxPath, CHAR * pWinPath)

+{

+    CHAR   *pSrcPos     = NULL;

+    CHAR   *pDestPos    = NULL;

+#ifdef DEBUG

+    CHAR    *str        = pWinPath;

+#endif

+

+    zOss_AssertEx(pLinuxPath && pWinPath, ZOSS_ERROR);

+    DBG("Osa_LinuxToWinPathMap linux path: %s\n", pLinuxPath);

+

+    if ('/' != *pLinuxPath)

+    {

+        zOss_AssertEx(0, ZOSS_ERROR);

+        return ZOSS_ERROR;

+    }

+

+    pDestPos = Osa_GetWinPathByLinuxPath(pLinuxPath, &pSrcPos);

+    if (pDestPos == NULL || pSrcPos == NULL)

+    {

+        zOss_AssertEx(0, ZOSS_ERROR);

+        return ZOSS_ERROR;

+    }

+    strcpy(pWinPath, (char *)pDestPos);

+    pWinPath += strlen((char *)pDestPos);

+

+    while(*pSrcPos != '\0')

+    {

+        *pWinPath = ((*pSrcPos == '/') ? '\\' : *pSrcPos);

+        pWinPath++;

+        pSrcPos++;

+    }

+    *pWinPath = '\0';

+

+    DBG("Osa_LinuxToWinPathMap windows path: %s\n", str);

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºVerifyDisk

+* ¹¦ÄÜÃèÊö£ºÈ·ÈÏÅÌ·û±àºÅ

+* ²ÎÊý˵Ã÷£º(IN)   src_win:ÅÌ·ûÃû

+* ·µ »Ø Öµ£º³É¹¦:ÅÌ·û±àºÅ;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+static UINT32 VerifyDisk(const CHAR *src_win)

+{

+    UINT32 i = 0;

+

+    for (; i < gDiskParam->diskNum; i++)

+    {

+        if (!strncasecmp((const char *)src_win, (const char *)gDiskParam->diskMap[i].WinDisk, 1))

+        {

+            return i;

+        }

+    }

+

+    return ZOSS_ERROR;

+}

+

+#ifdef _OS_OSE

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºOsa_GetFsVolume

+* ¹¦ÄÜÃèÊö£º»ñÈ¡ÎļþϵͳÐÅÏ¢

+* ²ÎÊý˵Ã÷£ºvmPid:      Îļþϵͳ¹ÜÀíÏß³Ìid

+            total_size: Îļþϵͳ×Ü´óС´æ·ÅµØÖ·

+            free_size:  Îļþϵͳ¿ÕÏдóС´æ·ÅµØÖ·

+            used_size:  ÎļþϵͳÒÑʹÓôóС´æ·ÅµØÖ·

+* ·µ »Ø Öµ£º»ñÈ¡ÎļþϵͳÐÅÏ¢ÊÇ·ñ³É¹¦

+* ÆäËü˵Ã÷£ºvoid

+**************************************************************************/ 

+static EfsStatus Fs_GetVolumeInfo(PROCESS vmPid,UINT64 *total_size,UINT64 *free_size,UINT64 *used_size)

+{   

+    EfsStatus              status   = 0;

+    static const SIGSELECT sigsel[] = {2, OS_ATTACH_SIG, FM_EXAMINE_VOL_REPLY};

+    struct FmExamineVolReply *reply = NULL;

+    OSATTREF                 ar     = attach(NULL, vmPid);

+

+    sendFmExamineVolRequest(vmPid);    

+    reply = (struct FmExamineVolReply *)receive((SIGSELECT *)sigsel);    

+    if (reply->sigNo == FM_EXAMINE_VOL_REPLY)

+    {

+        detach(&ar);

+        if (reply->status == EFS_SUCCESS)

+        {

+            struct FmVolumeInfo *vi = &reply->info;

+         

+            *total_size = vi->blockSize * ((vi->hiBlock - vi->loBlock) + 1);

+            *free_size  = vi->blockSize * (vi->freeBlocks);

+            *used_size  = *total_size - *free_size;

+        }

+        status = reply->status;

+    }

+    else /* Received attach signal, VM terminated before sending reply. */

+    {

+        status = EFS_SUCCESS; /* Silent ignore. */

+    }

+ 

+    free_buf((union SIGNAL **)&reply);

+

+    return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºFS_Get_VmPid

+* ¹¦ÄÜÃèÊö£º»ñÈ¡Îļþϵͳ¹ÜÀíÏß³ÌID

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                disk: ÅÌ·û

+* ·µ »Ø Öµ£º·µ»ØvmPid

+* ÆäËü˵Ã÷£ºvoid

+**************************************************************************/ 

+static PROCESS Fs_Get_VmPid(const CHAR *disk)

+{

+    PROCESS vmPid                   = 0;

+    static const SIGSELECT sigsel[] = {1, HUNT_FSS};

+    static const SIGSELECT fssSig[] = {1, FSS_RESOLVE_REPLY};

+    union SIGNAL *sig   = alloc(sizeof(SIGSELECT), HUNT_FSS);

+    union SIGNAL *sig_p = NULL;

+    

+    hunt( "ose_fss", 0, NULL, &sig);

+    sig = receive(sigsel);

+    sendFssResolveRequest((const char *)disk, FSS_TYPE_VOLUME, FSS_TMO_NONE, sender(&sig)); 

+    free_buf(&sig);

+    sig_p = receive(fssSig);

+    vmPid = sender(&sig_p);

+    free_buf(&sig_p);

+    return vmPid;

+}

+#endif

+

+#ifdef _OS_LINUX

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ±ê×¼¿âtypeת»»³ÉPOSIX¿âflags

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static int libc_type_to_posix_flags(const char *file_name, const char *type)

+{

+    int fd;

+    int flags = O_RDONLY;

+

+    zOss_ASSERT(type != NULL);

+

+    if (strcmp(type, "r") == 0 || strcmp(type, "rb") == 0) {

+        flags = O_RDONLY;

+    } else if (strcmp(type, "w") == 0 || strcmp(type, "wb") == 0) {

+        flags = O_WRONLY;

+        fd = CPPS_KO_FUNC(sys_open)(file_name, O_RDONLY, 0);

+        if (fd == -ENOENT)

+            flags |= O_CREAT;

+        else

+            sys_close(fd);

+    } else if (strcmp(type, "a") == 0 || strcmp(type, "ab") == 0) {

+        flags = O_APPEND;

+    } else if (strcmp(type, "r+") == 0 || strcmp(type, "r+b") == 0 || strcmp(type, "rb+") == 0) {

+        flags = O_RDWR;

+    } else if (strcmp(type, "w+") == 0 || strcmp(type, "w+b") == 0 || strcmp(type, "wb+") == 0) {

+        flags = O_RDWR;

+        fd = CPPS_KO_FUNC(sys_open)(file_name, O_RDONLY, 0);

+        if (fd == -ENOENT)

+            flags |= O_CREAT;

+        else {

+            flags |= O_TRUNC;

+            sys_close(fd);

+        }

+    } else if (strcmp(type, "a+") == 0 || strcmp(type, "a+b") == 0 || strcmp(type, "ab+") == 0) {

+        flags = O_RDWR | O_APPEND;

+        fd = CPPS_KO_FUNC(sys_open)(file_name, O_RDONLY, 0);

+        if (fd == -ENOENT)

+            flags |= O_CREAT;

+        else

+            sys_close(fd);

+    }

+

+    return flags;

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºFs_GetDiskSpace

+* ¹¦ÄÜÃèÊö£º»ñÈ¡´ÅÅÌÈÝÁ¿»òÊ£Óà¿Õ¼ä£»

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                diskname: ÅÌ·û

+                isTotal:  TRUE:´ÅÅÌÈÝÁ¿£»FALSE:´ÅÅÌÊ£Óà¿Õ¼ä¡£

+            (OUT)

+                space:    ´ÅÅÌ¿Õ¼ä    

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR¡£

+* ÆäËü˵Ã÷£ºvoid

+**************************************************************************/ 

+UINT32 Fs_GetDiskSpace(CHAR diskname, UINT64 *space, BOOL isTotal)

+{

+    UINT32  uiRet;

+    

+    zOss_AssertEx(space != NULL, ZOSS_ERROR);

+

+#ifndef _OS_TOS

+    uiRet = VerifyDisk(&diskname);

+    if (uiRet == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+

+#ifdef _OS_OSE

+    EfsStatus status    = 0;

+    PROCESS vmPid       = 0;

+    UINT64  total_space = 0;

+    UINT64  free_space  = 0;

+    UINT64  used_space  = 0;

+

+    vmPid  = Fs_Get_VmPid(gDiskParam->diskMap[uiRet].LinuxPath);

+    status = Fs_GetVolumeInfo(vmPid, &total_space, &free_space, &used_space);

+    if (status == EFS_SUCCESS)

+    {

+        if(isTotal)

+        {

+            *space = total_space;

+        }

+        else

+        {

+            *space = free_space;

+        }

+

+        return ZOSS_SUCCESS;

+    }

+    

+    return ZOSS_ERROR;

+#elif defined (_OS_TOS)

+    struct cyg_fs_disk_usage info;

+

+    if (isTotal)

+    {

+        uiRet = cyg_fs_getinfo(Osa_GetLinuxPathByWinPath(&diskname), FS_INNO_DISK_CAPACITY, 

+                               &info, sizeof(struct cyg_fs_disk_usage));

+        zOss_AssertEx((uiRet == ENOERR), ZOSS_ERROR);

+        *space = (UINT64)info.block_size * info.total_blocks; 

+    }

+    else

+    {

+        uiRet = cyg_fs_getinfo(Osa_GetLinuxPathByWinPath(&diskname), FS_INFO_DISK_USAGE, 

+                               &info, sizeof(struct cyg_fs_disk_usage));

+        zOss_AssertEx((uiRet == ENOERR), ZOSS_ERROR);

+        *space = (UINT64)info.block_size * info.free_blocks;

+    }

+    

+    return ZOSS_SUCCESS;

+#elif defined (_OS_LINUX)

+    struct statfs statfs;

+

+    uiRet = CPPS_KO_FUNC(sys_statfs)((const char *)&gDiskParam->diskMap[uiRet].LinuxPath, &statfs);

+    if (uiRet != 0x00)

+        return ZOSS_ERROR;

+

+    if (isTotal)

+        *space = statfs.f_blocks * statfs.f_bsize;

+    else

+        *space = statfs.f_bfree * statfs.f_bsize;

+

+    return ZOSS_SUCCESS;

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖÇø

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_FCreate

+* ¹¦ÄÜÃèÊö£º´´½¨Îļþ

+* ²ÎÊý˵Ã÷£º(IN)  filename:ÎļþÃû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR.

+* ÆäËü˵Ã÷£ºOSE´´½¨ÎļþÓÐÁ½¸ö²ÎÊý£¬µÚ¶þ¸öΪÎļþÊôÐÔ£¬ÕâÀïÉèÖÃΪ¿É¶Áд

+**************************************************************************/ 

+UINT32 zOss_FCreate(const CHAR *filename)

+{

+#ifdef _OS_TOS

+    UINT32  status                                  = 0;

+    CHAR    dest_linux[ZOSS_MAX_FILENAME_LEN + 1]   = {0};

+

+    zOss_AssertEx(filename != NULL, ZOSS_ERROR);

+

+    status = Osa_WinToLinuxPathMap(filename, dest_linux);

+

+    if (ZOSS_SUCCESS == status)

+    {

+        SINT32 result = creat((char *)dest_linux, S_IRUSR | S_IWUSR);/* ³É¹¦£¬·µ»Øfd£¬·ñÔò-1 */

+

+        if (result == -1)

+        {

+            status = ZOSS_ERROR;

+        }

+        else

+        {

+            close(result);/* ¹Ø±ÕÎļþÃèÊö·û */

+            status = ZOSS_SUCCESS;

+        }

+    }

+

+    return status;

+#elif defined (_OS_LINUX)

+    long    fd;

+    UINT32  ret;

+    CHAR    path_name[ZOSS_MAX_FILENAME_LEN + 1] = {0};

+

+    zOss_AssertEx(filename != NULL, ZOSS_ERROR);

+    DBG("zOss_FCreate filename: %s\n", filename);

+

+    ret = Osa_WinToLinuxPathMap(filename, path_name);

+    if (ret != ZOSS_SUCCESS)

+        return ret;

+

+    fd = CPPS_KO_FUNC(sys_creat)((const char *)path_name, S_IRUSR | S_IWUSR);

+    if (fd < 0)

+        return ZOSS_ERROR;

+

+    sys_close(ret);

+

+    return ZOSS_SUCCESS;

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FOpen

+* ¹¦ÄÜÃèÊö£º´ò¿ªÒ»¸öÎļþ

+* ²ÎÊý˵Ã÷£º(IN)  filename:ÎļþÃû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+                  mode:´ò¿ª·½Ê½.

+                      "r": Open text file for reading. 

+                      "w": Truncate to zero length or create text file for writing. 

+                      "a": Append; open or create text file for writing at end of file. 

+                      "rb": Open binary file for reading. 

+                      "wb": Truncate to zero length or create binary file for writing. 

+                      "ab": Append; open or create binary file for writing at end of file 

+                      "r+": Open text file for update (reading and writing). 

+                      "w+": Truncate to zero length or create text file for update. 

+                      "a+": Append open or create text file for update, writing at end of file. 

+                      "r+b" or "rb+": Open binary file for update (reading and writing). 

+                      "w+b" or "wb+": Truncate to zero length or create binary file for update. 

+                      "a+b" or "ab+": Append; open or create binary file for update, writing at end of file. 

+* ·µ »Ø Öµ£º ³É¹¦:ÎļþÖ¸Õë;ʧ°Ü:ZOSS_NULL.

+* ÆäËü˵Ã÷£º ÔÚOSE²Ù×÷ϵͳÖУ¬·µ»ØµÄÎļþÖ¸ÕëÖ»ÄÜÓɵ÷ÓõÄÏß³ÌʹÓã¬ÆäËüÏß³ÌʹÓûáÔì³ÉÎļþ¶Áд²»³É¹¦¡£

+**************************************************************************/ 

+FILE *zOss_FOpen(const CHAR * filename, const CHAR * mode)

+{

+#ifdef _OS_TOS

+    UINT32  status                                  = 0;

+    CHAR    dest_linux[ZOSS_MAX_FILENAME_LEN + 1]   = {0};

+    FILE    *pfile                                  = NULL;

+

+    zOss_AssertEx(filename != NULL && mode != NULL, ZOSS_NULL);

+

+    status = Osa_WinToLinuxPathMap(filename, dest_linux);

+

+    if (ZOSS_SUCCESS == status)

+    {

+        pfile = fopen((char *)dest_linux, (char *)mode);

+    }

+    else

+    {

+        pfile = ZOSS_NULL;

+    }

+

+    return pfile;

+#elif defined (_OS_LINUX)

+    UINT32  ret;

+    int     fd, flags;

+    CHAR    file_name[ZOSS_MAX_FILENAME_LEN + 1] = {0};

+

+    zOss_AssertEx(filename != NULL, NULL);

+    DBG("zOss_FOpen filename: %s\n", filename);

+

+    ret = Osa_WinToLinuxPathMap(filename, file_name);

+    if (ret != ZOSS_SUCCESS)

+        return NULL;

+

+    flags = libc_type_to_posix_flags((const char *)file_name, mode);

+    fd = CPPS_KO_FUNC(sys_open)((const char *)file_name, flags, 0);

+    if (fd < 0)

+    	return NULL;

+	

+    return (FILE *)fd;

+#else

+    return NULL;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_FSeek

+* ¹¦ÄÜÃèÊö£º¶¨Î»ÔÚÎļþÖеĶÁдλÖÃ

+* ²ÎÊý˵Ã÷£º(IN)   fd: ÎļþÃèÊö·û,zOss_Open()µÄ·µ»ØÖµ

+                   offset:´ÓԭʼλÖÿªÊ¼ÒªÒƶ¯µÄÆ«ÒÆÁ¿

+                   whence:

+                        ZOSS_SEEK_SET :´ÓÎļþ¿ªÊ¼

+                        ZOSS_SEEK_CUR :µ±Ç°Î»ÖÃ

+                        ZOSS_SEEK_END :´ÓÎļþ½áβ

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:´íÎó´úÂë.

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_FSeek(FILE *stream, SINT32 offset, SINT32 whence)

+{ 

+    switch (whence)

+    {

+    case ZOSS_SEEK_CUR:

+        {

+            whence = SEEK_CUR;

+            break;

+        }        

+    case ZOSS_SEEK_SET:

+        {

+            whence = SEEK_SET;

+            break;

+        }        

+    case ZOSS_SEEK_END:

+        {

+            whence = SEEK_END;

+            break;

+        }        

+    default:

+        {

+            return ZOSS_ERROR;

+        }

+    }   

+

+#ifdef _OS_TOS

+    zOss_AssertEx(stream != NULL, ZOSS_ERROR);

+    if (fseek(stream, (long)offset, whence) == 0)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#elif defined (_OS_LINUX)

+    if (CPPS_KO_FUNC(sys_lseek)((unsigned int)stream, (off_t)offset, (unsigned int)whence) >= 0)

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_FRead

+* ¹¦ÄÜÃèÊö£º¶ÁÎļþ

+* ²ÎÊý˵Ã÷£º(IN)    data:´æ·Å¶ÁÈ¡Êý¾ÝµÄÄÚ´æÖ¸Õë

+                    size:Êý¾Ýµ¥ÔªµÄ´óС

+                    count:¶ÁÈ¡µÄ¸öÊý

+                    stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£ºÊµ¼Ê¶ÁÈ¡µÄÊý¾Ýµ¥Ôª¸öÊý

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+SSIZE_T zOss_FRead(VOID *data, SSIZE_T size, SSIZE_T count, FILE *stream)

+{

+    zOss_AssertEx(data != NULL && count > 0 && size != 0, 0);

+

+#ifdef _OS_TOS

+    zOss_AssertEx(stream != NULL, 0);

+    return (SSIZE_T)fread(data, (size_t)size, (size_t)count, stream);

+#elif defined (_OS_LINUX)

+    return (SSIZE_T)CPPS_KO_FUNC(sys_read)((unsigned int)stream, (char *)data, (size_t)size*count);

+#else

+    return 0x00;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_FWrite

+* ¹¦ÄÜÃèÊö£ºÐ´Îļþ

+* ²ÎÊý˵Ã÷£º(IN)    data:´æ·ÅдÈëÊý¾ÝµÄÄÚ´æÖ¸Õë

+                    size:Êý¾Ýµ¥ÔªµÄ´óС

+                    count:дÈëµÄ¸öÊý

+                    stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£ºÊµ¼ÊдÈëµÄÊý¾Ýµ¥Ôª¸öÊý

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+SSIZE_T zOss_FWrite(const VOID *data, SSIZE_T size, SSIZE_T count, FILE *stream)

+{

+    zOss_AssertEx(data != NULL && count > 0 && size != 0, 0);    

+

+#ifdef _OS_TOS

+    zOss_AssertEx(stream != NULL, 0);

+    return (SSIZE_T)fwrite(data, (size_t)size, (size_t)count, stream);

+#elif defined (_OS_LINUX)

+    return (SSIZE_T)CPPS_KO_FUNC(sys_write)((unsigned int)stream, (const char *)data, (size_t)size*count);

+#else

+    return 0x00;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_FEof

+* ¹¦ÄÜÃèÊö£º¼ì²éÊÇ·ñµ½Îļþ½áβ

+* ²ÎÊý˵Ã÷£º(IN)    stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º·ÇÁã±íʾµ±Ç°ÎļþÖ¸ÕëÒѵ½Îļþ½áβ,Áã±íʾûÓÐ

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_FEof(FILE *stream)

+{

+#ifdef _OS_TOS

+    zOss_AssertEx(stream != NULL, 0);

+    return (UINT32)feof(stream);

+#elif defined (_OS_LINUX)

+    char c;

+    int ret;

+

+    ret = CPPS_KO_FUNC(sys_read)((unsigned int)stream, &c, sizeof(c));

+    if (ret == 0)

+        return true;

+    else

+        return false;

+#else

+    return 0x00;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_FError

+* ¹¦ÄÜÃèÊö£º»ñÈ¡Îļþ²Ù×÷´íÎóÂë

+* ²ÎÊý˵Ã÷£º(IN)    stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£ºÈô¼ì²âµ½´íÎ󷵻طÇ0 Öµ£»·ñÔò£¬·µ»Ø0¡£

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_FError(FILE *stream)

+{

+#ifdef _OS_TOS

+    zOss_AssertEx(stream != NULL, ZOSS_ERROR);

+    return (UINT32)ferror(stream);

+#elif defined (_OS_LINUX)

+    return 0x00;

+#else

+    return 0x00;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_FTruncate

+* ¹¦ÄÜÃèÊö£º²Ã¼õÎļþ´óС

+* ²ÎÊý˵Ã÷£º(IN)    stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£ºÊäÈë²ÎÊýÎļþÁ÷stream±ØÐëÒÔ¸ÄдµÄ·½Ê½´ò¿ª.

+**************************************************************************/ 

+UINT32 zOss_FTruncate(FILE *stream, UINT32 size)

+{

+    int     result  = 0;

+    int     fd      = 0;

+

+#ifdef _OS_TOS    

+    zOss_AssertEx(stream != NULL, ZOSS_ERROR);

+    result  = fflush(stream);

+    fd      = fileno(stream);

+    result  =  ftruncate(fd, (off_t)size);

+    if (result == 0)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#elif defined (_OS_LINUX)

+    int ret;

+

+    ret = CPPS_KO_FUNC(sys_ftruncate)((unsigned int)stream, (unsigned long)size);

+    if (ret == 0)

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FFlush

+* ¹¦ÄÜÃèÊö£º ͬ²½Îļþ£¬½«Îļþ»º³åÇøÄÚµÄÊý¾ÝдÈëÎļþ

+* ²ÎÊý˵Ã÷£º (IN)    stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_FFlush(FILE *stream)

+{  

+#ifdef _OS_TOS

+	zOss_AssertEx(stream != NULL, ZOSS_ERROR);

+    if (fflush(stream) == -1)

+    {

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        return ZOSS_SUCCESS;

+    }

+#elif defined (_OS_LINUX)

+    int ret;

+

+    ret = CPPS_KO_FUNC(sys_fsync)((unsigned int)stream);

+    if (ret == 0)

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FTell

+* ¹¦ÄÜÃèÊö£º ·µ»Ø´ÓÎļþ¿ªÊ¼´¦µÄµ±Ç°ÎļþÖ¸ÕëλÖÃ

+* ²ÎÊý˵Ã÷£º (IN)    stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º³É¹¦:´ÓÎļþ¿ªÊ¼´¦µÄµ±Ç°ÎļþÖ¸ÕëλÖÃ;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_FTell(FILE *stream)

+{

+    long result = 0;

+

+#ifdef _OS_TOS

+    zOss_AssertEx(stream != NULL, ZOSS_ERROR);

+    result = ftell(stream);

+

+    if (result == EOF)

+    {

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        return(UINT32)result;

+    }

+#elif defined (_OS_LINUX)

+    result = CPPS_KO_FUNC(sys_lseek)((unsigned int)stream, 0x00, SEEK_CUR);

+#endif

+

+    return result;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_FClose

+* ¹¦ÄÜÃèÊö£º¹Ø±ÕÎļþ

+* ²ÎÊý˵Ã÷£º(IN)   stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_FClose(FILE *stream)

+{

+#ifdef _OS_TOS

+	zOss_AssertEx(stream != NULL, ZOSS_ERROR);

+    if (fclose(stream) == 0)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#elif defined (_OS_LINUX)

+    int ret;

+

+    ret = sys_close((unsigned int)stream);

+    if (ret == 0)

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_FRename

+* ¹¦ÄÜÃèÊö£ºÎļþÖØÃüÃû

+* ²ÎÊý˵Ã÷£º(IN)   old_filename:Ô­ÎļþÃû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+                   new_filename:ÐÂÎļþÃû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_FRename(const CHAR *old_filename, const CHAR *new_filename)

+{

+    CHAR old_dest_linux[ZOSS_MAX_FILENAME_LEN + 1] = {0};

+    CHAR new_dest_linux[ZOSS_MAX_FILENAME_LEN + 1] = {0};

+

+    zOss_AssertEx(old_filename != NULL && new_filename != NULL, ZOSS_ERROR);

+

+    if (Osa_WinToLinuxPathMap(old_filename, old_dest_linux) == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+    if (Osa_WinToLinuxPathMap(new_filename, new_dest_linux) == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+

+#ifdef _OS_TOS

+    /*The destination will be removed if it exists by calling rename()*/

+    if (access((char *)new_dest_linux, F_OK) == 0)

+    {

+        return ZOSS_ERROR;    

+    }

+

+    if (rename((char *)old_dest_linux, (char *)new_dest_linux) == 0)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#elif defined (_OS_LINUX)

+    int ret;

+

+    DBG("zOss_FRename old_filename: %s, new_filename: %s\n", old_filename, new_filename);

+

+    ret = CPPS_KO_FUNC(sys_rename)((const char *)old_dest_linux, (const char *)new_dest_linux);

+    if (ret == 0)

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_FDelete

+* ¹¦ÄÜÃèÊö£ºÉ¾³ýÎļþ

+* ²ÎÊý˵Ã÷£º(IN)   filename:ÎļþÃû

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32  zOss_FDelete(const CHAR * filename)

+{

+    CHAR dest_linux[ZOSS_MAX_FILENAME_LEN + 1] = {0};

+

+    zOss_AssertEx(filename != NULL, ZOSS_ERROR);

+

+    if (Osa_WinToLinuxPathMap(filename, dest_linux) != ZOSS_SUCCESS)

+        return ZOSS_ERROR;

+

+#ifdef _OS_TOS

+    if (remove((char *)dest_linux) == 0)

+        return ZOSS_SUCCESS;

+#elif defined (_OS_LINUX)

+    DBG("zOss_FDelete filename: %s\n", filename);

+    if (CPPS_KO_FUNC(sys_unlink)((char *)dest_linux) == 0)

+        return ZOSS_SUCCESS;

+#endif

+

+    return ZOSS_ERROR;   

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_FLength

+* ¹¦ÄÜÃèÊö£º»ñÈ¡Îļþ³¤¶È

+* ²ÎÊý˵Ã÷£º(IN)   stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º·µ»ØÎļþ³¤¶È

+* ÆäËü˵Ã÷£ºOSE²»Ö§³Ö

+**************************************************************************/ 

+UINT32 zOss_FLength(FILE *stream)

+{

+    int         fd  = 0;

+    struct stat buf = {0};

+

+#ifdef _OS_TOS

+	zOss_AssertEx(stream != NULL, 0);

+    fd = fileno( stream );

+    

+    if( -1 == fd || 0 != fstat(fd, &buf))

+    {

+        return 0;

+    }

+#elif defined (_OS_LINUX)

+    if(0 != CPPS_KO_FUNC(sys_newfstat)((unsigned int)stream, &buf))

+    {

+        return 0;

+    }

+#endif

+

+    return (UINT32)buf.st_size;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_FExist

+* ¹¦ÄÜÃèÊö£ºÅбðÎļþÊÇ·ñ´æÔÚ

+* ²ÎÊý˵Ã÷£º(IN)   filename:ÎļþÃû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+* ·µ »Ø Öµ£º´æÔÚ:TRUE;²»´æÔÚ:FALSE

+* ÆäËü˵Ã÷£º¿ÉÒÔÅбðÎļþºÍĿ¼ÊÇ·ñ´æÔÚ

+**************************************************************************/ 

+BOOL zOss_FExist(const CHAR *filename)

+{    

+    CHAR dest_linux[ZOSS_MAX_FILENAME_LEN + 1] = {0};

+

+    zOss_AssertEx(filename != NULL, FALSE);

+

+    if (Osa_WinToLinuxPathMap(filename, dest_linux) != ZOSS_SUCCESS)

+    {

+        return FALSE;

+    }

+

+#ifdef _OS_TOS

+    if (access((char *)dest_linux, F_OK) == 0)

+    {

+        return TRUE;

+    }

+    else

+    {

+        return FALSE;    

+    }

+#elif defined (_OS_LINUX)

+    int ret;

+

+    DBG("zOss_FExist filename: %s\n", filename);

+    ret = CPPS_KO_FUNC(sys_access)((const char *)dest_linux, S_IROTH);

+    if (ret == 0)

+        return true;

+    else

+        return false;

+#else

+    return FALSE;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_Mkdir

+* ¹¦ÄÜÃèÊö£º´´½¨Ä¿Â¼

+* ²ÎÊý˵Ã÷£º(IN)   dirname:Ŀ¼Ãû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR 

+* ÆäËü˵Ã÷£ºOSE´´½¨Ä¿Â¼ÓÐÁ½¸ö²ÎÊý£¬µÚ¶þ¸öΪĿ¼ÊôÐÔ£¬ÕâÀïÉèÖÃΪ¶ÔÓû§¿É¶Áд

+**************************************************************************/ 

+UINT32 zOss_Mkdir(const CHAR * dirname)

+{

+    CHAR dest_linux[ZOSS_MAX_FILENAME_LEN + 1] = {0};

+

+    zOss_AssertEx(dirname != NULL, ZOSS_ERROR);

+

+    if (Osa_WinToLinuxPathMap(dirname, dest_linux) != ZOSS_SUCCESS)

+    {

+        return ZOSS_ERROR;

+    }

+

+#ifdef _OS_TOS

+    if (mkdir((char *)dest_linux, S_IRWXU) == 0)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#elif defined (_OS_LINUX)

+    int ret;

+

+    DBG("zOss_Mkdir dirname: %s\n", dirname);

+    ret = CPPS_KO_FUNC(sys_mkdir)((const char *)dest_linux, S_IRWXU);

+    if (ret == 0)

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_Rmdir

+* ¹¦ÄÜÃèÊö£ºÉ¾³ýĿ¼

+* ²ÎÊý˵Ã÷£º(IN)   dirname:Ŀ¼Ãû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_Rmdir(const CHAR * dirname)

+{

+    CHAR dest_linux[ZOSS_MAX_FILENAME_LEN + 1] = {0};

+

+    zOss_AssertEx(dirname != NULL, ZOSS_ERROR);

+

+    if (Osa_WinToLinuxPathMap(dirname, dest_linux) != ZOSS_SUCCESS)

+    {

+        return ZOSS_ERROR;

+    }

+

+#ifdef _OS_TOS

+    if (rmdir((char *)dest_linux) == 0)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#elif defined (_OS_LINUX)

+    int ret;

+

+    DBG("zOss_Rmdir dirname: %s\n", dirname);

+    ret = CPPS_KO_FUNC(sys_rmdir)((const char *)dest_linux);

+    if (ret == 0)

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_Rndir

+* ¹¦ÄÜÃèÊö£º¸ü¸ÄĿ¼Ãû

+* ²ÎÊý˵Ã÷£º(IN)   old_dirname:ԭĿ¼Ãû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+                   new_dirname:ÐÂĿ¼Ãû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£ºÀàwindows¾ø¶Ô·¾¶·ç¸ñ

+**************************************************************************/ 

+UINT32 zOss_Rndir(const CHAR * old_dirname, const CHAR *new_dirname)

+{

+    CHAR old_dest_linux[ZOSS_MAX_FILENAME_LEN + 1] = {0};

+    CHAR new_dest_linux[ZOSS_MAX_FILENAME_LEN + 1] = {0};

+

+    zOss_AssertEx(old_dirname != NULL && new_dirname != NULL, ZOSS_ERROR);

+

+    if (Osa_WinToLinuxPathMap(old_dirname, old_dest_linux) != ZOSS_SUCCESS)

+    {

+        return ZOSS_ERROR;

+    }

+

+    if (Osa_WinToLinuxPathMap(new_dirname, new_dest_linux) != ZOSS_SUCCESS)

+    {

+        return ZOSS_ERROR;

+    }

+

+#ifdef _OS_TOS    

+    if (rename((char *)old_dest_linux, (char *)new_dest_linux) == 0)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#elif defined (_OS_LINUX)

+    int ret;

+

+    DBG("zOss_Rndir old_dirname: %s, new_dirname: %s\n", old_dirname, new_dirname);

+    ret = CPPS_KO_FUNC(sys_rename)((const char *)old_dest_linux, (const char *)new_dest_linux);

+    if (ret == 0)

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetPwd

+* ¹¦ÄÜÃèÊö£º»ñÈ¡µ±Ç°Ä¿Â¼Ãû

+* ²ÎÊý˵Ã÷£º(IN)   dirname:Ŀ¼Ãû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+                   dirnamelen:Ŀ¼Ãû³¤¶È

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£ºÈôµ±Ç°Â·¾¶Ãû´óÓÚdirnamelenÔò³ö´í·µ»Ø

+**************************************************************************/ 

+UINT32 zOss_GetPwd(CHAR *dirname, UINT32 dirnamelen)

+{

+    CHAR dest_linux[ZOSS_MAX_FILENAME_LEN + 1]  = {0};

+    UINT32  dirlen                              = 0;

+

+    zOss_AssertEx(dirname != NULL, ZOSS_ERROR);

+

+#ifdef _OS_TOS

+    if (NULL != getcwd((char *)dest_linux, dirnamelen))

+    {

+        if (0 == strcmp((char *)dest_linux, "/"))

+        {

+            chdir((char *)gDiskParam->diskMap[0].LinuxPath);

+            

+            if (NULL == getcwd((char *)dest_linux, dirnamelen))

+            {

+                return ZOSS_ERROR;

+            }

+        }

+

+        Osa_LinuxToWinPathMap(dest_linux, dirname);

+

+        dirlen = strlen((const char *)dirname);

+        

+        if (dirname[dirlen-1] == '\\' && dirlen != 3)

+        {

+            dirname[dirlen-1] = '\0';

+        }

+

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#elif defined (_OS_LINUX)

+    if (CPPS_KO_FUNC(sys_getcwd)((char *)dest_linux, dirnamelen) >= 0) {

+        if (strcmp((char *)dest_linux, "/") == 0) {

+            CPPS_KO_FUNC(sys_chdir)((char *)gDiskParam->diskMap[0].LinuxPath);

+            if (CPPS_KO_FUNC(sys_getcwd)((char *)dest_linux, dirnamelen) < 0)

+                return ZOSS_ERROR;

+        }

+

+        Osa_LinuxToWinPathMap(dest_linux, dirname);

+        dirlen = strlen((const char *)dirname);        

+        if (dirname[dirlen-1] == '\\' && dirlen != 3)

+            dirname[dirlen-1] = '\0';

+        DBG("zOss_GetPwd dirname: %s\n", dirname);

+

+        return ZOSS_SUCCESS;

+    } else

+        return ZOSS_ERROR;

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ChDir

+* ¹¦ÄÜÃèÊö£ºÉèÖõ±Ç°Â·¾¶

+* ²ÎÊý˵Ã÷£º(IN)   dirname:Ŀ¼Ãû

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_ChDir(CHAR * dirname)

+{

+    CHAR dest_linux[ZOSS_MAX_FILENAME_LEN + 1] = {0};

+

+    zOss_AssertEx(dirname != NULL, ZOSS_ERROR);

+

+    if (Osa_WinToLinuxPathMap(dirname, dest_linux) == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+

+#ifdef _OS_TOS

+    if (0 == chdir((char *)dest_linux))

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#elif defined (_OS_LINUX)

+    int ret;

+

+    DBG("zOss_ChDir dirname: %s\n", dirname);

+    ret = CPPS_KO_FUNC(sys_chdir)((const char *)dest_linux);

+    if (ret == 0)

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_IsDir

+* ¹¦ÄÜÃèÊö£ºÅбðÊÇ·ñΪĿ¼

+* ²ÎÊý˵Ã÷£º(IN)   dirname:Ŀ¼Ãû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+* ·µ »Ø Öµ£ºÄ¿Â¼:TRUE;Îļþ»òÆäËû:FALSE

+* ÆäËü˵Ã÷£ºµ÷ÓÃOSEºê½øÐÐÅбð

+**************************************************************************/ 

+BOOL zOss_IsDir(const CHAR *dirname)

+{

+    struct stat buf                                 = {0};

+    CHAR    dest_linux[ZOSS_MAX_FILENAME_LEN + 1]   = {0};

+

+    zOss_AssertEx(dirname != NULL, FALSE);

+

+    if (Osa_WinToLinuxPathMap(dirname, dest_linux) != ZOSS_SUCCESS)

+    {

+        return FALSE;

+    }

+

+#ifdef _OS_TOS

+    if (stat((char *)dest_linux, &buf) == 0 && S_ISDIR(buf.st_mode))

+    {

+        return TRUE;

+    }

+    else

+    {

+        return FALSE;

+    }

+#elif defined (_OS_LINUX)

+    int ret;

+

+    DBG("zOss_IsDir dirname: %s\n", dirname);

+    ret = CPPS_KO_FUNC(sys_newstat)((const char *)dest_linux, &buf);

+    if (ret == 0 && S_ISDIR(buf.st_mode))

+        return true;

+    else

+        return false;

+#endif

+    return FALSE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_OpenDir

+* ¹¦ÄÜÃèÊö£º¸ù¾ÝÖ¸¶¨Ä¿Â¼Ãû»ñȡĿ¼·ÃÎÊÈë¿Ú

+* ²ÎÊý˵Ã÷£º (IN)   dirname:Ŀ¼Ãû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+             (OUT)  dir_entry_ptr:Ŀ¼·ÃÎÊÈë¿Ú

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_OpenDir(const CHAR *dirname, VOID **dir_entry_ptr)

+{

+    CHAR dest_linux[ZOSS_MAX_FILENAME_LEN + 1]  = {0};

+

+    zOss_AssertEx(dirname != NULL, ZOSS_ERROR);

+    zOss_AssertEx(dir_entry_ptr != NULL, ZOSS_ERROR);

+

+    if (Osa_WinToLinuxPathMap(dirname, dest_linux) != ZOSS_SUCCESS)

+    {

+        return ZOSS_ERROR;

+    }

+

+#ifdef _OS_TOS

+    *dir_entry_ptr = opendir((char *)dest_linux);

+

+	if (NULL == *dir_entry_ptr)

+	{

+		return ZOSS_ERROR;	  

+	}

+	else

+	{

+		return ZOSS_SUCCESS;

+	} 

+

+#elif defined (_OS_LINUX)

+    int fd, ret;

+    oss_dir_t *dir;

+    struct stat stat_buf;

+

+    DBG("zOss_OpenDir dirname: %s\n", dirname);

+    fd = CPPS_KO_FUNC(sys_open)(dest_linux, O_RDONLY | O_DIRECTORY, 0);

+    if (fd < 0)

+        return ZOSS_ERROR;

+

+    ret = CPPS_KO_FUNC(sys_newfstat)(fd, &stat_buf);

+    if (ret < 0) {

+        sys_close(fd);

+        return ZOSS_ERROR;

+    }

+

+    dir = (oss_dir_t *)malloc(sizeof(oss_dir_t));

+    memset(dir, 0, sizeof(oss_dir_t));

+

+    dir->fd     = fd;

+    dir->offset = 0;

+    dir->size   = stat_buf.st_blksize;

+    dir->buf    = (char *)malloc(dir->size);

+    memset(dir->buf, 0, dir->size);

+

+    *dir_entry_ptr = dir;

+    

+    return ZOSS_SUCCESS; 

+#endif

+

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºOSS_CloseDir

+* ¹¦ÄÜÃèÊö£º¹Ø±ÕĿ¼·ÃÎÊÈë¿Ú

+* ²ÎÊý˵Ã÷£º(IN)   dir_entry_ptr:Ŀ¼·ÃÎÊÈë¿Ú;

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_CloseDir(VOID **dir_entry_ptr)

+{

+    zOss_AssertEx(dir_entry_ptr != NULL, ZOSS_ERROR);

+    

+#ifdef _OS_TOS

+    if (closedir((DIR *)*dir_entry_ptr) == 0)

+    {

+        return ZOSS_SUCCESS;    

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#elif defined (_OS_LINUX)

+    int ret;

+    oss_dir_t *oss_dir = (oss_dir_t *)*dir_entry_ptr;

+    int fd = oss_dir->fd;

+    

+    if (oss_dir->buf != NULL)

+        free(oss_dir->buf);

+    free(oss_dir);

+    

+    ret = sys_close(fd);

+    if (ret == 0)

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ReadDir

+* ¹¦ÄÜÃèÊö£º»ñȡָ¶¨Ä¿Â¼ÏµÄÎļþºÍĿ¼

+* ²ÎÊý˵Ã÷£º(IN)   dir_entry_ptr:Ŀ¼·ÃÎÊÈë¿Ú;

+                   dir_item_ptr:´æ·ÅĿ¼ÏîÐÅÏ¢µÄ½á¹¹Ö¸Õë,ÓÉÓû§·ÖÅä

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_ReadDir(VOID **dir_entry_ptr,ZOSS_S_DIRENT *dir_item_ptr)

+{

+    zOss_AssertEx(dir_entry_ptr != NULL && dir_item_ptr != NULL, ZOSS_ERROR);

+    

+#ifdef _OS_TOS

+    struct dirent *dir;

+

+    dir = readdir((DIR *)*dir_entry_ptr);

+    if (NULL == dir)

+    {

+        return ZOSS_ERROR;    

+    }

+    else

+    {

+        #ifdef CYGPKG_FILEIO_DIRENT_DTYPE

+        dir_item_ptr->d_type = dir->d_type;

+        #endif

+        strcpy((char *)dir_item_ptr->d_name, (const char *)dir->d_name);

+        return ZOSS_SUCCESS;

+    }

+#elif defined (_OS_LINUX)

+    int ret;

+    size_t cnt;

+    struct old_linux_dirent *dir;

+    oss_dir_t *oss_dir = (oss_dir_t *)*dir_entry_ptr;

+

+    if (oss_dir->offset == 0)

+    {

+        ret = CPPS_KO_FUNC(sys_getdents)(oss_dir->fd, (struct linux_dirent *)oss_dir->buf, oss_dir->size);

+        if (ret > 0)

+        {

+            dir = (struct old_linux_dirent *)oss_dir->buf;

+            cnt = oss_min(ZOSS_MAX_FILENAME_LEN, strlen((const char *)dir->d_name));

+            strncpy(dir_item_ptr->d_name, dir->d_name, cnt);

+            oss_dir->offset = dir->d_namlen;

+            oss_dir->total_len = ret;

+            return ZOSS_SUCCESS;

+        }

+        else

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    else if(oss_dir->offset < oss_dir->total_len)

+    {

+        dir = (struct old_linux_dirent *)(oss_dir->buf + oss_dir->offset);

+        cnt = oss_min(ZOSS_MAX_FILENAME_LEN, strlen((const char *)dir->d_name));

+        strncpy(dir_item_ptr->d_name, dir->d_name, cnt);

+        oss_dir->offset += dir->d_namlen;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+    

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_Rewinddir

+* ¹¦ÄÜÃèÊö: ¸´Î»Ä¿Â¼Á÷£¬´ÓÍ·¿ªÊ¼·ÃÎÊĿ¼¡£

+* ²ÎÊý˵Ã÷: 

+            (IN)  

+                dir_entry_ptr:Ŀ¼·ÃÎÊÈë¿Ú;

+           

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷:

+**************************************************************************/ 

+VOID zOss_Rewinddir(VOID *dir_entry_ptr)

+{

+#ifdef _OS_TOS

+    zOss_AssertExN(dir_entry_ptr != NULL);

+    rewinddir((DIR *)dir_entry_ptr);        

+#elif defined (_OS_LINUX)

+    CPPS_KO_FUNC(sys_lseek)((unsigned int)dir_entry_ptr, 0x00, SEEK_SET);

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_ChMod

+* ¹¦ÄÜÃèÊö£º¸ü¸ÄÎļþ»òĿ¼ÊôÐÔ

+* ²ÎÊý˵Ã÷£º (IN)   pathname:Îļþ»òĿ¼Ãû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+                    attrs:Îļþ»òĿ¼ÐµÄÊôÐÔ

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_ChMod(const CHAR *pathname,mode_t attrs)

+{

+    CHAR dest_linux[ZOSS_MAX_FILENAME_LEN + 1] = {0};

+

+    zOss_AssertEx(pathname != NULL, ZOSS_ERROR);

+

+    if (Osa_WinToLinuxPathMap(pathname, dest_linux) == ZOSS_SUCCESS)

+    {

+#ifdef _OS_TOS

+        if (chmod((char *)dest_linux,attrs) == 0)

+        {

+            return ZOSS_SUCCESS;

+        }

+#elif defined (_OS_LINUX)

+        int ret;

+

+        DBG("zOss_ChMod pathname: %s\n", pathname);

+        ret = CPPS_KO_FUNC(sys_chmod)((const char *)dest_linux, (umode_t)attrs);

+        if (ret == 0)

+            return ZOSS_SUCCESS;

+        else

+            return ZOSS_ERROR;

+#endif

+    }

+

+    return ZOSS_ERROR;     

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_Stat

+* ¹¦ÄÜÃèÊö£º»ñÈ¡Îļþ»òĿ¼µÄÏêϸÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)   

+                pathname:Îļþ»òĿ¼Ãû,Ààwindows¾ø¶Ô·¾¶·ç¸ñ

+            (OUT)

+                buf:ÓÃÓÚ´æ´¢ÐÅÏ¢µÄstat½á¹¹,Óû§·ÖÅä¿Õ¼ä            

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_Stat(const CHAR *pathname,ZOSS_S_STAT *buf)

+{

+    CHAR dest_linux[ZOSS_MAX_FILENAME_LEN + 1]  = {0};

+

+    zOss_AssertEx(pathname != NULL, ZOSS_ERROR);

+

+    if (Osa_WinToLinuxPathMap(pathname, dest_linux) == ZOSS_SUCCESS)

+    {

+        struct stat stat_info;

+#ifdef _OS_TOS

+        if (stat((char *)dest_linux, &stat_info) == 0)

+        {

+            buf->st_dev     = (UINT32)stat_info.st_dev;

+            buf->st_ino     = (UINT32)stat_info.st_ino;

+            buf ->st_mode   = stat_info.st_mode;

+            buf->st_nlink   = (UINT16)stat_info.st_nlink;

+            buf->st_uid     = (UINT32)stat_info.st_uid;

+            buf->st_gid     = (UINT32)stat_info.st_gid;

+            buf->st_rdev    = 0;

+            buf->st_size    = (UINT32)stat_info.st_size;

+            buf->st_atime   = stat_info.st_atime;

+            buf->st_mtime   = stat_info.st_mtime;

+            buf->st_ctime   = stat_info.st_ctime;

+            return ZOSS_SUCCESS;

+        }

+#elif defined (_OS_LINUX)

+        DBG("zOss_Stat pathname: %s\n", pathname);

+        if (CPPS_KO_FUNC(sys_newstat)((const char *)dest_linux,  &stat_info) == 0) {

+            buf->st_dev     = (UINT32)stat_info.st_dev;

+            buf->st_ino     = (UINT32)stat_info.st_ino;

+            buf->st_mode    = stat_info.st_mode;

+            buf->st_nlink   = (UINT16)stat_info.st_nlink;

+            buf->st_uid     = (UINT32)stat_info.st_uid;

+            buf->st_gid     = (UINT32)stat_info.st_gid;

+            buf->st_rdev    = 0;

+            buf->st_size    = stat_info.st_size;

+            buf->st_atime   = stat_info.st_atime;

+            buf->st_mtime   = stat_info.st_mtime;

+            buf->st_ctime   = stat_info.st_ctime;

+

+            return ZOSS_SUCCESS;

+        }

+#endif

+    }

+    

+    return ZOSS_ERROR;         

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_MountDisk

+* ¹¦ÄÜÃèÊö£º¼ÓÔØ´ÅÅÌ

+* ²ÎÊý˵Ã÷£º(IN)   diskname:ÅÌ·ûÃû

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_MountDisk(CHAR diskname)

+{

+    int     ret  = 0;

+    UINT32 uiRet = VerifyDisk(&diskname);    

+

+    if (ZOSS_ERROR == uiRet)

+    {

+        return ZOSS_ERROR;

+    }

+

+#ifdef _OS_OSE

+    if (0 == fss_resolve((const char *)gDiskParam->diskMap[uiRet].Device, FSS_TYPE_BLOCKDEV, 1000))

+    {

+        return ZOSS_ERROR;

+    }

+    

+    if (0 == fss_resolve((const char *)gDiskParam->diskMap[uiRet].Format, FSS_TYPE_FORMAT, 1000))

+    {

+        return ZOSS_ERROR;

+    }

+    

+    ret = efs_mount((const char *)gDiskParam->diskMap[uiRet].LinuxPath, 

+                    (const char *)gDiskParam->diskMap[uiRet].Format,

+                    (const char *)gDiskParam->diskMap[uiRet].Device,

+                    (const char *)gDiskParam->diskMap[uiRet].Params);

+

+#elif defined _OS_TOS

+    ret = mount(gDiskParam->diskMap[uiRet].Device,

+                gDiskParam->diskMap[uiRet].LinuxPath,

+                gDiskParam->diskMap[uiRet].Format);

+#elif defined _OS_LINUX

+    DBG("zOss_MountDisk Device: %s, LinuxPath: %s, Format: %s\n",

+        gDiskParam->diskMap[uiRet].Device,

+        gDiskParam->diskMap[uiRet].LinuxPath,

+        gDiskParam->diskMap[uiRet].Format);

+    ret = CPPS_KO_FUNC(sys_mount)(gDiskParam->diskMap[uiRet].Device,

+                    gDiskParam->diskMap[uiRet].LinuxPath,

+                    gDiskParam->diskMap[uiRet].Format,

+                    MS_SILENT,

+                    NULL);

+#endif

+    

+    if (ret)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_UnMountDisk

+* ¹¦ÄÜÃèÊö£ºÐ¶ÔØ´ÅÅÌ

+* ²ÎÊý˵Ã÷£º(IN)   diskname:ÅÌ·ûÃû

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_UnMountDisk(CHAR diskname)

+{

+    int     ret     = 0;

+    UINT32  uiRet   = VerifyDisk(&diskname);

+

+    if (ZOSS_ERROR == uiRet)

+    {

+        return ZOSS_ERROR;

+    }

+

+#ifdef _OS_OSE

+    ret = efs_unmount((const char *)gDiskParam->diskMap[uiRet].LinuxPath, FALSE);

+#elif defined _OS_TOS

+    ret = umount(gDiskParam->diskMap[uiRet].LinuxPath);

+#elif defined _OS_LINUX

+    DBG("zOss_UnMountDisk LinuxPath: %s\n", gDiskParam->diskMap[uiRet].LinuxPath);

+    ret = CPPS_KO_FUNC(sys_umount)(gDiskParam->diskMap[uiRet].LinuxPath, MNT_DETACH);

+#endif

+

+    if (ret)

+    {

+        return ZOSS_ERROR;

+    }

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_MountDynamicDisk

+* ¹¦ÄÜÃèÊö£º¶¯Ì¬Ìí¼ÓÔØ´ÅÅÌ

+* ²ÎÊý˵Ã÷£º(IN)   

+*               pWinDir  : windows·¾¶

+*               pLinuxDir: linux·¾¶

+*               pDevName : É豸Ãû

+*               pFsName  : ÎļþϵͳµÄÃû³Æ

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£ºÖ§³ÖTOS²Ù×÷ϵͳ£»

+**************************************************************************/ 

+UINT32 zOss_MountDynamicDisk(CHAR *pWinDir, CHAR *pLinuxDir, CHAR *pDevName, char *pFsName)

+{

+#ifdef _OS_LINUX

+    return ZOSS_SUCCESS;

+#else

+    T_zOss_FsPathMapNode *pBuff = NULL;

+    /*¼ÓÔØ´ÅÅÌ*/

+    zOss_AssertEx((pWinDir != NULL) && (pLinuxDir != NULL) && (pDevName != NULL) && (pFsName != NULL), ZOSS_ERROR);

+    

+    if (mount(pDevName, pLinuxDir, pFsName))

+        return ZOSS_ERROR;

+    

+    pBuff = (T_zOss_FsPathMapNode *)zOss_Malloc(sizeof(T_zOss_FsPathMapNode)); 

+    zOss_Memset(pBuff, 0, sizeof(T_zOss_FsPathMapNode));

+    strncpy(pBuff->winPath, pWinDir, ZOSS_FS_WINPATH_LEN);

+    strncpy(pBuff->linuxPath, pLinuxDir, ZOSS_FS_LINUXPATH_LEN);

+   

+    /*´ÅÅÌ·¾¶Ó³ÉäÌí¼Óµ½´ÅÅÌ·¾¶¶¯Ì¬Ó³Éä±íÖÐ*/

+    zOss_GetMutex(g_zFsPathMapMutex, ZOSS_WAIT_FOREVER);

+    zOss_ListAdd(&g_zFsPathDynamicMapList, &pBuff->node);

+    zOss_PutMutex(g_zFsPathMapMutex);

+    

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_UnMountDynamicDisk

+* ¹¦ÄÜÃèÊö£º¶¯Ì¬Ð¶ÔØÔØ´ÅÅÌ

+* ²ÎÊý˵Ã÷£º(IN)   

+*               pWinDir  : windows·¾¶

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£ºÖ§³ÖTOS²Ù×÷ϵͳ£»

+**************************************************************************/ 

+UINT32 zOss_UnMountDynamicDisk(CHAR *pWinDir)

+{

+#ifdef _OS_LINUX

+    return ZOSS_SUCCESS;

+#else

+    T_zOss_FsPathMapNode *pFsPathNode   = NULL;

+    CHAR                 *pLinuxPath    = NULL;

+    

+    /*²éÕÒÅÌ·ûÊÇ·ñÔÚ¶¯Ì¬Á´±íÖÐ*/

+    zOss_GetMutex(g_zFsPathMapMutex, ZOSS_WAIT_FOREVER);

+    pFsPathNode = (T_zOss_FsPathMapNode *)zOss_ListFirst(&g_zFsPathDynamicMapList);

+    while(pFsPathNode != NULL)

+    {

+        if(0 == strcmp(pWinDir, pFsPathNode->winPath))

+        {

+            pLinuxPath = pFsPathNode->linuxPath;

+            zOss_ListDelete(&g_zFsPathDynamicMapList, &(pFsPathNode->node));

+            zOss_Free(pFsPathNode);

+            break;

+        }

+        pFsPathNode = (T_zOss_FsPathMapNode *)zOss_ListNext(&(pFsPathNode->node));

+    }

+    zOss_PutMutex(g_zFsPathMapMutex);

+

+    if (pLinuxPath == NULL)

+        return ZOSS_ERROR;

+    

+    /*Ð¶ÔØ´ÅÅÌ*/

+    if (umount(pLinuxPath))

+    {

+        pFsPathNode = (T_zOss_FsPathMapNode *)zOss_Malloc(sizeof(T_zOss_FsPathMapNode)); 

+        zOss_Memset(pFsPathNode, 0, sizeof(T_zOss_FsPathMapNode));

+        strncpy(pFsPathNode->winPath, pWinDir, ZOSS_FS_WINPATH_LEN);

+        strncpy(pFsPathNode->linuxPath, pLinuxPath, ZOSS_FS_LINUXPATH_LEN);

+        

+        /*´ÅÅÌ·¾¶Ó³ÉäÌí¼Óµ½´ÅÅÌ·¾¶¶¯Ì¬Ó³Éä±íÖÐ*/

+        zOss_GetMutex(g_zFsPathMapMutex, ZOSS_WAIT_FOREVER);

+        zOss_ListAdd(&g_zFsPathDynamicMapList, &pFsPathNode->node);

+        zOss_PutMutex(g_zFsPathMapMutex);

+

+        return ZOSS_ERROR;

+    }

+    else

+        return ZOSS_SUCCESS;

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ð¶ÔØËùÓеݲװÅÌ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  VOID

+*   (´«³ö²ÎÊý)  

+* ·µ »Ø Öµ:     ³É¹¦: ZOSS_SUCCESS£»Ê§°Ü: ZOSS_ERROR

+* ÆäËü˵Ã÷:     ¸Ãº¯ÊýÓ¦¸ÃÔÚ¶ÏÑÔʧ°ÜµÄʱºò±»µ÷Óã¬ÓÃÀ´±£´æÎļþϵͳµÄramÊý¾Ýµ½nand

+                flashÖУ¬ÒÔ±ãÏ´οª»úµÄʱºò¿ìËÙ»Ö¸´Îļþϵͳ

+*******************************************************************************/

+UINT32 zOss_UnMountAllDisk(VOID)

+{

+    SINT32 ret     = 0;

+    UINT32 cnt     = 0;

+    SINT32 fail    = 0;

+    T_zOss_FsPathMapNode *pFsPathNode   = NULL;

+    

+    /*Ð¶ÔØ¾²Ì¬¹ÒÔØµÄÅÌ*/

+    for (cnt = 0; cnt < gDiskParam->diskNum; cnt++) 

+    {

+#ifdef _OS_OSE

+        ret = efs_unmount((const char *)gDiskParam->diskMap[cnt].LinuxPath, FALSE);

+#elif defined (_OS_TOS)

+        ret = umount(gDiskParam->diskMap[cnt].LinuxPath);

+#elif defined (_OS_LINUX)

+        ret = CPPS_KO_FUNC(sys_umount)(gDiskParam->diskMap[cnt].LinuxPath, MNT_DETACH);

+#endif

+        if(ret)

+            fail++;

+    }

+    

+    /*Ð¶ÔØ¶¯Ì¬¹ÒÔØµÄÅÌ*/

+    zOss_GetMutex(g_zFsPathMapMutex, ZOSS_WAIT_FOREVER);

+    pFsPathNode = (T_zOss_FsPathMapNode *)zOss_ListFirst(&g_zFsPathDynamicMapList);

+    while(pFsPathNode != NULL)

+    {

+#ifdef _OS_OSE 

+        if (efs_unmount((const char *)pFsPathNode->linuxPath), FALSE)

+#elif defined (_OS_TOS)

+        if (umount(pFsPathNode->linuxPath))

+#elif defined (_OS_LINUX)

+        if (CPPS_KO_FUNC(sys_umount)(pFsPathNode->linuxPath, MNT_DETACH))

+#endif

+            fail++;

+        zOss_ListDelete(&g_zFsPathDynamicMapList, &(pFsPathNode->node));

+        zOss_Free(pFsPathNode);

+        pFsPathNode = (T_zOss_FsPathMapNode *)zOss_ListFirst(&g_zFsPathDynamicMapList);

+    }    

+    zOss_PutMutex(g_zFsPathMapMutex);

+

+    return fail ? ZOSS_ERROR : ZOSS_SUCCESS; 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetDiskFreeSpace

+* ¹¦ÄÜÃèÊö£º»ñȡָ¶¨´ÅÅ̵ÄÊ£Óà¿Õ¼ä

+* ²ÎÊý˵Ã÷£º(IN)   diskname:ÅÌ·ûÃû,ÀýÈçC¡¢D.

+            (OUT)  space:Ê£Óà¿Õ¼äµÄ´óС,µ¥Î»ÊÇbyte.

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_GetDiskFreeSpace(CHAR diskname, UINT64 *space)

+{

+    return Fs_GetDiskSpace(diskname, space, FALSE);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetDiskCapacity

+* ¹¦ÄÜÃèÊö£º »ñÈ¡´ÅÅÌÈÝÁ¿

+* ²ÎÊý˵Ã÷£º (IN)   diskname:ÅÌ·ûÃû,ÀýÈçC¡¢D.

+             (OUT) space:Ê£Óà¿Õ¼äµÄ´óС,µ¥Î»ÊÇbyte.

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/ 

+UINT32 zOss_GetDiskCapacity(CHAR diskname, UINT64 *space)

+{

+    return Fs_GetDiskSpace(diskname, space, TRUE);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetAllDynamicDisk

+* ¹¦ÄÜÃèÊö£º »ñÈ¡ËùÓж¯Ì¬mountµÄÅÌ·û

+* ²ÎÊý˵Ã÷£º (IN)   disk: ÅÌ·ûÖ¸Õë

+			 (IN)	size: ´óС

+* ·µ »Ø Öµ£º ¶¯Ì¬mountµÄÅÌ·û¸öÊý

+* ÆäËü˵Ã÷£º disk´æ·ÅÅÌ·ûµÄСдÐÎʽ£¬Èçc¡¢d£¬ÅÌ·ûÖ»ÓÐÒ»¸ö×Öĸ

+**************************************************************************/ 

+UINT32 zOss_GetAllDynamicDisk(CHAR *disk, UINT32 size)

+{

+    UINT32 count = 0;

+    T_zOss_FsPathMapNode *pFsPathNode = NULL;

+

+    zOss_AssertEx(disk != NULL, 0);

+    

+    /*ËÑË÷¶¯Ì¬Ó³Éä±í*/

+    zOss_GetMutex(g_zFsPathMapMutex, ZOSS_WAIT_FOREVER);

+    pFsPathNode = (T_zOss_FsPathMapNode *)zOss_ListFirst(&g_zFsPathDynamicMapList);

+    while( pFsPathNode != NULL)

+    {

+    	if (count >= size)

+    	{

+			zOss_ASSERT(0);

+			zOss_PutMutex(g_zFsPathMapMutex);

+			return 0;

+    	}

+		

+        disk[count++] = tolower(pFsPathNode->winPath[0]);

+        

+        pFsPathNode = (T_zOss_FsPathMapNode *)zOss_ListNext(&(pFsPathNode->node));

+    }

+    zOss_PutMutex(g_zFsPathMapMutex);

+

+    return count;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SyncFS

+* ¹¦ÄÜÃèÊö£º Îļþϵͳͬ²½

+* ²ÎÊý˵Ã÷£º (IN)

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SyncFS(VOID)

+{

+#ifdef _OS_OSE

+    ZOSS_THREAD_ID thread_id1 = NULL;

+    ZOSS_THREAD_ID thread_id2 = NULL;

+    ZOSS_THREAD_ID thread_id3 = NULL;

+    

+    UINT32 thread_priority1 = 0;

+    UINT32 thread_priority2 = 0;

+    UINT32 thread_priority3 = 0;

+    

+    thread_id1 = zOss_GetThreadIDByName((const CHAR*)"ose_cfs_jeff_/c");

+    thread_id2 = zOss_GetThreadIDByName((const CHAR*)"ose_cfs_jeff");

+    thread_id3 = zOss_GetThreadIDByName((const CHAR*)"ose_ffx");

+

+    if (thread_id1 == NULL || thread_id2 == NULL || thread_id3 == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+

+    zOss_GetThreadPri(thread_id1, &thread_priority1);

+    zOss_GetThreadPri(thread_id2, &thread_priority2);

+    zOss_GetThreadPri(thread_id3, &thread_priority3);

+

+    zOss_SetThreadPri(thread_id1, 8);

+    zOss_SetThreadPri(thread_id2, 8);

+    zOss_SetThreadPri(thread_id3, 9);

+

+    efs_sync("/c");

+

+    zOss_SetThreadPri(thread_id1, thread_priority1);

+    zOss_SetThreadPri(thread_id2, thread_priority2);

+    zOss_SetThreadPri(thread_id3, thread_priority3);

+#elif defined (_OS_TOS)

+    SINT32 ret      = 0;

+    UINT32 cnt      = 0;

+    UINT32 fail     = 0;

+    UINT32 num      = gDiskParam->diskNum;

+    T_zOss_FsPathMapNode *pFsPathNode   = NULL;

+

+    /*ͬ²½¾²Ì¬Ó³Éä±íÖеÄÎļþϵͳ*/

+    for (cnt = 0; cnt < num; cnt++)

+    {

+        ret = cyg_fs_setinfo(gDiskParam->diskMap[cnt].LinuxPath, FS_INFO_SYNC, NULL, 0);

+        if (ret)

+            fail++;

+    }

+    

+    /*ͬ²½¶¯Ì¬Ó³Éä±íÖÐÎļþϵͳ*/

+    zOss_GetMutex(g_zFsPathMapMutex, ZOSS_WAIT_FOREVER);

+    pFsPathNode = (T_zOss_FsPathMapNode *)zOss_ListFirst(&g_zFsPathDynamicMapList);

+    while(pFsPathNode != NULL)

+    {

+        ret = cyg_fs_setinfo(pFsPathNode->linuxPath, FS_INFO_SYNC, NULL, 0);

+        if (ret)

+            fail++;

+        pFsPathNode = (T_zOss_FsPathMapNode *)zOss_ListNext(&(pFsPathNode->node));

+    }    

+    zOss_PutMutex(g_zFsPathMapMutex);

+    

+    if (fail)

+    {

+        return ZOSS_ERROR;

+    }

+#elif defined _OS_LINUX

+    int ret;

+

+    ret = CPPS_KO_FUNC(sys_sync)();

+    if (ret == 0)

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_FsMount

+* ¹¦ÄÜÃèÊö£º¼ÓÔØOSS CFGÅäÖõÄÎļþϵͳ£»

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º³É¹¦·µ»Ø ZOSS_SUCCESS£¬Ê§°Ü·µ»ØZOSS_ERROR£» 

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_FsMount(VOID)

+{

+#ifdef _OS_LINUX

+    return ZOSS_SUCCESS;

+#else

+    UINT32 cnt;

+

+    for(cnt = 0; cnt < gDiskParam->diskNum; cnt++)

+    {

+        int ret = mount(gDiskParam->diskMap[cnt].Device, gDiskParam->diskMap[cnt].LinuxPath, gDiskParam->diskMap[cnt].Format);

+        zOss_AssertEx(ret == ZOSS_SUCCESS, ZOSS_ERROR);

+    }

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º FS_Init

+* ¹¦ÄÜÃèÊö£º Îļþϵͳ³õʼ»¯

+* ²ÎÊý˵Ã÷£º (IN)

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID  FS_Init(VOID)

+{    

+    T_OSS_PARAM *pOssParam  = NULL;

+

+#ifdef _OS_OSE

+    ZOSS_THREAD_ID threadID = NULL;

+    threadID = zOss_GetThreadIDByName((const CHAR*)"ose_ffx");/* µ÷ÕûÎļþϵͳ¶ÁÏ̵߳ÄÓÅÏȼ¶£»*/

+

+    if (threadID != NULL)

+    {

+        zOss_SetThreadPri(threadID, 29); /* ÓÉ30µ÷Õûµ½29 */

+    }

+    threadID = zOss_GetThreadIDByName((const CHAR*)"ose_ffxwriter");/*µ÷ÕûÎļþϵͳдÏ̵߳ÄÓÅÏȼ¶?*/

+    if (threadID != NULL)

+    {

+        zOss_SetThreadPri(threadID, 30); /* ÓÉ31µ÷Õûµ½30 */

+    }

+#endif

+    

+    pOssParam   = zOss_GetOssCfg();

+    gDiskParam  = &(pOssParam->DiskMap);

+    

+#if defined (_OS_TOS) || defined (_OS_LINUX)

+    zOss_ListInit(&g_zFsPathDynamicMapList);

+    g_zFsPathMapMutex = zOss_CreateMutex("fsPathMutex", ZOSS_INHERIT);

+#endif

+}

+

+#ifdef __cplusplus

+} 

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_list.c b/cp/ps/plat/src/oss/osa/com/oss_list.c
new file mode 100644
index 0000000..7edfb78
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_list.c
@@ -0,0 +1,373 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : oss_list.c 

+* ÎÄ ¼þ Ãû : oss_list.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : xuxingkui

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007/05/21

+* ÆäËü˵Ã÷ :          

+**************************************************************************/

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : xiaxinguo

+* ÐÞ¸ÄÈÕÆÚ : 2007/08/01

+* ÐÞ¸ÄÄÚÈÝ : ´ÓDALÖÐÒÆ¶¯COMMONÏÂ×÷Ϊ¹«¹²½Ó¿Ú

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : hongkun

+* ÐÞ¸ÄÈÕÆÚ : 2007/08/27

+* ÐÞ¸ÄÄÚÈÝ : ɾ³ýLIST½á¹¹ÖеÄnodeÔªËØ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/09/15

+* ÐÞ¸ÄÄÚÈÝ : PC-LINT¼ì²éÓÚ±àÂë¹æ·¶ÐÞ¸Ä EC: 617001781881  

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0004

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC: 617001781957

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+#if !defined (_OS_TOS) && !defined (_OS_LINUX)

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  zOss_ListInit

+* ¹¦ÄÜÃèÊö:  ³õʼ»¯Ë«ÏòÁ´±í

+* ²ÎÊý˵Ã÷£º

+             (IN)

+                pList:Á´±íÖ¸Õë

+             (OUT)

+* ·µ »Ø Öµ:

+**************************************************************************/

+VOID zOss_ListInit(T_ZOss_List *pList)

+{

+    zOss_AssertExN(pList != NULL);

+

+    pList->HEAD  = NULL;

+    pList->TAIL  = NULL;

+    pList->count = 0;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_ListAdd

+* ¹¦ÄÜÃèÊö: ÏòÁ´±íβÌí¼Ó½Úµã

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                pList:Á´±íÖ¸Õë

+                pNode:´ýÌí¼Ó½ÚµãÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ:

+**************************************************************************/

+CODE_BEGIN(.PLAT_TCM_CODE)

+VOID zOss_ListAdd (T_ZOss_List *pList, T_ZOss_Node *pNode)

+{

+    zOss_AssertExN(pList != NULL && pNode != NULL);

+

+    zOss_ListInsert(pList, pList->TAIL, pNode);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  zOss_ListCount

+* ¹¦ÄÜÃèÊö:  »ñÈ¡Á´±íÏÂ×ܹ²µÄ½ÚµãÊý

+* ²ÎÊý˵Ã÷£º

+             (IN)

+                pList:Á´±íÖ¸Õë

+             (OUT)

+* ·µ »Ø Öµ:  ½Úµã¸öÊý

+**************************************************************************/

+SINT32 zOss_ListCount(T_ZOss_List *pList)

+{

+    zOss_AssertEx(pList != NULL, -1);

+

+    return (pList->count);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_ListDelete

+* ¹¦ÄÜÃèÊö: ÒÆ³ýÁ´±íÖÐÖ¸¶¨µÄ½Úµã

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                pList:Á´±íÖ¸Õë

+                pNode:´ýɾ³ý½ÚµãÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ:

+**************************************************************************/

+VOID zOss_ListDelete(T_ZOss_List *pList, T_ZOss_Node *pNode)

+{

+    zOss_AssertExN(pList != NULL && pNode != NULL);

+

+    if (pNode->previous != NULL)

+    {

+        pNode->previous->next = pNode->next;

+    }

+    else

+    {

+        pList->HEAD = pNode->next;

+    }

+

+    if (pNode->next != NULL)

+    {

+        pNode->next->previous = pNode->previous;

+    }

+    else

+    {

+        pList->TAIL = pNode->previous;

+    }

+

+    /* update node count */

+    pList->count--;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_ListFirst

+* ¹¦ÄÜÃèÊö: »ñÈ¡Á´±íµÄÊ×½Úµã

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                pList:Á´±íÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ: ½ÚµãÖ¸Õë(µ±Á´±íÖÐûÓнڵãʱ£¬·µ»Ø¿Õ)

+**************************************************************************/

+T_ZOss_Node* zOss_ListFirst(T_ZOss_List *pList)

+{

+    zOss_AssertEx(pList != NULL, NULL);

+

+    return (pList->HEAD);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_ListInsert

+* ¹¦ÄÜÃèÊö: ÏòÁ´±íÖ¸¶¨µÄ½Úµãºó²åÈë½Úµã

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                pList:Á´±íÖ¸Õë

+                pPrev:²åÈëµã½ÚµãÖ¸Õ룬µ±pPrevΪ¿Õʱ£¬±íʾ²åÈëµ½Á´±íÊ×λÖÃ

+                pNode:´ý²åÈëµÄ½ÚµãÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ:

+**************************************************************************/

+VOID zOss_ListInsert (T_ZOss_List *pList, T_ZOss_Node *pPrev, T_ZOss_Node *pNode)

+{

+    T_ZOss_Node *pNext = NULL;

+

+    zOss_AssertExN(pList != NULL);

+    zOss_AssertExN(pNode != NULL);

+

+    if (pPrev != NULL)

+    {

+        pNext = pPrev->next;    /* make prev node point fwd to new */

+        pPrev->next = pNode;

+    }

+    else

+    {

+     	pNext = pList->HEAD;    /* new node is to be first in list */

+    	pList->HEAD = pNode;

+    }

+

+    if (pNext != NULL)

+    {    	

+       pNext->previous = pNode; /* make next node point back to new */

+    }

+    else

+    {

+        pList->TAIL = pNode;    /* new node is to be last in list */

+    }

+

+    /* set pointers in new node, and update node count */

+    pNode->next     = pNext;

+    pNode->previous = pPrev;

+

+    pList->count++;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_ListLast

+* ¹¦ÄÜÃèÊö: »ñȡָ¶¨½ÚµãµÄºóÒ»½Úµã

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                pNode:Ö¸¶¨½ÚµãÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ: ½ÚµãÖ¸Õë(µ±Á´±íÖÐûÓнڵãʱ£¬·µ»Ø¿Õ)

+**************************************************************************/

+T_ZOss_Node* zOss_ListLast(T_ZOss_List *pList)

+{

+    zOss_AssertEx(pList != NULL, NULL);

+

+    return (pList->TAIL);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_ListNext

+* ¹¦ÄÜÃèÊö: »ñȡָ¶¨½ÚµãµÄǰһ½Úµã

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                pNode:½ÚµãÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ: ½ÚµãÖ¸Õë(µ±´«Èë½ÚµãÊÇÁ´±í×îºóÒ»¸ö½Úµãʱ£¬·µ»Ø¿Õ)

+**************************************************************************/

+T_ZOss_Node* zOss_ListNext(T_ZOss_Node *pNode)

+{

+    zOss_AssertEx(pNode != NULL, NULL);

+

+    return (pNode->next);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_ListPrevious

+* ¹¦ÄÜÃèÊö: »ñȡָ¶¨½ÚµãµÄǰһ½Úµã

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                pNode:Ö¸¶¨½ÚµãÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ: ½ÚµãÖ¸Õë(µ±´«Èë½ÚµãÊÇÁ´±íµÚÒ»¸ö½Úµãʱ£¬·µ»Ø¿Õ)

+**************************************************************************/

+T_ZOss_Node *zOss_ListPrevious(T_ZOss_Node *pNode)

+{

+    zOss_AssertEx(pNode != NULL, NULL);

+

+    return (pNode->previous);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_ListNStep

+* ¹¦ÄÜÃèÊö: »ñÈ¡ÓëÖ¸¶¨½Úµã¼ä¸ônStepµÄ½Úµã

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                pNode:½ÚµãÖ¸Õë

+                nStep:¼ä¸ôÊý. ÕýÊý:²éÕÒnext½Úµã£¬¸ºÊý²éÕÒprevious½Úµã

+            (OUT)

+* ·µ »Ø Öµ: ½ÚµãÖ¸Õë(µ±ÔÚ¼ä¸ônStepÄÚµ½´ïÁ´±íβʱ£¬·µ»Ø¿Õ)

+**************************************************************************/

+T_ZOss_Node *zOss_ListNStep(T_ZOss_Node *pNode, SINT32 nStep)

+{

+    int i       = 0;

+    

+    zOss_AssertEx(pNode != NULL, NULL);

+    

+    if (nStep > 0)

+    {

+        for (i = nStep; i > 0; i--)

+        {

+            pNode = pNode->next;

+            

+            if (pNode == NULL)

+            {

+                break;

+            }

+        }

+    }

+    else

+    {

+        for (i = nStep; i < 0; i++)

+        {

+            pNode = pNode->previous;

+            

+            if (pNode == NULL)

+            {

+                break;

+            }

+        }

+    }

+    return (pNode);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_ListFind

+* ¹¦ÄÜÃèÊö: ²éÕÒÁ´±íÖеĽڵã

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                pList:Á´±íÖ¸Õë

+                pNode:´ý²éÕÒ½ÚµãÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ: Á´±íÖÐÓÐÖ¸¶¨½Úµã:½ÚµãÔÚÁ´±íÖеÄË÷Òý(´Ó1¿ªÊ¼)£¬

+                        Á´±íÖÐÎÞÖ¸¶¨½Úµã:-1

+**************************************************************************/

+SINT32 zOss_ListFind (T_ZOss_List *pList, T_ZOss_Node *pNode)

+{

+    T_ZOss_Node *pNextNode      = NULL;

+    int         iNodePosition   = 1;

+

+    zOss_AssertEx(pList != NULL && pNode != NULL, -1);

+

+    pNextNode = zOss_ListFirst (pList);

+

+    while ((pNextNode != NULL) && (pNextNode != pNode))

+    {

+        iNodePosition++;

+        

+        pNextNode = zOss_ListNext (pNextNode);

+    }

+

+    if (pNextNode != NULL)

+    {

+        return (iNodePosition);

+    }

+    else

+    {

+        return (-1);

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_ListConnect

+* ¹¦ÄÜÃèÊö: ½«Á½¸öÁ´±íÁ´½ÓÔÚÒ»Æð

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                pList1: Á´±í1

+                pList2: Á´±í2

+            (OUT)

+* ·µ»ØÖµ:

+* ˵Ã÷£º    ½«pList2Á´½Óµ½pList1β²¿£»pList2µÄÁ´±íÍ·ÄÚÈݲ»»á¸Ä±ä

+**************************************************************************/

+VOID zOss_ListConnect(T_ZOss_List *pList1, T_ZOss_List *pList2)

+{

+    if (pList1->count == 0)

+    {

+        pList1->HEAD    = pList2->HEAD;

+        pList1->TAIL    = pList2->TAIL;

+    }

+    else

+    {

+        if (pList2->count != 0)

+        {

+            pList1->TAIL ->next     = pList2->HEAD;

+            pList2->HEAD->previous  = pList1->TAIL;

+            pList1->TAIL            = pList2->TAIL;

+        }

+    }

+    pList1->count += pList2->count;

+}

+

+CODE_END

+

+#endif

+

+#ifdef __cplusplus

+ }

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_math.c b/cp/ps/plat/src/oss/osa/com/oss_math.c
new file mode 100644
index 0000000..d01e9c5
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_math.c
@@ -0,0 +1,76 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     oss_math.c

+* Îļþ±êʶ:     oss_math.c

+* ÄÚÈÝÕªÒª:     OSSÖ§³Å²ãÊýѧ¿âʵÏÖÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/08/01      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_math.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#ifdef _OS_LINUX

+

+/*******************************************************************************

+*                                  ³£Á¿¶¨Òå                                    *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+double fabs(double x)

+{

+    LIBM_HI(x) &= 0x7fffffff;

+

+    return x;

+}

+

+double copysign(double x, double y)

+{

+    LIBM_HI(x) = (LIBM_HI(x) & 0x7fffffff) | (LIBM_HI(y) & 0x80000000);

+

+    return x;

+}

+

+#endif  // #ifdef _OS_LINUX

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_math_ceil.c b/cp/ps/plat/src/oss/osa/com/oss_math_ceil.c
new file mode 100644
index 0000000..f31b778
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_math_ceil.c
@@ -0,0 +1,126 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     oss_math_ceil.c

+* Îļþ±êʶ:     oss_math_ceil.c

+* ÄÚÈÝÕªÒª:     OSSÖ§³Å²ãÊýѧ¿âceilʵÏÖÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/08/01      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_math.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#ifdef _OS_LINUX

+

+/*******************************************************************************

+*                                  ³£Á¿¶¨Òå                                    *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+static const double huge = 1.0e300;

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+double ceil(double x)

+{

+    int i0,i1,j0;

+    unsigned i,j;

+

+    i0 =  LIBM_HI(x);

+    i1 =  LIBM_LO(x);

+    j0 = ((i0>>20) & 0x7ff) - 0x3ff;

+    if (j0 < 20) {

+        if (j0 < 0) {               /* raise inexact if x != 0 */

+            if (huge + x > 0.0) {   /* return 0*sign(x) if |x|<1 */

+                if (i0 < 0) {

+                    i0 = 0x80000000;

+                    i1 = 0;

+                } else if ((i0|i1) != 0) { 

+                    i0 = 0x3ff00000;

+                    i1 = 0;

+                }

+            }

+        } else {

+            i = (0x000fffff)>>j0;

+            if (((i0&i)|i1) == 0)

+                return x;           /* x is integral */

+

+            if (huge + x > 0.0) {   /* raise inexact flag */

+                if (i0 > 0)

+                    i0 += (0x00100000)>>j0;

+                i0 &= (~i);

+                i1=0;

+            }

+        }

+    } else if (j0>51) {

+        if (j0 == 0x400)

+            return x + x;           /* inf or NaN */

+        else

+            return x;               /* x is integral */

+    } else {

+        i = ((unsigned)(0xffffffff))>>(j0 - 20);

+

+        if((i1&i) == 0)

+            return x;               /* x is integral */

+

+        if (huge + x > 0.0) {       /* raise inexact flag */

+            if (i0 > 0) {

+                if(j0 == 20)

+                    i0 += 1;

+                else {

+                    j = i1 + (1<<(52 - j0));

+                    if (j < (unsigned)i1)

+                        i0 +=1;     /* got a carry */

+                    i1 = j;

+                }

+            }

+            i1 &= (~i);

+        }

+    }

+

+    LIBM_HI(x) = i0;

+    LIBM_LO(x) = i1;

+

+    return x;

+}

+

+#endif  // #ifdef _OS_LINUX

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_math_div.c b/cp/ps/plat/src/oss/osa/com/oss_math_div.c
new file mode 100644
index 0000000..02eff81
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_math_div.c
@@ -0,0 +1,78 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     oss_math_div.c

+* Îļþ±êʶ:     oss_math_div.c

+* ÄÚÈÝÕªÒª:     OSSÖ§³Å²ãÊýѧ¿âdivʵÏÖÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/08/01      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#ifdef _OS_LINUX

+

+/*******************************************************************************

+*                                  ³£Á¿¶¨Òå                                    *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+div_t div(int numer, int denom)

+{

+    div_t ret;

+

+    ret.quot = numer / denom;

+    ret.rem  = numer % denom;

+

+    if ((ret.rem < 0) && (numer > 0)) {

+        ++ret.quot;

+        ret.rem -= denom;

+    } else if ((ret.rem > 0) && (numer < 0)) {

+        --ret.quot;

+        ret.rem += denom;

+    }

+

+    return ret;

+}

+

+#endif  // #ifdef _OS_LINUX

+

+#ifdef __cplusplus

+}

+#endif

diff --git a/cp/ps/plat/src/oss/osa/com/oss_math_log.c b/cp/ps/plat/src/oss/osa/com/oss_math_log.c
new file mode 100644
index 0000000..74fec65
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_math_log.c
@@ -0,0 +1,148 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     oss_math_log.c

+* Îļþ±êʶ:     oss_math_log.c

+* ÄÚÈÝÕªÒª:     OSSÖ§³Å²ãÊýѧ¿âlogʵÏÖÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/08/01      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_math.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#ifdef _OS_LINUX

+

+/*******************************************************************************

+*                                  ³£Á¿¶¨Òå                                    *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+static const double ln2_hi  = 6.93147180369123816490e-01;   /* 3fe62e42 fee00000 */

+static const double ln2_lo  = 1.90821492927058770002e-10;   /* 3dea39ef 35793c76 */

+static const double two54   = 1.80143985094819840000e+16;   /* 43500000 00000000 */

+static const double Lg1     = 6.666666666666735130e-01;     /* 3FE55555 55555593 */

+static const double Lg2     = 3.999999999940941908e-01;     /* 3FD99999 9997FA04 */

+static const double Lg3     = 2.857142874366239149e-01;     /* 3FD24924 94229359 */

+static const double Lg4     = 2.222219843214978396e-01;     /* 3FCC71C5 1D8E78AF */

+static const double Lg5     = 1.818357216161805012e-01;     /* 3FC74664 96CB03DE */

+static const double Lg6     = 1.531383769920937332e-01;     /* 3FC39A09 D078C69F */

+static const double Lg7     = 1.479819860511658591e-01;     /* 3FC2F112 DF3E5244 */

+

+static double zero = 0.0;

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+double log(double x)

+{

+    double hfsq, f, s, z, R, w, t1, t2, dk;

+    int k, hx, i, j;

+    unsigned lx;

+

+    hx = LIBM_HI(x);                    /* high word of x */

+    lx = LIBM_LO(x);                    /* low  word of x */

+

+    k = 0;

+    if (hx < 0x00100000) {              /* x < 2**-1022  */

+        if (((hx&0x7fffffff) | lx)==0) 

+            return -two54 / zero;       /* log(+-0)=-inf */

+

+        if (hx < 0)

+            return (x - x) / zero;      /* log(-#) = NaN */

+

+        k -= 54;

+        x *= two54;                     /* subnormal number, scale up x */

+        hx = LIBM_HI(x);                /* high word of x */

+    }

+

+    if (hx >= 0x7ff00000)

+        return x + x;

+

+    k += (hx>>20) - 1023;

+    hx &= 0x000fffff;

+    i = (hx + 0x95f64) & 0x100000;

+    LIBM_HI(x) = hx | (i^0x3ff00000);   /* normalize x or x/2 */

+    k += (i>>20);

+    f = x - 1.0;

+    if ((0x000fffff & (2 + hx)) < 3) { /* |f| < 2**-20 */

+        if (f == zero) {

+            if (k == 0)

+                return zero;  

+            else {

+                dk = (double)k;

+                return dk*ln2_hi + dk*ln2_lo;

+            }

+        }

+

+        R = f*f*(0.5-0.33333333333333333*f);

+        if (k == 0)

+            return f - R;

+        else {

+            dk = (double)k;

+            return dk*ln2_hi - ((R-dk*ln2_lo)-f);

+        }

+    }

+

+    s = f/(2.0 + f); 

+    dk = (double)k;

+    z = s*s;

+    i = hx - 0x6147a;

+    w = z*z;

+    j = 0x6b851 - hx;

+    t1= w*(Lg2 + w*(Lg4 + w*Lg6)); 

+    t2= z*(Lg1 + w*(Lg3 + w*(Lg5 + w*Lg7))); 

+    i |= j;

+    R = t2 + t1;

+    if (i > 0) {

+        hfsq = 0.5*f*f;

+        if (k == 0)

+            return f -(hfsq - s*(hfsq + R));

+        else

+            return dk*ln2_hi - ((hfsq- (s*(hfsq+R) + dk*ln2_lo)) - f);

+    } else {

+        if (k == 0)

+            return f - s*(f-R);

+        else

+            return dk*ln2_hi - ((s*(f - R) -dk*ln2_lo) - f);

+    }

+}

+

+#endif  // #ifdef _OS_LINUX

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_math_log10.c b/cp/ps/plat/src/oss/osa/com/oss_math_log10.c
new file mode 100644
index 0000000..54b97cf
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_math_log10.c
@@ -0,0 +1,108 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     oss_math_log10.c

+* Îļþ±êʶ:     oss_math_log10.c

+* ÄÚÈÝÕªÒª:     OSSÖ§³Å²ãÊýѧ¿âlog10ʵÏÖÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/08/01      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_math.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#ifdef _OS_LINUX

+

+/*******************************************************************************

+*                                  ³£Á¿¶¨Òå                                    *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+static const double two54       = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */

+static const double ivln10      = 4.34294481903251816668e-01; /* 0x3FDBCB7B, 0x1526E50E */

+static const double log10_2hi   = 3.01029995663611771306e-01; /* 0x3FD34413, 0x509F6000 */

+static const double log10_2lo   = 3.69423907715893078616e-13; /* 0x3D59FEF3, 0x11F12B36 */

+

+static double zero =  0.0;

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+static double __ieee754_log10(double x)

+{

+    double y, z;

+    int i, k, hx;

+    unsigned lx;

+

+    hx = LIBM_HI(x);                        /* high word of x */

+    lx = LIBM_LO(x);                        /* low word of x */

+

+    k = 0;

+    if (hx < 0x00100000) {                  /* x < 2**-1022  */

+        if (((hx&0x7fffffff) | lx) == 0)

+            return -two54 / zero;           /* log(+-0)=-inf */

+

+        if (hx < 0)

+            return (x - x)/zero;            /* log(-#) = NaN */

+

+        k -= 54;

+        x *= two54;                         /* subnormal number, scale up x */

+        hx = LIBM_HI(x);                    /* high word of x */

+    }

+

+    if (hx >= 0x7ff00000)

+        return x + x;

+

+    k += (hx>>20) - 1023;

+    i  = ((unsigned)k&0x80000000)>>31;

+    hx = (hx&0x000fffff) | ((0x3ff-i)<<20);

+    y  = (double)(k + i);

+    LIBM_HI(x) = hx;

+    z  = y*log10_2lo + ivln10*log(x);

+

+    return  z + y*log10_2hi;

+}

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+double log10(double x)

+{

+    return __ieee754_log10(x);

+}

+

+#endif  // #ifdef _OS_LINUX

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_math_pow.c b/cp/ps/plat/src/oss/osa/com/oss_math_pow.c
new file mode 100644
index 0000000..1987026
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_math_pow.c
@@ -0,0 +1,359 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     oss_math_pow.c

+* Îļþ±êʶ:     oss_math_pow.c

+* ÄÚÈÝÕªÒª:     OSSÖ§³Å²ãÊýѧ¿âpowʵÏÖÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/08/01      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_math.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#ifdef _OS_LINUX

+

+/*******************************************************************************

+*                                  ³£Á¿¶¨Òå                                    *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+static const double bp[]    = {1.0, 1.5,};

+static const double dp_h[]  = { 0.0, 5.84962487220764160156e-01,}; /* 0x3FE2B803, 0x40000000 */

+static const double dp_l[]  = { 0.0, 1.35003920212974897128e-08,}; /* 0x3E4CFDEB, 0x43CFD006 */

+static const double zero    = 0.0;

+static const double one	    = 1.0;

+static const double two	    = 2.0;

+static const double two53	= 9007199254740992.0;	        /* 0x43400000, 0x00000000 */

+static const double huge	= 1.0e300;

+static const double tiny    = 1.0e-300;

+

+/* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */

+static const double L1      = 5.99999999999994648725e-01;   /* 0x3FE33333, 0x33333303 */

+static const double L2      = 4.28571428578550184252e-01;   /* 0x3FDB6DB6, 0xDB6FABFF */

+static const double L3      = 3.33333329818377432918e-01;   /* 0x3FD55555, 0x518F264D */

+static const double L4      = 2.72728123808534006489e-01;   /* 0x3FD17460, 0xA91D4101 */

+static const double L5      = 2.30660745775561754067e-01;   /* 0x3FCD864A, 0x93C9DB65 */

+static const double L6      = 2.06975017800338417784e-01;   /* 0x3FCA7E28, 0x4A454EEF */

+static const double P1      = 1.66666666666666019037e-01;   /* 0x3FC55555, 0x5555553E */

+static const double P2      = -2.77777777770155933842e-03;  /* 0xBF66C16C, 0x16BEBD93 */

+static const double P3      = 6.61375632143793436117e-05;   /* 0x3F11566A, 0xAF25DE2C */

+static const double P4      = -1.65339022054652515390e-06;  /* 0xBEBBBD41, 0xC5D26BF1 */

+static const double P5      = 4.13813679705723846039e-08;   /* 0x3E663769, 0x72BEA4D0 */

+static const double lg2     = 6.93147180559945286227e-01;   /* 0x3FE62E42, 0xFEFA39EF */

+static const double lg2_h   = 6.93147182464599609375e-01;   /* 0x3FE62E43, 0x00000000 */

+static const double lg2_l   = -1.90465429995776804525e-09;  /* 0xBE205C61, 0x0CA86C39 */

+static const double ovt     = 8.0085662595372944372e-0017;  /* -(1024-log2(ovfl+.5ulp)) */

+static const double cp      = 9.61796693925975554329e-01;   /* 0x3FEEC709, 0xDC3A03FD =2/(3ln2) */

+static const double cp_h    = 9.61796700954437255859e-01;   /* 0x3FEEC709, 0xE0000000 =(float)cp */

+static const double cp_l    = -7.02846165095275826516e-09;  /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h*/

+static const double ivln2   = 1.44269504088896338700e+00;   /* 0x3FF71547, 0x652B82FE =1/ln2 */

+static const double ivln2_h = 1.44269502162933349609e+00;   /* 0x3FF71547, 0x60000000 =24b 1/ln2*/

+static const double ivln2_l = 1.92596299112661746887e-08;   /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+

+static double __ieee754_pow(double x, double y)

+{

+	double z, ax, z_h, z_l, p_h, p_l;

+	double y1, t1, t2, r, s, t, u, v, w;

+	s32 i, j, k, yisint, n;

+	s32 hx, hy, ix, iy;

+	u32 lx, ly;

+

+	EXTRACT_WORDS(hx, lx, x);

+	EXTRACT_WORDS(hy, ly, y);

+	ix = hx&0x7fffffff;

+    iy = hy&0x7fffffff;

+

+    /* y==zero: x**0 = 1 */

+	if ((iy|ly) == 0)

+        return one;

+

+    /* +-NaN return x+y */

+	if(ix > 0x7ff00000 || ((ix == 0x7ff00000) && (lx != 0)) ||

+	   iy > 0x7ff00000 || ((iy == 0x7ff00000)&&(ly != 0))) 

+        return x + y;

+

+    /* determine if y is an odd int when x < 0

+     * yisint = 0	... y is not an integer

+     * yisint = 1	... y is an odd int

+     * yisint = 2	... y is an even int

+     */

+	yisint = 0;

+    if (hx < 0) {

+        if (iy >= 0x43400000)

+            yisint = 2;                 /* even integer y */

+	    else if (iy >= 0x3ff00000) {

+            k = (iy>>20) - 0x3ff;	        /* exponent */

+

+            if (k > 20) {

+                j = ly>>(52 - k);

+

+                if((j<<(52 - k)) == ly)

+                    yisint = 2 - (j&1);

+            } else if (ly == 0) {

+                j = iy>>(20 - k);

+

+                if((j<<(20 - k)) == iy)

+                    yisint = 2 - (j&1);

+            }

+        }

+    }

+

+    /* special value of y */

+    if (ly == 0) {

+        if (iy == 0x7ff00000) {	                /* y is +-inf */

+            if (((ix - 0x3ff00000) | lx) == 0)  /* inf**+-1 is NaN */

+	            return  y - y;

+            else if (ix >= 0x3ff00000)          /* (|x|>1)**+-inf = inf,0 */

+	            return (hy >= 0) ?  y : zero;

+            else			                    /* (|x|<1)**-,+inf = inf,0 */

+	            return (hy < 0) ? -y : zero;

+        }

+

+        if (iy == 0x3ff00000) {	                /* y is  +-1 */

+	        if (hy < 0)

+                return one / x;

+            else

+                return x;

+        }

+

+        if (hy == 0x40000000)

+            return x*x;             /* y is  2 */

+

+        if (hy == 0x3fe00000) {	    /* y is  0.5 */

+	        if (hx >= 0)	        /* x >= +0 */

+	            return sqrt(x);

+        }

+    }

+

+    ax = fabs(x);

+    /* special value of x */

+    if (lx == 0) {

+        if (ix == 0x7ff00000 || ix == 0 || ix == 0x3ff00000) {

+	        z = ax;			        /*x is +-0,+-inf,+-1*/

+

+	        if (hy < 0)

+                z = one / z;        /* z = (1/|x|) */

+

+	        if (hx < 0) {

+	            if(((ix - 0x3ff00000) | yisint) == 0) {

+		            z = (z - z) / (z - z);  /* (-1)**non-int is NaN */

+	            } else if (yisint == 1) 

+		            z = -z;		            /* (x<0)**odd = -(|x|**odd) */

+	            }

+

+	        return z;

+        }

+    }

+

+    /* (x<0)**(non-int) is NaN */

+    /* CYGNUS LOCAL: This used to be

+    if((((hx>>31)+1)|yisint)==0) return (x-x)/(x-x);

+    but ANSI C says a right shift of a signed negative quantity is

+    implementation defined.  */

+    if(((((u32)hx>>31) - 1) | yisint) == 0)

+        return (x - x) / (x - x);

+

+    /* |y| is huge */

+    if (iy > 0x41e00000) { /* if |y| > 2**31 */

+        if (iy > 0x43f00000){	/* if |y| > 2**64, must o/uflow */

+	        if (ix <= 0x3fefffff)

+                return (hy < 0) ? huge*huge : tiny*tiny;

+

+		    if (ix >= 0x3ff00000)

+                return (hy > 0) ? huge*huge : tiny*tiny;

+        }

+

+        /* over/underflow if x is not close to one */

+        if (ix < 0x3fefffff)

+            return (hy < 0) ? huge*huge : tiny*tiny;

+

+        if (ix > 0x3ff00000)

+            return (hy > 0) ? huge*huge : tiny*tiny;

+

+        /* now |1-x| is tiny <= 2**-20, suffice to compute 

+           log(x) by x-x^2/2+x^3/3-x^4/4 */

+        t  = x - 1;		        /* t has 20 trailing zeros */

+        w  = (t*t)*(0.5 - t*(0.3333333333333333333333 - t*0.25));

+        u  = ivln2_h*t;	        /* ivln2_h has 21 sig. bits */

+        v  = t*ivln2_l - w*ivln2;

+        t1 = u + v;

+        SET_LOW_WORD(t1,0);

+        t2 = v - (t1 - u);

+    }else {

+        double s2,s_h,s_l,t_h,t_l;

+

+        n = 0;

+

+        /* take care subnormal number */

+        if (ix < 0x00100000) {

+            ax *= two53;

+            n -= 53;

+            GET_HIGH_WORD(ix, ax);

+        }

+        n += ((ix)>>20)-0x3ff;

+        j = ix&0x000fffff;

+

+        /* determine interval */

+        ix = j | 0x3ff00000;		/* normalize ix */

+        if (j <= 0x3988E)

+            k = 0;                  /* |x|<sqrt(3/2) */

+        else if (j < 0xBB67A)

+            k = 1;                  /* |x|<sqrt(3)   */

+        else {

+            k = 0;

+            n += 1;

+            ix -= 0x00100000;

+        }

+        SET_HIGH_WORD(ax, ix);

+

+        /* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */

+        u = ax - bp[k];		/* bp[0]=1.0, bp[1]=1.5 */

+        v = one / (ax + bp[k]);

+        s = u*v;

+        s_h = s;

+        SET_LOW_WORD(s_h, 0);

+

+	    /* t_h=ax+bp[k] High */

+        t_h = zero;

+        SET_HIGH_WORD(t_h, ((ix>>1) | 0x20000000) + 0x00080000 + (k<<18));

+        t_l = ax - (t_h - bp[k]);

+        s_l = v*((u - s_h*t_h) - s_h*t_l);

+

+        /* compute log(ax) */

+        s2 = s*s;

+        r = s2*s2*(L1 + s2*(L2 + s2*(L3 + s2*(L4 + s2*(L5 + s2*L6)))));

+        r += s_l*(s_h + s);

+        s2  = s_h*s_h;

+        t_h = 3.0 + s2 + r;

+        SET_LOW_WORD(t_h, 0);

+        t_l = r - ((t_h - 3.0) -s2);

+

+        /* u+v = s*(1+...) */

+        u = s_h*t_h;

+        v = s_l*t_h + t_l*s;

+

+        /* 2/(3log2)*(s+...) */

+        p_h = u + v;

+        SET_LOW_WORD(p_h, 0);

+        p_l = v - (p_h - u);

+        z_h = cp_h*p_h;         /* cp_h+cp_l = 2/(3*log2) */

+        z_l = cp_l*p_h + p_l*cp + dp_l[k];

+

+        /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */

+        t = (double)n;

+        t1 = (((z_h+z_l) + dp_h[k]) + t);

+        SET_LOW_WORD(t1, 0);

+        t2 = z_l - (((t1 - t) - dp_h[k]) -z_h);

+    }

+

+    s = one; /* s (sign of result -ve**odd) = -1 else = 1 */

+    if(((((u32)hx>>31) - 1) | (yisint - 1)) == 0)

+        s = -one;/* (-ve)**(odd int) */

+

+    /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */

+    y1 = y;

+    SET_LOW_WORD(y1, 0);

+    p_l = (y-y1)*t1 + y*t2;

+    p_h = y1*t1;

+    z   = p_l + p_h;

+    EXTRACT_WORDS(j, i, z);

+    if (j >= 0x40900000) {				    /* z >= 1024 */

+        if(((j - 0x40900000) | i) != 0)     /* if z > 1024 */

+	        return s*huge*huge;			    /* overflow */

+        else {

+	        if(p_l + ovt > z - p_h)

+                return s*huge*huge; /* overflow */

+        }

+    } else if((j&0x7fffffff) >= 0x4090cc00 ) {  /* z <= -1075 */

+        if(((j - 0xc090cc00) | i) != 0)         /* z < -1075 */

+	        return s*tiny*tiny;		            /* underflow */

+        else {

+	        if(p_l <= z-p_h)

+                return s*tiny*tiny;             /* underflow */

+        }

+    }

+

+    /*

+     * compute 2**(p_h+p_l)

+     */

+    i = j&0x7fffffff;

+    k = (i>>20) - 0x3ff;

+    n = 0;

+    if (i > 0x3fe00000) {                   /* if |z| > 0.5, set n = [z+0.5] */

+        n = j + (0x00100000>>(k + 1));

+        k = ((n&0x7fffffff)>>20) - 0x3ff;   /* new k for n */

+        t = zero;

+        SET_HIGH_WORD(t, n&~(0x000fffff>>k));

+        n = ((n&0x000fffff) | 0x00100000)>>(20 - k);

+        if (j < 0)

+            n = -n;

+        p_h -= t;

+    }

+

+    t = p_l + p_h;

+    SET_LOW_WORD(t, 0);

+    u = t*lg2_h;

+    v = (p_l - (t - p_h))*lg2 + t*lg2_l;

+    z = u + v;

+    w = v - (z - u);

+    t = z*z;

+    t1 = z - t*(P1 + t*(P2 + t*(P3 + t*(P4 + t*P5))));

+    r  = (z*t1) / (t1 - two) - (w + z*w);

+    z  = one - (r - z);

+    GET_HIGH_WORD(j, z);

+    j += (n<<20);

+    if ((j>>20) <= 0)

+        z = scalbn(z, (int)n);  /* subnormal output */

+    else

+        SET_HIGH_WORD(z, j);

+

+	return s*z;

+}

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+double pow(double x, double y)

+{

+    return __ieee754_pow(x, y);

+}

+

+#endif  // #ifdef _OS_LINUX

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_math_scalbn.c b/cp/ps/plat/src/oss/osa/com/oss_math_scalbn.c
new file mode 100644
index 0000000..e12e46b
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_math_scalbn.c
@@ -0,0 +1,108 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     oss_math_scalbn.c

+* Îļþ±êʶ:     oss_math_scalbn.c

+* ÄÚÈÝÕªÒª:     OSSÖ§³Å²ãÊýѧ¿âscalbnʵÏÖÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/08/01      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_math.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#ifdef _OS_LINUX

+

+/*******************************************************************************

+*                                  ³£Á¿¶¨Òå                                    *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+static const double two54   =  1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */

+static const double twom54  =  5.55111512312578270212e-17; /* 0x3C900000, 0x00000000 */

+static const double huge    = 1.0e+300;

+static const double tiny    = 1.0e-300;

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+double scalbn (double x, int n)

+{

+    int  k, hx, lx;

+

+    hx = LIBM_HI(x);

+    lx = LIBM_LO(x);

+    k = (hx&0x7ff00000)>>20;                /* extract exponent */

+    if (k == 0) {                           /* 0 or subnormal x */

+        if ((lx|(hx&0x7fffffff)) == 0)

+            return x; /* +-0 */

+

+        x *= two54;

+        hx = LIBM_HI(x);

+        k = ((hx&0x7ff00000)>>20) - 54; 

+        if (n< -50000)

+            return tiny*x;                  /*underflow*/

+    }

+

+    if (k == 0x7ff)

+        return x + x;                       /* NaN or Inf */

+

+    k = k + n;

+    if (k > 0x7fe)

+        return huge*copysign(huge, x);      /* overflow  */

+

+    if (k > 0) {                            /* normal result */

+        LIBM_HI(x) = (hx&0x800fffff)|(k<<20);

+        return x;

+    }

+

+    if (k <= -54) {

+        if (n > 50000)                      /* in case integer overflow in n+k */

+            return huge*copysign(huge,x);   /*overflow*/

+        else

+            return tiny*copysign(tiny,x);   /*underflow*/

+    }

+    k += 54;                                /* subnormal result */

+    LIBM_HI(x) = (hx&0x800fffff)|(k<<20);

+

+    return x*twom54;

+} 

+

+#endif  // #ifdef _OS_LINUX

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_math_sqrt.c b/cp/ps/plat/src/oss/osa/com/oss_math_sqrt.c
new file mode 100644
index 0000000..6140536
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_math_sqrt.c
@@ -0,0 +1,179 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     oss_math_sqrt.c

+* Îļþ±êʶ:     oss_math_sqrt.c

+* ÄÚÈÝÕªÒª:     OSSÖ§³Å²ãÊýѧ¿âsqrtʵÏÖÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/08/01      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_math.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#ifdef _OS_LINUX

+

+/*******************************************************************************

+*                                  ³£Á¿¶¨Òå                                    *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+static const double one = 1.0, tiny = 1.0e-300;

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+double sqrt(double x)

+{

+    double z;

+    int sign = (int)0x80000000; 

+    unsigned r, t1, s1, ix1, q1;

+    int ix0, s0, q, m, t, i;

+

+    ix0 = LIBM_HI(x);                   /* high word of x */

+    ix1 = LIBM_LO(x);                   /* low word of x */

+

+    /* take care of Inf and NaN */

+    if ((ix0&0x7ff00000) == 0x7ff00000) {

+        return x*x + x;                 /* sqrt(NaN)=NaN, sqrt(+inf)=+inf sqrt(-inf)=sNaN */

+    }

+

+    /* take care of zero */

+    if (ix0 <= 0 ) {

+        if (((ix0&(~sign))|ix1) == 0)

+            return x;                   /* sqrt(+-0) = +-0 */

+        else if (ix0 < 0)

+            return (x - x) / (x - x);   /* sqrt(-ve) = sNaN */

+    }

+

+    /* normalize x */

+    m = (ix0>>20);

+    if (m == 0) {                       /* subnormal x */

+        while (ix0 == 0) {

+            m -= 21;

+            ix0 |= (ix1>>11);

+            ix1 <<= 21;

+        }

+

+        for (i = 0;(ix0&0x00100000) == 0; i++)

+            ix0 <<= 1;

+

+        m -= i-1;

+        ix0 |= (ix1>>(32 - i));

+        ix1 <<= i;

+    }

+

+    m -= 1023;                          /* unbias exponent */

+    ix0 = (ix0&0x000fffff) | 0x00100000;

+    if (m & 1){                         /* odd m, double x to make it even */

+        ix0 += ix0 + ((ix1&sign)>>31);

+        ix1 += ix1;

+    }

+    m >>= 1;                            /* m = [m/2] */

+

+    /* generate sqrt(x) bit by bit */

+    ix0 += ix0 + ((ix1&sign)>>31);

+    ix1 += ix1;

+    q = q1 = s0 = s1 = 0;               /* [q,q1] = sqrt(x) */

+    r = 0x00200000;                     /* r = moving bit from right to left */

+

+    while (r != 0) {

+        t = s0 + r;

+        if (t <= ix0) {

+            s0  = t+r; 

+            ix0 -= t; 

+            q   += r; 

+        } 

+        ix0 += ix0 + ((ix1&sign)>>31);

+        ix1 += ix1;

+        r >>= 1;

+    }

+

+    r = sign;

+    while (r != 0) {

+        t1 = s1+r; 

+        t  = s0;

+        if ((t < ix0) || ((t == ix0) && (t1 <= ix1))) {

+            s1 = t1+r;

+            if (((t1&sign) == (unsigned)sign) && (s1&sign) == 0)

+                s0 += 1;

+

+            ix0 -= t;

+            if (ix1 < t1)

+                ix0 -= 1;

+            ix1 -= t1;

+            q1  += r;

+        }

+

+        ix0 += ix0 + ((ix1&sign)>>31);

+        ix1 += ix1;

+        r>>=1;

+    }

+

+    /* use floating add to find out rounding direction */

+    if ((ix0 | ix1) != 0) {

+        z = one - tiny;                 /* trigger inexact flag */

+        if (z >= one) {

+            z = one + tiny;

+

+            if (q1 == (unsigned)0xffffffff) {

+                q1=0;

+                q += 1;

+            } else if (z > one) {

+                if (q1 == (unsigned)0xfffffffe)

+                    q += 1;

+                q1 += 2;

+            } else

+                q1 += (q1&1);

+        }

+    }

+

+    ix0 = (q>>1) + 0x3fe00000;

+    ix1 =  q1>>1;

+    if ((q&1) == 1)

+        ix1 |= sign;

+    ix0 += (m <<20);

+    LIBM_HI(z) = ix0;

+    LIBM_LO(z) = ix1;

+

+    return z;

+}

+

+#endif  // #ifdef _OS_LINUX

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_mem.c b/cp/ps/plat/src/oss/osa/com/oss_mem.c
new file mode 100644
index 0000000..a0c01db
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_mem.c
@@ -0,0 +1,1868 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : oss_mem.c

+* Ïà¹ØÎļþ : mem.c

+* ʵÏÖ¹¦ÄÜ : ºÏ²¢ose¡¢windows²Ù×÷ϵͳÏÂÏà¹ØÎļþ

+* ×÷    Õß : zhangxiaofei

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/10/19

+* ÆäËü˵Ã÷ :  

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#ifdef _OS_OSE

+#include "efs.h"

+#include "heap.sig"

+#include "heapapi.h"

+#include "cpu_intlock.h"

+#endif

+#ifdef _OS_TOS

+#include <pkgconf/system.h>

+#include <cyg/hal/tos_cache.h>

+#endif

+#include "oss_api.h"

+#include "sup.h"

+#include "osa.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨Òå

+**************************************************************************/

+#if defined(_OS_TOS)

+# define ZOSS_DCACHE_LINE_SIZE TOS_DCACHE_LINE_SIZE_GET()

+#elif defined(_OS_LINUX)

+# define ZOSS_DCACHE_LINE_SIZE L1_CACHE_BYTES

+#else

+# define ZOSS_DCACHE_LINE_SIZE 32

+#endif

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+#ifndef _OS_LINUX

+T_ZOss_UBPOOL   *gMem_UBPoolCfg     = NULL;     /* ÄÚ´æ³ØÅäÖÃ±í          */

+UINT32          gMem_UBPoolNum      = 0;        /* ÄÚ´æ³Ø¸öÊý            */

+static BOOL     gMem_IsInit         = FALSE;    /* ÄÚ´æÄ£¿é³õʼ»¯±êÖ¾    */

+UINT32          gMem_UBStart        = 0;        /* ÄÚ´æ³ØÆðʼָÕë        */

+UINT32          gMem_UBEnd          = 0;        /* ÄÚ´æ³Ø½áÊøÖ¸Õë        */

+UINT32          gMem_ErrCode        = 0;        /* ÄÚ´æÄ£¿é´íÎóÂë        */

+UINT32          gUBSuperviseSitch   = 0;

+

+#ifdef _DEBUG

+UINT32    ubBlockBorder = 4;                    /* ¼Ó4×Ö½ÚÄÚ´æ¿é¸ôÀë±ß½ç */

+#else

+UINT32    ubBlockBorder = 0;

+#endif

+

+#ifdef _USE_HEAP_DEBUG

+static T_ZOss_List      s_mem_list                  = { 0 };

+static ZOSS_MUTEX_ID    s_mem_mutex                 = NULL;

+#if defined (_OS_OSE) || defined (_OS_WIN)

+static UINT32           s_mem_leak_tick_start       = 0;

+static UINT32           s_mem_leak_tick_threadhold  = 0;

+#endif

+#endif

+

+#ifdef _OS_TOS

+T_Mem_MemInfo           g_zOss_HeapInfo             = { 0 };

+#endif

+

+/**************************************************************************  

+* Íⲿº¯ÊýÉùÃ÷

+**************************************************************************/

+#ifdef _OS_OSE

+extern int sysparam_readattr_long(const char *param_name, const char *attr, long *value);

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºMem_ValidateUBCfg

+* ¹¦ÄÜÃèÊö£ºÑéÖ¤ÄÚ´æ³ØÅäÖÃ

+* ²ÎÊý˵Ã÷£º(IN)

+* ·µ »Ø Öµ£ºÅäÖÃÕýÈ··µ»ØTRUE£¬Ê§°Ü·µ»ØFALSE

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#if defined (_OS_OSE) || defined (_OS_WIN)

+static UINT32 Mem_ValidateUBCfg(VOID)

+{

+    UINT32 i            = 0;

+    UINT32 tmpmaxsize   = 0;

+

+    if (gMem_UBPoolNum == 0)

+    {

+        gMem_ErrCode = ZOSS_MEM_UB_CFG_ERR;

+        return gMem_ErrCode;

+    }

+

+    tmpmaxsize = gMem_UBPoolCfg[i].pool_size;

+    for (; i < gMem_UBPoolNum; i++)

+    {

+        if ((gMem_UBPoolCfg[i].pool_size == 0) || (gMem_UBPoolCfg[i].total_block_num == 0) || (gMem_UBPoolCfg[i].pool_size < tmpmaxsize))

+        {

+            gMem_ErrCode = ZOSS_MEM_UB_CFG_ERR;

+            return ZOSS_MEM_UB_CFG_ERR;

+        }

+        else

+        {

+            tmpmaxsize                          = gMem_UBPoolCfg[i].pool_size;

+            gMem_UBPoolCfg[i].total_block_num   = gMem_UBPoolCfg[i].total_block_num;

+            if (0 == (gMem_UBPoolCfg[i].pool_size % 4))

+            {

+                gMem_UBPoolCfg[i].pool_size = gMem_UBPoolCfg[i].pool_size;

+            }

+            else

+            {

+                gMem_UBPoolCfg[i].pool_size = (gMem_UBPoolCfg[i].pool_size + 3) & (~0x3);

+            }

+        }

+    }

+

+    return ZOSS_SUCCESS;

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºMem_GetUBSize

+* ¹¦ÄÜÃèÊö£º¼ÆËãÄÚ´æ³Ø´óС

+* ²ÎÊý˵Ã÷£º(IN)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØÄÚ´æ³Ø×Ü´óС£¬Ê§°Ü·µ»Ø0

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#if defined (_OS_OSE) || defined (_OS_WIN)

+static UINT32 Mem_GetUBSize(VOID)

+{

+    UINT32 i    = 0;

+    UINT32 size = gMem_UBPoolNum * sizeof(T_Mem_UBPoolCtl); /* ÄÚ´æ¿ØÖÆ¿éµÄ´óС */

+    /* ¼ÆËãÄÚ´æ³Ø×Ü´óС */

+    for (; i < gMem_UBPoolNum; i++)

+    {

+        size += (4 + gMem_UBPoolCfg[i].pool_size + ubBlockBorder + sizeof(T_Mem_UBListNode)) * gMem_UBPoolCfg[i].total_block_num;

+    }

+

+    return size;

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºMem_SubStr

+* ¹¦ÄÜÃèÊö£º´ÓÒ»¸ö×Ö·û´®ÖлñÈ¡ÎļþÃû

+* ²ÎÊý˵Ã÷£º(IN)ÊäÈë×Ö·û´®

+* ·µ »Ø Öµ£ºÎļþÃûÖ¸Õë

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#if defined (_OS_OSE) || defined (_OS_WIN)

+#ifdef _DEBUG

+static CHAR* Mem_SubStr(const CHAR *s)

+{

+    CHAR *last = (CHAR *)strrchr((const char *)s, '\\');

+

+    if (NULL != last)

+    {

+        return (last + 1);

+    }

+

+    /* eclipse±àÒë»·¾³ÏÂÎļþ·¾¶·Ö¸ô·ûΪ'/' */

+    last = (CHAR *)strrchr((const char *)s, '/');

+

+    if (NULL != last)

+    {

+        return (last + 1);

+    }

+    else

+    {

+        return NULL;

+    }

+}

+#endif

+#endif

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºUB_Init

+* ¹¦ÄÜÃèÊö£º³õʼ»¯ÄÚ´æ³ØÁ´±í½áµãºÍÄÚ´æ¿é

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#if defined (_OS_OSE) || defined (_OS_WIN)

+static VOID UB_Init(VOID)

+{

+    T_Mem_UBPoolCtl     *pUbControlStart    = NULL;

+    T_Mem_UBPoolCtl     *pUbControl         = NULL;

+    T_Mem_UBListNode    *pUbListNodeStart   = NULL;

+    T_Mem_UBListNode    *pUbListNodeTemp    = NULL;

+    ZOSS_UB_BLOCK       pUbBlockStart       = NULL;

+    UINT32              *pUbBlockStartTemp  = NULL;

+    

+    UINT32 i = 0;

+    UINT32 j = 0;

+    

+    /* ÄÚ´æ³Ø¿ØÖÆ¿éÆðʼµØÖ· */

+    pUbControlStart     = (T_Mem_UBPoolCtl *)gMem_UBStart;

+    /* Á´±í½áµã¼´ÄÚ´æÍ·µÄÆðʼµØÖ· */

+    pUbListNodeStart    = (T_Mem_UBListNode *)(pUbControlStart + gMem_UBPoolNum);

+    pUbListNodeTemp     = pUbListNodeStart;

+    /* ÄÚ´æ¿éÇøÓòµÄÆðʼµØÖ· */

+    for (i = 0; i < gMem_UBPoolNum; i++)

+    {

+        pUbListNodeTemp = pUbListNodeTemp + gMem_UBPoolCfg[i].total_block_num;

+    }

+    pUbBlockStart = (ZOSS_UB_BLOCK)pUbListNodeTemp;

+    /* ³õʼ»¯ÄÚ´æ³Ø */

+    for (i = 0; i < gMem_UBPoolNum; i++)

+    {

+        CHAR mutexName[10] = {0};

+        sprintf((char *)mutexName, "%d", (int)i + 1);

+        /* µÚi¸öÄÚ´æ³Ø¿ØÖÆ¿é */

+        pUbControl = (T_Mem_UBPoolCtl *)pUbControlStart + i;

+        /* ³õʼ»¯ÄÚ´æ³Ø¿ØÖÆ¿é */

+        pUbControl->ubMemHeaderStart    = pUbListNodeStart;

+        pUbControl->ubBlockNum          = gMem_UBPoolCfg[i].total_block_num;

+        pUbControl->ubBlockStart        = pUbBlockStart;

+        pUbControl->ubSize              = gMem_UBPoolCfg[i].pool_size;

+        pUbControl->freeUbListHead      = pUbListNodeStart;

+        pUbControl->freeUbNum           = pUbControl->ubBlockNum;

+#ifdef _DEBUG

+        pUbControl->maxUsedUbNum        = 0;

+#endif

+#ifdef _OS_OSE

+        pUbControl->ubMutex             = NULL;

+#elif defined _OS_WIN

+        pUbControl->ubMutex             = zOss_CreateMutex((const CHAR *)mutexName, ZOSS_INHERIT);

+#endif

+        for (j = 0; j < gMem_UBPoolCfg[i].total_block_num; j++)

+        {

+            if (j == gMem_UBPoolCfg[i].total_block_num - 1)

+            {

+                pUbListNodeStart->nextNode = NULL;

+                pUbControl->freeUbListTail = pUbListNodeStart;

+            }

+            else

+            {

+                pUbListNodeStart->nextNode = pUbListNodeStart + 1;

+            }

+            /* ³õʼ»¯ÄÚ´æ¿éÖеÄÄÚ´æÍ·Ö¸Õë */

+            pUbBlockStartTemp   = (UINT32 *)pUbBlockStart;

+            *pUbBlockStartTemp  = (UINT32)pUbListNodeStart;

+#ifdef _DEBUG

+            /* ³õʼ»¯ÄÚ´æ¿é¸ôÀë±ß½ç */

+            memset((char *)pUbBlockStart + 4 + gMem_UBPoolCfg[i].pool_size, (int)MEM_UB_BLOCK_DIVIDE_VALUE, 4);

+#endif

+            pUbListNodeStart++;

+            pUbBlockStart = (CHAR *)pUbBlockStart + 4 + gMem_UBPoolCfg[i].pool_size + ubBlockBorder;

+        }

+    }

+}

+#endif

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºGetUbBlockAdd

+* ¹¦ÄÜÃèÊö£º¸ù¾ÝÄÚ´æ³Ø¿ØÖƿ鼰Á´±í½áµã»ñµÃ¶ÔÓ¦µÄÄÚ´æ¿éµØÖ·

+* ·µ »Ø Öµ£º³É¹¦:·µ»ØÄÚ´æ¿éµØÖ·;ʧ°Ü:ZOSS_NULL

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static ZOSS_UB_BLOCK GetUbBlockAdd(T_Mem_UBPoolCtl *ubControl, T_Mem_UBListNode *ubListNode)

+{

+    UINT32 serialNum = 0;

+    if ((ubControl == NULL) || (ubListNode == NULL))

+    {

+        return ZOSS_NULL;

+    }

+    serialNum = (UINT32)(ubListNode - ubControl->ubMemHeaderStart);

+    return (ZOSS_UB_BLOCK)((CHAR *)ubControl->ubBlockStart + serialNum * (4 + ubControl->ubSize + ubBlockBorder) + 4);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºGetUbPoolCtrAdd

+* ¹¦ÄÜÃèÊö£º¸ù¾ÝÁ´±í½áµãµØÖ·»ñµÃ¶ÔÓ¦µÄÄÚ´æ³Ø¿ØÖÆ¿éµØÖ·

+* ·µ »Ø Öµ£º³É¹¦:·µ»ØÄÚ´æ¿éµØÖ·;ʧ°Ü:ZOSS_NULL

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _DEBUG

+static T_Mem_UBPoolCtl* GetUbPoolCtrAdd(T_Mem_UBListNode *ubListNode)

+{

+    T_Mem_UBPoolCtl *pUbControlStart    = NULL;

+    T_Mem_UBPoolCtl *pUbControl         = NULL;

+    

+    UINT32 i = 0;

+    if (ubListNode == NULL)

+    {

+        return NULL;

+    }

+

+    pUbControlStart = (T_Mem_UBPoolCtl *)gMem_UBStart;

+    pUbControl      = pUbControlStart + 1;

+

+    /* ²éÕÒÄÚ´æ¿éËùÔÚµÄÄÚ´æ³Ø */

+    for (; i < gMem_UBPoolNum - 1; i++)

+    {

+        if (ubListNode < pUbControl->ubMemHeaderStart)

+        {

+            break;

+        }

+        pUbControl++;

+    }

+    pUbControl--;

+    return pUbControl;

+}

+#endif

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºUbBlockCoyCheak

+* ¹¦ÄÜÃèÊö£º¼ì²éÊÇ·ñΪÕýÈ·µÄÄÚ´æ¿éµØÖ·

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _DEBUG

+UINT32 UbBlockCoyCheak(VOID *msg_ptr, UINT32 size)

+{

+    T_Mem_UBPoolCtl *pUbControlStart    = (T_Mem_UBPoolCtl *)gMem_UBStart;

+    UINT32          status              = ZOSS_ERROR;

+

+    /* ¼ì²éÊÇ·ñÊÇUBÄڴ濽±´ */

+    if (((UINT32)msg_ptr >= (UINT32)pUbControlStart->ubBlockStart) && ((UINT32)msg_ptr < gMem_UBEnd))

+    {

+        T_Mem_UBPoolCtl     *pUbControl         = NULL;

+        UINT32              serialNum           = 0;

+        UINT32              i                   = 0;

+        T_Mem_UBListNode    *ubBlockHeaderNode  = NULL;

+

+        pUbControl = pUbControlStart + 1;

+        /*²éÕÒÄÚ´æ¿éËùÔÚµÄÄÚ´æ³Ø*/

+        for (i = 0; i < gMem_UBPoolNum - 1; i++)

+        {

+            if ((UINT32 *)msg_ptr < (UINT32 *)pUbControl->ubBlockStart)

+            {

+                break;

+            }

+            pUbControl++;

+        }

+        pUbControl--;

+        serialNum = (UINT32)(((UINT8 *)msg_ptr - 4) - (UINT8 *)pUbControl->ubBlockStart) / (4 + pUbControl->ubSize + ubBlockBorder);

+        ubBlockHeaderNode = pUbControl->ubMemHeaderStart + serialNum;

+

+        if (ubBlockHeaderNode->ubBlockHeader.isUsed)

+        {

+            UINT32 ubBlockEndAdd    = 0;

+            UINT32 blockDivid       = 0;

+            UINT32 ubBlockStart     = 0;

+            UINT32 blockHeaderAdd   = 0;

+            //UINT8 temp = 0;

+            ubBlockEndAdd = (UINT32)((CHAR *)pUbControl->ubBlockStart + serialNum * (4 + pUbControl->ubSize + ubBlockBorder) + 4 + ubBlockHeaderNode->ubBlockHeader.usingSize);

+            /*¼ì²éÊÇ·ñ¿½±´Ô½½ç*/

+            if ((UINT32)((CHAR *)msg_ptr + size) > ubBlockEndAdd)

+            {

+                /*UBÄڴ濽±´Ô½½ç*/

+                zOss_ASSERT(0);

+                return ZOSS_ERROR;

+            }

+            /*¼ì²éÄÚ´æ¿éÖÐÄÚ´æÍ·ÊÇ·ñÕýÈ·*/

+            ubBlockStart = (UINT32)(((CHAR *)ubBlockEndAdd - ubBlockHeaderNode->ubBlockHeader.usingSize) - 4);

+            memcpy(&blockHeaderAdd, ((CHAR *)ubBlockEndAdd - ubBlockHeaderNode->ubBlockHeader.usingSize) - 4, 4);

+            if ((UINT32)ubBlockHeaderNode != blockHeaderAdd)

+            {

+                /*UBÄڴ濽±´µÄÄÚ´æ¿éÖÐÄÚ´æÍ·µØÖ·´íÎó*/

+                zOss_ASSERT(0);

+                return ZOSS_ERROR;

+            }

+            /*  for ub ÀëÏ߲鿴£¬¸Ã¹¦ÄÜÔÚÐèÇóÖÐûÓÐûÓУ¬ÔÝʱעµô

+            ¼ì²éʵ¼ÊʹÓñ߽çÊÇ·ñÍêºÃ

+            if (pUbControl->ubSize - ubBlockHeaderNode->ubBlockHeader.usingSize > 0)

+            {

+                memcpy(&temp, (CHAR *)ubBlockEndAdd, 1);

+                if (temp != MEM_UB_BLOCK_REALUSED_SIGNAL)

+                {

+                    status = zOss_Printf(SUBMDL_MEM, PRINT_LEVEL_ABNORMAL, "UBÄÚ´æ%p¿½±´µÄÄÚ´æ¿éÖÐÄÚ´æ¿éʵ¼ÊʹÓÃ±ß½ç±»ÆÆ»µ\n", msg_ptr);

+                    zOss_ASSERT(0);

+                    return ZOSS_ERROR;

+                }

+            }

+            */

+            /*¼ì²éǰ¸ôÀë±ß½çÊÇ·ñÍêºÃ*/

+            if (ubBlockStart != (UINT32)pUbControlStart->ubBlockStart)

+            {

+                memcpy(&blockDivid, (CHAR *)ubBlockStart - ubBlockBorder, 4);

+                if (blockDivid != MEM_UB_BLOCK_DIVIDE_VALUE)

+                {

+                    /* UBÄڴ濽±´µÄÄÚ´æ¿éµÄǰ¸ôÀë±ß½ç±»ÆÆ»µ */

+                    zOss_ASSERT(0);

+                    return ZOSS_ERROR;

+                }

+            }

+        }

+        else

+        {

+            return ZOSS_ERROR;

+        }

+        status = status != ZOSS_SUCCESS ? ZOSS_ERROR : ZOSS_SUCCESS;

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_SUCCESS;

+    }

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºHeapDbg_Init

+* ¹¦ÄÜÃèÊö£ºheapµ÷ÊÔÐÅÏ¢³õʼ»¯

+* ²ÎÊý˵Ã÷: (IN) ÎÞ

+* ·µ »Ø Öµ£º   ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID HeapDbg_Init(VOID)

+{

+#ifdef _USE_HEAP_DEBUG

+#if defined (_OS_OSE) || defined (_OS_WIN)

+    static BOOL heapDgbInit = FALSE;

+

+    if (!heapDgbInit)

+    {

+        zOss_ListInit(&s_mem_list);

+        s_mem_mutex = zOss_CreateMutex((const CHAR*)"mem_mutex", ZOSS_INHERIT);

+        zOss_ASSERT(NULL != s_mem_mutex);

+        heapDgbInit = TRUE;

+    }

+#endif

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºMEM_Init

+* ¹¦ÄÜÃèÊö£º³õʼ»¯ÏµÍ³ÄÚ´æ·ÖÅäÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:´íÎóÂë

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 MEM_Init(VOID)

+{

+#if defined (_OS_OSE) || defined (_OS_WIN)

+    UINT32          size        = 0;

+    VOID            *ubPtr      = NULL;

+    T_OSS_PARAM     *pPlatCfg   = NULL;

+

+    /* ÈôÒѾ­³õʼ»¯£¬·µ»Ø */

+    if (gMem_IsInit)

+    {

+        return ZOSS_SUCCESS;

+    }

+

+    /* »ñÈ¡¶¯Ì¬ÅäÖòÎÊý */

+    pPlatCfg = zOss_GetOssCfg();

+

+    if (NULL == pPlatCfg)

+    {

+        return ZOSS_ERROR;

+    }

+    gMem_UBPoolCfg = pPlatCfg->MemCfg.UBPool;

+    gMem_UBPoolNum = pPlatCfg->MemCfg.ub_pool_num;

+

+    /* ¼ì²éÅäÖà */

+    if (ZOSS_SUCCESS != Mem_ValidateUBCfg())

+    {

+        gMem_ErrCode = ZOSS_MEM_UB_CFG_ERR;

+        return ZOSS_MEM_UB_CFG_ERR;

+    }

+

+    /* »ñÈ¡ÄÚ´æ³Ø×Ü´óС */

+    size = Mem_GetUBSize();

+    if (0 == size)

+    {

+        gMem_ErrCode = ZOSS_MEM_CALCU_SIZE_ERR;

+        return ZOSS_MEM_CALCU_SIZE_ERR;

+    }

+

+    /* ´Ó¶ÑÖÐÉêÇëÄÚ´æ³Ø¿Õ¼ä */

+    ubPtr = zOss_Malloc(size);

+    if (NULL == ubPtr)

+    {

+        gMem_ErrCode = ZOSS_MEM_ALLOC_HEAP_ERR;

+        return ZOSS_MEM_ALLOC_HEAP_ERR;

+    }

+

+    gMem_UBStart    = (UINT32)ubPtr;

+    gMem_UBEnd      = (UINT32)ubPtr + size;

+

+    memset(ubPtr, 0, size);

+    UB_Init();

+    gMem_IsInit = TRUE;

+#endif

+    return ZOSS_SUCCESS;

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmem_malloc

+* ¹¦ÄÜÃèÊö£º´Ó¶ÑÖзÖÅäÄÚ´æ

+* ²ÎÊý˵Ã÷£º(IN)    size:´ýÒª·ÖÅäµÄ×Ö½ÚÊý

+* ·µ »Ø Öµ£º·µ»Ø VOID ÀàÐ͵ÄÖ¸Õ룬ָÏò·ÖÅäµÄÄÚ´æ¿é£»Ê§°Ü£¬Ôò·µ»Ø ZOSS_NULL

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#if defined (_OS_OSE) || defined (_OS_WIN)

+VOID* mem_malloc(UINT32 size, const CHAR *file, UINT32 line)

+{

+#if defined _OS_OSE || defined _OS_WIN

+    UINT32          allocSize       = 0;

+#endif

+

+#ifdef _USE_HEAP_DEBUG

+    UINT32          context_size    = 0;

+    T_Mem_DebugInfo *p_mem_context  = NULL;

+    UINT32          file_name_size  = 0;

+    UINT32          *lr_save        = NULL;

+#endif

+    /* Èç¹ûÉêÇë´óСΪ0£¬ÔòÉêÇë4×Ö½Ú */

+#if defined _OS_OSE || defined _OS_WIN

+    if (0 == size)

+    {

+        allocSize = 4;

+    }

+    else

+    {

+        allocSize = size;

+    }

+#endif

+

+#ifdef _USE_HEAP_DEBUG

+    

+    mem_getLR( lr_save );

+

+    if (file != NULL)

+    {

+        file_name_size = strlen((const char *)file) + 1;

+    }

+    context_size    = sizeof(T_Mem_DebugInfo) + allocSize + MEM_MAGIC_SIZE + file_name_size;

+# ifdef _OS_OSE

+    p_mem_context   = (T_Mem_DebugInfo *)heap_alloc_shared(context_size, (const char *) file, line );

+# elif defined _OS_WIN

+    p_mem_context   = (T_Mem_DebugInfo *)calloc(1, context_size);

+# endif

+    if ( NULL == p_mem_context )

+    {

+        return NULL;

+    }

+# ifdef _OS_OSE        

+    mem_memset( p_mem_context, 0, context_size, (CHAR *)file, line );

+# endif

+    

+    p_mem_context->size                 = context_size;

+    p_mem_context->mem                  = mem_context_mem( p_mem_context );

+    p_mem_context->mem_size             = allocSize;

+    p_mem_context->uiLR                 = (UINT32)lr_save;

+    p_mem_context->tick_malloced        = zOss_GetTickCount();

+    p_mem_context->file_name_size       = file_name_size;

+    p_mem_context->file_name            = (CHAR *)mem_context_file_name( p_mem_context );

+    p_mem_context->line                 = line;

+    p_mem_context->thread_id            = zOss_GetCurThreadID();

+    *mem_context_magic(p_mem_context)   = MEM_MAGIC_NUM;

+    if (file != NULL)

+    {

+        mem_memcpy( p_mem_context->file_name, file, file_name_size, (CHAR *)file, line);

+    }

+    zOss_GetMutex(s_mem_mutex, ZOSS_WAIT_FOREVER);

+    zOss_ListAdd(&s_mem_list, (T_ZOss_Node *)p_mem_context);

+    zOss_PutMutex(s_mem_mutex);

+    

+    return p_mem_context->mem;

+#else

+

+# ifdef _OS_OSE    

+    return (VOID *)heap_alloc_shared(allocSize, (const char*)file, line);

+# elif defined _OS_WIN

+    return (VOID *)malloc(allocSize);

+# endif

+

+#endif

+

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmem_free_extend

+* ¹¦ÄÜÃèÊö£ºÊÍ·Åmem_malloc()·ÖÅäµÄÄÚ´æ

+* ²ÎÊý˵Ã÷£º(IN)    mem_ptr:´ýÒªÊͷŵÄÄÚ´æµÄµØÖ·Ö¸Õë

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#if defined (_OS_OSE) || defined (_OS_WIN)

+VOID mem_free_extend(VOID *mem_ptr, const CHAR *file, UINT32 line)

+{

+#ifdef _USE_HEAP_DEBUG

+    T_Mem_DebugInfo *p_mem_context = NULL;

+#endif

+    zOss_AssertExN(NULL != mem_ptr);

+#ifdef _USE_HEAP_DEBUG

+    p_mem_context = mem_context(mem_ptr);

+    zOss_GetMutex(s_mem_mutex, ZOSS_WAIT_FOREVER);

+    zOss_ListDelete(&s_mem_list, (T_ZOss_Node *)p_mem_context);

+    zOss_PutMutex(s_mem_mutex);

+# ifdef _OS_OSE         

+    heap_free_shared(p_mem_context);

+# elif defined _OS_WIN

+    free(p_mem_context);

+# endif

+#else

+# ifdef _OS_OSE    

+    heap_free_shared(mem_ptr);

+# elif defined _OS_WIN

+    free(mem_ptr);

+# endif

+

+#endif

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmem_re_alloc

+* ¹¦ÄÜÃèÊö£ºÎªÒ»¸öÓÃzOss_MallocÉêÇëµÄÄÚ´æÖ¸ÕëÖØÐ·ÖÅä¿Õ¼ä,²ÎÊýptrΪԭÓÐµÄ¿Õ¼äµØÖ·,newsizeÊÇÖØÐÂÉêÇëµÄµØÖ·³¤¶È

+

+* ²ÎÊý˵Ã÷£º(IN)    mem_ptr:Ô­ÓÐµÄ¿Õ¼äµØÖ·

+                    newsize:ÖØÐÂÉêÇëµÄµØÖ·³¤¶È

+* ·µ »Ø Öµ£º(OUT) VOID ÀàÐ͵ÄÖ¸Õ룬ָÏò·ÖÅäµÄÄÚ´æ¿é£»Ê§°Ü£¬Ôò·µ»Ø ZOSS_NULL

+* ÆäËü˵Ã÷£º²ÎÊýÒ»¶¨ÒªÊÇzOss_MallocÉêÇëµÄÄÚ´æÖ¸Õë

+**************************************************************************/

+#if defined (_OS_OSE) || defined (_OS_WIN)

+VOID* mem_re_alloc(VOID *mem_ptr, UINT32 new_size, const CHAR *file, UINT32 line)

+{

+#ifdef _USE_HEAP_DEBUG

+    UINT32          context_size    = 0;

+    T_Mem_DebugInfo *p_mem_context  = NULL;

+    UINT32          file_name_size  = 0;

+    UINT32          *lr_save        = NULL;

+#endif

+

+    if (NULL == mem_ptr)

+    {

+        return mem_malloc(new_size, file, line);

+    }

+    

+    if (0 == new_size)

+    {

+        mem_free_extend(mem_ptr, file, line);

+        return ZOSS_NULL;

+    }

+#ifdef _USE_HEAP_DEBUG

+    mem_getLR( lr_save );

+    if (file != NULL)

+    {

+        file_name_size = strlen((const char *)file) + 1;

+    }

+    context_size    = sizeof(T_Mem_DebugInfo) + new_size + MEM_MAGIC_SIZE + file_name_size;

+    p_mem_context   = mem_context(mem_ptr);

+    

+    zOss_GetMutex(s_mem_mutex, ZOSS_WAIT_FOREVER);

+    zOss_ListDelete(&s_mem_list, (T_ZOss_Node *)p_mem_context);

+    zOss_PutMutex(s_mem_mutex);

+    

+    p_mem_context = (T_Mem_DebugInfo *)realloc(p_mem_context, context_size);

+    if ( NULL == p_mem_context )

+    {

+        return NULL;

+    }

+    mem_memset(p_mem_context, 0, context_size, (CHAR *)file, line);

+    

+    p_mem_context->size                 = context_size;

+    p_mem_context->mem                  = mem_context_mem( p_mem_context );

+    p_mem_context->mem_size             = new_size;

+    p_mem_context->uiLR                 = (UINT32)lr_save;

+    p_mem_context->tick_malloced        = zOss_GetTickCount();

+    p_mem_context->file_name_size       = file_name_size;

+    p_mem_context->file_name            = (CHAR *)mem_context_file_name( p_mem_context );

+    p_mem_context->line                 = line;

+    p_mem_context->thread_id            = zOss_GetCurThreadID();

+    *mem_context_magic(p_mem_context)   = MEM_MAGIC_NUM;

+    if (file!= NULL)

+    {

+        mem_memcpy( p_mem_context->file_name, file, file_name_size, (CHAR *)file, line);

+    }

+    zOss_GetMutex(s_mem_mutex, ZOSS_WAIT_FOREVER);

+    zOss_ListAdd(&s_mem_list, (T_ZOss_Node *)p_mem_context);

+    zOss_PutMutex(s_mem_mutex);

+    

+    return p_mem_context->mem;

+#else

+    return realloc(mem_ptr, new_size);

+#endif

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetSysMemInfo

+* ¹¦ÄÜÃèÊö£º²éѯϵͳÄÚ´æ·ÖÅä»ù±¾ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)ÓÃÓڴ洢ϵͳÄÚ´æ·ÖÅä»ù±¾ÐÅÏ¢µÄT_Mem_MemData½á¹¹

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:·µ»Ø´íÎóÂë

+* ÆäËü˵Ã÷: ÊÊÓÃÓÚdebug°æ±¾

+**************************************************************************/

+#ifdef _OS_OSE

+UINT32 zOss_GetSysMemInfo(T_Mem_MemInfo *mem_info)

+{

+    struct HeapListRequest      *pHeapListReq           = NULL;

+    struct HeapListReply        *pHeapListReply         = NULL;

+    const SIGSELECT             HeapListReplySig[]      = {1, HEAP_LIST_REPLY};

+    PROCESS                     HeapPid                 = 0;

+    UINT32                      LoopCnt                 = 0;

+    UINT32                      HeapMaxSize             = 0;

+    UINT32                      RamSize                 = 0;

+    struct HeapStatsExRequest   *pHeapStatsExReq        = NULL;

+    struct HeapStatsExReply     *pHeapStatsExReply      = NULL;

+    const SIGSELECT             HeapStatsExReplySig[]   = {1, HEAP_STATSEX_REPLY};

+    

+    zOss_AssertEx(NULL != mem_info, ZOSS_MEM_NULL_PARAM_ERR);

+    mem_info->nMemTotal = 0;

+    mem_info->nMemUsed  = 0;

+

+    hunt("ose_heapd", 0, &HeapPid, NULL);

+    if (HeapPid == 0)

+    {

+        return ZOSS_ERROR;

+    }

+

+    pHeapListReq = (struct HeapListRequest *)alloc(sizeof(struct HeapListRequest), HEAP_LIST_REQUEST);

+    if (pHeapListReq == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+

+    send((union SIGNAL **)&pHeapListReq, HeapPid);

+    pHeapListReply = (struct HeapListReply *)receive(HeapListReplySig);

+    if (pHeapListReply->status != HEAP_SUCCESS)

+    {

+        free_buf((union SIGNAL **)&pHeapListReply);

+        return ZOSS_ERROR;

+    }

+    pHeapStatsExReply = (struct HeapStatsExReply *)alloc(sizeof(struct HeapStatsExReply), HEAP_STATSEX_REPLY);

+    if (pHeapStatsExReply == NULL)

+    {

+        free_buf((union SIGNAL **)&pHeapListReply);

+        return ZOSS_ERROR;

+    }

+    for (LoopCnt = 0; LoopCnt < pHeapListReply->num_heaps; LoopCnt++)

+    {

+        pHeapStatsExReq         = (struct HeapStatsExRequest *)pHeapStatsExReply;

+        pHeapStatsExReq->sigNo  = HEAP_STATSEX_REQUEST;

+        pHeapStatsExReq->href   = pHeapListReply->heaps[LoopCnt].href;

+        

+        send((union SIGNAL **)&pHeapStatsExReq, HeapPid);

+        

+        pHeapStatsExReply = (struct HeapStatsExReply *)receive(HeapStatsExReplySig);

+

+        if (pHeapStatsExReply->status != HEAP_SUCCESS)

+        {

+            free_buf((union SIGNAL **)&pHeapListReply);

+            free_buf((union SIGNAL **)&pHeapStatsExReply);

+            return ZOSS_ERROR;

+        }

+

+        mem_info->nMemTotal += pHeapStatsExReply->total_used + pHeapStatsExReply->total_free;

+        mem_info->nMemUsed  += pHeapStatsExReply->total_used;

+    }

+

+    free_buf((union SIGNAL **)&pHeapListReply);

+    free_buf((union SIGNAL **)&pHeapStatsExReply);

+    sysparam_readattr_long("krn/log_mem/RAM", "size", (long *)&RamSize);

+    sysparam_readattr_long("heap", "max_size", (long *)&HeapMaxSize);

+    

+    HeapMaxSize         = HeapMaxSize > RamSize ? RamSize : HeapMaxSize;

+    mem_info->nMemTotal = mem_info->nMemTotal < HeapMaxSize ? HeapMaxSize : mem_info->nMemTotal;

+    return ZOSS_SUCCESS;

+}

+#elif defined _OS_WIN

+UINT32 zOss_GetSysMemInfo(T_Mem_MemInfo *mem_info)

+{

+#ifdef _DEBUG

+    zOss_AssertEx(NULL != mem_info, ZOSS_MEM_NULL_PARAM_ERR);

+

+    mem_info->nMemTotal = 0;

+    mem_info->nMemUsed  = 0;

+

+    return ZOSS_SUCCESS;

+#else

+    return ZOSS_ERROR;

+#endif

+}

+#elif defined _OS_TOS

+UINT32 zOss_GetSysMemInfo(T_Mem_MemInfo *mem_info)

+{

+    struct mallinfo heap_info = {0};

+

+    zOss_AssertEx(mem_info != NULL, ZOSS_ERROR);

+    

+    heap_info = mallinfo();

+    mem_info->nMemTotal = (UINT32)heap_info.arena;

+    mem_info->nMemUsed  = (UINT32)heap_info.uordblks;

+    mem_info->nMemMaxFree  = (UINT32)heap_info.maxfree;

+	

+    return ZOSS_SUCCESS;

+}

+

+VOID zOss_GetMallInfoForT32(VOID)

+{  

+    struct mallinfo heap_info = mallinfo();

+

+    g_zOss_HeapInfo.nMemTotal   = (UINT32)heap_info.arena;

+    g_zOss_HeapInfo.nMemUsed    = (UINT32)heap_info.uordblks;

+    g_zOss_HeapInfo.nMemMaxFree = (UINT32)heap_info.maxfree;

+

+    while (1)

+        ;

+}

+#endif

+

+#ifdef _OS_TOS

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡¶ÑÄÚ´æµÄʹÓÃÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  pMonHeapInfo:   ¶ÑÄÚ´æÊ¹ÓÃÐÅÏ¢µÄ´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID z0ss_GetHeapInfo(T_ZOss_Mon_Heap *pMonHeapInfo)

+{

+#ifdef _USE_MONITOR

+    T_Mem_MemInfo memInfo = {0};

+

+    if (pMonHeapInfo)

+    {

+        zOss_GetSysMemInfo(&memInfo);

+        pMonHeapInfo->base = tos_heap_vma_start();

+        pMonHeapInfo->size = memInfo.nMemTotal;

+        pMonHeapInfo->used = memInfo.nMemUsed;

+    }

+#endif

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºMem_GetSysMemDebugInfo

+* ¹¦ÄÜÃèÊö£º²éѯϵͳÄÚ´æ·ÖÅäÏêϸÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)ÓÃÓڴ洢ϵͳÄÚ´æ·ÖÅäÏêϸÐÅÏ¢µÄLIST½á¹¹

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£ºÊÊÓÃÓÚdebug°æ±¾

+**************************************************************************/

+UINT32 Mem_GetSysMemDebugInfo(T_ZOss_List *mem_debug_info_lst)

+{

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmem_getub

+* ¹¦ÄÜÃèÊö£º´ÓÄÚ´æ³ØÖзÖÅäÄÚ´æ

+* ²ÎÊý˵Ã÷£º(IN)    size:´ýÒª·ÖÅäµÄ×Ö½ÚÊý

+* ·µ »Ø Öµ£º·µ»Ø VOID ÀàÐ͵ÄÖ¸Õ룬ָÏò·ÖÅäµÄÄÚ´æ¿é£»Ê§°Ü£¬Ôò·µ»Ø ZOSS_NULL

+* ÆäËü˵Ã÷£ºÖ÷ÒªÓÃÓÚÏûϢͨѶ

+**************************************************************************/

+#if defined (_OS_OSE) || defined (_OS_WIN)

+VOID *mem_getub(UINT32 size, const CHAR *file, UINT32 line)

+{

+    T_Mem_UBPoolCtl     *pUbControlStart    = NULL;

+    T_Mem_UBPoolCtl     *pUbControl         = NULL;

+    T_Mem_UBListNode    *pUbListNode        = NULL;

+    ZOSS_UB_BLOCK       freeUbBlock         = NULL;    

+    

+    UINT32  i           = 0;

+    UINT32  pool_num    = 0;

+#ifdef _OS_OSE

+    Msr     oldMsr      = 0;

+#ifdef _DEBUG

+    T_ZOsa_ThreadUserArea *pUa = NULL;

+#endif

+#elif defined _OS_WIN

+    UINT32  status      = ZOSS_ERROR;

+#ifdef _DEBUG

+    T_ZOss_TCB  *pTCB   = NULL;

+#endif

+#endif

+

+    /* Èë²Î¼ì²é */

+    if (0 == size || size > gMem_UBPoolCfg[gMem_UBPoolNum - 1].pool_size)

+    {

+        zOss_ASSERT(size > 0);

+        zOss_ASSERT(size <= gMem_UBPoolCfg[gMem_UBPoolNum - 1].pool_size);

+        gMem_ErrCode = ZOSS_MEM_GETUB_SIZE_ERR;

+        return ZOSS_NULL;

+    }

+

+    /* ÄÚ´æ³ØÎ´³õʼ»¯£¬·µ»Ø */

+    zOss_ASSERT(gMem_IsInit);

+

+    if (!gMem_IsInit)

+    {

+        gMem_ErrCode = ZOSS_MEM_NOT_INIT_ERR;

+        return ZOSS_NULL;

+    }

+

+    /* ¸ù¾ÝÈë²Î¼ÆËãÄÚ´æ³ØºÅ,²ÉÓöþ·Ö·¨ */

+    for (i = 0; i < gMem_UBPoolNum; i++)

+    {

+        if (gMem_UBPoolCfg[i].pool_size >= size)

+        {

+            pool_num = i;

+            break;

+        }

+    }

+

+    /* ÄÚ´æ³Ø¿ØÖÆ¿éÆðʼµØÖ· */

+    pUbControlStart = (T_Mem_UBPoolCtl *)gMem_UBStart;

+    /* »ñµÃ¶ÔÓ¦ÄÚ´æ³ØµÄÄÚ´æ³Ø¿ØÖÆ¿é */

+    pUbControl      = pUbControlStart + pool_num;

+

+#ifdef _OS_OSE

+    LOCK_SAVE(oldMsr);

+#elif defined _OS_WIN

+    status          = zOss_GetMutex(pUbControl->ubMutex, ZOSS_WAIT_FOREVER);    /* »¥³âÌå±£»¤                     */

+    zOss_AssertEx(status != ZOSS_ERROR, ZOSS_NULL);

+#endif    

+

+    /* ÅжϸÃÄÚ´æ³ØÊÇ·ñ»¹ÓпÕÏÐÄÚ´æ¿é */

+    if (pUbControl->freeUbListHead == NULL) /* ÎÞ¿ÕÏÐÄÚ´æ¿é£¬ÔòʹÓÃmalloc½øÐÐÉêÇë */

+    {

+#ifdef _OS_OSE    

+        LOCK_RESTORE(oldMsr);

+#elif defined _OS_WIN

+        if (0!= gUBSuperviseSitch)  /* vc °æ±¾Èôubй¶Ôòµ÷Óøú¯Êý½øÐнâÎö¿´ÓÐÎÞй¶Çé¿ö */

+        {

+            OSA_UBLeakInfo(pool_num);

+        }

+        status = zOss_PutMutex(pUbControl->ubMutex);

+        zOss_AssertEx(status != ZOSS_ERROR, ZOSS_NULL);

+#endif 

+        freeUbBlock = mem_malloc(size, file, line);

+        return freeUbBlock;

+    }

+    pUbListNode = pUbControl->freeUbListHead;

+

+    /* дÈëʵ¼ÊʹÓñ߽ç */

+    freeUbBlock = GetUbBlockAdd(pUbControl, pUbListNode);

+#ifdef _OS_OSE    

+    if (freeUbBlock == ZOSS_NULL)

+    {

+        LOCK_RESTORE(oldMsr);

+        zOss_ASSERT(freeUbBlock);

+        return freeUbBlock;

+    }

+#endif    

+    pUbControl->freeUbNum--;

+#ifdef _DEBUG

+    /* for ub ÀëÏ߲鿴£¬¸Ã¹¦ÄÜÔÚÐèÇóÖÐûÓÐûÓУ¬ÔÝʱעµô

+    if (pUbControl->ubSize - size >=1)

+    {

+        memset((CHAR *)freeUbBlock + size, MEM_UB_BLOCK_REALUSED_SIGNAL, 1);

+    }

+    */

+    /* ¸üÐÂʹÓÃÄÚ´æ¿é×î´óÊý */

+    pUbControl->maxUsedUbNum = (pUbControl->maxUsedUbNum < (pUbControl->ubBlockNum - pUbControl->freeUbNum)) ? (pUbControl->ubBlockNum - pUbControl->freeUbNum) : pUbControl->maxUsedUbNum;

+

+#endif

+    /* ½«Á´±í½áµã´Ó¿ÕÏÐÄÚ´æ¿éÁ´±íÕª³ý */

+    if (pUbControl->freeUbListHead == pUbControl->freeUbListTail)

+    {

+        /* ÓÐÇÒ½öÓÐÒ»¿é¿ÕÏÐ */

+        pUbControl->freeUbListHead  = NULL;

+        pUbControl->freeUbListTail  = NULL;

+        pUbListNode->nextNode       = NULL;

+    }

+    else

+    {

+        pUbControl->freeUbListHead  = pUbControl->freeUbListHead->nextNode;

+        pUbListNode->nextNode       = NULL;

+    }

+#ifdef _OS_OSE    

+    /* ÊÍ·Å»¥³âÁ¿ */

+    LOCK_RESTORE(oldMsr);

+#elif defined _OS_WIN

+    status = zOss_PutMutex(pUbControl->ubMutex);

+    zOss_AssertEx(status != ZOSS_ERROR, ZOSS_NULL);

+#endif    

+

+    /* ±ê¼ÇÄÚ´æÍ·ÐÅÏ¢ */

+#ifdef _DEBUG

+    if (0 != gUBSuperviseSitch)

+    {

+#ifdef _OS_OSE    

+        /* ÐÞ¸ÄÏ̺߳ÍÈÎÎñUA */

+        pUa = Osa_GetThreadUserArea(zOss_GetCurThreadID(), FALSE);

+        if (pUa != NULL)

+        {

+            pUa ->ubsize += pUbControl->ubSize;

+

+            if (pUa->curtaskid != NULL)

+            {

+                ((T_ZOss_TCB *)pUa->curtaskid)->ub_size += pUbControl->ubSize;

+            }

+            pUbListNode->ubBlockHeader.taskId   = pUa->curtaskid;

+            pUbListNode->ubBlockHeader.threadId = pUa->threadid;

+        }

+        else

+        {

+            pUbListNode->ubBlockHeader.taskId   = zOss_GetSelfTaskID();

+            pUbListNode->ubBlockHeader.threadId = zOss_GetCurThreadID();

+        }

+#elif defined _OS_WIN

+        pUbListNode->ubBlockHeader.taskId           = zOss_GetSelfTaskID();

+        pUbListNode->ubBlockHeader.threadId         = zOss_GetCurThreadID();

+#endif        

+        pUbListNode->ubBlockHeader.line             = line;

+        pUbListNode->ubBlockHeader.applyTimeTick    = zOss_GetTickCount();

+        

+        strncpy((char *)pUbListNode->ubBlockHeader.name, (char *)Mem_SubStr((CHAR *)file), ZOSS_UBHEAD_FILENAME_LEN + 1);

+

+        pUbListNode->ubBlockHeader.name[ZOSS_UBHEAD_FILENAME_LEN] = 0;

+

+#ifdef _OS_WIN

+        /* ÐÞ¸ÄÏ̺߳ÍÈÎÎñUA */

+        pTCB = (T_ZOss_TCB *)(pUbListNode->ubBlockHeader.taskId);

+        if (NULL != pTCB)

+        {

+            pTCB->ub_size += pUbControl->ubSize;

+        }

+#endif        

+    }

+#endif

+

+    pUbListNode->ubBlockHeader.usingSize    = size;

+    pUbListNode->ubBlockHeader.isUsed       = TRUE;

+    /* ·µ»ØÄÚ´æ¿éµØÖ· */

+    return freeUbBlock;

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RetUB

+* ¹¦ÄÜÃèÊö£º¶ÔÓ¦zOss_GetUB£¬ÊͷŸÃÄÚ´æ¿é

+* ²ÎÊý˵Ã÷£º(IN) msg_ptr:´ýÒªÊͷŵÄÄÚ´æµÄµØÖ·Ö¸Õë

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:·µ»Ø´íÎóÂë

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#if defined (_OS_OSE) || defined (_OS_WIN)

+UINT32 mem_retub(VOID * msg_ptr, const CHAR *file, UINT32 line)

+{

+    UINT32              serialNum           = 0;

+    UINT32              i                   = 0;

+    //UINT32              ubBlockAdd          = 0;

+    T_Mem_UBPoolCtl     *pUbControlStart    = NULL;

+    T_Mem_UBPoolCtl     *pUbControl         = NULL;

+    T_Mem_UBListNode    *ubBlockHeaderNode  = NULL;

+#ifdef _OS_WIN

+    UINT32              status              = ZOSS_ERROR;

+#endif

+    

+#ifdef _OS_OSE

+    Msr                     oldMsr  = 0;

+#ifdef _DEBUG

+    T_ZOsa_ThreadUserArea   *pUa    = NULL;

+#endif

+#endif   

+

+#ifdef _DEBUG

+    UINT32                  blockDivid      = 0;

+    T_ZOss_TCB              *pTCB           = NULL;

+    UINT32                  blockHeaderAdd  = 0;

+#endif

+    /* Èë²Î¼ì²é */

+    zOss_AssertEx(NULL != msg_ptr, ZOSS_MEM_NULL_PARAM_ERR);

+    zOss_AssertEx(gMem_IsInit, ZOSS_MEM_NOT_INIT_ERR);

+

+    /* ÄÚ´æ³Ø¿ØÖÆ¿éÆðʼµØÖ· */

+    pUbControlStart = (T_Mem_UBPoolCtl *)gMem_UBStart;

+

+    /* ¼ì²éÖ¸Õ뷶ΧÅжÏÊÇubÉêÇ뻹ÊÇmallocÉêÇëµÄÖ¸Õë */

+    if (((UINT32)msg_ptr < (UINT32)pUbControlStart->ubBlockStart) || ((UINT32)msg_ptr > gMem_UBEnd))

+    {

+        mem_free_extend(msg_ptr, file, line);

+        return ZOSS_SUCCESS;

+    }

+    pUbControl = pUbControlStart + 1;

+

+    /* ²éÕÒÄÚ´æ¿éËùÔÚµÄÄÚ´æ³Ø */

+    for (i = 0; i < gMem_UBPoolNum - 1; i++)

+    {

+        if ((UINT32 *)msg_ptr < (UINT32 *)pUbControl->ubBlockStart)

+        {

+            break;

+        }

+        pUbControl++;

+    }

+    pUbControl--;

+

+    /* ¼ì²éÊÇ·ñΪÕýÈ·µÄÄÚ´æ¿éµØÖ· */

+    if (((UINT32)msg_ptr - (4 + (UINT32)pUbControl->ubBlockStart)) % (4 + pUbControl->ubSize + ubBlockBorder) != 0)

+    {

+        /* ÊͷŵÄÖ¸Õë´íÎó£¬Ô­Òò¿ÉÄÜÊÇÕâ¸öÖ¸ÕëÔÚʹÓùý³ÌÖб»Æ«ÒÆ */

+        /* ÕýÈ·µÄÄÚ´æ¿éµØÕýÈ·µÄµØÖ·ÎªÏÂÃæµÄµØÖ· */

+        //ubBlockAdd = (UINT32)((CHAR *)pUbControl->ubBlockStart + i * (pUbControl->ubSize + 4 + ubBlockBorder) + 4);

+        zOss_Printf(SUBMDL_MEM, PRINT_LEVEL_ABNORMAL, "ÊͷŵÄÖ¸Õë´íÎó£¬Ô­Òò¿ÉÄÜÊÇÕâ¸öÖ¸ÕëÔÚʹÓùý³ÌÖб»Æ«ÒÆ,Îļþ:%s  ÐкÅ:%d\n", file, line);

+        zOss_ASSERT(0);

+        return ZOSS_MEM_POINTER_RANGE_ERR;

+

+    }

+    serialNum           = ((UINT32)msg_ptr - (4 + (UINT32)pUbControl->ubBlockStart)) / (4 + pUbControl->ubSize + ubBlockBorder);

+    ubBlockHeaderNode   = pUbControl->ubMemHeaderStart + serialNum;

+    //ubBlockHeader = (T_Mem_UBListNode *)((CHAR *)msg_ptr - 4);

+    /* ¼ì²éÊÇ·ñÖØ¸´ÊÍ·Å */

+    zOss_AssertEx(ubBlockHeaderNode->ubBlockHeader.isUsed, ZOSS_MEM_UB_REFREE_ERR);

+

+#ifdef _DEBUG

+    if (0 != gUBSuperviseSitch)

+    {

+        /* ¼ì²éÄÚ´æ¿éÖеÄÄÚ´æÍ·ÊÇ·ñÓëʵ¼ÊÄÚ´æÍ·µØÖ·Ïàͬ */

+        memcpy(&blockHeaderAdd, (CHAR *)msg_ptr - 4, 4);

+        if (blockHeaderAdd != (UINT32)ubBlockHeaderNode)

+        {

+            /* ÄÚ´æ¿é¸ôÀë±ß½ç±»¸Ä £¬Ô­Òò¿ÉÄÜÊÇÉÏÒ»¿éÄÚ´æ¿é²Ù×÷Ô½½ç */

+            zOss_Printf(SUBMDL_MEM, PRINT_LEVEL_ABNORMAL, "ÄÚ´æ¿é¸ôÀë±ß½ç±»¸Ä £¬Ô­Òò¿ÉÄÜÊÇÉÏÒ»¿éÄÚ´æ¿é²Ù×÷Ô½½ç,Îļþ:%s  ÐкÅ:%d\n", file, line);

+            zOss_ASSERT(0);

+            return ZOSS_MEM_UB_OVERFLOW_ERR;

+        }

+        /* ¼ì²éÄÚ´æ³ØÊµ¼ÊʹÓñ߽ç */

+        /* for ub ÀëÏ߲鿴£¬¸Ã¹¦ÄÜÔÚÐèÇóÖÐûÓÐûÓУ¬ÔÝʱעµô

+        if (pUbControl->ubSize - ubBlockHeaderNode->ubBlockHeader.usingSize > 0)

+        {

+            memcpy(&temp, (CHAR *)msg_ptr + ubBlockHeaderNode->ubBlockHeader.usingSize, 1);

+            if (temp != MEM_UB_BLOCK_REALUSED_SIGNAL)

+            {

+                status = zOss_Printf(SUBMDL_MEM, PRINT_LEVEL_ABNORMAL, "ÄÚ´æÊµ¼ÊʹÓñ߽类¸Ä £¬Ô­Òò¿ÉÄÜÊDzÙ×÷Ô½½ç,Îļþ:%s  ÐкÅ:%d\n", file, line);

+                zOss_ASSERT(0);

+                return ZOSS_MEM_UB_OVERFLOW_ERR;

+            }

+        }

+        */

+        /* ¼ì²éÄÚ´æ¿é¸ôÀë±ß½ç */

+        if ((UINT32)((CHAR *)msg_ptr - 4) != (UINT32)pUbControlStart->ubBlockStart)

+        {

+            memcpy(&blockDivid, ((CHAR *)msg_ptr - 4) - ubBlockBorder, 4);

+            if (blockDivid != MEM_UB_BLOCK_DIVIDE_VALUE)

+            {

+                /* ÄÚ´æ¿é¸ôÀë±ß½ç±»¸Ä £¬Ô­Òò¿ÉÄÜÊÇÉÏÒ»¿éÄÚ´æ¿é²Ù×÷Ô½½ç */

+                zOss_Printf(SUBMDL_MEM, PRINT_LEVEL_ABNORMAL, "ÄÚ´æÊµ¼ÊʹÓñ߽类¸Ä £¬Ô­Òò¿ÉÄÜÊDzÙ×÷Ô½½ç,Îļþ:%s  ÐкÅ:%d\n", file, line);

+                zOss_ASSERT(0);

+                return ZOSS_MEM_UB_OVERFLOW_ERR;

+            }

+        }

+    }

+#endif

+

+    /* Çå³ýʵ¼ÊʹÓñê¼Ç */

+#ifdef _DEBUG

+    if (0 != gUBSuperviseSitch)

+    {

+        if (pUbControl->ubSize - ubBlockHeaderNode->ubBlockHeader.usingSize > 0)

+        {

+            memset((CHAR *)msg_ptr + ubBlockHeaderNode->ubBlockHeader.usingSize, 0, 1);

+        }

+        /* ÐÞ¸ÄÏ̺߳ÍÈÎÎñUA */

+        pTCB = (T_ZOss_TCB *)(ubBlockHeaderNode->ubBlockHeader.taskId);

+        if (NULL != pTCB)

+        {

+            pTCB->ub_size -= pUbControl->ubSize;

+        }

+#ifdef _OS_OSE        

+        if (NULL != ubBlockHeaderNode->ubBlockHeader.threadId)

+        {

+            pUa = Osa_GetThreadUserArea(ubBlockHeaderNode->ubBlockHeader.threadId, FALSE);

+            if (pUa != NULL)

+            {

+                pUa->ubsize -= pUbControl->ubSize;

+            }

+        }

+#endif        

+    }

+#endif

+

+#ifdef _OS_OSE

+    LOCK_SAVE(oldMsr);

+#elif defined _OS_WIN

+    status = zOss_GetMutex(pUbControl->ubMutex, ZOSS_WAIT_FOREVER);   /* »¥³âÌå±£»¤ */

+    zOss_AssertEx(status != ZOSS_ERROR, ZOSS_ERROR);

+#endif    

+

+    /* ÐÞ¸ÄÄÚ´æÍ· */

+    ubBlockHeaderNode->ubBlockHeader.isUsed = FALSE;

+    /* ¸üпÕÏÐÄÚ´æ¿éÊý */

+    pUbControl->freeUbNum++;

+    /* ¸Ã½áµã¹ÒÈë¿ÕÏÐÁ´±í±íβ */

+    if (pUbControl->freeUbListTail == NULL)

+    {

+        pUbControl->freeUbListTail  = ubBlockHeaderNode;

+        pUbControl->freeUbListHead  = ubBlockHeaderNode;

+        ubBlockHeaderNode->nextNode = NULL;

+    }

+    else

+    {

+        pUbControl->freeUbListTail->nextNode    = ubBlockHeaderNode;

+        ubBlockHeaderNode->nextNode             = NULL;

+        pUbControl->freeUbListTail              = ubBlockHeaderNode;

+    }

+#ifdef _OS_OSE    

+    /* ÊÍ·Å»¥³âÌå */

+    LOCK_RESTORE(oldMsr);

+#elif defined _OS_WIN

+    status = zOss_PutMutex(pUbControl->ubMutex);

+    zOss_AssertEx(status != ZOSS_ERROR, ZOSS_ERROR);

+#endif    

+

+    return ZOSS_SUCCESS;

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºMem_GetUBUseInfo

+* ¹¦ÄÜÃèÊö£º²éѯÄÚ´æ³ØÍ³¼ÆÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)ÓÃÓÚ´æ´¢ÄÚ´æ³ØÍ³¼ÆÐÅÏ¢µÄT_Mem_UBPoolGrpInfo½á¹¹

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£ºÊÊÓÃÓÚdebug°æ±¾

+**************************************************************************/

+UINT32 Mem_GetUBUseInfo(T_Mem_UBPoolGrpInfo *ub_pool_grp_info, UINT8 poolNum)

+{

+#if defined (_OS_OSE) || defined (_OS_WIN)

+#ifdef _DEBUG

+    UINT8           i           = 0;

+    T_Mem_UBPoolCtl *pUbControl = NULL;

+    if (0 != gUBSuperviseSitch)

+    {

+        zOss_AssertEx(NULL != ub_pool_grp_info, ZOSS_MEM_NULL_PARAM_ERR);

+        zOss_AssertEx(gMem_IsInit, ZOSS_MEM_NOT_INIT_ERR);

+        

+        //*ub_pool_grp_info = gMem_UBPoolGrpInfo;

+        pUbControl                  = (T_Mem_UBPoolCtl *)gMem_UBStart;

+        ub_pool_grp_info->pool_num  = (UINT8)gMem_UBPoolNum;

+

+        zOss_AssertEx(gMem_UBPoolNum <= ZOSS_UB_MAX_POOLNUM, ZOSS_ERROR);

+

+        for (i = 0; i < gMem_UBPoolNum; i++)

+        {

+            ub_pool_grp_info->pool_info[i].pool_size        = pUbControl->ubSize;

+            ub_pool_grp_info->pool_info[i].total_block_num  = (UINT16)pUbControl->ubBlockNum;

+            ub_pool_grp_info->pool_info[i].free_block_num   = (UINT16)pUbControl->freeUbNum;

+            ub_pool_grp_info->pool_info[i].peak_value       = pUbControl->maxUsedUbNum;

+            pUbControl++;

+        }

+

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#else

+    return ZOSS_SUCCESS;

+#endif

+#else 

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºMem_CheckUBLeak

+* ¹¦ÄÜÃèÊö£ºÔÚÄÚ´æ³ØÖвéÕÒÄÚ´æÐ¹Â¶ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)    ub_leak_info:ÓÃÓÚ´æ´¢ÄÚ´æ³ØÖÐÄÚ´æÐ¹Â¶ÐÅÏ¢µÄT_Mem_UBLeakInfo½á¹¹

+                    ub_leak_time:ÉèÖÃÅж¨ÄÚ´æÐ¹Â¶Ê±¼ä

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£ºÊÊÓÃÓÚdebug°æ±¾

+**************************************************************************/

+UINT32 Mem_CheckUBLeak(T_Mem_UBLeakInfo *ub_leak_info, UINT32 ub_leak_time, UINT8 poolNum, UINT32 size)

+{

+#if defined (_OS_OSE) || defined (_OS_WIN)

+#ifdef _DEBUG

+    UINT16              ubLeakNum           = 0;

+    UINT32              now_time            = 0;

+    T_Mem_UBPoolCtl     *pUbControlStart    = NULL;

+    T_Mem_UBPoolCtl     *pUbControl         = NULL;

+    T_Mem_UBListNode    *ubBlockHeaderStart = NULL;

+    T_Mem_UBListNode    *ubBlockHeaderNode  = NULL;

+    if (0 != gUBSuperviseSitch)

+    {

+        zOss_AssertEx(NULL != ub_leak_info, ZOSS_MEM_NULL_PARAM_ERR);

+        zOss_AssertEx(gMem_IsInit, ZOSS_MEM_NOT_INIT_ERR);

+        

+        /* ÄÚ´æ³Ø¿ØÖÆ¿éÆðʼµØÖ· */

+        pUbControlStart = (T_Mem_UBPoolCtl *)gMem_UBStart;

+        /* »ñÈ¡µ±Ç°Ê±¼ä(tick) */

+        now_time = zOss_GetTickCount();

+        /* ÄÚ´æÍ·µÄÆðʼµØÖ· */

+        ubBlockHeaderStart  = pUbControlStart->ubMemHeaderStart;

+        ubBlockHeaderNode   = ubBlockHeaderStart;

+        /* ÄÚ´æÐ¹Â¶ÊýÄ¿ÖÃ0 */

+        ub_leak_info->ub_leak_num = 0;

+

+        while (ubLeakNum < MEM_MAX_LEAK_UB)

+        {

+            if ((UINT32)ubBlockHeaderNode == (UINT32)pUbControlStart->ubBlockStart)

+                break;

+            if ((ubBlockHeaderNode->ubBlockHeader.isUsed) && (ubBlockHeaderNode->ubBlockHeader.usingSize>size))

+            {

+                if ((now_time - ubBlockHeaderNode->ubBlockHeader.applyTimeTick) > ub_leak_time*1000)

+                {

+                    ub_leak_info->ubHeadInfo[ubLeakNum].applyTimeTick   = ubBlockHeaderNode->ubBlockHeader.applyTimeTick;

+                    ub_leak_info->ubHeadInfo[ubLeakNum].line            = ubBlockHeaderNode->ubBlockHeader.line;

+                    

+                    strncpy((char *)ub_leak_info->ubHeadInfo[ubLeakNum].name, 

+                            (char *)ubBlockHeaderNode->ubBlockHeader.name, 

+                            ZOSS_UBHEAD_FILENAME_LEN);

+                    

+                    ub_leak_info->ubHeadInfo[ubLeakNum].name[ZOSS_UBHEAD_FILENAME_LEN]  = 0;

+                    ub_leak_info->ubHeadInfo[ubLeakNum].taskId                          = ubBlockHeaderNode->ubBlockHeader.taskId;

+                    ub_leak_info->ubHeadInfo[ubLeakNum].threadId                        = ubBlockHeaderNode->ubBlockHeader.threadId;

+                    ub_leak_info->ubHeadInfo[ubLeakNum].usingSize                       = ubBlockHeaderNode->ubBlockHeader.usingSize;

+                    pUbControl                                                          = GetUbPoolCtrAdd(ubBlockHeaderNode);

+                    zOss_AssertEx(pUbControl != NULL, ZOSS_ERROR);

+                    ub_leak_info->ubHeadInfo[ubLeakNum].ubBlock                         = GetUbBlockAdd(pUbControl, ubBlockHeaderNode);

+                    ub_leak_info->ubHeadInfo[ubLeakNum].ubBlockSize                     = pUbControl->ubSize;

+                    ubLeakNum++;

+                }

+            }

+            ubBlockHeaderNode++;

+        }

+        ub_leak_info->ub_leak_num = ubLeakNum;

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#else

+    return ZOSS_SUCCESS;

+#endif

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºMem_ThreadUBInfo

+* ¹¦ÄÜÃèÊö£ºÔÚÄÚ´æ³ØÖвéÕÒͬһÏß³ÌÉêÇëµÄUBÄÚ´æ¿éÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+*           threadId: Ïß³ÌID

+*           num: Ï£Íû²éѯÄÚ´æ¿éµÄ×î´óÊýÄ¿

+*           poolNum:²éѯµÄÄÚ´æ³ØºÅ

+*           (OUT)

+*           threadUbInfo:²éѯµ½µÄÄÚ´æ¿éÐÅÏ¢

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£ºÊÊÓÃÓÚdebug°æ±¾

+**************************************************************************/

+UINT32 Mem_ThreadUBInfo(ZOSS_THREAD_ID threadId, T_Mem_UBBlockInfo *threadUbInfo, UINT32 num, UINT8 poolNum)

+{

+#if defined (_OS_OSE) || defined (_OS_WIN)

+#ifdef _DEBUG

+    UINT32              threadUbNum         = 0;

+    T_Mem_UBPoolCtl     *pUbControlStart    = NULL;

+    T_Mem_UBPoolCtl     *pUbControl         = NULL;

+    T_Mem_UBListNode    *ubBlockHeaderStart = NULL;

+    T_Mem_UBListNode    *ubBlockHeaderNode  = NULL;

+

+    if (0 != gUBSuperviseSitch)

+    {

+        zOss_AssertEx((NULL != threadUbInfo) && (num != 0), ZOSS_MEM_NULL_PARAM_ERR);

+        zOss_AssertEx(gMem_IsInit, ZOSS_MEM_NOT_INIT_ERR);

+  

+        /* ÄÚ´æ³Ø¿ØÖÆ¿éÆðʼµØÖ· */

+        pUbControlStart     = (T_Mem_UBPoolCtl *)gMem_UBStart;

+        /* ÄÚ´æÍ·µÄÆðʼµØÖ· */

+        ubBlockHeaderStart  = pUbControlStart->ubMemHeaderStart;

+        ubBlockHeaderNode   = ubBlockHeaderStart;

+

+        while (threadUbNum < num)

+        {

+            if ((UINT32)ubBlockHeaderNode == (UINT32)pUbControlStart->ubBlockStart)

+            {

+                break;

+            }

+            if (ubBlockHeaderNode->ubBlockHeader.isUsed)

+            {

+                if (ubBlockHeaderNode->ubBlockHeader.threadId == threadId)

+                {

+                    threadUbInfo->applyTimeTick                     = ubBlockHeaderNode->ubBlockHeader.applyTimeTick;

+                    threadUbInfo->line                              = ubBlockHeaderNode->ubBlockHeader.line;

+

+                    strncpy((char *)threadUbInfo->name, 

+                            (char *)ubBlockHeaderNode->ubBlockHeader.name, 

+                            ZOSS_UBHEAD_FILENAME_LEN);

+

+                    threadUbInfo->name[ZOSS_UBHEAD_FILENAME_LEN]    = 0;

+                    threadUbInfo->taskId                            = ubBlockHeaderNode->ubBlockHeader.taskId;

+                    threadUbInfo->threadId                          = threadId;

+                    threadUbInfo->usingSize                         = ubBlockHeaderNode->ubBlockHeader.usingSize;

+                    pUbControl                                      = GetUbPoolCtrAdd(ubBlockHeaderNode);

+                    zOss_AssertEx(pUbControl != NULL, ZOSS_ERROR);

+                    threadUbInfo->ubBlockSize                       = pUbControl->ubSize;

+                    threadUbInfo->ubBlock                           = GetUbBlockAdd(pUbControl, ubBlockHeaderNode);

+                    threadUbInfo++;

+                    threadUbNum++;

+                }

+            }

+            ubBlockHeaderNode++;

+        }

+        return threadUbNum;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#else

+    return ZOSS_ERROR;

+#endif

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºMem_TaskUBInfo

+* ¹¦ÄÜÃèÊö£ºÔÚÄÚ´æ³ØÖвéÕÒͬһÈÎÎñÉêÇëµÄUBÄÚ´æ¿éÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+*           taskId: ÈÎÎñID

+*           num: Ï£Íû²éѯÄÚ´æ¿éµÄ×î´óÊýÄ¿

+*           poolNum:²éѯµÄÄÚ´æ³ØºÅ

+*           (OUT)

+*           taskUbInfo:²éѯµ½µÄÄÚ´æ¿éÐÅÏ¢

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£ºÊÊÓÃÓÚdebug°æ±¾

+**************************************************************************/

+UINT32 Mem_TaskUBInfo (ZOSS_TASK_ID taskId, T_Mem_UBBlockInfo *taskUbInfo, UINT32 num, UINT8 poolNum)

+{

+#ifdef _DEBUG

+    UINT32              taskUbNum           = 0;

+    T_Mem_UBPoolCtl     *pUbControlStart    = NULL;

+    T_Mem_UBPoolCtl     *pUbControl         = NULL;

+    T_Mem_UBListNode    *ubBlockHeaderStart = NULL;

+    T_Mem_UBListNode    *ubBlockHeaderNode  = NULL;

+

+    if (0 != gUBSuperviseSitch)

+    {

+        zOss_AssertEx((NULL != taskUbInfo) && (num != 0), ZOSS_MEM_NULL_PARAM_ERR);

+        zOss_AssertEx(gMem_IsInit, ZOSS_MEM_NOT_INIT_ERR);

+

+        /* ÄÚ´æ³Ø¿ØÖÆ¿éÆðʼµØÖ· */

+        pUbControlStart = (T_Mem_UBPoolCtl *)gMem_UBStart;

+        /* ÄÚ´æÍ·µÄÆðʼµØÖ· */

+        ubBlockHeaderStart = pUbControlStart->ubMemHeaderStart;

+        ubBlockHeaderNode = ubBlockHeaderStart;

+

+        while (taskUbNum < num)

+        {

+            if ((UINT32)ubBlockHeaderNode == (UINT32)pUbControlStart->ubBlockStart)

+            {

+                break;

+            }

+            if (ubBlockHeaderNode->ubBlockHeader.isUsed)

+            {

+                if (ubBlockHeaderNode->ubBlockHeader.taskId == taskId)

+                {

+                    taskUbInfo->applyTimeTick                   = ubBlockHeaderNode->ubBlockHeader.applyTimeTick;

+                    taskUbInfo->line                            = ubBlockHeaderNode->ubBlockHeader.line;

+

+                    strncpy((char *)taskUbInfo->name, 

+                            (char *)ubBlockHeaderNode->ubBlockHeader.name,

+                            ZOSS_UBHEAD_FILENAME_LEN);

+                    

+                    taskUbInfo->name[ZOSS_UBHEAD_FILENAME_LEN]  = 0;

+                    taskUbInfo->taskId                          = taskId;

+                    taskUbInfo->threadId                        = ubBlockHeaderNode->ubBlockHeader.threadId;

+                    taskUbInfo->usingSize                       = ubBlockHeaderNode->ubBlockHeader.usingSize;

+                    pUbControl                                  = GetUbPoolCtrAdd(ubBlockHeaderNode);

+                    zOss_AssertEx(pUbControl != NULL, ZOSS_ERROR);

+                    taskUbInfo->ubBlockSize                     = pUbControl->ubSize;

+                    taskUbInfo->ubBlock                         = GetUbBlockAdd(pUbControl, ubBlockHeaderNode);

+                    taskUbInfo++;

+                    taskUbNum++;

+                }

+            }

+            ubBlockHeaderNode++;

+        }

+

+        return taskUbNum;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#else

+    return ZOSS_ERROR;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetUBFreeRate

+* ¹¦ÄÜÃèÊö£º»ñÈ¡UB´óС¿ÕÏÐÂÊ

+* ²ÎÊý˵Ã÷£ºubSize:ub µÄ´óС

+* ·µ »Ø Öµ£º·µ»Øub¿ÕÏÐÂÊ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+FLOAT zOss_GetUBFreeRate(UINT32 ubSize)

+{  

+#if defined (_OS_OSE) || defined (_OS_WIN)

+    T_Mem_UBPoolCtl *pUbControlStart    = NULL;

+    T_Mem_UBPoolCtl *pUbControl         = NULL;

+    UINT32          i                   = 0;

+    UINT32          pool_num            = 0;

+    FLOAT           ubRate              = 0;

+#ifdef _OS_OSE    

+    Msr             oldMsr              = 0;

+#elif defined _OS_WIN

+    UINT32          status              = ZOSS_ERROR;

+#endif    

+

+    /* Èë²Î¼ì²é */

+    if (0 == ubSize || ubSize > gMem_UBPoolCfg[gMem_UBPoolNum - 1].pool_size)

+    {

+        zOss_ASSERT(ubSize > 0);

+        zOss_ASSERT(ubSize <= gMem_UBPoolCfg[gMem_UBPoolNum - 1].pool_size);

+        gMem_ErrCode = ZOSS_MEM_GETUB_SIZE_ERR;

+        return 0;

+    }

+

+    /* ¸ù¾ÝÈë²Î¼ÆËãÄÚ´æ³ØºÅ,²ÉÓöþ·Ö·¨ */

+    for (;i < gMem_UBPoolNum; i++)

+    {

+        if (gMem_UBPoolCfg[i].pool_size >= ubSize)

+        {

+            pool_num = i;

+            break;

+        }

+    }

+

+    /* ÄÚ´æ³Ø¿ØÖÆ¿éÆðʼµØÖ· */

+    pUbControlStart = (T_Mem_UBPoolCtl *)gMem_UBStart;

+    /* »ñµÃ¶ÔÓ¦ÄÚ´æ³ØµÄÄÚ´æ³Ø¿ØÖÆ¿é */

+    pUbControl      = pUbControlStart + pool_num;

+#ifdef _OS_OSE

+    LOCK_SAVE(oldMsr);

+#elif defined _OS_WIN

+    status = zOss_GetMutex(pUbControl->ubMutex, ZOSS_WAIT_FOREVER);

+    zOss_AssertEx(status != ZOSS_ERROR, 0);

+#endif    

+    ubRate          = (FLOAT)(pUbControl->freeUbNum) / (pUbControl->ubBlockNum);

+#ifdef _OS_OSE

+    LOCK_RESTORE(oldMsr);

+#elif defined _OS_WIN

+    status = zOss_PutMutex(pUbControl->ubMutex);

+    zOss_AssertEx(status != ZOSS_ERROR, 0);

+#endif

+    return ubRate;

+#else

+    return (FLOAT)(0.8);

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PrintMemLog

+* ¹¦ÄÜÃèÊö£ºÊä³öÄÚ´æÐÅÏ¢µÄÐÅÏ¢

+* ²ÎÊý˵Ã÷£º

+* ·µ »Ø Öµ£º·µ»Øub¿ÕÏÐÂÊ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _USE_HEAP_DEBUG

+VOID zOss_PrintMemLog( VOID )

+{

+    T_Mem_DebugInfo     *p_mem_context  = NULL;

+    UINT32              retCode         = ZOSS_ERROR;

+    

+    zOss_GetMutex(s_mem_mutex, ZOSS_WAIT_FOREVER);

+    

+    p_mem_context = (T_Mem_DebugInfo *)zOss_ListFirst(&s_mem_list);

+    while (NULL != p_mem_context)

+    {

+        retCode = zOss_Printf(SUBMDL_OSA, PRINT_LEVEL_NORMAL, "[threadeid]: 0x%x,[lr]: 0x%x,[file name]: %s, [line number]: %d, [memory size]: %d\n", p_mem_context->thread_id, p_mem_context->uiLR, p_mem_context->file_name, p_mem_context->line, p_mem_context->mem_size);

+        if (retCode == ZOSS_ERROR)

+        {

+            zOss_Sleep(10);

+            retCode = zOss_Printf(SUBMDL_OSA, PRINT_LEVEL_NORMAL, "[threadeid]: 0x%x,[lr]: 0x%x,[file name]: %s, [line number]: %d, [memory size]: %d\n", p_mem_context->thread_id, p_mem_context->uiLR, p_mem_context->file_name, p_mem_context->line, p_mem_context->mem_size);

+        }

+        p_mem_context = (T_Mem_DebugInfo *)zOss_ListNext((T_ZOss_Node *)p_mem_context);

+    }

+    zOss_PutMutex(s_mem_mutex);

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_DebugMem

+* ¹¦ÄÜÃèÊö£º¼ì²éÄÚ´æÊÇ·ñÔ½½ç

+* ²ÎÊý˵Ã÷£º

+* ·µ »Ø Öµ£º·µ»Øub¿ÕÏÐÂÊ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _USE_HEAP_DEBUG

+VOID zOss_DebugMem( VOID )

+{

+    T_Mem_DebugInfo     *p_mem_context  = NULL;

+    UINT32              retCode         = ZOSS_ERROR;

+    

+    zOss_GetMutex(s_mem_mutex, ZOSS_WAIT_FOREVER);

+    

+    p_mem_context = (T_Mem_DebugInfo *)zOss_ListFirst(&s_mem_list);

+    while (NULL != p_mem_context)

+    {

+        if (MEM_MAGIC_NUM != *mem_context_magic(p_mem_context))

+        {

+            retCode = zOss_Printf(SUBMDL_OSA,PRINT_LEVEL_NORMAL, "[threadeid]: 0x%x, [lr]: 0x%x, [file name]: %s, [line number]: %d, [memory size]: %d\n", p_mem_context->thread_id,p_mem_context->uiLR,p_mem_context->file_name, p_mem_context->line, p_mem_context->mem_size);

+            if (retCode == ZOSS_ERROR)

+            {

+                zOss_Sleep(10);

+                retCode = zOss_Printf(SUBMDL_OSA, PRINT_LEVEL_NORMAL, "[threadeid]: 0x%x, [lr]: 0x%x, [file name]: %s, [line number]: %d, [memory size]: %d\n", p_mem_context->thread_id,p_mem_context->uiLR,p_mem_context->file_name, p_mem_context->line, p_mem_context->mem_size);

+            }

+        }

+        p_mem_context = (T_Mem_DebugInfo *)zOss_ListNext((T_ZOss_Node *)p_mem_context );

+    }

+    zOss_PutMutex(s_mem_mutex);

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_MemLeakStart

+* ¹¦ÄÜÃèÊö£º¼ì²éÄÚ´æÐ¹Â¶Æðʼʱ¼äºÍÉèÖÃй¶·§Öµ

+* ²ÎÊý˵Ã÷£º(IN)

+                leak_threadhold:й¶µÄ·§Öµ

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _USE_HEAP_DEBUG

+VOID zOss_MemLeakStart(UINT32 leak_threadhold)

+{

+#ifdef _OS_TOS

+    tos_heap_trace_leak_start(leak_threadhold);

+#else

+    s_mem_leak_tick_start      = zOss_GetTickCount();

+    s_mem_leak_tick_threadhold = leak_threadhold;

+#endif

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_MemLeakEnd

+* ¹¦ÄÜÃèÊö£º¼ì²éij¶Îʱ¼äÄÚmemµÄй¶µÄÇé¿ö

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _USE_HEAP_DEBUG

+VOID zOss_MemLeakEnd( VOID )

+{

+#if defined (_OS_OSE) || defined (_OS_WIN)

+    T_Mem_DebugInfo     *p_mem_context  = NULL;

+    UINT32              retCode         = ZOSS_ERROR;

+    UINT32              tick_cur        = zOss_GetTickCount();    

+

+    zOss_GetMutex(s_mem_mutex, ZOSS_WAIT_FOREVER);

+    

+    p_mem_context = (T_Mem_DebugInfo *)zOss_ListFirst(&s_mem_list);

+    while (NULL != p_mem_context)

+    {

+        if ((s_mem_leak_tick_start <= p_mem_context->tick_malloced)

+                && (s_mem_leak_tick_threadhold <= tick_cur - p_mem_context->tick_malloced))

+        {

+            retCode = zOss_Printf(SUBMDL_OSA, PRINT_LEVEL_NORMAL, "[threadeid]: 0x%x,[lr]: 0x%x,[file name]: %s, [line number]: %d, [memory size]: %d\n", p_mem_context->thread_id, p_mem_context->uiLR, p_mem_context->file_name, p_mem_context->line, p_mem_context->mem_size);

+            if (retCode == ZOSS_ERROR)

+            {

+                zOss_Sleep(10);

+                retCode = zOss_Printf(SUBMDL_OSA, PRINT_LEVEL_NORMAL, "[threadeid]: 0x%x, [lr]: 0x%x, [file name]: %s, [line number]: %d, [memory size]: %d\n", p_mem_context->thread_id, p_mem_context->uiLR, p_mem_context->file_name, p_mem_context->line, p_mem_context->mem_size);

+            }

+        }

+

+        p_mem_context = (T_Mem_DebugInfo *)zOss_ListNext((T_ZOss_Node *)p_mem_context);

+    }

+    zOss_PutMutex(s_mem_mutex);

+#elif defined _OS_TOS	

+    tos_heap_trace_leak_end();

+#endif

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_CheckMem

+* ¹¦ÄÜÃèÊö£º¼ì²émemʹÓÃÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _USE_HEAP_DEBUG

+VOID zOss_CheckMem(VOID)

+{

+#ifdef _OS_TOS

+    tos_heap_print_leak(0);

+    tos_heap_trace_overflow();

+#else

+    zOss_Printf(SUBMDL_OSA, PRINT_LEVEL_NORMAL, "\t==========ÄÚ´æÊ¹ÓÃÐÅÏ¢ÈçÏÂ==========");

+    zOss_PrintMemLog();

+    zOss_Printf(SUBMDL_OSA, PRINT_LEVEL_NORMAL, "\t==========ÄÚ´æÔ½½çÐÅÏ¢ÈçÏÂ==========");

+    zOss_DebugMem();

+#endif

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetMemDbgSwitch

+* ¹¦ÄÜÃèÊö£ºÉèÖÃubµÄµ÷ÊÔ¿ª¹Ø

+* ²ÎÊý˵Ã÷£º(IN)

+                ·ÇÁãÖµ±íʾ´ò¿ª

+                ÁãÖµ±íʾ¹Ø±Õ

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_SetUbDbgSwitch(UINT32 dbgFlag)

+{

+#if defined (_OS_OSE) || defined (_OS_WIN)

+    gUBSuperviseSitch = dbgFlag;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetMemInitState

+* ¹¦ÄÜÃèÊö£º»ñÈ¡ÄÚ´æµÄ³õʼ»¯×´Ì¬

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£ºÄÚ´æÒÑÍê³É³õʼ»¯£¬·µ»ØÕ棬·ñÔò·µ»Ø¼Ù

+* ÆäËü˵Ã÷£ºVOID

+**************************************************************************/

+#ifdef _OS_OSE

+BOOL zOss_GetMemInitState(VOID)

+{

+    return gMem_IsInit;

+}

+#endif

+

+#endif

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡cache lineµØÖ·¶ÔÆëµÄ¿Õ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  size: ¿Õ¼ä´óС

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Óû§¿Õ¼äµØÖ·

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID *zOss_CacheMalloc(UINT32 size)

+{

+	VOID *ptr;

+	VOID *head;

+	UINT32 total_size;

+	UINT32 dcache_line_size = 0;

+	

+	if (size == 0)

+		return NULL;

+

+    dcache_line_size = ZOSS_DCACHE_LINE_SIZE;

+	total_size = size + dcache_line_size * 3;

+

+	head = zOss_Malloc(total_size);

+

+	if (head == NULL)

+		return NULL;

+

+	ptr = (VOID *)ALIGN_TO((UINT32)head, dcache_line_size);

+	ptr = (VOID *)((UINT32)ptr + dcache_line_size);

+

+	*(UINT32 *)((UINT32)ptr - sizeof(VOID *)) = (UINT32)head;

+

+	return ptr;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÊÍ·Åcache lineµØÖ·¶ÔÆëµÄ¿Õ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ptr: ¿Õ¼äÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID zOss_CacheFree(VOID *ptr)

+{

+	VOID *head;

+	

+	head = (VOID *)(*(UINT32 *)((UINT32)ptr - sizeof(VOID *)));

+

+	zOss_Free(head);

+}

+

+#if defined(_OS_LINUX) && defined(_UB_USE_HEAP_DEBUG)

+#define POOL_DEBUG_MAGIC 0x5AA55AA5

+typedef struct pool_debug_node

+{

+    T_ZOss_Node	        node;

+    UINT32              magic;

+    const char          *file;                  /* ÉêÇëλÖÃÎļþ  */

+    UINT32              line;                   /* ÉêÇëλÖÃÐкŠ */      

+    UINT32              size;                   /* ÉêÇë´óС      */

+    void                *thread_id;              /* ÉêÇëÏß³ÌID*/	 

+    UINT32              time;

+} pool_debug_node_t;

+

+typedef struct pool_debug_info

+{

+	UINT32      total_size;

+	T_ZOss_List head;

+} pool_debug_info_t;

+

+pool_debug_info_t g_PoolAllocInfo;

+

+void *ub_debug_alloc(unsigned long size, const char *file, unsigned long line)

+{

+    UINT32 intr;

+    UINT32 tmp_sz;

+    pool_debug_node_t *node;

+

+    tmp_sz = sizeof(pool_debug_node_t) + size;

+	

+    if(tmp_sz <= PAGE_SIZE)

+        node = (pool_debug_node_t *)kmalloc(tmp_sz, GFP_KERNEL);

+    else

+        node = (pool_debug_node_t *)vmalloc(tmp_sz);

+

+    node->file = file;

+    node->line = line;

+    node->size = size;

+    node->thread_id = current;

+    node->time = zOss_GetTickCount();

+    node->magic = POOL_DEBUG_MAGIC;

+

+    ZOSS_SAVE_IRQ(intr);

+    zOss_ListAdd(&g_PoolAllocInfo.head, (T_ZOss_Node *)node);

+    g_PoolAllocInfo.total_size += size;

+    ZOSS_RESTORE_IRQ(intr);

+

+    return (void *)((char *)node + sizeof(pool_debug_node_t));

+}

+

+void ub_debug_free(void *ptr)

+{

+    UINT32 intr;

+    UINT32 size;

+    pool_debug_node_t *node;

+

+    node = (pool_debug_node_t *)(ptr - sizeof(pool_debug_node_t));

+

+    if (node->magic != POOL_DEBUG_MAGIC)

+        zOss_ASSERT(0);

+    node->magic = 0;

+    size = node->size;

+

+    ZOSS_SAVE_IRQ(intr);

+    zOss_ListDelete(&g_PoolAllocInfo.head, (T_ZOss_Node *)node);

+    g_PoolAllocInfo.total_size -= size;

+    ZOSS_RESTORE_IRQ(intr);  

+

+    if(!is_vmalloc_addr((void *)node))

+        kfree((void *)node);

+    else

+        vfree((void *)node);

+}

+#endif

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_pool.c b/cp/ps/plat/src/oss/osa/com/oss_pool.c
new file mode 100644
index 0000000..415a5c1
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_pool.c
@@ -0,0 +1,1594 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     oss_pool.c

+* Îļþ±êʶ:     oss_pool.c

+* ÄÚÈÝÕªÒª:     ossÖ§³Å²ãÄÚ´æ³Ø¹ÜÀíÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/08/25      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_api.h"

+#include "oss_monitor.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+#ifndef _USE_OSS_MIN

+#define POOL_MAGIC

+#define POOL_FREE_CHECK

+#endif

+

+#ifdef POOL_REALLOC

+#define POOL_SIZE_CHECK

+#endif

+

+#define POOL_INDEX_0_MAGIC  (0x12345678)    /* the magic of index 0 pool node   */

+#define POOL_INDEX_1_MAGIC  (0x23456789)    /* the magic of index 1 pool node   */

+#define POOL_INDEX_2_MAGIC  (0x3456789a)    /* the magic of index 2 pool node   */

+#define POOL_INDEX_3_MAGIC  (0x456789ab)    /* the magic of index 3 pool node   */

+#define POOL_INDEX_4_MAGIC  (0x56789abc)    /* the magic of index 4 pool node   */

+#define POOL_INDEX_5_MAGIC  (0x6789abcd)    /* the magic of index 5 pool node   */

+#define POOL_INDEX_6_MAGIC  (0x789abcde)    /* the magic of index 6 pool node   */

+#define POOL_INDEX_7_MAGIC  (0x89abcdef)    /* the magic of index 7 pool node   */

+#define POOL_INDEX_8_MAGIC  (0x9abcdef1)    /* the magic of index 8 pool node   */

+#define POOL_INDEX_9_MAGIC  (0xabcdef12)    /* the magic of index 9 pool node   */

+#define POOL_INDEX_10_MAGIC (0xbcdef123)    /* the magic of index 10 pool node  */

+#define POOL_INDEX_11_MAGIC (0xcdef1234)    /* the magic of index 11 pool node  */

+#define POOL_INDEX_12_MAGIC (0xdef12345)    /* the magic of index 12 pool node  */

+#define POOL_INDEX_13_MAGIC (0xef123456)    /* the magic of index 13 pool node  */

+#define POOL_INDEX_14_MAGIC (0xf1234567)    /* the magic of index 14 pool node  */

+#define POOL_INDEX_15_MAGIC (0x12345678)    /* the magic of index 15 pool node  */

+

+#define POOL_MAP            ((1<<POOL_INDEX_NUM) - 1)

+

+#define POOL_ERROR_NONE                 0

+#define POOL_ERROR_NOT_INIT             1

+#define POOL_ERROR_SIZE_ZERO            2

+#define POOL_ERROR_SIZE_OVERFLOW        3

+#define POOL_ERROR_MAGIC_CORRUPT        4

+#define POOL_ERROR_FREE_NULL            5

+#define POOL_ERROR_FREE_NOT_ALIGN       6

+#define POOL_ERROR_FREE_INVALID         7

+#define POOL_ERROR_FREE_HEAD_NULL       8

+#define POOL_ERROR_FREE_HEAD_INVALID    9

+#define POOL_ERROR_SIZE_NULL            10

+#define POOL_ERROR_SIZE_NOT_ALIGN       11

+#define POOL_ERROR_SIZE_INVALID         12

+#define POOL_ERROR_SIZE_HEAD_NULL       13

+#define POOL_ERROR_SIZE_HEAD_INVALID    14

+

+#ifdef POOL_DEBUG

+//zOss_Printf(SUBMDL_OSA, PRINT_LEVEL_NORMAL, fmt, ##__VA_ARGS__);

+# define DBG(fmt, ...)                                                      \

+    ZOSS_MACRO_START                                                        \

+        printk(fmt, ##__VA_ARGS__);                                         \

+    ZOSS_MACRO_END

+#else

+# define DBG(fmt, ...)

+#endif

+

+#ifndef POOL_LEAK_CHECK_TIMEOUT

+# define POOL_LEAK_CHECK_TIMEOUT        (100)

+#endif

+

+#ifndef POOL_ALLOC_STATISTIC_NUM

+# define POOL_ALLOC_STATISTIC_NUM       (8)

+#endif

+

+#define POOL_LOCK(flags)        ZOSS_SAVE_IRQ(flags)

+#define POOL_UNLOCK(flags)      ZOSS_RESTORE_IRQ(flags)

+

+#ifdef _OS_TOS

+# define POOL_CURRENT_TIME()    cyg_current_time_lo()

+# define POOL_MALLOC(size)      malloc(size)

+# define POOL_FREE(ptr)         free(ptr)

+#elif defined (_OS_LINUX)

+# define POOL_CURRENT_TIME()    jiffies

+# define POOL_MALLOC(size)      kmalloc(size, GFP_KERNEL)

+# define POOL_FREE(ptr)         kfree(ptr)

+#endif

+#define POOL_THREAD_SELF()      zOss_GetCurThreadID()

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+enum 

+{

+#if (POOL_INDEX_0_NUM)

+    POOL_INDEX_0,

+#endif

+    

+#if (POOL_INDEX_1_NUM)

+    POOL_INDEX_1,

+#endif

+    

+#if (POOL_INDEX_2_NUM)

+    POOL_INDEX_2,

+#endif

+    

+#if (POOL_INDEX_3_NUM)

+    POOL_INDEX_3,

+#endif

+    

+#if (POOL_INDEX_4_NUM)

+    POOL_INDEX_4,

+#endif

+    

+#if (POOL_INDEX_5_NUM)

+    POOL_INDEX_5,

+#endif

+    

+#if (POOL_INDEX_6_NUM)

+    POOL_INDEX_6,

+#endif

+    

+#if (POOL_INDEX_7_NUM)

+    POOL_INDEX_7,

+#endif

+    

+#if (POOL_INDEX_8_NUM)

+    POOL_INDEX_8,

+#endif

+    

+#if (POOL_INDEX_9_NUM)

+    POOL_INDEX_9,

+#endif

+    

+#if (POOL_INDEX_10_NUM)

+    POOL_INDEX_10,

+#endif

+    

+#if (POOL_INDEX_11_NUM)

+    POOL_INDEX_11,

+#endif

+    

+#if (POOL_INDEX_12_NUM)

+    POOL_INDEX_12,

+#endif

+    

+#if (POOL_INDEX_13_NUM)

+    POOL_INDEX_13,

+#endif

+    

+#if (POOL_INDEX_14_NUM)

+    POOL_INDEX_14,

+#endif

+    

+#if (POOL_INDEX_15_NUM)

+    POOL_INDEX_15,

+#endif

+    

+    POOL_INDEX_NUM,

+};

+

+typedef struct pool_node 

+{

+    struct pool_node    *free_next;

+#ifdef POOL_LEAK_CHECK

+    struct pool_node    **alloc_prev;

+    struct pool_node    *alloc_next;

+#endif

+#ifdef POOL_REALLOC

+    unsigned long       size;

+#endif

+#ifdef POOL_DEBUG

+    const char          *file;

+    unsigned long       line;

+    unsigned long       time;

+    ZOSS_THREAD_ID      thread_id;

+#endif

+#ifdef POOL_MAGIC

+    unsigned long       magic;

+#endif

+} pool_node_t;

+

+typedef struct 

+{

+    unsigned long       map;

+    struct pool_node    *free_head[POOL_INDEX_NUM];

+

+#ifdef POOL_LEAK_CHECK

+    struct pool_node    *alloc_head[POOL_INDEX_NUM];

+    unsigned long       trace_leak_time;

+#endif

+

+#ifdef POOL_INIT_CHECK

+    unsigned long       init_flag;

+#endif

+

+#ifdef POOL_DEBUG

+    unsigned long       fail_count[POOL_INDEX_NUM];

+    unsigned long       free_count[POOL_INDEX_NUM];

+    unsigned long       min_free_count[POOL_INDEX_NUM];

+    unsigned long       alloc_statistic[POOL_INDEX_NUM][POOL_ALLOC_STATISTIC_NUM];

+    int                 errno;

+    struct pool_node    *alloc_error_node;

+    unsigned long       alloc_error_size;

+    const char          *alloc_error_file;

+    unsigned long       alloc_error_line;

+    struct pool_node    *free_error_node;

+    void                *free_error_ptr;

+    const char          *free_error_file;

+    unsigned long       free_error_line;

+#endif

+} pool_svc_t;

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+#if (POOL_INDEX_0_NUM)

+static char pool_index_0_node[POOL_INDEX_0_NUM][sizeof(pool_node_t)   + POOL_INDEX_0_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_1_NUM)

+static char pool_index_1_node[POOL_INDEX_1_NUM][sizeof(pool_node_t)   + POOL_INDEX_1_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_2_NUM)

+static char pool_index_2_node[POOL_INDEX_2_NUM][sizeof(pool_node_t)   + POOL_INDEX_2_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_3_NUM)

+static char pool_index_3_node[POOL_INDEX_3_NUM][sizeof(pool_node_t)   + POOL_INDEX_3_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_4_NUM)

+static char pool_index_4_node[POOL_INDEX_4_NUM][sizeof(pool_node_t)   + POOL_INDEX_4_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_5_NUM)

+static char pool_index_5_node[POOL_INDEX_5_NUM][sizeof(pool_node_t)   + POOL_INDEX_5_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_6_NUM)

+static char pool_index_6_node[POOL_INDEX_6_NUM][sizeof(pool_node_t)   + POOL_INDEX_6_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_7_NUM)

+static char pool_index_7_node[POOL_INDEX_7_NUM][sizeof(pool_node_t)   + POOL_INDEX_7_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_8_NUM)

+static char pool_index_8_node[POOL_INDEX_8_NUM][sizeof(pool_node_t)   + POOL_INDEX_8_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_9_NUM)

+static char pool_index_9_node[POOL_INDEX_9_NUM][sizeof(pool_node_t)   + POOL_INDEX_9_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_10_NUM)

+static char pool_index_10_node[POOL_INDEX_10_NUM][sizeof(pool_node_t) + POOL_INDEX_10_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_11_NUM)

+static char pool_index_11_node[POOL_INDEX_11_NUM][sizeof(pool_node_t) + POOL_INDEX_11_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_12_NUM)

+static char pool_index_12_node[POOL_INDEX_12_NUM][sizeof(pool_node_t) + POOL_INDEX_12_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_13_NUM)

+static char pool_index_13_node[POOL_INDEX_13_NUM][sizeof(pool_node_t) + POOL_INDEX_13_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_14_NUM)

+static char pool_index_14_node[POOL_INDEX_14_NUM][sizeof(pool_node_t) + POOL_INDEX_14_SIZE] __attribute__((aligned(8)));

+#endif

+

+#if (POOL_INDEX_15_NUM)

+static char pool_index_15_node[POOL_INDEX_15_NUM][sizeof(pool_node_t) + POOL_INDEX_15_SIZE] __attribute__((aligned(8)));

+#endif

+

+__tcm_data static pool_svc_t pool_svc;

+

+#ifdef POOL_DEBUG

+__tcm_const static const unsigned long pool_num[] = {

+#if (POOL_INDEX_0_NUM)

+    POOL_INDEX_0_NUM,

+#endif

+

+#if (POOL_INDEX_1_NUM)

+    POOL_INDEX_1_NUM,

+#endif

+

+#if (POOL_INDEX_2_NUM)

+    POOL_INDEX_2_NUM,

+#endif

+

+#if (POOL_INDEX_3_NUM)

+    POOL_INDEX_3_NUM,

+#endif

+

+#if (POOL_INDEX_4_NUM)

+    POOL_INDEX_4_NUM,

+#endif

+

+#if (POOL_INDEX_5_NUM)

+    POOL_INDEX_5_NUM,

+#endif

+

+#if (POOL_INDEX_6_NUM)

+    POOL_INDEX_6_NUM,

+#endif

+

+#if (POOL_INDEX_7_NUM)

+    POOL_INDEX_7_NUM,

+#endif

+

+#if (POOL_INDEX_8_NUM)

+    POOL_INDEX_8_NUM,

+#endif

+

+#if (POOL_INDEX_9_NUM)

+    POOL_INDEX_9_NUM,

+#endif

+

+#if (POOL_INDEX_10_NUM)

+    POOL_INDEX_10_NUM,

+#endif

+

+#if (POOL_INDEX_11_NUM)

+    POOL_INDEX_11_NUM,

+#endif

+

+#if (POOL_INDEX_12_NUM)

+    POOL_INDEX_12_NUM,

+#endif

+

+#if (POOL_INDEX_13_NUM)

+    POOL_INDEX_13_NUM,

+#endif

+

+#if (POOL_INDEX_14_NUM)

+    POOL_INDEX_14_NUM,

+#endif

+

+#if (POOL_INDEX_15_NUM)

+    POOL_INDEX_15_NUM,

+#endif

+};

+#endif

+

+__tcm_const static const unsigned long pool_size[] = {

+#if (POOL_INDEX_0_NUM)

+    POOL_INDEX_0_SIZE,

+#endif

+

+#if (POOL_INDEX_1_NUM)

+    POOL_INDEX_1_SIZE,

+#endif

+

+#if (POOL_INDEX_2_NUM)

+    POOL_INDEX_2_SIZE,

+#endif

+

+#if (POOL_INDEX_3_NUM)

+    POOL_INDEX_3_SIZE,

+#endif

+

+#if (POOL_INDEX_4_NUM)

+    POOL_INDEX_4_SIZE,

+#endif

+

+#if (POOL_INDEX_5_NUM)

+    POOL_INDEX_5_SIZE,

+#endif

+

+#if (POOL_INDEX_6_NUM)

+    POOL_INDEX_6_SIZE,

+#endif

+

+#if (POOL_INDEX_7_NUM)

+    POOL_INDEX_7_SIZE,

+#endif

+

+#if (POOL_INDEX_8_NUM)

+    POOL_INDEX_8_SIZE,

+#endif

+

+#if (POOL_INDEX_9_NUM)

+    POOL_INDEX_9_SIZE,

+#endif

+

+#if (POOL_INDEX_10_NUM)

+    POOL_INDEX_10_SIZE,

+#endif

+

+#if (POOL_INDEX_11_NUM)

+    POOL_INDEX_11_SIZE,

+#endif

+

+#if (POOL_INDEX_12_NUM)

+    POOL_INDEX_12_SIZE,

+#endif

+

+#if (POOL_INDEX_13_NUM)

+    POOL_INDEX_13_SIZE,

+#endif

+

+#if (POOL_INDEX_14_NUM)

+    POOL_INDEX_14_SIZE,

+#endif

+

+#if (POOL_INDEX_15_NUM)

+    POOL_INDEX_15_SIZE,

+#endif

+};

+

+#ifdef POOL_MAGIC

+__tcm_const static const unsigned long pool_magic[] = {

+#if (POOL_INDEX_0_NUM)

+    POOL_INDEX_0_MAGIC,

+#endif

+

+#if (POOL_INDEX_1_NUM)

+    POOL_INDEX_1_MAGIC,

+#endif

+

+#if (POOL_INDEX_2_NUM)

+    POOL_INDEX_2_MAGIC,

+#endif

+

+#if (POOL_INDEX_3_NUM)

+    POOL_INDEX_3_MAGIC,

+#endif

+

+#if (POOL_INDEX_4_NUM)

+    POOL_INDEX_4_MAGIC,

+#endif

+

+#if (POOL_INDEX_5_NUM)

+    POOL_INDEX_5_MAGIC,

+#endif

+

+#if (POOL_INDEX_6_NUM)

+    POOL_INDEX_6_MAGIC,

+#endif

+

+#if (POOL_INDEX_7_NUM)

+    POOL_INDEX_7_MAGIC,

+#endif

+

+#if (POOL_INDEX_8_NUM)

+    POOL_INDEX_8_MAGIC,

+#endif

+

+#if (POOL_INDEX_9_NUM)

+    POOL_INDEX_9_MAGIC,

+#endif

+

+#if (POOL_INDEX_10_NUM)

+    POOL_INDEX_10_MAGIC,

+#endif

+

+#if (POOL_INDEX_11_NUM)

+    POOL_INDEX_11_MAGIC,

+#endif

+

+#if (POOL_INDEX_12_NUM)

+    POOL_INDEX_12_MAGIC,

+#endif

+

+#if (POOL_INDEX_13_NUM)

+    POOL_INDEX_13_MAGIC,

+#endif

+

+#if (POOL_INDEX_14_NUM)

+    POOL_INDEX_14_MAGIC,

+#endif

+

+#if (POOL_INDEX_15_NUM)

+    POOL_INDEX_15_MAGIC,

+#endif

+};

+#endif

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+#ifdef _USE_MONITOR

+static T_ZOss_Mon_Pool pool_info = {0};

+#endif

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+#ifdef POOL_DEBUG

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼Ç¼pool_alloc´íÎóʱµÄµ÷ÓòÎÊý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  node:   ³ö´íµÄÄÚ´æ½Úµã

+                errno:  ´íÎóÂë

+                size:   ÉêÇëµÄÄÚ´æ´óС

+                file:   ÎļþÃû

+                line:   ÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void pool_alloc_error(struct pool_node   *node,

+                                int                 errno,

+                                unsigned long       size,

+                                const char          *file,

+                                unsigned long       line)

+{

+    unsigned long flags;

+

+    POOL_LOCK(flags);

+    pool_svc.errno              = errno;

+    pool_svc.alloc_error_node   = node;

+    pool_svc.alloc_error_size   = size;

+    pool_svc.alloc_error_file   = file;

+    pool_svc.alloc_error_line   = line;

+    POOL_UNLOCK(flags);

+

+    switch (errno)

+    {

+        case POOL_ERROR_SIZE_OVERFLOW:

+        {

+            //pool_print_leak(0);

+            //pool_print_free();

+            //pool_print_alloc_fail();

+            //pool_print_alloc_statistic();

+            //pool_trace_leak_end(0);

+            zOss_ASSERT(0);

+            break;

+        }

+

+        default:

+        {

+            zOss_ASSERT(0);

+            break;

+        }

+    }

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼Ç¼pool_free´íÎóʱµÄµ÷ÓòÎÊý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  node:   ³ö´íµÄÄÚ´æ½Úµã

+                errno:  ´íÎóÂë

+                ptr:    ÊͷŵÄÄÚ´æÖ¸Õë

+                file:   ÎļþÃû

+                line:   ÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void pool_free_error(struct pool_node    *node,

+                               int                  errno,

+                               void                 *ptr,

+                               const char           *file,

+                               unsigned long        line)

+{

+    unsigned long flags;

+

+    POOL_LOCK(flags);

+    pool_svc.errno              = errno;

+    pool_svc.free_error_node    = node;

+    pool_svc.free_error_ptr     = ptr;

+    pool_svc.free_error_file    = file;

+    pool_svc.free_error_line    = line;

+    POOL_UNLOCK(flags);

+

+    switch (errno) 

+    {

+        default:

+        {

+            zOss_ASSERT(0);

+            break;

+        }

+    }

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼Ç¼pool_size´íÎóʱµÄµ÷ÓòÎÊý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  node:   ³ö´íµÄÄÚ´æ½Úµã

+                errno:  ´íÎóÂë

+                ptr:    ÊͷŵÄÄÚ´æÖ¸Õë

+                file:   ÎļþÃû

+                line:   ÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+#ifdef POOL_REALLOC

+static void pool_size_error(struct pool_node    *node,

+                               int                  errno,

+                               void                 *ptr,

+                               const char           *file,

+                              unsigned long         line)

+{

+    unsigned long flags;

+

+    POOL_LOCK(flags);

+    pool_svc.errno              = errno;

+    pool_svc.free_error_node    = node;

+    pool_svc.free_error_ptr     = ptr;

+    pool_svc.free_error_file    = file;

+    pool_svc.free_error_line    = line;

+    POOL_UNLOCK(flags);

+    

+    switch (errno) 

+    {

+        default:

+        {

+            zOss_ASSERT(0);

+            break;

+        }

+    }

+}

+#endif

+

+#endif

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡¶ÓÁÐË÷Òý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  size:   ÉêÇëµÄÄÚ´æ´óС

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ¶ÓÁÐË÷Òý

+* ÆäËü˵Ã÷:     1. Ë÷Òý¶ÓÁбØÐëÊÇÉýÐòÅÅÁÐ;

+                2. ±¾º¯ÊýûÓй²Ïí±£»¤£¬±ØÐëÔÚµ÷Óú¯ÊýÖвÉÓù²Ïí±£»¤;

+*******************************************************************************/

+__tcm_func static int pool_get_index(unsigned long size)

+{

+    int map;

+    int index;

+#ifdef POOL_DEBUG

+    int base_index;

+#endif

+

+    map = (int)pool_svc.map;

+    for (index = 0; index < POOL_INDEX_NUM; index++)

+    {

+        if (size > pool_size[index])

+        {

+            continue;

+        }

+

+#ifdef POOL_DEBUG

+        base_index = index;

+#endif

+        for ( ; index < POOL_INDEX_NUM; index++)

+        {

+            if (map & (1<<index))

+            {

+#ifdef POOL_DEBUG

+                if (index > base_index)

+                {

+                    pool_svc.fail_count[base_index]++;

+                }

+#endif

+                return index;

+            }

+        }

+    }

+    

+    return -1;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ³õʼ»¯Ë÷Òý¶ÓÁÐÍ·½Úµã

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  pool:   Ë÷Òý¶ÓÁжÔÓ¦µÄÄÚ´æ³Ø

+                size:   ¸ÃË÷Òý¶ÓÁÐÖÐÿ¸ö½ÚµãµÄÄÚ´æ´óС

+                num:    ¸ÃË÷Òý¶ÓÁÐÖеĽڵã×ÜÊý

+                index:  Ë÷ÒýºÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void pool_node_init(char *pool, int size, int num, int index)

+{

+    int cnt;

+    unsigned long flags;

+    pool_node_t *node = NULL;

+

+    zOss_ASSERT(pool != NULL && size > 0 && size % 4 == 0 && num > 0);

+    zOss_ASSERT(index >= 0 && index < POOL_INDEX_NUM);

+

+    POOL_LOCK(flags);

+    pool_svc.free_head[index] = (pool_node_t *)pool;

+

+#ifdef POOL_LEAK_CHECK

+    pool_svc.alloc_head[index] = NULL;

+#endif

+    

+#ifdef POOL_DEBUG

+    pool_svc.fail_count[index]      = 0;

+    pool_svc.free_count[index]      = pool_num[index];

+    pool_svc.min_free_count[index]  = pool_num[index];

+    for (cnt = 0; cnt < POOL_ALLOC_STATISTIC_NUM; cnt++)

+    {

+        pool_svc.alloc_statistic[index][cnt] = 0;

+    }

+#endif

+    POOL_UNLOCK(flags);

+

+    size += (int)sizeof(pool_node_t);

+    for (cnt = 0; cnt < num; cnt++)

+    {

+        node = (pool_node_t *)pool;

+        pool += size;

+        node->free_next = (pool_node_t *)pool;

+

+#ifdef POOL_MAGIC

+        node->magic = pool_magic[index];

+#endif

+

+#ifdef POOL_DEBUG

+        node->file = NULL;

+        node->line = 0;

+        node->time = 0;

+#endif

+    }

+    node->free_next = NULL;

+}

+

+#ifdef POOL_DEBUG

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸üÐÂpallocµÄͳ¼ÆÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  size:   µ±Ç°µ÷ÓÃpallocÉêÇëµÄÄÚ´æ´óС

+                index:  Ë÷ÒýºÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ±¾º¯ÊýûÓй²Ïí±£»¤£¬±ØÐëÔÚµ÷Óú¯ÊýÖвÉÓù²Ïí±£»¤

+*******************************************************************************/

+static inline void pool_alloc_statistic(unsigned long size, int index)

+{

+    int cnt = 0;

+

+    if (size > pool_svc.alloc_statistic[index][0]) 

+    {

+        for (cnt = 1; cnt < POOL_ALLOC_STATISTIC_NUM; cnt++)

+        {

+            if (size < pool_svc.alloc_statistic[index][cnt])

+                break;

+            else if (size == pool_svc.alloc_statistic[index][cnt])

+                return;

+        }

+

+        pool_svc.alloc_statistic[index][cnt - 1] = size;

+    }

+}

+#endif

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ³õʼ»¯ÄÚ´æ³Ø

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     pool_alloc/pool_free½Ó¿ÚÐèÒªÔڸú¯ÊýÍê³Éºó·½Äܵ÷ÓÃ

+*******************************************************************************/

+void pool_init(void)

+{

+    int index = 0;

+    unsigned long flags;

+

+    zOss_ASSERT(sizeof(pool_node_t)%4 == 0);

+

+#if (POOL_INDEX_0_NUM)

+    pool_node_init((char *)pool_index_0_node,  POOL_INDEX_0_SIZE,  POOL_INDEX_0_NUM,  index++);

+#endif

+

+#if (POOL_INDEX_1_NUM)

+    pool_node_init((char *)pool_index_1_node,  POOL_INDEX_1_SIZE,  POOL_INDEX_1_NUM,  index++);

+#endif

+

+#if (POOL_INDEX_2_NUM)

+    pool_node_init((char *)pool_index_2_node,  POOL_INDEX_2_SIZE,  POOL_INDEX_2_NUM,  index++);

+#endif

+

+#if (POOL_INDEX_3_NUM)

+    pool_node_init((char *)pool_index_3_node,  POOL_INDEX_3_SIZE,  POOL_INDEX_3_NUM,  index++);

+#endif

+

+#if (POOL_INDEX_4_NUM)

+    pool_node_init((char *)pool_index_4_node,  POOL_INDEX_4_SIZE,  POOL_INDEX_4_NUM,  index++);

+#endif

+

+#if (POOL_INDEX_5_NUM)

+    pool_node_init((char *)pool_index_5_node,  POOL_INDEX_5_SIZE,  POOL_INDEX_5_NUM,  index++);

+#endif

+

+#if (POOL_INDEX_6_NUM)

+    pool_node_init((char *)pool_index_6_node,  POOL_INDEX_6_SIZE,  POOL_INDEX_6_NUM,  index++);

+#endif

+

+#if (POOL_INDEX_7_NUM)

+    pool_node_init((char *)pool_index_7_node,  POOL_INDEX_7_SIZE,  POOL_INDEX_7_NUM,  index++);

+#endif

+

+#if (POOL_INDEX_8_NUM)

+    pool_node_init((char *)pool_index_8_node,  POOL_INDEX_8_SIZE,  POOL_INDEX_8_NUM,  index++);

+#endif

+

+#if (POOL_INDEX_9_NUM)

+    pool_node_init((char *)pool_index_9_node,  POOL_INDEX_9_SIZE,  POOL_INDEX_9_NUM,  index++);

+#endif

+

+#if (POOL_INDEX_10_NUM)

+    pool_node_init((char *)pool_index_10_node, POOL_INDEX_10_SIZE, POOL_INDEX_10_NUM, index++);

+#endif

+

+#if (POOL_INDEX_11_NUM)

+    pool_node_init((char *)pool_index_11_node, POOL_INDEX_11_SIZE, POOL_INDEX_11_NUM, index++);

+#endif

+

+#if (POOL_INDEX_12_NUM)

+    pool_node_init((char *)pool_index_12_node, POOL_INDEX_12_SIZE, POOL_INDEX_12_NUM, index++);

+#endif

+

+#if (POOL_INDEX_13_NUM)

+    pool_node_init((char *)pool_index_13_node, POOL_INDEX_13_SIZE, POOL_INDEX_13_NUM, index++);

+#endif

+

+#if (POOL_INDEX_14_NUM)

+    pool_node_init((char *)pool_index_14_node, POOL_INDEX_14_SIZE, POOL_INDEX_14_NUM, index++);

+#endif

+

+#if (POOL_INDEX_15_NUM)

+    pool_node_init((char *)pool_index_15_node, POOL_INDEX_15_SIZE, POOL_INDEX_15_NUM, index++);

+#endif

+

+    POOL_LOCK(flags);

+    pool_svc.map = POOL_MAP;

+#ifdef POOL_INIT_CHECK

+    pool_svc.init_flag = true;

+#endif

+    POOL_UNLOCK(flags);

+

+#ifdef _USE_MONITOR

+    pool_info.num = POOL_INDEX_NUM;

+    pool_info.ele = (T_ZOss_Mon_Pool_Ele *)zOss_Malloc(pool_info.num * sizeof(T_ZOss_Mon_Pool_Ele));

+    zOss_ASSERT(pool_info.ele != NULL);

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´ÓÄÚ´æ³ØÉêÇëÄÚ´æ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  size:   ÉêÇëÄÚ´æ´óС

+                file:   ÉêÇëÄÚ´æµÄÎļþÃû³Æ

+                line:   ÉêÇëÄÚ´æµÄÎļþÐÐ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÉêÇëµ½µÄÄÚ´æµØÖ·

+* ÆäËü˵Ã÷:     pool_alloc stands for pool alloc

+*******************************************************************************/

+__tcm_func void *pool_alloc(unsigned long size, const char *file, unsigned long line)

+{

+    int index;

+    pool_node_t *node;

+    unsigned long flags;

+    

+#ifdef POOL_DEBUG

+    unsigned long free_count = 0;

+#endif

+

+#ifdef POOL_INIT_CHECK

+    zOss_ASSERT(pool_svc.init_flag == (unsigned long)true);

+    if (pool_svc.init_flag == false)

+    {

+#ifdef POOL_DEBUG

+        pool_alloc_error(NULL, POOL_ERROR_NOT_INIT, size, file, line);

+#endif

+        return NULL;

+    }

+#endif

+

+    if (size == 0) 

+    {

+#ifdef POOL_DEBUG

+        pool_alloc_error(NULL, POOL_ERROR_SIZE_ZERO, size, file, line);

+#endif

+        return NULL;

+    }

+

+    POOL_LOCK(flags);

+

+    index = pool_get_index(size);

+    if (index == -1) 

+    {

+        POOL_UNLOCK(flags);

+        

+#ifdef POOL_DEBUG

+        pool_alloc_error(NULL, POOL_ERROR_SIZE_OVERFLOW, size, file, line);

+#endif

+

+#ifdef POOL_EXHAUST_FROM_HEAP

+        return POOL_MALLOC(size);

+#else

+        return NULL;

+#endif

+    }

+

+    node = pool_svc.free_head[index];

+    pool_svc.free_head[index] = node->free_next;

+    if (node->free_next == NULL)

+    {

+        pool_svc.map &= (~((unsigned long)(1<<index)));

+    }

+    node->free_next = (pool_node_t *)&pool_svc.free_head[index];

+

+#ifdef POOL_LEAK_CHECK

+    node->alloc_prev = &pool_svc.alloc_head[index];

+    node->alloc_next = pool_svc.alloc_head[index];

+    if (pool_svc.alloc_head[index])

+    {

+        pool_svc.alloc_head[index]->alloc_prev = &node->alloc_next;

+    }

+    pool_svc.alloc_head[index] = node;

+#endif

+

+#ifdef POOL_DEBUG

+    free_count = --pool_svc.free_count[index];

+    if (free_count < pool_svc.min_free_count[index])

+    {

+        pool_svc.min_free_count[index] = free_count;

+    }

+    pool_alloc_statistic(size, index);

+#endif

+

+    POOL_UNLOCK(flags);

+

+#ifdef POOL_MAGIC

+    zOss_ASSERT(node->magic == pool_magic[index]);

+    if (node->magic != pool_magic[index]) 

+    {

+#ifdef POOL_DEBUG

+        pool_alloc_error(node, POOL_ERROR_MAGIC_CORRUPT, size, file, line);

+#endif

+    }

+#endif

+

+#ifdef POOL_REALLOC

+    node->size = size;

+#endif

+

+#ifdef POOL_DEBUG

+    node->file      = file;

+    node->line      = line;

+    node->time      = POOL_CURRENT_TIME();

+    node->thread_id = POOL_THREAD_SELF();

+#endif

+

+    return (void *)(node + 1);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÏòÄÚ´æ³ØÊÍ·ÅÄÚ´æ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ptr:    ´ýÊÍ·ÅÄÚ´æµÄµØÖ·

+                file:   ÊÍ·ÅÄÚ´æµÄÎļþÃû³Æ

+                line:   ÊÍ·ÅÄÚ´æµÄÎļþÐÐ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     pool_free stands for pool free

+*******************************************************************************/

+__tcm_func void pool_free(void *ptr, const char *file, unsigned long line)

+{

+    int index;

+    pool_node_t *node;

+    pool_node_t **free_head;

+    unsigned long flags;

+

+    zOss_ASSERT(ptr != NULL);

+    if (ptr == NULL)

+    {

+#ifdef POOL_DEBUG

+        pool_free_error(NULL, POOL_ERROR_FREE_NULL, ptr, file, line);

+#endif

+        return;

+    }

+

+#ifdef POOL_EXHAUST_FROM_HEAP

+    if (ptr >= (void *)CYGMEM_SECTION_heap1)

+    {

+        DBG("pool_free calls free(%p)!\n", ptr);

+        POOL_FREE(ptr);

+        return;

+    }

+#endif

+

+    /* Check ptr valid or not! */

+#ifdef POOL_FREE_CHECK

+    zOss_ASSERT((unsigned long)ptr%4 == 0);

+    if ((unsigned long)ptr%4)

+    {

+#ifdef POOL_DEBUG

+        pool_free_error(NULL, POOL_ERROR_FREE_NOT_ALIGN, ptr, file, line);

+#endif

+        return;

+    }

+

+    zOss_ASSERT((unsigned long)ptr > sizeof(pool_node_t));

+    if ((unsigned long)ptr <= sizeof(pool_node_t))

+    {

+#ifdef POOL_DEBUG

+        pool_free_error(NULL, POOL_ERROR_FREE_INVALID, ptr, file, line);

+#endif

+        return;

+    }

+#endif

+

+    /* Convert ptr to pool_node_t pointer and get free_head pointer ! */

+    node = (pool_node_t *)((char *)ptr - sizeof(pool_node_t));

+    free_head = (pool_node_t **)node->free_next;

+    index = free_head - &pool_svc.free_head[0];

+

+    /* Check free_head valid or not! */

+#ifdef POOL_FREE_CHECK

+    zOss_ASSERT(free_head != NULL);

+    if (free_head == NULL)

+    {

+#ifdef POOL_DEBUG

+        pool_free_error(node, POOL_ERROR_FREE_HEAD_NULL, ptr, file, line);

+#endif

+        return;

+    }

+

+    zOss_ASSERT(free_head >= &pool_svc.free_head[0]);

+    zOss_ASSERT(free_head <= &pool_svc.free_head[POOL_INDEX_NUM - 1]);

+    if (free_head < &pool_svc.free_head[0] ||

+        free_head > &pool_svc.free_head[POOL_INDEX_NUM - 1])

+    {

+#ifdef POOL_DEBUG

+        pool_free_error(node, POOL_ERROR_FREE_HEAD_INVALID, ptr, file, line);

+#endif

+        return;

+    }

+#endif

+

+    /* Check magic! */

+#ifdef POOL_MAGIC

+    zOss_ASSERT(node->magic == pool_magic[index]);

+    if (node->magic != pool_magic[index])

+    {

+#ifdef POOL_DEBUG

+        pool_free_error(node, POOL_ERROR_MAGIC_CORRUPT, ptr, file, line);

+#endif

+        return;

+    }

+#endif

+

+    /* Insert pool node back to pool_svc and update map! */

+    POOL_LOCK(flags);

+    node->free_next = *free_head;

+    *free_head = node;

+    if ((pool_svc.map & (1<<index)) == 0)

+    {  

+        pool_svc.map |= (1<<index);

+    }

+#ifdef POOL_LEAK_CHECK

+    *(node->alloc_prev) = node->alloc_next;

+    if (node->alloc_next)

+    {

+        node->alloc_next->alloc_prev = node->alloc_prev;

+    }

+#endif

+

+#ifdef POOL_REALLOC

+    node->size = 0;

+#endif

+

+#ifdef POOL_DEBUG

+    node->file      = file;

+    node->line      = line;

+    node->time      = 0;

+    node->thread_id = NULL;

+    pool_svc.free_count[index]++;

+#endif

+

+    POOL_UNLOCK(flags);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÖØÐ´ÓÄÚ´æ³ØÉêÇëÄÚ´æ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  old_ptr:    Ô­Ö¸Õë

+                new_size:   ÖØÐÂÉêÇëµÄÄÚ´æ´óС

+                file:       ÖØÐÂÉêÇëÄÚ´æµÄÎļþÃû³Æ

+                line:       ÖØÐÂÉêÇëÄÚ´æµÄÎļþÐÐ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÖØÐÂÉêÇëµ½µÄÄÚ´æµØÖ·

+* ÆäËü˵Ã÷:     pool_realloc stands for pool realloc

+*******************************************************************************/

+void *pool_realloc(void *old_ptr, unsigned long new_size, const char *file, unsigned long line)

+{

+#ifdef POOL_REALLOC

+    if (old_ptr == NULL)

+    {

+        return pool_alloc(new_size, file, line);

+    } 

+    else if (new_size == 0)

+    {

+        pool_free(old_ptr, file, line);

+        return NULL;

+    } 

+    else

+    {

+        void          *new_ptr;

+        pool_node_t   *node    = (pool_node_t *)old_ptr;

+        unsigned long old_size = (--node)->size;

+

+        zOss_AssertEx(new_size != old_size, NULL);

+

+        new_ptr = pool_alloc(new_size, file, line);

+        zOss_AssertEx(new_ptr != NULL, NULL);

+

+        memcpy(new_ptr, old_ptr, (new_size > old_size) ? old_size : new_size);

+        pool_free(old_ptr, file, line);

+        return new_ptr;

+    }

+#else

+    zOss_ASSERT(0);

+

+    return NULL;

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ÄÚ´æ½ÚµãµÄ´óС

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ptr:    ´ý»ñÈ¡´óСµÄÄÚ´æµØÖ·

+                file:   µ÷ÓûñÈ¡´óСº¯ÊýµÄÎļþÃû³Æ

+                line:   µ÷ÓûñÈ¡´óСº¯ÊýµÄÎļþÐÐ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÄÚ´æ½ÚµãµÄ´óС

+* ÆäËü˵Ã÷:     pool_node_size stands for pool node size

+*******************************************************************************/

+unsigned long pool_node_size(void *ptr, const char *file, unsigned long line)

+{

+#ifdef POOL_REALLOC

+    int index;

+    pool_node_t *node;

+    pool_node_t **free_head;

+

+    zOss_ASSERT(ptr != NULL);

+    if (ptr == NULL)

+    {

+    #ifdef POOL_DEBUG

+        pool_size_error(NULL, POOL_ERROR_SIZE_NULL, ptr, file, line);

+    #endif

+        return 0;

+    }

+

+    /* Check ptr valid or not! */

+#ifdef POOL_SIZE_CHECK

+    zOss_ASSERT((unsigned long)ptr%4 == 0);

+    if ((unsigned long)ptr%4)

+    {

+    #ifdef POOL_DEBUG

+        pool_size_error(NULL, POOL_ERROR_SIZE_NOT_ALIGN, ptr, file, line);

+    #endif

+        return 0;

+    }

+

+    zOss_ASSERT((unsigned long)ptr > sizeof(pool_node_t));

+    if ((unsigned long)ptr <= sizeof(pool_node_t))

+    {

+    #ifdef POOL_DEBUG

+        pool_size_error(NULL, POOL_ERROR_SIZE_INVALID, ptr, file, line);

+    #endif

+        return 0;

+    }

+#endif

+

+    /* Convert ptr to pool_node_t pointer and get free_head pointer ! */

+    node = (pool_node_t *)((char *)ptr - sizeof(pool_node_t));

+    free_head = (pool_node_t **)node->free_next;

+    index = free_head - &pool_svc.free_head[0];

+

+    /* Check free_head valid or not! */

+#ifdef POOL_SIZE_CHECK

+    zOss_ASSERT(free_head != NULL);

+    if (free_head == NULL)

+    {

+    #ifdef POOL_DEBUG

+        pool_size_error(node, POOL_ERROR_SIZE_HEAD_NULL, ptr, file, line);

+    #endif

+        return 0;

+    }

+

+    zOss_ASSERT(free_head >= &pool_svc.free_head[0]);

+    zOss_ASSERT(free_head <= &pool_svc.free_head[POOL_INDEX_NUM - 1]);

+    if (free_head < &pool_svc.free_head[0] ||

+        free_head > &pool_svc.free_head[POOL_INDEX_NUM - 1]) 

+    {

+    #ifdef POOL_DEBUG

+        pool_size_error(node, POOL_ERROR_SIZE_HEAD_INVALID, ptr, file, line);

+    #endif

+        return 0;

+    }

+#endif

+

+    /* Check magic! */

+#ifdef POOL_MAGIC

+    zOss_ASSERT(node->magic == pool_magic[index]);

+    if (node->magic != pool_magic[index]) 

+    {

+    #ifdef POOL_DEBUG

+        pool_size_error(node, POOL_ERROR_MAGIC_CORRUPT, ptr, file, line);

+    #endif

+        return 0;

+    }

+#endif

+

+    return node->size;

+

+#else

+    zOss_ASSERT(0);

+

+    return 0;

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼ì²éÄÚ´æ³ØÊÇ·ñй¶

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  timeout:    ÅжÏÄÚ´æÐ¹Â¶Óë·ñµÄ³¬Ê±Öµ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void pool_print_leak(unsigned long timeout)

+{

+#if defined(POOL_LEAK_CHECK) && defined(POOL_DEBUG)

+    int cnt;

+    pool_node_t *node;

+    unsigned long  current_time;

+

+    DBG("********************************************************************\n");

+    DBG("***********************pool leak information************************\n");

+    DBG("********************************************************************\n");

+    for (cnt = 0; cnt < POOL_INDEX_NUM; cnt++)

+    {

+        node = pool_svc.alloc_head[cnt];

+        while (node) 

+        {

+            current_time = POOL_CURRENT_TIME();

+            if (current_time - node->time >= timeout)

+            {

+                DBG("Thread:%p,  File:%s,  Line:%lu\n",

+                    node->thread_id, node->file, node->line);

+            }

+            node = node->alloc_next;

+        }

+    }

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´òÓ¡pallocʧ°ÜµÄ´ÎÊý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void pool_print_alloc_fail(void)

+{

+#ifdef POOL_DEBUG

+    int cnt;

+

+    DBG("********************************************************************\n");

+    DBG("********************pool alloc fail information*********************\n");

+    DBG("********************************************************************\n");

+    for (cnt = 0; cnt < POOL_INDEX_NUM; cnt++) 

+    {

+        DBG("queue node size:%6lu,  queue fail count:%3lu\n",

+            pool_size[cnt], pool_svc.fail_count[cnt]);

+    }

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´òÓ¡ÄÚ´æ³ØÍ³¼ÆÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void pool_print_alloc_statistic(void)

+{

+#ifdef POOL_DEBUG

+    int cnt;

+    int pos;

+    int flag;

+    

+    DBG("********************************************************************\n");

+    DBG("******************pool alloc statistic information******************\n");

+    DBG("********************************************************************\n");

+    for (cnt = 0; cnt < POOL_INDEX_NUM; cnt++) 

+    {

+        for (pos = 0, flag = 0; pos < POOL_ALLOC_STATISTIC_NUM; pos++) 

+        {

+            if (pool_svc.alloc_statistic[cnt][pos]) 

+            {

+                flag = 1;

+                break;

+            }

+        }

+        

+        if (flag)

+        {

+            DBG("queue node size:%6lu", pool_size[cnt]);

+            for (pos = 0; pos < POOL_ALLOC_STATISTIC_NUM; pos++)

+            {

+                DBG("queue alloc_statistic[%d]:%6lu\n",

+                    pos,

+                    pool_svc.alloc_statistic[cnt][pos]);

+            }

+        }

+    }

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´òÓ¡ÄÚ´æ³Ø¿ÕÏÐÄÚ´æÊýºÍ×î´óʹÓÃÇé¿ö

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void pool_print_free(void)

+{

+#ifdef POOL_DEBUG

+    int cnt;

+

+    DBG("********************************************************************\n");

+    DBG("************************pool free information***********************\n");

+    DBG("********************************************************************\n");

+    for (cnt = 0; cnt < POOL_INDEX_NUM; cnt++) 

+    {

+        DBG("queue node size:%6lu,  queue total nodes:%4lu,  queue free nodes:%4lu,  queue max alloc nodes:%4lu\n",

+            pool_size[cnt],

+            pool_num[cnt],

+            pool_svc.free_count[cnt],

+            pool_num[cnt] - pool_svc.min_free_count[cnt]);

+    }

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¿ªÊ¼¸ú×ÙpoolÄÚ´æÐ¹Â¶

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void pool_trace_leak_start(void)

+{

+#if defined(POOL_LEAK_CHECK) && defined(POOL_DEBUG)

+    unsigned long flags;

+

+    POOL_LOCK(flags);

+    pool_svc.trace_leak_time = POOL_CURRENT_TIME();

+    POOL_UNLOCK(flags);

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ½áÊø¸ú×ÙpoolÄÚ´æÐ¹Â¶

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  timeout:    ÅжÏÄÚ´æÐ¹Â¶Óë·ñµÄ³¬Ê±Öµ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void pool_trace_leak_end(unsigned long timeout)

+{

+#if defined(POOL_LEAK_CHECK) && defined(POOL_DEBUG)

+    int cnt;

+    pool_node_t *node;

+    unsigned long current_time;

+    unsigned long trace_leak_time;

+

+    DBG("********************************************************************\n");

+    DBG("*********************pool trace leak information********************\n");

+    DBG("********************************************************************\n");

+    trace_leak_time = pool_svc.trace_leak_time;

+    for (cnt = 0; cnt < POOL_INDEX_NUM; cnt++)

+    {

+        node = pool_svc.alloc_head[cnt];

+        while (node) 

+        {

+            current_time = POOL_CURRENT_TIME();

+            if ( (node->time >= trace_leak_time) && (current_time - node->time >= timeout) ) 

+            {

+                DBG("Thread:%p,  File:%s,  Line:%lu\n",

+                    node->thread_id, node->file, node->line);

+            }

+            node = node->alloc_next;

+        }

+    }

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: ÌṩÄÚ´æ³ØµÄʹÓÃÇé¿ö

+* ²ÎÊý˵Ã÷:

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  pMonPoolInfo: ÄÚ´æ³ØÊ¹ÓÃÐÅÏ¢´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void pool_used_info(T_ZOss_Mon_Pool *pMonPoolInfo)

+{

+#if defined(_USE_MONITOR) && defined(POOL_DEBUG)

+    unsigned long cnt = 0;

+    unsigned long flags;

+

+    if (pMonPoolInfo == NULL)

+    {

+        return;

+    }

+

+    POOL_LOCK(flags);

+    for (cnt = 0; cnt < pool_info.num; cnt++)

+    {

+        pool_info.ele[cnt].size      = pool_size[cnt];

+        pool_info.ele[cnt].total     = pool_num[cnt];

+        pool_info.ele[cnt].used      = pool_num[cnt] - pool_svc.free_count[cnt];

+        pool_info.ele[cnt].max_used  = pool_num[cnt] - pool_svc.min_free_count[cnt];  

+    }

+    POOL_UNLOCK(flags);

+

+    pMonPoolInfo->num = pool_info.num;

+    pMonPoolInfo->ele = pool_info.ele;

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: ÌṩÄÚ´æ³ØµÄÉêÇëʹÓÃÇé¿ö

+* ²ÎÊý˵Ã÷: 

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  pMonPoolAllocInfo: ÄÚ´æ³ØÉêÇëʹÓÃÐÅÏ¢´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷: ÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å,Òò´ËʹÓÃplatÌṩ

+            µÄÄÚ´æ½Ó¿Ú

+**************************************************************************/

+void pool_alloc_info(T_ZOss_Mon_Pool_Alloc *pMonPoolAllocInfo)

+{

+#if defined(_USE_MONITOR) && defined(POOL_DEBUG)

+    T_ZOss_Mon_Pool_Alloc   poolAlloc   = {0};

+    pool_node_t             *pNode      = NULL;

+    unsigned long            cnt         = 0;

+    unsigned long            num         = 0;

+    unsigned long            maxNum      = 0;

+

+    if (pMonPoolAllocInfo == NULL)

+    {

+        return;

+    }

+

+    preempt_disable();

+

+    for (cnt = 0; cnt < POOL_INDEX_NUM; cnt++)

+    {

+        maxNum += pool_num[cnt] - pool_svc.free_count[cnt];

+    }

+    poolAlloc.ele = (T_ZOss_Mon_Pool_Alloc_Ele *)zOss_Malloc(maxNum * sizeof(T_ZOss_Mon_Pool_Alloc_Ele));

+    zOss_ASSERT(poolAlloc.ele != NULL);

+

+    for (cnt = 0, num = 0; cnt < POOL_INDEX_NUM; cnt++)

+    {

+        pNode = pool_svc.alloc_head[cnt];

+        while(pNode != NULL && num < maxNum)

+        {

+            poolAlloc.ele[num].addr         = (unsigned long)(pNode + 1);

+            poolAlloc.ele[num].owner        = pNode->thread_id;

+            poolAlloc.ele[num].timestamp    = pNode->time;

+            poolAlloc.ele[num].file         = pNode->file;

+            poolAlloc.ele[num++].line       = pNode->line;

+            pNode = pNode->alloc_next;

+        }

+    }

+

+    preempt_enable();

+

+    pMonPoolAllocInfo->num = num;

+    pMonPoolAllocInfo->ele = poolAlloc.ele;

+#endif

+}

+

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: monitor_PoolLeakInfo

+* ¹¦ÄÜÃèÊö: ÌṩÄÚ´æ³ØµÄÉêÇëʹÓÃй¶Çé¿ö

+* ²ÎÊý˵Ã÷:

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  pMonPoolLeakInfo: ÄÚ´æ³ØÉêÇëʹÓÃй¶ÐÅÏ¢´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷: ÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å

+**************************************************************************/

+void pool_leak_info(T_ZOss_Mon_Pool_Leak *pMonPoolLeakInfo)

+{

+#if defined(_USE_MONITOR) && defined(POOL_DEBUG)

+    T_ZOss_Mon_Pool_Leak    poolLeak    = {0};

+    pool_node_t             *pNode      = NULL;

+    unsigned long            cnt         = 0;

+    unsigned long            curTime     = 0;

+    unsigned long            num         = 0;

+    unsigned long            maxNum      = 0;

+

+    if (pMonPoolLeakInfo == NULL)

+    {

+        return;

+    }

+

+    preempt_disable();  

+

+    for (cnt = 0; cnt < POOL_INDEX_NUM; cnt++) 

+    {

+        pNode = pool_svc.alloc_head[cnt];

+        while (pNode != NULL) 

+        {

+            curTime = POOL_CURRENT_TIME();

+            if (curTime - pNode->time >= POOL_LEAK_CHECK_TIMEOUT) 

+            {           

+                maxNum++;          

+            }

+            pNode = pNode->alloc_next;  

+        }  

+    }

+    poolLeak.ele = (T_ZOss_Mon_Pool_Leak_Ele *)zOss_Malloc(maxNum * sizeof(T_ZOss_Mon_Pool_Leak_Ele));

+    zOss_ASSERT(poolLeak.ele != NULL);

+

+    for (cnt = 0, num = 0; cnt < POOL_INDEX_NUM; cnt++)

+    {

+        pNode = pool_svc.alloc_head[cnt];

+        while (pNode != NULL)

+        {

+            curTime = POOL_CURRENT_TIME();

+            if (curTime - pNode->time >= POOL_LEAK_CHECK_TIMEOUT && num < maxNum)

+            {

+                poolLeak.ele[num].addr          = (unsigned long)(pNode + 1);

+                poolLeak.ele[num].owner         = pNode->thread_id;

+                poolLeak.ele[num].timestamp     = pNode->time;

+                poolLeak.ele[num].file          = pNode->file;

+                poolLeak.ele[num++].line        = pNode->line;

+            }

+            pNode = pNode->alloc_next;

+        }

+    }

+

+    preempt_enable();

+

+    pMonPoolLeakInfo->num = num;

+    pMonPoolLeakInfo->ele = poolLeak.ele;

+#endif

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_posix.c b/cp/ps/plat/src/oss/osa/com/oss_posix.c
new file mode 100644
index 0000000..8883753
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_posix.c
@@ -0,0 +1,280 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : oss_posix.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ossµÄPOSIX¿â½Ó¿Ú

+* ×÷    Õß : µËÄþˆÒ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2013/01/12

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 

+* ÐÞ ¸Ä ÈË : 

+* ÐÞ¸ÄÈÕÆÚ : 

+* ÐÞ¸ÄÄÚÈÝ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#if defined _OS_TOS || defined _OS_OSE

+#include "drv_api.h"

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+#if defined _OS_OSE || defined _OS_WIN

+static ZOSS_S_TIMEZONE gOsa_tz  = {0};  /* ±£´ætimezone */

+#endif

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef _OS_OSE

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_Gettimeofday

+* ¹¦ÄÜÃèÊö: »ñȡʱ¼äºÍÊ±Çø;

+* ²ÎÊý˵Ã÷: (IN)tv:ʱ¼äµÄ½á¹¹Ö¸Õ룬²»ÄÜΪNULL

+                tz:The use of the timezone structure is obsolete.the tz argument

+                     should normally be specified as NULL

+* ·µ »Ø Öµ: tickÊý

+* ÆäËü˵Ã÷: Local time zone(tz) not implemented.ÔÚLinuxÏÂtimezoneµÄʹÓÃÒÑ

+*           ¾­·Ï³ý¶ø²»ÔÙʹÓÃ.ÒòΪÓÐÐí¶àµØÇø¶¼ÓÐÈÕ¹â½ÚԼʱ¼ä,ÈÕ¹â

+*           ½ÚԼʱ¼äµÄʹÓÃÓë·ñ,ÍùÍùÓëÎÞ¿ÉÔ¤²âµÄÕþÖÎÒòËØÏà¹Ø,ûÓÐ

+*           ¼òµ¥µÄ·½·¨À´Êµ×÷ÕâÏîÉè¼Æ.

+**************************************************************************/

+UINT32  zOss_Gettimeofday(ZOSS_S_TIMEVAL *tv, ZOSS_S_TIMEZONE *tz)

+{

+    zOss_AssertEx(tv != NULL, ZOSS_ERROR);

+    

+    /* ose ûÓд¦Àítz */

+    if (gettimeofday(tv, tz) == -1)

+    {

+        return ZOSS_ERROR;

+    }

+

+    if (tz != NULL)

+    {

+        *tz = gOsa_tz;

+    }

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_Settimeofday

+* ¹¦ÄÜÃèÊö: ÉèÖòÙ×÷ϵͳÈí¼þʱÖÓ¼°RTCÓ²¼þʱÖÓ,¹©Óû§Ê¹ÓÃ

+* ²ÎÊý˵Ã÷: (IN)    tv:½«ÉèÖÃʱ¼äµÄ½á¹¹Ö¸Õ룬ΪNULLʱ±£³Ö²»±ä

+                    tz:½«ÉèÖõÄÊ±ÇøÐÅÏ¢½á¹¹Ö¸Õë,¿ÉÒÔΪNULL,ΪNULLʱ±£³Ö²»±ä

+* ·µ »Ø Öµ:  ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:  Local time zone(tz) not implemented. ÔÚLinuxÏÂtimezoneµÄʹÓÃÒÑ

+*            ¾­·Ï³ý¶ø²»ÔÙʹÓÃ.ÒòΪÓÐÐí¶àµØÇø¶¼ÓÐÈÕ¹â½ÚԼʱ¼ä,ÈÕ¹â

+*            ½ÚԼʱ¼äµÄʹÓÃÓë·ñ,ÍùÍùÓëÎÞ¿ÉÔ¤²âµÄÕþÖÎÒòËØÏà¹Ø,ûÓÐ

+*            ¼òµ¥µÄ·½·¨À´Êµ×÷ÕâÏîÉè¼Æ.

+**************************************************************************/

+UINT32  zOss_Settimeofday(ZOSS_S_TIMEVAL *tv, ZOSS_S_TIMEZONE *tz)

+{

+    struct tm           *tTm        = NULL;

+    T_ZDrvRtc_TimeDate  tDatetime   = {0};

+    T_ZDrvRtc_TimeDate  tTemp       = {0};

+

+    zOss_AssertEx(tv != NULL, ZOSS_ERROR);

+    

+    tTm = gmtime((const time_t* )&(tv->tv_sec));

+    if (0 != Rtc_GetDateTime(&tTemp))

+    {

+       return ZOSS_ERROR;

+    }    

+

+    tDatetime.year          = (UINT16)tTm->tm_year + 1900;

+    tDatetime.month         = (UINT8)tTm->tm_mon + 1; 

+    tDatetime.day           = (UINT8)tTm->tm_mday;

+    tDatetime.hour          = (UINT8)tTm->tm_hour;

+    tDatetime.minute        = (UINT8)tTm->tm_min;

+    tDatetime.second        = (UINT8)tTm->tm_sec;

+    tDatetime.PM_flag       = tTemp.PM_flag;

+    tDatetime.mode_12_hour  = tTemp.mode_12_hour;

+    tDatetime.wday          = tTemp.wday;

+    

+    if (0 != Rtc_SetDateTime(&tDatetime))

+    {

+        return ZOSS_ERROR;

+    }    

+

+    /* ´ýÌí¼Ó */

+    /* ose ûÓд¦Àítz */

+    if (settimeofday(tv, tz) == -1)

+    {

+        Rtc_SetDateTime(&tTemp);

+        return ZOSS_ERROR;

+    }    

+     

+    if (tz != NULL)

+    {

+        gOsa_tz = *tz ;

+    }

+

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef _OS_WIN

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_Gettimeofday

+* ¹¦ÄÜÃèÊö£º »ñȡʱ¼äºÍÊ±Çø

+* ²ÎÊý˵Ã÷£º (IN)

+             (OUT)

+             tv: ±£´æ»ñÈ¡µÄʱ¼äµÄ½á¹¹Ö¸Õë,±£´æ1970µ½µ±Ç°µÄÃëÊýºÍ΢ÃëÊý

+             tz: ±£´æ»ñÈ¡µÄÊ±ÇøÐÅÏ¢½á¹¹Ö¸Õë

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º Local time zone(tz) not implemented.ÔÚLinuxÏÂtimezoneµÄʹÓÃÒÑ

+             ¾­·Ï³ý¶ø²»ÔÙʹÓÃ.ÒòΪÓÐÐí¶àµØÇø¶¼ÓÐÈÕ¹â½ÚԼʱ¼ä,ÈÕ¹â½ÚԼʱ¼äµÄ

+             ʹÓÃÓë·ñ,ÍùÍùÓëÎÞ¿ÉÔ¤²âµÄÕþÖÎÒòËØÏà¹Ø,ûÓмòµ¥µÄ·½·¨À´Êµ×÷ÕâÏîÉè¼Æ

+             ¶Ôwindowsƽ̨£¬tz²ÎÊýÎÞЧ£»

+**************************************************************************/

+UINT32 zOss_Gettimeofday(ZOSS_S_TIMEVAL *tv, ZOSS_S_TIMEZONE *tz)

+{

+    SYSTEMTIME  systime;

+    struct      tm tm_time;

+    time_t      tm_t;

+

+    zOss_AssertEx(NULL != tv, ZOSS_ERROR);

+    

+    GetLocalTime(&systime);

+    tm_time.tm_sec  = systime.wSecond;

+    tm_time.tm_min  = systime.wMinute;

+    tm_time.tm_hour = systime.wHour;

+    tm_time.tm_mday = systime.wDay;

+    tm_time.tm_mon  = systime.wMonth -1;    /* systime.wMonth(1-12),tm_time.tm_mon(0-11)    */

+    tm_time.tm_year = systime.wYear - 1900;   /* ´Ó1900µ½ÏÖÔÚµÄʱ¼ä²î                         */

+

+    tm_t            = mktime(&tm_time);

+    tv->tv_sec      = tm_t;

+    tv->tv_usec     = systime.wMilliseconds * 1000;

+

+    if (tz != NULL)

+    {

+        *tz = gOsa_tz;

+    }

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_Settimeofday

+* ¹¦ÄÜÃèÊö£º ÉèÖÃʱ¼äºÍÊ±Çø

+* ²ÎÊý˵Ã÷£º (IN)

+             tv: ½«ÉèÖÃʱ¼äµÄ½á¹¹Ö¸Õë

+             tz: ½«ÉèÖõÄÊ±ÇøÐÅÏ¢½á¹¹Ö¸Õë

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS,ʧ°Ü:ZOSS_ERROR£»

+* ÆäËü˵Ã÷£º Local time zone(tz) not implemented.ÔÚLinuxÏÂtimezoneµÄʹÓÃÒÑ

+             ¾­·Ï³ý¶ø²»ÔÙʹÓÃ.ÒòΪÓÐÐí¶àµØÇø¶¼ÓÐÈÕ¹â½ÚԼʱ¼ä,ÈÕ¹â½ÚԼʱ¼äµÄ

+             ʹÓÃÓë·ñ,ÍùÍùÓëÎÞ¿ÉÔ¤²âµÄÕþÖÎÒòËØÏà¹Ø,ûÓмòµ¥µÄ·½·¨À´Êµ×÷ÕâÏîÉè¼Æ

+             windowsƽ̨Õâ¸ö½Ó¿ÚÎÞЧ

+**************************************************************************/

+UINT32 zOss_Settimeofday(ZOSS_S_TIMEVAL *tv, ZOSS_S_TIMEZONE *tz)

+{

+    SYSTEMTIME  systime;

+    struct      tm tm_time;

+

+    if (tv != NULL) /* for pclint check */

+    {

+        tm_time = *localtime(&tv->tv_sec);

+        systime.wSecond         = (UINT16)tm_time.tm_sec;

+        systime.wMinute         = (UINT16)tm_time.tm_min;

+        systime.wHour           = (UINT16)tm_time.tm_hour;

+        systime.wDay            = (UINT16)tm_time.tm_mday;

+        systime.wMonth          = (UINT16)tm_time.tm_mon + 1;       /* systime.wMonth(1-12),tm_time.tm_mon(0-11)  */

+        systime.wYear           = (UINT16)tm_time.tm_year + 1900;   /* ´Ó1900µ½ÏÖÔÚµÄʱ¼ä²î                       */

+        systime.wDayOfWeek      = (UINT16)tm_time.tm_wday;

+        systime.wMilliseconds   = (UINT16)(WORD)tv->tv_usec / 1000;

+

+        if (!SetLocalTime(&systime))

+        {

+            return ZOSS_ERROR;

+        }

+    }

+

+    if (tz != NULL)

+    {

+        gOsa_tz = *tz;

+    }

+

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef _OS_LINUX

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñȡʱ¼äºÍÊ±Çø

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  tv:     ʱ¼äµÄ½á¹¹Ö¸Õ룬²»ÄÜΪNULL£¬·ñÔòϵͳ¶ÏÑÔ£»

+                tz:     Ê±ÇøµÄ½á¹¹Ö¸Õ룬¿ÉΪNULL¡£

+* ·µ »Ø Öµ:     ²Ù×÷³É¹¦£¬·µ»ØZOSS_SUCCESS£»

+                ²Ù×÷ʧ°Ü£¬·µ»ØZOSS_ERROR¡£

+* ÆäËü˵Ã÷:     Local time zone(tz) not implemented.ÔÚLinuxÏÂtimezoneµÄʹÓÃÒѾ­

+                ·Ï³ý¶ø²»ÔÙʹÓÃ.ÒòΪÓÐÐí¶àµØÇø¶¼ÓÐÈÕ¹â½ÚԼʱ¼ä,ÈÕ¹â½ÚԼʱ¼äµÄʹ

+                ÓÃÓë·ñ,ÍùÍùÓëÎÞ¿ÉÔ¤²âµÄÕþÖÎÒòËØÏà¹Ø,ûÓмòµ¥µÄ·½·¨À´Êµ×÷ÕâÏîÉè¼Æ

+**************************************************************************/

+UINT32  zOss_Gettimeofday(ZOSS_S_TIMEVAL *tv, ZOSS_S_TIMEZONE *tz)

+{

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÉèÖòÙ×÷ϵͳÈí¼þʱÖÓ¼°RTCÓ²¼þʱÖÓ,¹©Óû§Ê¹ÓÃ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  tv:     ½«ÉèÖÃʱ¼äµÄ½á¹¹Ö¸Õ룬ΪNULLʱ±£³Ö²»±ä£»

+                tz:     ½«ÉèÖÃÊ±ÇøµÄ½á¹¹Ö¸Õ룬ΪNULLʱ±£³Ö²»±ä¡£

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ²Ù×÷³É¹¦£¬·µ»ØZOSS_SUCCESS£»

+                ²Ù×÷ʧ°Ü£¬·µ»ØZOSS_ERROR¡£

+* ÆäËü˵Ã÷:     Local time zone(tz) not implemented. ÔÚLinuxÏÂtimezoneµÄʹÓÃÒѾ­

+                ·Ï³ý¶ø²»ÔÙʹÓÃ.ÒòΪÓÐÐí¶àµØÇø¶¼ÓÐÈÕ¹â½ÚԼʱ¼ä,ÈÕ¹â½ÚԼʱ¼äµÄʹÓÃ

+                Óë·ñ,ÍùÍùÓëÎÞ¿ÉÔ¤²âµÄÕþÖÎÒòËØÏà¹Ø,ûÓмòµ¥µÄ·½·¨À´Êµ×÷ÕâÏîÉè¼Æ

+**************************************************************************/

+UINT32 zOss_Settimeofday(ZOSS_S_TIMEVAL *tv, ZOSS_S_TIMEZONE *tz)

+{

+    return ZOSS_SUCCESS;

+}

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef __cplusplus

+ }

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_pub.c b/cp/ps/plat/src/oss/osa/com/oss_pub.c
new file mode 100644
index 0000000..2f8b93a
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_pub.c
@@ -0,0 +1,199 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : oss_pub.c

+* ÎÄ ¼þ Ãû : oss_pub.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ºÎº£½¨

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/03/24

+* ÆäËü˵Ã÷ :          

+**************************************************************************/

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/09/15

+* ÐÞ¸ÄÄÚÈÝ : PC-LINT¼ì²éÓÚ±àÂë¹æ·¶ÐÞ¸Ä EC: 617001781881  

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC: 617001781957

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "osa.h"

+#include "oss_api.h"

+

+#if defined (_OS_TOS) || defined (_OS_OSE) || defined (_OS_LINUX)

+#include "drv_api.h"

+#endif

+

+#ifdef _OS_OSE

+#include "hal_rtc.h"

+#include "rtc.h"

+#include "errno.h"

+#endif

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static BOOL gDataTransFlag = FALSE;

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetTransDataFlag

+* ¹¦ÄÜÃèÊö£º ÓÐÉÏÐÐÊý¾ÝʱÖÃµãµÆ±ê׼λ

+* ²ÎÊý˵Ã÷£º (IN)

+             (OUT)

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º ¸Ã½Ó¿ÚÔÚÊý¾Ý´«Êäʱµ÷Óã¬ÓÉÆ½Ì¨²àµ÷ÓÃ

+**************************************************************************/

+VOID zOss_SetTransDataFlag(VOID)

+{

+    gDataTransFlag = TRUE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetTransDataFlag

+* ¹¦ÄÜÃèÊö£º »ñÈ¡µçµÆ±ê־λ״̬

+* ²ÎÊý˵Ã÷£º (IN)

+             (OUT)

+* ·µ »Ø Öµ£º ÓÐÊý¾Ý´«Ê䣬·µ»ØTRUE£¬·ñÔò·µ»ØFALSE

+* ÆäËü˵Ã÷£º ¸Ã½Ó¿Ú×÷Ϊ¶ÔÍâ½Ó¿Ú£¬¹©ÐͺŻúµãµÆÓ¦Óõ÷ÓÃ

+**************************************************************************/

+BOOL zOss_GetTransDataFlag(VOID)

+{

+    BOOL temp       = gDataTransFlag;

+    gDataTransFlag  = FALSE;

+    return temp;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetLastError

+* ¹¦ÄÜÃèÊö£º »ñµÃϵͳ×î½üÒ»´Î´íÎóÂë

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ:  C±ê×¼¿âµÄ´íÎóÂë

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+SINT32 zOss_GetLastError(VOID)

+{

+#if defined (_OS_TOS) || defined (_OS_OSE)

+    return (SINT32)errno;

+#elif defined (_OS_LINUX)

+    return 0x00;

+#elif defined (_OS_WIN)

+    return (SINT32)GetLastError();

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÉèÖÃC±ê×¼¿âµÄ´íÎóÂë

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  err:    ´íÎóÂë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID OSA_SetLastError(SINT32 err)

+{

+#if defined (_OS_TOS) || defined (_OS_OSE)

+    errno   = err;

+#elif defined (_OS_LINUX)

+    err     = err;

+#else

+    err     = err;

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¶ÁÈ¡µ±Ç°µÄϵͳʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     µ±Ç°µÄϵͳʱ¼ä

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 Osa_HwTimeRead(VOID)

+{

+#ifdef _OS_WIN

+    return 0;

+#else

+    return zDrvTimer_Stamp();

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º SYSTIME_Init

+* ¹¦ÄÜÃèÊö£º ϵͳʱ¼ä³õʼ»¯º¯Êý

+* ²ÎÊý˵Ã÷£º (IN)

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _OS_OSE

+UINT32 SYSTIME_Init(VOID)

+{

+    T_ZDrvRtc_TimeDate tDatetime   = {0};

+    struct tm          tTimeVal    = {0};

+    struct TimePair    tPair       = {0};

+    

+    if (0 != halRtc_GetDateTime(&tDatetime))

+    {

+        return ZOSS_SUCCESS;

+    }

+    

+    tTimeVal.tm_year    = tDatetime.year - 1900;

+    tTimeVal.tm_mon     = tDatetime.month - 1;

+    tTimeVal.tm_mday    = tDatetime.day;

+    tTimeVal.tm_hour    = tDatetime.hour;

+    tTimeVal.tm_min     = tDatetime.minute;

+    tTimeVal.tm_sec     = tDatetime.second;

+    tPair.seconds       = mktime(&tTimeVal);

+    

+    if (0xFFFFFFFF == tPair.seconds)

+    {

+        return ZOSS_SUCCESS;

+    }

+    

+    rtc_set_time((const struct TimePair *)&tPair);

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef __cplusplus

+} 

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_queue.c b/cp/ps/plat/src/oss/osa/com/oss_queue.c
new file mode 100644
index 0000000..7addc86
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_queue.c
@@ -0,0 +1,305 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : oss_queue.c

+* ÎÄ ¼þ Ãû : oss_queue.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ÏûÏ¢¶ÓÁеÄʵÏÖÎļþ

+* ×÷    Õß : xuxingkui

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007/06/01

+* ÆäËü˵Ã÷ :          

+**************************************************************************/

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : xiaxinguo

+* ÐÞ¸ÄÈÕÆÚ : 2007/10/16

+* ÐÞ¸ÄÄÚÈÝ : 

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/09/15

+* ÐÞ¸ÄÄÚÈÝ : PC-LINT¼ì²éÓÚ±àÂë¹æ·¶ÐÞ¸Ä EC: 617001781881  

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC: 617001781957

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "osa.h"

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ALIGN_NEXT(size,align)	((((UINT32)(size)) + align - 1) & (~(align - 1))) 

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    T_ZOss_Node node;       /* Á´±í½áµã         */

+    UINT16      msg_size;   /* ʵ¼ÊÏûÏ¢×Ö½ÚÊý   */

+    CHAR        msg[1];     /* ÏûϢʵÌå         */

+}T_Queue_Msg;

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_QueueCreate

+* ¹¦ÄÜÃèÊö: ´´½¨ÏûÏ¢¶ÓÁÐ

+* ²ÎÊý˵Ã÷£º(IN)

+                queue_name:ÏûÏ¢¶ÓÁÐÃû³Æ, ×î´ó³¤¶È²»Äܳ¬¹ýMAX_QUEUENAME_LEN(63)

+                maxMsgs:¶ÓÁеÄ×î´óÏûÏ¢Êý

+                maxMsgLen:Ò»ÌõÏûÏ¢µÄ×î´ó×Ö½ÚÊý

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦£ºÏûÏ¢¶ÓÁÐID; ʧ°Ü:ZOSS_NULL

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+ZOSS_QUEUE_ID zOss_QueueCreate(const CHAR *queue_name, UINT32 maxMsgs, UINT32 maxMsgLen)

+{

+    T_ZOss_Queue    *queue_id   = NULL;

+    UINT32          i           = 0;

+    UINT32          block_size  = 0;

+    CHAR            *ptr        = NULL;

+

+    block_size  = sizeof(T_Queue_Msg) + maxMsgLen;

+    block_size  = ALIGN_NEXT(block_size, 4); /* ÓÃÓÚ4×Ö½Ú¶ÔÆë */

+    queue_id    = (T_ZOss_Queue *)zOss_Malloc(sizeof(T_ZOss_Queue) + block_size * maxMsgs);

+

+    if (queue_id == NULL)

+    {

+        return ZOSS_NULL;

+    }

+

+    zOss_Memset(queue_id, 0, sizeof(T_ZOss_Queue));

+

+    zOss_ListInit(&(queue_id->queue_list));

+    zOss_ListInit(&(queue_id->free_list));

+    

+    queue_id->mutex_id = zOss_CreateMutex(queue_name, ZOSS_INHERIT);

+

+    if (NULL == queue_id->mutex_id)

+    {

+        zOss_Free(queue_id);

+        return ZOSS_NULL;

+    }

+

+    queue_id->sem_id = zOss_CreateSemaphore(queue_name, 0);

+

+    if (NULL == queue_id->sem_id)

+    {

+        zOss_DeleteMutex( queue_id->mutex_id);

+        zOss_Free(queue_id);

+        return ZOSS_NULL;

+    }

+

+    queue_id->max_msgs      = maxMsgs;

+    queue_id->max_msgLen    = maxMsgLen;

+    ptr                     = (CHAR *)queue_id + sizeof(T_ZOss_Queue); /* Ö¸ÏòµÚÒ»¸ö½Úµã */

+

+    for(i = 0; i < maxMsgs; i++)

+    {

+        zOss_ListAdd(&queue_id->free_list, (T_ZOss_Node *)ptr);

+        

+        ptr += block_size; /* Ö¸ÏòÏÂÒ»½Úµã */

+    }

+

+    return (ZOSS_QUEUE_ID)queue_id;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_QueueSend

+* ¹¦ÄÜÃèÊö: ÏòÏûÏ¢¶ÓÁз¢ËÍÏûÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+                queue_id:ÏûÏ¢¶ÓÁÐID

+                msg_ptr:ÏûÏ¢Ö¸Õë

+                size:ÏûÏ¢´óС

+                timeout:µ±ÏûÏ¢¶ÓÁÐÂúʱ,µÈ´ýʱ¼ä.

+                priority:

+                    ZOSS_QUEUE_MSG_PRI_NORMAL:·Åµ½ÏûÏ¢¶ÓÁÐβ

+                    ZOSS_QUEUE_MSG_PRI_URGENT :·Åµ½ÏûÏ¢¶ÓÁÐÊ×		

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦:ZOSS_SUCCESS; ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷: ¿½±´ÏûÏ¢£¬×èÈûÐÔº¯Êý

+**************************************************************************/ 

+UINT32 zOss_QueueSend(ZOSS_QUEUE_ID queue_id, VOID *msg_ptr, UINT32 size, UINT32 timeout, UINT32 priority)

+{

+    T_ZOss_Node     *pCurNode   = NULL;

+    T_Queue_Msg     *pCurMsg    = NULL;

+    T_ZOss_Queue    *pCurQueue  = NULL;

+

+    zOss_AssertEx(queue_id != NULL && msg_ptr != NULL && size > 0, ZOSS_ERROR);	

+    

+    pCurQueue = (T_ZOss_Queue *)queue_id;

+

+    if(pCurQueue->max_msgLen < size)/* ³¬³ö×î´óÏûÏ¢×Ö½ÚÊý */

+    {

+        return ZOSS_ERROR;

+    }

+

+    if(zOss_GetMutex(pCurQueue->mutex_id, timeout) != ZOSS_SUCCESS) 

+    {

+        return ZOSS_ERROR;

+    }

+    

+    /* ´Ó¿ÕÏÐÁ´±íÖлñȡһ¸öÄÚ´æ¿é */

+    pCurNode = zOss_ListFirst(&pCurQueue->free_list);

+

+    if (pCurNode == NULL)

+    {

+        zOss_PutMutex(pCurQueue->mutex_id);

+        

+        return ZOSS_ERROR;

+    }

+    zOss_ListDelete(&pCurQueue->free_list, pCurNode);

+

+    /* Ìî³äÄÚ´æ¿éÄÚÈÝ */

+    pCurMsg             = (T_Queue_Msg *)pCurNode;

+    pCurMsg->msg_size   = (UINT16)size;

+

+    zOss_Memcpy(pCurMsg->msg, msg_ptr, size);

+

+    /* ¹Òµ½Ê¹ÓÃÁ´±íÉÏ */

+    if(priority == ZOSS_QUEUE_MSG_PRI_URGENT)

+    {

+        zOss_ListInsert(&pCurQueue->queue_list, NULL, pCurNode);/* Á´±íÊ× */

+    }

+    else

+    {

+        zOss_ListAdd(&pCurQueue->queue_list, pCurNode); /* Á´±íβ */

+    }

+

+    zOss_PutMutex(pCurQueue->mutex_id);

+

+    /* ´¥·¢¶Ô·½½ÓÊÕ */

+    zOss_PutSemaphore(pCurQueue->sem_id);

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_QueueRecv

+* ¹¦ÄÜÃèÊö: ½ÓÊÕÏûÏ¢¶ÓÁÐÏûÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+                queue_id:ÏûÏ¢¶ÓÁÐID

+                timeout:µ±ÏûÏ¢¶ÓÁпÕʱ,µÈ´ýʱ¼ä.

+                buffer:ÏûÏ¢»º³å

+                maxsize:½ÓÊÕµÄ×î´ó×Ö½ÚÊý

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦:ʵ¼ÊÊÕµ½µÄ×Ö½ÚÊý;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷: ¿½±´ÏûÏ¢£¬×èÈûÐÔº¯Êý

+**************************************************************************/ 

+UINT32 zOss_QueueRecv(ZOSS_QUEUE_ID queue_id, VOID *buffer, UINT32 maxsize, UINT32 timeout)

+{

+    T_ZOss_Node     *pCurNode   = NULL;

+    T_ZOss_Queue    *pCurQueue  = NULL;

+    T_Queue_Msg     *pCurMsg    = NULL;

+    UINT32          result      = ZOSS_ERROR;

+

+    if (queue_id == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+

+    pCurQueue = (T_ZOss_Queue *)queue_id;

+

+    /* µÈ´ýÊý¾Ýµ½´ï */

+    if( zOss_GetSemaphore(pCurQueue->sem_id, timeout) != ZOSS_SUCCESS )

+    { 

+        return ZOSS_ERROR;

+    }

+    

+    /* ´ÓʹÓÃÁ´±íÖÐÈ¡Êý¾Ý£¬Õý³£Çé¿ö»ñÈ¡µ½ÐźÅÁ¿¾ÍÓ¦¸Ã¿ÉÒÔ»ñÈ¡µ½»¥³âÌå */

+    if(zOss_GetMutex(pCurQueue->mutex_id, timeout) != ZOSS_SUCCESS)

+    {

+        /* Èç¹ûÄܹ»»ñÈ¡ÐźÅÁ¿£¬±Ø¶¨ÓÐÊý¾Ý£¬µ«»ñÈ¡²»µ½»¥³âÌ壬Ϊ·ÀÖ¹ÉÙ»ñÈ¡Êý¾Ý£¬±ØÐëʹÐźÅÁ¿¼ÆÊý±£³ÖÔ­Öµ */

+        zOss_PutSemaphore(pCurQueue->sem_id);

+        return ZOSS_ERROR;

+    }

+

+    pCurNode = zOss_ListFirst(&pCurQueue->queue_list);

+

+    if (pCurNode == NULL)

+    {

+        result = 0;

+    }

+    else

+    {

+        zOss_ListDelete(&pCurQueue->queue_list, pCurNode);

+       

+        /* ½«Êý¾Ý¸æÖªÓû§ */

+        pCurMsg = (T_Queue_Msg *)pCurNode;

+        result  = pCurMsg->msg_size < maxsize ? pCurMsg->msg_size : maxsize;

+        

+        zOss_Memcpy(buffer, pCurMsg->msg, result);

+        zOss_Memset(pCurMsg->msg, 0, pCurQueue->max_msgLen); /* ½«½ÚµãÏûÏ¢ÄÚÈÝÇå0   */

+        zOss_ListAdd(&pCurQueue->free_list, pCurNode);  /* ½«Êý¾Ý¿é·Åµ½¿ÕÏÐÁ´±íÉÏ   */

+    }

+

+    zOss_PutMutex(pCurQueue->mutex_id);

+    

+    return result;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_QueueFreeCount

+* ¹¦ÄÜÃèÊö: »ñÈ¡¶ÓÁÐÖпÕÏпéÊý

+* ²ÎÊý˵Ã÷£º 

+            (IN)

+                queue_id:ÏûÏ¢¶ÓÁÐID

+            (OUT)

+* ·µ »Ø Öµ: ¶ÓÁеĿÕÏнڵãÊýÄ¿

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+UINT32 zOss_QueueFreeCount(ZOSS_QUEUE_ID queue_id)

+{

+    T_ZOss_Queue  *pCurQueue = NULL;

+

+    zOss_AssertEx(queue_id != NULL, 0);	

+

+    pCurQueue = (T_ZOss_Queue *)queue_id;

+    return zOss_ListCount(&pCurQueue->free_list);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_QueueDelete

+* ¹¦ÄÜÃèÊö: ɾ³ýÏûÏ¢¶ÓÁÐ

+* ²ÎÊý˵Ã÷£º 

+            (IN)

+                queue_id:ÏûÏ¢¶ÓÁÐID

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦£ºZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+UINT32 zOss_QueueDelete(ZOSS_QUEUE_ID queue_id)

+{

+    T_ZOss_Queue    *pCurQueue  = NULL;

+

+    zOss_AssertEx(queue_id != NULL, ZOSS_ERROR);

+    

+    pCurQueue = (T_ZOss_Queue *)queue_id;

+

+    zOss_DeleteSemaphore(pCurQueue->sem_id);

+    zOss_DeleteMutex(pCurQueue->mutex_id);

+    zOss_Free(pCurQueue);

+    return ZOSS_SUCCESS;

+}

+

+#ifdef __cplusplus

+    }

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_ring.c b/cp/ps/plat/src/oss/osa/com/oss_ring.c
new file mode 100644
index 0000000..5c2e81f
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_ring.c
@@ -0,0 +1,404 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : oss_ring.c

+* ÎÄ ¼þ Ãû : oss_ring.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : »·Ðλº³å,²Î¿¼vxworksʵÏÖ

+* ×÷    Õß : ºÎº£½¨

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007/08/20

+* ÆäËü˵Ã÷ :          

+**************************************************************************/

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/09/15

+* ÐÞ¸ÄÄÚÈÝ : PC-LINT¼ì²éÓÚ±àÂë¹æ·¶ÐÞ¸Ä EC: 617001781881  

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC: 617001781957

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif   

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* storage class specifier definitions */

+#define RING_MIN(x, y)  (((x) < (y)) ? (x) : (y))

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_RingCreate

+* ¹¦ÄÜÃèÊö: ´´½¨»·Ðλº³å

+* ²ÎÊý˵Ã÷£º(IN)

+                nbytes:»·Ðλº³åµÄ´óС£¬µ¥Î»£º×Ö½Ú

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦£º»·Ðλº³åID; ʧ°Ü:ZOSS_NULL

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+T_ZOss_RingId zOss_RingCreate(SINT32 nbytes)

+{

+    CHAR            *buffer = NULL;

+    T_ZOss_RingId   ring_id = (T_ZOss_RingId)zOss_Malloc(sizeof (T_ZOss_Ring));

+

+    if (ring_id == NULL)

+    {

+        return NULL;

+    }

+

+    /*bump number of bytes requested because ring buffer algorithm

+                always leaves at least one empty byte in buffer  */

+

+    buffer = (CHAR *)zOss_Malloc((unsigned) ++nbytes);

+

+    if (buffer == NULL)

+    {

+        zOss_Free((CHAR *)ring_id);

+        return NULL;

+    }

+

+    ring_id->bufSize    = nbytes;

+    ring_id->buf        = buffer;

+

+    zOss_RingFlush(ring_id);

+

+    return ring_id;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_RingFreeBytes

+* ¹¦ÄÜÃèÊö: ɾ³ý»·Ðλº³å

+* ²ÎÊý˵Ã÷£º(IN)

+                ring_id:»·Ðλº³åID

+            (OUT)

+* ·µ »Ø Öµ:  

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+VOID zOss_RingDelete(T_ZOss_RingId ring_id)

+{

+    zOss_AssertExN(ring_id != NULL);

+    zOss_Free (ring_id->buf);

+    zOss_Free (ring_id);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_RingFlush

+* ¹¦ÄÜÃèÊö: Çå³ý»·Ðλº³åµÄËùÓÐÊý¾Ý

+* ²ÎÊý˵Ã÷£º(IN)

+                ring_id:»·Ðλº³åID

+            (OUT)

+* ·µ »Ø Öµ:  

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+VOID zOss_RingFlush(T_ZOss_RingId ring_id)

+{

+    zOss_AssertExN(ring_id != NULL);

+    ring_id->pToBuf   = 0;

+    ring_id->pFromBuf = 0;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_RingBufGet

+* ¹¦ÄÜÃèÊö: ¶ÁÈ¡»·Ðλº³å¶ÓÁеÄÊý¾Ý¿â

+* ²ÎÊý˵Ã÷£º(IN)

+                ring_id:»·Ðλº³åID

+                buffer:Êä³ö»º³åÖ¸Õë	  

+                maxbytes:ÐèÒª¶ÁÈ¡µÄ×î´ó×Ö½ÚÊý

+            (OUT)

+                buffer:Êä³ö»º³åÖ¸Õë	  

+* ·µ »Ø Öµ: ʵ¼Ê¶ÁÈ¡µÄ×Ö½ÚÊý

+* ÆäËü˵Ã÷: ·µ»ØÖµ¿ÉÄÜÓëÐèÒª¶ÁÈ¡µÄ×Ö½ÚÊý²»Ò»Ö¡£Èç¹û»º³åΪ¿Õ£¬Ôò·µ»Ø0

+**************************************************************************/ 

+SINT32 zOss_RingBufGet(T_ZOss_RingId ring_id, CHAR *buffer, SINT32 maxbytes)

+{

+    SINT32 bytesgot = 0;

+    SINT32 pToBuf   = 0;

+    SINT32 bytes2   = 0;

+    SINT32 pRngTmp  = 0;

+    

+    zOss_AssertEx(ring_id != NULL && buffer != NULL, 0);

+    

+    pToBuf = ring_id->pToBuf;

+    if (pToBuf >= ring_id->pFromBuf)

+    {

+        /* pToBuf has not wrapped around */

+        bytesgot = RING_MIN (maxbytes, pToBuf - ring_id->pFromBuf);

+        

+        zOss_Memmove(buffer, &ring_id->buf[ring_id->pFromBuf], (size_t)bytesgot);

+        

+        ring_id->pFromBuf += bytesgot;

+    }

+    else

+    {

+        /* pToBuf has wrapped around.  Grab chars up to the end of the

+         * buffer, then wrap around if we need to. */

+

+        bytesgot = RING_MIN (maxbytes, ring_id->bufSize - ring_id->pFromBuf);

+        

+        zOss_Memmove(buffer, &ring_id->buf[ring_id->pFromBuf], (size_t)bytesgot);

+        

+        pRngTmp = ring_id->pFromBuf + bytesgot;

+

+        /* If pFromBuf is equal to bufSize, we've read the entire buffer,

+         * and need to wrap now.  If bytesgot < maxbytes, copy some more chars

+         * in now. */

+

+        if (pRngTmp == ring_id->bufSize)

+        {

+            bytes2 = RING_MIN (maxbytes - bytesgot, pToBuf);

+

+            if(bytes2)

+            {

+                zOss_Memmove(buffer + bytesgot, ring_id->buf, (size_t)bytes2);

+                bytesgot += bytes2;

+            } 

+            ring_id->pFromBuf = bytes2; 

+        }

+        else

+        {

+            ring_id->pFromBuf = pRngTmp;

+        }

+    }

+

+    return (bytesgot);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_RingBufPut

+* ¹¦ÄÜÃèÊö: Ïò»·Ðλº³åдÈëÊý¾Ý

+* ²ÎÊý˵Ã÷£º(IN)

+                ring_id:»·Ðλº³åID

+                buffer:´ýдÈëÊý¾ÝÖ¸Õë  

+                nbytes:´ýдÈëÊý¾ÝµÄ´óС

+            (OUT)

+* ·µ »Ø Öµ: ʵ¼ÊдÈëµÄ×Ö½ÚÊý

+* ÆäËü˵Ã÷: ·µ»ØÖµ¿ÉÄÜÓëÐèҪдÈëµÄ×Ö½ÚÊý²»Ò»Ö¡£Èç¹û¶ÓÁÐΪÂú£¬Ôò·µ»Ø0

+**************************************************************************/ 

+SINT32 zOss_RingBufPut(T_ZOss_RingId ring_id, CHAR *buffer, SINT32 nbytes)

+{

+    SINT32 bytesput = 0;

+    SINT32 pFromBuf = 0;

+    SINT32 bytes2   = 0;

+    SINT32 pRngTmp  = 0;

+    

+    zOss_AssertEx(ring_id != NULL && buffer != NULL, 0);

+    

+    pFromBuf = ring_id->pFromBuf;

+    if (pFromBuf > ring_id->pToBuf)

+    {

+        /* pFromBuf is ahead of pToBuf.  We can fill up to two bytes

+         * before it */

+        bytesput = RING_MIN(nbytes, (pFromBuf - ring_id->pToBuf) - 1);

+        

+        zOss_Memmove(&ring_id->buf[ring_id->pToBuf], buffer, (size_t)bytesput);

+

+        ring_id->pToBuf += bytesput;

+    }

+    else if (pFromBuf == 0)

+    {

+        /* pFromBuf is at the beginning of the buffer.  We can fill till

+         * the next-to-last element */

+        bytesput = RING_MIN(nbytes, (ring_id->bufSize - ring_id->pToBuf) - 1);

+        

+        zOss_Memmove(&ring_id->buf[ring_id->pToBuf], buffer, (size_t)bytesput);

+        

+        ring_id->pToBuf += bytesput;

+    }

+    else

+    {

+        /* pFromBuf has wrapped around, and its not 0, so we can fill

+         * at least to the end of the ring buffer.  Do so, then see if

+         * we need to wrap and put more at the beginning of the buffer. */

+        bytesput = RING_MIN(nbytes, ring_id->bufSize - ring_id->pToBuf);

+        

+        zOss_Memmove(&ring_id->buf[ring_id->pToBuf], buffer, (size_t)bytesput);

+        

+        pRngTmp = ring_id->pToBuf + bytesput;

+

+        if (pRngTmp == ring_id->bufSize)

+        {

+            /* We need to wrap, and perhaps put some more chars */

+

+            bytes2 = RING_MIN(nbytes - bytesput, pFromBuf - 1);

+

+            if(bytes2)

+            {

+                zOss_Memmove(ring_id->buf, buffer + bytesput, (size_t)bytes2);

+                bytesput += bytes2;

+            }

+            

+            ring_id->pToBuf = bytes2;

+

+        }

+        else

+        {

+            ring_id->pToBuf = pRngTmp;

+        }

+    }

+

+    return (bytesput);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_RingIsEmpty

+* ¹¦ÄÜÃèÊö: Åжϻ·Ðλº³åÊÇ·ñΪ¿Õ

+* ²ÎÊý˵Ã÷£º(IN)

+			    ring_id:»·Ðλº³åID

+            (OUT)

+* ·µ »Ø Öµ: ¿Õ:TRUE; ·Ç¿Õ:FALSE

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+BOOL zOss_RingIsEmpty( T_ZOss_RingId ring_id)

+{

+    zOss_AssertEx(ring_id != NULL, FALSE);

+

+    return (ring_id->pToBuf == ring_id->pFromBuf);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_RingIsFull

+* ¹¦ÄÜÃèÊö: Åжϻ·Ðλº³åÊÇ·ñÒÑÂú

+* ²ÎÊý˵Ã÷£º(IN)

+                ring_id:»·Ðλº³åID

+            (OUT)

+* ·µ »Ø Öµ: ÂúÇ»:TRUE; ·ÇÂú:FALSE

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+BOOL zOss_RingIsFull(T_ZOss_RingId ring_id)

+{

+    SINT32 n = 0;

+    

+    zOss_AssertEx(ring_id != NULL, FALSE);

+    

+    n = (ring_id->pToBuf - ring_id->pFromBuf) + 1;

+    

+    return ((n == 0) || (n == ring_id->bufSize));

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_RingFreeBytes

+* ¹¦ÄÜÃèÊö: »ñÈ¡»·Ðλº³åÊ£Óà¿ÉÀûÓÃ×Ö½ÚÊý

+* ²ÎÊý˵Ã÷£º(IN)

+                ring_id:»·Ðλº³åID

+            (OUT)

+* ·µ »Ø Öµ: Ê£Óà¿ÉÀûÓÿռä×Ö½ÚÊý

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+SINT32 zOss_RingFreeBytes(T_ZOss_RingId ring_id)

+{

+    SINT32 n = 0;

+    

+    zOss_AssertEx(ring_id != NULL, 0);

+    

+    n = (ring_id->pFromBuf - ring_id->pToBuf) - 1;

+    if (n < 0)

+    {

+        n += ring_id->bufSize;

+    }

+

+    return n;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_RingNBytes

+* ¹¦ÄÜÃèÊö: »ñÈ¡»·Ðλº³åÒÑʹÓõÄ×Ö½ÚÊý

+* ²ÎÊý˵Ã÷£º(IN)

+                ring_id:»·Ðλº³åID

+            (OUT)

+* ·µ »Ø Öµ: Ê£Óà¿ÉÀûÓÿռä×Ö½ÚÊý

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+SINT32 zOss_RingNBytes(T_ZOss_RingId ring_id)

+{

+    SINT32 n = 0;

+

+    zOss_AssertEx(ring_id != NULL, 0);

+    

+    n = ring_id->pToBuf - ring_id->pFromBuf;

+    if (n < 0)

+    {

+        n += ring_id->bufSize;

+    }

+

+    return n;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_RingPutAhead

+* ¹¦ÄÜÃèÊö: Ïò»·Ðλº³åµ±Ç°Ð´Ö¸ÕëµÄÆ«ÒÆ´¦£¬Ð´ÈëÒ»¸öÊý¾Ý£¬²»Òƶ¯Ð´Ö¸Õë

+* ²ÎÊý˵Ã÷£º(IN)

+                ring_id:»·Ðλº³åID

+                writebyte:´ýдÈëµÄÊý¾Ý

+                offset:Æ«ÒÆÁ¿, ÕýÊýÏòÇ°ÒÆ¶¯, ¸ºÊýÏòºóÒÆ¶¯

+                       ·¶Î§: -»·Ðλº³å×î´ó×Ö½ÚÊý ~ +»·Ðλº³å×î´ó×Ö½ÚÊý¡£

+            (OUT)

+* ·µ »Ø Öµ:  

+* ÆäËü˵Ã÷: µ±Æ«ÒÆ´¦³¬³ö¶ÓÁÐ×î´ó³¤¶Èʱ£¬»á×Ô¶¯»·ÐÎ

+**************************************************************************/ 

+VOID zOss_RingPutAhead(T_ZOss_RingId ring_id, CHAR writebyte, SINT32 offset)

+{

+    SINT32 n = 0;

+

+    zOss_AssertExN(ring_id != NULL);

+    

+    n = ring_id->pToBuf + offset;

+    if (n >= ring_id->bufSize)

+    {

+        n -= ring_id->bufSize;

+    }

+

+    zOss_AssertExN((n >= 0) && (n < ring_id->bufSize));//Æ«ÒÆÁ¿³¬³ö·¶Î§

+    

+    *(ring_id->buf + n) = writebyte;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_RingMoveAhead

+* ¹¦ÄÜÃèÊö: ½«»·Ðλº³åµÄдָÕëÒÆ¶¯¼¸¸ö×Ö½Ú

+* ²ÎÊý˵Ã÷£º(IN)

+                ring_id:»·Ðλº³åID

+                n:ÐèÒªÒÆ¶¯µÄ×Ö½ÚÊý,ÕýÊýÏòÇ°ÒÆ¶¯£¬¸ºÊýÏòºóÒÆ¶¯

+                  ·¶Î§: -»·Ðλº³å×î´ó×Ö½ÚÊý ~ +»·Ðλº³å×î´ó×Ö½ÚÊý¡£

+            (OUT)

+* ·µ »Ø Öµ:  

+* ÆäËü˵Ã÷: µ±Ð´Ö¸Õ볬³ö¶ÓÁÐ×î´ó³¤¶Èʱ£¬»á×Ô¶¯»·ÐÎ

+**************************************************************************/ 

+VOID zOss_RingMoveAhead(T_ZOss_RingId ring_id, SINT32 n)

+{

+    zOss_AssertExN(ring_id != NULL);

+    

+    n += ring_id->pToBuf;

+

+    if (n >= ring_id->bufSize)

+    {

+        n -= ring_id->bufSize;

+    }

+

+    zOss_AssertExN((n >= 0) && (n < ring_id->bufSize));//nÖµ³¬³ö·¶Î§

+    

+    ring_id->pToBuf = n;

+}

+

+#ifdef __cplusplus

+} 

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_timer.c b/cp/ps/plat/src/oss/osa/com/oss_timer.c
new file mode 100644
index 0000000..8811f3f
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_timer.c
@@ -0,0 +1,888 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     oss_timer.c

+* Îļþ±êʶ:     oss_timer.c

+* ÄÚÈÝÕªÒª:     OSSÖ§³Å²ã¶¨Ê±Æ÷ʵÏÖÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/07/15      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_api.h"

+#include "osa.h"

+#include "sup.h"

+

+#ifdef _OS_TOS

+#include <cyg/kernel/kapi.h>

+#include <pkgconf/kernel.h>

+#elif defined (_OS_LINUX)

+#include "drvs_timer.h"

+#include <linux/kernel.h>

+#include <linux/timer.h>

+#include <linux/hrtimer.h>

+#endif

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+#if defined (_OS_OSE) || defined (_OS_TOS) || defined (_OS_LINUX)

+

+/*******************************************************************************

+*                                 Íⲿº¯ÊýÉùÃ÷                                 *

+*******************************************************************************/

+#ifdef _USE_PSM

+extern SINT32 zOss_PsmGetSleepFlag(VOID);

+#endif

+

+/*******************************************************************************

+*                                 Íⲿ±äÁ¿ÉùÃ÷                                 *

+*******************************************************************************/

+#ifdef _USE_PSM

+# ifndef _USE_PSM_NEW_FRAMEWORK

+extern UINT32 gPsm_SleepTime;

+# endif

+#endif

+

+#endif  // #if defined (_OS_OSE) || defined (_OS_TOS)

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+#define TIMER_TICK              (ZOSS_MS_PER_TICK)

+#define TIMER_SCHEDULE_THREAD   "Timer_ScheduleThread"

+#define TIMER_SCHEDULE_STACK    (UINT32)4096

+

+#ifdef _OS_LINUX

+# define LINUX_OSS_HRTIMER       0

+# define LINUX_OSS_DRV_TIMER     1

+# define LINUX_KERNEL_TICK_TIMER 2

+# define LINUX_OSS_TIMER        LINUX_KERNEL_TICK_TIMER

+#endif

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+#ifdef _OS_LINUX

+static VOID Timer_InterruptRoutine(void);

+#if (LINUX_OSS_TIMER == LINUX_OSS_HRTIMER)

+static enum hrtimer_restart linux_oss_hrtimer_function(struct hrtimer *hrtimer);

+#endif

+

+#endif

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+static BOOL                 gTimer_IsInit;

+static UINT32               gTimer_Tick;

+static T_TIMER_PARAM        *gpTimer_Param;

+static T_ZOss_List          gTimer_IdleList;

+static ZOSS_MUTEX_ID        gTimer_TimerMutex_ID;

+static ZOSS_SEMAPHORE_ID    gTimer_TimerSem_ID;

+static ZOSS_THREAD_ID       gTimer_SchThread_id;

+

+#ifdef _OS_LINUX

+

+#if (LINUX_OSS_TIMER == LINUX_OSS_HRTIMER)

+static struct hrtimer linux_oss_hrtimer_id;

+#elif (LINUX_OSS_TIMER == LINUX_OSS_DRV_TIMER)

+static UINT32 linux_oss_drv_timer_id;

+#elif (LINUX_OSS_TIMER == LINUX_KERNEL_TICK_TIMER)

+static struct timer_list linux_oss_tick_timer_id;

+static unsigned long linux_last_timer_jiffies;

+#define KERNEL_TICK_PER_TIMER_TICK  1           /*One OSS timer tick is equal to how many kernel tick*/

+#endif

+

+#endif

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+UINT64      gTimer_CurTime;

+T_ZOss_List gTimer_UseList;

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+#ifdef _OS_LINUX

+

+#if (LINUX_OSS_TIMER == LINUX_OSS_HRTIMER)

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     linuxÖ§³Å²ã¸ß·Ö±æÂʶ¨Ê±Æ÷»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  hrtimer:    ¸ß·Ö±æÂʶ¨Ê±Æ÷½á¹¹ÌåÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static enum hrtimer_restart linux_oss_hrtimer_function(struct hrtimer *hrtimer)

+{

+    Timer_InterruptRoutine();

+

+    hrtimer_forward_now(&linux_oss_hrtimer_id, ms_to_ktime(TIMER_TICK));

+

+    return HRTIMER_RESTART;

+}

+#endif

+

+#if (LINUX_OSS_TIMER == LINUX_KERNEL_TICK_TIMER)

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     linuxÄں˶¨Ê±Æ÷»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  data:²ÎÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void linux_oss_tick_timer_function(void)

+{

+	if(gTimer_IsInit) {

+		Timer_InterruptRoutine();

+		linux_last_timer_jiffies = jiffies;

+	}

+}

+#endif

+

+#endif

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´´½¨¶¨Ê±Æ÷¿ÕÏÐÁ´±í

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  num:    ¿ÕÏÐÁ´±íÖеÄ×ܽڵãÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static UINT32 Timer_CreateIdleNode(UINT32 num)

+{

+    T_TIMER_NODE    *pTimerNode = NULL;

+    UINT32          node_len    = (sizeof(T_TIMER_NODE)+ sizeof(UINT32)-1) & ~(sizeof(UINT32)-1);

+    UINT32          cnt         = 0;

+    UINT32          nodeSize    = node_len * num;

+

+    pTimerNode = (T_TIMER_NODE *)zOss_Malloc(nodeSize);

+    zOss_AssertEx(NULL != pTimerNode, ZOSS_ERROR);

+

+    zOss_Memset(pTimerNode, 0, nodeSize);

+

+    for (cnt = 0; cnt < num; cnt++) 

+    {

+        zOss_ListAdd(&gTimer_IdleList, &pTimerNode->Node);

+        pTimerNode = (T_TIMER_NODE *)((UINT32)pTimerNode + node_len);

+    }

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïò¶¨Ê±Æ÷ʹÓÃÁ´±íÖвåÈëÒ»¸ö½Úµã

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  pTimerNode: ´ý²åÈëµÄ¶¨Ê±Æ÷½Úµã

+                time_len:   ¶¨Ê±Æ÷½ÚµãµÄÏà¶Ô´¥·¢Ê±¼ä

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     1. ²åÈë½ÚµãʱÐèÒª±éÀúʹÓÃÁ´±í£¬½«½Úµã°´ÕÕ¾ø¶Ô´¥·¢Ê±¼äÅÅÐò;

+                2. time_lenΪÏà¶Ô´¥·¢Ê±¼ä£¬ÐèÒª¼ÓÉϵ±Ç°Ê±¼äºó»»ËãΪ¾ø¶Ô´¥·¢Ê±¼ä;

+*******************************************************************************/

+static VOID Timer_AddTimerNode(T_TIMER_NODE *pTimerNode, UINT32 time_len)

+{

+    T_TIMER_NODE *pNode = NULL;

+    T_TIMER_NODE *pPrev = NULL;

+

+    pTimerNode->ExpireTime = time_len + gTimer_CurTime;

+    pTimerNode->Flag = TIMER_USE;

+

+    pNode = (T_TIMER_NODE *)zOss_ListFirst(&gTimer_UseList);

+    while (pNode != NULL && pTimerNode->ExpireTime >= pNode->ExpireTime) 

+    {

+        pPrev = pNode;

+        pNode = (T_TIMER_NODE *)(pNode->Node.next);

+    }

+    zOss_ListInsert (&gTimer_UseList, (T_ZOss_Node *)pPrev, (T_ZOss_Node *)pTimerNode);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¶¨Ê±Æ÷Ïß³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  arg:    Ïß³ÌÈë²Î

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static VOID Timer_SchThread(SINT32 arg)

+{

+    T_TIMER_NODE *pTimerNode = NULL;

+    

+    for(;;)

+    {

+        zOss_GetSemaphore(gTimer_TimerSem_ID, ZOSS_WAIT_FOREVER);

+        zOss_GetMutex(gTimer_TimerMutex_ID, ZOSS_WAIT_FOREVER);

+        

+        pTimerNode = (T_TIMER_NODE*)zOss_ListFirst(&gTimer_UseList);

+        while (pTimerNode != NULL && pTimerNode->ExpireTime <= gTimer_CurTime) 

+        {

+            pTimerNode->tm_callback(pTimerNode->tm_param);

+            

+            if (pTimerNode->Flag == TIMER_USE && pTimerNode->ExpireTime <= gTimer_CurTime) 

+            {

+                zOss_ListDelete(&gTimer_UseList, &pTimerNode->Node);

+                pTimerNode->Flag = TIMER_SUSPEND;

+                

+                if (pTimerNode->bPeriod)

+                {

+                    Timer_AddTimerNode(pTimerNode, (UINT32)pTimerNode->TimeLength);

+                }

+            }

+            

+            pTimerNode = (T_TIMER_NODE*)zOss_ListFirst(&gTimer_UseList);

+        }

+        

+        zOss_PutMutex(gTimer_TimerMutex_ID);

+    }

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ϵͳ¶¨Ê±Æ÷´¥·¢´Ëº¯Êý£¬ÊÍ·ÅÐźÅÁ¿ÒÔ»½ÐѶ¨Ê±Æ÷Ïß³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+#if defined (_OS_OSE) || defined (_OS_TOS) || defined (_OS_LINUX)

+static VOID Timer_InterruptRoutine(void)

+#elif defined _OS_WIN

+static VOID CALLBACK Timer_InterruptRoutine(UINT wtimerid, UINT msg, DWORD dwuser, DWORD dw1, DWORD dw2)

+#endif

+{

+    T_TIMER_NODE *pTimerNode = NULL;

+#if defined (_OS_OSE) || defined (_OS_TOS) || defined (_OS_LINUX)

+# ifdef _USE_PSM

+#  ifndef _USE_PSM_NEW_FRAMEWORK

+    SINT32 PsmFlag  = 0;

+#  endif

+# endif

+#endif

+

+#ifdef _OS_LINUX

+UINT32 delta;

+#endif

+

+#ifdef _OS_LINUX

+#if (LINUX_OSS_TIMER == LINUX_KERNEL_TICK_TIMER)

+	if(linux_last_timer_jiffies > jiffies)

+		delta = ((0xFFFFFFFF - linux_last_timer_jiffies + jiffies + 1)*(1000/HZ));

+	else

+		delta = ((jiffies - linux_last_timer_jiffies)*(1000/HZ));

+#endif

+    gTimer_CurTime += delta;

+#else

+	gTimer_CurTime += gTimer_Tick;

+#endif

+

+#if defined (_OS_OSE) || defined (_OS_TOS) || defined (_OS_LINUX)

+

+# ifdef _USE_PSM

+#  ifdef _USE_PSM_NEW_FRAMEWORK

+    zOss_ClearSleepTime();

+#  else

+    PsmFlag = PSM_NO_SLEEP;

+    if(gPsm_SleepTime > 0)

+    {

+        gPsm_SleepTime = 0;

+    }

+    PsmFlag = zOss_PsmGetSleepFlag();

+    if((PSM_NO_SLEEP == PsmFlag) || (PSM_KENEL_SLEEP == PsmFlag))

+    {

+        zOss_PsmClearArm1SleepTime();

+    }

+#  endif

+

+# endif

+

+#endif

+    

+    pTimerNode = (T_TIMER_NODE*)zOss_ListFirst(&gTimer_UseList);

+    if (pTimerNode != NULL && pTimerNode->ExpireTime <= gTimer_CurTime)

+    {

+        zOss_PutSemaphore(gTimer_TimerSem_ID);

+    }

+}

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+* º¯ÊýÃû³Æ: Osa_GetTimerInitStatus

+* ¹¦ÄÜÃèÊö: ·µ»Ø¶¨Ê±Æ÷Ä£¿éµÄ³õʼ»¯×´Ì¬

+* ²ÎÊý˵Ã÷: ÎÞ

+* ·µ »Ø Öµ: 

+* ÆäËü˵Ã÷:

+*******************************************************************************/

+BOOL Osa_GetTimerInitStatus(VOID)

+{

+    return gTimer_IsInit;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´´½¨º¯Êý¶¨Ê±Æ÷,µ÷ÓÃzOss_StartTimer()Æô¶¯¶¨Ê±Æ÷

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  tm_name:        δʹÓÃ

+                tm_callback:    ¶¨Ê±µ½ºóÒªµ÷ÓõĻص÷º¯Êý

+                tm_param:       »Øµ÷º¯ÊýµÄÈë²Î

+                bPeriod:        TRUE:ÖÜÆÚÐÔ¶¨Ê±Æ÷;

+                                FALSE:·ÇÖÜÆÚÐÔ¶¨Ê±Æ÷

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦:ÏàÓ¦µÄ¶¨Ê±Æ÷±êʶ; ʧ°Ü:ZOSS_INVALID_TIMER_ID

+* ÆäËü˵Ã÷:     »Øµ÷º¯ÊýÖ´ÐÐʱ¼ä´óÓÚ¶¨Ê±Æ÷ʱ³¤,»áÔì³É´íÎó»ò¶¨Ê±Æ÷µ÷¶ÈÑÓ³Ù;

+                »Øµ÷º¯ÊýÖв»ÔÊÐíÖ±½Ó»ò¼ä½Óµ÷ÓÃ×èÈûÐÔ½Ó¿Ú£¬ÈçzOss_SleepµÈ

+*******************************************************************************/

+ZOSS_TIMER_ID zOss_CreateTimer(const CHAR       *tm_name,

+                               ZOSS_TIMER_FUN   tm_callback,

+                               SINT32           tm_param,

+                               BOOL             bPeriod)

+{

+    T_TIMER_NODE    *pTimerNode = NULL;

+    

+    zOss_AssertEx(tm_callback != NULL, ZOSS_INVALID_TIMER_ID);

+

+    zOss_GetMutex(gTimer_TimerMutex_ID, ZOSS_WAIT_FOREVER);

+    pTimerNode = (T_TIMER_NODE *)zOss_ListFirst(&gTimer_IdleList);

+    zOss_ASSERT(pTimerNode != ZOSS_INVALID_TIMER_ID);

+    if (pTimerNode == ZOSS_INVALID_TIMER_ID) 

+    {

+        zOss_PutMutex(gTimer_TimerMutex_ID);

+        return ZOSS_INVALID_TIMER_ID;

+    }

+    zOss_ListDelete(&gTimer_IdleList, &pTimerNode->Node);

+    zOss_PutMutex(gTimer_TimerMutex_ID);

+    

+    pTimerNode->Flag        = TIMER_SUSPEND;    /* ״̬Ϊֹ̬ͣ */

+    pTimerNode->tm_callback = tm_callback;      /* »Øµ÷º¯Êý     */    

+    pTimerNode->tm_param    = tm_param;         /* »Øµ÷º¯ÊýÈë²Î */

+    pTimerNode->bPeriod     = bPeriod;          /* ÖÜÆÚÐÔ¸³Öµ   */

+#ifdef _USE_PSM

+    pTimerNode->psmFlag     = FALSE;

+#endif

+    return (ZOSS_TIMER_ID)pTimerNode;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Æô¶¯º¯Êý¶¨Ê±Æ÷, Æô¶¯Ê±¿ÌΪ²Î¿¼µã,¾­¹ýÖ¸¶¨Ê±¼äºó,µ÷Óûص÷º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  timer_id:       ¶¨Ê±Æ÷ID

+                time_len:       ¶¨Ê±Æ÷ʱ³¤

+                tm_callback:    ¶¨Ê±µ½ºóÒªµ÷ÓõĻص÷º¯Êý

+                tm_param:       »Øµ÷º¯ÊýµÄÈë²Î

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦:ZOSS_SUCCESS;ʧ°ÜZOSS_ERROR

+* ÆäËü˵Ã÷:     Èç¹û»Øµ÷º¯ÊýÖ´ÐÐʱ¼ä´óÓÚ¶¨Ê±Æ÷ʱ³¤,¿ÉÄÜ»áÔì³É´íÎó»ò¶¨Ê±Æ÷²»±»ÕýÈ·µ÷¶È

+*******************************************************************************/

+UINT32 zOss_StartTimer(ZOSS_TIMER_ID   timer_id,

+                       UINT32          time_len,

+                       ZOSS_TIMER_FUN  tm_callback,

+                       SINT32          tm_param)

+{

+    T_TIMER_NODE *pTimerNode = NULL;

+    

+    zOss_AssertEx(timer_id != NULL && time_len >= gpTimer_Param->MinTimeLen, ZOSS_ERROR);

+    

+    time_len    = (time_len + gTimer_Tick - 1) & ~(gTimer_Tick - 1);

+    pTimerNode  = (T_TIMER_NODE *)timer_id;

+    

+    zOss_GetMutex(gTimer_TimerMutex_ID, ZOSS_WAIT_FOREVER);

+    

+    if (pTimerNode->Flag == TIMER_USE) 

+    {

+        zOss_ListDelete(&gTimer_UseList, (T_ZOss_Node *)pTimerNode);

+        pTimerNode->Flag = TIMER_SUSPEND;

+    }

+    

+    if (pTimerNode->Flag != TIMER_SUSPEND) 

+    {

+        zOss_PutMutex(gTimer_TimerMutex_ID);

+        return ZOSS_ERROR;

+    }

+    

+    if (tm_callback != NULL) 

+    {

+        if (pTimerNode->attached != NULL)

+        {

+            zOss_PutMutex(gTimer_TimerMutex_ID);

+            return ZOSS_ERROR;

+        }

+        pTimerNode->tm_callback = tm_callback;

+        pTimerNode->tm_param	= tm_param;

+    }

+    pTimerNode->TimeLength = time_len;

+    pTimerNode->RemainTime = 0;

+

+    Timer_AddTimerNode(pTimerNode, (UINT32)pTimerNode->TimeLength);

+

+    zOss_PutMutex(gTimer_TimerMutex_ID);

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Í£Ö¹¶¨Ê±Æ÷µÄ¼ÆÊ±£¬µ÷ÓÃzOss_StartTimer()ÖØÐ¿ªÊ¼¼ÆÊ±£»

+                Èç¹û¶¨Ê±Æ÷ÕýÔÚ±»µ÷¶È,ÔòÖ´ÐÐÍ굱ǰµ÷¶ÈºóÍ£Ö¹¼ÆÊ±¡£

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  timer_id:   ¶¨Ê±Æ÷ID

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦:ZOSS_SUCCESS; ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_StopTimer(ZOSS_TIMER_ID timer_id)

+{

+    T_TIMER_NODE *pTimerNode = NULL;

+

+    zOss_AssertEx(timer_id != NULL, ZOSS_ERROR);

+

+    pTimerNode = (T_TIMER_NODE *)timer_id;

+    

+    zOss_GetMutex(gTimer_TimerMutex_ID, ZOSS_WAIT_FOREVER);

+

+    if (pTimerNode->Flag != TIMER_USE) 

+    {

+        zOss_PutMutex(gTimer_TimerMutex_ID);

+        return ZOSS_ERROR;

+    }

+    

+    zOss_ListDelete(&gTimer_UseList, &pTimerNode->Node);

+    

+    pTimerNode->Flag        = TIMER_SUSPEND;

+    pTimerNode->RemainTime  = pTimerNode->TimeLength;

+

+    zOss_PutMutex(gTimer_TimerMutex_ID);

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÔÝÍ£Ö¸¶¨¶¨Ê±Æ÷µÄ¼ÆÊ±,²¢¼Ç¼ÏÂÊ£ÓàµÄÏà¶Ôʱ¼ä; 

+                µ÷ÓÃzOss_ResumeTime()º¯Êýºó¼ÌÐø¼ÆÊ±£»

+                Èç¹û¶¨Ê±Æ÷ÕýÔÚ±»µ÷¶È,ÔòÖ´ÐÐÍ굱ǰµ÷¶ÈºóÔÝÍ£¼ÆÊ±¡£

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  timer_id:   ¶¨Ê±Æ÷ID

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦:ZOSS_SUCCESS; ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_PauseTimer(ZOSS_TIMER_ID timer_id)

+{

+    T_TIMER_NODE *pTimerNode = NULL;

+    

+    zOss_AssertEx(timer_id != NULL, ZOSS_ERROR);

+    

+    pTimerNode = (T_TIMER_NODE *)timer_id;

+    

+    zOss_GetMutex(gTimer_TimerMutex_ID, ZOSS_WAIT_FOREVER);

+    

+    if (pTimerNode->Flag != TIMER_USE) 

+    {

+        zOss_PutMutex(gTimer_TimerMutex_ID);

+        return ZOSS_ERROR;

+    }

+    

+    zOss_ListDelete(&gTimer_UseList, &pTimerNode->Node);

+    

+    pTimerNode->Flag = TIMER_SUSPEND;

+    

+    if (pTimerNode->ExpireTime > gTimer_CurTime)

+    {

+        pTimerNode->RemainTime = pTimerNode->ExpireTime - gTimer_CurTime;

+    }

+    else

+    {

+        pTimerNode->RemainTime = gpTimer_Param->MinTimeLen;

+    }

+    

+    zOss_PutMutex(gTimer_TimerMutex_ID);

+    

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ʹÔÝÍ£µÄ¶¨Ê±Æ÷¼ÌÐø¼ÆÊ±¡£

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  timer_id:   ¶¨Ê±Æ÷ID

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦:ZOSS_SUCCESS; ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_ResumeTimer(ZOSS_TIMER_ID timer_id)

+{

+    T_TIMER_NODE *pTimerNode = NULL;

+

+    zOss_AssertEx(timer_id != NULL, ZOSS_ERROR);

+

+    pTimerNode = (T_TIMER_NODE *)timer_id;

+    

+    zOss_GetMutex(gTimer_TimerMutex_ID, ZOSS_WAIT_FOREVER);

+

+    if (pTimerNode->Flag != TIMER_SUSPEND || pTimerNode->RemainTime == 0)

+    {

+        zOss_PutMutex(gTimer_TimerMutex_ID);

+        return ZOSS_ERROR;

+    }

+

+    Timer_AddTimerNode(pTimerNode, (UINT32)pTimerNode->RemainTime);

+    

+    pTimerNode->RemainTime = 0;

+    

+    zOss_PutMutex(gTimer_TimerMutex_ID);

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ɾ³ýÖ¸¶¨¶¨Ê±Æ÷¡£

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  timer_id:    ¶¨Ê±Æ÷ID

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦:ZOSS_SUCCESS; ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_KillTimer(ZOSS_TIMER_ID timer_id)

+{

+    T_TIMER_NODE    *pTimerNode = NULL;

+    UINT32          node_len    = (sizeof(T_TIMER_NODE) + 3) & ~3;

+    

+    zOss_AssertEx(timer_id != NULL, ZOSS_ERROR);

+    

+    pTimerNode = (T_TIMER_NODE *)timer_id;

+    

+    zOss_GetMutex(gTimer_TimerMutex_ID, ZOSS_WAIT_FOREVER);

+    

+    if (pTimerNode->Flag != TIMER_USE && pTimerNode->Flag != TIMER_SUSPEND) 

+    {

+        zOss_PutMutex(gTimer_TimerMutex_ID);

+        return ZOSS_ERROR;

+    }

+    

+    if (pTimerNode->Flag == TIMER_USE)

+    {

+        zOss_ListDelete(&gTimer_UseList, (T_ZOss_Node *)pTimerNode);

+    }

+    

+    if (pTimerNode->attached != NULL)

+    {

+        zOss_Free(pTimerNode->attached);

+    }

+    

+    zOss_Memset(pTimerNode, 0, node_len);

+    

+    zOss_ListAdd(&gTimer_IdleList, (T_ZOss_Node *)pTimerNode);

+    

+    zOss_PutMutex(gTimer_TimerMutex_ID);

+    

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡¶¨Ê±Æ÷µÄÏà¹ØÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  pMonTimerInfo: ¶¨Ê±Æ÷ÐÅÏ¢´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ´Ëº¯ÊýÉêÇëµÄÄÚ´æ¿Õ¼ä£¬±ØÐëÓÉʹÓÃÕßÊÍ·Å£¬·ñÔò»áÔì³ÉÄÚ´æÐ¹Â¶¡£

+*******************************************************************************/

+VOID zOss_GetTimerInfo(T_ZOss_Mon_Timer *pMonTimerInfo)

+{

+#ifdef _USE_MONITOR

+    T_ZOss_Mon_Timer timerInfo  = {0};

+    T_TIMER_NODE    *pNode      = NULL;

+    UINT32          cnt         = 0;

+

+    if (pMonTimerInfo == NULL)

+    {

+        return;

+    }

+

+    if (ZOSS_SUCCESS == zOss_GetMutex(gTimer_TimerMutex_ID, ZOSS_WAIT_FOREVER))

+    {

+        pNode = (T_TIMER_NODE *)zOss_ListFirst(&gTimer_UseList);

+        while (pNode != NULL)

+        {    

+            cnt++;

+            pNode = (T_TIMER_NODE *)(pNode->Node.next);

+        }

+

+        if (cnt == 0)

+        {

+            pMonTimerInfo->num = 0;

+            pMonTimerInfo->ele = NULL;

+            zOss_PutMutex(gTimer_TimerMutex_ID);

+            return;

+        }

+

+        timerInfo.ele = (T_ZOss_Mon_Timer_Ele *)zOss_GetUB(cnt * sizeof(T_ZOss_Mon_Timer_Ele));

+        zOss_AssertExN(timerInfo.ele != NULL);

+

+        cnt = 0;

+        pNode = (T_TIMER_NODE *)zOss_ListFirst(&gTimer_UseList);

+        while (pNode != NULL)

+        {

+            timerInfo.ele[cnt].start_time       = (UINT32)(pNode->ExpireTime - pNode->TimeLength);

+            timerInfo.ele[cnt].expire_time      = (UINT32)pNode->ExpireTime;

+            timerInfo.ele[cnt].callback_func    = (UINT32)pNode->tm_callback;

+            timerInfo.ele[cnt].is_period        = (unsigned char)pNode->bPeriod;

+            timerInfo.ele[cnt++].handle         = (UINT32)((ZOSS_TIMER_ID)pNode);

+            pNode = (T_TIMER_NODE *)(pNode->Node.next);

+        }

+        zOss_PutMutex(gTimer_TimerMutex_ID);

+

+        pMonTimerInfo->num = cnt;

+        pMonTimerInfo->ele = timerInfo.ele;

+    }

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ³õʼ»¯¶¨Ê±Æ÷Ä£¿é

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 TIMER_Init(VOID)

+{

+    T_OSS_PARAM *pOssParam = NULL;

+#ifdef _OS_WIN

+    UINT        waccuracy;

+    TIMECAPS    tc;

+#endif

+    

+    if (!gTimer_IsInit) 

+    {

+        gTimer_Tick     = TIMER_TICK;

+        

+        pOssParam       = zOss_GetOssCfg();

+        gpTimer_Param   = &(pOssParam->TimerCfg);

+        

+        zOss_ListInit(&gTimer_UseList);

+        zOss_ListInit(&gTimer_IdleList);

+  

+        zOss_AssertEx(Timer_CreateIdleNode(gpTimer_Param->MaxTimeNum) == ZOSS_SUCCESS, ZOSS_ERROR);

+

+        gTimer_TimerMutex_ID = zOss_CreateMutex("TIMER_LIST_MUTEX", ZOSS_INHERIT);

+        zOss_AssertEx(gTimer_TimerMutex_ID != NULL, ZOSS_ERROR);

+

+        gTimer_TimerSem_ID = zOss_CreateSemaphore("TIMER_LIST_SEM", 0);

+        zOss_ASSERT(gTimer_TimerSem_ID != NULL);

+        if (gTimer_TimerSem_ID == NULL) 

+        {

+            zOss_DeleteMutex(gTimer_TimerMutex_ID);

+            gTimer_TimerMutex_ID = NULL;

+            return ZOSS_ERROR;

+        }

+

+        gTimer_SchThread_id = zOss_CreateThread(TIMER_SCHEDULE_THREAD,   /* name                 */

+                                                Timer_SchThread,         /* entry                */

+                                                0,                       /* arguments pointer    */

+                                                TIMER_SCHEDULE_STACK,    /* stack size           */

+                                                gpTimer_Param->SchPrio,  /* priority             */

+                                                1,                       /* useless              */

+                                                1);                      /* auto start           */

+        zOss_ASSERT(gTimer_SchThread_id != NULL);

+        if (gTimer_SchThread_id == NULL) 

+        {

+            zOss_DeleteMutex(gTimer_TimerMutex_ID);

+            gTimer_TimerMutex_ID = NULL;

+            zOss_DeleteSemaphore(gTimer_TimerSem_ID);

+            gTimer_TimerSem_ID = NULL;

+            return ZOSS_ERROR;

+        }

+

+#ifdef _OS_OSE

+        zOss_Sleep(100);    /* Èö¨Ê±Æ÷µ÷¶ÈÏß³ÌÔËÐÐÆðÀ´ */

+        

+        /* ¹Ò½ÓÖжÏ,´ý¼Ó */

+        /* ÔÝʱÓÃOSEµÄtimer process´úÌæ */

+        start(create_process(OS_TI_PROC, 

+                             "OSA_TIMER_ISR", 

+                             (OSENTRYPOINT *)Timer_InterruptRoutine, 

+                             (OSADDRESS)200,

+                             (OSPRIORITY)0, 

+                             (OSTIME)gTimer_Tick, 

+                             (PROCESS)0, 

+                             (struct OS_redir_entry *) NULL,  

+                             (OSVECTOR) 0, 

+                             (OSUSER) 0));

+                             

+#elif defined (_OS_WIN)

+        zOss_Sleep(100);    /* Èö¨Ê±Æ÷µ÷¶ÈÏß³ÌÔËÐÐÆðÀ´ */

+        

+        /* ¹Ò½ÓÖжÏ,´ý¼Ó */

+        if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR)

+        {

+            zOss_ASSERT(0);

+        }

+

+        /* ·Ö±æÂʵÄÖµ²»Äܳ¬³öϵͳµÄȡֵ·¶Î§ */

+        waccuracy = min(max(tc.wPeriodMin, gTimer_Tick), tc.wPeriodMax);

+

+        if (TIMERR_NOERROR != timeBeginPeriod(waccuracy))    /* µ÷ÓÃtimebeginperiodº¯ÊýÉèÖö¨Ê±Æ÷µÄ·Ö±æÂÊ */

+        {

+            zOss_ASSERT(0);

+        }

+

+        /* ¼Ó×°1ºÁÃ붨ʱÆ÷ */

+        if (0 == timeSetEvent(waccuracy, waccuracy, (LPTIMECALLBACK)Timer_InterruptRoutine, (DWORD)NULL, TIME_PERIODIC))

+        {

+            zOss_ASSERT(0);

+        }

+#elif defined (_OS_LINUX)

+

+# if (LINUX_OSS_TIMER == LINUX_OSS_HRTIMER)

+        hrtimer_init(&linux_oss_hrtimer_id, CLOCK_MONOTONIC, HRTIMER_MODE_REL);

+        linux_oss_hrtimer_id.irqsafe  = 1;

+        linux_oss_hrtimer_id.function = linux_oss_hrtimer_function;

+        hrtimer_start(&linux_oss_hrtimer_id, ms_to_ktime(TIMER_TICK), HRTIMER_MODE_REL);

+# elif (LINUX_OSS_TIMER == LINUX_OSS_DRV_TIMER)

+        linux_oss_drv_timer_id = (UINT32)zDrvTimer_Create(Timer_InterruptRoutine, TRUE);

+        zDrvTimer_Start(linux_oss_drv_timer_id, 1000);

+# elif (LINUX_OSS_TIMER == LINUX_KERNEL_TICK_TIMER)

+        //setup_timer(&linux_oss_tick_timer_id,linux_oss_tick_timer_function,0);

+        //linux_oss_tick_timer_id.expires = jiffies + KERNEL_TICK_PER_TIMER_TICK;

+        linux_last_timer_jiffies = jiffies;

+        //add_timer(&linux_oss_tick_timer_id);

+# endif

+

+#endif

+

+        gTimer_IsInit = TRUE;

+    }

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     TOS 3.0ϵͳ¶¨Ê±Æ÷ÖжÏdsrÁ÷³ÌµÄ¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+#if defined (_OS_TOS) && defined (CYGOPT_KERNEL_EXTEND_CLOCK_DSR)

+void tos_clock_dsr(void)

+{

+    if (gTimer_IsInit) 

+    {

+        Timer_InterruptRoutine();

+

+#ifdef _USE_CPU_DFM

+# ifdef _USE_PSM_NEW_FRAMEWORK

+        zOss_DfmIntRoutine();

+# else

+        PSM_CpuIntRoutine();

+# endif

+#endif

+    }

+}

+#endif  // #if defined (_OS_TOS) && defined (CYGOPT_KERNEL_EXTEND_CLOCK_DSR)

+

+#ifdef _USE_PSM

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetTimer_PsmFlag

+* ¹¦ÄÜÃèÊö: ÉèÖö¨Ê±Æ÷ÐÝÃß±êÖ¾

+* ²ÎÊý˵Ã÷: (IN)

+            time_id:¶¨Ê±Æ÷id

+            Flag:ÐÝÃßflag

+            (OUT)

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: 

+**************************************************************************/

+VOID zOss_SetTimer_PsmFlag(ZOSS_TIMER_ID time_id, BOOL Flag)

+{

+    T_TIMER_NODE    *pTimerNode = NULL;

+

+    zOss_AssertExN(time_id != NULL);

+    pTimerNode  = (T_TIMER_NODE *)time_id;

+    pTimerNode->psmFlag = Flag;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_GetPs_SleepTimer

+* ¹¦ÄÜÃèÊö: »ñÈ¡µ±Ç°Ê±¿Ìµ½×îÔçµ½ÆÚЭÒéջʡµç¶¨Ê±Æ÷µÄʱ¼ä(µ¥Î»ms)¡£

+* ²ÎÊý˵Ã÷: (IN)

+            (OUT)

+* ·µ »Ø Öµ: ¶¨Ê±Æ÷Á´±í²»Îª¿Õ:µ±Ç°Ê±¿Ìµ½×îÔçµ½ÆÚ¶¨Ê±Æ÷µÄʱ¼ä; Á´±íΪ¿Õ:ZOSS_WAIT_FOREVER

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_GetPs_SleepTimer(VOID)

+{

+    T_TIMER_NODE    *pNode          = NULL;

+    UINT64          remainedTime    = 0;

+    ZOSS_INTR       old_intr;

+

+    ZOSS_SAVE_IRQ(old_intr);

+    pNode = (T_TIMER_NODE *)zOss_ListFirst(&gTimer_UseList);

+    

+    while(pNode != NULL)

+    {

+        if(pNode->psmFlag)

+        {

+        	if(pNode->ExpireTime <= gTimer_CurTime)

+				remainedTime = 0;

+			else

+            	remainedTime = pNode->ExpireTime - gTimer_CurTime;

+			

+            ZOSS_RESTORE_IRQ(old_intr);

+            return ((UINT32)remainedTime);

+        }

+        pNode = (T_TIMER_NODE *)zOss_ListNext(&pNode->Node);

+    }

+    ZOSS_RESTORE_IRQ(old_intr);

+    return ZOSS_WAIT_FOREVER;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_TimerCompensate

+* ¹¦ÄÜÃèÊö: Ö§³Å²ãʱ¼äÖá²¹³¥º¯Êý(µ¥Î»ms)¡£

+* ²ÎÊý˵Ã÷: (IN)

+            sleepTime:˯Ãßʱ¼ä

+            (OUT)

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ½öÊ¡µçÄ£¿éµ÷ÓÃ

+**************************************************************************/

+VOID zOss_TimerCompensate(UINT32 sleepTime)

+{

+#if defined(_OS_LINUX) && (LINUX_OSS_TIMER == LINUX_KERNEL_TICK_TIMER)

+    UINT32 delta;

+

+	if(linux_last_timer_jiffies > jiffies)

+		delta = ((0xFFFFFFFF - linux_last_timer_jiffies + jiffies + 1)*(1000/HZ));

+	else

+		delta = ((jiffies - linux_last_timer_jiffies)*(1000/HZ));

+

+    gTimer_CurTime += delta;

+	linux_last_timer_jiffies = jiffies;

+#else

+    gTimer_CurTime += sleepTime;

+#endif

+}

+

+#endif

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/com/oss_trace.c b/cp/ps/plat/src/oss/osa/com/oss_trace.c
new file mode 100644
index 0000000..5eb52c5
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/com/oss_trace.c
@@ -0,0 +1,604 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : oss_trace.c

+* Ïà¹ØÎļþ : ose_trace.c¡¢tos_trace.c

+* ʵÏÖ¹¦ÄÜ : ºÏ²¢ose¡¢tos²Ù×÷ϵͳÏÂÏà¹ØÎļþ

+* ×÷    Õß : zhangxiaofei

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/10/19

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#ifdef _OS_TOS

+#include <cyg/kernel/kapi.h>

+#include <cyg/hal/hal_arch.h>

+#include <cyg/hal/hal_intr.h>

+#endif

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+UINT32 oss_trace_get_time(VOID)   __attribute__((weak));

+UINT64 oss_trace_get_time64(VOID) __attribute__((weak));

+UINT32 oss_trace_get_ratio(VOID)  __attribute__((weak));

+

+VOID oss_trace_thread_swapout(ZOSS_THREAD_ID thread) __attribute__((weak));

+VOID oss_trace_thread_swapin(ZOSS_THREAD_ID thread) __attribute__((weak));

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define OSS_TRACE_DEBUG

+#ifdef OSS_TRACE_DEBUG

+# define DBG(fmt, ...) do { zOss_Printf(SUBMDL_OSA, PRINT_LEVEL_NORMAL, fmt, ##__VA_ARGS__); } while (0);

+#else    

+# define DBG(fmt, ...)

+#endif

+

+#define OSS_TRACE_LOCK()    ZOSS_DISABLE_IRQ()

+#define OSS_TRACE_UNLOCK()  ZOSS_ENABLE_IRQ()

+

+#ifdef OSS_TRACE_THREAD

+# define OSS_TRACE_THREAD_NUM       (100)

+# define OSS_TRACE_THREAD_NAME_LEN  (63)

+#endif

+

+#ifdef OSS_TRACE_FUNC

+# define OSS_TRACE_FUNC_NUM         (100)

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+#ifdef OSS_TRACE_THREAD

+typedef struct

+{

+#ifdef _OS_OSE

+    CHAR            thread_name[OSS_TRACE_THREAD_NAME_LEN + 1];

+#elif defined (_OS_TOS)

+    CHAR            *thread_name;

+#endif

+    ZOSS_THREAD_ID  thread_id;

+    UINT32          tick;

+} oss_trace_thread_t;

+#endif

+

+#ifdef OSS_TRACE_FUNC

+typedef struct 

+{

+    SINT32              flag;

+    CHAR                *func_name;

+    ZOSS_THREAD_ID      trace_thread;

+    ZOSS_THREAD_ID      execute_thread;

+    UINT64              start_tick;

+    UINT64              swapin_tick;

+    UINT64              execute_tick;

+    UINT64              consume_tick;

+} oss_trace_func_t;

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+#ifdef OSS_TRACE_THREAD

+static SINT32               oss_trace_thread_swapout_flag                           = 0;

+static UINT32               oss_trace_thread_swapout_count                          = 0;

+static oss_trace_thread_t   oss_trace_thread_swapout_array[OSS_TRACE_THREAD_NUM]    = {0};

+

+static SINT32               oss_trace_thread_swapin_flag                            = 0;

+static UINT32               oss_trace_thread_swapin_count                           = 0;

+static oss_trace_thread_t   oss_trace_thread_swapin_array[OSS_TRACE_THREAD_NUM]     = {0};

+#ifdef _USE_MONITOR

+T_ZOss_Mon_Event oss_trace_event_info = {0};

+#endif

+

+#endif

+#ifdef OSS_TRACE_FUNC

+static UINT32           oss_trace_func_count                                    = 0;

+static oss_trace_func_t oss_trace_func_array[OSS_TRACE_FUNC_NUM]                = {0};

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     רÓÃÓÚÖжÏ/Ï̸߳ú×ٵĻñȡʱ¼äº¯Êý£¬32λ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     µ±Ç°Ê±¼äÖµ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 oss_trace_get_time(VOID)

+{

+    return *(volatile UINT32 *)0xf4b00010;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     רÓÃÓÚÖжÏ/Ï̸߳ú×ٵĻñȡʱ¼äº¯Êý£¬64λ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     µ±Ç°Ê±¼äÖµ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT64 oss_trace_get_time64(VOID)

+{

+    return (UINT64)(*(UINT32 *)0xf4b00010) | ((UINT64)((*(UINT32 *)0xf4b0002c)&0xFFFFFF) << 32);

+}

+

+UINT32 oss_trace_get_ratio(VOID)

+{

+    /* ÉÏÃæµÄ¼ÆÊ±Ë㷨ʹÓÃÁËL1GµÄ52MʱÖÓ¼ÆÊýÆ÷ */

+    return 52;

+}

+

+#ifdef OSS_TRACE_FUNC

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ½«tick»»Ëã³Éus

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  tick:   µÎ´ðÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ΢ÃëÊý

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static DOUBLE oss_trace_func_tick_to_us(UINT64 tick)

+{

+    return (DOUBLE)((DOUBLE)tick / (DOUBLE)oss_trace_get_ratio());

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×Ùº¯Êý¿ªÊ¼Ö´ÐС¢½áÊøÖ´Ðй켣ʱʹÓõÄtick»ñÈ¡º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     µ±Ç°tickÖµ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+#endif

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef OSS_TRACE_THREAD

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´ò¿ªÏ̵߳ĸú×Ù¹¦ÄÜ£»

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID oss_trace_thread_open(VOID)

+{

+    oss_trace_thread_swapout_flag  = 1;

+    oss_trace_thread_swapin_flag   = 1;

+#ifdef _USE_MONITOR    

+    oss_trace_event_info.num = 0;

+    if (oss_trace_event_info.ele == NULL)

+    {

+        oss_trace_event_info.ele = (T_ZOss_Mon_Event_Ele *)zOss_GetUB(OSS_MON_INFO_MAX_NUMBER * sizeof(T_ZOss_Mon_Event_Ele));

+        zOss_AssertExN(oss_trace_event_info.ele != NULL);

+    }

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¹Ø±ÕÏ̵߳ĸú×Ù¹¦ÄÜ£»

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID oss_trace_thread_close(VOID)

+{

+    oss_trace_thread_swapout_flag  = 0;

+    oss_trace_thread_swapin_flag   = 0;

+#ifdef _USE_MONITOR    

+    oss_trace_event_info.num = 0;

+    if (oss_trace_event_info.ele != NULL)

+    {

+        zOss_RetUB(oss_trace_event_info.ele);

+        oss_trace_event_info.ele = NULL;

+    }

+#endif

+}

+#endif

+

+#ifdef OSS_TRACE_FUNC

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×ÙÏ̵߳ÄÇгö¹ì¼£

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     ÇгöÏ̵߳Äid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID oss_trace_thread_swapout(ZOSS_THREAD_ID thread)

+{

+    if (oss_trace_thread_swapout_flag) 

+    {

+# ifdef _OS_OSE

+        zOss_GetThreadName(thread, (CHAR *)(oss_trace_thread_swapout_array[oss_trace_thread_swapout_count].thread_name));

+# elif defined (_OS_TOS)

+        oss_trace_thread_swapout_array[oss_trace_thread_swapout_count].thread_name	= zOss_GetThreadName(thread, NULL);

+# endif

+        oss_trace_thread_swapout_array[oss_trace_thread_swapout_count].thread_id    = thread;

+        oss_trace_thread_swapout_array[oss_trace_thread_swapout_count].tick         = oss_trace_get_time();

+        oss_trace_thread_swapout_count++;

+        if (oss_trace_thread_swapout_count >= OSS_TRACE_THREAD_NUM)

+        {

+            oss_trace_thread_swapout_count = 0x00;

+        }

+        

+#ifdef _USE_MONITOR 

+        if (gOsa_MonitorFlag)

+        {

+            UINT32 cnt = oss_trace_event_info.num;

+            

+            oss_trace_event_info.ele[cnt].event        = OSS_MON_EVENT_THREAD_SWAPOUT;

+# ifdef _OS_OSE

+            zOss_GetThreadName(thread, oss_trace_event_info.ele[cnt].name);	

+# elif defined (_OS_TOS)

+            oss_trace_event_info.ele[cnt].name         = zOss_GetThreadName(thread, NULL);

+# endif            

+            oss_trace_event_info.ele[cnt].handle       = (UINT32)thread;

+            oss_trace_event_info.ele[cnt].tickstamp    = oss_trace_get_time64();

+            if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+            {

+                cnt = 0;

+            }

+            oss_trace_event_info.num = cnt;

+        }

+#endif

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×ÙÏ̵߳ÄÇÐÈë¹ì¼£

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     ÇÐÈëÏ̵߳Äid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID oss_trace_thread_swapin(ZOSS_THREAD_ID thread)

+{

+    if (oss_trace_thread_swapin_flag) 

+    {

+# ifdef _OS_OSE

+        zOss_GetThreadName(thread, (CHAR *)(oss_trace_thread_swapin_array[oss_trace_thread_swapin_count].thread_name));

+# elif defined (_OS_TOS)

+        oss_trace_thread_swapin_array[oss_trace_thread_swapin_count].thread_name    = zOss_GetThreadName(thread, NULL);

+# endif

+        oss_trace_thread_swapin_array[oss_trace_thread_swapin_count].thread_id      = thread;

+        oss_trace_thread_swapin_array[oss_trace_thread_swapin_count].tick           = oss_trace_get_time();

+        oss_trace_thread_swapin_count++;

+        if (oss_trace_thread_swapin_count >= OSS_TRACE_THREAD_NUM)

+        {

+            oss_trace_thread_swapin_count = 0x00;

+        }

+        

+#ifdef _USE_MONITOR 

+        if (gOsa_MonitorFlag)

+        {

+            UINT32 cnt = oss_trace_event_info.num;

+            

+            oss_trace_event_info.ele[cnt].event        = OSS_MON_EVENT_THREAD_SWAPIN;

+# ifdef _OS_OSE

+            zOss_GetThreadName(thread, oss_trace_event_info.ele[cnt].name);	

+# elif defined (_OS_TOS)

+            oss_trace_event_info.ele[cnt].name         = zOss_GetThreadName(thread, NULL);

+# endif

+            oss_trace_event_info.ele[cnt].handle       = (UINT32)thread;

+            oss_trace_event_info.ele[cnt].tickstamp    = oss_trace_get_time64();

+            if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+            {

+                cnt = 0;                

+            }

+            oss_trace_event_info.num = cnt;

+        }

+#endif

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×ÙÏ̺߳¯ÊýµÄ¿ªÊ¼Ö´Ðй켣

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  td_ptr: ¸ú×ÙÃèÊö·ûÖ¸Õë(Trace Descriptor Pointer)

+                func:   º¯ÊýÃû³Æ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID oss_trace_func_start(VOID **td_ptr, const CHAR *func)

+{

+    oss_trace_func_t *trace = NULL;

+    

+    zOss_AssertExN(td_ptr != NULL && func != NULL);

+    

+    if (*td_ptr == NULL) 

+    {

+        if (oss_trace_func_count >= OSS_TRACE_FUNC_NUM)

+        {

+            return;

+        }

+        

+        OSS_TRACE_LOCK();

+        trace = &oss_trace_func_array[oss_trace_func_count++];

+        OSS_TRACE_UNLOCK();

+        *((oss_trace_func_t **)td_ptr) = trace;

+    } 

+    else

+    {

+        trace = *((oss_trace_func_t **)td_ptr);

+    }

+    

+    if (trace->flag) 

+    {

+        trace->func_name        = (CHAR *)func;

+        trace->trace_thread     = zOss_GetCurThreadID();

+        trace->execute_thread   = zOss_GetCurThreadID();

+        trace->start_tick       = oss_trace_get_time64();

+        trace->swapin_tick      = oss_trace_get_time64();

+        trace->execute_tick     = 0x00;

+        trace->consume_tick     = 0x00;

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×ÙÏ̺߳¯ÊýµÄ½áÊøÖ´Ðй켣

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  trace:  º¯Êý¸ú×ٽṹÌåÖ¸Õë

+                func:   º¯ÊýÃû³Æ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID oss_trace_func_end(VOID *td)

+{

+    oss_trace_func_t *trace = NULL;

+    

+    if (td == NULL)

+    {

+        return;

+    }

+    

+    trace = (oss_trace_func_t *)td;

+    if (trace->flag) 

+    {

+        trace->execute_tick     += oss_trace_get_time64() - trace->swapin_tick;

+        trace->consume_tick     = oss_trace_get_time64() - trace->start_tick;

+        trace->execute_thread   = 0x00;

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×ÙÏ̺߳¯ÊýµÄÇгö¹ì¼£

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     ÇгöÏ̵߳Äid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID oss_trace_func_swapout(ZOSS_THREAD_ID thread)

+{

+    if (oss_trace_thread_swapout_flag)

+    {

+        UINT32              cnt     = 0;

+        oss_trace_func_t *trace     = NULL;

+        

+        for (cnt = 0x00; cnt < oss_trace_func_count; cnt++) 

+        {

+            trace = &oss_trace_func_array[cnt];

+            if (trace->flag && trace->execute_thread == thread)

+            {

+                trace->execute_tick += oss_trace_get_time64() - trace->swapin_tick;

+            }

+        }

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×ÙÏ̺߳¯ÊýµÄÇÐÈë¹ì¼£

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     ÇÐÈëÏ̵߳Äid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID oss_trace_func_swapin(ZOSS_THREAD_ID thread)

+{

+    if (oss_trace_thread_swapin_flag)

+    {

+        UINT32              cnt     = 0;

+        oss_trace_func_t    *trace  = NULL;

+        

+        for (cnt = 0x00; cnt < oss_trace_func_count; cnt++) 

+        {

+            trace = &oss_trace_func_array[cnt];

+            if (trace->flag && trace->execute_thread == thread)

+            {

+                trace->swapin_tick = oss_trace_get_time64();

+            }

+        }

+    }

+}

+

+#endif

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ³õʼ»¯¸ú×ÙÏ̺߳¯ÊýµÄ±ê־λ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID zOss_TraceFuncInit(VOID)

+{

+#ifdef OSS_TRACE_FUNC

+    static SINT32 init_flag = 0;

+    

+    if (init_flag == 0) 

+    {

+        UINT32  cnt;

+        

+        OSS_TRACE_LOCK();

+        for(cnt = 0x00; cnt < OSS_TRACE_FUNC_NUM; cnt++)

+        {

+            oss_trace_func_array[cnt].flag = 1;

+        }

+        init_flag = 1;

+        OSS_TRACE_UNLOCK();

+    }

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼Æ¸ú×Ùº¯ÊýÄ£¿éµÄ¼Ç¼ÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  func_name:  º¯ÊýÃû³Æ£¬Èç¹ûΪ¿Õ£¬±íʾͳ¼ÆËùÓб»¸ú×Ùº¯ÊýµÄ¼Ç¼ÐÅÏ¢£¬

+                            ·Ç¿ÕÔò±íʾͳ¼ÆÖ¸¶¨º¯ÊýµÄ¸ú×ÙÐÅÏ¢.

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID zOss_TraceFuncInfo(CHAR *func_name)

+{

+#ifdef OSS_TRACE_FUNC

+    UINT32  cnt                  = 0;

+    UINT32  ignore               = 0;

+    UINT32  ret                  = 0x00;

+    UINT32  exec_cnt             = 0;

+    UINT32  exec_times           = 0;

+    UINT64  execute_tick         = 0;

+    UINT64  consume_tick         = 0;

+    CHAR    *execute_thread_name = NULL;

+    CHAR    *trace_thread_name   = NULL; //add by zhangxiaofei 20121029

+    

+    DBG("%-30s%28s%28s%18s%22s%22s%22s%22s",

+        "function_name",

+        "trace_thread",

+        "execute_thread",

+        "execute_times",

+        "execute_tick",

+        "average_execute_tick",

+        "consume_tick",

+        "average_consume_tick");

+    for (cnt = 0x00; cnt < oss_trace_func_count; cnt++) 

+    {

+        if (func_name)

+        {

+            ret = (UINT32 )strcmp((const char *)oss_trace_func_array[cnt].func_name, (const char *)func_name);

+        }

+        

+        if (ret == 0x00 && oss_trace_func_array[cnt].func_name != NULL) 

+        {

+            ignore = 0;

+            for (exec_cnt = 0x00; exec_cnt < cnt; exec_cnt++) 

+            {

+                if (oss_trace_func_array[exec_cnt].func_name != NULL &&

+                    strcmp((const char *)oss_trace_func_array[cnt].func_name, (const char *)oss_trace_func_array[exec_cnt].func_name) == 0x00)

+                { 

+                    ignore = 1;

+                }

+            }

+            

+            if (ignore == 0) 

+            {

+                exec_times = 1;

+                execute_tick = oss_trace_func_array[cnt].execute_tick;

+                consume_tick = oss_trace_func_array[cnt].consume_tick;

+                for (exec_cnt = cnt + 1; exec_cnt < oss_trace_func_count; exec_cnt++) 

+                {

+                    if (oss_trace_func_array[exec_cnt].func_name != NULL &&

+                        strcmp((const char *)oss_trace_func_array[cnt].func_name, (const char *)oss_trace_func_array[exec_cnt].func_name) == 0x00) 

+                    {

+                        exec_times++;

+                        execute_tick += oss_trace_func_array[exec_cnt].execute_tick;

+                        consume_tick += oss_trace_func_array[exec_cnt].consume_tick;

+                    }

+                }

+

+                if (oss_trace_func_array[cnt].trace_thread)

+                {

+# ifdef _OS_OSE

+                    zOss_GetThreadName(oss_trace_func_array[cnt].trace_thread, (CHAR *)trace_thread_name);

+# elif defined (_OS_TOS)

+                    trace_thread_name    = zOss_GetThreadName(oss_trace_func_array[cnt].trace_thread, NULL);

+# endif                                       

+                }

+                else

+                {

+                    trace_thread_name = (CHAR *)"function trace over!";

+                }

+                

+                if (oss_trace_func_array[cnt].execute_thread)

+                {

+# ifdef _OS_OSE

+                    zOss_GetThreadName(oss_trace_func_array[cnt].execute_thread, (CHAR *)execute_thread_name);

+# elif defined (_OS_TOS)

+                    execute_thread_name    = zOss_GetThreadName(oss_trace_func_array[cnt].execute_thread, NULL);

+# endif                                         

+                }

+                else

+                {

+                    execute_thread_name = (CHAR *)"function execute over!";

+                }

+                DBG("%-30s%28s%28s%18d%22f%22f%22f%22f",

+                    oss_trace_func_array[cnt].func_name,

+                    trace_thread_name,                    

+                    execute_thread_name,

+                    exec_times,

+                    oss_trace_func_tick_to_us(oss_trace_func_array[cnt].execute_tick),

+                    oss_trace_func_tick_to_us(execute_tick / exec_times),

+                    oss_trace_func_tick_to_us(oss_trace_func_array[cnt].consume_tick),

+                    oss_trace_func_tick_to_us(consume_tick / exec_times));

+            }

+        }

+    }

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñȡϵͳµ÷¶ÈʼþµÄÏà¹ØÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void:                             

+*   (´«³ö²ÎÊý)  pMonEventInfo: ϵͳµ÷¶ÈʼþµÄ´æ·ÅµØÖ· 

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID z0ss_GetEventInfo(T_ZOss_Mon_Event *pMonEventInfo)

+{

+#if defined (OSS_TRACE_THREAD) && defined(_USE_MONITOR)

+    if(pMonEventInfo)

+    {

+        *pMonEventInfo = oss_trace_event_info;

+    }

+#endif

+}

+

+#ifdef __cplusplus

+}

+#endif

diff --git a/cp/ps/plat/src/oss/osa/inc/osa.h b/cp/ps/plat/src/oss/osa/inc/osa.h
new file mode 100644
index 0000000..37ec017
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/inc/osa.h
@@ -0,0 +1,261 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSA

+* ÎÄ ¼þ Ãû : osa.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : osa¸÷Ä£¿éʹÓõÄÄÚ²¿½Ó¿Ú

+* ×÷    Õß : ºÎº£½¨

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2010-09-10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é  EC:617001781798

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é   EC:617001781846 

+**************************************************************************/

+#ifndef _OSA_H

+#define _OSA_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef _OS_WIN

+#ifndef PROCESS

+#define PROCESS       ZOSS_THREAD_ID

+#endif

+#endif

+

+/* memÄ£¿é´íÎóºÅ, 0x00001100 --- 0x000011ff */

+#define ZOSS_MEM_ERR                    (UINT32)(ZOSS_ERR + 0x00000100)

+#define ZOSS_MEM_UB_CFG_ERR             (UINT32)(ZOSS_MEM_ERR + 1)

+#define ZOSS_MEM_CREATE_MUTEX_ERR       (UINT32)(ZOSS_MEM_ERR + 2)

+#define ZOSS_MEM_CALCU_SIZE_ERR         (UINT32)(ZOSS_MEM_ERR + 3)

+#define ZOSS_MEM_ALLOC_HEAP_ERR         (UINT32)(ZOSS_MEM_ERR + 4)

+#define ZOSS_MEM_ZERO_SIZE_ERR          (UINT32)(ZOSS_MEM_ERR + 5)

+#define ZOSS_MEM_NOT_INIT_ERR           (UINT32)(ZOSS_MEM_ERR + 6)

+#define ZOSS_MEM_NULL_PARAM_ERR         (UINT32)(ZOSS_MEM_ERR + 7)

+#define ZOSS_MEM_POINTER_ALTER_ERR      (UINT32)(ZOSS_MEM_ERR + 8)

+#define ZOSS_MEM_HEAP_OVERFLOW_ERR      (UINT32)(ZOSS_MEM_ERR + 9)

+#define ZOSS_MEM_POINTER_RANGE_ERR      (UINT32)(ZOSS_MEM_ERR + 10)

+#define ZOSS_MEM_UB_OVERFLOW_ERR        (UINT32)(ZOSS_MEM_ERR + 11)

+#define ZOSS_MEM_GETUB_SIZE_ERR         (UINT32)(ZOSS_MEM_ERR + 12)

+#define ZOSS_MEM_NOMORE_UB_ERR          (UINT32)(ZOSS_MEM_ERR + 13)

+#define ZOSS_MEM_UB_CRASH_ERR           (UINT32)(ZOSS_MEM_ERR + 14)

+#define ZOSS_MEM_UB_REFREE_ERR          (UINT32)(ZOSS_MEM_ERR + 15)

+

+#define MEM_HEAP_SYMBOL_VALUE           (UINT32)0x4B4B4B4B              /* ¶ÑÄÚ´æ±ê־λµÄÖµ          */

+#define MEM_HEAP_MONITOR_VALUE          (UINT32)0x5B5B5B5B              /* ¶ÑÄÚ´æÔ½½ç¼à¿ØÎ»µÄÖµ      */

+

+#define MEM_UB_LEAK_TIME                (UINT32)10000                   /* ÄÚ´æÐ¹Â¶³¬Ê±Ê±¼ä(TICK)    */

+#define MEM_UB_BLOCK_DIVIDE_VALUE       (UINT32)0x5A5A5A5A              /* ¸÷ÄÚ´æ³Ø¼äµÄ·Ö¸ô·û        */

+#define MEM_UB_BLOCK_REALUSED_SIGNAL    (UINT8)0xDC                     /* ÄÚ´æ¿éʵ¼ÊʹÓÃ±ß½ç        */

+

+#define MEM_MAGIC_SIZE  4

+#define MEM_MAGIC_NUM   0x5A5A5A5A

+

+/* T_Mem_DebugInfo + mem + MEM_MAGIC_NUM + file_name */

+#define mem_context_mem(context)        ((UINT8 *)(context) + sizeof(T_Mem_DebugInfo))

+#define mem_context_magic(context)      ((UINT32 *)((UINT8 *)(context) + sizeof(T_Mem_DebugInfo) + context->mem_size))

+#define mem_context_file_name(context)  ((UINT8 *)(context) + sizeof(T_Mem_DebugInfo) + context->mem_size + MEM_MAGIC_SIZE)

+#define mem_context(mem)                ((T_Mem_DebugInfo *)((UINT8 *)(mem)-sizeof(T_Mem_DebugInfo)))

+

+#if defined(__ARMCC_VERSION) && __ARMCC_VERSION > 220000

+#define mem_getLR( lr_save )    lr_save = (VOID *)__return_address();

+#elif defined( _COMPILER_ADS )

+#define mem_getLR( lr_save )    { __asm { mov lr_save, lr } }

+#else

+#define mem_getLR( lr_save )

+#endif

+

+extern BOOL         gOsa_SwapTimeFlag;  /* Ïß³ÌÇл»¼Ç¼cpuʱ¼ä±êÖ¾ */

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef enum 

+{

+    ZOSS_OS_RUN   = 1,                  /* ÔËÐÐ̬       */

+    ZOSS_OS_READY = 2,                  /* ¾ÍÐ÷̬       */

+    ZOSS_OS_BLOCK = 4                   /* ×èÈû̬       */

+}T_ZOsa_ThreadStatus;                   /* Ïß³ÌÔËÐÐ״̬ */

+

+/* ÏûÏ¢¶ÓÁÐÄ£¿é */

+typedef struct 

+{

+    T_ZOss_List         queue_list;     /* ÏûÏ¢Á´±í             */

+    T_ZOss_List         free_list;      /* ¿ÕÏÐÁ´±í             */

+    ZOSS_MUTEX_ID       mutex_id;       /* ¶ÓÁл¥³â             */    

+    ZOSS_SEMAPHORE_ID   sem_id;         /* ¶ÓÁÐÐźÅÁ¿           */

+    UINT32              max_msgs;       /* ×î´óµÄÏûÏ¢Êý         */

+    UINT32              max_msgLen;     /* Ò»ÌõÏûÏ¢µÄ×î´ó×Ö½ÚÊý */

+}T_ZOss_Queue;

+

+/* ¶¨Ê±¹ÜÀíÄ£¿é */

+typedef enum 

+{

+    TIMER_INVALID = 0,                  /* ÎÞЧ״̬     */

+    TIMER_USE     = 0x3c3c3c3c,         /* ʹÓÃ״̬     */

+    TIMER_SUSPEND = 0x5a5a5a5a          /* ֹͣ״̬     */

+}T_Timer_Status;                        /* ¶¨Ê±Æ÷״̬   */

+    

+typedef struct 

+{

+    T_ZOss_Node     Node;               /*  ͨÓÃÁ´±í½Úµã            */

+    T_Timer_Status  Flag;               /*  ¶¨Ê±Æ÷¿é״̬±êÖ¾        */

+    BOOL            bPeriod;            /*  ÖÜÆÚÐÔ±êÖ¾              */

+    UINT64          ExpireTime;         /*  ¶¨Ê±Æ÷µ½ÆÚʱ¼ä          */

+    UINT64          TimeLength;         /*  ¶¨Ê±Æ÷ʱ³¤              */

+    UINT64          RemainTime;         /*  Ê£ÓàµÄʱ¼ä              */

+    ZOSS_TIMER_FUN  tm_callback;        /*  ¶¨Ê±Æ÷ʵÌ廨µ÷º¯Êý      */

+    SINT32          tm_param;           /*  ¶¨Ê±Æ÷ʵÌ廨µ÷º¯ÊýÈë²Î  */

+    VOID            *attached;          /*  ¸½¼ÓÊý¾ÝÖ¸Õë            */

+#ifdef _USE_PSM

+    BOOL            psmFlag;            /*¶¨Ê±Æ÷ÐÝÃß±êÖ¾            */

+#endif

+}T_TIMER_NODE;                          /*  ¶¨Ê±Æ÷Á´±í½Úµã          */

+

+typedef struct 

+{

+     UINT16 wSysYear;                   /* Äê (calendar year minus 2000)    */

+     UINT8  ucSysMon;                   /* ÔÂ (0--11)                       */

+     UINT8  ucSysDay;                   /* ÈÕ (1--31)                       */

+     UINT8  ucSysHour;                  /* ʱ (0--23)                       */

+     UINT8  ucPading0;                  /* Ìî³ä×Ö                           */

+     UINT8  ucSysMin;                   /* ·Ö                               */

+     UINT8  ucSysSec;                   /* Ãë                               */

+     UINT16 wMilliSec;                  /* ºÁÃë                             */

+}T_SysSoftClock;                        /* ¾ø¶Ôʱ¼ä¶¨Ê±Æ÷ʱ¼ä½á¹¹           */

+

+/* ÄÚ´æÄ£¿é */

+typedef struct 

+{

+    BOOL            isUsed;                             /* ʹÓñê¼Ç          */

+    UINT32          usingSize;                          /* ʵ¼ÊÕ¼ÓôóС      */

+#ifdef _DEBUG

+    CHAR            name[ZOSS_UBHEAD_FILENAME_LEN +1];  /* ÉêÇëλÖÃÎļþÃû    */

+    UINT32          line;                               /* ÉêÇëλÖÃÐкŠ     */

+    ZOSS_THREAD_ID  threadId;                           /* ÉêÇëÏß³ÌID        */

+    ZOSS_TASK_ID    taskId;                             /* ÉêÇëÈÎÎñºÅ        */

+    UINT32          applyTimeTick;                      /* ÉêÇëʱ¼ä(TICK)    */

+#endif

+}T_Mem_UBHead;                                          /* ÄÚ´æÍ·            */

+

+typedef struct _T_Mem_FreeUBNode

+{

+    T_Mem_UBHead                ubBlockHeader;          /* ÄÚ´æÍ·            */

+    struct _T_Mem_FreeUBNode    *nextNode;              /* ÏÂÒ»¸öÁ´±í½áµã    */

+}T_Mem_UBListNode;

+

+

+typedef struct 

+{

+    T_Mem_UBListNode    *freeUbListHead;        /* ¿ÕÏÐÄÚ´æÁ´±íÍ·Ö¸Õë        */

+    T_Mem_UBListNode    *freeUbListTail;        /* ¿ÕÏÐÄÚ´æÁ´±íβָÕë        */

+    T_Mem_UBListNode    *ubMemHeaderStart;      /* ÄÚ´æÍ·Ö¸Õë                */

+    ZOSS_UB_BLOCK       ubBlockStart;           /* ÄÚ´æ¿éÖ¸Õë                */

+    UINT32              ubSize;                 /* ÄÚ´æ³Ø¿é´óС£¬µ¥Î»Îª×Ö½Ú  */

+    UINT32              ubBlockNum;             /* ÄÚ´æ¿é×ÜÊý                */

+    ZOSS_MUTEX_ID       ubMutex;                /* »¥³âÁ¿±£»¤                */

+    UINT32              freeUbNum;              /* ¿ÕÏÐÄÚ´æ¿é¸öÊý            */

+#ifdef _DEBUG

+    UINT32              maxUsedUbNum;           /* ×î´óµÄÄÚ´æÊ¹ÓÿéÊý        */

+#endif

+}T_Mem_UBPoolCtl;                               /* ÄÚ´æ³Ø¿ØÖÆ¿é              */

+

+/*mem µ÷ÊÔÐÅÏ¢*/

+typedef struct 

+{

+    T_ZOss_Node     node;

+    UINT32          size;

+    VOID            *mem;

+    UINT32          mem_size;

+    UINT32          uiLR; 

+    UINT32          tick_malloced;

+    UINT32          file_name_size;

+    CHAR            *file_name;

+    UINT32          line;

+    ZOSS_THREAD_ID  thread_id;

+} T_Mem_DebugInfo;

+

+/* »ñÈ¡ÄÚ´æ×´Ì¬²ÎÊý */

+typedef enum 

+{ 

+     T_MEMOPT_TOTALSIZE = 0,    /* the memory's total size      */    

+     T_MEMOPT_FREESIZE  = 1,    /* the free memory size         */

+     T_MEMOPT_USEDSIZE  = 2     /* the used memory size         */

+}T_MEM_StatOpt;

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+VOID   Osa_SwapCtl(BOOL enableRunTime);

+VOID   Osa_UpdateCpu(VOID);

+T_ZOsa_ThreadUserArea *Osa_GetThreadUserArea(ZOSS_THREAD_ID thread_id, BOOL bupdate);

+UINT32 Osa_GetAllThreadId(ZOSS_THREAD_ID *threadarray[]);

+UINT32 OSA_IdentifyThread(ZOSS_THREAD_ID threadID);

+UINT32 Osa_DisplayThreadExecInfo(PROCESS pid);

+UINT32 Osa_DisplayThreadsExecInfo(UINT32 type);

+VOID   OSA_UBLeakInfo(UINT32 poolNum);

+VOID   HeapDbg_Init(VOID);

+

+#ifdef _USE_PSM_NEW_FRAMEWORK

+UINT32 zOss_CompensateTicks(VOID);

+VOID   zOss_DfmIntRoutine(VOID);

+#else

+UINT32 zOss_GetSleepTimeForTicks(VOID);

+VOID   PSM_CpuIntRoutine(VOID);

+#endif

+

+FLOAT  Osa_GetProcessCPU(ZOSS_THREAD_ID tid);

+UINT32 Osa_HwTimeRead(VOID);

+T_ZOsa_ThreadUserArea *zOss_GetThreadUserArea(ZOSS_THREAD_ID thread_id);

+

+#ifdef OSS_TRACE_FUNC

+void oss_trace_thread_swapout(ZOSS_THREAD_ID thread);

+void oss_trace_thread_swapin(ZOSS_THREAD_ID thread);

+void oss_trace_func_swapout(ZOSS_THREAD_ID thread);

+void oss_trace_func_swapin(ZOSS_THREAD_ID thread);

+#endif

+

+#if defined (_OS_TOS) || defined (_OS_OSE) || defined (_OS_LINUX)

+VOID OSA_SetLastError(SINT32 err);

+#endif

+

+#ifdef _OS_OSE

+UINT32 SYSTIME_Init(VOID);

+#endif

+BOOL Osa_GetTimerInitStatus(VOID);

+

+UINT32 EXCEP_StartDaemonTask(VOID);

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _OSA_H */

+

diff --git a/cp/ps/plat/src/oss/osa/inc/osa_ramdump.h b/cp/ps/plat/src/oss/osa/inc/osa_ramdump.h
new file mode 100644
index 0000000..840b9ad
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/inc/osa_ramdump.h
@@ -0,0 +1,69 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSE

+* ÎÄ ¼þ Ãû : osa_ramdump.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ramdumpÄ£¿é¶ÔÍâ½Ó¿Ú

+* ×÷    Õß : wuzhengjun

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2010-09-10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é  EC:617001781798

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é   EC:617001781846 

+**************************************************************************/

+#ifndef _OSA_RAMDUMP_H

+#define _OSA_RAMDUMP_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define DUMPFILENMAE_LEN 32   /* ramdump×î´óÎļþÃû³¤¶È */

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+VOID zOss_RamdumpInit(VOID);

+VOID zOss_RamdumpMain(VOID);

+VOID zOss_RamdumpForceException(UINT32 type);

+VOID zOss_RamdumpforEncodeError(UINT32 *p_base, UINT32 *p_size);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _OSA_RAMDUMP_H */

+

diff --git a/cp/ps/plat/src/oss/osa/inc/oss_math.h b/cp/ps/plat/src/oss/osa/inc/oss_math.h
new file mode 100644
index 0000000..0ab9361
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/inc/oss_math.h
@@ -0,0 +1,168 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     oss_math.h

+* Îļþ±êʶ:     oss_math.h

+* ÄÚÈÝÕªÒª:     OSSÖ§³Å²ãÊý¾Ý¿âÍ·Îļþ

+* ʹÓ÷½·¨:     #include "oss_math.h"

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/08/01      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+#ifndef _OSS_MATH_H

+#define _OSS_MATH_H

+

+#ifdef _OS_LINUX

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include <linux/kernel.h>

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+#define LIBM_HI(__x)  (((libm_ieee_double_shape_type *)&__x)->parts.msw)

+#define LIBM_LO(__x)  (((libm_ieee_double_shape_type *)&__x)->parts.lsw)

+#define LIBM_HIp(__x) (((libm_ieee_double_shape_type *)__x)->parts.msw)

+#define LIBM_LOp(__x) (((libm_ieee_double_shape_type *)__x)->parts.lsw)

+

+/* Get two 32 bit ints from a double.  */

+#define EXTRACT_WORDS(ix0, ix1, d)                                          \

+    do {                                                                    \

+        libm_ieee_double_shape_type ew_u;                                   \

+        ew_u.value = (d);                                                   \

+        (ix0) = ew_u.parts.msw;                                             \

+        (ix1) = ew_u.parts.lsw;                                             \

+    } while (0)

+

+/* Get the more significant 32 bit int from a double.  */

+#define GET_HIGH_WORD(i,d)                                                  \

+    do {                                                                    \

+        libm_ieee_double_shape_type gh_u;                                   \

+        gh_u.value = (d);                                                   \

+        (i) = gh_u.parts.msw;                                               \

+    } while (0)

+

+/* Get the less significant 32 bit int from a double.  */

+#define GET_LOW_WORD(i,d)                                                   \

+    do {                                                                    \

+        libm_ieee_double_shape_type gl_u;                                   \

+        gl_u.value = (d);                                                   \

+        (i) = gl_u.parts.lsw;                                               \

+    } while (0)

+

+/* Set a double from two 32 bit ints.  */

+#define INSERT_WORDS(d,ix0,ix1)                                             \

+    do {                                                                    \

+        libm_ieee_double_shape_type iw_u;                                   \

+        iw_u.parts.msw = (ix0);                                             \

+        iw_u.parts.lsw = (ix1);                                             \

+        (d) = iw_u.value;                                                   \

+    } while (0)

+

+/* Set the more significant 32 bits of a double from an int.  */

+#define SET_HIGH_WORD(d,v)                                                  \

+    do {                                                                    \

+        libm_ieee_double_shape_type sh_u;                                   \

+        sh_u.value = (d);                                                   \

+        sh_u.parts.msw = (v);                                               \

+        (d) = sh_u.value;                                                   \

+    } while (0)

+

+/* Set the less significant 32 bits of a double from an int.  */

+#define SET_LOW_WORD(d,v)                                                   \

+    do {                                                                    \

+        libm_ieee_double_shape_type sl_u;                                   \

+        sl_u.value = (d);                                                   \

+        sl_u.parts.lsw = (v);                                               \

+        (d) = sl_u.value;                                                   \

+    } while (0)

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+typedef union 

+{

+    s32 asi32[2];

+

+    s64 asi64;

+    

+    double value;

+

+    struct 

+    {

+        unsigned int fraction3:16;

+        unsigned int fraction2:16;

+        unsigned int fraction1:16;

+        unsigned int fraction0: 4;

+        unsigned int exponent :11;

+        unsigned int sign     : 1;

+    } number;

+

+    struct 

+    {

+        unsigned int function3:16;

+        unsigned int function2:16;

+        unsigned int function1:16;

+        unsigned int function0:3;

+        unsigned int quiet:1;

+        unsigned int exponent: 11;

+        unsigned int sign : 1;

+    } nan;

+

+    struct 

+    {

+        u32 lsw;

+        u32 msw;

+    } parts;

+    

+} libm_ieee_double_shape_type;

+

+

+typedef union

+{

+    s32 asi32;

+  

+    float value;

+

+    struct 

+    {

+        unsigned int fraction0: 7;

+        unsigned int fraction1: 16;

+        unsigned int exponent: 8;

+        unsigned int sign : 1;

+    } number;

+

+    struct 

+    {

+        unsigned int function1:16;

+        unsigned int function0:6;

+        unsigned int quiet:1;

+        unsigned int exponent:8;

+        unsigned int sign:1;

+    } nan;

+

+} libm_ieee_float_shape_type;

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+double fabs(double x);

+double copysign(double x, double y);

+double sqrt(double x);

+double scalbn (double x, int n);

+double pow(double x, double y);

+double log(double x);

+

+#endif  // #ifdef _OS_LINUX

+

+#endif  // #ifndef _OSS_MATH_H

+

diff --git a/cp/ps/plat/src/oss/osa/linux/inc/linux_except_arm.h b/cp/ps/plat/src/oss/osa/linux/inc/linux_except_arm.h
new file mode 100644
index 0000000..3504df7
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/inc/linux_except_arm.h
@@ -0,0 +1,127 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : linux_except_arm.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ARM´¦ÀíÆ÷Òì³£´¦ÀíÄ£¿éÍ·Îļþ

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/02/29

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _LINUX_EXCEPT_ARM_H

+#define _LINUX_EXCEPT_ARM_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+struct cpu_dumpsection

+{

+  UINT32   identity;

+  UINT32   size;

+  UINT32   ddress;

+};

+

+struct cpu_regdump

+{

+  UINT32   pc;

+  UINT32   sp;

+  UINT32   sr;

+  UINT32   vector;

+  UINT32   fault_data_set;

+  UINT32   fault_data_addr;

+  UINT32   magic;

+  UINT32   no_sects;

+  struct cpu_dumpsection sect[1];

+};

+

+typedef struct cpu_mode_reg_bank 

+{

+  UINT32   sp;

+  UINT32   lr;

+  UINT32   psr;

+} CPU_REG_BANK; /* Mode specific core register bank */  

+

+struct cpu_core

+{

+  UINT32   r[13];  /* Shared r0-r12 for all modes but FIQ, FIQ has own set for r8-r12 */

+  CPU_REG_BANK  user;

+  CPU_REG_BANK  supervisor;

+  CPU_REG_BANK  abort;

+  CPU_REG_BANK  undefined;

+  CPU_REG_BANK  irq;

+

+  UINT32        fiq_r8;

+  UINT32        fiq_r9;

+  UINT32        fiq_r10;

+  UINT32        fiq_r11;

+  UINT32        fiq_r12;

+  CPU_REG_BANK  fiq;

+  UINT32           fault_status;

+};  /* Complete set of core registers */                  

+

+#ifndef __ARMCC_VERSION

+typedef struct

+{

+    

+} linux_except_register_t;

+#endif

+

+typedef struct 

+{

+    u32         nr;

+    const CHAR  *exp;

+    const CHAR  *file;

+    const CHAR  *func;

+    int         line;

+    BOOL        trace_flag;

+} linux_except_t;

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _LINUX_EXCEPT_ARM_H */

+

diff --git a/cp/ps/plat/src/oss/osa/linux/inc/linux_except_cortexm.h b/cp/ps/plat/src/oss/osa/linux/inc/linux_except_cortexm.h
new file mode 100644
index 0000000..395b03c
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/inc/linux_except_cortexm.h
@@ -0,0 +1,111 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : linux_except_arm.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ARM´¦ÀíÆ÷Òì³£´¦ÀíÄ£¿éÍ·Îļþ

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/02/29

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _LINUX_EXCEPT_CORTEXM_H

+#define _LINUX_EXCEPT_CORTEXM_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/kernel/kapi.h>

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+struct cpu_dumpsection

+{

+  UINT32   identity;

+  UINT32   size;

+  UINT32   ddress;

+};

+

+struct cpu_regdump

+{

+  UINT32   pc;

+  UINT32   sp;

+  UINT32   sr;

+  UINT32   vector;

+  UINT32   fault_data_set;

+  UINT32   fault_data_addr;

+  UINT32   magic;

+  UINT32   no_sects;

+  struct cpu_dumpsection sect[1];

+};

+

+struct cpu_core

+{

+  UINT32   r[13];  /* Shared r0-r12 */

+  UINT32   sp;

+  UINT32   lr;

+  UINT32   psr;

+  UINT32   primask;

+  UINT32   control;

+};  /* Complete set of core registers */                  

+

+typedef struct 

+{

+    

+} tos_except_register_t;

+

+typedef struct 

+{

+    cyg_code_t  nr;

+    const CHAR  *exp;

+    const CHAR  *file;

+    const CHAR  *func;

+    int         line;

+    BOOL        trace_flag;

+} tos_except_t;

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _LINUX_EXCEPT_CORTEXM_H */

+

diff --git a/cp/ps/plat/src/oss/osa/linux/inc/linux_except_csky.h b/cp/ps/plat/src/oss/osa/linux/inc/linux_except_csky.h
new file mode 100644
index 0000000..4b35bd3
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/inc/linux_except_csky.h
@@ -0,0 +1,119 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : linux_except_csky.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : cskycpu´¦ÀíÆ÷Òì³£´¦ÀíÄ£¿éÍ·Îļþ

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/02/29

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _LINUX_EXCEPT_CSKY_H

+#define _LINUX_EXCEPT_CSKY_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/kernel/kapi.h>

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct {

+    unsigned int r0;

+    unsigned int r1;

+    unsigned int r2;

+    unsigned int r3;

+    unsigned int r4;

+    unsigned int r5;

+    unsigned int r6;

+    unsigned int r7;

+    unsigned int r8;

+    unsigned int r9;

+    unsigned int r10;

+    unsigned int r11;

+    unsigned int r12;

+    unsigned int r13;

+    unsigned int r14;

+    unsigned int r15;

+

+    unsigned int psr;

+    unsigned int vbr;

+    unsigned int epsr;

+    unsigned int fpsr;

+    unsigned int epc;

+    unsigned int fpc;

+    unsigned int ss0;

+    unsigned int ss1;

+    unsigned int ss2;

+    unsigned int ss3;

+    unsigned int ss4;

+    unsigned int gcr;

+

+    unsigned int gsr;

+    unsigned int cr13;

+    unsigned int cr14;

+    unsigned int cr15;

+    unsigned int cr17;

+    unsigned int cr18;

+    unsigned int cr19;

+    unsigned int cr20;

+    unsigned int cr21;

+    unsigned int pad;

+} tos_except_register_t;

+

+typedef struct 

+{

+    cyg_code_t  nr;

+    const char  *exp;

+    const char  *file;

+    const char  *func;

+    int         line;

+    cyg_bool    trace_flag;

+} tos_except_t;

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+tos_except_register_t *tos_dump_except_register(void);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _LINUX_EXCEPT_CSKY_H */

+

diff --git a/cp/ps/plat/src/oss/osa/linux/inc/linux_mmu_csky.h b/cp/ps/plat/src/oss/osa/linux/inc/linux_mmu_csky.h
new file mode 100644
index 0000000..93460eb
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/inc/linux_mmu_csky.h
@@ -0,0 +1,149 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : linux_mmu_csky.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : csky´¦ÀíÆ÷µÄmmuÅäÖÃÍ·Îļþ

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/11/22 

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ÁõÑÇÄÏ

+* °æ ±¾ ºÅ : V1.1

+* ÐÞ¸ÄÈÕÆÚ : 2012/03/09

+* ÐÞ¸ÄÄÚÈÝ : ´ÓÄÚºËÄ¿Â¼ÒÆÖ²µ½platĿ¼

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _LINUX_MMU_CSKY_H

+#define _LINUX_MMU_CSKY_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/infra/cyg_type.h>

+#include <pkgconf/hal_cskycpu.h>

+#include <cyg/hal/hal_arch.h>

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#ifdef CYG_HAL_CSKYCPU_MMU

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define CSKY_PAGE_CACHE_ENABLE  (3<<3)

+#define CSKY_PAGE_CACHE_DISABLE (2<<3)

+#define CSKY_PAGE_DIRTY         (1<<2)

+#define CSKY_PAGE_VALID         (1<<1)

+#define CSKY_PAGE_GLOBAL        (1<<0)

+

+#define CSKY_PAGE_SIZE_4K       (1<<12)

+#define CSKY_PAGE_SIZE_16K      (1<<14)

+#define CSKY_PAGE_SIZE_64K      (1<<16)

+#define CSKY_PAGE_SIZE_256K     (1<<18)

+#define CSKY_PAGE_SIZE_1M       (1<<20)

+#define CSKY_PAGE_SIZE_4M       (1<<22)

+#define CSKY_PAGE_SIZE_16M      (1<<24)

+#define CSKY_PAGE_SIZE_DEFAULT  (CSKY_PAGE_SIZE_16M)

+

+#define CSKY_PAGE_MASK_OFFSET   (13)

+#define CSKY_PAGE_MASK_4K       (0x000<<CSKY_PAGE_MASK_OFFSET)

+#define CSKY_PAGE_MASK_16K      (0x003<<CSKY_PAGE_MASK_OFFSET)

+#define CSKY_PAGE_MASK_64K      (0x00f<<CSKY_PAGE_MASK_OFFSET)

+#define CSKY_PAGE_MASK_256K     (0x03f<<CSKY_PAGE_MASK_OFFSET)

+#define CSKY_PAGE_MASK_1M       (0x0ff<<CSKY_PAGE_MASK_OFFSET)

+#define CSKY_PAGE_MASK_4M       (0x3ff<<CSKY_PAGE_MASK_OFFSET)

+#define CSKY_PAGE_MASK_16M      (0xfff<<CSKY_PAGE_MASK_OFFSET)

+

+#define CSKY_PFN_OFFSET         (6)

+#define CSKY_PFN_MASK           (((1<<20) - 1)<<CSKY_PFN_OFFSET)

+

+#define CSKY_VPN_OFFSET         (12)

+#define CSKY_VPN_MASK           (((1<<20) - 1)<<CSKY_VPN_OFFSET)

+

+#define CSKY_TLB_NUM            (64)

+#ifdef CYG_HAL_CSKYCPU_MMU_MAP_USEG

+# define CSKY_TLB_REG_START     (0x01)  /* tlb[0] is used by 32M RAM */

+#else

+# define CSKY_TLB_REG_START     (0x00)

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct csky_mmu_region 

+{

+    cyg_uint32 phy_addr;            /* physical address */

+    cyg_uint32 vir_addr;            /* virtual address  */

+    cyg_uint32 size;                /* region size      */

+    cyg_uint32 attr;                /* region attribute */

+    struct csky_mmu_region *next;   /* next region      */

+} csky_mmu_region_t;

+

+typedef struct 

+{

+    cyg_uint32 MRR;

+    cyg_uint32 MEL0;

+    cyg_uint32 MEL1;

+    cyg_uint32 MEH;

+} csky_tlb_entry_t;

+

+typedef struct 

+{

+    /* read from MEH */

+    cyg_uint32 MEH;

+    cyg_uint32 vpn;

+    cyg_uint32 asid;

+

+    /* read from MCR */

+    cyg_uint32 MCR;

+    cyg_uint32 pte_base;

+    cyg_uint32 bad_vpn2;

+

+    /* epc */

+    cyg_uint32 epc;

+} csky_tlb_mismatch_t;

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+extern void tos_csky_mmu_init(void);

+extern void tos_csky_mmu_tlb_mismatch(HAL_SavedRegisters *reg);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#endif  /* CYG_HAL_CSKYCPU_MMU */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _LINUX_MMU_CSKY_H */

+

diff --git a/cp/ps/plat/src/oss/osa/linux/inc/linux_ramdump.h b/cp/ps/plat/src/oss/osa/linux/inc/linux_ramdump.h
new file mode 100644
index 0000000..a673469
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/inc/linux_ramdump.h
@@ -0,0 +1,120 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : linux_ramdump.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ÌṩramdumpÏûÏ¢½á¹¹Ìå

+* ×÷    Õß : luxieji

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2010/05/26

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _LINUX_RAMDUMP_H

+#define _LINUX_RAMDUMP_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "osa_ramdump.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* Ö¸ÁÒå */

+#define DUMPFILE_LINK_REQ       1   /*ͬ²½ÇëÇó*/

+#define DUMPFILE_LINK_RSP       2   /*ͬ²½ÇëÇóÓ¦´ð,´«ÊäramdumpµÄÎļþÊýÄ¿*/

+#define DUMPFILE_FILE_REQ       3   /*ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅµÄÎļþÐÅÏ¢*/

+#define DUMPFILE_FILE_RSP       4   /*ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅµÄÎļþÐÅÏ¢µÄÓ¦´ð£¬´«ÊäÎļþÃû¼°´óС*/

+#define DUMPFILE_READ_REQ       5   /*ÇëÇó¶Áȡָ¶¨Îļþ±àºÅµÄÎļþÄÚÈÝ*/

+#define DUMPFILE_READ_RSP       6   /*ÇëÇó¶Áȡָ¶¨Îļþ±àºÅµÄÎļþÄÚÈݵÄÓ¦´ð£¬´«ÊäÎļþÄÚÈÝ*/

+#define DUMPFILE_END_REQ        7   /*´«Êä½áÊø*/

+#define DUMPFILE_END_RSP        8   /*´«Êä½áÊøÓ¦´ð*/

+

+/* ´íÎóÀàÐÍ */

+#define DUMPFILE_CMD_FAIL       9   /*Ö¸Áî´íÎó*/

+#define DUMPFILE_NO_FAIL        10  /*ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅ´í*/

+#define DUMPFILE_LENGTH_FAIL    11  /*ÇëÇó´«µÝÖ¸¶¨ÎļþλÖôóС´í*/

+

+#define CMD_BUFFER_LEN          16  /* Ö¸ÁîÖ¡³¤¶È */

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/* ramdumpÄ£¿éÏûÏ¢Ì嶨Òå */

+

+/* ͬ²½ÇëÇóÓ¦´ð */

+typedef struct

+{

+    UINT32  fileNum;                    /*Òª´«ÊäµÄÎļþ¸öÊý*/

+}T_DUMPFILE_LINK_RSP;

+

+/* ¿ªÊ¼Îļþ´«ÊäÇëÇóÏûÏ¢Ìå */

+typedef struct

+{

+    UINT32  fileNo;                     /*Îļþ±àºÅ,0¿ªÊ¼*/

+}T_DUMPFILE_FILE_REQ;

+

+/* ¿ªÊ¼Îļþ´«Ê仨ӦÏûÏ¢Ìå */

+typedef struct

+{

+    CHAR   fileName[DUMPFILENMAE_LEN];  /*ÎļþÃû*/

+    UINT32 size;                        /*Îļþ´óС*/

+}T_DUMPFILE_FILE_RSP;

+

+/* ¶ÁÊý¾ÝÇëÇóÏûÏ¢Ìå */

+typedef struct

+{

+    UINT32 fileNo;                      /*Îļþ±àºÅ*/

+    UINT32 offset;                      /*offsetΪÊý¾ÝÆ«ÒÆ*/

+    UINT32 length;                      /*lengthΪÊý¾Ý³¤¶È*/

+}T_DUMPFILE_READ_REQ;

+

+/* ¶ÁÊý¾Ý»ØÓ¦ÏûÏ¢Ìå*/

+typedef struct

+{

+    CHAR   data[1];              	    /*Êý¾ÝÄÚÈÝ£¬ºóÐø»¹ÓÐÊý¾Ý£¬¿É±ä,ΪÇëÇ󳤶È*/

+}T_DUMPFILE_READ_RSP;

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+VOID zOss_RamdumpUsbInit(VOID);

+VOID zOss_RamdumpUsbReadData(UINT8 *buffer, UINT32 size);

+VOID zOss_RamdumpUsbWriteData(UINT8 *buffer, UINT32 size);

+VOID zOss_RamdumpUsbFinish(VOID);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _LINUX_RAMDUMP_H */

+

diff --git a/cp/ps/plat/src/oss/osa/linux/inc/linux_ramlog.h b/cp/ps/plat/src/oss/osa/linux/inc/linux_ramlog.h
new file mode 100644
index 0000000..6f425de
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/inc/linux_ramlog.h
@@ -0,0 +1,41 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     linux_ramlog.h

+* Îļþ±êʶ:     linux_ramlog.h

+* ÄÚÈÝÕªÒª:     linuxÖ§³Å²ãramlogÍ·Îļþ

+* ʹÓ÷½·¨:     #include "linux_ramlog.h"

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/07/16      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+#ifndef _LINUX_RAMLOG_H

+#define _LINUX_RAMLOG_H

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+//#define LINUX_RAMLOG

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+int linux_ramlog_printf(const char *fmt, ...);

+

+#endif  // #ifndef _LINUX_RAMLOG_H

+

diff --git a/cp/ps/plat/src/oss/osa/linux/inc/linux_stat.h b/cp/ps/plat/src/oss/osa/linux/inc/linux_stat.h
new file mode 100644
index 0000000..27d2539
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/inc/linux_stat.h
@@ -0,0 +1,41 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     linux_stat.h

+* Îļþ±êʶ:     linux_stat.h

+* ÄÚÈÝÕªÒª:     linux²Ù×÷ϵͳ֧³Å²ãͳ¼ÆÄ£¿éÍ·Îļþ

+* ʹÓ÷½·¨:     #include "linux_stat.h"

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/10/22      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+#ifndef _LINUX_STAT_ONCE_H

+#define _LINUX_STAT_ONCE_H

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+typedef void (*linux_stat_callback_t)(u32 idle_time, u32 total_time);

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+void linux_stat_register(u32 period, linux_stat_callback_t callback);

+

+#endif  // #ifndef _LINUX_STAT_ONCE_H

+

diff --git a/cp/ps/plat/src/oss/osa/linux/inc/linux_typedef.h b/cp/ps/plat/src/oss/osa/linux/inc/linux_typedef.h
new file mode 100644
index 0000000..a6cd971
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/inc/linux_typedef.h
@@ -0,0 +1,58 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : linux_typedef.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : linux²Ù×÷ϵͳ»ù±¾Êý¾ÝÀàÐÍÍ·Îļþ

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2014/09/10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+#ifndef _LINUX_TYPEDEF_H

+#define _LINUX_TYPEDEF_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <linux/types.h>

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define OSA_HIGHESTPRIORITY (0)     /* Ï̵߳Ä×î¸ßÓÅÏȼ¶ */

+#define OSA_LOWESTPRIORITY  (31)    /* Ï̵߳Ä×îµÍÓÅÏȼ¶ */

+#define SIGNAL_MSG_NUMBER   (256)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct thread_msg {

+    void    *msg_ptr;

+    u32     msg_size;

+} thread_msg_t;

+

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _LINUX_TYPEDEF_H */

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_card.c b/cp/ps/plat/src/oss/osa/linux/src/linux_card.c
new file mode 100644
index 0000000..6c29ecf
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_card.c
@@ -0,0 +1,263 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2011, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     tos_card.c
+* Îļþ±êʶ:     tos_card.c
+* ÄÚÈÝÕªÒª:     TOS 3.0 fat32 ÎļþϵͳT¿¨É豸¹ÜÀíÄ£Ð͵ÄÖ§³Å²ãÊÊÅäÄ£¿é
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2011/07/17      V1.0        Create                    ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "drv_pub.h"
+#include "hal_fsms.h"
+#include "oss_api.h"
+#include <cyg/io/devtab.h>
+#include <cyg/io/disk.h>
+
+/*******************************************************************************
+*                                  ³£Á¿¶¨Òå                                    *
+*******************************************************************************/
+
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+#define DISCNUM    0
+#define CYGDAT_DEVS_DISK_SD_DISK0_NAME   "disksd"
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+typedef struct cyg_sd_disk_info_t {
+    cyg_uint32      sd_saved_baudrate;
+    cyg_uint32      sd_block_count;
+    cyg_bool        sd_read_only;
+    cyg_bool        sd_connected;
+    cyg_uint32      sd_heads_per_cylinder;
+    cyg_uint32      sd_sectors_per_head;
+    cyg_uint32      sd_read_block_length;
+    cyg_uint32      sd_write_block_length;
+} cyg_sd_disk_info_t;
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+
+/*******************************************************************************
+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *
+*******************************************************************************/
+
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+static Cyg_ErrNo    sd_disk_read(disk_channel *chan, void* buf_arg, cyg_uint32 blocks, cyg_uint32 first_block);
+static Cyg_ErrNo    sd_disk_write(disk_channel* chan, const void* buf_arg, cyg_uint32 blocks, cyg_uint32 first_block);
+static Cyg_ErrNo    sd_disk_get_config(disk_channel* chan, cyg_uint32 key, const void* buf, cyg_uint32* len);
+static Cyg_ErrNo    sd_disk_set_config(disk_channel* chan, cyg_uint32 key, const void* buf, cyg_uint32* len);
+static cyg_bool     sd_disk_init(struct cyg_devtab_entry* tab);
+static Cyg_ErrNo    sd_disk_lookup(struct cyg_devtab_entry** tab, struct cyg_devtab_entry *sub_tab, const char* name);
+static Cyg_ErrNo    sd_disk_lookup(struct cyg_devtab_entry** tab, struct cyg_devtab_entry *sub_tab, const char* name);
+
+extern FS_MS_ERROR_TYPE FS_MS_GetGeometry(unsigned int DiscNR, unsigned int *total_lba, unsigned int* sector_size);
+extern FS_MS_ERROR_TYPE FS_MS_Write(unsigned int DiscNR, unsigned int startSector, unsigned int nofSectors, const void * userAddress);
+extern FS_MS_ERROR_TYPE FS_MS_Read(unsigned int DiscNR, unsigned int startSector, unsigned int nofSectors, void * userAddress);
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+DISK_FUNS(cyg_sd_disk_funs,
+          sd_disk_read,
+          sd_disk_write,
+          sd_disk_get_config,
+          sd_disk_set_config);
+static cyg_sd_disk_info_t cyg_sd_disk0_hwinfo = { .sd_connected = 0 };
+DISK_CONTROLLER(cyg_sd_disk_controller_0, cyg_sd_disk0_hwinfo);
+DISK_CHANNEL(cyg_sd_disk0_channel,
+             cyg_sd_disk_funs,
+             cyg_sd_disk0_hwinfo,
+             cyg_sd_disk_controller_0,
+             false,                         
+             1);
+             
+BLOCK_DEVTAB_ENTRY(cyg_sd_disk0,
+                   CYGDAT_DEVS_DISK_SD_DISK0_NAME,
+                   0,
+                   &cyg_io_disk_devio,
+                   &sd_disk_init,
+                   &sd_disk_lookup,
+                   &cyg_sd_disk0_channel);
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     sd¿¨¶Á½Ó¿Ú
+* ²ÎÊý˵Ã÷:     
+*                      (IN)  
+*                          chan :ͨµÀ;
+*                          buf_arg:bufferÖ¸Õë;
+*                          blocks  :¶ÁÈ¡µÄblockµÄ¸öÊý;
+*                          first_block:µÚÒ»¸öblock;
+*                      (OUT)  
+*                          ³É¹¦·µ»Ø0,ʧ°Ü·µ»Ø·ÇÁãÖµ;                       
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+static  Cyg_ErrNo sd_disk_read(disk_channel* chan, void* buf_arg, cyg_uint32 blocks, cyg_uint32 first_block)
+{
+    cyg_sd_disk_info_t* disk    = (cyg_sd_disk_info_t*) chan->dev_priv;
+    cyg_uint8*          buf     = (cyg_uint8*) buf_arg;
+    FS_MS_ERROR_TYPE   retCode  = FS_MS_OK;
+
+    //CYG_TRACE_FUNC_START_ALWAYS();
+    if (! disk->sd_connected) {
+        return -ENODEV;
+    }
+    retCode = FS_MS_Read(DISCNUM,first_block , blocks, buf);
+    if (retCode != FS_MS_OK)
+    {
+        zOss_ASSERT(0);
+    }
+
+    //CYG_TRACE_FUNC_END_ALWAYS();
+
+    return ENOERR;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     sd¿¨Ð´½Ó¿Ú
+* ²ÎÊý˵Ã÷:     
+*                      (IN)  
+*                          chan :ͨµÀ;
+*                          buf_arg:bufferÖ¸Õë;
+*                          blocks  :¶ÁÈ¡µÄblockµÄ¸öÊý;
+*                          first_block:µÚÒ»¸öblock;
+*                      (OUT)  
+*                          ³É¹¦·µ»Ø0,ʧ°Ü·µ»Ø·ÇÁãÖµ;                       
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+static Cyg_ErrNo  sd_disk_write(disk_channel* chan, const void* buf_arg, cyg_uint32 blocks, cyg_uint32 first_block)
+{
+    cyg_sd_disk_info_t*    disk = (cyg_sd_disk_info_t*) chan->dev_priv;
+    FS_MS_ERROR_TYPE   retCode  = FS_MS_OK;
+
+    //CYG_TRACE_FUNC_START_ALWAYS();
+
+    if (! disk->sd_connected) {
+        return -ENODEV;
+    }
+    retCode = FS_MS_Write(DISCNUM, first_block,blocks,buf_arg);
+    if (retCode != FS_MS_OK)
+    {
+        zOss_ASSERT(0);
+    }
+
+    //CYG_TRACE_FUNC_END_ALWAYS();
+
+    return ENOERR;
+}
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    »ñÈ¡sdÅäÖýӿÚ
+* ²ÎÊý˵Ã÷:     
+*                      (IN)  
+*                          chan :ͨµÀ;
+*                          key:¹Ø¼ü×Ö;
+*                          buf  :bufferÖ¸Õë;
+*                          len:³¤¶È;
+*                      (OUT)  
+*                          ³É¹¦·µ»Ø0,ʧ°Ü·µ»Ø·ÇÁãÖµ;                       
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+static Cyg_ErrNo
+sd_disk_get_config(disk_channel* chan, cyg_uint32 key, const void* buf, cyg_uint32* len)
+{
+    return ENOERR;
+}
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ÉèÖÃsdÅäÖýӿÚ
+* ²ÎÊý˵Ã÷:     
+*                      (IN)  
+*                          chan :ͨµÀ;
+*                          key:¹Ø¼ü×Ö;
+*                          buf  :bufferÖ¸Õë;
+*                          len:³¤¶È;
+*                      (OUT)  
+*                          ³É¹¦·µ»Ø0,ʧ°Ü·µ»Ø·ÇÁãÖµ;                       
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+static Cyg_ErrNo
+sd_disk_set_config(disk_channel* chan, cyg_uint32 key, const void* buf, cyg_uint32* len)
+{
+    return ENOERR;
+}
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:   sd¿¨³õʼ»¯º¯Êý
+* ²ÎÊý˵Ã÷:     
+*                      (IN)  
+*                          tab :É豸Èë¿Ú±í
+*                      (OUT)  
+*                          ³É¹¦·µ»ØTRUE,ʧ°ÜFALSE;                       
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+static cyg_bool
+sd_disk_init(struct cyg_devtab_entry* tab)
+{
+    disk_channel*   chan    = (disk_channel*) tab->priv;
+    return (*chan->callbacks->disk_init)(tab);
+}
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:   ²éÕÒsdÉ豸º¯Êý
+* ²ÎÊý˵Ã÷:     
+*                      (IN)  
+*                          tab :É豸Èë¿Ú±íÖ¸Õë;
+*                          sub_tab:´Î¼¶É豸Èë¿Ú±í;
+*                          name  :É豸µÄÃû×Ö;
+*                      (OUT)  
+*                          ³É¹¦·µ»Ø0,ʧ°Ü·µ»Ø·ÇÁãÖµ;                       
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+static Cyg_ErrNo
+sd_disk_lookup(struct cyg_devtab_entry** tab, struct cyg_devtab_entry *sub_tab, const char* name)
+{
+    disk_channel*           chan    = (disk_channel*) (*tab)->priv;
+    cyg_sd_disk_info_t     *disk    = (cyg_sd_disk_info_t*) chan->dev_priv;
+    cyg_disk_info_t  *chanInfo      = chan->info;
+    FS_MS_ERROR_TYPE  retCode       = FS_MS_OK;
+    unsigned int  totalLib          = 0;
+    unsigned int sectorSize         = 0;
+    retCode = FS_MS_GetGeometry(DISCNUM,&totalLib,&sectorSize);
+    if (retCode != FS_MS_OK)
+    {
+        zOss_ASSERT(0);
+    }
+   // chanInfo->connected = true;
+   // chanInfo->block_size = sectorSize;
+   // chanInfo->blocks_num = totalLib;
+    chanInfo->ident.max_transfer   = 0xFFFFFFFF;
+    disk->sd_connected = false;
+    chan->valid     = true; 
+    if(!disk->sd_connected)
+    {
+        cyg_disk_identify_t ident;
+        ident.lba_sectors_num   = totalLib;
+        ident.phys_block_size   = 1;
+        disk->sd_connected      = true;
+        (*chan->callbacks->disk_connected)(*tab, &ident);
+    }
+    return (*chan->callbacks->disk_lookup)(tab, sub_tab, name);
+}
+
+
diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_except_arm.c b/cp/ps/plat/src/oss/osa/linux/src/linux_except_arm.c
new file mode 100644
index 0000000..057083a
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_except_arm.c
@@ -0,0 +1,189 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     linux_except_arm.c

+* Îļþ±êʶ:     linux_except_arm.c

+* ÄÚÈÝÕªÒª:     linuxÖ§³Å²ãÒì³£¹ÜÀíÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/07/18      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_api.h"

+#include "linux_except_arm.h"

+#include "sys_func_atcfg.h"

+#include "sys_com.h"

+#ifdef _USE_MULTI_CORE_RAMDUMP

+#include "sup_ramdump.h"

+#endif

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*******************************************************************************

+*                                Íⲿº¯ÊýÉùÃ÷Çø                                *

+*******************************************************************************/

+extern void linux_ramdump_user(void);

+extern int zte_sys_err_hnd(int user_called, int ecode, int extra);

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+#define EXCEPT_LOCK(lock)       raw_spin_lock_irqsave(lock, old_intr)

+#define EXCEPT_UNLOCK(lock)     raw_spin_unlock_irqrestore(lock, old_intr)

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+enum {

+    LINUX_EXCEPT_NONE         = -1,

+    LINUX_EXCEPT_CPU_START    = 0,

+    LINUX_EXCEPT_CPU_END      = 7,

+    LINUX_EXCEPT_ASSERT       = 128

+};

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+static raw_spinlock_t linux_lock;

+static linux_except_t linux_except = {0};

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¶ÏÑÔʧ°Ü»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  exp:    ¶ÏÑÔ±í´ïʽ

+                file:   ¶ÏÑÔµÄÎļþÃû

+                line:   ¶ÏÑÔµÄÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ¸Ãº¯ÊýÖ»Ó¦¸ÃÔÚzOss_ASSERT¶ÏÑÔʧ°ÜµÄÇé¿öϱ»µ÷ÓÃ

+*******************************************************************************/

+void linux_assert_failed(const char *exp, const char *file, const char *func, int line)

+{

+    unsigned long old_intr;

+

+    EXCEPT_LOCK(&linux_lock);

+    if (linux_except.nr == LINUX_EXCEPT_NONE)

+    {

+        linux_except.nr = LINUX_EXCEPT_ASSERT;

+    }

+    linux_except.exp     = exp;

+    linux_except.file    = file;

+    linux_except.func    = func;

+    linux_except.line    = line;

+

+    printk("\n*******************modem panic information start*******************\n");

+    if (exp)

+        printk("*******************expr:\t%s\n", exp);

+    if (file)

+        printk("*******************file:\t%s\n", file);

+    if (func)

+        printk("*******************func:\t%s\n", func);

+    printk("*******************line:%d\n", line);

+    printk("*******************modem panic information end*********************\n");

+    panic("linux kernel panic\n");

+}

+

+#if 0

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´¦ÀíÆ÷Òì³£´¦ÀíµÄ³õʼ»¯º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³õʼ»¯½á¹û

+* ÆäËü˵Ã÷:     ²Î¿¼±ê×¼¿âÖÐerrnoµÄ¶¨Òå

+*******************************************************************************/

+int zOss_ExceptInit(void)

+{

+    unsigned long old_intr;

+

+    raw_spin_lock_init(&linux_lock);

+

+    EXCEPT_LOCK(&linux_lock);

+    linux_except.nr      = LINUX_EXCEPT_NONE;

+    linux_except.exp     = NULL;

+    linux_except.file    = NULL;

+    linux_except.func    = NULL;

+    linux_except.line    = -1;

+    EXCEPT_UNLOCK(&linux_lock);

+

+    return 0x00;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     LINUX²Ù×÷ϵͳidleÏß³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  loop_count: idleÏß³ÌÑ­»·µÄ´ÎÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void linux_idle_thread(u32 loop_count)

+{

+

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     LINUX²Ù×÷ϵͳramdumpÈë¿Úº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void linux_ramdump_entry(void)

+{

+    unsigned int old_intr;

+    static unsigned int flag;

+

+    if (flag)

+        return;

+

+    ZOSS_SAVE_IRQ(old_intr);

+

+    if(zOss_GetExceptResetFlag() != EXCEPT_RESET_ENABLE)

+    {

+	 linux_ramdump_user();

+

+    #ifdef _USE_MULTI_CORE_RAMDUMP

+        zOss_RamdumpHandle(1, 1, 1);

+    # else  

+        zte_sys_err_hnd(1, 1, 1);

+    #endif

+

+        flag++;

+    }

+    else

+    {

+        zSys_ExceptReboot(0);

+    }

+

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_except_arm_asm.S b/cp/ps/plat/src/oss/osa/linux/src/linux_except_arm_asm.S
new file mode 100644
index 0000000..f1465e6
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_except_arm_asm.S
@@ -0,0 +1,129 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_arm_asm.S

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : arm´¦ÀíÆ÷

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/12/16

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýÉùÃ÷

+**************************************************************************/

+.global zOss_RamdumpSaveRegisters

+.global cp15_readControlRegister

+.global cp15_readDomainRegister

+.global cp15_readTTB

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+.extern Osa_CoreRegisters

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_SaveRegisters 

+ ¹¦ÄÜÃèÊö£º ±£´æÒì³£·¢ÉúʱËùÓеļĴæÖµÖÁ½á¹¹Ìå±äÁ¿(Osa_CoreRegisters),

+ ÔÚµ÷Óú¯Êý֮ǰÐè½ûÖ¹ËùÓÐÖжÏ

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.text

+.balign 4

+.type zOss_RamdumpSaveRegisters, %function

+zOss_RamdumpSaveRegisters:    

+    PUSH     {r14}

+    LDR      r14, =Osa_CoreRegisters

+    STM      r14!, {r0-r12}             /* ±£´ær0-r12   */

+    MOV      r0, r14                    /* ±£´ær14ÖÁr0£¬ºóÐøÒÔr0Ϊ»ùµØÖ·Ñ¹Õ» */

+    LDR      r14, [r13], #4             /* »¹Ô­r13,r14  */

+    MRS      r1, CPSR                   /* ±£´æcpsrÖÁr1 */

+    MSR      CPSR_c, #0xdf              /* SYS modeµÈ¼Ûusr mode */

+    STM      r0!, {r13, r14}            /* ½«{r13,r14}ÈëÕ»  */

+    MRS      r2, SPSR

+    STR      r2, [r0], #4               /* ½«SPSRÈëÕ»   */

+    MSR      CPSR_c, #0xd3              /* svc mode     */

+    STM      r0!, {r13, r14}            /* ½«{r13,r14}  */

+    MRS      r2, SPSR

+    STR      r2,  [r0], #4              /* ½«SPSRÈëÕ»   */

+    MSR      CPSR_c, #0xd7              /* ABT mode     */

+    MRS      r2,  SPSR

+    STM      r0!, {r13, r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, #0xdb              /* UND mode     */

+    MRS      r2, SPSR

+    STM      r0!, {r13, r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, #0xd2              /* IRQ mode     */

+    MRS      r2, SPSR

+    STM      r0!, {r13, r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, #0xd1              /* FIQ mode     */

+    MRS      r2, SPSR

+    STM      r0!, {r8-r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, r1                 /* »¹Ô­CPRS     */

+    LDR      r14, =Osa_CoreRegisters    /* »¹Ô­¼Ä´æÆ÷   */      

+    LDM      r14!, {r0-r12}             /* »¹Ô­r0-r12£¬r13µÄֵ֮ǰÒÑ»¹Ô­    */

+    LDMDB    r13, {R14}                 /* »¹Ô­r14      */

+    BX       r14                        /* ·µ»Ø         */

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readControlRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.type cp15_readControlRegister, %function

+cp15_readControlRegister:

+    MRC     p15, 0, r0, c1, c0, 0

+    BX      LR

+    

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readDomainRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.type cp15_readDomainRegister, %function

+cp15_readDomainRegister:

+    MRC     p15, 0, r0, c3, c0, 0

+    BX      LR

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readTTB 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.type cp15_readTTB, %function

+cp15_readTTB:

+    MRC     p15, 0, r0, c2, c0, 0   

+    BX      LR

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_except_arm_asm_rvct.S b/cp/ps/plat/src/oss/osa/linux/src/linux_except_arm_asm_rvct.S
new file mode 100644
index 0000000..6770b65
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_except_arm_asm_rvct.S
@@ -0,0 +1,130 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_arm_asm_rvct.S

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : arm´¦ÀíÆ÷

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/12/16

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýÉùÃ÷

+**************************************************************************/

+    EXPORT zOss_RamdumpSaveRegisters

+    EXPORT cp15_readControlRegister

+    EXPORT cp15_readDomainRegister

+    EXPORT cp15_readTTB

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+    IMPORT Osa_CoreRegisters

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_SaveRegisters 

+ ¹¦ÄÜÃèÊö£º ±£´æÒì³£·¢ÉúʱËùÓеļĴæÖµÖÁ½á¹¹Ìå±äÁ¿(Osa_CoreRegisters),

+ ÔÚµ÷Óú¯Êý֮ǰÐè½ûÖ¹ËùÓÐÖжÏ

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+    CODE32

+    AREA ||.text||, CODE, ALIGN = 2

+zOss_RamdumpSaveRegisters    

+    PUSH     {r14}

+    LDR      r14,=Osa_CoreRegisters

+    STM      r14!,{r0-r12}          /* ±£´ær0-r12                           */

+    MOV      r0,r14                 /* ±£´ær14ÖÁr0£¬ºóÐøÒÔr0Ϊ»ùµØÖ·Ñ¹Õ»    */

+    LDR      r14,[r13],#4           /* »¹Ô­r13,r14                          */

+    MRS      r1,CPSR                /* ±£´æcpsrÖÁr1                         */

+    MSR      CPSR_c,#0xdf           /*SYS modeµÈ¼Ûusr mode                  */

+    STM      r0!,{r13,r14}          /* ½«{r13,r14}ÈëÕ»                      */

+    MRS      r2,SPSR

+    STR      r2,[r0],#4             /* ½«SPSRÈëÕ»                           */

+    MSR      CPSR_c,#0xd3           /*svc mode                              */

+    STM      r0!,{r13,r14}          /* ½«{r13,r14}                          */

+    MRS      r2,SPSR

+    STR      r2,[r0],#4             /* ½«SPSRÈëÕ»                           */

+    MSR      CPSR_c,#0xd7           /* ABT mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xdb           /* UND mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xd2           /* IRQ mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xd1           /* FIQ mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r8-r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,r1              /* »¹Ô­CPRS                             */

+    LDR      r14,=Osa_CoreRegisters /* »¹Ô­¼Ä´æÆ÷                           */      

+    LDM      r14!,{r0-r12}          /* »¹Ô­r0-r12£¬r13µÄֵ֮ǰÒÑ»¹Ô­        */

+    LDMDB    r13,{R14}              /* »¹Ô­r14                              */

+    BX       r14                    /* ·µ»Ø                                 */

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readControlRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+cp15_readControlRegister

+

+    MRC     p15, 0, r0, c1, c0, 0

+    BX      LR

+    

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readDomainRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+cp15_readDomainRegister

+

+    MRC     p15, 0, r0, c3, c0, 0

+    BX      LR

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readTTB 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+cp15_readTTB

+

+    MRC     p15, 0, r0, c2, c0, 0   

+    BX      LR

+

+    END

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_except_cortexm.c b/cp/ps/plat/src/oss/osa/linux/src/linux_except_cortexm.c
new file mode 100644
index 0000000..dbca246
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_except_cortexm.c
@@ -0,0 +1,242 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_arm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : TOS 3.0 arm´¦ÀíÆ÷µÄÒì³£´¦ÀíÄ£¿é

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/05/08

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/infra/cyg_type.h>

+#include <cyg/kernel/kapi.h>

+#include <cyg/infra/diag.h>

+#include <cyg/hal/hal_intr.h>

+#include <cyg/hal/hal_arch.h>

+#include <errno.h>

+

+#include "oss_api.h"

+#include "tos_except_cortexm.h"

+#include "sup_ramdump.h"

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+extern void cyg_user_idle(void);

+extern int zte_sys_err_hnd(int user_called, int ecode, int extra);

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define EXCEPT_LOCK()   ZOSS_SAVE_IRQ(old_intr)

+#define EXCEPT_UNLOCK() ZOSS_RESTORE_IRQ(old_intr)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+enum {

+    TOS_EXCEPT_NONE         = -1,

+    TOS_EXCEPT_CPU_START    = CYGNUM_HAL_EXCEPTION_MIN,

+    TOS_EXCEPT_CPU_END      = CYGNUM_HAL_EXCEPTION_MAX,

+    TOS_EXCEPT_ASSERT       = 128

+};

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static tos_except_t tos_except = {0};

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     cksy´¦ÀíÆ÷Òì³£´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  data:               Òì³£´¦Àíº¯ÊýµÄÈë²Î

+                exception_number:   Òì³£±àºÅ

+                info:               Òì³£·¢ÉúʱµÄCPU context

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+#ifdef CYGPKG_KERNEL_EXCEPTIONS

+static void tos_except_handler( cyg_addrword_t  data,

+                                cyg_code_t      exception_number,

+                                cyg_addrword_t  info)

+{

+    cyg_uint32 old_intr;

+    

+    EXCEPT_LOCK();

+    tos_except.nr = exception_number;

+    EXCEPT_UNLOCK();

+    zOss_ASSERT(0);

+}

+#endif

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zte_sys_err_hnd

+ * ¹¦ÄÜÃèÊö£º Ramdump´¦Àíº¯Êý

+ * ²ÎÊý˵Ã÷£º 

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º ´ò׮ʵÏָú¯Êý£»

+ *

+ **************************************************************************/

+int  zte_sys_err_hnd(int  user_called, int  ecode, int extra)

+{

+    

+    ZOSS_INTR       old_intr;

+

+    ZOSS_SAVE_IRQ(old_intr);

+    for ( ; ; ) ;

+

+    return 0;

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¶ÏÑÔʧ°Ü»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  exp:    ¶ÏÑÔ±í´ïʽ

+                file:   ¶ÏÑÔµÄÎļþÃû

+                line:   ¶ÏÑÔµÄÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ¸Ãº¯ÊýÖ»Ó¦¸ÃÔÚzOss_ASSERT¶ÏÑÔʧ°ÜµÄÇé¿öϱ»µ÷ÓÃ

+**************************************************************************/

+void tos_assert_failed(const char *exp, const char *file, const char *func, int line)

+{

+    cyg_uint32 old_intr;

+    

+    EXCEPT_LOCK();

+    if (tos_except.nr == TOS_EXCEPT_NONE)

+    {

+        tos_except.nr = TOS_EXCEPT_ASSERT;

+    }

+    tos_except.exp     = exp;

+    tos_except.file    = file;

+    tos_except.func    = func;

+    tos_except.line    = line;

+

+#if 1

+# ifdef _USE_MULTI_CORE_RAMDUMP

+    zOss_RamdumpHandle(1, 1, 1);

+# else

+    zte_sys_err_hnd(1, 1, 1);

+# endif

+#else

+    while (tos_except.trace_flag == FALSE) 

+    {

+        HAL_BREAK();

+    }

+#endif

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´¦ÀíÆ÷Òì³£´¦ÀíµÄ³õʼ»¯º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³õʼ»¯½á¹û

+* ÆäËü˵Ã÷:     ²Î¿¼±ê×¼¿âÖÐerrnoµÄ¶¨Òå

+**************************************************************************/

+int zOss_ExceptInit(void)

+{

+#ifdef CYGPKG_KERNEL_EXCEPTIONS

+    cyg_code_t cnt = 0;

+#endif

+    cyg_uint32 old_intr;

+

+    EXCEPT_LOCK();

+    tos_except.nr      = TOS_EXCEPT_NONE;

+    tos_except.exp     = NULL;

+    tos_except.file    = NULL;

+    tos_except.func    = NULL;

+    tos_except.line    = -1;

+    EXCEPT_UNLOCK();

+    

+#ifdef CYGPKG_KERNEL_EXCEPTIONS

+    for (cnt = CYGNUM_HAL_EXCEPTION_MIN; cnt < CYGNUM_HAL_EXCEPTION_MAX; cnt++) 

+    {

+        cyg_exception_set_handler(cnt,                  /* exception_number */

+                                  tos_except_handler,   /* new_handler      */

+                                  0x00,                 /* new_data         */

+                                  NULL,                 /* old_handler      */

+                                  NULL);                /* old_data         */

+    }

+#endif

+

+    //return ENOERR;

+	return 0;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡±£´æÒì³£¼Ä´æÆ÷µÄÄÚ´æµØÖ·

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ±£´æÒì³£¼Ä´æÆ÷µÄÄÚ´æµØÖ·

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+tos_except_register_t *tos_dump_except_register(void)

+{

+    return NULL;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     TOS 3.0²Ù×÷ϵͳidleÏß³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  loop_count:     idleÏß³ÌÑ­»·µÄ´ÎÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_idle_thread(cyg_uint32 loop_count)

+{

+    cyg_user_idle();

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_except_csky.c b/cp/ps/plat/src/oss/osa/linux/src/linux_except_csky.c
new file mode 100644
index 0000000..aa73b55
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_except_csky.c
@@ -0,0 +1,254 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_csky.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : TOS 3.0 cskycpu´¦ÀíÆ÷µÄÒì³£´¦ÀíÄ£¿é

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/11/03

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/infra/cyg_type.h>

+#include <cyg/kernel/kapi.h>

+#include <cyg/infra/diag.h>

+#include <cyg/hal/hal_intr.h>

+#include <errno.h>

+

+#include "oss_api.h"

+#include "tos_except_csky.h"

+#include "tos_mmu_csky.h"

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+extern void cyg_user_idle(void);

+extern int zte_sys_err_hnd(int user_called, int ecode, int extra);

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define EXCEPT_LOCK()   ZOSS_SAVE_IRQ(old_intr)

+#define EXCEPT_UNLOCK() ZOSS_RESTORE_IRQ(old_intr)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+enum {

+    TOS_EXCEPT_NONE         = -1,

+    TOS_EXCEPT_CPU_START    = 0,

+    TOS_EXCEPT_CPU_END      = 127,

+    TOS_EXCEPT_ASSERT       = 128

+};

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static tos_except_t    tos_except             = {0};

+tos_except_register_t  *tos_except_register   = NULL;

+

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     cksy´¦ÀíÆ÷Òì³£´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  data:               Òì³£´¦Àíº¯ÊýµÄÈë²Î

+                exception_number:   Òì³£±àºÅ

+                info:               Òì³£·¢ÉúʱµÄCPU context

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void tos_except_handler( cyg_addrword_t  data,

+                                cyg_code_t      exception_number,

+                                cyg_addrword_t  info)

+{

+    tos_except.nr = exception_number;

+    switch (exception_number) 

+    {

+    case CYGNUM_HAL_VECTOR_TLBMISMATCH:

+        {

+            tos_csky_mmu_tlb_mismatch((HAL_SavedRegisters *)info);

+            break;

+        }

+    default:

+        {

+            break;

+        }

+    }

+    

+    zOss_ASSERT(0);

+}

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¶ÏÑÔʧ°Ü»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  exp:    ¶ÏÑÔ±í´ïʽ

+                file:   ¶ÏÑÔµÄÎļþÃû

+                line:   ¶ÏÑÔµÄÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ¸Ãº¯ÊýÖ»Ó¦¸ÃÔÚzOss_ASSERT¶ÏÑÔʧ°ÜµÄÇé¿öϱ»µ÷ÓÃ

+**************************************************************************/

+void tos_assert_failed(const char *exp, const char *file, const char *func, int line)

+{

+    cyg_uint32 old_intr;

+    

+    EXCEPT_LOCK();

+    if (tos_except.nr == TOS_EXCEPT_NONE)

+    {

+        tos_except.nr = TOS_EXCEPT_ASSERT;

+    }

+    tos_except.exp     = exp;

+    tos_except.file    = file;

+    tos_except.func    = func;

+    tos_except.line    = line;

+    

+#if 1

+# ifdef _USE_MULTI_CORE_RAMDUMP

+    zOss_RamdumpHandle(1, 1, 1);

+# else

+    zte_sys_err_hnd(1, 1, 1);

+# endif

+#else

+    while (tos_except.trace_flag == FALSE) 

+    {

+        HAL_BREAK();

+    }

+#endif

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´¦ÀíÆ÷Òì³£´¦ÀíµÄ³õʼ»¯º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³õʼ»¯½á¹û

+* ÆäËü˵Ã÷:     ²Î¿¼±ê×¼¿âÖÐerrnoµÄ¶¨Òå

+**************************************************************************/

+int zOss_ExceptInit(void)

+{

+    cyg_code_t cnt = 0;

+    cyg_uint32 old_intr;

+

+    EXCEPT_LOCK();

+    tos_except.nr      = TOS_EXCEPT_NONE;

+    tos_except.exp     = NULL;

+    tos_except.file    = NULL;

+    tos_except.func    = NULL;

+    tos_except.line    = -1;

+    EXCEPT_UNLOCK();

+    for (cnt = CYGNUM_HAL_VECTOR_RESET; cnt < CYGNUM_HAL_VECTOR_SYS; cnt++) 

+    {

+        if (cnt == CYGNUM_HAL_VECTOR_AUTOVEC)

+        {

+            continue;

+        }

+        

+        cyg_exception_set_handler(cnt,                  /* exception_number */

+                                  tos_except_handler,   /* new_handler      */

+                                  0x00,                 /* new_data         */

+                                  NULL,                 /* old_handler      */

+                                  NULL);                /* old_data         */

+    }

+

+    return ENOERR;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡±£´æÒì³£¼Ä´æÆ÷µÄÄÚ´æµØÖ·

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ±£´æÒì³£¼Ä´æÆ÷µÄÄÚ´æµØÖ·

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+tos_except_register_t *tos_dump_except_register(void)

+{

+    return tos_except_register;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     TOS 3.0²Ù×÷ϵͳidleÏß³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  loop_count:     idleÏß³ÌÑ­»·µÄ´ÎÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_idle_thread(cyg_uint32 loop_count)

+{

+    cyg_user_idle();

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     fatalÒì³£´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_fatal_except_handler(void)

+{

+    cyg_uint32 old_intr;

+

+    EXCEPT_LOCK();

+

+    pool_print_leak(0x00);

+    pool_print_free();

+    pool_print_alloc_fail();

+    pool_print_alloc_statistic();

+    pool_trace_leak_end(0x00);

+

+    HAL_BREAK();

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_except_csky_asm.S b/cp/ps/plat/src/oss/osa/linux/src/linux_except_csky_asm.S
new file mode 100644
index 0000000..cca39a9
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_except_csky_asm.S
@@ -0,0 +1,210 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_csky_asm.S

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : 

+* °æ    ±¾ : 

+* Íê³ÉÈÕÆÚ : 

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <pkgconf/hal.h>

+#include <pkgconf/system.h>

+#include <cyg/hal/board.h>

+#ifdef CYGPKG_KERNEL

+#include <pkgconf/kernel.h>

+#endif

+#include <pkgconf/hal_cskycpu.h>

+#include <cyg/hal/arch.inc>

+#include <pkgconf/kernel.h>

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö±äÁ¿ÉùÃ÷

+**************************************************************************/

+.globl  zOss_SaveRegisters

+//.globl  zOss_LoadRegisters

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+.extern gRamdumpAdrress

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ * ±£´æ¼Ä´æÆ÷ÐÅÏ¢ 

+ * º¯ÊýÔ­ÐÍ VOID  zOss_SaveRegisters(VOID)

+ **************************************************************************/

+.text

+.balign 4

+zOss_SaveRegisters:

+        subi    r0,4

+        stw     r10,(r0,0)  //°Ñr15ѹջ£¬ÒÔ±ãºóÐøÊ¹Ó㻽èÓÃr10£»

+        lrw     r10,gRamdumpAdrress

+/* ±£´ær0-r15 */

+        stw     r1,(r10,4)

+        stw     r2,(r10,8)

+        stw     r3,(r10,12)

+        stw     r4,(r10,16)

+        stw     r5,(r10,20)

+        stw     r6,(r10,24)

+        stw     r7,(r10,28)

+        stw     r8,(r10,32)

+        stw     r9,(r10,36)

+        ldw     r1, (r0, 0)    

+        stw     r1,(r10,40)

+        addi    r0, 4           

+        stw     r0,(r10,0)

+        stw     r11,(r10,44)

+        stw     r12,(r10,48)

+        stw     r13,(r10,52)

+        stw     r14,(r10,56)

+        stw     r15,(r10,60)

+/* ±£´æ¿ØÖƼĴæÆ÷ */

+        addi    r10,32

+        addi    r10,32

+        mfcr    r1, psr

+        stw     r1,(r10,0)

+        mfcr    r1, VBR

+	    stw     r1,(r10,4)

+	    mfcr    r1, epsr

+	    stw     r1,(r10,8)

+	    mfcr    r1, fpsr

+	    stw     r1,(r10,12)

+	    mfcr    r1, epc

+	    stw     r1,(r10,16)

+	    mfcr    r1, fpc

+	    stw     r1,(r10,20)

+	    mfcr    r1, ss0

+	    stw     r1,(r10,24)

+	    mfcr    r1, ss1

+	    stw     r1,(r10,28)

+	    mfcr    r1, ss2

+        stw     r1,(r10,32)

+        mfcr    r1, ss3

+        stw     r1,(r10,36)

+        mfcr    r1, ss4

+        stw     r1,(r10,40)

+        mfcr    r1, gcr

+        stw     r1,(r10,44)

+        mfcr    r1, gsr

+        stw     r1,(r10,48)

+        mfcr    r1, cr13    //²úÆ·ÐòºÅ¼Ä´æÆ÷cr13

+        stw     r1,(r10,52)

+        mfcr    r1, cr14    //dsp¿ØÖÆ×´Ì¬¼Ä´æÆ÷£»

+        stw     r1,(r10,56)

+        mfcr    r1, cr15    //½ö´æÔÚÓÚ´øÐ­´¦ÀíÆ÷½Ó¿ÚµÄck_core´¦ÀíÆ÷ÖÐ(Èçck610M¡¢ck610sµÈ)

+        stw     r1,(r10,60)

+        addi    r10,32

+        addi    r10,32

+        mfcr    r1, cr17    //¸ßËÙ»º´æ¼Ä´æÆ÷£»

+        stw     r1,(r10,0)

+        mfcr    r1, cr18    //¸ßËÙ»º´æÅäÖüĴæÆ÷£»

+        stw     r1,(r10,4)

+        mfcr    r1, cr19    //¿É¸ßËٺͷÃÎÊȨÏÞÅäÖüĴæÆ÷£»

+        stw     r1,(r10,8)

+        mfcr    r1, cr20    //±£»¤Çø¿ØÖƼĴæÆ÷£»

+        stw     r1,(r10,12)

+        mfcr    r1, cr21    //±£»¤Çø Ñ¡Ôñ¼Ä´æÆ÷£»

+        stw     r1,(r10,16)

+        jmp     r15

+#if 0

+/**************************************************************************

+ * ±£´æ¼Ä´æÆ÷ÐÅÏ¢ 

+ * º¯ÊýÔ­ÐÍ VOID  zOss_LoadRegisters(VOID)

+ *¸Ãº¯ÊýµÄʹÓÃÐèҪעÒâzOss_SaveRegistersº¯Êý

+ **************************************************************************/

+.text

+.balign 4

+zOss_LoadRegisters:

+        lrw     r10,gRamdumpAdrress

+	 addi    r10,32

+        addi    r10,32

+//¼ÓÔØ¿ØÖƼĴæÆ÷

+       ldw    r1,(r10,0)

+       mtcr   r1, psr

+       ldw    r1,(r10,4)

+       mtcr   r1, VBR

+       ldw    r1,(r10,8)

+       mtcr   r1, epsr

+       ldw    r1,(r10,12)

+       mtcr   r1, fpsr

+       ldw    r1,(r10,16)

+       mtcr   r1, epc

+       ldw    r1,(r10,20)

+       mtcr   r1, fpc

+       ldw    r1,(r10,24)

+       mtcr   r1, ss0

+       ldw    r1,(r10,28)

+       mtcr   r1, ss1

+       ldw    r1,(r10,32)

+       mtcr   r1, ss2

+       ldw    r1,(r10,36)

+       mtcr   r1, ss3

+       ldw    r1,(r10,40)

+       mtcr   r1, ss4

+       ldw    r1,(r10,44)

+       mtcr   r1, gcr

+       ldw    r1,(r10,48)

+       mtcr   r1, gsr

+       ldw    r1,(r10,52)

+       mtcr   r1, cr13

+       ldw    r1,(r10,56)

+       mtcr   r1, cr14

+       ldw    r1,(r10,60)

+       mtcr   r1,cr15

+       addi    r10,32

+       addi    r10,32

+       ldw     r1,(r10,0)

+       mtcr   r1,cr17

+       ldw    r1,(r10,4)

+       mtcr  r1,cr18

+       ldw    r1,(r10,8)

+       mtcr  r1,cr19

+       ldw   r1,(r10,12)

+       mtcr  r1,cr20

+       ldw    r1,(r10,16)

+       mtcr  r1,cr21

+

+	subi  r10,32

+	subi  r10,32

+	subi  r10,32

+	subi  r10,32

+//¼ÓÔØr0-r15

+        ldw     r0,(r10,0)

+        ldw     r1,(r10,4)

+        ldw     r2,(r10,8)

+        ldw     r3,(r10,12)

+        ldw     r4,(r10,16)

+        ldw     r5,(r10,20)

+        ldw     r6,(r10,24)

+        ldw     r7,(r10,28)

+        ldw     r8,(r10,32)

+        ldw     r9,(r10,36)

+        ldw     r11,(r10,44)

+        ldw     r12,(r10,48)

+        ldw      r13,(r10,52)

+        ldw      r14,(r10,56)

+        ldw      r15,(r10,60)

+        ldw     r10,(r10,40)

+        jmp    r15

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_irq.c b/cp/ps/plat/src/oss/osa/linux/src/linux_irq.c
new file mode 100644
index 0000000..37945e0
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_irq.c
@@ -0,0 +1,736 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_irq.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : TOS 3.0µÄÖжÏÇëÇóÄ£¿éʵÏÖ

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/09/23

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+#ifdef TOS_STATISTIC_IRQ

+extern int tos_statistic_irq_init_flag;

+extern unsigned int tos_statistic_irq_assert_tick;

+#endif

+

+#ifdef _USE_MONITOR

+extern T_ZOss_Mon_Event oss_trace_event_info;

+#endif

+

+void tos_statistic_irq_isr_start(unsigned int vector) __attribute__((weak));

+void tos_statistic_irq_isr_end(unsigned int vector) __attribute__((weak));

+void tos_statistic_irq_dsr_start(unsigned int vector) __attribute__((weak));

+void tos_statistic_irq_dsr_end(unsigned int vector) __attribute__((weak));

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef TOS_TRACE_IRQ

+# ifdef _USE_OSS_MIN

+#  define TOS_TRACE_IRQ_NUM             10

+# else

+#  define TOS_TRACE_IRQ_NUM             100

+# endif

+#endif

+

+#ifdef TOS_STATISTIC_IRQ

+# ifdef _USE_OSS_MIN

+#  define TOS_STATISTIC_IRQ_NUM         10

+# else

+#  define TOS_STATISTIC_IRQ_NUM         100

+# endif

+#endif

+   

+/* TOS_STATISTIC_IRQ_ATTACH_TAG */

+#define TOS_STATISTIC_IRQ_ATTACH

+#ifdef TOS_STATISTIC_IRQ_ATTACH

+# ifdef _USE_OSS_MIN

+#  define TOS_STATISTIC_IRQ_ATTACH_NUM  10

+# else

+#  define TOS_STATISTIC_IRQ_ATTACH_NUM  30

+# endif

+#endif

+

+#ifdef CYGNUM_HAL_VECTOR_INTRFIRST

+# define TOS_IRQ_VECTOR_BASE            CYGNUM_HAL_VECTOR_INTRFIRST

+#else

+# define TOS_IRQ_VECTOR_BASE            0

+#endif

+

+#ifdef CYGPKG_HAL_CORTEXM

+# define TOS_TRANSLATE_VECTOR(_vector_, _index_) ((_index_) = (_vector_) + 1)

+#else

+# define TOS_TRANSLATE_VECTOR(_vector_, _index_)

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct {

+    unsigned int    stm_0;

+    unsigned int    stm_7;

+} tos_statistic_irq_tick_t;

+

+#ifdef TOS_STATISTIC_IRQ

+typedef struct {

+    unsigned int    vector;

+    unsigned int    start_tick;

+    unsigned int    end_tick;

+} tos_statistic_irq_t;

+

+typedef struct {

+    unsigned int    start_tick;

+    unsigned int    end_tick;

+} tos_statistic_irq_thread_t;

+

+typedef struct {

+    unsigned int    tick;

+    cyg_handle_t    thread;

+    char            *thread_name;

+} tos_statistic_irq_assert_t;

+#endif

+

+#ifdef TOS_STATISTIC_IRQ_ATTACH

+typedef struct {

+    unsigned int    vector;

+    unsigned int    priority;

+    unsigned int    data;

+    void            *isr;

+    void            *dsr;

+} tos_statistic_irq_create_t;

+#endif

+

+#ifdef TOS_TRACE_IRQ

+typedef struct {

+    const char      *file;

+    unsigned int    line;

+    unsigned int    tick;

+} tos_trace_irq_t;

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+#ifdef TOS_STATISTIC_IRQ

+tos_statistic_irq_tick_t    tos_irq_tick;

+int                         tos_statistic_irq_init_flag     = 0;

+unsigned int                tos_statistic_irq_isr_count     = 0;

+unsigned int                tos_statistic_irq_dsr_count     = 0;

+unsigned int                tos_statistic_irq_thread_count  = 0;

+unsigned int                tos_statistic_irq_assert_count  = 0;

+tos_statistic_irq_t         tos_statistic_irq_isr[TOS_STATISTIC_IRQ_NUM];

+tos_statistic_irq_t         tos_statistic_irq_dsr[TOS_STATISTIC_IRQ_NUM];

+tos_statistic_irq_thread_t  tos_statistic_irq_thread[TOS_STATISTIC_IRQ_NUM];

+unsigned int                tos_statistic_irq_assert_tick;

+tos_statistic_irq_assert_t  tos_statistic_irq_assert_array[TOS_STATISTIC_IRQ_NUM];

+#endif

+

+#ifdef TOS_STATISTIC_IRQ_ATTACH

+unsigned int                tos_statistic_irq_attach_count;

+tos_statistic_irq_create_t  tos_statistic_irq_attach[TOS_STATISTIC_IRQ_ATTACH_NUM];

+#endif

+

+#ifdef TOS_TRACE_IRQ

+int                         tos_trace_irq_disable_flag          = 0;

+unsigned int                tos_trace_irq_disable_count         = 0;

+unsigned int                tos_trace_irq_disable_total_count   = 0;

+tos_trace_irq_t             tos_trace_irq_disable[TOS_TRACE_IRQ_NUM];

+

+int                         tos_trace_irq_enable_flag           = 0;

+unsigned int                tos_trace_irq_enable_count          = 0;

+unsigned int                tos_trace_irq_enable_total_count;

+tos_trace_irq_t             tos_trace_irq_enable[TOS_TRACE_IRQ_NUM];

+

+int                         tos_trace_irq_save_flag             = 0;

+unsigned int                tos_trace_irq_save_count            = 0;

+unsigned int                tos_trace_irq_save_total_count;

+tos_trace_irq_t             tos_trace_irq_save[TOS_TRACE_IRQ_NUM];

+

+int                         tos_trace_irq_restore_flag          = 0;

+unsigned int                tos_trace_irq_restore_count         = 0;

+unsigned int                tos_trace_irq_restore_total_count   = 0;

+tos_trace_irq_t             tos_trace_irq_restore[TOS_TRACE_IRQ_NUM];

+#endif

+

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡µ±Ç°µÄtick

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     µ±Ç°µÄtick

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+#ifdef _USE_MONITOR

+static unsigned long long tos_irq_current_tick(void)

+{

+    return (unsigned long long)(*(unsigned int *)0xf4b00010) | ((unsigned long long)((*(unsigned int *)0xf4b0002c) & 0xFFFFFF) << 32);

+}

+#endif

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef TOS_STATISTIC_IRQ

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´ò¿ªÖжÏͳ¼Æ¹¦ÄÜ£»

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_open(void)

+{

+    tos_statistic_irq_init_flag = 1;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¹Ø±ÕÖжÏͳ¼Æ¹¦ÄÜ£»

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_close(void)

+{

+    tos_statistic_irq_init_flag = 0;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÖжÏͳ¼Æ¹¦ÄܵĶÏÑÔº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_assert(void)

+{

+    if (tos_statistic_irq_init_flag) 

+    {

+        tos_statistic_irq_assert_array[tos_statistic_irq_assert_count].tick = tos_statistic_irq_assert_tick;

+        tos_statistic_irq_assert_array[tos_statistic_irq_assert_count].thread = cyg_thread_self();

+#ifdef CYGOPT_KERNEL_EXTEND_THREAD_NAME

+        tos_statistic_irq_assert_array[tos_statistic_irq_assert_count].thread_name = cyg_thread_get_name(cyg_thread_self());

+#else        

+        tos_statistic_irq_assert_array[tos_statistic_irq_assert_count].thread_name = NULL;

+#endif

+        if (++tos_statistic_irq_assert_count >= TOS_STATISTIC_IRQ_NUM)

+        {

+            tos_statistic_irq_assert_count = 0x00;

+        }

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼ÆÖжϴ¦Àíº¯Êý¿ªÊ¼Ö´ÐÐʱµÄʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  vector:     ÖжÏÏòÁ¿ºÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_isr_start(unsigned int vector)

+{

+    if (tos_statistic_irq_init_flag) 

+    {

+        tos_statistic_irq_isr[tos_statistic_irq_isr_count].vector = vector - TOS_IRQ_VECTOR_BASE;

+        tos_statistic_irq_isr[tos_statistic_irq_isr_count].start_tick = *(volatile unsigned int *)0xf4b00010;

+        tos_statistic_irq_isr[tos_statistic_irq_isr_count].end_tick = 0x00;

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼ÆÖжϴ¦Àíº¯Êý½áÊøÖ´ÐÐʱµÄʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  vector:     ÖжÏÏòÁ¿ºÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_isr_end(unsigned int vector)

+{

+    if (tos_statistic_irq_init_flag) 

+    {

+        tos_statistic_irq_isr[tos_statistic_irq_isr_count].end_tick = *(volatile unsigned int *)0xf4b00010;

+        if (++tos_statistic_irq_isr_count >= TOS_STATISTIC_IRQ_NUM)

+        {

+            tos_statistic_irq_isr_count = 0x00;

+        }

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼ÆÑÓ³ÙÖжϴ¦Àíº¯Êý¿ªÊ¼Ö´ÐÐʱµÄʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  vector:     ÖжÏÏòÁ¿ºÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_dsr_start(unsigned int vector)

+{

+    if (tos_statistic_irq_init_flag)

+    {

+        tos_statistic_irq_dsr[tos_statistic_irq_dsr_count].vector = vector - TOS_IRQ_VECTOR_BASE;

+        tos_statistic_irq_dsr[tos_statistic_irq_dsr_count].start_tick = *(volatile unsigned int *)0xf4b00010;

+

+#if defined (OSS_TRACE_THREAD) && defined(_USE_MONITOR)

+        if (gOsa_MonitorFlag)

+        {

+            UINT32 cnt = oss_trace_event_info.num;

+

+            oss_trace_event_info.ele[cnt].event        = OSS_MON_EVENT_DSR_SWAPIN;

+            oss_trace_event_info.ele[cnt].name         = "dsr";

+            oss_trace_event_info.ele[cnt].handle       = vector - TOS_IRQ_VECTOR_BASE;

+            oss_trace_event_info.ele[cnt].tickstamp    = tos_irq_current_tick();

+            if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+            {

+                cnt = 0;

+            }

+            oss_trace_event_info.num = cnt;

+        }

+#endif

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼ÆÑÓ³ÙÖжϴ¦Àíº¯Êý½áÊøÖ´ÐÐʱµÄʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  vector:     ÖжÏÏòÁ¿ºÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_dsr_end(unsigned int vector)

+{

+    if (tos_statistic_irq_init_flag) 

+    {

+        tos_statistic_irq_dsr[tos_statistic_irq_dsr_count].end_tick = *(volatile unsigned int *)0xf4b00010;

+        if (++tos_statistic_irq_dsr_count >= TOS_STATISTIC_IRQ_NUM)

+        {

+            tos_statistic_irq_dsr_count = 0x00;

+        }        

+#if defined (OSS_TRACE_THREAD) && defined(_USE_MONITOR)

+        if (gOsa_MonitorFlag)

+        {

+            UINT32 cnt = oss_trace_event_info.num;

+

+            oss_trace_event_info.ele[cnt].event        = OSS_MON_EVENT_DSR_SWAPOUT;

+            oss_trace_event_info.ele[cnt].name         = "dsr";

+            oss_trace_event_info.ele[cnt].handle       = vector - TOS_IRQ_VECTOR_BASE;

+            oss_trace_event_info.ele[cnt].tickstamp    = tos_irq_current_tick();

+            if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+            {

+                cnt = 0;

+            }

+            oss_trace_event_info.num = cnt;

+        }

+#endif

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼Æ±»Öжϻ½ÐÑÏ߳̿ªÊ¼Ö´ÐÐʱµÄʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_thread_start(void)

+{

+    if (tos_statistic_irq_init_flag) 

+    {

+        tos_statistic_irq_thread[tos_statistic_irq_thread_count].start_tick = *(volatile unsigned int *)0xf4b00010;

+        tos_statistic_irq_thread[tos_statistic_irq_thread_count].end_tick = 0x00;

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼Æ±»Öжϻ½ÐÑÏ߳̽áÊøÖ´ÐÐʱµÄʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_thread_end(void)

+{

+    if (tos_statistic_irq_init_flag) 

+    {

+        tos_statistic_irq_thread[tos_statistic_irq_thread_count].end_tick = *(volatile unsigned int *)0xf4b00010;

+        if (++tos_statistic_irq_thread_count >= TOS_STATISTIC_IRQ_NUM)

+        {

+            tos_statistic_irq_thread_count = 0x00;

+        }

+    }

+}

+#endif

+

+

+#ifdef TOS_STATISTIC_IRQ_ATTACH

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Cyg_Interrupt::attachº¯ÊýÖе÷Óô˺¯Êý£¬ÒÔͳ¼ÆÏµÍ³ÖÐËùÓÐÖжÏÔ´µÄ

+                vector¡¢priority¡¢data¡¢isr¡¢dsr

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  vector:     ÏòÁ¿ºÅ

+                priority:   ÓÅÏȼ¶

+                data:       Èë²Î

+                isr:        ÖжϷþÎñ³ÌÐòµØÖ·

+                dsr:        ÑÓ³ÙÖжϷþÎñ³ÌÐòµØÖ·

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_attach_hook(unsigned int vector,

+                                   unsigned int priority,

+                                   unsigned int data,

+                                   void *isr,

+                                   void *dsr)

+{

+    tos_statistic_irq_attach[tos_statistic_irq_attach_count].vector   = vector - TOS_IRQ_VECTOR_BASE;

+    tos_statistic_irq_attach[tos_statistic_irq_attach_count].priority = priority;

+    tos_statistic_irq_attach[tos_statistic_irq_attach_count].data     = data;

+    tos_statistic_irq_attach[tos_statistic_irq_attach_count].isr      = isr;

+    tos_statistic_irq_attach[tos_statistic_irq_attach_count].dsr      = dsr;

+    tos_statistic_irq_attach_count++;

+    if (tos_statistic_irq_attach_count == TOS_STATISTIC_IRQ_ATTACH_NUM)

+    {

+        tos_statistic_irq_attach_count = 0x00;

+    }

+}

+#endif

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ĬÈϵÄÖжϷþÎñÀý³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  vector:     ÖжÏÏòÁ¿ºÅ

+                data:       ´´½¨ÖжϷþÎñÀý³Ìʱ´«ÈëµÄ²ÎÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ²Î¼ûCyg_Interrupt::CALL_DSRºÍCyg_Interrupt::HANDLEDµÄʹÓ÷½·¨

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 tos_default_isr( UINT32 vector, UINT32 data)

+{

+    //HAL_INTERRUPT_MASK(vector);

+    return 0x03;    /* Cyg_Interrupt::CALL_DSR | Cyg_Interrupt::HANDLED */

+}

+

+#ifdef _USE_OSS_MIN

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´´½¨Ìض¨ÖжϵÄÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ²Î¼û²ÎÊýÁбíÖеÄ×¢ÊÍ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³ÌµÄ¾ä±ú

+* ÆäËü˵Ã÷:     1) Èô´´½¨Ê§°Ü£¬ÏµÍ³¶ÏÑÔ£»

+                2) ¸Ãº¯ÊýÖÐÉêÇëµÄÄÚ´æ¿Õ¼ä£¬ÔÚtos_delete_irqº¯ÊýÖÐÊÍ·Å£»

+**************************************************************************/

+UINT32 tos_create_irq(

+                UINT32 vector,              /* ÖжÏÏòÁ¿         */

+                UINT32 priority,            /* ÖжÏÓÅÏȼ¶       */

+                UINT32 data,                /* Êý¾ÝÖ¸Õë         */

+                tos_isr_t  isr,             /* ÖжϷþÎñÀý³Ì     */

+                tos_dsr_t  dsr,             /* ÖжÏÑÓ³Ù·þÎñÀý³Ì */

+                cyg_interrupt *interrupt)   /* ÖжϽṹÌåÖ¸Õë   */

+{

+    cyg_handle_t interrupt_handle = 0x00;

+

+    CYG_ASSERT(interrupt != NULL, "NULL");

+

+    TOS_TRANSLATE_VECTOR(vector, vector);

+    if (isr == NULL)

+        isr = tos_default_isr;

+

+    cyg_interrupt_create(

+        vector,             /* Vector to attach to          */

+        priority,           /* Queue priority               */

+        data,               /* Data pointer                 */

+        (cyg_ISR_t *)isr,   /* Interrupt Service Routine    */

+        (cyg_DSR_t *)dsr,   /* Deferred Service Routine     */

+        &interrupt_handle,  /* returned handle              */

+        interrupt           /* put interrupt here           */

+    );

+    CYG_ASSERT(interrupt_handle != 0x00, "NULL");

+    cyg_interrupt_attach( interrupt_handle );

+    cyg_interrupt_unmask(vector);

+

+    return interrupt_handle;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ɾ³ýÌØ¶¨ÖжϵÄÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  interrupt_handle:   ´ýɾ³ýµÄÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³ÌµÄ¾ä±ú

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ×¢Òâϵͳµ÷ÓõÄ˳Ðò£¬²»Äܵߵ¹:

+                1) ½û¸ÃÖжϣ»

+                2) ½â³ýÖжϹҽӣ»

+                3) ɾ³ýÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³Ì£»

+                4) ÊÍ·Åtos_create_irqº¯ÊýÖÐÉêÇëµÄÄÚ´æ¿Õ¼ä£»

+**************************************************************************/

+VOID tos_delete_irq(UINT32 interrupt_handle)

+{

+    cyg_interrupt *icb = NULL;     /* interrupt control block */

+

+    CYG_ASSERT(interrupt_handle != 0x00, "NULL");

+

+    icb = (cyg_interrupt*)interrupt_handle;

+    cyg_interrupt_mask(icb->vector);

+    cyg_interrupt_detach(interrupt_handle);

+    cyg_interrupt_delete(interrupt_handle);

+}

+#else

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´´½¨Ìض¨ÖжϵÄÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ²Î¼û²ÎÊýÁбíÖеÄ×¢ÊÍ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³ÌµÄ¾ä±ú

+* ÆäËü˵Ã÷:     1) Èô´´½¨Ê§°Ü£¬ÏµÍ³¶ÏÑÔ£»

+                2) ¸Ãº¯ÊýÖÐÉêÇëµÄÄÚ´æ¿Õ¼ä£¬ÔÚtos_delete_irqº¯ÊýÖÐÊÍ·Å£»

+**************************************************************************/

+UINT32 linux_create_irq(UINT32 vector,        /* ÖжÏÏòÁ¿         */

+                           UINT32 priority,      /* ÖжÏÓÅÏȼ¶       */

+                           UINT32 data,          /* Êý¾ÝÖ¸Õë         */

+                           linux_isr_t isr,        /* ÖжϷþÎñÀý³Ì     */

+                           linux_dsr_t dsr)        /* ÖжÏÑÓ³Ù·þÎñÀý³Ì */

+{

+    return 0x00;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ɾ³ýÌØ¶¨ÖжϵÄÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  interrupt_handle:   ´ýɾ³ýµÄÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³ÌµÄ¾ä±ú

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ×¢Òâϵͳµ÷ÓõÄ˳Ðò£¬²»Äܵߵ¹:

+                1) ½û¸ÃÖжϣ»

+                2) ½â³ýÖжϹҽӣ»

+                3) ɾ³ýÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³Ì£»

+                4) ÊÍ·Åtos_create_irqº¯ÊýÖÐÉêÇëµÄÄÚ´æ¿Õ¼ä£»

+**************************************************************************/

+VOID linux_delete_irq(UINT32 interrupt_handle)

+{

+

+}

+#endif

+

+

+#ifdef TOS_TRACE_IRQ

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´ò¿ªirq¸ú×Ù¹¦ÄÜ£»

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_irq_open(void)

+{

+    tos_trace_irq_disable_flag = 1;

+    tos_trace_irq_enable_flag  = 1;

+    tos_trace_irq_save_flag    = 1;

+    tos_trace_irq_restore_flag = 1;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¹Ø±Õirq¸ú×Ù¹¦ÄÜ£»

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_irq_close(void)

+{

+    tos_trace_irq_disable_flag = 0;

+    tos_trace_irq_enable_flag  = 0;

+    tos_trace_irq_save_flag    = 0;

+    tos_trace_irq_restore_flag = 0;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×ÙȥʹÄÜÖжÏ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  file:   ÎļþÃû

+                line:   ÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_disable_irq(const char *file, unsigned int line)

+{

+    if (tos_trace_irq_disable_flag) 

+    {

+        tos_trace_irq_disable[tos_trace_irq_disable_count].file   = file;

+        tos_trace_irq_disable[tos_trace_irq_disable_count].line   = line;

+        tos_trace_irq_disable[tos_trace_irq_disable_count].tick   = *(volatile unsigned int *)0xf4b00010;

+        tos_trace_irq_disable_total_count++;

+        if (++tos_trace_irq_disable_count >= TOS_TRACE_IRQ_NUM)

+        {

+            tos_trace_irq_disable_count = 0x00;

+        }

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×ÙʹÄÜÖжÏ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  file:   ÎļþÃû

+                line:   ÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_enable_irq(const char *file, unsigned int line)

+{

+    if (tos_trace_irq_enable_flag) 

+    {

+        tos_trace_irq_enable[tos_trace_irq_enable_count].file = file;

+        tos_trace_irq_enable[tos_trace_irq_enable_count].line = line;

+        tos_trace_irq_enable[tos_trace_irq_enable_count].tick = *(volatile unsigned int *)0xf4b00010;

+        tos_trace_irq_enable_total_count++;

+        if (++tos_trace_irq_enable_count >= TOS_TRACE_IRQ_NUM)

+        {

+            tos_trace_irq_enable_count = 0x00;

+        }

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×Ù±£´æÖжÏ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  file:   ÎļþÃû

+                line:   ÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_save_irq(const char *file, unsigned int line)

+{

+    if (tos_trace_irq_save_flag) 

+    {

+        tos_trace_irq_save[tos_trace_irq_save_count].file = file;

+        tos_trace_irq_save[tos_trace_irq_save_count].line = line;

+        tos_trace_irq_save[tos_trace_irq_save_count].tick = *(volatile unsigned int *)0xf4b00010;

+        tos_trace_irq_save_total_count++;

+        if (++tos_trace_irq_save_count >= TOS_TRACE_IRQ_NUM)

+        {

+            tos_trace_irq_save_count = 0x00;

+        }

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×Ù»Ö¸´ÖжÏ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  file:   ÎļþÃû

+                line:   ÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_restore_irq(const char *file, unsigned int line)

+{

+    if (tos_trace_irq_restore_flag) 

+    {

+        tos_trace_irq_restore[tos_trace_irq_restore_count].file   = file;

+        tos_trace_irq_restore[tos_trace_irq_restore_count].line   = line;

+        tos_trace_irq_restore[tos_trace_irq_restore_count].tick   = *(volatile unsigned int *)0xf4b00010;

+        tos_trace_irq_restore_total_count++;

+        if (++tos_trace_irq_restore_count >= TOS_TRACE_IRQ_NUM)

+        {

+            tos_trace_irq_restore_count = 0x00;

+        }

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²âÊÔ¸ú×ÙÖжϽӿÚÊÇ·ñÕý³£

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+                void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_irq_assert(void)

+{

+    //volatile int cnt;

+    ZOSS_INTR old_intr;

+

+    ZOSS_SAVE_IRQ(old_intr);

+    *(unsigned int *)0x01 = 0x12345678;

+    //for (cnt = 0x00; cnt < 60000000; cnt++);

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+#endif  /* TOS_TRACE_IRQ */

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_kernel.c b/cp/ps/plat/src/oss/osa/linux/src/linux_kernel.c
new file mode 100755
index 0000000..094112b
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_kernel.c
@@ -0,0 +1,3117 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     linux_kernel.c

+* Îļþ±êʶ:     linux_kernel.c

+* ÄÚÈÝÕªÒª:     linux²Ù×÷ϵͳOSSÖ§³Å²ãÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/07/11      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_api.h"

+#include "osa.h"

+#include "sup.h"

+#include "linux_typedef.h"

+#include "linux_stat.h"

+#include <linux/sched.h>

+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))

+#include <linux/sched/rt.h>

+#endif

+#include <linux/kthread.h>

+#include <linux/jiffies.h>

+#include <linux/delay.h>

+#include <linux/spinlock.h>

+#include <linux/semaphore.h>

+#include <linux/mutex.h>

+#include <linux/completion.h>

+#include <linux/printk.h>

+#include <linux/notifier.h>

+#include <linux/profile.h>

+#include <linux/perf_event.h>

+#include <linux/sort.h>

+#include <linux/pid.h>

+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0))

+#include "rtmutex_common.h"

+#else

+#include "locking/rtmutex_common.h"

+#endif

+#include "sched/sched.h"

+#include <asm/cacheflush.h>

+#include <asm/asm-offsets.h>

+#include <asm/mach/map.h>

+

+#ifndef CONFIG_PROFILING

+# error "linux thread exit need CONFIG_PROFILING == 1!"

+#endif

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/*******************************************************************************

+*                                Íⲿ±äÁ¿ÉùÃ÷                                  *

+*******************************************************************************/

+extern UINT64 gTimer_CurTime;

+extern struct task_struct *kthreadd_task;

+

+/*******************************************************************************

+*                                Íⲿº¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+extern VOID Osa_SysErrHndInit(VOID);

+extern void tos_cache_clean_all(void);

+extern SINT32 Hal_GetArmCoreFreq(UINT32* feq);

+extern UINT32 Osa_HwTimeRead(VOID);

+void linux_thread_sched_stat(int type);

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+#define THREAD_MSG_HEAD_SIZE        (sizeof(T_THREAD_MSG_HEAD))

+#define THREAD_MSG_HEAD(buf)        ((T_THREAD_MSG_HEAD *)((UINT8 *)(buf) - THREAD_MSG_HEAD_SIZE))

+#define THREAD_MSG_BUF(head)        ((VOID *)((UINT8 *)(head) + THREAD_MSG_HEAD_SIZE))

+#define THREAD_MSG_SIZE(size)       ((size) + THREAD_MSG_HEAD_SIZE)

+#define THREAD_MSG_MAGIC            0x3A3A3A3A

+#define THREAD_MSG_HOOK_TYPE_MAX    ZOSS_SETHOOKFLAG_INTER

+#define THREAD_MSG_HOOK_DIRE_MAX    ZOSS_MSGDIRE_INOUT

+

+#define LINUX_IRQ_THREAD_PRIORITY   (MAX_USER_RT_PRIO/2)

+

+//#define LINUX_THREAD_MSG_STAT

+#define LINUX_THREAD_MSG_COMPLETION     0

+#define LINUX_THREAD_MSG_SEMAPHORE      1

+#define LINUX_THREAD_MSG                LINUX_THREAD_MSG_SEMAPHORE

+

+#ifdef _UB_USE_HEAP

+#define LINUX_THREAD_MSG_ALLOC(size)    kmalloc(size, GFP_KERNEL)

+#define LINUX_THREAD_MSG_FREE(ptr)      kfree(ptr)

+#else

+#define LINUX_THREAD_MSG_ALLOC(size)    palloc(size)

+#define LINUX_THREAD_MSG_FREE(ptr)      pfree(ptr)

+#endif

+

+#define LINUX_MUTEX_NESTING

+

+#define for_each_processex(p) \

+	for (p = &init_task ; next_task(p) != &init_task ; p = next_task(p))

+        

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+typedef struct {

+    SIGSELECT   sig_no;

+    UINT32      id;

+    UINT32      buf_size;

+    UINT32      magic;

+} T_THREAD_MSG_HEAD;

+

+typedef struct {

+    T_ZOss_Node     Node;

+    ZOSS_THREAD_ID  thread_id;

+    UINT8           dire[THREAD_MSG_HOOK_TYPE_MAX];

+    THREAD_MSG_HOOK func[THREAD_MSG_HOOK_TYPE_MAX];

+} THREAD_MSG_HOOK_CONTENT;

+

+typedef struct {

+    char    *str;

+    u64     keyval;

+} linux_thread_sched_stat_t;

+

+typedef struct {

+    struct mutex    raw_mutex;

+    const char      *name;

+#ifdef LINUX_MUTEX_NESTING

+    atomic_t        nesting;

+#endif

+} linux_mutex_t;

+

+typedef struct {

+    struct list_head    node;

+    void                *msg;

+    UINT32              size;

+} linux_msg_queue_node_t;

+

+typedef struct {

+    struct list_head    head;

+    raw_spinlock_t      lock;

+

+#ifdef LINUX_THREAD_MSG_STAT

+    u32                 count;

+    u64                 send_time;

+    u64                 recv_time;

+#endif

+

+#if (LINUX_THREAD_MSG == LINUX_THREAD_MSG_COMPLETION)

+    struct completion   completion;

+#elif (LINUX_THREAD_MSG == LINUX_THREAD_MSG_SEMAPHORE)

+    struct semaphore    semaphore;

+#endif

+} linux_msg_queue_t;

+

+typedef struct {

+    struct list_head        all_node;

+    struct task_struct      *task;

+    linux_msg_queue_t       msg_queue;

+    T_ZOsa_ThreadUserArea   user_area;

+} linux_thread_t;

+

+typedef void (*linux_thread_entry_t)(SINT32 arg);

+

+typedef struct {

+    linux_thread_entry_t    entry;

+    SINT32                  arg;

+    linux_thread_t          *thread;

+} linux_create_thread_t;

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+static ZOSS_TIMER_ID zOss_GetStatisticTimesliceTimer(void);

+static void zOss_SetStatisticTimesliceTimer(ZOSS_TIMER_ID timer_id);

+static void zOss_StatisticTimesliceEnd(SINT32 param);

+

+static int linux_thread_entry(void *arg);

+static int linux_thread_exit(struct notifier_block *nb, unsigned long val, void *data);

+static linux_thread_t *linux_thread_is_valid(ZOSS_THREAD_ID thread_id);

+static linux_thread_t *linux_thread_task_is_valid(struct task_struct *task);

+static linux_thread_t *linux_thread_current(void);

+static linux_thread_t *linux_thread_get_thread_by_name(const char *name);

+static UINT32 linux_thread_count_all_thread(void);

+static UINT32 linux_thread_get_all_thread(linux_thread_t *thread_array[]);

+static T_ZOsa_ThreadUserArea *linux_thread_get_user_area(ZOSS_THREAD_ID thread_id);

+static linux_thread_t *linux_thread_alloc(void);

+static void linux_thread_free(linux_thread_t *thread);

+static void linux_thread_swapin(struct perf_event *event, int flags);

+static void linux_thread_swapout(struct perf_event *event, int flags);

+

+static void Osa_create_handler(void *thread, void *user_area);

+static void Osa_kill_handler(void *thread, void *user_area);

+#ifdef CONFIG_ACCURATE_CPU_PERCENT

+static void Osa_swapin_handler(void *thread);

+static void Osa_swapout_handler(void *thread);

+#else

+static void Osa_swapin_handler(void *thread, void *user_area);

+static void Osa_swapout_handler(void *thread, void *user_area);

+#endif

+

+static void linux_stat_osa_callback(u32 idle_time, u32 total_time);

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+__tcm_data static BOOL         gOsa_SwapFlag;

+__tcm_data static UINT32       gOsa_SwapLastTime;

+__tcm_data static UINT32       gOsa_CpuStartTime;

+__tcm_data static ZOSS_TASK_ID *gOsa_AllTaskIdArray;

+

+#ifdef _USE_MESSAGE

+__tcm_data static T_ZOss_List  s_thread_msg_hook_list;

+#endif

+

+#ifdef _USE_MONITOR

+static T_ZOss_Mon_Msg gOsa_MsgInfo;

+#endif

+

+#ifdef TOS_STATISTIC_TIMESLICE

+static ZOSS_TIMER_ID tos_statistic_timeslice_timer;

+#endif

+

+#ifdef _USE_THREAD

+__tcm_data static LIST_HEAD(linux_thread_all_head);

+__tcm_data static DEFINE_RAW_SPINLOCK(linux_thread_spin_lock);

+

+static struct notifier_block profile_nb = {

+	.notifier_call = linux_thread_exit,

+};

+

+static struct pmu thread_pmu = {

+    .task_ctx_nr    = perf_sw_context,

+    .start          = linux_thread_swapin,

+    .stop           = linux_thread_swapout,

+};

+

+static const char *linux_thread_sched_policy[] = {

+    "SCHED_NORMAL",

+    "SCHED_FIFO",

+    "SCHED_RR",

+    "SCHED_BATCH",

+    "SCHED_IDLE",

+};

+#endif

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+__tcm_data UINT32  gOsa_SysCpuFreq;

+__tcm_data BOOL    gOsa_SwapTimeFlag;

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+#ifdef _USE_THREAD

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³ÌͳһÈë¿Úº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  arg:    Ïß³ÌÈë²Î

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ±ê×¼´íÎóÂë

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static int linux_thread_entry(void *arg)

+{

+    linux_thread_t *thread;

+    linux_create_thread_t *create_thread;

+

+    zOss_AssertEx(arg != NULL, -EINVAL);

+

+    create_thread = (linux_create_thread_t *)arg;

+

+    thread = create_thread->thread;

+    if (thread->task == NULL)

+        thread->task = current;

+

+    thread->user_area.topstack = round_up((UINT32)current->stack, THREAD_SIZE);

+

+    create_thread->entry(create_thread->arg);

+

+    kfree((void *)create_thread);

+    do_exit(0x00);

+

+    return 0x00;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³Ìͳһ³ö¿Úº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  nb:     ֪ͨ½á¹¹ÌåÖ¸Õë

+                val:    linux֪ͨ»úÖÆ´«µÝµÄÖµ

+                data:   Êý¾ÝÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ±ê×¼´íÎóÂë

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static int linux_thread_exit(struct notifier_block *nb, unsigned long val, void *data)

+{

+    linux_thread_t *thread;

+    struct task_struct *task;

+

+    zOss_AssertEx(data != NULL, -EINVAL);

+

+    task = (struct task_struct *)data;

+    thread = linux_thread_task_is_valid(task);

+    if (thread) {

+        Osa_kill_handler((void *)thread, (void *)&thread->user_area);

+        linux_thread_free(thread);

+    }

+

+    return 0x00;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡µ±Ç°Ï߳̽ṹÌåÖ¸Õë

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦£¬·µ»Øµ±Ç°Ï߳̽ṹÌåÖ¸Õ룬·ñÔò·µ»ØNULL

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+__tcm_func static linux_thread_t *linux_thread_current(void)

+{

+#if 0

+    bool valid = false;

+    unsigned long flags;

+    linux_thread_t *thread;

+

+    raw_spin_lock_irqsave(&linux_thread_spin_lock, flags);

+    list_for_each_entry(thread, &linux_thread_all_head, all_node) {

+        if (thread->task == current) {

+            valid = true;

+            break;

+        }

+    }

+    raw_spin_unlock_irqrestore(&linux_thread_spin_lock, flags);

+

+    if (valid)

+        return thread;

+    else

+        return NULL;

+#else

+    return (linux_thread_t *)(current->zoss_thread);

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³ÌÊÇ·ñÓÐЧ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ïß³ÌID

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Ïß³ÌÓÐЧ£¬·µ»ØÏ߳̽ṹÌåÖ¸Õ룬·ñÔò·µ»ØNULL

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static linux_thread_t *linux_thread_is_valid(ZOSS_THREAD_ID thread_id)

+{

+#if 0

+    bool valid = false;

+    unsigned long flags;

+    linux_thread_t *thread;

+

+    raw_spin_lock_irqsave(&linux_thread_spin_lock, flags);

+    list_for_each_entry(thread, &linux_thread_all_head, all_node) {

+        if (thread == (linux_thread_t *)thread_id) {

+            valid = true;

+            break;

+        }

+    }

+    raw_spin_unlock_irqrestore(&linux_thread_spin_lock, flags);

+

+    if (valid)

+        return thread;

+    else

+        return NULL;

+#else

+    return (linux_thread_t *)thread_id;

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÈÎÎñÊÇ·ñÓÐЧ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  task:   ÈÎÎñ½á¹¹ÌåÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÈÎÎñÓÐЧ£¬·µ»Ø¶ÔÓ¦µÄÏ߳̽ṹÌåÖ¸Õ룬·ñÔò·µ»ØNULL

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static linux_thread_t *linux_thread_task_is_valid(struct task_struct *task)

+{

+    bool valid = false;

+    unsigned long flags;

+    linux_thread_t *thread;

+

+    raw_spin_lock_irqsave(&linux_thread_spin_lock, flags);

+    list_for_each_entry(thread, &linux_thread_all_head, all_node) {

+        if (thread->task == task) {

+            valid = true;

+            break;

+        }

+    }

+    raw_spin_unlock_irqrestore(&linux_thread_spin_lock, flags);

+

+    if (valid)

+        return thread;

+    else

+        return NULL;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾ÝÏß³ÌÃû³Æ£¬»ñÈ¡Ï߳̽ṹÌåÖ¸Õë

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  name:   Ïß³ÌÃû³Æ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Ïß³ÌÃû³ÆÓÐЧ£¬·µ»ØÏ߳̽ṹÌåÖ¸Õ룬·ñÔò·µ»ØNULL

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+__tcm_func static linux_thread_t *linux_thread_get_thread_by_name(const char *name)

+{

+    bool valid = false;

+    unsigned long flags;

+    linux_thread_t *thread;

+

+    raw_spin_lock_irqsave(&linux_thread_spin_lock, flags);

+    list_for_each_entry(thread, &linux_thread_all_head, all_node) {

+        if (strcmp(thread->user_area.threadname, name) == 0) {

+            valid = true;

+            break;

+        }

+    }

+    raw_spin_unlock_irqrestore(&linux_thread_spin_lock, flags);

+

+    if (valid)

+        return thread;

+    else

+        return NULL;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñȡϵͳÓÐЧÏß³ÌÊý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ϵͳÓÐЧÏß³ÌÊý

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static UINT32 linux_thread_count_all_thread(void)

+{

+    UINT32 count = 0x00;

+    unsigned long flags;

+    linux_thread_t *thread;

+

+    raw_spin_lock_irqsave(&linux_thread_spin_lock, flags);

+    list_for_each_entry(thread, &linux_thread_all_head, all_node)

+        count++;

+    raw_spin_unlock_irqrestore(&linux_thread_spin_lock, flags);

+

+    return count;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñȡϵͳÓÐЧÏß³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_array:   Ï߳̽ṹÌåÖ¸Õë´æ·ÅÊý×é

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ϵͳÓÐЧÏß³ÌÊý

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static UINT32 linux_thread_get_all_thread(linux_thread_t *thread_array[])

+{

+    UINT32 cnt = 0x00;

+    unsigned long flags;

+    linux_thread_t *thread;

+

+    zOss_AssertEx(thread_array != NULL, 0x00);

+

+    raw_spin_lock_irqsave(&linux_thread_spin_lock, flags);

+    list_for_each_entry(thread, &linux_thread_all_head, all_node)

+        thread_array[cnt++] = thread;

+    raw_spin_unlock_irqrestore(&linux_thread_spin_lock, flags);

+

+    return cnt;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡Ïß³ÌÓû§Êý¾ÝÇø

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:   Ï߳̽ṹÌåÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Ïß³ÌÓû§Êý¾ÝÇø

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+__tcm_func static T_ZOsa_ThreadUserArea *linux_thread_get_user_area(ZOSS_THREAD_ID thread_id)

+{

+#if 0

+    unsigned long flags;

+    linux_thread_t *thread;

+    T_ZOsa_ThreadUserArea *user_area = NULL;

+

+    raw_spin_lock_irqsave(&linux_thread_spin_lock, flags);

+    list_for_each_entry(thread, &linux_thread_all_head, all_node) {

+        if (thread == (linux_thread_t *)thread_id) {

+            user_area = thread->user_area;

+            break;

+        }

+    }

+    raw_spin_unlock_irqrestore(&linux_thread_spin_lock, flags);

+

+    return user_area;

+#else

+    return thread_id ? &(((linux_thread_t *)thread_id)->user_area) : NULL;

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÉêÇëÏ߳̽ṹÌå

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Ï߳̽ṹÌåÖ¸Õë

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static linux_thread_t *linux_thread_alloc(void)

+{

+    unsigned long flags;

+    linux_thread_t *thread;

+

+    thread = (linux_thread_t *)kmalloc(sizeof(linux_thread_t), GFP_ATOMIC);

+    zOss_AssertEx(thread != NULL, NULL);

+

+    INIT_LIST_HEAD(&thread->msg_queue.head);

+    raw_spin_lock_init(&thread->msg_queue.lock);

+

+#ifdef LINUX_THREAD_MSG_STAT

+    thread->msg_queue.count        = 0x00;

+    thread->msg_queue.send_time    = 0x00;

+    thread->msg_queue.recv_time    = 0x00;

+#endif

+

+#if (LINUX_THREAD_MSG == LINUX_THREAD_MSG_COMPLETION)

+    init_completion(&thread->msg_queue.completion);

+#elif (LINUX_THREAD_MSG == LINUX_THREAD_MSG_SEMAPHORE)

+    sema_init(&thread->msg_queue.semaphore, 0);

+#endif

+

+    raw_spin_lock_irqsave(&linux_thread_spin_lock, flags);

+    list_add_tail(&thread->all_node, &linux_thread_all_head);

+    raw_spin_unlock_irqrestore(&linux_thread_spin_lock, flags);

+

+    Osa_create_handler((void *)thread, (void *)(&thread->user_area));

+

+    return thread;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÊÍ·ÅÏ߳̽ṹÌå

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread: Ï߳̽ṹÌåÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void linux_thread_free(linux_thread_t *thread)

+{

+    unsigned long flags;

+

+    raw_spin_lock_irqsave(&linux_thread_spin_lock, flags);

+    list_del(&thread->all_node);

+    raw_spin_unlock_irqrestore(&linux_thread_spin_lock, flags);

+

+    kfree((void *)thread);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³ÌÇÐÈë¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  event:  ʼþ½á¹¹ÌåÖ¸Õë

+                flags:  ±ê־λ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void linux_thread_swapin(struct perf_event *event, int flags)

+{

+#if 0

+    struct task_struct *task = event->ctx->task;

+

+	event->hw.state = 0;

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³ÌÇгö¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  event:  ʼþ½á¹¹ÌåÖ¸Õë

+                flags:  ±ê־λ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void linux_thread_swapout(struct perf_event *event, int flags)

+{

+#if 0

+    struct task_struct *task = event->ctx->task;

+

+	event->hw.state = PERF_HES_STOPPED;

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     µ÷¶È״̬±È½Ïº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  obj1:   ¶ÔÏó1Ö¸Õë

+                obj2:   ¶ÔÏó2Ö¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     µ÷¶È״̬±È½Ï½á¹û:

+                    ret >  0£¬±íʾobj1 > obj2

+                    ret == 0£¬±íʾobj1 == obj2

+                    ret <  0£¬±íʾobj1 < obj2

+* ÆäËü˵Ã÷:     ÓÃÓÚsortÅÅÐò±È½Ï²Ù×÷

+*******************************************************************************/

+static inline int linux_thread_sched_stat_cmp(const void *obj1, const void *obj2)

+{

+    u64 time1 = ((linux_thread_sched_stat_t *)obj1)->keyval;

+    u64 time2 = ((linux_thread_sched_stat_t *)obj2)->keyval;

+

+    if (time1 < time2)

+        return 1;

+    else if (time1 == time2)

+        return 0;

+    else

+        return -1;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     µ÷¶È״̬½»»»º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  obj1:   ¶ÔÏó1Ö¸Õë

+                obj2:   ¶ÔÏó2Ö¸Õë

+                size:   ¶ÔÏó´óС

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ÓÃÓÚsortÅÅÐò½»»»²Ù×÷

+*******************************************************************************/

+static inline void linux_thread_sched_stat_swap(void *obj1, void *obj2, int size)

+{

+    linux_thread_sched_stat_t sched_stat;

+

+    sched_stat = *(linux_thread_sched_stat_t *)obj1;

+    *(linux_thread_sched_stat_t *)obj1 = *(linux_thread_sched_stat_t *)obj2;

+    *(linux_thread_sched_stat_t *)obj2 = sched_stat;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ³õʼ»¯Ï̵߳ÄÓû§¿Õ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ý³õʼ»¯Óû§Êý¾Ý¿Õ¼äµÄÏß³Ì

+                user_area:  Ïß³ÌÓû§Êý¾ÝÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void zOss_InitThreadUserArea(ZOSS_THREAD_ID thread_id, T_ZOsa_ThreadUserArea *user_area)

+{

+    linux_thread_t *thread;

+

+    zOss_AssertExN(thread_id != NULL && user_area != NULL);

+

+    thread = linux_thread_is_valid(thread_id);

+    zOss_AssertExN(thread != NULL);

+

+    user_area->stacksize    = (UINT32)THREAD_SIZE;

+    user_area->heapsize     = 0xFFFFFFFF;

+    user_area->threadid     = (ZOSS_THREAD_ID)thread;

+    user_area->ubsize       = 0;

+    user_area->ptrf         = 0;

+    user_area->runcount     = 0;

+    user_area->curtaskid    = 0;

+    user_area->cpupercent   = 0;

+    user_area->runtime      = 0;

+    user_area->cputime      = 0;

+    user_area->RunTimeInMs  = 0;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ï̴߳´½¨Ê±µÄÖ§³Å²ã¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     Ïß³ÌÖ¸Õë

+                user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void Osa_create_handler(void *thread, void *user_area)

+{

+    zOss_AssertExN(thread != NULL && user_area != NULL);

+

+    if (gOsa_SysCpuFreq == 0x00) 

+    {

+        gOsa_SwapFlag       = TRUE;

+        gOsa_SwapLastTime   = Osa_HwTimeRead();

+#if defined (_USE_PSM) && defined (_USE_CPU_DFM)

+        zOss_RecordPsmLastSwapTime();

+#endif

+        gOsa_SysCpuFreq     = 0x00;

+    }

+

+    zOss_InitThreadUserArea((ZOSS_THREAD_ID)thread, (T_ZOsa_ThreadUserArea *)user_area);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³Ìɾ³ýʱµÄÖ§³Å²ã¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     Ïß³ÌÖ¸Õë

+                user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void Osa_kill_handler(void *thread, void *user_area)

+{

+    zOss_AssertExN(thread != NULL);

+    if (thread == NULL || user_area == NULL)

+        return;

+}

+

+#ifdef CONFIG_ACCURATE_CPU_PERCENT

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³ÌÇÐÈëʱµÄÖ§³Å²ã¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     Ïß³ÌÖ¸Õë

+                user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void Osa_swapin_handler(void *thread)

+{

+    struct task_struct *task = (struct task_struct *)thread;

+    zOss_AssertExN(thread != NULL);

+

+#ifdef OSS_TRACE_THREAD    

+    oss_trace_thread_swapin(thread);

+    oss_trace_func_swapin(thread);

+#endif

+

+#if defined (_USE_PSM) && defined (_USE_CPU_DFM)

+    //zOss_ThreadSwapInPsmHook((T_ZOsa_ThreadUserArea *)user_area);

+#endif

+    

+    if (gOsa_SwapTimeFlag) 

+    {

+        UINT32 past_time;

+        UINT32 current_time;

+

+        current_time        = Osa_HwTimeRead();

+        past_time           = current_time - gOsa_SwapLastTime;

+        gOsa_SwapLastTime   = current_time;

+        task->ac_rtime     += past_time;

+    }

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³ÌÇгöʱµÄÖ§³Å²ã¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     Ïß³ÌÖ¸Õë

+                user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void Osa_swapout_handler(void *thread)

+{

+    struct task_struct *task = (struct task_struct *)thread;

+    zOss_AssertExN(thread != NULL);

+

+#ifdef OSS_TRACE_THREAD

+    oss_trace_thread_swapout(thread);

+    oss_trace_func_swapout(thread);

+#endif    

+

+#if defined (_USE_PSM) && defined (_USE_CPU_DFM)

+    //zOss_ThreadSwapOutPsmHook((T_ZOsa_ThreadUserArea *)user_area);

+#endif

+    

+    if (gOsa_SwapTimeFlag)

+    {

+        UINT32 past_time;

+        UINT32 current_time;

+

+        current_time        = Osa_HwTimeRead();

+        past_time           = current_time - gOsa_SwapLastTime;

+        gOsa_SwapLastTime   = current_time;

+        task->ac_rtime     += past_time;

+    }

+}

+

+#else

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³ÌÇÐÈëʱµÄÖ§³Å²ã¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     Ïß³ÌÖ¸Õë

+                user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void Osa_swapin_handler(void *thread, void *user_area)

+{

+    zOss_AssertExN(thread != NULL && user_area != NULL);

+

+#ifdef OSS_TRACE_THREAD    

+    oss_trace_thread_swapin(thread);

+    oss_trace_func_swapin(thread);

+#endif

+

+#if defined (_USE_PSM) && defined (_USE_CPU_DFM)

+    zOss_ThreadSwapInPsmHook((T_ZOsa_ThreadUserArea *)user_area);

+#endif

+    

+    if (gOsa_SwapTimeFlag) 

+    {

+        UINT32 past_time;

+        UINT32 current_time;

+        T_ZOsa_ThreadUserArea *ua = (T_ZOsa_ThreadUserArea *)user_area;

+

+        current_time        = Osa_HwTimeRead();

+        past_time           = current_time - gOsa_SwapLastTime;

+        gOsa_SwapLastTime   = current_time;

+        ua->runcount++;

+        ua->cputime += past_time;

+        ua->runtime += past_time;

+        

+        if (ua->curtaskid != NULL) 

+        {

+            T_ZOss_TCB *tcb = (T_ZOss_TCB *)(ua->curtaskid);

+            

+            tcb->cputime    += past_time;

+            tcb->runtime    += past_time;

+            tcb->task_time  = current_time;

+        }

+    }

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³ÌÇгöʱµÄÖ§³Å²ã¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     Ïß³ÌÖ¸Õë

+                user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void Osa_swapout_handler(void *thread, void *user_area)

+{

+    zOss_AssertExN(thread != NULL && user_area != NULL);

+

+#ifdef OSS_TRACE_THREAD

+    oss_trace_thread_swapout(thread);

+    oss_trace_func_swapout(thread);

+#endif    

+

+#if defined (_USE_PSM) && defined (_USE_CPU_DFM)

+    zOss_ThreadSwapOutPsmHook((T_ZOsa_ThreadUserArea *)user_area);

+#endif

+    

+    if (gOsa_SwapTimeFlag)

+    {

+        UINT32 past_time;

+        UINT32 current_time;

+        T_ZOsa_ThreadUserArea *ua = (T_ZOsa_ThreadUserArea *)user_area;

+

+        current_time        = Osa_HwTimeRead();

+        past_time           = current_time - gOsa_SwapLastTime;

+        gOsa_SwapLastTime   = current_time;

+        ua->cputime += past_time;

+        ua->runtime += past_time;

+        

+        if (ua->curtaskid != NULL)

+        {

+            T_ZOss_TCB *tcb = (T_ZOss_TCB *)(ua->curtaskid);

+

+            past_time       = current_time - tcb->task_time;

+            tcb->cputime    += past_time;

+            tcb->runtime    += past_time;

+        }

+    }

+}

+#endif

+

+#endif

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     linuxÖ§³Å²ãͳ¼Æ»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  idle_time:  Ö¸¶¨Ê±¼ä¶ÎÄÚϵͳ¿ÕÏÐʱ¼ä

+                total_time: Ö¸¶¨Ê±¼ä¶ÎÄÚϵͳ×Üʱ¼ä

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void linux_stat_osa_callback(u32 idle_time, u32 total_time)

+{

+    printf("system idle time:%-10u\n", idle_time);

+    printf("system total time:%-10u\n", total_time);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼ÆËãÏß³ÌÕ»¿Õ¼äµÄʹÓÃÂÊ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ï̵߳Äid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Ïß³ÌÕ»¿Õ¼äµÄʹÓÃÂÊ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static UINT8 zOss_GetThreadStackUsed( ZOSS_THREAD_ID thread_id)

+{

+    struct task_struct *task;

+    unsigned long stack_pointer, stack_base;

+

+    task            = ((linux_thread_t *)thread_id)->task;

+    stack_pointer   = thread_saved_sp(task);

+    stack_base      = (unsigned long)task->stack;

+

+    return (UINT8)(100 - (((stack_pointer - stack_base)/THREAD_SIZE)*100));

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸üÐÂϵͳÖÐËùÓÐÏ̵߳ÄCPUÕ¼ÓÃÂÊ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+#ifdef CONFIG_ACCURATE_CPU_PERCENT

+static void Osa_UpdateThreadCpu(void)

+{

+    UINT32 run_time;

+    unsigned long flags;

+    struct task_struct *task;

+    T_ZOsa_ThreadUserArea *user_area;

+

+    run_time = Osa_HwTimeRead() - gOsa_CpuStartTime;

+    for_each_processex(task) {

+        task->ac_cpupercent = (FLOAT)((task->ac_rtime)*100) / run_time;

+        task->ac_rtime    = 0;

+    }

+}

+#else

+static void Osa_UpdateThreadCpu(void)

+{

+    UINT32 run_time;

+    unsigned long flags;

+    linux_thread_t *thread;

+    T_ZOsa_ThreadUserArea *user_area;

+

+    run_time = Osa_HwTimeRead() - gOsa_CpuStartTime;

+    raw_spin_lock_irqsave(&linux_thread_spin_lock, flags);

+    list_for_each_entry(thread, &linux_thread_all_head, all_node) {

+        user_area = thread->user_area;

+        zOss_ASSERT(user_area != NULL);

+        if (user_area == NULL)

+            break;

+

+        user_area->cpupercent = (FLOAT)((user_area->cputime)*100) / run_time;

+        user_area->cputime    = 0;

+    }

+    raw_spin_unlock_irqrestore(&linux_thread_spin_lock, flags);

+}

+#endif

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸üÐÂϵͳÖÐËùÓÐÈÎÎñµÄCPUÕ¼ÓÃÂÊ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void Osa_UpdateTaskCpu(void)

+{

+    UINT32      cnt         = 0;

+    UINT32      tcb_no      = 0;

+    T_ZOss_TCB  *tcb        = NULL;

+    UINT32      run_time    = 0;

+    

+    zOss_AssertExN(gOsa_AllTaskIdArray != NULL);

+

+    run_time = Osa_HwTimeRead() - gOsa_CpuStartTime;

+    tcb_no = zOss_GetAllTaskID(gOsa_AllTaskIdArray);

+    for (cnt = 0x00; cnt < tcb_no; cnt++)

+    {

+        tcb = (T_ZOss_TCB *)gOsa_AllTaskIdArray[cnt];

+        if (tcb->task_id != tcb)

+        {    

+            continue;

+        }

+        tcb->cpupercent = (FLOAT)((tcb->cputime)*100) / run_time;

+        tcb->cputime = 0;

+    }

+}

+

+#ifdef _USE_MESSAGE

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾ÝÏß³Ìid£¬´ÓÏß³ÌÏûÏ¢¹³×ÓÁ´±íÖвéÕÒÆ¥ÅäµÄ½Úµã

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ïß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ²éÕҳɹ¦£¬·µ»ØÆ¥ÅäµÄ½Úµã£¬·ñÔò·µ»ØNULL

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static THREAD_MSG_HOOK_CONTENT* find_thread_content(ZOSS_THREAD_ID thread_id)

+{

+    THREAD_MSG_HOOK_CONTENT *msg_hook = (THREAD_MSG_HOOK_CONTENT *)zOss_ListFirst(&s_thread_msg_hook_list);

+

+    while (msg_hook) 

+    {

+        if (msg_hook->thread_id == thread_id)

+        {

+            break;

+        }

+        

+        msg_hook = (THREAD_MSG_HOOK_CONTENT *)zOss_ListNext((T_ZOss_Node *)msg_hook);

+    }

+

+    return msg_hook;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ÏûÏ¢½Ó¿Ú·¢ËÍÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  msg_head:  ÏûÏ¢ÐÅÏ¢´æ·ÅµØÖ·

+*               thread_id: Ä¿±êÏ̵߳ÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static inline void zOss_GetSendMsgInfo(thread_msg_t *msg_head, ZOSS_THREAD_ID thread_id)

+{

+#if defined (OSS_TRACE_THREAD) && defined(_USE_MONITOR)

+    if (gOsa_MonitorFlag)

+    {

+        ZOSS_INTR   old_intr    = 0;

+        UINT32      cnt         = 0;

+        

+        ZOSS_SAVE_IRQ(old_intr);

+        cnt = gOsa_MsgInfo.num;

+        gOsa_MsgInfo.ele[cnt].msgId     = 0x00;

+        gOsa_MsgInfo.ele[cnt].ptr       = (UINT32)msg_head->msg_ptr;

+        gOsa_MsgInfo.ele[cnt].size      = msg_head->msg_size;

+        gOsa_MsgInfo.ele[cnt].receiver  = zOss_GetThreadName(thread_id, NULL);

+#ifdef _OS_TOS

+        gOsa_MsgInfo.ele[cnt].sender    = zOss_GetThreadName((ZOSS_THREAD_ID)cyg_thread_self(), NULL);

+#elif defined (_OS_LINUX)

+        gOsa_MsgInfo.ele[cnt].sender    = zOss_GetThreadName((ZOSS_THREAD_ID)linux_thread_current(), NULL);

+#endif

+        gOsa_MsgInfo.ele[cnt].timestamp = Osa_HwTimeRead();

+        if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+        {

+            cnt = 0;

+        }

+        gOsa_MsgInfo.num = cnt;

+        ZOSS_RESTORE_IRQ(old_intr);

+    }

+#endif 

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ÏûÏ¢½Ó¿Ú½ÓÊÜÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  msg_head:  ÏûÏ¢ÐÅÏ¢´æ·ÅµØÖ·

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static inline void zOss_GetRecvMsgInfo(thread_msg_t *msg_head)

+{

+#ifdef _USE_MONITOR

+    if (gOsa_MonitorFlag)

+    {

+        ZOSS_INTR   old_intr    = 0;

+        UINT32      cnt         = 0;

+

+        ZOSS_SAVE_IRQ(old_intr);

+        cnt = gOsa_MsgInfo.num;

+        gOsa_MsgInfo.ele[cnt].msgId     = 0x00;

+        gOsa_MsgInfo.ele[cnt].ptr       = (UINT32)msg_head->msg_ptr;

+        gOsa_MsgInfo.ele[cnt].size      = msg_head->msg_size;

+#ifdef _OS_TOS

+        gOsa_MsgInfo.ele[cnt].receiver  = zOss_GetThreadName((ZOSS_THREAD_ID)cyg_thread_self(), NULL);

+#elif defined (_OS_LINUX)

+        gOsa_MsgInfo.ele[cnt].receiver  = zOss_GetThreadName((ZOSS_THREAD_ID)linux_thread_current(), NULL);

+#endif

+        gOsa_MsgInfo.ele[cnt].sender    = "unknown";

+        gOsa_MsgInfo.ele[cnt].timestamp = Osa_HwTimeRead();

+        if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+        {

+            cnt = 0;

+        }

+        gOsa_MsgInfo.num = cnt;

+        ZOSS_RESTORE_IRQ(old_intr);

+    }

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡Ïß³ÌÏûÏ¢½Ó¿Ú·¢ËÍÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  msg_id:           ÏûÏ¢id

+*               thread_msg_head:  ÏûÏ¢ÐÅÏ¢´æ·ÅµØÖ·

+*               thread_id:        Ä¿±êÏ̵߳ÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static inline void zOss_GetThreadSendMsgInfo(

+                            UINT32 msg_id, 

+                            T_THREAD_MSG_HEAD *thread_msg_head,

+                            ZOSS_THREAD_ID thread_id)

+{

+#ifdef _USE_MONITOR

+        if (gOsa_MonitorFlag)

+        {

+            ZOSS_INTR   old_intr    = 0;

+            UINT32      cnt         = 0;

+

+            ZOSS_SAVE_IRQ(old_intr);

+            cnt = gOsa_MsgInfo.num;

+            gOsa_MsgInfo.ele[cnt].msgId     = msg_id;

+            gOsa_MsgInfo.ele[cnt].ptr       = (UINT32)thread_msg_head;

+            gOsa_MsgInfo.ele[cnt].size      = thread_msg_head->buf_size;

+            gOsa_MsgInfo.ele[cnt].receiver  = zOss_GetThreadName(thread_id, NULL);

+#ifdef _OS_TOS

+            gOsa_MsgInfo.ele[cnt].sender    = zOss_GetThreadName((ZOSS_THREAD_ID)cyg_thread_self(), NULL);

+#elif defined (_OS_LINUX)

+        gOsa_MsgInfo.ele[cnt].receiver  = zOss_GetThreadName((ZOSS_THREAD_ID)linux_thread_current(), NULL);

+#endif

+            gOsa_MsgInfo.ele[cnt].timestamp = Osa_HwTimeRead();

+            if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+            {

+                cnt = 0;

+            }

+            gOsa_MsgInfo.num = cnt;

+            ZOSS_RESTORE_IRQ(old_intr);

+        }

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡Ïß³ÌÏûÏ¢½Ó¿Ú½ÓÊÜÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_msg_head:  ÏûÏ¢ÐÅÏ¢´æ·ÅµØÖ·               

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static inline void zOss_GetThreadRecvMsgInfo(T_THREAD_MSG_HEAD *thread_msg_head)                       

+{

+#ifdef _USE_MONITOR

+    if (gOsa_MonitorFlag)

+    {

+        ZOSS_INTR   old_intr    = 0;

+        UINT32      cnt         = 0;

+

+        ZOSS_SAVE_IRQ(old_intr);

+        cnt = gOsa_MsgInfo.num; 

+        gOsa_MsgInfo.ele[cnt].msgId     = thread_msg_head->id;

+        gOsa_MsgInfo.ele[cnt].ptr       = (UINT32)thread_msg_head;

+        gOsa_MsgInfo.ele[cnt].size      = thread_msg_head->buf_size;

+#ifdef _OS_TOS

+        gOsa_MsgInfo.ele[cnt].receiver  = zOss_GetThreadName((ZOSS_THREAD_ID)cyg_thread_self(), NULL);

+#elif defined (_OS_LINUX)

+        gOsa_MsgInfo.ele[cnt].receiver  = zOss_GetThreadName((ZOSS_THREAD_ID)linux_thread_current(), NULL);

+#endif

+        gOsa_MsgInfo.ele[cnt].sender    = "unknown";

+        gOsa_MsgInfo.ele[cnt].timestamp = Osa_HwTimeRead();

+        if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+        {

+            cnt = 0;

+        }

+        gOsa_MsgInfo.num = cnt;

+        ZOSS_RESTORE_IRQ(old_intr);

+    }

+#endif

+}

+

+#endif  // #ifdef _USE_MESSAGE

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+#ifdef _USE_THREAD

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄÏ̴߳´½¨º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ¼ûÁбí

+*   (´«³ö²ÎÊý)  ¼ûÁбí

+* ·µ »Ø Öµ:     ÒÑ´´½¨µÄÏ߳̾ä±ú

+* ÆäËü˵Ã÷:     ÈôÏ̴߳´½¨Ê§°Ü£¬ÏµÍ³¶ÏÑÔ

+*******************************************************************************/

+ZOSS_THREAD_ID zOss_CreateThread(

+                    const CHAR *thread_name,    /* name                 */

+                    VOID (*entry)(SINT32),      /* entry                */

+                    SINT32 arg,                 /* arguments pointer    */

+                    UINT32 stack_size,          /* stack size           */

+                    UINT32 priority,            /* priority             */

+                    UINT32 preempt,             /* useless              */

+                    UINT32 auto_start)          /* auto start           */

+{

+    int ret;

+    struct task_struct *task;

+    struct sched_param param;

+    linux_thread_t *thread;

+    linux_create_thread_t *create_thread;

+    static bool first_thread = true;

+

+    if (first_thread) {

+        param.sched_priority = MAX_USER_RT_PRIO - 2;

+        ret = sched_setscheduler(kthreadd_task, SCHED_FIFO, &param);

+        zOss_AssertEx(ret == 0x00, NULL);

+

+        ret = profile_event_register(PROFILE_TASK_EXIT, &profile_nb);

+        zOss_AssertEx(ret == 0x00, NULL);

+

+#if 0

+        ret = perf_pmu_register(&thread_pmu, "thread_pmu", PERF_TYPE_TRACEPOINT);

+        zOss_AssertEx(ret == 0x00, NULL);

+        if (ret != 0x00) {

+            ret = profile_event_unregister(PROFILE_TASK_EXIT, &profile_nb);

+            return NULL;

+        }

+#endif

+

+        first_thread = false;

+    }

+

+    create_thread = (linux_create_thread_t *)kmalloc(sizeof(linux_create_thread_t), GFP_ATOMIC);

+    zOss_AssertEx(create_thread != NULL, NULL);

+

+    thread = linux_thread_alloc();

+    if (thread == NULL) {

+        kfree((void *)create_thread);

+        zOss_ASSERT(0);

+        return NULL;

+    }

+    strncpy(thread->user_area.threadname, thread_name, MAX_THREADNAME_LEN);

+

+    create_thread->entry    = entry;

+    create_thread->arg       = arg;

+    create_thread->thread   = thread;

+

+#ifdef CONFIG_STACK_SIZE

+    if(stack_size >= 8192)

+        create_thread =(void *)((unsigned long)create_thread + 1);

+      	

+#endif

+    task = kthread_create(linux_thread_entry,

+                        (void *)create_thread,

+                        thread_name);

+

+    task->zoss_thread = thread;

+    thread->task = task;

+

+    if (preempt == ZOSS_PREEMPT_IRQ_THREAD)

+        priority = oss_max(priority, 1);

+    else

+        priority += LINUX_IRQ_THREAD_PRIORITY;

+    param.sched_priority = oss_min(priority, MAX_USER_RT_PRIO - 1);

+    param.sched_priority = MAX_USER_RT_PRIO - 1 - param.sched_priority;

+    sched_setscheduler(task, SCHED_FIFO, &param);

+

+    if (auto_start)

+        wake_up_process(task);

+

+    return (ZOSS_THREAD_ID)thread;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄÏß³ÌÍ˳öº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+VOID zOss_ExitThread(VOID)

+{

+    do_exit(0x00);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄÏß³Ì¹ÒÆðº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ðè±»¹ÒÆðµÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     ±¾º¯Êý¿ÉÒÔÓÃÓÚÏ̵߳Ä×ÔÎÒ¹ÒÆð

+*******************************************************************************/

+UINT32 zOss_SuspendThread(ZOSS_THREAD_ID thread_id)

+{

+    linux_thread_t *thread;

+

+    thread = linux_thread_is_valid(thread_id);

+    zOss_AssertEx(thread != NULL, ZOSS_ERROR);

+

+    set_task_state(thread->task, TASK_KILLABLE);

+    if (thread->task == current) {

+        schedule();

+

+        if (fatal_signal_pending(current))

+            do_exit(SIGKILL);

+    }

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄÏָ̻߳´º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ðè±»»Ö¸´µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     ±¾º¯ÊýÖ»ÊÇʹÏ߳̽øÈë¾ÍÐ÷̬£¬ÈôÓиßÓÅÏȼ¶µÄÏß³ÌÔÚÖ´Ðлò´¦ÓÚ¾ÍÐ÷̬

+                £¬±¾Ïß³ÌÈÔÐèµÈ´ý.

+*******************************************************************************/

+UINT32 zOss_ResumeThread(ZOSS_THREAD_ID thread_id)

+{

+    linux_thread_t *thread;

+

+    thread = linux_thread_is_valid(thread_id);

+    zOss_AssertEx(thread != NULL, ZOSS_ERROR);

+

+    wake_up_process(thread->task);

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄÏß³Ì˯Ãߺ¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  time_in_ms:     Ï߳̽«ÒªË¯ÃßµÄʱ¼ä£¬µ¥Î»: ms

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ϵͳʱÖӵįµÂÊÉÐδÑéÖ¤£¬ÑÓ³Ùʱ¼ä²»×¼È·

+*******************************************************************************/

+__tcm_func VOID zOss_Sleep(UINT32 time_in_ms)

+{

+    signed long timeout = msecs_to_jiffies(time_in_ms);

+

+    while (timeout) {

+        timeout = schedule_timeout_killable(timeout);

+        if (fatal_signal_pending(current))

+            do_exit(SIGKILL);

+    }

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄÏß³Ìɾ³ýº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ½«±»É¾³ýµÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_DeleteThread(ZOSS_THREAD_ID thread_id)

+{

+    linux_thread_t *thread;

+    struct task_struct *task;

+    struct completion *vfork_done;

+

+    thread = linux_thread_is_valid(thread_id);

+    zOss_AssertEx(thread != NULL, ZOSS_ERROR);

+

+    task = thread->task;

+    get_task_struct(task);

+    barrier();

+    vfork_done = task->vfork_done;

+    force_sig(SIGKILL, task);

+    wake_up_process(task);

+    if (vfork_done)

+        wait_for_completion(vfork_done);

+    put_task_struct(task);

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄ»ñÈ¡µ±Ç°Ïß³ÌidµÄº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     µ±Ç°Ö´ÐÐÏ̵߳ÄÏß³Ìid

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+__tcm_func ZOSS_THREAD_ID zOss_GetCurThreadID(VOID)

+{

+    return (ZOSS_THREAD_ID)linux_thread_current();

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³ÌÃû³Æ£¬²éÕÒ¸ÃÏ̵߳ÄÏß³Ìid

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_name:    Ïß³ÌÃû³Æ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô²éÕҳɹ¦£¬·µ»ØÏ̵߳ÄÓÐЧÏß³Ìid£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+ZOSS_THREAD_ID zOss_GetThreadIDByName (const CHAR *thread_name)

+{

+    return (ZOSS_THREAD_ID)linux_thread_get_thread_by_name(thread_name);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³Ìid£¬»ñÈ¡¸ÃÏ̵߳ÄÏß³ÌÃû³Æ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:      ´ý»ñÈ¡Ïß³ÌÃû³ÆµÄÏß³Ìid

+*   (´«³ö²ÎÊý)  thread_name:    Ïß³ÌÃû³Æ´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØÏß³ÌÃû³ÆÖ¸Õ룻·ñÔòϵͳ¶ÏÑÔ»ò·µ»Ø¿ÕÖ¸Õë

+* ÆäËü˵Ã÷:     Èôthread_name·Ç¿Õ£¬±íʾÐèÒª½«²Ù×÷ϵͳÌṩµÄÏß³ÌÃû³Æ¿½±´µ½¸Ã

+                ÄÚ´æµØÖ·£¬·ñÔòÎÞÐ追±´£¬Ö»Ðè·µ»ØÏß³ÌÃû³ÆÖ¸Õë

+*******************************************************************************/

+CHAR *zOss_GetThreadName(ZOSS_THREAD_ID thread_id, CHAR *thread_name)

+{

+    linux_thread_t *thread;

+

+    thread = linux_thread_is_valid(thread_id);

+    zOss_AssertEx(thread != NULL, NULL);

+

+    if (thread_name)

+        strcpy((char *)thread_name, thread->user_area.threadname);

+

+    return (CHAR *)thread->user_area.threadname;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³Ìid£¬»ñÈ¡¸ÃÏ̵߳ÄÏß³ÌÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ý»ñÈ¡Ïß³ÌÐÅÏ¢µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  ¼ûÁбí

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_GetThreadInfo(ZOSS_THREAD_ID thread_id,   /* id       */

+                          CHAR *thread_name,          /* Ãû³Æ     */

+                          UINT32 *stat,               /* ״̬     */

+                          UINT32 *priority,           /* ÓÅÏȼ¶   */

+                          UINT32 *preempt)            /* ¿ÉÇÀÕ¼   */

+{

+    linux_thread_t *thread;

+

+    thread = linux_thread_is_valid(thread_id);

+    zOss_AssertEx(thread != NULL, ZOSS_ERROR);

+

+    if (thread_name)

+        strcpy(thread_name, thread->user_area.threadname);

+

+    if (stat)

+        *stat = thread->task->state;

+

+    if (priority)

+        *priority = thread->task->prio;

+

+    if (preempt)

+        *preempt = 1;

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡µ±Ç°ËùÓÐÏ̵߳ÄÏà¹ØÐÅÏ¢(¼à¿ØÄ£¿é)

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void              

+*   (´«³ö²ÎÊý)  pMonThreadInfo: Ïß³ÌÐÅÏ¢´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ´Ëº¯ÊýÉêÇëµÄÄÚ´æ¿Õ¼ä£¬±ØÐëÓÉʹÓÃÕßÊÍ·Å£¬·ñÔò»áÔì³ÉÄÚ´æÐ¹Â¶¡£

+*******************************************************************************/

+VOID z0ss_GetAllThreadInfo(T_ZOss_Mon_Thread *pMonThreadInfo)

+{

+#ifdef _USE_MONITOR

+

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³Ìid£¬ÉèÖøÃÏ̵߳ÄÏß³ÌÓÅÏȼ¶

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ýÉèÖÃÓÅÏȼ¶µÄÏß³Ìid

+                priority:   Ï߳̽«±»ÉèÖõÄÓÅÏȼ¶

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_SetThreadPri(ZOSS_THREAD_ID thread_id, UINT32 priority)

+{

+    linux_thread_t *thread;

+    struct sched_param param;

+

+    thread = linux_thread_is_valid(thread_id);

+    zOss_AssertEx(thread != NULL, ZOSS_ERROR);

+

+    priority += LINUX_IRQ_THREAD_PRIORITY;

+    param.sched_priority = oss_min(priority, MAX_USER_RT_PRIO - 1);

+    param.sched_priority = MAX_USER_RT_PRIO - 1 - param.sched_priority;

+    sched_setscheduler(thread->task, SCHED_FIFO, &param);

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³Ìid£¬ÉèÖøÃÏ̵߳ÄÏß³ÌÓÅÏȼ¶

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ýÉèÖÃÓÅÏȼ¶µÄÏß³Ìid

+                priority:   Ï߳̽«±»ÉèÖõÄÓÅÏȼ¶

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+extern struct task_struct *find_task_by_vpid(pid_t vnr);

+UINT32 zOss_SetProcessPri(VOID *thread_id, UINT32 priority)

+{

+    struct task_struct *thread;

+    struct sched_param param;

+

+    thread = find_task_by_vpid((pid_t)thread_id);

+    if (thread == NULL){

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong pid!");

+        return ZOSS_ERROR;

+    }

+    else if (thread->mm != NULL)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tcan`t set user process,use nice instead!");

+        return ZOSS_ERROR;

+    }

+

+    param.sched_priority = priority;

+    sched_setscheduler(thread, SCHED_FIFO, &param);

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³Ìid£¬»ñÈ¡¸ÃÏ̵߳ÄÏß³ÌÓÅÏȼ¶

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ý»ñÈ¡ÓÅÏȼ¶µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  priority:   »ñÈ¡µÄÏß³ÌÓÅÏȼ¶´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_GetProcessPri(VOID *thread_id, UINT32 *priority)

+{

+    struct task_struct *thread;

+

+    zOss_AssertEx(priority != NULL, ZOSS_ERROR);

+

+    thread = find_task_by_vpid((pid_t)thread_id);

+    if (thread == NULL)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong pid!");

+        return ZOSS_ERROR;

+    }

+

+    *priority = thread->rt_priority;

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³Ìid£¬»ñÈ¡¸ÃÏ̵߳ÄÏß³ÌÓÅÏȼ¶

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ý»ñÈ¡ÓÅÏȼ¶µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  priority:   »ñÈ¡µÄÏß³ÌÓÅÏȼ¶´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_GetThreadPri(ZOSS_THREAD_ID thread_id, UINT32 *priority)

+{

+    linux_thread_t *thread;

+

+    zOss_AssertEx(priority != NULL, ZOSS_ERROR);

+

+    thread = linux_thread_is_valid(thread_id);

+    zOss_AssertEx(thread != NULL, ZOSS_ERROR);

+

+    *priority = thread->task->prio;

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡Ïß³ÌÓû§Êý¾Ý¿Õ¼äµÄÖ¸Õë

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ý»ñÈ¡Óû§Êý¾Ý¿Õ¼äÖ¸ÕëµÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Ï̵߳ÄÓû§Êý¾Ý¿Õ¼äµÄÖ¸Õë

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+T_ZOsa_ThreadUserArea *zOss_GetThreadUserArea(ZOSS_THREAD_ID thread_id)

+{

+    return linux_thread_get_user_area(thread_id);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÑéÖ¤Ò»¸öÏß³ÌÊÇ·ñÓÐЧ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ýÑéÖ¤µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÈôÏß³ÌÓÐЧ£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_IdentifyThread(ZOSS_THREAD_ID threadID)

+{

+    if (linux_thread_is_valid(threadID))

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³Ìid£¬ÉèÖøÃÏ̵߳ÄÏ̵߳ÄʵʱÓÅÏȼ¶£¬½ö¹©L1GʹÓÃ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ýÉèÖÃÓÅÏȼ¶µÄÏß³Ìid

+                priority:   Ï߳̽«±»ÉèÖõÄʵʱÓÅÏȼ¶

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_SetThreadRtPri(ZOSS_THREAD_ID thread_id, UINT32 priority)

+{

+    linux_thread_t *thread;

+    struct sched_param param;

+

+    thread = linux_thread_is_valid(thread_id);

+    zOss_AssertEx(thread != NULL, ZOSS_ERROR);

+

+    param.sched_priority = oss_min(priority, MAX_USER_RT_PRIO - 1);

+    sched_setscheduler(thread->task, SCHED_FIFO, &param);

+

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef _USE_MESSAGE

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÏòÖ¸¶¨µÄÏ̷߳¢ËÍÏûÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ä¿±êÏ̵߳ÄÏß³Ìid

+                msg_ptr:    ÏûÏ¢Êý¾ÝµÄÖ¸Õë

+                size:       ÏûÏ¢µÄ´óС£¬ÎÞЧ²ÎÊý

+                time_out:   ·¢ËÍÏûÏ¢µÄ³¬Ê±Ê±¼ä

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     Èô²ÎÊýtimeoutÊÇZOSS_WAIT_FOREVER£¬ÔòÒ»Ö±µÈ´ýÏûÏ¢·¢Ëͳɹ¦ÔÙ·µ»Ø£»

+                Èô²ÎÊýtimeoutÊÇZOSS_NO_WAIT£¬Ôò³¢ÊÔ·¢ËÍÏûÏ¢£¬·¢ËÍʧ°Ü£¬Ö±½Ó·µ»Ø£»

+                ·ñÔòtimeoutÊdz¬Ê±µÄʱ¼ä£¬¼ÆËã·½·¨Êǽ«µ±Ç°ÏµÍ³Ê±¼äºÍtimeoutÏà¼Ó£¬

+                ³ÉΪabs_timeout,È»ºóÆô¶¯Ò»¸ö¶¨Ê±Æ÷£¬Ö±ÖÁÏûÏ¢·¢Ëͳɹ¦»ò³¬Ê±

+*******************************************************************************/

+__tcm_func UINT32 zOss_SendMsg(ZOSS_THREAD_ID thread_id, VOID *msg_ptr, UINT32 size, UINT32 timeout)

+{

+    unsigned long flags;

+    linux_thread_t *thread;

+    linux_msg_queue_t *msg_queue;

+    linux_msg_queue_node_t *msg_queue_node;

+

+    zOss_AssertEx(msg_ptr != NULL, ZOSS_ERROR);

+

+    thread = linux_thread_is_valid(thread_id);

+    zOss_AssertEx(thread != NULL, ZOSS_ERROR);

+

+    msg_queue_node = (linux_msg_queue_node_t *)LINUX_THREAD_MSG_ALLOC(sizeof(linux_msg_queue_node_t));

+    zOss_AssertEx(msg_queue_node != NULL, ZOSS_ERROR);

+

+    msg_queue_node->msg  = msg_ptr;

+    msg_queue_node->size = size;

+

+    msg_queue = &thread->msg_queue;

+    raw_spin_lock_irqsave(&msg_queue->lock, flags);

+    list_add_tail(&msg_queue_node->node, &msg_queue->head);

+#ifdef LINUX_THREAD_MSG_STAT

+    msg_queue->count++;

+    msg_queue->send_time = cpu_clock(0);

+#endif

+    raw_spin_unlock_irqrestore(&msg_queue->lock, flags);

+

+#if (LINUX_THREAD_MSG == LINUX_THREAD_MSG_COMPLETION)

+    complete(&msg_queue->completion);

+#elif (LINUX_THREAD_MSG == LINUX_THREAD_MSG_SEMAPHORE)

+    up(&msg_queue->semaphore);

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ½ÓÊÕÏûÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  time_out:   ½ÓÊÕÏûÏ¢µÄ³¬Ê±Ê±¼ä

+*   (´«³ö²ÎÊý)  msg_ptr:    ÏûÏ¢Ö¸ÕëµÄ´æ·ÅµØÖ·

+                size:       ÏûÏ¢Êý¾Ý´óСµÄ´æ·ÅµØÖ·£¬ÎÞЧ²ÎÊý

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     Èô²ÎÊýtimeoutÊÇZOSS_WAIT_FOREVER£¬ÔòÒ»Ö±µÈ´ýÏûÏ¢·¢Ëͳɹ¦ÔÙ·µ»Ø£»

+                Èô²ÎÊýtimeoutÊÇZOSS_NO_WAIT£¬Ôò³¢ÊÔ·¢ËÍÏûÏ¢£¬·¢ËÍʧ°Ü£¬Ö±½Ó·µ»Ø£»

+                ·ñÔòtimeoutÊdz¬Ê±µÄʱ¼ä£¬¼ÆËã·½·¨Êǽ«µ±Ç°ÏµÍ³Ê±¼äºÍtimeoutÏà¼Ó£¬

+                ³ÉΪabs_timeout,È»ºóÆô¶¯Ò»¸ö¶¨Ê±Æ÷£¬Ö±ÖÁÏûÏ¢·¢Ëͳɹ¦»ò³¬Ê±

+*******************************************************************************/

+__tcm_func UINT32 zOss_RecvMsg(VOID **msg_ptr, UINT32 *size, UINT32  timeout)

+{

+    int ret = -1;

+    unsigned long flags;

+    linux_thread_t *thread;

+    linux_msg_queue_t *msg_queue;

+    linux_msg_queue_node_t *msg_queue_node;

+

+    zOss_AssertEx(msg_ptr != NULL && size != NULL, ZOSS_ERROR);

+    zOss_AssertEx(in_interrupt() == 0x00, ZOSS_ERROR);

+

+    thread = linux_thread_current();

+    zOss_AssertEx(thread != NULL, ZOSS_ERROR);

+

+    msg_queue = &thread->msg_queue;

+#if (LINUX_THREAD_MSG == LINUX_THREAD_MSG_COMPLETION)

+    if (timeout == ZOSS_WAIT_FOREVER) {

+        ret = wait_for_completion_killable(&msg_queue->completion);

+        if (ret == -ERESTARTSYS)

+            do_exit(SIGKILL);

+    } else if (timeout == ZOSS_NO_WAIT) {

+        ret = try_wait_for_completion(&msg_queue->completion);

+        ret = ((ret == 1) ? 0 : 1);

+    } else {

+        ret = wait_for_completion_timeout(&msg_queue->completion, timeout);

+        ret = ((ret == 1) ? 0 : 1);

+    }

+#elif (LINUX_THREAD_MSG == LINUX_THREAD_MSG_SEMAPHORE)

+    if (timeout == ZOSS_WAIT_FOREVER) {

+        ret = down_killable(&msg_queue->semaphore);

+        if (ret == -EINTR)

+            do_exit(SIGKILL);

+        zOss_ASSERT(ret == 0);

+    } else if (timeout == ZOSS_NO_WAIT) {

+        ret = down_trylock(&msg_queue->semaphore);

+    } else {

+        ret = down_timeout(&msg_queue->semaphore, timeout);

+    }

+#endif

+

+    if (ret == 0) {

+        raw_spin_lock_irqsave(&msg_queue->lock, flags);

+        zOss_ASSERT(!list_empty(&msg_queue->head));

+#ifdef LINUX_THREAD_MSG_STAT

+        zOss_ASSERT(msg_queue->count > 0);

+#endif

+        msg_queue_node  = list_first_entry(&msg_queue->head, linux_msg_queue_node_t, node);

+        *msg_ptr        = msg_queue_node->msg;

+        *size           = msg_queue_node->size;

+        list_del(&msg_queue_node->node);

+#ifdef LINUX_THREAD_MSG_STAT

+        msg_queue->count--;

+        msg_queue->recv_time = cpu_clock(0);

+#endif

+        raw_spin_unlock_irqrestore(&msg_queue->lock, flags);

+

+        LINUX_THREAD_MSG_FREE((void *)msg_queue_node);

+

+        return ZOSS_SUCCESS;

+    }

+

+    return ZOSS_ERROR;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ÏûÏ¢µÄÊÕ·¢ÐÅÏ¢(¼à¿ØÄ£¿é)

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void              

+*   (´«³ö²ÎÊý)  pMonMsgInfo: »ñÈ¡ÏûÏ¢µÄÐÅÏ¢µÄ´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     

+*******************************************************************************/

+VOID z0ss_GetMsgInfo(T_ZOss_Mon_Msg *pMonMsgInfo)

+{

+#ifdef _USE_MONITOR

+    if (pMonMsgInfo)

+    {

+        *pMonMsgInfo = gOsa_MsgInfo;

+    }

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´ÓÄÚ´æ³ØÉêÇëÏûϢͷ+»º³åÇø£¬²¢·µ»Ø»º³åÇøÖ¸Õë

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  size:   »º³åÇø´óС

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     »º³åÇøÖ¸Õë

+* ÆäËü˵Ã÷:     ±ØÐëºÍzOss_ThreadRetMsgBufÅä¶ÔʵÏÖ

+*******************************************************************************/

+__tcm_func VOID* zOss_ThreadGetMsgBuf(UINT32 size)

+{

+    T_THREAD_MSG_HEAD *msg_head = NULL;

+

+    zOss_AssertEx(size != 0, NULL);

+

+    msg_head = (T_THREAD_MSG_HEAD *)LINUX_THREAD_MSG_ALLOC(THREAD_MSG_SIZE(size));    

+    zOss_AssertEx(msg_head != NULL, NULL);

+    msg_head->sig_no    = SIGNAL_MSG_NUMBER;

+    msg_head->magic     = THREAD_MSG_MAGIC;

+

+    return THREAD_MSG_BUF(msg_head);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÏòÄÚ´æ³Ø·µ»ØÏûϢͷ+»º³åÇø

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  p_buf:  »º³åÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ±ØÐëºÍzOss_ThreadGetMsgBufÅä¶ÔʵÏÖ

+*******************************************************************************/

+__tcm_func VOID zOss_ThreadRetMsgBuf(VOID *p_buf)

+{

+    zOss_AssertExN(p_buf != NULL);

+

+    LINUX_THREAD_MSG_FREE(THREAD_MSG_HEAD(p_buf));

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïòthread_idÏ̷߳¢ËÍÏûÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  msg_id:     ÏûÏ¢id

+                p_buf:      »º³åÇøÖ¸Õë

+                buf_size:   »º³åÇø´óС

+                thread_id:  Ä¿±êÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     ±ØÐëºÍzOss_ThreadRecvMsgÅä¶ÔʵÏÖ

+*******************************************************************************/

+__tcm_func UINT32 zOss_ThreadSendMsg(UINT32 msg_id, VOID *p_buf, UINT16 buf_size, ZOSS_THREAD_ID thread_id)

+{

+    unsigned long flags;

+    linux_thread_t *thread;

+    T_THREAD_MSG_HEAD *msg_head;

+

+    if ((p_buf == NULL && buf_size != 0x00) || (p_buf != NULL && buf_size == 0x00))

+        return ZOSS_ERROR;

+

+    thread = linux_thread_is_valid(thread_id);

+    zOss_AssertEx(thread != NULL, ZOSS_ERROR);

+

+    if (p_buf == NULL) {

+        msg_head = (T_THREAD_MSG_HEAD *)LINUX_THREAD_MSG_ALLOC(THREAD_MSG_SIZE(0));

+        zOss_AssertEx(msg_head != NULL, ZOSS_ERROR);

+

+        msg_head->sig_no = SIGNAL_MSG_NUMBER;

+        msg_head->magic  = THREAD_MSG_MAGIC;

+    } else {

+        msg_head = THREAD_MSG_HEAD(p_buf);

+        zOss_AssertEx(msg_head->magic == THREAD_MSG_MAGIC, ZOSS_ERROR);

+        if (msg_head->magic != THREAD_MSG_MAGIC)

+            return ZOSS_ERROR;

+    }

+    msg_head->id = msg_id;

+    msg_head->buf_size = buf_size;

+    

+    return zOss_SendMsg(thread_id, (VOID *)msg_head, sizeof(msg_head), ZOSS_WAIT_FOREVER);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ï߳̽ÓÊÕÏûÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  timeout:    ½ÓÊÕÏûÏ¢µÄ³¬Ê±Ê±¼ä

+*   (´«³ö²ÎÊý)  p_msg_id:   ÏûÏ¢idµÄ´æ·ÅµØÖ·

+                p_buf:      ÏûÏ¢Ö¸ÕëµÄ´æ·ÅµØÖ·

+                p_buf_size: ÏûÏ¢´óСµÄ´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     ±ØÐëºÍzOss_ThreadSendMsgÅä¶ÔʵÏÖ

+*******************************************************************************/

+__tcm_func UINT32 zOss_ThreadRecvMsg(UINT32 *p_msg_id, VOID **p_buf, UINT32 *p_buf_size, UINT32 timeout)

+{

+    UINT32 ret;

+    UINT32 size;

+    unsigned long flags;

+    linux_thread_t *thread;

+    T_THREAD_MSG_HEAD *msg_head;

+

+    zOss_AssertEx(p_msg_id != NULL && p_buf != NULL && p_buf_size != NULL, ZOSS_ERROR);

+    zOss_AssertEx(in_interrupt() == 0x00, ZOSS_ERROR);

+

+    thread = linux_thread_current();

+    zOss_AssertEx(thread != NULL, ZOSS_ERROR);

+

+    ret = zOss_RecvMsg((VOID **)&msg_head, &size, timeout);

+    if (ret != ZOSS_SUCCESS)

+        return ret;

+    zOss_AssertEx(msg_head->magic == THREAD_MSG_MAGIC, ZOSS_ERROR);

+

+    *p_msg_id   = msg_head->id;

+    *p_buf_size = msg_head->buf_size;

+    if (msg_head->buf_size == 0x00) {

+        LINUX_THREAD_MSG_FREE((void *)msg_head);

+        *p_buf = NULL;

+    } else

+        *p_buf = THREAD_MSG_BUF(msg_head);

+    

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ×¢²áÏß³ÌÏûÏ¢¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ïß³Ìid

+                type:       ¹³×Óº¯ÊýÀàÐÍ

+                dire:       ¹³×Óº¯ÊýÅäÖÃ

+                func:       ¹³×Óº¯ÊýÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_RegThreadMsgHook(ZOSS_THREAD_ID thread_id, UINT8 type, UINT8 dire, THREAD_MSG_HOOK func)

+{

+    linux_thread_t *thread;

+    THREAD_MSG_HOOK_CONTENT *msg_hook;

+

+    zOss_AssertEx(type > 0 && type <= THREAD_MSG_HOOK_TYPE_MAX && dire <= THREAD_MSG_HOOK_DIRE_MAX && func != NULL, ZOSS_ERROR);

+    

+    thread = linux_thread_is_valid(thread_id);

+    zOss_AssertEx(thread != NULL, ZOSS_ERROR);

+    

+    msg_hook = find_thread_content(thread_id);

+    if (msg_hook == NULL) {

+        msg_hook = (THREAD_MSG_HOOK_CONTENT *)zOss_Malloc(sizeof(THREAD_MSG_HOOK_CONTENT));

+        zOss_AssertEx(msg_hook != NULL, ZOSS_ERROR);

+        

+        zOss_Memset(msg_hook, 0x00, sizeof(THREAD_MSG_HOOK_CONTENT));

+        msg_hook->thread_id = thread_id;

+        zOss_ListAdd(&s_thread_msg_hook_list, &msg_hook->Node);

+    }

+    msg_hook->dire[type - 1] = dire;

+    msg_hook->func[type - 1] = func;

+    

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef _USE_SEMAPHORE

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´´½¨ÐźÅÁ¿

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  name_ptr:       ÐźÅÁ¿µÄÃû³Æ£¬ÎÞЧ²ÎÊý

+                initial_count:  ÐźÅÁ¿µÄ³õʼ¼ÆÊýÖµ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ´´½¨³É¹¦£¬·µ»ØÐźÅÁ¿µÄ¾ä±ú£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+ZOSS_SEMAPHORE_ID zOss_CreateSemaphore(const CHAR *name_ptr, UINT32 initial_count)

+{

+    struct semaphore *sem;

+

+    sem = (struct semaphore *)kmalloc(sizeof(struct semaphore), GFP_ATOMIC);

+    zOss_AssertEx(sem != NULL, NULL);

+

+    sema_init(sem, (int)initial_count);

+

+    return (ZOSS_SEMAPHORE_ID)sem;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ÐźÅÁ¿

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  sem_id:     ÕýÔÚ»ñÈ¡µÄÐźÅÁ¿id

+                timeout:    ³¬Ê±¼ÆÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     Èô²ÎÊýtimeoutÊÇZOSS_WAIT_FOREVER£¬ÔòÒ»Ö±µÈ´ýÏûÏ¢·¢Ëͳɹ¦ÔÙ·µ»Ø£»

+                Èô²ÎÊýtimeoutÊÇZOSS_NO_WAIT£¬Ôò³¢ÊÔ·¢ËÍÏûÏ¢£¬·¢ËÍʧ°Ü£¬Ö±½Ó·µ»Ø£»

+                ·ñÔòtimeoutÊdz¬Ê±µÄʱ¼ä£¬¼ÆËã·½·¨Êǽ«µ±Ç°ÏµÍ³Ê±¼äºÍtimeoutÏà¼Ó£¬

+                ³ÉΪabs_timeout,È»ºóÆô¶¯Ò»¸ö¶¨Ê±Æ÷£¬Ö±ÖÁÏûÏ¢·¢Ëͳɹ¦»ò³¬Ê±

+*******************************************************************************/

+__tcm_func UINT32 zOss_GetSemaphore(ZOSS_SEMAPHORE_ID sem_id, UINT32 timeout)

+{

+    int ret = 0x00;

+    struct semaphore *sem = (struct semaphore *)sem_id;

+

+    zOss_AssertEx(sem != NULL, ZOSS_ERROR);

+

+    if (timeout == ZOSS_WAIT_FOREVER) {

+        ret = down_killable(sem);

+        if (ret == -EINTR)

+            do_exit(SIGKILL);

+    } else if (timeout == ZOSS_NO_WAIT)

+        ret = down_trylock(sem);

+    else

+        ret = down_timeout(sem, timeout);

+

+    if (ret == 0x00)

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÊÍ·ÅÐźÅÁ¿

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  sem_id:     ÕýÔÚÊͷŵÄÐźÅÁ¿id

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+__tcm_func UINT32 zOss_PutSemaphore(ZOSS_SEMAPHORE_ID sem_id)

+{

+    struct semaphore *sem = (struct semaphore *)sem_id;

+

+    zOss_AssertEx(sem != NULL, ZOSS_ERROR);

+

+    //resched_task(current);

+

+    up(sem);

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ÐźÅÁ¿µÄµ±Ç°¼ÆÊýÖµ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  sem_id:     ÕýÔÚ±»»ñÈ¡¼ÆÊýÖµµÄÐźÅÁ¿id

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ¸ÃÐźÅÁ¿µÄµ±Ç°¼ÆÊýÖµ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_GetSemaphoreCount(ZOSS_SEMAPHORE_ID sem_id)

+{

+    struct semaphore *sem = (struct semaphore *)sem_id;

+

+    zOss_AssertEx(sem != NULL, ZOSS_ERROR);

+

+    return sem->count;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ɾ³ýÐźÅÁ¿

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  sem_id:     ½«±»É¾³ýµÄÐźÅÁ¿id

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     ÐèÒªÊÍ·ÅÔÚzOss_CreateSemaphoreº¯ÊýÖÐÉêÇëµÄÄÚ´æ¿Õ¼ä£¬·ñÔò»áµ¼ÖÂÄÚ

+                ´æÐ¹Â¶

+*******************************************************************************/

+UINT32 zOss_DeleteSemaphore(ZOSS_SEMAPHORE_ID sem_id)

+{

+    struct semaphore *sem = (struct semaphore *)sem_id;

+

+    zOss_AssertEx(sem != NULL, ZOSS_ERROR);

+

+    zOss_AssertExA(list_empty(&sem->wait_list), kfree((void *)sem), ZOSS_ERROR);

+

+    kfree((void *)sem);

+

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef _USE_MUTEX

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´´½¨»¥³âÌå

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  name_ptr:   »¥³âÌåÃû³Æ

+                priority_inherit:   »¥³âÌåÊôÐÔ£¬Èç¹ûÊÇZOSS_INHERIT£¬ÔòÏß³ÌÖ®¼ä°´

+                ÓÅÏȼ¶Ë³Ðò»ñÈ¡»¥³âÌ壻Èç¹ûÊÇZOSS_NO_INHERIT£¬Ôò°´µÈ´ýµÄ˳Ðò»ñÈ¡

+                »¥³âÌå

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»Ø´´½¨µÄ»¥³âÌå¾ä±ú£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+ZOSS_MUTEX_ID zOss_CreateMutex(const CHAR *name_ptr, UINT32 priority_inherit)

+{

+    linux_mutex_t *mutex;

+

+    zOss_AssertEx(priority_inherit == ZOSS_NO_INHERIT || priority_inherit == ZOSS_INHERIT, NULL);

+

+    mutex = (linux_mutex_t *)kmalloc(sizeof(linux_mutex_t), GFP_ATOMIC);

+    zOss_AssertEx(mutex != NULL, NULL);

+

+    mutex->name = name_ptr;

+#ifdef LINUX_MUTEX_NESTING

+    atomic_set(&mutex->nesting, 0x00);

+#endif

+    mutex_init(&mutex->raw_mutex);

+

+    return (ZOSS_MUTEX_ID)mutex;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡»¥³âÌå

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mutex_id:   ´ý»ñÈ¡µÄ»¥³âÌåid

+                timeout:    »ñÈ¡µÄ³¬Ê±Ê±¼ä

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+__tcm_func UINT32 zOss_GetMutex( ZOSS_MUTEX_ID mutex_id,  UINT32 timeout)

+{

+    int ret = false;

+    linux_mutex_t *mutex = (linux_mutex_t *)mutex_id;

+

+    zOss_AssertEx(mutex != NULL, ZOSS_ERROR);

+

+#ifdef LINUX_MUTEX_NESTING

+# ifdef CONFIG_PREEMPT_RT_FULL

+    if (rt_mutex_owner(&mutex->raw_mutex.lock) == current) {

+# else

+    if (mutex->raw_mutex.owner == current) {

+# endif

+        atomic_inc(&mutex->nesting);

+        return ZOSS_SUCCESS;

+    }

+#endif

+

+    if (timeout == ZOSS_WAIT_FOREVER) {

+        ret = mutex_lock_killable(&mutex->raw_mutex);

+        if (ret == 0)

+            return ZOSS_SUCCESS;

+        else if (ret == -EINTR)

+            do_exit(SIGKILL);

+        else if (ret == -EDEADLK)

+            panic("mutex_id:%p dead lock!\n", (void *)mutex);

+        else

+            panic("mutex_id:%p error!\n", (void *)mutex);

+    } else if (timeout == ZOSS_NO_WAIT) {

+        ret = mutex_trylock(&mutex->raw_mutex);

+    } else {

+        while (timeout--) {

+            ret = mutex_trylock(&mutex->raw_mutex);

+            if (ret == true)

+                break;

+            msleep(1);

+        }

+    }

+

+    if (ret == true)

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÊÍ·Å»¥³âÌå

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mutex_id:   ´ýÊͷŵĻ¥³âÌåid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+__tcm_func UINT32 zOss_PutMutex(ZOSS_MUTEX_ID mutex_id)

+{

+    linux_mutex_t *mutex = (linux_mutex_t *)mutex_id;

+

+    zOss_AssertEx(mutex != NULL, ZOSS_ERROR);

+

+#ifdef LINUX_MUTEX_NESTING

+    if (atomic_read(&mutex->nesting)) {

+# ifdef CONFIG_PREEMPT_RT_FULL

+        zOss_ASSERT(rt_mutex_owner(&mutex->raw_mutex.lock) == current);

+# else

+        zOss_ASSERT(mutex->raw_mutex.owner == current);

+# endif

+        atomic_dec(&mutex->nesting);

+        return ZOSS_SUCCESS;

+    }

+#endif

+

+    mutex_unlock(&mutex->raw_mutex);

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïú»Ù»¥³âÌå

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mutex_id:   ´ýÏú»ÙµÄ»¥³âÌåid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     ÐèÒªÊÍ·ÅÔÚzOss_CreateMutexº¯ÊýÖÐÉêÇëµÄÄÚ´æ¿Õ¼ä£¬·ñÔò»áµ¼ÖÂÄÚ´æ

+                й¶

+*******************************************************************************/

+UINT32 zOss_DeleteMutex(ZOSS_MUTEX_ID mutex_id)

+{

+    linux_mutex_t *mutex = (linux_mutex_t *)mutex_id;

+

+    zOss_AssertEx(mutex != NULL, ZOSS_ERROR);

+

+#ifdef CONFIG_PREEMPT_RT_FULL

+# if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0))

+    if (!plist_head_empty(&mutex->raw_mutex.lock.wait_list))

+    {

+        zOss_ASSERT(0);

+        mutex_destroy(&mutex->raw_mutex);

+        kfree((void *)mutex);

+        return ZOSS_ERROR;

+    }

+# else

+    if (!RB_EMPTY_ROOT(&mutex->raw_mutex.lock.waiters))

+    {

+        zOss_ASSERT(0);

+        mutex_destroy(&mutex->raw_mutex);

+        kfree((void *)mutex);

+        return ZOSS_ERROR;

+    }

+# endif

+#else

+    if (!list_empty(&mutex->raw_mutex.wait_list))

+    {

+        zOss_ASSERT(0);

+        mutex_destroy(&mutex->raw_mutex);

+        kfree((void *)mutex);

+        return ZOSS_ERROR;

+    }

+#endif

+

+    mutex_destroy(&mutex->raw_mutex);

+    kfree((void *)mutex);

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef _USE_EVENT

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´´½¨ ʼþ±êÖ¾×é

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  name:   ʼþ±êÖ¾×éÃû³Æ£¬ÎÞЧ²ÎÊý               

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»Ø´´½¨µÄ ʼþ±êÖ¾×é¾ä±ú£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+ZOSS_EVENT_ID zOss_CreateEvent(const CHAR *name_ptr)

+{

+    zOss_AssertEx(0, NULL);

+}

+

+/*******************************************************************************

+* º¯ÊýÃû³Æ: zOss_GetEvent

+* ¹¦ÄÜÃèÊö: »ñȡʼþ×é

+* ²ÎÊý˵Ã÷: (IN)

+                event_id:ʼþ×éid

+                events:32λʼþ±ê¼Ç

+                get_options:ÃèÊöÈçºÎ»ñÈ¡¸Ãʼþ±ê¼Ç×éºÏ

+                    ZOSS_EVENTS_AND:±íʾeventsÖ¸¶¨µÄËùÓÐʼþ±ê¼Ç¶¼Òª·ûºÏ

+                    ZOSS_EVENTS_OR:±íʾeventsÖ¸¶¨µÄʼþ±ê¼ÇÖ»ÒªÓÐÈκÎÒ»

+                                   ¸ö·ûºÏ¼´¿É

+                    ZOSS_EVENTS_AND_CLEAR:±íʾ°´ZOSS_EVENTS_AND·½Ê½»ñÈ¡Íêºó,

+                                          ½«·ûºÏÌõ¼þµÄʼþ±ê¼ÇÖÃΪ0

+                    ZOSS_EVENTS_OR_CLEAR:±íʾ°´ZOSS_EVENTS_OR·½Ê½»ñÈ¡Íêºó,

+                                         ½«·ûºÏÌõ¼þµÄʼþ±ê¼ÇÖÃΪ0

+                pEventsReceived:´æ·Å»ñÈ¡µ½µÄʼþ±êÖ¾Ö¸Õë,²»ÄÜΪ¿Õ

+                timeout:³¬Ê±ÊôÐÔ.ZOSS_WAIT_FOREVER, ZOSS_NO_WAIT,»ò¾ßÌåʱ¼ä

+                        µ¥Î»ºÁÃë

+* ·µ »Ø Öµ: ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:

+*******************************************************************************/

+UINT32 zOss_GetEvent(ZOSS_EVENT_ID event_id, UINT32  events, UINT32 getOptions,

+                     UINT32 *pEventsReceived, UINT32 timeout)

+{

+    zOss_AssertEx(0, ZOSS_ERROR);

+}

+

+/*******************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetEvent

+* ¹¦ÄÜÃèÊö: ÉèÖÃʼþ×éʼþ±ê־룬Ó뵱ǰʼþ×é½øÐÐλ»ò

+* ²ÎÊý˵Ã÷: (IN)

+                 eventId:ʼþ×éid

+                 events:32-bit unsigned variable that represents the 

+                        requested event flags.

+                 setOptions:ÃèÊöÈçºÎÉèÖøÃʼþ±ê¼Ç×é

+                            ZOSS_EVENTS_AND: ÓëeventsÅäºÏʹÓã¬Íê³É32λ±ê¼Ç

+                                             ÇåÁ㹦ÄÜ¡£´Ëʱevents±ØÐëΪ0¡£

+                            ZOSS_EVENTS_OR ½«eventsͬµ±Ç°Öµ½øÐлòÔËËã¡£

+* ·µ »Ø Öµ: ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:

+*******************************************************************************/

+UINT32 zOss_SetEvent(ZOSS_EVENT_ID event_id, UINT32  events, UINT32 setOptions)

+{

+    zOss_AssertEx(0, ZOSS_ERROR);

+}

+

+/*******************************************************************************

+* º¯ÊýÃû³Æ: zOss_DeleteEvent

+* ¹¦ÄÜÃèÊö: ɾ³ýʼþ×é

+* ²ÎÊý˵Ã÷: (IN)

+                event_id:ʼþ×éid

+* ·µ »Ø Öµ: ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:

+*******************************************************************************/

+UINT32 zOss_DeleteEvent(ZOSS_EVENT_ID event_id)

+{

+    zOss_AssertEx(0, ZOSS_ERROR);

+}

+

+/*******************************************************************************

+* º¯ÊýÃû³Æ: zOss_QueryEvent

+* ¹¦ÄÜÃèÊö:²éѯʼþ×鵱ǰ±êÖ¾Öµ

+* ²ÎÊý˵Ã÷: (IN)	

+                event_id:ʼþ×éid

+* ·µ »Ø Öµ: ʼþ×鵱ǰ±êÖ¾Öµ

+* ÆäËü˵Ã÷:  

+*******************************************************************************/ 

+UINT32 zOss_QueryEvent(ZOSS_EVENT_ID event_id)

+{

+    zOss_AssertEx(0, ZOSS_ERROR);

+}

+

+/*******************************************************************************

+* º¯ÊýÃû³Æ: zOss_WaitingEvent

+* ¹¦ÄÜÃèÊö:²éѯÊÇ·ñÓÐÏ̵߳ȴýʼþ×é

+* ²ÎÊý˵Ã÷: (IN)

+                event_id:ʼþ×éid

+* ·µ »Ø Öµ: ÓÐÏ̵߳ȴý:True ;ÎÞÏ̵߳ȴý:False

+* ÆäËü˵Ã÷:  

+*******************************************************************************/ 

+BOOL zOss_WaitingEvent(ZOSS_EVENT_ID event_id)

+{

+    zOss_AssertEx(0, false);

+}

+#endif

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡²Ù×÷ϵͳµÄµ±Ç°µÎ´ðÊý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ²Ù×÷ϵͳµÄµ±Ç°µÎ´ðÊý

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_GetTickCount(VOID)

+{

+#if 0

+    return jiffies;

+#else

+    return (UINT32)gTimer_CurTime;

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     OSE²Ù×÷ϵͳÖеÄÏ̴߳´½¨º¯Êý£¬TOSÖÐÖ»ÄÜÓÃÓÚ´´½¨ÖжϷþÎñÀý³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ¼û²ÎÊýÁбíÖеÄ×¢ÊÍ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Öжϴ¦ÀíÀý³ÌµÄ¾ä±ú

+* ÆäËü˵Ã÷:     ÓÉÓÚĿǰµÄÇý¶¯Ä£¿éÖÐÒÑʹÓô˽ӿڣ¬ËùÒÔÐèÒª½«´Ëº¯Êý´ÓOSE²Ù×÷ϵͳ

+                ÖÐÒÆÖ²¹ýÀ´¡£

+                1) ´Ëº¯ÊýÖ»ÄÜÓÃÓÚ´´½¨ÖжϷþÎñÀý³Ì£»

+                2) ´Ëº¯Êý²»ÄÜÔÚÖжÏÖе÷Óã»

+                3) Èô´´½¨Ê§°Ü£¬ÏµÍ³¶ÏÑÔ£»

+                4) ²»ÍƼöÔÚÐÂÄ£¿éÖе÷Óô˺¯Êý½Ó¿Ú£»

+*******************************************************************************/

+PROCESS create_process(enum PROCESS_TYPE        proc_type,      /* Ïß³ÌÀàÐÍ£¬Ö»ÄÜΪOS_INT_PROC  */

+                       const char               *name,          /* ºöÂԴ˲ÎÊý                   */

+                       OSENTRYPOINT             *entrypoint,    /* Ïß³ÌÈë¿Úµã                   */

+                       OSADDRESS                stack_size,     /* ºöÂԴ˲ÎÊý                   */

+                       OSPRIORITY               priority,       /* ºöÂԴ˲ÎÊý                   */

+                       OSTIME                   timeslice,      /* ºöÂԴ˲ÎÊý                   */

+                       PROCESS                  block,          /* ºöÂԴ˲ÎÊý                   */

+                       struct OS_redir_entry    *router_table,  /* ºöÂԴ˲ÎÊý                   */

+                       OSVECTOR                 vec,            /* ÖжÏÏòÁ¿ºÅ                   */

+                       OSUSER                   user)           /* ±ØÐëΪ0                      */

+{

+    return ZOSS_ERROR;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     OSE²Ù×÷ϵͳÖеÄÏß³Ìɾ³ýº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  id:     ´ýɾ³ýÏ̵߳ÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     1) ÈôÏ̴߳´½¨Ê§°Ü£¬ÏµÍ³¶ÏÑÔ£»

+                2) ²»ÍƼöÔÚÐÂÄ£¿éÖе÷Óô˺¯Êý½Ó¿Ú£»

+*******************************************************************************/

+void kill_proc(PROCESS id)

+{

+    zOss_ASSERT(0);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     OSAÄ£¿é³õʼ»¯,ÔÚTOS²Ù×÷ϵͳÆô¶¯Ê±µ÷ÓÃ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     ÖØ¸´³õʼ»¯£¬Ôòϵͳ¶ÏÑÔ

+*******************************************************************************/

+UINT32 OSA_Init(VOID)

+{

+    static BOOL init_flag   = FALSE;

+    UINT32      ret         = 0x00;

+

+    zOss_AssertEx(init_flag == FALSE, ZOSS_ERROR);

+

+#ifdef _UB_USE_POOL

+    pool_init();

+#endif

+

+    ret = MEM_Init();

+    zOss_AssertEx(ret == ZOSS_SUCCESS, ZOSS_ERROR);

+

+#ifdef _USE_OSS_FS

+    FS_Init();

+#endif

+

+    //Osa_SysErrHndInit();

+    

+#ifdef _USE_MONITOR

+    gOsa_MsgInfo.num = 0;

+    gOsa_MsgInfo.ele = (T_ZOss_Mon_Msg_Ele *)zOss_GetUB(OSS_MON_INFO_MAX_NUMBER * sizeof(T_ZOss_Mon_Msg_Ele));

+    zOss_AssertEx(gOsa_MsgInfo.ele != NULL, ZOSS_ERROR);

+#endif

+

+#ifdef _USE_PSM

+    //linux_stat_register(3000, linux_stat_osa_callback);

+#endif

+

+    ret = TIMER_Init();

+    zOss_AssertEx(ret == ZOSS_SUCCESS, ZOSS_ERROR);

+

+#ifdef CONFIG_SINGLECORE

+    zOss_NvCheck();

+#endif

+

+    init_flag = TRUE;

+

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÑéÖ¤Ò»¸öÏß³ÌÊÇ·ñÓÐЧ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ýÑéÖ¤µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÈôÏß³ÌÓÐЧ£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 OSA_IdentifyThread(ZOSS_THREAD_ID threadID)

+{

+    if (linux_thread_is_valid(threadID))

+        return ZOSS_SUCCESS;

+    else

+        return ZOSS_ERROR;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡Ï̵߳ÄCPUÕ¼ÓÃÂÊ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ïß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Ï̵߳ÄCPUÕ¼ÓÃÂÊ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+#ifdef CONFIG_ACCURATE_CPU_PERCENT

+FLOAT Osa_GetProcessCPU(ZOSS_THREAD_ID thread_id)

+{

+    struct task_struct    *task      = NULL;

+    

+    if (gOsa_SwapTimeFlag) {

+        read_lock(&tasklist_lock);

+        for_each_processex(task) {

+            if((void *)task == (void *)thread_id){

+                read_unlock(&tasklist_lock);

+                return task->ac_cpupercent;

+        }

+    }

+        read_unlock(&tasklist_lock);

+        return 0;

+    }

+    return 0;

+}

+#else

+FLOAT Osa_GetProcessCPU(ZOSS_THREAD_ID thread_id)

+{

+    linux_thread_t *thread;

+    T_ZOsa_ThreadUserArea *user_area;

+    

+    if (gOsa_SwapTimeFlag) {

+        thread = linux_thread_is_valid(thread_id);

+        if (thread) {

+            user_area = (T_ZOsa_ThreadUserArea *)linux_thread_get_user_area(thread_id);

+            zOss_AssertEx(user_area != NULL, 0);

+            if (user_area == NULL)

+                return 0;

+

+            return user_area->cpupercent;

+        }

+    }

+

+    return 0;

+}

+#endif

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡Ïß³ÌÓû§Êý¾Ý¿Õ¼äµÄÖ¸Õë

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ý»ñÈ¡Óû§Êý¾Ý¿Õ¼äÖ¸ÕëµÄÏß³Ìid

+                bupdate:    ÎªÕæ£¬Ôò¸üÐÂÓû§Êý¾Ý¿Õ¼ä£»·ñÔò·µ»ØÓû§Êý¾Ý¿Õ¼äµÄÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Ï̵߳ÄÓû§Êý¾Ý¿Õ¼äµÄÖ¸Õë

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+T_ZOsa_ThreadUserArea *Osa_GetThreadUserArea(ZOSS_THREAD_ID thread_id, BOOL bupdate)

+{

+    linux_thread_t *thread;

+    struct task_struct *task;

+    T_ZOsa_ThreadUserArea *user_area;

+

+    thread = linux_thread_is_valid(thread_id);

+    if (thread) {

+        user_area = &thread->user_area;

+        zOss_AssertEx(user_area != NULL, NULL);

+    } else

+        return NULL;

+    

+    if (bupdate == false)

+        return user_area;

+

+    task = thread->task;

+    user_area->topstack = thread_saved_sp(task);

+    user_area->maxstack = zOss_GetThreadStackUsed(thread_id);

+    user_area->priority = (UINT8)task->prio;

+    if (user_area->runtime > 0)

+        user_area->RunTimeInMs = (UINT32)((FLOAT)user_area->runtime / 1000);

+

+    switch (task->state) {

+        case TASK_RUNNING:

+            if (task == current)

+                user_area->runstatus = ZOSS_OS_RUN;

+            else

+                user_area->runstatus = ZOSS_OS_READY;

+            break;

+

+        default:

+            user_area->runstatus = ZOSS_OS_BLOCK;

+            break;

+    }

+    

+    return user_area;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ËùÓÐÏ̵߳ÄÏß³Ìid

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  threadarray:    ´æ·ÅÏß³ÌidµÄÊý¾ÝµÄÖ¸Õë

+* ·µ »Ø Öµ:     ËùÓÐÏ̵߳Ä×ÜÊý

+* ÆäËü˵Ã÷:     ´Ëº¯ÊýÉêÇëµÄÄÚ´æ¿Õ¼ä£¬±ØÐëÓÉʹÓÃÕßÊÍ·Å£¬·ñÔò»áÔì³ÉÄÚ´æÐ¹Â¶¡£

+*******************************************************************************/

+UINT32 Osa_GetAllThreadId(ZOSS_THREAD_ID *threadarray[])

+{

+    UINT32 count;

+    linux_thread_t **thread_array;

+

+    zOss_AssertEx(threadarray != NULL, ZOSS_ERROR);

+

+    count = linux_thread_count_all_thread();

+    if (count == 0x00) {

+        *threadarray = NULL;

+        return 0x00;

+    }

+

+    thread_array = (linux_thread_t **)zOss_Malloc(count*sizeof(linux_thread_t *));

+    if (thread_array == NULL) {

+        *threadarray = NULL;

+        zOss_ASSERT(0);

+        return 0x00;

+    }

+

+    linux_thread_get_all_thread(thread_array);

+    *threadarray = (ZOSS_THREAD_ID *)thread_array;

+

+    return count;

+}

+

+#ifdef CONFIG_ACCURATE_CPU_PERCENT

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´òÓ¡Ïß³ÌÔËÐÐʱÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  pid:    ´ý´òÓ¡ÐÅÏ¢µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦£¬·µ»ØZOSS_SUCCESS£»Ê§°Ü£¬·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 Osa_DisplayThreadExecInfo(PROCESS pid)

+{

+    zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_ABNORMAL, "LinuxÔݲ»Ö§³Ö¸Ã¹¦ÄÜ\n");

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´òÓ¡ËùÓÐÏ̵߳ÄÔËÐÐʱÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  type:   

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦£¬·µ»ØZOSS_SUCCESS£»Ê§°Ü£¬·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 Osa_DisplayThreadsExecInfo(UINT32 type)

+{

+    linux_thread_sched_stat(type);

+    return ZOSS_SUCCESS;

+}

+#else

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´òÓ¡Ïß³ÌÔËÐÐʱÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  pid:    ´ý´òÓ¡ÐÅÏ¢µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦£¬·µ»ØZOSS_SUCCESS£»Ê§°Ü£¬·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 Osa_DisplayThreadExecInfo(PROCESS pid)

+{

+    T_ZOsa_ThreadUserArea *user_area = NULL;

+    

+    user_area = Osa_GetThreadUserArea((ZOSS_THREAD_ID)pid, TRUE);

+    if (user_area == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+        

+    zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "%-28s  %-16s  %16s  %16s  %16s  %16s",

+                "ThreadName", "ThreadID", "RunTimeInMs", "CpuPercent", "MsgNum", "RunCount");

+    if (user_area->threadid) 

+    {

+        zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "%-28s  0x%08x  %16u  %16f  %16u  %16u",

+                    user_area->threadname,

+                    user_area->threadid,

+                    user_area->RunTimeInMs,

+                    user_area->cpupercent,

+                    user_area->msgnum,

+                    user_area->runcount);

+    }

+    else 

+    {

+        zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_ABNORMAL, "ûÓÐÕÒµ½Ïß³Ì0x%08x", (UINT32)pid);

+        return ZOSS_ERROR;

+    }

+    

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´òÓ¡ËùÓÐÏ̵߳ÄÔËÐÐʱÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  type:   

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦£¬·µ»ØZOSS_SUCCESS£»Ê§°Ü£¬·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 Osa_DisplayThreadsExecInfo(UINT32 type)

+{

+    UINT32                  cnt             = 0;

+#ifdef _USE_PSM

+    UINT32                  freq            = 0;

+#endif

+    UINT32                  thread_num      = 0;

+    FLOAT                   cpu_percent     = 0;

+    UINT32                  run_time        = 0;

+    ZOSS_THREAD_ID          *thread_array   = NULL;

+#ifdef _OS_TOS

+    cyg_tick_count_t        total_time      = 0;

+#endif

+    T_ZOsa_ThreadUserArea   *user_area      = NULL;

+    

+    thread_num = Osa_GetAllThreadId(&thread_array);

+    if (thread_num == 0 || thread_array == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+    

+#ifdef _USE_PSM

+    zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "\t**********************Current CPU Frequency is %u**********************",  zDrvPow_GetPsCoreFreq());

+#endif

+    zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "%-28s %-16s %16s %16s %16s %16s",

+                "ThreadName", "ThreadID", "RunTimeInMs", "CpuPercent", "MsgNum", "RunCount");

+    for (cnt = 0; cnt < thread_num; cnt++)

+    {

+        user_area = Osa_GetThreadUserArea(thread_array[cnt], TRUE);

+        if (user_area == NULL)

+        {        

+            continue;

+        }

+

+        if (type & SUP_THREAD_STATISTIC_INFO_BIT)   /* ͳ¼ÆÖ¸¶¨Ê±¼äÄÚµÄÏß³ÌÖ´ÐÐÇé¿ö,ʱ¼äµÄ»ñȡʹÓÃϵͳʱÖÓtick,µ¥Î»ºÁÃë,¾«¶È½ÏµÍ */

+        {

+#ifdef CYGOPT_KERNEL_EXTEND_THREAD_STATISTIC_TIMESLICE

+            run_time    = (UINT32)cyg_thread_get_statistic_timeslice((cyg_handle_t)thread_array[cnt]);

+            total_time  = cyg_current_statistic_time();

+            cpu_percent = (FLOAT)run_time * 100 / total_time;

+            run_time    = (UINT32)((FLOAT)run_time * (gOsa_SysCpuFreq / 1000));

+#endif

+        }

+        else    /* ¶¨Ê±Ë¢ÐµÄÏß³ÌÖ´ÐÐÇé¿ö,ʱ¼äµÄ»ñÈ¡µ÷ÓÃÇý¶¯µÄº¯Êý,µ¥Î»Î¢Ãî,¾«¶È½Ï¸ß */

+        {

+            run_time = user_area->RunTimeInMs;

+            cpu_percent = user_area->cpupercent;

+        }

+        

+        if ((type & SUP_THREAD_LIVE_BIT) && run_time == 0)

+        {

+            continue;   /* Ìø¹ýûÓлµÄÏß³Ì */

+        }

+        else if ((type & SUP_THREAD_LAZY_BIT) && run_time != 0)

+        {

+            continue;   /* Ìø¹ý»î¶¯µÄÏß³Ì */

+        }

+        

+        zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "%-28s  0x%08x  %16u  %16f  %16u  %16u",

+                    user_area->threadname,

+                    user_area->threadid,

+                    run_time,

+                    cpu_percent,

+                    user_area->msgnum,

+                    user_area->runcount);

+    }

+    

+    zOss_Free(thread_array);

+    

+    return ZOSS_SUCCESS;

+}

+#endif

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³ÌÇл»¼Ç¼º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  enableRunTime:  ÊÇ·ñÔÊÐí¼Ç¼ÔËÐÐʱÐÅÏ¢£»

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+VOID Osa_SwapCtl(BOOL enableRunTime)

+{    

+    if ((enableRunTime == gOsa_SwapTimeFlag))

+    {

+        return;

+    }

+    

+    if ((enableRunTime == TRUE) && (gOsa_SwapTimeFlag == FALSE)) 

+    {

+        if (gOsa_AllTaskIdArray == NULL)

+        {

+            T_OSS_PARAM *pPlatCfg;

+            

+            pPlatCfg = zOss_GetOssCfg();

+            gOsa_AllTaskIdArray = (ZOSS_TASK_ID *)zOss_Malloc(sizeof(ZOSS_TASK_ID) * pPlatCfg->TaskCfg.max_task_num);

+            zOss_AssertExN(gOsa_AllTaskIdArray != NULL);

+        }

+        

+        gOsa_CpuStartTime = Osa_HwTimeRead();

+        gOsa_SwapLastTime = gOsa_CpuStartTime;

+    }

+    

+    gOsa_SwapTimeFlag   = enableRunTime;

+

+#ifdef CONFIG_ACCURATE_CPU_PERCENT

+    if(enableRunTime)

+    {

+        set_task_swaphook(Osa_swapin_handler, Osa_swapout_handler);

+    }

+    else

+    {

+        set_task_swaphook(NULL, NULL);

+    }

+#endif

+

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸üÐÂϵͳÖÐËùÓÐÏ̺߳ÍÈÎÎñµÄCPUÕ¼ÓÃÂÊ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+VOID Osa_UpdateCpu(VOID)

+{

+    if (gOsa_SwapTimeFlag) 

+    {   

+        preempt_disable();

+        Osa_UpdateThreadCpu();        

+        //Osa_UpdateTaskCpu();

+

+        gOsa_CpuStartTime = Osa_HwTimeRead();

+        gOsa_SwapLastTime = gOsa_CpuStartTime;

+        preempt_enable();

+    }

+}

+

+#ifdef CONFIG_ACCURATE_CPU_PERCENT

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´òÓ¡ËùÓÐÏ̵߳ĵ÷¶Èͳ¼ÆÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void linux_thread_sched_stat(int type)

+{

+    #define SCHED_STAT_STR_LEN  ((16 + 1) * 9)

+    char *buf;

+    char   percent[12] = {0};

+    struct task_struct *task;

+    unsigned long total = 0, cnt = 0;

+    unsigned int  integer = 0, decimal = 0;

+    linux_thread_sched_stat_t *sched_stat;

+

+    zOss_Printf(SUBMDL_SCHE, PRINT_LEVEL_NORMAL,

+                "%-16s %16s %16s %16s %16s %16s %16s",

+                "thread_name", "pid", "sum_exec_runtime", "sched_policy",

+                "priority", "rt_priority", "cpu_percent");

+

+    read_lock(&tasklist_lock);

+    for_each_processex(task)

+        total++;

+    read_unlock(&tasklist_lock);

+

+    buf = (char *)kzalloc(total*SCHED_STAT_STR_LEN, GFP_ATOMIC);

+    zOss_ASSERT(buf != NULL);

+

+    sched_stat = (linux_thread_sched_stat_t *)kzalloc(total*sizeof(linux_thread_sched_stat_t), GFP_ATOMIC);

+    zOss_ASSERT(sched_stat != NULL);

+

+    if(type == 0){

+    read_lock(&tasklist_lock);

+        for_each_processex(task) {

+            integer = (unsigned int)task->ac_cpupercent;

+            decimal = (unsigned int)((task->ac_cpupercent - integer) * 100);

+            snprintf(percent, sizeof(percent), "%u.%u", integer, decimal);

+            snprintf(buf + cnt*SCHED_STAT_STR_LEN, SCHED_STAT_STR_LEN,

+                    "%-16s %16d %16llu %16s %16d %16u %16s\n",

+                    &task->comm[0],

+                    task->pid,

+                    (unsigned long long)task->se.sum_exec_runtime,

+                    linux_thread_sched_policy[task->policy],

+                    task->prio, task->rt_priority, percent);

+            (sched_stat + cnt)->str = buf + cnt*SCHED_STAT_STR_LEN;

+            (sched_stat + cnt)->keyval = (u64)task->ac_cpupercent;

+            if (++cnt == total)

+                break;

+        }

+        read_unlock(&tasklist_lock);

+

+        sort((void *)sched_stat, total, sizeof(linux_thread_sched_stat_t),

+             linux_thread_sched_stat_cmp, linux_thread_sched_stat_swap);

+

+        for (cnt = 0x00; cnt < total; cnt++)

+            zOss_Printf(SUBMDL_SCHE, PRINT_LEVEL_NORMAL, "%s", (sched_stat + cnt)->str);

+    }        

+    else if(type == SUP_THREAD_LIVE_BIT){

+        read_lock(&tasklist_lock);

+        for_each_processex(task) {

+            if(task->ac_cpupercent > 0){

+                integer = (unsigned int)task->ac_cpupercent;

+                decimal = (unsigned int)((task->ac_cpupercent - integer) * 100);

+                snprintf(percent, sizeof(percent), "%u.%u", integer, decimal);

+                snprintf(buf + cnt*SCHED_STAT_STR_LEN, SCHED_STAT_STR_LEN,

+                        "%-16s %16llu %16s %16d %16u %16s\n",

+                        &task->comm[0],

+                        (unsigned long long)task->se.sum_exec_runtime,

+                        linux_thread_sched_policy[task->policy],

+                        task->prio, task->rt_priority, percent);

+                (sched_stat + cnt)->str = buf + cnt*SCHED_STAT_STR_LEN;

+                (sched_stat + cnt)->keyval = (u64)task->ac_cpupercent;

+                if (++cnt == total)

+                    break;

+            }

+        }

+        read_unlock(&tasklist_lock);

+

+        sort((void *)sched_stat, cnt, sizeof(linux_thread_sched_stat_t),

+             linux_thread_sched_stat_cmp, linux_thread_sched_stat_swap);

+        total = cnt;

+        for (cnt = 0x00; cnt < total; cnt++)

+            zOss_Printf(SUBMDL_SCHE, PRINT_LEVEL_NORMAL, "%s", (sched_stat + cnt)->str);

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_SCHE, PRINT_LEVEL_NORMAL, "unsupported param--type=%d", type);

+    }

+

+    kfree((void *)buf);

+    kfree((void *)sched_stat);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Çå¿ÕËùÓÐÏ̵߳ÄCPUÕ¼ÓÃÂÊͳ¼ÆÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void linux_reset_cpupinfo(void)

+{

+    struct task_struct *task;

+    

+    read_lock(&tasklist_lock);

+    for_each_processex(task) {

+        task->ac_rtime = 0;

+        task->ac_cpupercent = 0;

+    }

+    read_unlock(&tasklist_lock);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾ÝÈÎÎñÃû»ñÈ¡¶ÔÓ¦µÄÈÎÎñID(¸Ã½Ó¿Ú¿ÉÒÔ²éѯµ½ËùÓÐϵͳÖеÄÈÎÎñ£¬²»

+*               ¾ÖÏÞÓÚOSS²ã´´½¨µÄÏß³Ì)

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ÈÎÎñÃû

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÈÎÎñID(struct task_struct *)

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void *linux_get_threadID_by_name(const char *name)

+{

+    void               *threadID = NULL;

+    struct task_struct *task     = NULL;

+    

+    read_lock(&tasklist_lock);

+    for_each_processex(task){

+        if(strcmp(task->comm, name) == 0){

+            threadID = (void *)task;

+            break;

+        }

+    }

+    read_unlock(&tasklist_lock);

+    return threadID;

+}

+#else

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ´òÓ¡ËùÓÐÏ̵߳ĵ÷¶Èͳ¼ÆÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void linux_thread_sched_stat(int type)

+{

+#ifdef CONFIG_SCHEDSTATS

+    #define SCHED_STAT_STR_LEN  ((16 + 1) * 7)

+    char *buf;

+    struct task_struct *task;

+    unsigned long total = 0, cnt = 0;

+    linux_thread_sched_stat_t *sched_stat;

+

+    zOss_Printf(SUBMDL_SCHE, PRINT_LEVEL_NORMAL,

+                "%-16s %16s %16s %16s %16s %16s %16s %16s",

+                "thread_name", "pid", "sum_exec_runtime", "run_delay", "run_count",

+                "sched_policy", "priority", "rt_priority");

+

+    read_lock(&tasklist_lock);

+    for_each_process(task)

+        total++;

+    read_unlock(&tasklist_lock);

+

+    buf = (char *)kzalloc(total*SCHED_STAT_STR_LEN, GFP_ATOMIC);

+    zOss_ASSERT(buf != NULL);

+

+    sched_stat = (linux_thread_sched_stat_t *)kzalloc(total*sizeof(linux_thread_sched_stat_t), GFP_ATOMIC);

+    zOss_ASSERT(sched_stat != NULL);

+

+    read_lock(&tasklist_lock);

+    for_each_process(task) {

+        snprintf(buf + cnt*SCHED_STAT_STR_LEN, SCHED_STAT_STR_LEN,

+                "%-16s %16d %16llu %16llu %16lu %16s %16d %16u\n",

+                &task->comm[0],

+                task->pid,

+                (unsigned long long)task->se.sum_exec_runtime,

+                (unsigned long long)task->sched_info.run_delay,

+                task->sched_info.pcount,

+                linux_thread_sched_policy[task->policy],

+                task->prio, task->rt_priority);

+        (sched_stat + cnt)->str = buf + cnt*SCHED_STAT_STR_LEN;

+        (sched_stat + cnt)->keyval = task->se.sum_exec_runtime;

+

+        if (++cnt == total)

+            break;

+    }

+    read_unlock(&tasklist_lock);

+

+    sort((void *)sched_stat, total, sizeof(linux_thread_sched_stat_t),

+         linux_thread_sched_stat_cmp, linux_thread_sched_stat_swap);

+

+    for (cnt = 0x00; cnt < total; cnt++)

+        zOss_Printf(SUBMDL_SCHE, PRINT_LEVEL_NORMAL, "%s", (sched_stat + cnt)->str);

+

+    kfree((void *)buf);

+    kfree((void *)sched_stat);

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Çå¿ÕËùÓÐÏ̵߳ÄCPUÕ¼ÓÃÂÊͳ¼ÆÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void linux_reset_cpupinfo(void)

+{

+    return;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾ÝÈÎÎñÃû»ñÈ¡¶ÔÓ¦µÄÈÎÎñID(¸Ã½Ó¿Ú¿ÉÒÔ²éѯµ½ËùÓÐϵͳÖеÄÈÎÎñ£¬²»

+*               ¾ÖÏÞÓÚOSS²ã´´½¨µÄÏß³Ì)

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ÈÎÎñÃû

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÈÎÎñID(struct task_struct *)

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void *linux_get_threadID_by_name(const char *name)

+{

+    return NULL;

+}

+#endif

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     zOss_DumpStack

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  to:   ´æ·Åº¯Êýµ÷ÓùØÏµµÄ¿Õ¼ä

+*   (´«Èë²ÎÊý)  size: ¿Õ¼äµÄ´óС£¨×Ö½Ú£©

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ½öÖ§³ÖGCC±àÒëÁ´£¬32λ´¦ÀíÆ÷

+**************************************************************************/

+VOID zOss_DumpStack(VOID *to, UINT32 size)

+{

+    return;

+}

+

+VOID zOss_IoRemapPages(VOID *base, UINT32 size)

+{

+    unsigned long start;

+    const struct mem_type *mtype;

+

+    if (!base || ((unsigned long)base & (PAGE_SIZE - 1)) || size == 0 || (size & (PAGE_SIZE - 1)))

+        zOss_AssertExN(0);

+

+    mtype = get_mem_type(MT_DEVICE);

+    for(start = (unsigned long)base; start < (unsigned long)base + size; start += PAGE_SIZE)

+    {

+        if (ioremap_page(start, __pa(start), mtype) != 0)

+            zOss_AssertExN(0);

+    }

+}

+

+/* cache µØÖ·³¤¶È line¶ÔÆëºê */

+#define CACHE_LINESIZE                           L1_CACHE_BYTES

+#define CACHE_ALIGN_TO_LINESIZE(ADDR, LEN)       ((LEN) = (((LEN) + ((ADDR) - ((ADDR) & (~(CACHE_LINESIZE - 1u)))) + \

+		                                  CACHE_LINESIZE - 1u) & (~(CACHE_LINESIZE - 1u)))); \

+		                                  ((ADDR) = ((ADDR) & (~(CACHE_LINESIZE - 1u))))

+

+VOID zOss_CacheCleanRange(UINT32 base, UINT32 size)

+{

+    UINT32 old_intr;

+

+    CACHE_ALIGN_TO_LINESIZE(base, size);

+    ZOSS_SAVE_IRQ(old_intr);

+    dmac_map_area(base, size, DMA_TO_DEVICE);

+    outer_clean_range(base, base + size);

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+VOID zOss_CacheInvalidateRange(UINT32 base, UINT32 size)

+{

+    UINT32 old_intr;

+    

+    CACHE_ALIGN_TO_LINESIZE(base, size);

+    ZOSS_SAVE_IRQ(old_intr);

+    outer_inv_range(base, base + size);

+    dmac_map_area(base, size, DMA_FROM_DEVICE);

+

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+VOID zOss_CacheCleanRangeFast(UINT32 base, UINT32 size)

+{

+    dmac_map_area(base, size, DMA_TO_DEVICE);

+    outer_clean_range(base, base + size);

+}

+

+VOID zOss_CacheInvalidateRangeFast(UINT32 base, UINT32 size)

+{

+    outer_inv_range(base, base + size);

+    dmac_map_area(base, size, DMA_FROM_DEVICE);

+}

+

+VOID zOss_CacheClean(VOID)

+{

+    UINT32 old_intr;

+

+    ZOSS_SAVE_IRQ(old_intr);

+    flush_cache_all();

+    outer_flush_all();

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_mem.c b/cp/ps/plat/src/oss/osa/linux/src/linux_mem.c
new file mode 100644
index 0000000..8a836f1
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_mem.c
@@ -0,0 +1,262 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     linux_mem.c

+* Îļþ±êʶ:     linux_mem.c

+* ÄÚÈÝÕªÒª:     linuxÖ§³Å²ãÄÚ´æ¹ÜÀíÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/07/18      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_api.h"

+#include "osa.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*******************************************************************************

+*                                  ³£Á¿¶¨Òå                                    *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÄÚ´æÄ£¿é³õʼ»¯

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 MEM_Init(VOID)

+{

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñȡϵͳÄÚ´æµ÷ÊÔÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 Mem_GetSysMemDebugInfo(T_ZOss_List *mem_debug_info_lst)

+{

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡UBÄÚ´æÊ¹ÓÃÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 Mem_GetUBUseInfo(T_Mem_UBPoolGrpInfo *ub_pool_grp_info, UINT8 num)

+{

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼ì²éUBÄÚ´æÐ¹Â¶ÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 Mem_CheckUBLeak(T_Mem_UBLeakInfo *ub_leak_info,

+                       UINT32           ub_leak_time,

+                       UINT8            poolNum,

+                       UINT32           size)

+{

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡Ï̵߳ÄUBÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 Mem_ThreadUBInfo(ZOSS_THREAD_ID      threadId,

+                        T_Mem_UBBlockInfo   *threadUbInfo,

+                        UINT32              num,

+                        UINT8               poolNum)

+{

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ÈÎÎñµÄUBÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 Mem_TaskUBInfo (ZOSS_TASK_ID         taskId,

+                       T_Mem_UBBlockInfo    *taskUbInfo,

+                       UINT32               num,

+                       UINT8                poolNum)

+{

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡UBÄÚ´æµÄ¿ÕÏÐÂÊ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ubSize:     UBÄÚ´æ¿éµÄ´óС

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     UBÄÚ´æµÄʹÓÃÂÊ

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+FLOAT zOss_GetUBFreeRate(UINT32 ubSize)

+{

+    return (FLOAT)(0.8);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ³õʼ»¯heapµ÷ÊÔÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+VOID HeapDbg_Init(VOID)

+{

+

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼ì²éÄÚ´æÐ¹Â¶Æðʼʱ¼äºÍÅäÖÃÄÚ´æÐ¹Â¶µÄ¼ì²é·§Öµ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  leak_threadhold:    ÄÚ´æÐ¹Â¶µÄ¼ì²é·§Öµ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+VOID zOss_MemLeakStart(UINT32 leak_threadhold)

+{

+

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼ì²éij¶Îʱ¼äÄÚµÄÄÚ´æÐ¹Â¶Çé¿ö

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+VOID zOss_MemLeakEnd(VOID)

+{

+

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼ì²éÄÚ´æÐ¹Â¶Çé¿ö

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+VOID zOss_CheckMem(VOID)

+{

+

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ÅäÖÃUBÄÚ´æµÄµ÷ÊÔ¿ª¹Ø

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  dbgFlag:    UBÄÚ´æµÄµ÷ÊÔ¿ª¹Ø

+                TRUE:       ´ò¿ª

+                FALSE:      ¹Ø±Õ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+VOID zOss_SetUbDbgSwitch(UINT32 dbgFlag)

+{

+

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡¶ÑÄÚ´æµÄͳ¼ÆÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  mem_info:   ¶ÑÄÚ´æÍ³¼ÆÐÅÏ¢µÄ´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+UINT32 zOss_GetSysMemInfo(T_Mem_MemInfo *mem_info)

+{

+    return ZOSS_SUCCESS;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡¶ÑÄÚ´æµÄʹÓÃÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  pMonHeapInfo:   ¶ÑÄÚ´æÊ¹ÓÃÐÅÏ¢µÄ´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+VOID z0ss_GetHeapInfo(T_ZOss_Mon_Heap *pMonHeapInfo)

+{

+#ifdef _USE_MONITOR

+    T_Mem_MemInfo memInfo = {0};

+

+    if (pMonHeapInfo)

+    {

+        zOss_GetSysMemInfo(&memInfo);

+        pMonHeapInfo->base = 0;

+        pMonHeapInfo->size = memInfo.nMemTotal;

+        pMonHeapInfo->used = memInfo.nMemUsed;

+    }

+#endif

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_mmu_csky.c b/cp/ps/plat/src/oss/osa/linux/src/linux_mmu_csky.c
new file mode 100644
index 0000000..f7b95af
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_mmu_csky.c
@@ -0,0 +1,533 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_mmu_csky.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : csky´¦ÀíÆ÷mmu¹¦ÄÜʵÏÖÄ£¿é

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/11/09

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ÁõÑÇÄÏ

+* °æ ±¾ ºÅ : V1.1

+* ÐÞ¸ÄÈÕÆÚ : 2011/11/23

+* ÐÞ¸ÄÄÚÈÝ : ÖØ¹¹

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : ÁõÑÇÄÏ

+* °æ ±¾ ºÅ : V1.2

+* ÐÞ¸ÄÈÕÆÚ : 2012/03/09

+* ÐÞ¸ÄÄÚÈÝ : ´ÓÄÚºËÄ¿Â¼ÒÆÖ²µ½platĿ¼

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0004

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "tos_mmu_csky.h"

+#include <cyg/infra/cyg_ass.h>

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+#ifdef CYG_HAL_CSKYCPU_MMU

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define CSKY_MMU_DEBUG

+

+#define DPRAM_PHY_ADDR  (0x40000000)

+#define DPRAM_VIR_ADDR  (0x40000000)

+#define DPRAM_SIZE      (CSKY_PAGE_SIZE_16M)

+#define DPRAM_ATTR      (CSKY_PAGE_CACHE_DISABLE | CSKY_PAGE_DIRTY | CSKY_PAGE_VALID)

+

+#define ICP_PHY_ADDR    (0x50000000)

+#define ICP_VIR_ADDR    (0x50000000)

+#define ICP_SIZE        (CSKY_PAGE_SIZE_16M)

+#define ICP_ATTR        (CSKY_PAGE_CACHE_DISABLE | CSKY_PAGE_DIRTY | CSKY_PAGE_VALID)

+

+#define IO_PHY_ADDR     (0x60000000)

+#define IO_VIR_ADDR     (0x60000000)

+#define IO_SIZE         (CSKY_PAGE_SIZE_16M)

+#define IO_ATTR         (CSKY_PAGE_CACHE_DISABLE | CSKY_PAGE_DIRTY | CSKY_PAGE_VALID)

+

+#define NAND_PHY_ADDR   (0x82000000)

+#define NAND_VIR_ADDR   (0xCA000000)

+#define NAND_SIZE       (CSKY_PAGE_SIZE_16M)

+#define NAND_ATTR       (CSKY_PAGE_CACHE_DISABLE | CSKY_PAGE_DIRTY | CSKY_PAGE_VALID)

+

+#define GSM_PHY_ADDR    (0xF4000000)

+#define GSM_VIR_ADDR    (0xF4000000)

+#define GSM_SIZE        (0x3000000)

+#define GSM_ATTR        (CSKY_PAGE_CACHE_DISABLE | CSKY_PAGE_DIRTY | CSKY_PAGE_VALID)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static csky_tlb_mismatch_t  tos_csky_tlb_mismatch      = {0};

+

+static csky_mmu_region_t    *tos_csky_mmu_region_head  = NULL;

+

+static csky_mmu_region_t    tos_csky_mmu_region[]      = 

+{

+    {

+        DPRAM_PHY_ADDR, /* physical address */

+        DPRAM_VIR_ADDR, /* virtual address  */

+        DPRAM_SIZE,     /* region size      */

+        DPRAM_ATTR,     /* region attribute */

+        NULL

+    },

+    

+    {

+        ICP_PHY_ADDR,   /* physical address */

+        ICP_VIR_ADDR,   /* virtual address  */

+        ICP_SIZE,       /* region size      */

+        ICP_ATTR,       /* region attribute */

+        NULL

+    },

+

+    {

+        IO_PHY_ADDR,    /* physical address */

+        IO_VIR_ADDR,    /* virtual address  */

+        IO_SIZE,        /* region size      */

+        IO_ATTR,        /* region attribute */

+        NULL

+    },

+

+    {

+        NAND_PHY_ADDR,  /* physical address */

+        NAND_VIR_ADDR,  /* virtual address  */

+        NAND_SIZE,      /* region size      */

+        NAND_ATTR,      /* region attribute */

+        NULL

+    },

+

+    {

+        GSM_PHY_ADDR,   /* physical address */

+        GSM_VIR_ADDR,   /* virtual address  */

+        GSM_SIZE,       /* region size      */

+        GSM_ATTR,       /* region attribute */

+        NULL

+    },

+};

+

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Э´¦ÀíÆ÷Ñ¡ÔñMMU

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     socоƬÉÏ¿ÉÄÜ´æÔÚ¶à¸öЭ´¦ÀíÆ÷£¬±¾º¯ÊýʵÏÖMMUЭ´¦ÀíÆ÷µÄÑ¡Ôñ¹¦ÄÜ

+**************************************************************************/

+static inline void tos_csky_mmu_select_cp(void)

+{

+    asm volatile (                                                          \

+        "cpseti cp15;"  /* select mmu coprocessor */                        \

+        :                                                                   \

+        :                                                                   \

+        :                                                                   \

+    );

+}

+

+#ifdef CSKY_MMU_DEBUG

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¶Ámir(MMU Index Register)¼Ä´æÆ÷

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     mir¼Ä´æÆ÷µÄÖµ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static inline cyg_uint32 tos_csky_mmu_mir_read(void)

+{

+    cyg_uint32 MIR = 0x00;

+

+    asm volatile (                                                          \

+        "cpseti cp15;"                                                      \

+        "cprcr  r1, cpcr0;"                                                 \

+        "mov    %0, r1;"                                                    \

+        : "=r"(MIR)                                                         \

+        :                                                                   \

+        : "r1"                                                              \

+    );

+

+    return MIR & 0x3F;

+}

+#endif

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     дmir(MMU Index Register)¼Ä´æÆ÷

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  MIR:    ´ýдÈëMIR¼Ä´æÆ÷µÄÖµ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static inline void tos_csky_mmu_mir_write(cyg_uint32 MIR)

+{

+    asm volatile (                                                          \

+        "cpseti cp15;"                                                      \

+        "mov    r1, %0;"                                                    \

+        "cpwcr  r1, cpcr0;"                                                 \

+        :                                                                   \

+        : "r"(MIR)                                                          \

+        : "r1"                                                              \

+    );

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     дmmuµÄmpr(MMU Page mask Register)¼Ä´æÆ÷

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ²Î¼ûck610оƬÊÖ²áÖйØÓÚmpr¼Ä´æÆ÷µÄ˵Ã÷

+**************************************************************************/

+static inline void tos_csky_mmu_write_mpr(int value)

+{

+    asm volatile (                                                          \

+        "cpseti cp15;"      /* select mmu coprocessor */                    \

+        "mov    r1, %0;"                                                    \

+        "cpwcr  r1, cpcr6;"                                                 \

+        :                                                                   \

+        : "r"(value)                                                        \

+        : "r1"                                                              \

+    );

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¶ÁÒ»¸ötlb±íÏî

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  MIR:    tlb±íÏîË÷Òý

+                tlb:    tlb±íÏî±£´æµØÖ·

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ²Î¼ûck610оƬÊÖ²áÖйØÓÚTLBRIÃüÁîµÄ˵Ã÷

+**************************************************************************/

+static inline void tos_csky_mmu_tlb_read(cyg_uint32 MIR, csky_tlb_entry_t *tlb)

+{

+    if (MIR >= CSKY_TLB_NUM)

+    {

+        return;

+    }

+    

+    if (tlb == NULL)

+    {

+        return;

+    }

+

+    tos_csky_mmu_mir_write(MIR);

+

+    asm volatile (                                                          \

+        "cpseti cp15;"                                                      \

+        "lrw    r1, (1<<29);"                                               \

+        "cpwcr  r1, cpcr8;"     /* Write MICR               */              \

+        "cprcr  r1, cpcr1;"     /* MRR(MMU Random Register) */              \

+        "cprcr  r2, cpcr2;"     /* MEL0(MMU Entry Low 0)    */              \

+        "cprcr  r3, cpcr3;"     /* MEL0(MMU Entry Low 0)    */              \

+        "cprcr  r4, cpcr4;"     /* MEH(MMU Entry High)      */              \

+        "mov    r5, %0;"                                                    \

+        "stw    r1, (r5, 0);"                                               \

+        "stw    r2, (r5, 4);"                                               \

+        "stw    r3, (r5, 8);"                                               \

+        "stw    r4, (r5, 12);"                                              \

+        :                                                                   \

+        : "r"(tlb)                                                          \

+        : "r1", "r2", "r3", "r4", "r5"                                      \

+    );

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ʹָ¶¨asidµÄËùÓÐtlb±íÏîʧЧ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  asid:   asid Stands for Address Space Identify

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ²Î¼ûck610оƬÊÖ²áÖйØÓÚTLBINVÃüÁîµÄ˵Ã÷

+**************************************************************************/

+static inline void tos_csky_mmu_tlb_invalid(cyg_uint8 asid)

+{

+    asm volatile (                                                          \

+        "cpseti cp15;"          /* select mmu coprocessor */                \

+        "mov    r1, %0;"                                                    \

+        "cpwcr  r1, cpcr4;"     /* MEH = asid       */                      \

+        "lrw    r1, (1<<27);"   /* TLBINV           */                      \

+        "cpwcr  r1, cpcr8;"     /* execute TLBINV   */                      \

+        :                                                                   \

+        : "r"(asid)                                                         \

+        : "r1"                                                              \

+    );

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´ò¿ªcsky´¦ÀíÆ÷µÄmmu¹¦ÄÜ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void tos_csky_mmu_enable(void)

+{

+    asm volatile (                                                          \

+        "mfcr   r1, cr18;"                                                  \

+        "bseti  r1, 0;"                                                     \

+        "bclri  r1, 1;"                                                     \

+        "mtcr   r1, cr18;"                                                  \

+        :                                                                   \

+        :                                                                   \

+        : "r1"                                                              \

+    );

+}

+

+

+#if 0

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¹Ø±Õcsky´¦ÀíÆ÷µÄmmu¹¦ÄÜ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void tos_csky_mmu_disable(void)

+{

+    asm volatile (                                                          \

+        "mfcr   r1, cr18;"                                                  \

+        "bclri  r1, 0;"                                                     \

+        "bclri  r1, 1;"                                                     \

+        "mtcr   r1, cr18;"                                                  \

+        :                                                                   \

+        :                                                                   \

+        : "r1"                                                              \

+    );

+}

+#endif

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÉèÖÃÒ»¸ötlb±íÏî

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  MEL0:   MMU Entry Low 0£¬´æ·ÅPFN(Physical Frame Number)

+                MEL1:   MMU Entry Low 1£¬´æ·ÅPFN(Physical Frame Number)

+                MEH:    MMU Entry High£¬´æ·ÅVPN(Virtual Page Number)

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ²Î¼ûck610оƬÊÖ²áÖйØÓÚTLBWIÃüÁîµÄ˵Ã÷

+**************************************************************************/

+static inline void tos_csky_mmu_tlb_set(cyg_uint32 MEL0, cyg_uint32 MEL1, cyg_uint32 MEH)

+{

+    asm volatile (                                                          \

+        "cpseti cp15;"          /* select mmu coprocessor */                \

+        "mov    r1, %0;"                                                    \

+        "cpwcr  r1, cpcr2;"     /* MEL0             */                      \

+        "mov    r1, %1;"                                                    \

+        "cpwcr  r1, cpcr3;"     /* MEL1             */                      \

+        "mov    r1, %2;"                                                    \

+        "cpwcr  r1, cpcr4;"     /* MEH              */                      \

+        "lrw    r1, (1<<28);"   /* TLBWR            */                      \

+        "cpwcr  r1, cpcr8;"     /* execute TLBWR    */                      \

+        :                                                                   \

+        : "r"(MEL0), "r"(MEL1), "r"(MEH)                                    \

+        : "r1"                                                              \

+    );

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ³õʼ»¯Óû§ÅäÖõÄtlb±íÏî

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     tos_csky_mmu_region±íÏîÒªÇóÈçÏ£¬·ñÔòϵͳ¶ÏÑÔ:

+                1. µ¥¸ö±íÏîÅäÖõÄÎïÀíÆðʼµØÖ·ÐëCSKY_PAGE_SIZE_DEFAULT´óС¶ÔÆë£»

+                2. µ¥¸ö±íÏîÅäÖõÄÐéÄâÆðʼµØÖ·ÐëCSKY_PAGE_SIZE_DEFAULT´óС¶ÔÆë£»

+                3. µ¥¸ö±íÏîÅäÖõÄÒ³´óС²»µÍÓÚCSKY_PAGE_SIZE_DEFAULT;

+                4. Á½¸öÏàÁÚ±íÏîÅäÖõĵØÖ·¿Õ¼ä²»ÄÜÖØµþ;

+**************************************************************************/

+static void tos_csky_mmu_tlb_init(void)

+{

+    cyg_uint32          cnt         = 0;

+    cyg_uint32          page_cnt    = 0;

+    cyg_uint32          MEL0        = 0;

+    cyg_uint32          MEL1        = 0;

+    cyg_uint32          MEH         = 0;

+    cyg_uint32          MIR         = 0;

+    cyg_uint32          addr        = 0;

+    csky_mmu_region_t   *region     = NULL;

+    csky_mmu_region_t   *region_end = ARRAY_END(tos_csky_mmu_region);

+    

+    region = ARRAY_START(tos_csky_mmu_region);

+    for (; region < region_end; region++) 

+    {

+        zOss_ASSERT((region->phy_addr%CSKY_PAGE_SIZE_DEFAULT) == 0);

+        zOss_ASSERT((region->vir_addr%CSKY_PAGE_SIZE_DEFAULT) == 0);

+        zOss_ASSERT(region->size >= CSKY_PAGE_SIZE_DEFAULT);

+        if (region < region_end - 1)

+        {

+            zOss_ASSERT((region->phy_addr + region->size) <= (region + 1)->phy_addr);

+        }

+    }

+    

+    MIR = CSKY_TLB_REG_START;

+    region = ARRAY_START(tos_csky_mmu_region);

+    tos_csky_mmu_region_head = region;

+    for (; region < region_end && MIR < CSKY_TLB_NUM; region++) 

+    {

+        page_cnt = region->size/(2*CSKY_PAGE_SIZE_DEFAULT);

+        if (region->size%(2*CSKY_PAGE_SIZE_DEFAULT))

+        {

+            page_cnt++;

+        }

+        

+        for (cnt = 0x00; cnt < page_cnt; cnt++, MIR++)

+        {

+            addr    = (region->phy_addr + (cnt*2)*CSKY_PAGE_SIZE_DEFAULT) >> CSKY_PFN_OFFSET;

+            MEL0    = addr | region->attr;

+            

+            addr    = (region->phy_addr + (cnt*2+1)*CSKY_PAGE_SIZE_DEFAULT) >> CSKY_PFN_OFFSET;

+            MEL1    = addr | region->attr;

+            

+            MEH     = region->vir_addr + cnt*2*CSKY_PAGE_SIZE_DEFAULT;

+            

+            tos_csky_mmu_tlb_set(MEL0, MEL1, MEH);

+        }

+        

+        region->next = (csky_mmu_region_t *)(region + 1);

+        if (region == region_end - 1)

+        {

+            region->next = NULL;

+        }

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     csky´¦ÀíÆ÷tlbÆ¥Åäʧ°Üʱ±£´æÏÖ³¡

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mismatch:   ʧƥÅä½á¹¹ÌåÖ¸Õ룬ÓÃÓÚ±£´æÏÖ³¡

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void tos_csky_mmu_tlb_mismatch_save_context(csky_tlb_mismatch_t *mismatch)

+{

+    cyg_uint32 MEH = 0x00;

+    cyg_uint32 MCR = 0x00;

+    cyg_uint32 EPC = 0x00;

+

+    zOss_AssertExN(mismatch != NULL);

+    asm volatile (

+        "cprcr  r2, cpcr4;"

+        "cprcr  r3, cpcr5;"

+        "mfcr   r4, epc;"

+        "mov    %0, r2;"

+        "mov    %1, r3;"

+        "mov    %2, r4;"

+        : "=r"(MEH), "=r"(MCR), "=r"(EPC)

+        :

+        : "r2", "r3", "r4"

+    );

+

+    mismatch->MEH       = MEH;

+    mismatch->vpn       = MEH>>12;

+    mismatch->asid      = MEH & ((0x1<<8) - 1);

+

+    mismatch->MCR       = MCR;

+    mismatch->pte_base  = MCR>>22;

+    mismatch->bad_vpn2  = (MCR>>3) & ((0x1<<19) - 1);

+

+    mismatch->epc       = EPC;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     csky´¦ÀíÆ÷tlbÆ¥Åäʧ°ÜÊ±ÖØÌîtlb±íÏî

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mismatch:   ʧƥÅä½á¹¹ÌåÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void tos_csky_mmu_tlb_mismatch_refill(csky_tlb_mismatch_t *mismatch)

+{

+    zOss_ASSERT(mismatch != NULL);

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     csky´¦ÀíÆ÷mmu¹¦Äܳõʼ»¯

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_csky_mmu_init(void)

+{

+    tos_csky_mmu_write_mpr(CSKY_PAGE_MASK_16M);

+

+    tos_csky_mmu_tlb_init();

+

+    tos_csky_mmu_enable();

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     csky´¦ÀíÆ÷tlbÆ¥Åäʧ°Ü

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  reg:    vectors.SÖб£´æµÄÏÖ³¡¼Ä´æÆ÷Õ»Ö¡

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_csky_mmu_tlb_mismatch(HAL_SavedRegisters *reg)

+{

+    tos_csky_mmu_tlb_mismatch_save_context(&tos_csky_tlb_mismatch);

+    tos_csky_mmu_tlb_mismatch_refill(&tos_csky_tlb_mismatch);

+}

+

+#endif  /* CYG_HAL_CSKYCPU_MMU */

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_monitor.c b/cp/ps/plat/src/oss/osa/linux/src/linux_monitor.c
new file mode 100644
index 0000000..fc723d3
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_monitor.c
@@ -0,0 +1,173 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_monitor.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : TOS 3.0²Ù×÷ϵͳÖеÄÖ§³Å²ã¼à¿Ø

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/03/21

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/kernel/kapi.h>

+#include <cyg/hal/hal_io.h>

+#include "oss_api.h"

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define CK_DDR_CTRL_BASE            (0x50001000)

+#define CK_DDR_CTRL_LPDDR_CTL_35    (CK_DDR_CTRL_BASE + 0x8c)

+#define CK_DDR_CTRL_LPDDR_CTL_37    (CK_DDR_CTRL_BASE + 0x94)

+#define CK_DDR_CTRL_LPDDR_CTL_38    (CK_DDR_CTRL_BASE + 0x98)

+

+#define CK_DDR_CTRL_LPDDR_CTL_35_MEM_ACCESS_OUTRANGE    (0x00000003)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct 

+{

+    unsigned int    LPDDR_CTL_35;

+    unsigned int    LPDDR_CTL_37;

+    unsigned int    LPDDR_CTL_38;

+} ddr_monitor_t;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+VOID tos_monitor(VOID) CYGBLD_ATTRIB_SECTION(".ispm");

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static ddr_monitor_t ddr_monitor CYGBLD_ATTRIB_SECTION(".dspm");

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Ö§³Å²ã¼à¿Øº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  VOID

+*   (´«³ö²ÎÊý)  VOID

+* ·µ »Ø Öµ:     VOID

+* ÆäËü˵Ã÷:     VOID

+**************************************************************************/

+VOID tos_monitor(VOID)

+{

+    ddr_monitor.LPDDR_CTL_35 = HAL_REG_UINT32(CK_DDR_CTRL_LPDDR_CTL_35);

+    if (ddr_monitor.LPDDR_CTL_35 & CK_DDR_CTRL_LPDDR_CTL_35_MEM_ACCESS_OUTRANGE) 

+    {

+        ddr_monitor.LPDDR_CTL_37 = HAL_REG_UINT32(CK_DDR_CTRL_LPDDR_CTL_37);

+        ddr_monitor.LPDDR_CTL_38 = HAL_REG_UINT32(CK_DDR_CTRL_LPDDR_CTL_38);

+        zOss_ASSERT(0);

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²âÊÔ¸ú×Ùº¯ÊýÄ£¿é¹¦ÄÜ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  VOID

+*   (´«³ö²ÎÊý)  VOID

+* ·µ »Ø Öµ:     VOID

+* ÆäËü˵Ã÷:     VOID

+**************************************************************************/

+VOID tos_trace_func0(VOID)

+{

+    ZOSS_TRACE_FUNC_START_ALWAYS();

+    zOss_Sleep(1000);

+    ZOSS_TRACE_FUNC_END_ALWAYS();

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²âÊÔ¸ú×Ùº¯ÊýÄ£¿é¹¦ÄÜ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  VOID

+*   (´«³ö²ÎÊý)  VOID

+* ·µ »Ø Öµ:     VOID

+* ÆäËü˵Ã÷:     VOID

+**************************************************************************/

+VOID tos_trace_func1(VOID)

+{

+    ZOSS_TRACE_FUNC_START_ALWAYS();

+    zOss_Sleep(1000);

+    ZOSS_TRACE_FUNC_END_ALWAYS();

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²âÊÔ¸ú×Ùº¯ÊýÄ£¿é¹¦ÄÜ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  VOID

+*   (´«³ö²ÎÊý)  VOID

+* ·µ »Ø Öµ:     VOID

+* ÆäËü˵Ã÷:     VOID

+**************************************************************************/

+VOID tos_trace_func2(VOID)

+{

+    ZOSS_TRACE_FUNC_START_ALWAYS();

+    zOss_Sleep(1000);

+    ZOSS_TRACE_FUNC_END_ALWAYS();

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²âÊÔitcmºÍdtcmÄ£¿é¹¦ÄÜ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  VOID

+*   (´«³ö²ÎÊý)  VOID

+* ·µ »Ø Öµ:     VOID

+* ÆäËü˵Ã÷:     VOID zOss_Sleep(UINT32 time_in_ms) __attribute__((long_call));

+**************************************************************************/

+VOID __tcm_func tos_itcm_func(VOID)

+{

+    for(;;) 

+    {

+        static unsigned int cnt = 0;

+        static int tos_dtcm_data[1000] CYGBLD_ATTRIB_SECTION(".dtcm");

+        

+        tos_dtcm_data[cnt] = (int)cnt;

+        if (++cnt >= sizeof(tos_dtcm_data)/sizeof(tos_dtcm_data[0]))

+        {

+            cnt = 0x00;

+        }

+        zOss_Sleep(1000);

+    }

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_mpu_arm_cp15.S b/cp/ps/plat/src/oss/osa/linux/src/linux_mpu_arm_cp15.S
new file mode 100644
index 0000000..0800101
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_mpu_arm_cp15.S
@@ -0,0 +1,163 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2014 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : mpuÄ£¿é

+* ÎÄ ¼þ Ãû : tos_mpu_cp15.S

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : mpu»ã±à²Ù×÷

+* ×÷    Õß : µËÄþˆÒ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2014/04/10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 

+* ÐÞ ¸Ä ÈË : 

+* ÐÞ¸ÄÈÕÆÚ : 

+* ÐÞ¸ÄÄÚÈÝ : 

+**************************************************************************/

+.code 32

+.text

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+.global mpu_RegionNumSet

+.type mpu_RegionNumSet, %function

+.align 4

+mpu_RegionNumSet:                           //set region number, select region

+	mcr		p15, 0, r0, c6, c2, 0

+	bx		lr

+

+.global mpu_RegionBaseSet

+.type mpu_RegionBaseSet, %function

+.align 4

+mpu_RegionBaseSet:                          //set region base address				

+	bic		r0, r0, #0x1f

+	mcr		p15, 0, r0, c6, c1, 0

+	bx		lr

+	

+.global mpu_RegionBaseGet

+.type mpu_RegionBaseGet, %function

+.align 4

+mpu_RegionBaseGet:                          //get region base address

+	mrc		p15, 0, r0, c6, c1, 0

+	bx		lr

+

+.global mpu_RegionAttrSet

+.type mpu_RegionAttrSet, %function

+.align 4

+mpu_RegionAttrSet:                          //set region attribution

+	mcr		p15, 0, r0, c6, c1, 4

+	bx		lr

+

+.global mpu_RegionAttrGet

+.type mpu_RegionAttrGet, %function

+.align 4

+mpu_RegionAttrGet:                          //get region attribution 

+	mrc		p15, 0, r0, c6, c1, 4

+	bx		lr

+

+.global mpu_RegionSizeSet

+.type mpu_RegionSizeSet, %function

+.align 4

+mpu_RegionSizeSet:                          //set region size

+	push 	{r1, lr}

+	mrc		p15, 0, r1, c6, c1, 2

+	bic		r1, r1, #0x3e

+	orr		r1, r1, r0, lsl #1

+	mcr		p15, 0, r1, c6, c1, 2

+	pop		{r1, pc}

+    

+.global mpu_RegionSizeGet

+.type mpu_RegionSizeGet, %function

+.align 4

+mpu_RegionSizeGet:                          //get region size and enable reg	

+	mrc		p15, 0, r0, c6, c1, 2 

+	bx		lr

+

+.global mpu_SubRegionSet

+.type mpu_SubRegionSet, %function

+.align 4

+mpu_SubRegionSet:                           //sub-region set

+	push 	{r1, lr}

+	mrc		p15, 0, r1, c6, c1, 2

+	bic		r1, r1, #0xff00

+	orr		r1, r1, r0, lsl #8

+	dsb

+	mcr		p15, 0, r1, c6, c1, 2

+	isb

+	pop		{r1, pc}

+

+.global mpu_RegionSwitch

+.type mpu_RegionSwitch, %function

+.align 4

+mpu_RegionSwitch:                           //region switch

+	push 	{r1, lr}

+	mrc		p15, 0, r1, c6, c1, 2

+	bic		r1, r1, #0x1

+	orr		r1, r1, r0

+	dsb

+	mcr		p15, 0, r1, c6, c1, 2

+	isb

+	pop		{r1, pc}

+

+

+.global mpu_RegionMaxNum

+.type mpu_RegionMaxNum, %function           //get region max num

+.align 4

+mpu_RegionMaxNum:

+    mrc     p15, 0, r0, c0, c0, 4

+    mov     r0, r0, lsr #8

+    bx      lr

+

+.global mpu_DFSRValueGet

+.type mpu_DFSRValueGet, %function           //get DFSR

+.align 4

+mpu_DFSRValueGet:

+    mrc     p15, 0, r0, c5, c0, 0

+    bx      lr

+

+.global mpu_DFARValueGet

+.type mpu_DFARValueGet, %function           //get DFAR

+.align 4

+mpu_DFARValueGet:

+    mrc     p15, 0, r0, c6, c0, 0

+    bx      lr

+

+.global mpu_IFSRValueGet

+.type mpu_IFSRValueGet, %function           //get IFSR

+.align 4

+mpu_IFSRValueGet:

+    mrc     p15, 0, r0, c5, c0, 1

+    bx      lr

+

+.global mpu_IFARValueGet

+.type mpu_IFARValueGet, %function           //get IFAR

+.align 4

+mpu_IFARValueGet:

+    mrc     p15, 0, r0, c6, c0, 2

+    bx      lr

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+.global zTos_MpuSwitch

+.type zTos_MpuSwitch, %function

+.align 4

+zTos_MpuSwitch:                             //mpu switch

+	push 	{r1, lr}

+	mrc		p15, 0, r1, c1, c0, 0

+	bic		r1, r1, #0x1

+	orr		r1, r1, r0

+	dsb

+	mcr		p15, 0, r1, c1, c0, 0

+	isb

+	pop		{r1, pc}

+    

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_mpu_map.c b/cp/ps/plat/src/oss/osa/linux/src/linux_mpu_map.c
new file mode 100644
index 0000000..940e5ba
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_mpu_map.c
@@ -0,0 +1,103 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : mpuÄ£¿é

+* ÎÄ ¼þ Ãû : linux_mpu_map.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : mpu³õʼ»¯

+* ×÷    Õß : µËÄþˆÒ

+* °æ    ±¾ : v1.0

+* Íê³ÉÈÕÆÚ : 2014/4/10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define MPU_TYPE_REGISTER_DREGION_POS   (8)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷

+**************************************************************************/

+extern void mpu_RegionNumSet(unsigned int num);

+extern unsigned int mpu_RegionBaseGet(void);

+extern unsigned int mpu_RegionAttrGet(void);

+extern unsigned int mpu_RegionSizeGet(void);

+extern unsigned int mpu_RegionMaxNum(void);

+extern unsigned int mpu_DFSRValueGet(void);

+extern unsigned int mpu_DFARValueGet(void);

+extern unsigned int mpu_IFSRValueGet(void);

+extern unsigned int mpu_IFARValueGet(void);

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÔÚramdumpÉú³ÉµÄT32½Å±¾ÖÐÊä³ömpu¼Ä´æÆ÷ÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  addr --Êä³ö×Ö·û´®µÄÆðʼµØÖ·

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ×Ö·û´®µÄÖÕÖ¹µØÖ·

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+char *ramdump_mpu_cp15(char *addr)

+{

+    unsigned int i = 0;

+	char* p_addr = addr;

+    

+    p_addr += sprintf(p_addr, "per.s c15:0x4 %%long %#lx\r\n", (unsigned long)((mpu_RegionMaxNum() << MPU_TYPE_REGISTER_DREGION_POS)));    

+    for(i = 0; i < mpu_RegionMaxNum(); i++)

+    {

+        p_addr += sprintf(p_addr, "per.s c15:0x26 %%long %#lx\r\n",  (unsigned long)i);    

+        mpu_RegionNumSet(i);

+        p_addr += sprintf(p_addr, "per.s c15:0x16 %%long %#lx\r\n",  (unsigned long)(mpu_RegionBaseGet()));    

+        p_addr += sprintf(p_addr, "per.s c15:0x216 %%long %#lx\r\n", (unsigned long)(mpu_RegionSizeGet()));    

+        p_addr += sprintf(p_addr, "per.s c15:0x416 %%long %#lx\r\n", (unsigned long)(mpu_RegionAttrGet()));    

+    }

+

+    /* DFSR/DFAR IFSR/IFAR */

+    p_addr += sprintf(p_addr, "per.s c15:0x5 %%long %#lx\r\n",   (unsigned long)(mpu_DFSRValueGet()));    

+    p_addr += sprintf(p_addr, "per.s c15:0x6 %%long %#lx\r\n",   (unsigned long)(mpu_DFARValueGet()));    

+    p_addr += sprintf(p_addr, "per.s c15:0x105 %%long %#lx\r\n", (unsigned long)(mpu_IFSRValueGet()));    

+    p_addr += sprintf(p_addr, "per.s c15:0x206 %%long %#lx\r\n", (unsigned long)(mpu_IFARValueGet()));    

+

+    return p_addr;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_ramdump.c b/cp/ps/plat/src/oss/osa/linux/src/linux_ramdump.c
new file mode 100644
index 0000000..b85800c
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_ramdump.c
@@ -0,0 +1,80 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû :  tos_ramdump.c

+* ÎÄ ¼þ Ãû :  tos_ramdump.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ :  ʵÏÖTOS²Ù×÷ϵͳRamdumpÏà¹ØµÄ¹¦ÄÜ

+* ×÷    Õß :  ¸ß»ª·å

+* °æ    ±¾ :  v1.0

+* Íê³ÉÈÕÆÚ :  2013/10/28

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "sup_ramdump.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_RamdumpEncodeError

+* ¹¦ÄÜÃèÊö£º ÏòLCDÏÔʾ»ù±¾µÄÒì³£ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º (IN):

+*                  pBuff: ÄÚÈÝÖ¸Õë

+*                  user_called: ÎªÕæÊ±,±íʾ´íÎóÀ´×ÔÓû§µ÷ÓÃ,Ϊ¼Ùʱ,±íʾ´íÎóÀ´×ÔÄÚºË

+*                  ecode: ´íÎóÂë

+*                  extra: ´íÎ󸽼ÓÂë

+*            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_RamdumpEncodeError(CHAR *pBuff, UINT16 user_called, UINT16 ecode, UINT16 extra)

+{    

+    zOss_RamdumpSaveRegisters();

+    

+    /* ramdump ´¦Àí֮ǰµÄhook */

+    if (g_zRamdump_Optfunc.ramdump_Process_PreHook != NULL)

+    {

+        g_zRamdump_Optfunc.ramdump_Process_PreHook();

+    }

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_ramdump_arm.c b/cp/ps/plat/src/oss/osa/linux/src/linux_ramdump_arm.c
new file mode 100644
index 0000000..e4dc44f
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_ramdump_arm.c
@@ -0,0 +1,961 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_ramdump_arm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2012/06/18

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#if 0

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "linux_ramdump.h"

+#include "comm_api.h"

+#include "hal_comm.h"

+#include "sys_func_atcfg.h"

+#include "linux_except_arm.h"

+#include "linux_mem.cfg"

+#ifdef _USE_ARM1_RAMDUMP

+#include "drvs_icp.h"

+#include "ps_ephy_interface.h"

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+#include "drvs_usbpoll.h"

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+extern VOID zOss_RamdumpSaveRegisters(VOID);

+extern UINT32 cp15_readControlRegister( VOID );

+extern UINT32 cp15_readDomainRegister( VOID );

+extern UINT32 cp15_readTTB( VOID );

+extern cyg_bool zTos_MmuGetReadableRegion(cyg_uint32 start, cyg_uint32 end, cyg_uint32 *p_start, cyg_uint32 *p_end);

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* ¹æ»®·ÖÅäµÄÄÚ´æ¿Õ¼äËÄ×Ö½Ú¶ÔÆë */

+#define CMM_BUFFER_SIZE                     4096    /* 4k */

+#define CONFIGURED_REGIONS_SIZE             4096    /* 4K */

+#define PARSED_REGIONS_SIZE                 4096    /* 4K */

+#define RAMDUMP_FILE_SIZE                   2048    /* 2K */

+#define ERROR_CODE_SIZE                     1024    /* 1k */ 

+#define IO_READ_BUFFER                      1024    /* 1K */

+#define IO_WRITE_BUFFER                     1024    /* 1k */

+

+#ifdef _USE_ARM1_RAMDUMP

+#define HIGHMEM_FLAG_ARM02ARM1_SIZE         (4)

+#define HIGHMEM_FLAG_ARM12ARM0_SIZE         (4)

+#endif

+/* io read/write buffer: [msg][data] */

+#define RAMDUMP_IO_DATA_BASE(addr)          ((UINT32)addr + 4)

+

+/* T_RamdumpCmmFileInfo */

+#define CMM_FILE_BUF_SIZE(addr)             (*(UINT32 *)addr)

+#define CMM_FILE_BUF_BASE(addr)             ((UINT32)addr + 4)

+

+

+/* RamdumpÎļþµÄÃû×Ö */

+#define RAMDUMP_DIR_NAME                    "ramdump_dir"   /* ±£´æramdumpĿ¼Ãû    */

+#define RAM_ARM0_NAME                       "arm0_ram.bin"  /* ±£´æarm0_ramÎļþÃû   */

+

+#ifdef _USE_ARM1_RAMDUMP

+#define RAM_ARM1_NAME                       "arm1_memory.bin"  /* ±£´æarm1_ramÎļþÃû   */

+#define RAMDUMP_FLAG                        0x22222222

+#define HIGHMEM_ARM1_CMM_INFO_BASE          0x20060000

+#define HIGHMEM_ARM1_CONFIGURED_REGION_BASE (HIGHMEM_ARM1_CMM_INFO_BASE             + CMM_BUFFER_SIZE)

+#define HIGHMEM_ARM1_PARSED_REGION_BASE     (HIGHMEM_ARM1_CONFIGURED_REGION_BASE    + CONFIGURED_REGIONS_SIZE)

+#define HIGHMEM_ARM1_FLAG_ARM02ARM1_BASE    (HIGHMEM_ARM1_PARSED_REGION_BASE        + PARSED_REGIONS_SIZE + ERROR_CODE_SIZE)

+#define HIGHMEM_ARM1_FLAG_ARM12ARM0_BASE    (HIGHMEM_ARM1_FLAG_ARM02ARM1_BASE       + HIGHMEM_FLAG_ARM02ARM1_SIZE)

+

+#define ARM0_NOFITY_ARM1                                            \

+    ramdump_send_msg_to_arm1();                                     \

+    *(UINT32 *)HIGHMEM_ARM1_FLAG_ARM02ARM1_BASE = RAMDUMP_FLAG

+    

+#define ARM0_WAIT_ARM1                                              \

+    while (RAMDUMP_FLAG != *(volatile UINT32*)HIGHMEM_ARM1_FLAG_ARM12ARM0_BASE) {}

+        

+#ifdef _USE_PSM

+extern  SINT32 zOss_PsmGetSleepFlag(VOID);   /* arm1˯Ãß±êÖ¾½Ó¿Ú */

+extern  VOID   zL1e_WriteWakeUpEphyToRam(VOID);

+

+#define ARM0_WAIT_DDR1_READY                                        \

+    zL1e_WriteWakeUpEphyToRam();                                    \

+    while ( PSM_DEEP_SLEEP == (UINT32)zOss_PsmGetSleepFlag() ) {}

+#endif

+

+#endif

+

+#ifdef __GNUC__

+

+#ifdef __thumb__

+# define HAL_ARM_MODE(reg)                                          \

+    "adr    "#reg", 1f;"                                            \

+    "bx     "#reg";"                                                \

+    ".arm   ;"                                                      \

+    "1:     ;"

+

+# define HAL_THUMB_MODE(reg)                                        \

+    "adr    "#reg", 1f + 1;"                                        \

+    "bx     "#reg";"                                                \

+    "1:     ;"                                                      \

+    ".thumb ;"

+

+# define HAL_ARM_THUMB_REG(reg)                                     \

+    ""#reg""

+#else

+

+# define HAL_ARM_MODE(reg)      ";"

+# define HAL_THUMB_MODE(reg)    ";"

+# define HAL_ARM_THUMB_REG(reg)

+

+# endif

+

+#define HAL_CLEAN_FLASH_CACHE()                                     \

+    do                                                              \

+    {                                                               \

+        asm volatile (                                              \

+            HAL_ARM_MODE(r0)                                        \

+            "mov r0, #0;"                                           \

+            "mcr p15, 0, r0, c7, c14, 0;"                           \

+            "mcr p15, 0, r0, c7, c5, 0;"                            \

+            "mcr p15, 0, r0, c7, c15, 0;"                           \

+            "mcr p15, 0, r0, c7, c10, 4;"                           \

+            HAL_THUMB_MODE(r0)                                      \

+            :                                                       \

+            :                                                       \

+            :"r0"                                                   \

+        );                                                          \

+    }while(0)

+

+#elif defined (__ARMCC_VERSION)

+

+#define HAL_CLEAN_FLASH_CACHE()                                     \

+    do                                                              \

+    {                                                               \

+        asm {                                                       \

+            mov ip,  0;                                             \

+            mcr p15, 0, ip, c7, c14, 0;                             \

+            mcr p15, 0, ip, c7, c5, 0;                              \

+            mcr p15, 0, ip, c7, c15, 0;                             \

+            mcr p15, 0, ip, c7, c10, 4;                             \

+        }                                                           \

+    }while(0)

+    

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    UINT32 cmmFileSize;

+    CHAR   cmmFileBuffer[1];    /* cmmÎļþ»º³å£¬ºóÃæ»¹Óпռä */

+}T_RamdumpCmmFileInfo;

+

+typedef struct

+{

+    CHAR *cmmBuffer;                /* ´æ·ÅÉú³ÉµÄ»Ö¸´ÏÖ³¡½Å±¾µÄ»ùÖ· */

+    CHAR *configured_regions_info;  /* ´æ·Å³õʼ»¯ÄÚ´æ¶Î»ù´¡         */

+    CHAR *parsed_regions_info;      /* ´æ·ÅÐèµ¼³öµÄÄÚ´æ¶Î»ù´¡       */

+    CHAR *ramdump_file_info;        /* ´æ·Å´«ÊäÊý¾ÝµÄÎļþÐÅÏ¢       */

+    CHAR *ioReadBuffer;             /* ´«ÊäÊý¾ÝµÄ¶Á»º³å»ùÖ·         */

+    CHAR *ioWriteBuffer;            /* ´«ÊäÊý¾ÝµÄд»º³å»ùÖ·         */

+}T_RamDumpCfg;

+

+typedef struct

+{

+    CHAR    fileName[DUMPFILENMAE_LEN]; /* ÎļþÃû       */

+    UINT32  baseAddr;                   /* ÄÚ´æ»ùµØÖ·   */

+    UINT32  size;                       /* ´óС         */

+} T_RamdumpFile;

+

+typedef struct

+{

+    UINT32          fileNum;        /* Îļþ¸öÊý          */

+    T_RamdumpFile   fileInfo[1];    /* ºóÐø¿ÉÄÜ»¹ÓÐÊý¾Ý  */

+} T_RamdumpFileInfo;

+

+typedef struct

+{

+   UINT32   start_addr;

+   UINT32   end_addr;

+   UINT32   map_start_addr;

+   UINT32   copy_start_addr;

+}T_RamdumpRegion;

+

+typedef struct

+{

+   UINT32           region_num;

+   T_RamdumpRegion  regions[1]; /* ºóÐø¿ÉÄÜ»¹ÓÐÊý¾Ý */

+} T_RamdumpRegionInfo;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID ramdump_main(VOID);

+static VOID ramdump_transfer_data(VOID);

+static VOID ramdump_create_cmm_file(VOID);

+static VOID ramdump_save_file_info( const CHAR *name, UINT32 base_addr, UINT32 size );

+static VOID ramdump_save_region_file_info( T_RamdumpRegionInfo *p_region_info, const CHAR *file_name );

+static VOID IO_ReadData(UINT8 *buffer, UINT32 size);

+static VOID IO_WriteData(UINT8 *buffer, UINT32 size);

+static VOID ramdump_get_available_region( UINT32 memAddBegin, UINT32 end, UINT32 map_base, UINT32 copy_base,UINT32 memorybase );

+static VOID ramdump_parse_region_info( UINT32 configured_region_base, UINT32 parsed_region_base );

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static struct cpu_regdump *Osa_ArmExceptDump = NULL;

+static UINT8 Osa_ArmMode[6] =   /* Êý×é˳ÐòÓëstruc coreÖеÄ˳ÐòÒ»Ö£¬²»Äܸü¸Ä */

+{

+    0xdf,   /* SYS */

+    0xd3,   /* SVC */

+    0xd7,   /* ABT */

+    0xdb,   /* UND */

+    0xd2,   /* IRQ */

+    0xd1,   /* FIQ */

+}; 

+

+static CHAR *Osa_BankRegsiter[3]    = {(CHAR *)"r13", (CHAR *)"r14", (CHAR *)"spsr"};

+struct cpu_core Osa_CoreRegisters   = {0};

+static T_RamDumpCfg  gOsa_Ramdump   = {0};  /* ±£´æramdumpµÄÅäÖÃÐÅÏ¢ */

+

+static T_RamdumpCmmFileInfo *g_cmm_file_info            = NULL;

+static UINT32                g_cmm_file_max             = 0;

+static T_RamdumpRegionInfo  *g_configured_regions_info  = NULL;

+static UINT32                g_configured_regions_max   = 0;

+static T_RamdumpRegionInfo  *g_parsed_regions_info      = NULL;

+static UINT32                g_parsed_regions_max       = 0;

+static T_RamdumpFileInfo    *g_ramdump_file_info        = NULL;

+static UINT32                g_ramdump_file_max         = 0;

+static T_zOss_RamdumpIoOpt  g_zRamdumpIoOpt = { zOss_RamdumpUsbInit,  zOss_RamdumpUsbReadData,

+                                                zOss_RamdumpUsbWriteData, zOss_RamdumpUsbFinish};

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/* Read CPSR register */

+static inline UINT32 ARMV4T_READ_CPSR_REG(void)

+{

+    UINT32 control_reg = 0;

+

+#ifdef __GNUC__

+    asm volatile (

+        HAL_ARM_MODE(r1)

+        "MRS  %0, CPSR;"

+        HAL_THUMB_MODE(r1)

+        :"+r"(control_reg)

+        :

+        :HAL_ARM_THUMB_REG(r1)

+    );

+#elif defined (__ARMCC_VERSION)

+    __asm {

+        MRS  control_reg, CPSR

+    }

+#endif

+

+    return control_reg;

+}

+

+/******************************************************************************

+ * º¯ÊýÃû³Æ£º  ramdump_transfer_data

+ * ¹¦ÄÜÃèÊö£º  ÓëPC²à¹¤¾ß½øÐн»»¥£¬´«µÝÐèÒª±£´æµÄÊý¾Ý

+ * ²ÎÊý˵Ã÷£º  (IN):

+ *                               pRamdkumpInfo:ÎļþÐÅÏ¢

+ *                              (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ *******************************************************************************/

+static VOID ramdump_transfer_data()

+{

+    CHAR            *reqBuffer  = gOsa_Ramdump.ioReadBuffer;    /* ÇëÇóÏûÏ¢»º³åÇø   */

+    CHAR            *rspBuffer  = gOsa_Ramdump.ioWriteBuffer;   /* »ØÓ¦ÏûÏ¢»º³åÇø   */

+    UINT32          rspDataLen  = 0;                            /* »ØÓ¦ÏûÏ¢³¤¶È     */

+    UINT32          *reqCmd     = NULL;

+    UINT32          *rspCmd     = NULL;

+    T_RamdumpFile   *fileInfo   = NULL;

+    

+    rspCmd      = (UINT32 *)rspBuffer;

+    reqCmd      = (UINT32 *)reqBuffer;

+    fileInfo    = g_ramdump_file_info->fileInfo;

+    

+    g_zRamdumpIoOpt.init();

+    

+    for(;;)

+    {

+        /* ´ÓͨѶ¿Ú¶ÁÊý¾Ý */

+        g_zRamdumpIoOpt.read((UINT8 *)reqBuffer, CMD_BUFFER_LEN);

+        

+        switch (*reqCmd)

+        {

+        case DUMPFILE_LINK_REQ: /* ͬ²½ÇëÇó */

+            {

+                T_DUMPFILE_LINK_RSP *rspMsg;

+                *rspCmd = DUMPFILE_LINK_RSP;

+                rspMsg = (T_DUMPFILE_LINK_RSP *)RAMDUMP_IO_DATA_BASE(rspBuffer);

+                rspMsg->fileNum = g_ramdump_file_info->fileNum;

+                rspDataLen = sizeof(*rspCmd) + sizeof(T_DUMPFILE_LINK_RSP);

+                break;

+            }

+        case DUMPFILE_FILE_REQ: /* ¶ÁÈ¡ÎļþÐÅÏ¢£¬¿ªÊ¼´«ÊäÎļþÇëÇó */

+            {

+                T_DUMPFILE_FILE_REQ *reqMsg;

+                T_DUMPFILE_FILE_RSP *rspMsg;

+                *rspCmd = DUMPFILE_FILE_RSP;

+                reqMsg = (T_DUMPFILE_FILE_REQ *)RAMDUMP_IO_DATA_BASE(reqBuffer);

+                rspMsg = (T_DUMPFILE_FILE_RSP *)RAMDUMP_IO_DATA_BASE(rspBuffer);

+                

+                /* ÅжÏÎļþ±àºÅÊÇ·ñÕýÈ· */

+                if (reqMsg->fileNo < g_ramdump_file_info->fileNum)

+                {

+                    strcpy((char *)rspMsg->fileName, (char *)fileInfo[reqMsg->fileNo].fileName);

+                    rspMsg->size = fileInfo[reqMsg->fileNo].size;

+                    rspDataLen = sizeof(*rspCmd) + sizeof(T_DUMPFILE_FILE_RSP);

+                }

+                else

+                {

+                    *rspCmd = DUMPFILE_NO_FAIL;

+                    rspDataLen = sizeof(*rspCmd);

+                }

+                

+                break;

+            }

+        case DUMPFILE_READ_REQ: /* ¶ÁÈ¡ÎļþÄÚÈÝ */

+            {

+                T_DUMPFILE_READ_REQ *reqMsg;

+                *rspCmd = DUMPFILE_READ_RSP;

+                rspDataLen = sizeof(*rspCmd);

+                reqMsg = (T_DUMPFILE_READ_REQ *)RAMDUMP_IO_DATA_BASE(reqBuffer);

+                

+                if (reqMsg->fileNo >= g_ramdump_file_info->fileNum)

+                {

+                    *rspCmd = DUMPFILE_LENGTH_FAIL;

+                    break;

+                }

+                

+                if (reqMsg->offset + reqMsg->length > fileInfo[reqMsg->fileNo].size)

+                {

+                    *rspCmd = DUMPFILE_NO_FAIL;

+                    break;

+                }

+                

+                g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, rspDataLen);

+                g_zRamdumpIoOpt.write((UINT8 *)(fileInfo[reqMsg->fileNo].baseAddr + reqMsg->offset), reqMsg->length);

+                continue;   /* ¼ÌÐøÖ´ÐÐÏÂÒ»´Î¶Á */

+            }

+        case DUMPFILE_END_REQ:  /* ´«Êä½áÊø */

+            {

+                *rspCmd = DUMPFILE_END_RSP;

+                rspDataLen = sizeof(*rspCmd);

+                g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, rspDataLen);

+                g_zRamdumpIoOpt.finish();

+                return;

+            }

+        default:    /* ´íÎóÖ¸Áî */

+            {

+                *rspCmd = DUMPFILE_CMD_FAIL;

+                rspDataLen = sizeof(*rspCmd);

+                break;

+            }

+        }

+        

+        /* ÏòͨѶ¿ÚдÊý¾Ý */

+        g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, rspDataLen);

+    }

+}

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_create_cmm_file

+ * ¹¦ÄÜÃèÊö£º Éú³É»Ö¸´¶ÑÕ»µÄT32½Å±¾

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *                             (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+static VOID ramdump_create_cmm_file(VOID )

+{

+    char    *cmmAddress = NULL;

+    UINT32  *paddress   = NULL; 

+    UINT32  length      = 0;

+    UINT32  value       = 0;

+    UINT32  control_reg = 0;

+    int     i           = 0;

+    int     j           = 0;

+    

+    cmmAddress = (char *)g_cmm_file_info->cmmFileBuffer;

+    

+    length = (UINT32)sprintf( cmmAddress, "ENTRY &%s\r\n", RAMDUMP_DIR_NAME );

+    cmmAddress += length;

+    

+    if(Osa_ArmExceptDump != NULL)

+    {

+        value = Osa_ArmExceptDump->pc;

+    }

+    else

+    {

+        value = Osa_CoreRegisters.supervisor.lr;

+    }

+    length = (UINT32)sprintf(cmmAddress, "r.s pc %#lx\r\n", value);

+    cmmAddress += length;

+    

+    /* Çл»µ½svcģʽ£¬»¹Ô­r0-r12 */

+    length = (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", (UINT32)Osa_ArmMode[0]);

+    cmmAddress += length;

+    

+    for(i = 0; i < 13; i++)

+    {

+        length = (UINT32)sprintf(cmmAddress, "r.s r%d %#lx\r\n", i, Osa_CoreRegisters.r[i]);

+        cmmAddress += length;

+    }

+    

+    paddress = (UINT32 *)(&Osa_CoreRegisters.user.sp);

+    /* Êä³ö³ýfiqÖ®ÍâµÄÆäËûģʽ±¸·Ý¼Ä´æÆ÷ */

+    for(i = 0; i < 5; i++)

+    {

+        length = (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", (UINT32)Osa_ArmMode[i]);

+        cmmAddress += length;

+        for(j = 0; j < 3; j++)

+        {

+            length = (UINT32)sprintf(cmmAddress, "r.s %s %#lx\r\n", Osa_BankRegsiter[j], *paddress);

+            cmmAddress += length;

+            paddress++; 

+        }

+    }

+    

+    /* Êä³öFIQ r8-r14 */

+    length = (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", (UINT32)Osa_ArmMode[5]);

+    cmmAddress += length;

+    for(i = 8; i < 15; i++)

+    {

+        length = (UINT32)sprintf(cmmAddress, "r.s r%d %#lx\r\n", i, *paddress);

+        cmmAddress += length;

+        paddress++;

+    }

+    /* Êä³öFIQ spsr */

+    length = (UINT32)sprintf(cmmAddress, "r.s spsr %#lx\r\n", *paddress);

+    cmmAddress += length;

+    

+    /* Êä³öcpsr */

+    if(Osa_ArmExceptDump != NULL)

+    {

+        switch(Osa_ArmExceptDump->vector)

+        {

+        case 0x04:  /* undefined instruction */

+            {

+                value = Osa_CoreRegisters.undefined.psr;

+                break;

+            }

+        case 0x0C:  /* prefetch abort */

+            {

+                value = Osa_CoreRegisters.abort.psr;

+                break;

+            }

+        case 0x10:  /* data abort */

+            {

+                value = Osa_CoreRegisters.abort.psr;

+                break;

+            }

+        case 0x18:  /* IRQ */

+            {

+                value = Osa_CoreRegisters.irq.psr;

+                break;

+            }

+        case 0x1C:  /* FIQ */

+            {

+                value = Osa_CoreRegisters.fiq.psr;

+                break;

+            }

+        default:

+            {

+                break;

+            }

+        }

+    }

+    else

+    {

+        value = ARMV4T_READ_CPSR_REG();

+    }

+    length = (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", value);

+    cmmAddress += length;

+    

+    control_reg = cp15_readControlRegister();

+    /* ½ûÖ¹MMU */   

+    length = (UINT32)sprintf(cmmAddress, "per.s c15:0x1 %%long %#lx\r\n", (control_reg & 0xfffffffe));  

+    cmmAddress += length;

+    

+    /* Êä³öramdump ÄÚ´æ¶ÎÎļþ */

+    for ( i = 0; i < (int)g_parsed_regions_info->region_num; i++)

+    {   

+        length = (UINT32)sprintf(cmmAddress, "data.load.binary &%s\\%s_%d %#lx--%#lx /noclear\r\n",RAMDUMP_DIR_NAME, RAM_ARM0_NAME,i,

+                                 g_parsed_regions_info->regions[i].start_addr ,g_parsed_regions_info->regions[i].end_addr);

+        cmmAddress += length;

+    }

+    /* Êä³öcp15 c1 MMU¿ØÖƼĴæÆ÷ */

+    control_reg = cp15_readControlRegister();

+    length = (UINT32)sprintf(cmmAddress, "per.s c15:0x1 %%long %#lx\r\n", control_reg);

+    cmmAddress += length;

+    

+    /* Êä³öcp15 c2 MMUÒ³±í¼Ä´æÆ÷ */

+    control_reg = cp15_readTTB();

+    length = (UINT32)sprintf(cmmAddress, "per.s c15:0x2 %%long %#lx\r\n", control_reg);

+    cmmAddress += length;

+    

+    /* Êä³öcp15 c3 MMUÓò¼Ä´æÆ÷ */

+    control_reg = cp15_readDomainRegister();

+    length = (UINT32)sprintf(cmmAddress, "per.s c15:0x3 %%long %#lx\r\n", control_reg);

+    cmmAddress += length;

+    

+    /* Êä³ö½áÊø·û */

+    length = (UINT32)sprintf(cmmAddress, "ENDDO\r\n");

+    cmmAddress += length;

+    

+    g_cmm_file_info->cmmFileSize = (UINT32)(cmmAddress - g_cmm_file_info->cmmFileBuffer);

+    zOss_AssertExN( g_cmm_file_info->cmmFileSize <= g_cmm_file_max );

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º  ramdump_get_available_region

+ * ¹¦ÄÜÃèÊö£º  ¶ÔĬÈÏÅäÖõÄÄÚ´æ¿éÊý¾ÝÓëMMU½âÎöµÄÄÚ´æ¿éÊý¾Ý¶Ô±È£¬

+                                 ±£´æ¿Éµ¼³öÀ´µÄÄÚ´æ¿é

+ * ²ÎÊý˵Ã÷£º (IN):  ÄÚ´æ¿éµÄÆðʼµØÖ·start£¬½áÊøµØÖ·end,½âÎöºóÄÚ´æ¿éÊý

+                                  ¾ÝµÄдÈëµØÖ·memorybase

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_get_available_region( UINT32 memAddBegin, UINT32 end, UINT32 map_base, UINT32 copy_base,UINT32 memorybase )

+{

+    UINT32 region_start = 0;

+    UINT32 region_end   = 0;

+    UINT32 region_cnt   = 0;

+    UINT32 *addr        = NULL;

+    

+    zOss_ASSERT( memAddBegin <= end );

+

+    region_cnt = *(UINT32 *)memorybase; /* ÒÑÓÐÄÚ´æ¿éÊýÄ¿ */

+    zOss_AssertExN( region_cnt < g_parsed_regions_max );

+    addr = (UINT32 *)memorybase + region_cnt * 4 + 1;   /* ¼ÆËãµØÖ·Æ«ÒÆ */

+    while ( zTos_MmuGetReadableRegion(memAddBegin, end, (cyg_uint32 *)&region_start, (cyg_uint32 *)&region_end) )

+    {

+        *addr++ = region_start;

+        *addr++ = region_end;

+        if(map_base != memAddBegin)

+        {

+           *addr++ = map_base  + region_start - memAddBegin;

+        }

+        else

+        {

+           *addr++ = map_base;

+        }

+        if(copy_base != 0)

+        {

+            *addr++ = copy_base + region_start - memAddBegin;

+        }

+        else

+        {

+            *addr++ = 0;

+        }

+        region_cnt ++;

+ 

+        memAddBegin = region_end + 1;

+        if (memAddBegin < region_end) break;

+    }

+    *(UINT32 *)memorybase = region_cnt;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_parse_region_info

+ * ¹¦ÄÜÃèÊö£º½âÎöÄÚ´æ¿éÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN): ĬÈÏÅäÖõØÖ·£¬½âÎöÍê³ÉµØÖ·

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_parse_region_info( UINT32 configured_region_base, UINT32 parsed_region_base )

+{   

+    UINT32 i = 0;

+    T_RamdumpRegionInfo *p_configured_info = NULL;

+    T_RamdumpRegionInfo *p_parsed_info     = NULL;

+

+    p_configured_info = (T_RamdumpRegionInfo *)configured_region_base;

+    p_parsed_info     = (T_RamdumpRegionInfo *)parsed_region_base;

+    

+    for ( ; i < p_configured_info->region_num; i++ )

+    {

+        ramdump_get_available_region( p_configured_info->regions[i].start_addr,

+                                      p_configured_info->regions[i].end_addr,

+                                      p_configured_info->regions[i].map_start_addr,

+                                      p_configured_info->regions[i].copy_start_addr,

+                                      (UINT32)p_parsed_info );

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_save_file_info

+ * ¹¦ÄÜÃèÊö£º½«ÎļþÐÅÏ¢±£´æÖÁ¸ß¶ÎÄÚ´æ

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_save_file_info( const CHAR *name, UINT32 base_addr, UINT32 size )

+{

+    T_RamdumpFile *pfileInfo = NULL;

+    

+    pfileInfo = g_ramdump_file_info->fileInfo + g_ramdump_file_info->fileNum;

+    strcpy( (char *)pfileInfo->fileName, name );

+    pfileInfo->baseAddr = base_addr;

+    pfileInfo->size     = size;

+    

+    g_ramdump_file_info->fileNum ++;

+    zOss_AssertExN( g_ramdump_file_info->fileNum <  g_ramdump_file_max); 

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_save_region_file_info

+ * ¹¦ÄÜÃèÊö£ºÕûÀíÄÚ´æ¿éµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_save_region_file_info( T_RamdumpRegionInfo *p_region_info, const CHAR *file_name )

+{

+    int     i           = 0;

+    CHAR    name[32]    = {0};

+    

+    for ( i=0; i<(int)p_region_info->region_num; i++ )

+    {

+        sprintf( name, "%s_%d", file_name, i );

+        ramdump_save_file_info(name, 

+                               p_region_info->regions[i].start_addr,

+                               (p_region_info->regions[i].end_addr - p_region_info->regions[i].start_addr) + 1 );

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_save_all_files_info

+ * ¹¦ÄÜÃèÊö£ºÕûÀíµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_save_all_files_info( VOID )

+{

+    ramdump_save_region_file_info( g_parsed_regions_info, RAM_ARM0_NAME );

+    ramdump_save_file_info( "arm0_targetstate.cmm", (UINT32)g_cmm_file_info->cmmFileBuffer, g_cmm_file_info->cmmFileSize);

+

+#ifdef _USE_ARM1_RAMDUMP

+    ramdump_save_region_file_info( (T_RamdumpRegionInfo *)HIGHMEM_ARM1_PARSED_REGION_BASE, RAM_ARM1_NAME );

+    ramdump_save_file_info( "arm1_targetstate.cmm", CMM_FILE_BUF_BASE(HIGHMEM_ARM1_CMM_INFO_BASE), CMM_FILE_BUF_SIZE(HIGHMEM_ARM1_CMM_INFO_BASE) );

+#endif

+}

+

+#ifdef _USE_ARM1_RAMDUMP

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_send_msg_to_arm1

+ * ¹¦ÄÜÃèÊö£º Arm0 ICP ÏûÏ¢ID·¢Ëͺ¯Êý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_send_msg_to_arm1( VOID )

+{

+    T_HalIcp_Msg icp_msg;

+    zOss_Memset(&icp_msg, 0, sizeof(icp_msg));

+    

+    icp_msg.SrcModId = ICP_ARM0_MODULE_ID_OS;

+    icp_msg.desModId = ICP_ARM1_MODULE_ID_OS;

+    icp_msg.IntInfo.high_word = ZPLAT_LTE_ICP_ARM02ARM1_RAMDUMP_CF;

+    zDrvIcp_SendMsg( (const T_HalIcp_Msg *)&icp_msg );

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_process_msg_from_arm1

+ * ¹¦ÄÜÃèÊö£º Arm0 ICPÏûÏ¢½ÓÊÜ´¦Àíº¯Êý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_process_msg_from_arm1( const T_HalIcp_Msg *pMsg )

+{

+    T_HalIcp_Dword state = { 0 };

+   

+    zDrvIcp_GetState( ICP_MSG_ACTOR_ARM, &state );

+    zDrvIcp_ClearState( ICP_MSG_ACTOR_ARM, state );

+

+    /* ʹµÃarm0²úÉúÒì³££¬ÒԱ㿪ʼramdump */

+    zOss_ASSERT( FALSE );

+}

+#endif

+

+/*****************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_main

+ * ¹¦ÄÜÃèÊö£º Ö´ÐÐramdump£¬ÓëPC²à¹¤¾ß½øÐн»»¥£¬´«µÝÐèÒª±£´æµÄÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+static VOID ramdump_main(VOID)

+{

+    /* ¸ù¾ÝMMU½âÎöÁбí¶ÔÄÚ´æ¶Î½øÐбȶԷÖÎö */

+    ramdump_parse_region_info( (UINT32)g_configured_regions_info, (UINT32)g_parsed_regions_info);

+    /* Éú³É»Ö¸´¼Ä´æÆ÷T32½Å±¾Îļþ */

+    ramdump_create_cmm_file();

+

+#ifdef _USE_ARM1_RAMDUMP

+#ifdef _USE_PSM

+    ARM0_WAIT_DDR1_READY;

+#endif   

+    ramdump_parse_region_info(HIGHMEM_ARM1_CONFIGURED_REGION_BASE, HIGHMEM_ARM1_PARSED_REGION_BASE);

+

+    ARM0_NOFITY_ARM1;

+    ARM0_WAIT_ARM1;

+#endif   

+

+    /* Ö´ÐÐramdumpÊý¾Ý´¦Àíº¯Êý */

+    ramdump_save_all_files_info();

+

+    /* ¼ì²âUSBÁ¬½Ó,×¼±¸´«ÊäÊý¾Ý */

+    ramdump_transfer_data();

+    return;

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zte_sys_err_hnd

+ * ¹¦ÄÜÃèÊö£º Ramdump´¦Àíº¯Êý

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º1¡¢Èç¹ûÊÇÖÂÃü´íÎó,´íÎó»áÅ×Ïò¸ü¸ßÒ»¼¶´¦Àí

+ *           2¡¢Èç¹ûexcepNum´óÓÚ1˵Ã÷ÔÚramdump¹ý³ÌÓÖ³öÏÖÁËÒì³£

+ **************************************************************************/

+int  zte_sys_err_hnd(int  user_called, int  ecode, int extra)

+{

+    static UINT32   excepNum        = 0;

+    UINT32          excepResetFlag  = 0;

+    ZOSS_INTR       old_intr;

+    /* ËøÖÐ¶Ï */

+    ZOSS_SAVE_IRQ(old_intr);

+    excepNum++;

+    if (excepNum > 1)   /* Ö»±£´æµÚÒ»´Î³ö´íÏÖ³¡ */

+    {

+        for ( ; ; ) ;

+    }

+

+    excepResetFlag = zOss_GetExceptResetFlag();

+    if ( excepResetFlag != EXCEPT_RESET_ENABLE)

+    {

+        /* ±£´æ¼Ä´æÆ÷ÐÅÏ¢ */

+        zOss_RamdumpSaveRegisters();

+        /* Ö´ÐÐramdumpÒì³£´¦Àíº¯Êý */

+        ramdump_main();

+        for ( ; ; ) ;

+    }

+    else

+    {

+        halComm_Soft_Reset(RESET_TO_EXCEPTRESET);   /* Òì³£ÖØÆô */

+    }

+    return 0;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpConfigureMem

+ * ¹¦ÄÜÃèÊö£º ±£´æÄÚ´æ¶ÎÊý¾ÝÅäÖÃÐÅÏ¢

+ * ²ÎÊý˵Ã÷£º (IN):

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpConfigureMem( UINT32 base, UINT32 size ,UINT32 map_base ,UINT32 copy_base )

+{

+    if (size == 0)

+        return;

+    if ((size - 1) > (0xFFFFFFFF - base))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "Hello,ÄÚ´æ¶ÎµØÖ·ÅäÖôíÎó,Çë²éѯºóÔÙʹÓÃ!");

+        return;

+    }

+    zOss_AssertExN( g_configured_regions_info->region_num < g_configured_regions_max);

+    g_configured_regions_info->regions[g_configured_regions_info->region_num].start_addr        = base;

+    g_configured_regions_info->regions[g_configured_regions_info->region_num].end_addr          = base + size - 1;

+    g_configured_regions_info->regions[g_configured_regions_info->region_num].map_start_addr    = map_base;

+    g_configured_regions_info->regions[g_configured_regions_info->region_num].copy_start_addr   = copy_base;

+    (g_configured_regions_info->region_num)++;

+}

+ 

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º  Osa_SysErrHndInit

+ * ¹¦ÄÜÃèÊö£º µØÖ·È«¾Ö±äÁ¿³õʼ»¯,»ñÈ¡ramdumpÄÚ´æ¿éĬÈÏÅäÖÃ

+                                  arm0ºÍarm1ͬ²½»úÖÆ

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ***************************************************************************/

+VOID Osa_SysErrHndInit(VOID)

+{

+    UINT32 base   = 0;

+    UINT32 size   = 0;

+    UINT32 map_base     = 0;

+    UINT32 copy_base    = 0;

+    /* µØÖ·È«¾Ö±äÁ¿³õʼ»¯ */

+    zOss_Memset((char *)tos_ramdump_vma_start(), 0, tos_ramdump_vma_end() - tos_ramdump_vma_start());

+    gOsa_Ramdump.cmmBuffer                = (CHAR *)tos_ramdump_vma_start();

+    gOsa_Ramdump.configured_regions_info  = gOsa_Ramdump.cmmBuffer               + CMM_BUFFER_SIZE;

+    gOsa_Ramdump.parsed_regions_info      = gOsa_Ramdump.configured_regions_info + CONFIGURED_REGIONS_SIZE;

+    gOsa_Ramdump.ramdump_file_info        = gOsa_Ramdump.parsed_regions_info     + PARSED_REGIONS_SIZE + ERROR_CODE_SIZE;

+    gOsa_Ramdump.ioReadBuffer             = gOsa_Ramdump.ramdump_file_info       + RAMDUMP_FILE_SIZE;

+    gOsa_Ramdump.ioWriteBuffer            = gOsa_Ramdump.ioReadBuffer            + IO_READ_BUFFER;

+    

+    g_cmm_file_info = (T_RamdumpCmmFileInfo * )gOsa_Ramdump.cmmBuffer;

+    g_cmm_file_info->cmmFileSize = 0;

+    g_cmm_file_max  = (CMM_BUFFER_SIZE - 4);    /* 4±íʾ½á¹¹µÚÒ»¸ö³ÉÔ±µÄ´óС£¬ÏÂͬ */ 

+    

+    g_configured_regions_info= (T_RamdumpRegionInfo *)gOsa_Ramdump.configured_regions_info;

+    g_configured_regions_info->region_num = 0;

+    g_configured_regions_max = (CONFIGURED_REGIONS_SIZE - 4) / sizeof(T_RamdumpRegion);

+    

+    g_parsed_regions_info = (T_RamdumpRegionInfo *)gOsa_Ramdump.parsed_regions_info;

+    g_parsed_regions_info->region_num = 0;

+    g_parsed_regions_max = (PARSED_REGIONS_SIZE - 4) / sizeof(T_RamdumpRegion);

+    

+    g_ramdump_file_info  = (T_RamdumpFileInfo*)gOsa_Ramdump.ramdump_file_info;

+    g_ramdump_file_info->fileNum = 0;

+    g_ramdump_file_max = (RAMDUMP_FILE_SIZE - 4) / sizeof(T_RamdumpFile);

+    

+    /* ramdumpÄÚ´æ¿éĬÈÏÅäÖÃ,ĬÈÏÅäÖÃ˳Ðò²»Òª¸Ä¶¯ */

+    base        = tos_ram_vma_start();

+    size        = tos_ram_vma_end() - tos_ram_vma_start();

+    map_base    = base;

+    copy_base   = 0;

+    zOss_RamdumpConfigureMem(base, size, map_base, copy_base);

+    

+    base        = tos_itcm_vma_start();

+    size        = ITCM_SIZE;

+    map_base    = base;

+    copy_base   = 0;

+    zOss_RamdumpConfigureMem(base, size, map_base, copy_base);

+    

+    base        = tos_dtcm_vma_start();

+    size        = DTCM_SIZE;

+    map_base    = base;

+    copy_base   = 0;

+    zOss_RamdumpConfigureMem(base, size, map_base, copy_base);

+    

+#ifdef _USE_ARM1_RAMDUMP

+    /* arm0ºÍarm1ͬ²½»úÖÆ */

+    *(volatile UINT32 *)HIGHMEM_ARM1_FLAG_ARM12ARM0_BASE = RAMDUMP_FLAG ;

+    *(volatile UINT32 *)HIGHMEM_ARM1_FLAG_ARM02ARM1_BASE = 0;

+    HAL_CLEAN_FLASH_CACHE();

+    zDrvIcp_RegCallback( ICP_ARM0_MODULE_ID_OS, ICP_ARM1_MODULE_ID_OS, ramdump_process_msg_from_arm1, ICP_ISR_CALLBACK ); 

+#endif

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpInit

+ * ¹¦ÄÜÃèÊö£º ICP»Øµ÷³õʼ»¯

+ * ²ÎÊý˵Ã÷£º (IN): 

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpInit( VOID )

+{

+#ifdef _USE_ARM1_RAMDUMP

+    zDrvIcp_RegCallback( ICP_ARM0_MODULE_ID_OS, ICP_ARM1_MODULE_ID_OS, ramdump_process_msg_from_arm1, ICP_ISR_CALLBACK );

+#endif

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpForceException

+ * ¹¦ÄÜÃèÊö£º Ç¿ÖÆ²úÉúÒì³£,ÒÔ±ãramdump

+ * ²ÎÊý˵Ã÷£º (IN): 0:ARMÒì³£ 1: ¶ÏÑÔÒì³£ 2: ²Ù×÷ϵͳ¶ÏÑÔÒì³£

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpForceException( UINT32 type )

+{

+    if ( 0 == type )

+    {

+        *(int *)0x05 = 0x00;

+    }

+    else

+    {

+        zOss_AssertExN( FALSE );

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpSetIoOpt

+ * ¹¦ÄÜÃèÊö£º ÉèÖÃramdump Io ͨµÀ£»

+ * ²ÎÊý˵Ã÷£º (IN): 

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpSetIoOpt(T_zOss_RamdumpIoOpt hook)

+{

+    g_zRamdumpIoOpt.init    = hook.init;

+    g_zRamdumpIoOpt.read    = hook.read;

+    g_zRamdumpIoOpt.write   = hook.write;

+    g_zRamdumpIoOpt.finish  = hook.finish;    

+}

+

+#ifdef __cplusplus

+}

+#endif

+

+#else

+

+#include "oss_api.h"

+

+extern int __init ramdump_init(void);

+

+VOID zOss_RamdumpInit(VOID)

+{

+    ramdump_init();

+    //zDrvIcp_RegCallback( ICP_ARM0_MODULE_ID_OS, ICP_ARM1_MODULE_ID_OS, ramdump_process, ICP_ISR_CALLBACK );

+}

+

+#endif

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_ramdump_csky.c b/cp/ps/plat/src/oss/osa/linux/src/linux_ramdump_csky.c
new file mode 100644
index 0000000..9e19d99
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_ramdump_csky.c
@@ -0,0 +1,534 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_ramdump_csky.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : 

+* °æ    ±¾ : 

+* Íê³ÉÈÕÆÚ : 

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "tos_ramdump.h"

+#include "comm_api.h"

+#include "hal_comm.h"

+#include "kpd_api.h"

+#include "sys_func_atcfg.h"

+

+#include "tos_except_csky.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+#include "drvs_usbpoll.h"

+//#include "drvs_kpd.h"

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+extern VOID zOss_SaveRegisters(VOID);

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* ¹æ»®·ÖÅäµÄ¶Ñ¿Õ¼äËÄ×Ö½Ú¶ÔÆë */

+#define CMM_BUFFER_SIZE                 5120    /* 5k */

+#define IO_FILE_INFO                    1024    /* 1K */

+#define IO_READ_BUFFER                  1024    /* 1K */

+#define IO_WRITE_BUFFER                 1024    /* 1k */

+#define RAM_DUMPBUFER_SIZE              (CMM_BUFFER_SIZE+IO_FILE_INFO\

+	                                    +IO_READ_BUFFER+IO_WRITE_BUFFER)

+#define GET_TRANSFER_DATA_AREA(buffer)  ((char *)buffer + 4)

+

+/* RamdumpÎļþµÄÃû×Ö */

+#define RAM_NAME        "ram.bin"           /* ±£´æramÎļþÃû     */

+#define CDS_SCRIPT_NAME "targetstate.scr"   /* TOS½Å±¾ÎļþÃû    */

+#define REG_TOTAL_NUM   80

+#define NORMAL_REG_NUM  16

+#define CTRL_REG_NUM    22

+extern unsigned char _ram_start[], _ram_end[];

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/* ±£´æsas ram¿É·ÃÎʵÄÒ»¶ÎÄÚ´æµÄÆðʼµØÖ· */

+typedef struct

+{

+    UINT32 accessStart;

+    UINT32 accessEnd;

+    UINT32 accessLength;

+}T_RamSection;

+

+/* cmmÎļþ»º³å */

+typedef struct

+{

+    UINT32 cmmFileSize;

+    CHAR  cmmFileBuffer[1]; /* ºóÃæ»¹Óпռä */

+}T_CmmFile;

+

+/* »ñÈ¡TOS ÅäÖÃÐÅÏ¢,ÓÃÓÚramdump */

+typedef struct

+{

+    CHAR *cmmBuffer;        /* ´æ·ÅÉú³ÉµÄ»Ö¸´ÏÖ³¡½Å±¾µÄ»ùÖ· */

+    CHAR *ioFileInfo;       /* ´æ·Å´«ÊäÊý¾ÝµÄÎļþÐÅÏ¢       */

+    CHAR *ioReadBuffer;     /* ´«ÊäÊý¾ÝµÄ¶Á»º³å»ùÖ·         */

+    CHAR *ioWriteBuffer;    /* ´«ÊäÊý¾ÝµÄд»º³å»ùÖ·         */

+}T_OsaRamDumpCfg;

+

+typedef struct

+{

+    CHAR    fileName[DUMPFILENMAE_LEN]; /* ÎļþÃû       */

+    UINT32  baseAddr;                   /* ÄÚ´æ»ùµØÖ·   */

+    UINT32  size;                       /* ´óС         */

+} T_RamdumpFile;

+

+typedef struct

+{

+    UINT32          fileNum;        /* Îļþ¸öÊý         */

+    T_RamdumpFile   fileInfo[1];    /* ºóÐø¿ÉÄÜ»¹ÓÐÊý¾Ý */

+} T_RamdumpFileInfo;

+

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+VOID Osa_RamdumpMain(VOID);

+static VOID IO_ReadData(UINT8 *buffer, UINT32 size);

+static VOID IO_WriteData(UINT8 *buffer, UINT32 size);

+VOID zOss_TransferRamdumpData(T_RamdumpFileInfo *pioFileInfo);

+VOID Osa_CreateCdsBatch(VOID);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+T_OsaRamDumpCfg         gOsa_Ramdump                    = {0};  /* ±£´æTOSµÄÅäÖÃÐÅÏ¢   */

+volatile UINT32         gRamdumpAdrress[REG_TOTAL_NUM]  = {0};  /* ±£´æ¼Ä´æÆ÷ÐÅÏ¢       */

+tos_except_register_t  *gEceptRegister                  = NULL;

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖÇø

+**************************************************************************/

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºOsa_SysErrHndInit

+ * ¹¦ÄÜÃèÊö£ºÒì³£´¦Àí³õʼ»¯º¯Êý

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID Osa_SysErrHndInit(VOID)

+{

+    gOsa_Ramdump.cmmBuffer      = (CHAR *)zOss_Malloc(RAM_DUMPBUFER_SIZE);

+    zOss_Memset(gOsa_Ramdump.cmmBuffer , 0, RAM_DUMPBUFER_SIZE);

+    gOsa_Ramdump.ioFileInfo     =  gOsa_Ramdump.cmmBuffer + CMM_BUFFER_SIZE;

+    gOsa_Ramdump.ioReadBuffer   =  gOsa_Ramdump.ioFileInfo + IO_FILE_INFO;

+    gOsa_Ramdump.ioWriteBuffer  = gOsa_Ramdump.ioReadBuffer +IO_READ_BUFFER;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zte_sys_err_hnd

+ * ¹¦ÄÜÃèÊö£º Ramdump´¦Àíº¯Êý

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º1¡¢Èç¹ûÊÇÖÂÃü´íÎó,´íÎó»áÅ×Ïò¸ü¸ßÒ»¼¶´¦Àí

+ *           2¡¢Èç¹ûexcepNum´óÓÚ1˵Ã÷ÔÚramdump¹ý³ÌÓÖ³öÏÖÁËÒì³£

+**************************************************************************/

+int  zte_sys_err_hnd(int  user_called, int  ecode, int extra)

+{

+    static UINT32   excepNum        = 0;

+    UINT32          excepResetFlag  = 0;

+    ZOSS_INTR       old_intr;

+

+    /* ËøÖÐ¶Ï */

+    ZOSS_SAVE_IRQ(old_intr);

+

+    excepNum++;

+    if (excepNum > 1)   /* Ö»±£´æµÚÒ»´Î³ö´íÏÖ³¡ */

+    {

+        for ( ; ; ) ;

+    }

+

+    excepResetFlag = zOss_GetExceptResetFlag();

+    if (excepResetFlag != EXCEPT_RESET_ENABLE)

+    {

+        gEceptRegister = tos_dump_except_register();

+        if (gEceptRegister)

+        {

+            zOss_Memcpy((VOID *)gRamdumpAdrress,gEceptRegister,sizeof(tos_except_register_t));

+        }

+        else

+        {

+            zOss_SaveRegisters();

+        }

+        /* Éú³É»Ö¸´¼Ä´æÆ÷tos½Å±¾Îļþ */

+        Osa_CreateCdsBatch();

+        /* Ö´ÐÐramdumpÒì³£´¦Àíº¯Êý */

+        Osa_RamdumpMain();

+        for ( ; ; ) ;

+    }

+    else

+    {

+        halComm_Soft_Reset(RESET_TO_EXCEPTRESET);   /* Òì³£ÖØÆô */

+    }

+    return 0;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º  zOss_TransferRamdumpData

+ * ¹¦ÄÜÃèÊö£º  ÓëPC²à¹¤¾ß½øÐн»»¥£¬´«µÝÐèÒª±£´æµÄÊý¾Ý

+ * ²ÎÊý˵Ã÷£º  (IN):pRamdkumpInfo:ÎļþÐÅÏ¢

+ *             (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_TransferRamdumpData(T_RamdumpFileInfo *pioFileInfo)

+{

+    CHAR            *reqBuffer  = gOsa_Ramdump.ioReadBuffer;    /* ÇëÇóÏûÏ¢»º³åÇø   */

+    CHAR            *rspBuffer  = gOsa_Ramdump.ioWriteBuffer;   /* »ØÓ¦ÏûÏ¢»º³åÇø   */

+    UINT32          rspDataLen  = 0;                            /* »ØÓ¦ÏûÏ¢³¤¶È     */

+    UINT32          *reqCmd     = NULL;

+    UINT32          *rspCmd     = NULL;

+    T_RamdumpFile   *fileInfo   = NULL;

+    BOOL            result      = FALSE;

+

+    zOss_AssertExN(pioFileInfo != NULL);

+    

+    rspCmd      = (UINT32 *)rspBuffer;

+    reqCmd      = (UINT32 *)reqBuffer;

+    fileInfo    = pioFileInfo->fileInfo;

+    

+    /* ³õʼ»¯USB */

+    zDrvUsbPoll_Init();

+    

+    /* ²éѯUSBÊÇ·ñÁ¬½Ó */

+    while (!result)

+    {

+        result = zDrvUsbPoll_isConnect();

+    }

+    

+    for(;;)

+    {

+        /* ´ÓͨѶ¿Ú¶ÁÊý¾Ý */

+        IO_ReadData((UINT8 *)reqBuffer, CMD_BUFFER_LEN);

+        

+        switch (*reqCmd)

+        {

+        case DUMPFILE_LINK_REQ: /* ͬ²½ÇëÇó */

+            {

+                T_DUMPFILE_LINK_RSP *rspMsg;

+                *rspCmd = DUMPFILE_LINK_RSP;

+                rspMsg = (T_DUMPFILE_LINK_RSP *)GET_TRANSFER_DATA_AREA(rspBuffer);

+                rspMsg->fileNum = pioFileInfo->fileNum;

+                rspDataLen = sizeof(*rspCmd) + sizeof(T_DUMPFILE_LINK_RSP);

+                break;

+            }

+        case DUMPFILE_FILE_REQ: /* ¶ÁÈ¡ÎļþÐÅÏ¢£¬¿ªÊ¼´«ÊäÎļþÇëÇó */

+            {

+                T_DUMPFILE_FILE_REQ *reqMsg;

+                T_DUMPFILE_FILE_RSP *rspMsg;

+                *rspCmd = DUMPFILE_FILE_RSP;

+                reqMsg = (T_DUMPFILE_FILE_REQ *)GET_TRANSFER_DATA_AREA(reqBuffer);

+                rspMsg = (T_DUMPFILE_FILE_RSP *)GET_TRANSFER_DATA_AREA(rspBuffer);

+                

+                /* ÅжÏÎļþ±àºÅÊÇ·ñÕýÈ· */

+                if (reqMsg->fileNo < pioFileInfo->fileNum)

+                {

+                    strcpy((char *)rspMsg->fileName, (char *)fileInfo[reqMsg->fileNo].fileName);

+                    rspMsg->size = fileInfo[reqMsg->fileNo].size;

+                    rspDataLen = sizeof(*rspCmd) + sizeof(T_DUMPFILE_FILE_RSP);

+                }

+                else

+                {

+                    *rspCmd = DUMPFILE_NO_FAIL;

+                    rspDataLen = sizeof(*rspCmd);

+                }

+                

+                break;

+            }

+        case DUMPFILE_READ_REQ: /*¶ÁÈ¡ÎļþÄÚÈÝ*/

+            {

+                T_DUMPFILE_READ_REQ *reqMsg;

+                *rspCmd = DUMPFILE_READ_RSP;

+                rspDataLen = sizeof(*rspCmd);

+                reqMsg = (T_DUMPFILE_READ_REQ *)GET_TRANSFER_DATA_AREA(reqBuffer);

+                

+                if (reqMsg->fileNo >= pioFileInfo->fileNum)

+                {

+                    *rspCmd = DUMPFILE_LENGTH_FAIL;

+                    break;

+                }

+                

+                if (reqMsg->offset + reqMsg->length > fileInfo[reqMsg->fileNo].size)

+                {

+                    *rspCmd = DUMPFILE_NO_FAIL;

+                    break;

+                }

+                

+                IO_WriteData((UINT8 *)rspBuffer, rspDataLen);

+                IO_WriteData((UINT8 *)(fileInfo[reqMsg->fileNo].baseAddr + reqMsg->offset), reqMsg->length);

+                continue;   /* ¼ÌÐøÖ´ÐÐÏÂÒ»´Î¶Á */

+            }

+        case DUMPFILE_END_REQ:  /* ´«Êä½áÊø */

+            {

+                *rspCmd = DUMPFILE_END_RSP;

+                rspDataLen = sizeof(*rspCmd);

+                IO_WriteData((UINT8 *)rspBuffer, rspDataLen);

+                {

+                    int i ;

+                    for (i= 0; i< 100;i++)  /* µÈ´ýÊý¾Ý·¢ËÍÍêºó£¬ÔÙÖØÆô */

+                    {

+                        zDrvUsbPoll_Isr();

+                    }

+                }

+                return;

+            }

+        default:    /* ´íÎóÖ¸Áî */

+            {

+                *rspCmd = DUMPFILE_CMD_FAIL;

+                rspDataLen = sizeof(*rspCmd);

+                break;

+            }

+        }

+        

+        /* ÏòͨѶ¿ÚдÊý¾Ý */

+        IO_WriteData((UINT8 *)rspBuffer, rspDataLen);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º Osa_RamdumpMain

+ * ¹¦ÄÜÃèÊö£º Ö´ÐÐramdump£¬ÓëPC²à¹¤¾ß½øÐн»»¥£¬´«µÝÐèÒª±£´æµÄÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID Osa_RamdumpMain(VOID)

+{

+    T_RamdumpFileInfo   *pioFileInfo    = NULL;

+    T_RamdumpFile       *pfileInfo      = NULL;

+

+    pioFileInfo = (T_RamdumpFileInfo *)gOsa_Ramdump.ioFileInfo;

+    zOss_AssertExN(pioFileInfo != NULL);

+    

+    pfileInfo   = pioFileInfo->fileInfo;

+    zOss_AssertExN(pfileInfo != NULL);

+    

+    /* TOS  batch head */

+    strcpy((char *)pfileInfo->fileName,CDS_SCRIPT_NAME);

+    pfileInfo->baseAddr = (UINT32)((T_CmmFile *)gOsa_Ramdump.cmmBuffer)->cmmFileBuffer;

+    pfileInfo->size = ((T_CmmFile *)gOsa_Ramdump.cmmBuffer)->cmmFileSize;

+    pfileInfo++;

+    pioFileInfo->fileNum++;

+    /* ram head */

+    strcpy((char *)pfileInfo->fileName,RAM_NAME);

+    pfileInfo->baseAddr = (UINT32)_ram_start;

+    pfileInfo->size = (UINT32)(_ram_end - _ram_start);

+    pfileInfo++;

+    pioFileInfo->fileNum++;

+    /* ¼ì²âUSBÁ¬½Ó,×¼±¸´«ÊäÊý¾Ý */

+    zOss_TransferRamdumpData(pioFileInfo);

+    return;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º Osa_CreateCdsBatch

+ * ¹¦ÄÜÃèÊö£º Éú³É»Ö¸´¶ÑÕ»µÄCDS½Å±¾

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID Osa_CreateCdsBatch(VOID )

+{

+    char    *cmmAddress = NULL;

+    char    *cmmBase    = NULL;

+    SINT32  length      = 0;

+    SINT32  regIndex    = 0;

+    int     i           = 0 ;

+    

+    T_CmmFile *cmmFile = (T_CmmFile *)gOsa_Ramdump.cmmBuffer;

+    zOss_AssertExN(cmmFile != NULL );

+    cmmBase     = (char *)cmmFile->cmmFileBuffer;

+    cmmAddress = cmmBase;

+    /* Êä³ö¼ÓÔØRAM */

+    length = sprintf(cmmAddress, "restore  %s binary %#lx\r\n",RAM_NAME, (UINT32)_ram_start);

+    cmmAddress += length;

+    /* Êä³ö¿ØÖƼĴæÆ÷, gRamdumpAdrress µØÖ·Ç°Ãæ±£´æµÄÊÇr0-r15,ËùÒÔregIndexÊÇ´Ó16¿ªÊ¼µÄ */

+    regIndex = 16;

+    if(gEceptRegister)

+    {

+        length  = sprintf(cmmAddress,"set $cr0 = %#lx\r\n",(int)gEceptRegister->epsr);

+        regIndex++;

+    }

+    else

+    {

+        length = sprintf(cmmAddress, "set $cr0 = %#lx\r\n",  gRamdumpAdrress[regIndex++]);

+    }

+    cmmAddress += length;

+    for (i = 1; i <CTRL_REG_NUM; i++)

+    {

+        if (i == 16)

+        {

+            continue;

+        }

+        length = sprintf(cmmAddress,"set $cr%d =  %#lx\r\n",i,gRamdumpAdrress[regIndex++]);

+        cmmAddress += length;

+    }

+    /* Êä³ör0-r15 */

+    regIndex = 0;

+    for (i = 0; i < NORMAL_REG_NUM; i++)

+    {

+        length = sprintf(cmmAddress, "set  $r%d =  %#lx\r\n", i, gRamdumpAdrress[regIndex++]);

+        cmmAddress += length;

+    }

+    if(gEceptRegister)

+    {

+        length = sprintf(cmmAddress, "set  $pc =  %#lx\r\n",(unsigned int) gEceptRegister->epc );

+    }

+    else

+    {

+        length = sprintf(cmmAddress, "set  $pc =  %#lx\r\n",  gRamdumpAdrress[--regIndex]);

+    }

+    

+    cmmAddress += length;

+    cmmFile->cmmFileSize = (UINT32)(cmmAddress - cmmBase);

+    return;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpConfigureMem

+ * ¹¦ÄÜÃèÊö£º ±£´æÄÚ´æ¶ÎÊý¾ÝÅäÖÃÐÅÏ¢

+ * ²ÎÊý˵Ã÷£º 

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpConfigureMem( UINT32 base, UINT32 size ,UINT32 map_base ,UINT32 copy_base )

+{

+    return ;    

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpInit

+ * ¹¦ÄÜÃèÊö£º ICP»Øµ÷³õʼ»¯

+ * ²ÎÊý˵Ã÷£º 

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpInit( VOID)

+{

+    return ;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpForceException

+ * ¹¦ÄÜÃèÊö£º Ç¿ÖÆ²úÉúÒì³£,ÒÔ±ãramdump

+ * ²ÎÊý˵Ã÷£º (IN): 0:ARMÒì³£ 1: ¶ÏÑÔÒì³£ 2: ²Ù×÷ϵͳ¶ÏÑÔÒì³£

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpForceException( UINT32 type )

+{   

+   

+    if ( 0 == type )

+    {   

+        UINT32 *temp = (UINT32 *)0xFFFFFFFF;

+        *temp = 5;

+    }

+    else if ( 2 == type )

+    {   

+        assert( FALSE );

+    }

+    else

+    {   

+        zOss_AssertExN( FALSE );

+    }

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖÇø

+**************************************************************************/

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º IO_ReadData

+ * ¹¦ÄÜÃèÊö£º¶ÁUSBÊý¾Ý

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID IO_ReadData(UINT8 *buffer, UINT32 size)

+{

+    UINT32 count = 0;

+

+    do

+    {

+        zDrvUsbPoll_Isr();

+        count = (UINT32)zDrvUsbPoll_Read(buffer, size);

+        if( size <= count)

+        {

+            break;

+        }

+

+        buffer += count;

+        size -=count;

+    }while (size > 0);

+    

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º IO_WriteData

+ * ¹¦ÄÜÃèÊö£º дUSBÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):pRamdkumpInfo:ÎļþÐÅÏ¢

+ *            (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+static VOID IO_WriteData(UINT8 *buffer, UINT32 size)

+{

+    UINT32 count = 0;

+

+    while (size > 0)

+    {

+        zDrvUsbPoll_Isr();

+        count = (UINT32)zDrvUsbPoll_Write(buffer, size);

+        if( size <= count)

+        {

+            break;

+        }

+

+        buffer += count;

+        size -=count;

+    }

+

+}

+

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_ramdump_user.c b/cp/ps/plat/src/oss/osa/linux/src/linux_ramdump_user.c
new file mode 100644
index 0000000..30f84f5
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_ramdump_user.c
@@ -0,0 +1,400 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     linux_ramdump_user.c

+* Îļþ±êʶ:     linux_ramdump_user.c

+* ÄÚÈÝÕªÒª:     linuxÓû§Ì¬ramdumpʵÏÖÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2015/1/28       V1.0        Create          ÕÔ¾ü¿ü          н¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_api.h"

+#include "oss_sup.h"

+#include "sup_ramdump.h"

+#include "linux_except_arm.h"

+#include <linux/ptrace.h>

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/*******************************************************************************

+*                                Íⲿ±äÁ¿ÉùÃ÷                                  *

+*******************************************************************************/

+extern struct cpu_core Osa_CoreRegisters;

+

+/*******************************************************************************

+*                                Íⲿº¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+extern void linux_assert_failed(const char *exp, const char *file, const char *func, int line);

+#ifdef CONFIG_MMU

+extern char *ramdump_mmu_cp15(char *addr);

+#else

+extern char *ramdump_mpu_cp15(char *addr);

+#endif

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+#define RAMDUMP_CMM_BUF_LEN         (4096)

+

+#define RAMDUMP_REG_NR              (15)	/* R0-R14 */

+#define RAMDUMP_FIQ_REG_START       (8)		/* R8     */

+#define RAMDUMP_FIQ_REG_END         (13)	/* R12    */

+

+#define RAMDUMP_IO_BUF_LEN          (1024)

+#define RAMDUMP_IO_DATA(base)       ((UINT32)base + 4)

+

+#define RAMDUMP_ARM_USR_MOD         (0xd0)

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+enum

+{

+    RAMDUMP_USER_REGION_CMM,

+    RAMDUMP_USER_REGION_DATA,

+    RAMDUMP_USER_REGION_BSS,

+    RAMDUMP_USER_REGION_HEAP,

+    RAMDUMP_USER_REGION_STACK,

+    RAMDUMP_USER_REGION_ARGS,

+    RAMDUMP_USER_REGION_ENV,

+};

+

+typedef struct

+{

+    const char      *name;

+    unsigned long   addr;

+    unsigned long   size;

+} ramdump_user_region_t;

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+static const unsigned int arm_sys_mode[] = 

+{

+    0xdf,   /* SYS */

+    0xd3,   /* SVC */

+    0xd7,   /* ABT */

+    0xdb,   /* UND */

+    0xd2,   /* IRQ */

+    0xd1,   /* FIQ */

+};

+

+ramdump_user_region_t ramdump_user_region[] = 

+{

+    { "ramdump_user.cmm",   },

+    { "ramdump_user.data",  },

+    { "ramdump_user.bss",   },

+    { "ramdump_user.heap",  },

+    { "ramdump_user.stack", },

+    { "ramdump_user.args",  },

+    { "ramdump_user.env",   },

+};

+

+/* store user dump cmm */

+static unsigned char user_dump_cmm_buf[RAMDUMP_CMM_BUF_LEN];

+

+static T_zOss_RamdumpIoOpt  g_zRamdumpIoOpt = { zOss_RamdumpUsbInit,      zOss_RamdumpUsbReadData,

+                                                zOss_RamdumpUsbWriteData, zOss_RamdumpUsbFinish};

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ±£´æÌØÈ¨¼Ä´æÆ÷

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mem:    ±£´æµØÖ·

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ±£´æÌØÈ¨¼Ä´æÆ÷ºóµÄµØÖ·

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static unsigned char* ramdump_store_sys_regs(unsigned char *mem)

+{

+	unsigned int	*fiq_regs 		= NULL;

+	CPU_REG_BANK	*ptr_mode_regs 	= NULL;

+	unsigned int 	fiq_regs_nr 	= RAMDUMP_FIQ_REG_START;

+	unsigned int 	arm_sys_mode_nr = 0;

+

+	zOss_RamdumpSaveRegisters();

+

+	//SYS/SVC/ABT/UND/IRQ

+	ptr_mode_regs = (CPU_REG_BANK*)(&Osa_CoreRegisters.user);

+	do {

+		mem += sprintf(mem, "r.s cpsr 0x%x\n", (unsigned int)arm_sys_mode[arm_sys_mode_nr]);

+		mem += sprintf(mem, "r.s r13 0x%x\n", (unsigned int)(ptr_mode_regs->sp));

+		mem += sprintf(mem, "r.s r14 0x%x\n", (unsigned int)(ptr_mode_regs->lr));

+		mem += sprintf(mem, "r.s spsr 0x%x\n", (unsigned int)(ptr_mode_regs->psr));

+		ptr_mode_regs++;

+		arm_sys_mode_nr++;

+	} while (arm_sys_mode_nr < (ARRAY_SIZE(arm_sys_mode) - 1));

+

+	//FIQ r8-r12

+	mem += sprintf(mem, "r.s cpsr 0x%x\n", (unsigned int)arm_sys_mode[arm_sys_mode_nr]);

+	fiq_regs = ((unsigned int*)&Osa_CoreRegisters.fiq_r8);

+	do {

+		mem += sprintf(mem, "r.s r%d 0x%x\n", fiq_regs_nr, *(fiq_regs));

+		fiq_regs++;

+		fiq_regs_nr++;

+	} while (fiq_regs_nr < RAMDUMP_FIQ_REG_END);

+	//FIQ r13-r14/cpsr

+	ptr_mode_regs = &Osa_CoreRegisters.fiq;

+	mem += sprintf(mem, "r.s r13 0x%x\n", (unsigned int)(ptr_mode_regs->sp));

+	mem += sprintf(mem, "r.s r14 0x%x\n", (unsigned int)(ptr_mode_regs->lr));

+	mem += sprintf(mem, "r.s spsr 0x%x\n", (unsigned int)(ptr_mode_regs->psr));

+

+	return mem;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Óû§¼Ä´æÆ÷±£´æº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mem:   ´æ´¢»º´æÖ¸Õë

+*				regs:  Óû§¼Ä´æÆ÷ÔØÌå½á¹¹ÌåÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÒÆ¶¯ºóµÄ»º´æÖ¸Õë

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static unsigned char* ramdump_store_user_regs(unsigned char *mem, struct pt_regs *regs)

+{

+    unsigned int  cnt;

+    unsigned int *uregs = (unsigned int *)regs;

+

+    mem += sprintf(mem, "r.s cpsr 0x%x\n", RAMDUMP_ARM_USR_MOD);

+    for (cnt = 0x00; cnt < RAMDUMP_REG_NR; cnt++)

+        mem += sprintf(mem, "r.s r%d 0x%x\n", cnt, *uregs++);

+    mem += sprintf(mem, "r.s pc 0x%x\n", *uregs++);

+    mem += sprintf(mem, "r.s cpsr 0x%x\n", *uregs++);

+

+    return mem;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ±£´æCP15¼Ä´æÆ÷

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mem:    ±£´æµØÖ·

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ±£´æCP15¼Ä´æÆ÷ºóµÄµØÖ·

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static unsigned char* ramdump_store_cp15_regs(unsigned char *mem)

+{

+#ifdef CONFIG_MMU

+	return ramdump_mmu_cp15(mem);

+#else

+	return ramdump_mpu_cp15(mem);

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ±£´æÓû§Êý¾Ý¶Î

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mem:    ±£´æµØÖ·

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ±£´æÓû§Êý¾Ý¶ÎºóµÄµØÖ·

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static unsigned char* ramdump_store_user_segments(unsigned char *mem)

+{

+	mem += sprintf(mem, "data.load.binary &ramdump_dir\\ramdump_user.data 0x%x--0x%x /noclear\n", 

+				  (unsigned int)(current->mm->start_data), 

+	    		  (unsigned int)(current->mm->end_data));

+	mem += sprintf(mem, "data.load.binary &ramdump_dir\\ramdump_user.bss 0x%x--0x%x /noclear\n", 

+				  (unsigned int)(current->mm->end_data), 

+	    		  (unsigned int)(current->mm->start_brk));

+	mem += sprintf(mem, "data.load.binary &ramdump_dir\\ramdump_user.heap 0x%x--0x%x /noclear\n", 

+				  (unsigned int)(current->mm->start_brk), 

+	    		  (unsigned int)(current->mm->start_stack));

+	mem += sprintf(mem, "data.load.binary &ramdump_dir\\ramdump_user.stack 0x%x--0x%x /noclear\n", 

+				  (unsigned int)(current->mm->start_stack), 

+	    		  (unsigned int)(current->mm->arg_start));

+	mem += sprintf(mem, "data.load.binary &ramdump_dir\\ramdump_user.args 0x%x--0x%x /noclear\n", 

+				  (unsigned int)(current->mm->arg_start), 

+	    		  (unsigned int)(current->mm->arg_end));

+	mem += sprintf(mem, "data.load.binary &ramdump_dir\\ramdump_user.env 0x%x--0x%x /noclear\n", 

+				  (unsigned int)(current->mm->env_start), 

+	    		  (unsigned int)(current->mm->env_end));

+

+	return mem;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Ramdump½Å±¾´´½¨º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  cmm_buf:    ½Å±¾»º³å

+				regs:       ¼Ä´æÆ÷Ö¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ´´½¨µÄ½Å±¾×Ö½ÚÊý

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static unsigned int ramdump_create_cmmbuf(unsigned char *cmm_buf, struct pt_regs *regs)

+{

+	unsigned char *buf = cmm_buf;

+

+	buf += sprintf(buf, "ENTRY &ramdump_dir\n");

+	buf = ramdump_store_sys_regs(buf);

+	buf = ramdump_store_user_regs(buf, regs);

+	buf = ramdump_store_user_segments(buf);

+	buf = ramdump_store_cp15_regs(buf);

+	buf += sprintf(buf, "ENDDO\n");

+

+    if ((unsigned int)(buf - cmm_buf) <= RAMDUMP_CMM_BUF_LEN)

+        return (unsigned int)(buf - cmm_buf);

+    else

+        return RAMDUMP_CMM_BUF_LEN;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ×¼±¸RamdumpÓû§Êý¾Ý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Êý¾Ýµ¼³ö½á¹û£¬ZOSS_SUCCESS±íʾ³É¹¦£¬·ñÔò±íʾʧ°Ü

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static UINT32 ramdump_prepare_user_data(void)

+{

+	if (current->mm != NULL)

+    {

+        ramdump_user_region[RAMDUMP_USER_REGION_CMM].addr = (unsigned char*)user_dump_cmm_buf;

+        ramdump_user_region[RAMDUMP_USER_REGION_CMM].size = ramdump_create_cmmbuf(user_dump_cmm_buf, signal_pt_regs());

+

+        ramdump_user_region[RAMDUMP_USER_REGION_DATA].addr = (unsigned char*)(current->mm->start_data);

+        ramdump_user_region[RAMDUMP_USER_REGION_DATA].size = (current->mm->end_data) - (unsigned int)(current->mm->start_data);

+

+		ramdump_user_region[RAMDUMP_USER_REGION_BSS].addr = (unsigned char*)(current->mm->end_data);

+		ramdump_user_region[RAMDUMP_USER_REGION_BSS].size = (unsigned int)(current->mm->start_brk) - (unsigned int)(current->mm->end_data);

+

+		ramdump_user_region[RAMDUMP_USER_REGION_HEAP].addr = (unsigned char*)(current->mm->start_brk);

+		ramdump_user_region[RAMDUMP_USER_REGION_HEAP].size = (unsigned int)(current->mm->start_stack) - (unsigned int)(current->mm->start_brk);

+

+		ramdump_user_region[RAMDUMP_USER_REGION_STACK].addr = (unsigned char*)(current->mm->start_stack);

+		ramdump_user_region[RAMDUMP_USER_REGION_STACK].size = (unsigned int)(current->mm->arg_start) - (unsigned int)(current->mm->start_stack);

+

+		ramdump_user_region[RAMDUMP_USER_REGION_ARGS].addr = (unsigned char*)(current->mm->arg_start);

+		ramdump_user_region[RAMDUMP_USER_REGION_ARGS].size = (unsigned int)(current->mm->arg_end) - (unsigned int)(current->mm->arg_start);

+

+		ramdump_user_region[RAMDUMP_USER_REGION_ENV].addr = (unsigned char*)(current->mm->env_start);

+		ramdump_user_region[RAMDUMP_USER_REGION_ENV].size = (unsigned int)(current->mm->env_end) - (unsigned int)(current->mm->env_start);

+

+		return ZOSS_SUCCESS;

+	}

+	else

+		return ZOSS_ERROR;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     µ¼³öÓû§Êý¾Ý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void ramdump_transfer_user_data(void)

+{

+	char 			*read_buffer;

+	char 			*write_buffer;

+	unsigned int 	*read_cmd;

+	unsigned int 	*write_cmd;

+	unsigned int 	write_datalen = 0;

+

+	g_zRamdumpIoOpt.init();

+

+	read_buffer  = kmalloc(RAMDUMP_IO_BUF_LEN, GFP_KERNEL);

+	write_buffer = kmalloc(RAMDUMP_IO_BUF_LEN, GFP_KERNEL);

+	read_cmd     = (unsigned int *)read_buffer;

+	write_cmd    = (unsigned int *)write_buffer;

+

+	for (;;) {

+		g_zRamdumpIoOpt.read((unsigned char*)read_buffer, ZOSS_RAMDUMP_CMD_BUFFER_LEN);

+		switch (*read_cmd) {

+		case ZOSS_RAMDUMP_FILE_LINK_REQ:

+			{

+				T_zOss_RamumpFileLinkRsp *writeLinkRsp = (T_zOss_RamumpFileLinkRsp *)(write_buffer + sizeof(*write_cmd));

+				*write_cmd = ZOSS_RAMDUMP_FILE_LINK_RSP;

+				writeLinkRsp->fileNum = ARRAY_SIZE(ramdump_user_region);

+				write_datalen = sizeof(*write_cmd) + sizeof(T_zOss_RamumpFileLinkRsp);

+				break;

+			}

+

+		case ZOSS_RAMDUMP_FILE_FILE_REQ:

+			{

+				T_zOss_RamdumpFileFileReq *readFileReq = (T_zOss_RamdumpFileFileReq *)RAMDUMP_IO_DATA(read_buffer);

+				T_zOss_RamdumpFileFileRsp *writeFileRsp = (T_zOss_RamdumpFileFileRsp *)(write_buffer + sizeof(*write_cmd));

+				*write_cmd = ZOSS_RAMDUMP_FILE_FILE_RSP;

+				strcpy(writeFileRsp->fileName, ramdump_user_region[readFileReq->fileNo].name);

+                writeFileRsp->size = ramdump_user_region[readFileReq->fileNo].size;

+				write_datalen = sizeof(*write_cmd) + sizeof(T_zOss_RamdumpFileFileRsp);

+				break;

+			}

+

+		case ZOSS_RAMDUMP_FILE_READ_REQ:

+			{

+				T_zOss_RamdumpFileReadReq *readFileReq = (T_zOss_RamdumpFileReadReq *)RAMDUMP_IO_DATA(read_buffer);

+				*write_cmd = ZOSS_RAMDUMP_FILE_READ_RSP;

+				g_zRamdumpIoOpt.write((UINT8 *)write_cmd, sizeof(*write_cmd));

+                g_zRamdumpIoOpt.write((UINT8 *)(ramdump_user_region[readFileReq->fileNo].addr + readFileReq->offset), readFileReq->length);

+

+				continue;

+			}

+

+		case ZOSS_RAMDUMP_FILE_END_REQ:

+			{

+				*write_cmd = ZOSS_RAMDUMP_FILE_END_RSP;

+				g_zRamdumpIoOpt.write((UINT8 *)write_cmd, sizeof(*write_cmd));

+				g_zRamdumpIoOpt.finish();

+				kfree(read_buffer);

+				kfree(write_buffer);

+				return;

+			}

+

+		default:

+			{

+				*write_cmd = ZOSS_RAMDUMP_FILE_CMD_FAIL;

+				write_datalen = sizeof(*write_cmd);

+				break;

+			}

+		}

+		g_zRamdumpIoOpt.write((UINT8 *)write_buffer, write_datalen);

+	}

+}

+
+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     Óû§Ì¬Ramdump

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void linux_ramdump_user(void)

+{

+    if (ramdump_prepare_user_data() == ZOSS_SUCCESS)

+        ramdump_transfer_user_data();

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_ramlog.c b/cp/ps/plat/src/oss/osa/linux/src/linux_ramlog.c
new file mode 100644
index 0000000..bfedaf1
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_ramlog.c
@@ -0,0 +1,164 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     linux_ramlog.c

+* Îļþ±êʶ:     linux_ramlog.c

+* ÄÚÈÝÕªÒª:     linuxÖ§³Å²ãramlogʵÏÖÄ£¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/07/16      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include <stdarg.h>

+#include "oss_api.h"

+#include "linux_ramlog.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*******************************************************************************

+*                                Íⲿ±äÁ¿ÉùÃ÷                                  *

+*******************************************************************************/

+extern char _ramlog_start[];

+extern char _ramlog_end[];

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+#ifdef LINUX_RAMLOG

+# define RAMLOG_LOCK(flags)     local_irq_save(flags)

+# define RAMLOG_UNLOCK(flags)   local_irq_restore(flags)

+#endif

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+typedef struct {

+    char * const start;

+    char * const end;

+    char *ptr;

+    int full;

+} linux_ramlog_t;

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+#ifdef LINUX_RAMLOG

+static linux_ramlog_t linux_ramlog = {

+    _ramlog_start,

+    _ramlog_end,

+    _ramlog_start,

+    0x00,

+};

+#endif

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ramlog´òÓ¡º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  fmt:    ¸ñʽ»¯²ÎÊý

+                ...:    ¿É±ä²ÎÊýÁбí

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÒÑ´òÓ¡µÄ×Ö·ûÊý

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+int linux_ramlog_printf(const char *fmt, ...)

+{

+#ifdef LINUX_RAMLOG

+    int size;

+    va_list ap;

+    unsigned long flags;

+

+    RAMLOG_LOCK(flags);

+    va_start(ap, fmt);

+    size = vsnprintf(linux_ramlog.ptr, (size_t)(_ramlog_end - linux_ramlog.ptr), fmt, ap);

+    va_end(ap);

+    linux_ramlog.ptr += size;

+    if (linux_ramlog.ptr >= _ramlog_end)

+    {

+        linux_ramlog.ptr = _ramlog_start;

+        linux_ramlog.full = 0x01;

+    }

+    RAMLOG_UNLOCK();

+

+    return size;

+#else

+    return 0x00;

+#endif

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ramlogʹÓÃÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  start:  ramlogÆðʼµØÖ·

+                end:    ramlog½áÊøµØÖ·

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     Èç¹ûfull±ê־λÖÃ룬±íʾramlog»º³åÇøÒÑÂú

+*******************************************************************************/

+void linux_ramlog_info(char **start, char **end)

+{

+#ifdef LINUX_RAMLOG

+    unsigned long flags;

+

+    if (start == NULL || end == NULL)

+        return;

+

+    RAMLOG_LOCK();

+    *start = linux_ramlog.start;

+    if (linux_ramlog.full)

+        *end = linux_ramlog.end;

+    else

+        *end = linux_ramlog.ptr;

+    RAMLOG_UNLOCK();

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÌṩramlogʹÓõĻù±¾ÐÅÏ¢ÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  pMonRamlogInfo: ramlogÐÅÏ¢´æ·ÅµØÖ·             

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID z0ss_GetRamlogInfo(T_ZOss_Mon_Ramlog *pMonRamlogInfo)

+{

+#ifdef _USE_MONITOR

+    char *ramlogStart = NULL;

+    char *ramlogEnd   = NULL;

+

+    if (pMonRamlogInfo)

+    {

+        linux_ramlog_info(&ramlogStart, &ramlogEnd);

+        pMonRamlogInfo->ramlog   = ramlogStart;

+        pMonRamlogInfo->size     = (UINT32)(ramlogEnd - ramlogStart);

+    }

+#endif

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_stat.c b/cp/ps/plat/src/oss/osa/linux/src/linux_stat.c
new file mode 100644
index 0000000..723e35f
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_stat.c
@@ -0,0 +1,213 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     linux_stat.c

+* Îļþ±êʶ:     linux_stat.c

+* ÄÚÈÝÕªÒª:     linux²Ù×÷ϵͳ֧³Å²ãͳ¼ÆÄ£¿éʵÏÖ

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/10/22      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_api.h"

+#include "osa.h"

+#include "sup.h"

+#include "linux_stat.h"

+#include <linux/hrtimer.h>

+#include <linux/tick.h>

+#include <linux/sched.h>

+#include <linux/jiffies.h>

+#include <linux/spinlock.h>

+#include <linux/mutex.h>

+#include <linux/printk.h>

+#include <linux/kernel.h>

+#include <linux/kernel_stat.h>

+#include <linux/hrtimer.h>

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/*******************************************************************************

+*                                Íⲿ±äÁ¿ÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                Íⲿº¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+#define LINUX_STAT_PERIOD_MIN   (10)    /* Unit: ms */

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+static u64 linux_stat_get_cpu_idle_time(int cpu);

+static u64 linux_stat_get_cpu_iowait_time(int cpu);

+static void linux_stat_get_time(u64 *idle_time_ptr, u64 *total_time_ptr);

+static enum hrtimer_restart linux_stat_hrtimer_function(struct hrtimer *hrtimer);

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+static u64 linux_stat_idle_time;

+static u64 linux_stat_total_time;

+static u32 linux_stat_hrtimer_period;

+static linux_stat_callback_t linux_stat_callback;

+static struct hrtimer linux_stat_hrtimer_id;

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡´¦ÀíÆ÷µÄ¿ÕÏÐʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  cpu:    ´¦ÀíÆ÷

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ¿ÕÏÐʱ¼ä

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static u64 linux_stat_get_cpu_idle_time(int cpu)

+{

+    u64 idle_time = -1ULL;

+    u64 real_idle_time;

+

+    if (cpu_online(cpu))

+        idle_time = get_cpu_idle_time_us(cpu, NULL);

+
+    if (idle_time == -1ULL)

+        real_idle_time = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE];

+    else

+        real_idle_time = usecs_to_cputime64(idle_time);

+
+    return real_idle_time;

+}
+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡´¦ÀíÆ÷I/OµÈ´ýʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  cpu:    ´¦ÀíÆ÷

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     I/OµÈ´ýʱ¼ä

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static u64 linux_stat_get_cpu_iowait_time(int cpu)

+{
+    u64 iowait_time = -1ULL;

+    u64 real_iowait_time;

+
+    if (cpu_online(cpu))

+        iowait_time = get_cpu_iowait_time_us(cpu, NULL);

+
+    if (iowait_time == -1ULL)

+        real_iowait_time = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT];

+    else

+        real_iowait_time = usecs_to_cputime64(iowait_time);

+
+    return real_iowait_time;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñȡϵͳʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  idle_time_ptr:  ϵͳ¿ÕÏÐʱ¼äÖ¸Õë

+                total_time_ptr: ϵͳ×Üʱ¼äÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static void linux_stat_get_time(u64 *idle_time_ptr, u64 *total_time_ptr)

+{

+    int cpu;

+    u64 idle_time   = 0x00;

+    u64 total_time  = 0x00;

+

+    zOss_ASSERT(idle_time_ptr != NULL);

+    zOss_ASSERT(total_time_ptr != NULL);

+

+	for_each_possible_cpu(cpu) {

+		total_time  += kcpustat_cpu(cpu).cpustat[CPUTIME_USER];

+		total_time  += kcpustat_cpu(cpu).cpustat[CPUTIME_NICE];

+		total_time  += kcpustat_cpu(cpu).cpustat[CPUTIME_SYSTEM];

+        idle_time   += linux_stat_get_cpu_idle_time(cpu);

+		total_time  += linux_stat_get_cpu_idle_time(cpu);

+		total_time  += linux_stat_get_cpu_iowait_time(cpu);

+		total_time  += kcpustat_cpu(cpu).cpustat[CPUTIME_IRQ];

+		total_time  += kcpustat_cpu(cpu).cpustat[CPUTIME_SOFTIRQ];

+		total_time  += kcpustat_cpu(cpu).cpustat[CPUTIME_STEAL];

+	}

+

+    *idle_time_ptr  = idle_time;

+    *total_time_ptr = total_time;

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ß·Ö±æÂʶ¨Ê±Æ÷»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  hrtimer:    ¸ß·Ö±æÂʶ¨Ê±Æ÷½á¹¹ÌåÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÊÇ·ñÐèÒªÖØÐÂÆô¶¯¶¨Ê±Æ÷±êÖ¾

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+static enum hrtimer_restart linux_stat_hrtimer_function(struct hrtimer *hrtimer)

+{

+    static u64 idle_time, total_time;

+

+    hrtimer_forward_now(&linux_stat_hrtimer_id, ms_to_ktime(linux_stat_hrtimer_period));

+

+    linux_stat_get_time(&idle_time, &total_time);

+    linux_stat_callback(cputime_to_usecs(idle_time  - linux_stat_idle_time),

+                        cputime_to_usecs(total_time - linux_stat_total_time));

+    linux_stat_get_time(&linux_stat_idle_time, &linux_stat_total_time);

+

+    return HRTIMER_RESTART;

+}

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼ÆÄ£¿é×¢²á

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  period:     ¶¨Ê±Æ÷ÖÜÆÚ£¬µ¥Î»: ms

+                callback:   ¶¨Ê±Æ÷»Øµ÷

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+*******************************************************************************/

+void linux_stat_register(u32 period, linux_stat_callback_t callback)

+{

+    zOss_ASSERT(period >= LINUX_STAT_PERIOD_MIN);

+    zOss_ASSERT(callback != NULL);

+

+    linux_stat_hrtimer_period   = period;

+    linux_stat_callback         = callback;

+

+    hrtimer_init(&linux_stat_hrtimer_id, CLOCK_MONOTONIC, HRTIMER_MODE_REL);

+    linux_stat_hrtimer_id.function = linux_stat_hrtimer_function;

+    linux_stat_get_time(&linux_stat_idle_time, &linux_stat_total_time);

+    hrtimer_start(&linux_stat_hrtimer_id, ms_to_ktime(linux_stat_hrtimer_period), HRTIMER_MODE_REL);

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/src/linux_stub.c b/cp/ps/plat/src/oss/osa/linux/src/linux_stub.c
new file mode 100644
index 0000000..8de7647
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/src/linux_stub.c
@@ -0,0 +1,357 @@
+/*******************************************************************************

+* °æÈ¨ËùÓÐ (C)2014, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ:     linux_stub.c

+* Îļþ±êʶ:     linux_stub.c

+* ÄÚÈÝÕªÒª:     linuxÖ§³Å²ã´ò׮ģ¿é

+* 

+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ

+* ------------------------------------------------------------------------------

+* 2014/07/18      V1.0        Create          ÁõÑÇÄÏ          ´´½¨

+* 

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   Í·Îļþ                                     *

+*******************************************************************************/

+#include "oss_api.h"

+#include "osa.h"

+#include "drvs_icp.h"

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*******************************************************************************

+*                                  ³£Á¿¶¨Òå                                    *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                   ºê¶¨Òå                                     *

+*******************************************************************************/

+#define LINUX_THREAD_SLEEP_TIME                 10

+

+#define LINUX_THREAD_NAME                       "linux_thread"

+#define LINUX_THREAD_STACK_SIZE                 2048

+#define LINUX_THREAD_PRIORITY                   29

+

+#define LINUX_THREAD_SEMA_SENDER_NAME           "sema_sender"

+#define LINUX_THREAD_SEMA_SENDER_STACK_SIZE     2048

+#define LINUX_THREAD_SEMA_SENDER_PRIORITY       31

+

+#define LINUX_THREAD_SEMA_RECEIVER_NAME         "sema_receiver"

+#define LINUX_THREAD_SEMA_RECEIVER_STACK_SIZE   2048

+#define LINUX_THREAD_SEMA_RECEIVER_PRIORITY     30

+

+#define LINUX_THREAD_MSG_SENDER_NAME            "msg_sender"

+#define LINUX_THREAD_MSG_SENDER_STACK_SIZE      2048

+#define LINUX_THREAD_MSG_SENDER_PRIORITY        30

+#define LINUX_THREAD_MSG_SENDER_X_SIZE          11

+#define LINUX_THREAD_MSG_SENDER_Y_SIZE          22

+

+#define LINUX_THREAD_MSG_RECEIVER_NAME          "msg_receiver"

+#define LINUX_THREAD_MSG_RECEIVER_STACK_SIZE    2048

+#define LINUX_THREAD_MSG_RECEIVER_PRIORITY      31

+#define LINUX_THREAD_MSG_RECEIVER_SIZE          33

+

+#define LINUX_THREAD_MUTEX_X_NAME               "mutex_x"

+#define LINUX_THREAD_MUTEX_X_STACK_SIZE         2048

+#define LINUX_THREAD_MUTEX_X_PRIORITY           30

+

+#define LINUX_THREAD_MUTEX_Y_NAME               "mutex_y"

+#define LINUX_THREAD_MUTEX_Y_STACK_SIZE         2048

+#define LINUX_THREAD_MUTEX_Y_PRIORITY           31

+

+#define LINUX_TIMER_LENGTH                      1000

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *

+*******************************************************************************/

+static ZOSS_THREAD_ID linux_thread;

+

+static ZOSS_THREAD_ID linux_thread_sema_sender;

+static ZOSS_THREAD_ID linux_thread_sema_receiver;

+static ZOSS_SEMAPHORE_ID linux_sema_sender;

+static ZOSS_SEMAPHORE_ID linux_sema_receiver;

+

+static ZOSS_THREAD_ID linux_thread_msg_sender_x;

+static ZOSS_THREAD_ID linux_thread_msg_sender_y;

+static ZOSS_THREAD_ID linux_thread_msg_receiver;

+

+static ZOSS_THREAD_ID linux_thread_mutex_x;

+static ZOSS_THREAD_ID linux_thread_mutex_y;

+static ZOSS_MUTEX_ID linux_mutex;

+

+static ZOSS_TIMER_ID linux_timer_id;

+

+/*******************************************************************************

+*                                È«¾Ö±äÁ¿¶¨Òå                                  *

+*******************************************************************************/

+

+/*******************************************************************************

+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+

+static VOID linux_thread_entry(SINT32 arg)

+{

+    for (;;) {

+        printk("linux_thread is running\n");

+        zOss_Sleep(LINUX_THREAD_SLEEP_TIME);

+    }

+}

+

+static VOID linux_thread_sema_sender_entry(SINT32 arg)

+{

+    for (;;) {

+        printk("sema_sender is running part1\n");

+        zOss_PutSemaphore(linux_sema_sender);

+        printk("sema_sender is running part2\n");

+        zOss_GetSemaphore(linux_sema_receiver, ZOSS_WAIT_FOREVER);

+    }

+}

+

+static VOID linux_thread_sema_receiver_entry(SINT32 arg)

+{

+    for (;;) {

+        zOss_GetSemaphore(linux_sema_sender, ZOSS_WAIT_FOREVER);

+        printk("sema_receiver is running part1\n");

+        zOss_PutSemaphore(linux_sema_receiver);

+        printk("sema_receiver is running part2\n");

+    }

+}

+

+static VOID linux_thread_msg_sender_entry(SINT32 arg)

+{

+    void *msg_ptr;

+    UINT32 msg_size;

+    const size_t size = (size_t)arg;

+

+    for (;;) {

+        if (linux_thread_msg_receiver == NULL) {

+            zOss_Sleep(LINUX_THREAD_SLEEP_TIME);

+            continue;

+        }

+

+        msg_ptr = kmalloc(size, GFP_ATOMIC);

+        zOss_ASSERT(msg_ptr != NULL);

+        //printk("%s send start!\n", zOss_GetThreadName(zOss_GetCurThreadID(), NULL));

+        zOss_SendMsg(linux_thread_msg_receiver, msg_ptr, size, ZOSS_WAIT_FOREVER);

+        //printk("%s send end!\n", zOss_GetThreadName(zOss_GetCurThreadID(), NULL));

+        zOss_Sleep(LINUX_THREAD_SLEEP_TIME);

+

+        printk("%s receive start!\n", zOss_GetThreadName(zOss_GetCurThreadID(), NULL));

+        zOss_RecvMsg(&msg_ptr, &msg_size, ZOSS_WAIT_FOREVER);

+        printk("%s receive end! msg_size:%u\n", zOss_GetThreadName(zOss_GetCurThreadID(), NULL), (unsigned int)msg_size);

+        kfree(msg_ptr);

+    }

+}

+

+static VOID linux_thread_msg_receiver_entry(SINT32 arg)

+{

+    void *msg_ptr;

+    UINT32 msg_size;

+

+    for (;;) {

+        printk("msg_receiver receive start!\n");

+        zOss_RecvMsg(&msg_ptr, &msg_size, ZOSS_WAIT_FOREVER);

+        printk("msg_receiver receive end! msg_size:%u\n", (unsigned int)msg_size);

+        kfree(msg_ptr);

+

+        msg_ptr = kmalloc(LINUX_THREAD_MSG_RECEIVER_SIZE, GFP_ATOMIC);

+        zOss_ASSERT(msg_ptr != NULL);

+        //printk("msg_receiver send to sender_x start!\n");

+        zOss_SendMsg(linux_thread_msg_sender_x, msg_ptr, LINUX_THREAD_MSG_RECEIVER_SIZE, ZOSS_WAIT_FOREVER);

+        //printk("msg_receiver send to sender_x end!\n");

+        zOss_Sleep(LINUX_THREAD_SLEEP_TIME);

+

+        msg_ptr = kmalloc(LINUX_THREAD_MSG_RECEIVER_SIZE, GFP_ATOMIC);

+        zOss_ASSERT(msg_ptr != NULL);

+        //printk("msg_receiver send to sender_y start!\n");

+        zOss_SendMsg(linux_thread_msg_sender_y, msg_ptr, LINUX_THREAD_MSG_RECEIVER_SIZE, ZOSS_WAIT_FOREVER);

+        //printk("msg_receiver send to sender_y end!\n");

+        zOss_Sleep(LINUX_THREAD_SLEEP_TIME);

+    }

+}

+

+static VOID linux_thread_mutex_x_entry(SINT32 arg)

+{

+    for (;;) {

+        zOss_GetMutex(linux_mutex, ZOSS_WAIT_FOREVER);

+        zOss_GetMutex(linux_mutex, ZOSS_WAIT_FOREVER);

+        printk("mutex_x is running\n");

+        zOss_PutMutex(linux_mutex);

+        zOss_PutMutex(linux_mutex);

+        zOss_Sleep(LINUX_THREAD_SLEEP_TIME);

+    }

+}

+

+static VOID linux_thread_mutex_y_entry(SINT32 arg)

+{

+    for (;;) {

+        zOss_GetMutex(linux_mutex, ZOSS_WAIT_FOREVER);

+        zOss_GetMutex(linux_mutex, ZOSS_WAIT_FOREVER);

+        printk("mutex_y is running\n");

+        zOss_PutMutex(linux_mutex);

+        zOss_PutMutex(linux_mutex);

+        zOss_Sleep(LINUX_THREAD_SLEEP_TIME);

+    }

+}

+

+static VOID linux_timer_callback(SINT32 arg)

+{

+    printk("linux_timer is running\n");

+}

+

+/*******************************************************************************

+*                                È«¾Öº¯ÊýʵÏÖ                                  *

+*******************************************************************************/

+void linux_wbt_sema_init(void)

+{

+    linux_sema_sender = zOss_CreateSemaphore(NULL, 0);

+    linux_sema_receiver = zOss_CreateSemaphore(NULL, 0);

+

+    linux_thread_sema_receiver = 

+        zOss_CreateThread(LINUX_THREAD_SEMA_RECEIVER_NAME,

+                          linux_thread_sema_receiver_entry,

+                          0x00,

+                          LINUX_THREAD_SEMA_RECEIVER_STACK_SIZE,

+                          LINUX_THREAD_SEMA_RECEIVER_PRIORITY,

+                          true,

+                          true);

+

+    linux_thread_sema_sender = 

+        zOss_CreateThread(LINUX_THREAD_SEMA_SENDER_NAME,

+                          linux_thread_sema_sender_entry,

+                          0x00,

+                          LINUX_THREAD_SEMA_SENDER_STACK_SIZE,

+                          LINUX_THREAD_SEMA_SENDER_PRIORITY,

+                          true,

+                          true);

+}

+

+void linux_wbt_msg_init(void)

+{

+    linux_thread_msg_sender_x = 

+        zOss_CreateThread(LINUX_THREAD_MSG_SENDER_NAME"_x",

+                          linux_thread_msg_sender_entry,

+                          LINUX_THREAD_MSG_SENDER_X_SIZE,

+                          LINUX_THREAD_MSG_SENDER_STACK_SIZE,

+                          LINUX_THREAD_MSG_SENDER_PRIORITY,

+                          true,

+                          true);

+

+    linux_thread_msg_receiver = 

+        zOss_CreateThread(LINUX_THREAD_MSG_RECEIVER_NAME,

+                          linux_thread_msg_receiver_entry,

+                          0x00,

+                          LINUX_THREAD_MSG_RECEIVER_STACK_SIZE,

+                          LINUX_THREAD_MSG_RECEIVER_PRIORITY,

+                          true,

+                          true);

+

+    linux_thread_msg_sender_y = 

+        zOss_CreateThread(LINUX_THREAD_MSG_SENDER_NAME"_y",

+                          linux_thread_msg_sender_entry,

+                          LINUX_THREAD_MSG_SENDER_Y_SIZE,

+                          LINUX_THREAD_MSG_SENDER_STACK_SIZE,

+                          LINUX_THREAD_MSG_SENDER_PRIORITY,

+                          true,

+                          true);

+}

+

+void linux_wbt_mutex_init(void)

+{

+    linux_mutex = zOss_CreateMutex("linux_mutex", ZOSS_INHERIT);

+

+    linux_thread_mutex_x = 

+        zOss_CreateThread(LINUX_THREAD_MUTEX_X_NAME,

+                          linux_thread_mutex_x_entry,

+                          0x00,

+                          LINUX_THREAD_MUTEX_X_STACK_SIZE,

+                          LINUX_THREAD_MUTEX_X_PRIORITY,

+                          true,

+                          true);

+

+    linux_thread_mutex_y = 

+        zOss_CreateThread(LINUX_THREAD_MUTEX_Y_NAME,

+                          linux_thread_mutex_y_entry,

+                          0x00,

+                          LINUX_THREAD_MUTEX_Y_STACK_SIZE,

+                          LINUX_THREAD_MUTEX_Y_PRIORITY,

+                          true,

+                          true);

+}

+

+void linux_wbt_thread_init(void)

+{

+    linux_thread = 

+        zOss_CreateThread(LINUX_THREAD_NAME,

+                          linux_thread_entry,

+                          0x00,

+                          LINUX_THREAD_STACK_SIZE,

+                          LINUX_THREAD_PRIORITY,

+                          true,

+                          true);

+}

+

+void linux_wbt_timer_init(void)

+{

+    linux_timer_id = zOss_CreateTimer("timer", linux_timer_callback, 0x00, TRUE);

+    zOss_StartTimer(linux_timer_id, LINUX_TIMER_LENGTH, linux_timer_callback, 0x00);

+}

+

+void linux_stub_init(void)

+{

+    linux_wbt_mutex_init();

+

+    linux_wbt_timer_init();

+

+    linux_wbt_msg_init();

+

+    linux_wbt_thread_init();

+

+    linux_wbt_sema_init();

+}

+

+#ifndef _USE_RAMDUMP

+

+VOID Osa_SysErrHndInit(VOID)

+{

+

+}

+

+VOID ramdump_process(const T_HalIcp_Msg *pMsg)

+{

+   // T_HalIcp_Dword state = { 0 };

+   

+   // zDrvIcp_GetState( ICP_MSG_ACTOR_ARM, &state );

+   // zDrvIcp_ClearState( ICP_MSG_ACTOR_ARM, state );

+

+    /* ʹµÃarm0²úÉúÒì³££¬ÒԱ㿪ʼramdump */

+    zOss_ASSERT( FALSE );

+}

+

+VOID zOss_RamdumpForceException(UINT32 type)

+{       

+

+}

+

+VOID zOss_RamdumpConfigureMem(UINT32 base, UINT32 size, UINT32 map_base, UINT32 copy_base)

+{

+

+}

+

+#endif

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/linux/ws/makefile b/cp/ps/plat/src/oss/osa/linux/ws/makefile
new file mode 100644
index 0000000..2cb4afd
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/ws/makefile
@@ -0,0 +1,62 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2014 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ:    Makefile

+#* Îļþ±êʶ:    Makefile

+#* ÄÚÈÝÕªÒª:    linuxÊÊÅä²ã±àÒë

+#* ʹÓ÷½·¨:     

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2014/07/10      V1.0        Create         ÁõÑÇÄÏ        ´´½¨

+#* 

+# *****************************************************************************/

+

+#===============================================================================

+#¹«¹²Í·Îļþ

+#===============================================================================

+include $(PRJ_PATH)/config/project.mk

+

+#===============================================================================

+#×ÓϵͳÃû³Æ

+#===============================================================================

+_SUBSYS_NAME = plat_osa_linux

+

+#===============================================================================

+#×ÓϵͳÉú³ÉµÄ¿âÎļþ·¾¶

+#===============================================================================

+_SUBSYS_LIB_PATH = $(PLAT_LIB_INTERNAL_PATH)

+

+#===============================================================================

+#Ä£¿éÎļþÅäÖÃ

+#===============================================================================

+ifeq ($(USE_OSS_MIN), yes)

+_ALL_MDLS     = osa_linux

+_ALL_OBJECTS  = $(wildcard $(OBJ_PATH)/plat/oss/osa/osa_linux/*.o)

+else

+_ALL_MDLS     = osa_linux com

+_ALL_OBJECTS  = $(wildcard $(OBJ_PATH)/plat/oss/osa/com/*.o)                \

+                $(wildcard $(OBJ_PATH)/plat/oss/osa/osa_linux/*.o)

+endif

+

+#===============================================================================

+#commonÄ¿±êµÄmake¹æÔò

+#===============================================================================

+com:

+	@$(GNUMAKE) --no-print-directory -C $(PLAT_PATH)/src/oss/osa/com

+comclean:

+	@$(GNUMAKE) --no-print-directory -C $(PLAT_PATH)/src/oss/osa/com clean

+

+#===============================================================================

+#osa_linuxÄ¿±êµÄmake¹æÔò

+#===============================================================================

+osa_linux:

+	@$(GNUMAKE) --no-print-directory -C $(PLAT_PATH)/src/oss/osa/linux/ws -f osa_linux.mk

+osa_linuxclean:

+	@$(GNUMAKE) --no-print-directory -C $(PLAT_PATH)/src/oss/osa/linux/ws -f osa_linux.mk clean

+

+#===============================================================================

+#±àÒë¹æÔò

+#===============================================================================

+include $(FRAME_PATH)/rules/lib_rules.mk

+

diff --git a/cp/ps/plat/src/oss/osa/linux/ws/osa_linux.mk b/cp/ps/plat/src/oss/osa/linux/ws/osa_linux.mk
new file mode 100644
index 0000000..767fac9
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/linux/ws/osa_linux.mk
@@ -0,0 +1,169 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2014 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ:    Makefile

+#* Îļþ±êʶ:    Makefile

+#* ÄÚÈÝÕªÒª:    linux²Ù×÷ϵͳÊÊÅä²ãÅäÖÃÎļþ

+#* ʹÓ÷½·¨:    include osa_linux.mk

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2014/09/09      V1.0        Create         ÁõÑÇÄÏ        ´´½¨

+#* 

+# *****************************************************************************/

+

+#===============================================================================

+#¹«¹²Í·Îļþ

+#===============================================================================

+include $(PRJ_PATH)/config/project.mk

+

+#===============================================================================

+#Ä£¿éÃû³Æ

+#===============================================================================

+_MDL_NAME = osa_linux

+

+#===============================================================================

+#Ä£¿é·¾¶

+#===============================================================================

+_MDL_SRC_PATH = $(PLAT_PATH)/src/oss/osa/linux/src

+_MDL_INC_PATH = $(PLAT_PATH)/src/oss/osa/linux/inc

+_MDL_OBJ_PATH = $(OBJ_PATH)/plat/oss/osa/$(_MDL_NAME)

+

+#===============================================================================

+#Í·Îļþ²éÕÒ·¾¶

+#===============================================================================

+INCLUDE += -I$(PLAT_PATH)/inc                                               \

+           -I$(PLAT_PATH)/inc/oss                                           \

+           -I$(PLAT_PATH)/inc/Drv                                           \

+           -I$(PLAT_PATH)/src/oss/osa/inc                                   \

+           -I$(PLAT_PATH)/src/oss/sup/inc                                   \

+           -I$(PLAT_PATH)/inc/oss/tp                                        \

+           -I$(PLAT_PATH)/inc/drv/hal                                       \

+           -I$(COMMOM_PATH)/src/appstart/inc                                \

+           -I$(COMMOM_PATH)/inc/config                                      \

+           -I$(DRV_PATH)/inc                                                \

+           -I$(PRJ_PATH)/ws/dosmake/makefw/os/linux                         \

+           -I$(_MDL_INC_PATH)

+

+#===============================================================================

+#×ÓϵͳÀ©Õ¹¶¨Òå

+#===============================================================================

+DEFINE  +=

+

+#===============================================================================

+#Ä£¿éÎļþÐÅÏ¢

+#===============================================================================

+ifeq ($(USE_OSS_MIN), yes)

+#_C_SOURCE  = $(wildcard $(_MDL_SRC_PATH)/linux_irq.c)

+else

+_C_SOURCE  = $(wildcard $(_MDL_SRC_PATH)/linux_kernel.c)                    \

+             $(wildcard $(_MDL_SRC_PATH)/linux_ramlog.c)                    \

+             $(wildcard $(_MDL_SRC_PATH)/linux_mem.c)                       \

+             $(wildcard $(_MDL_SRC_PATH)/linux_stat.c)

+endif

+

+ifeq ($(CPU_ARCH), armv5)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_arm.c)

+ifeq ($(USE_MULTI_CORE_RAMDUMP), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_ramdump.c)

+else

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_ramdump_arm.c)

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_arm_asm_rvct.S)

+endif

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_arm_asm.S)

+endif

+endif

+endif

+

+ifeq ($(CPU_ARCH), armv6)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_arm.c)

+ifeq ($(USE_MULTI_CORE_RAMDUMP), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_ramdump.c)

+else

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_ramdump_arm.c)          

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_arm_asm_rvct.S)

+endif

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_arm_asm.S)

+endif

+endif

+endif

+

+ifeq ($(CPU_ARCH), armv7-r)

+

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_arm.c)                \

+             $(wildcard $(_MDL_SRC_PATH)/linux_mpu_map.c)

+

+ifeq ($(USE_MULTI_CORE_RAMDUMP), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_ramdump.c)

+else

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_ramdump_arm.c)

+

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_arm_asm_rvct.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_arm_asm.S)

+endif

+

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_mpu_arm_cp15.S)

+endif

+

+endif

+

+ifeq ($(CPU_ARCH), armv7-a)

+

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_arm.c)                \

+             $(wildcard $(_MDL_SRC_PATH)/linux_mpu_map.c)

+

+ifeq ($(USE_MULTI_CORE_RAMDUMP), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_ramdump.c)

+else

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_ramdump_arm.c)

+

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_arm_asm_rvct.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+#_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_arm_asm.S)

+endif

+

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_mpu_arm_cp15.S)

+endif

+

+endif

+

+ifeq ($(CPU_ARCH), armv6-m)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_cortexm.c)

+ifeq ($(USE_MULTI_CORE_RAMDUMP), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_ramdump.c)

+endif

+endif

+

+ifeq ($(CPU_ARCH), ck610)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_csky.c)               \

+             $(wildcard $(_MDL_SRC_PATH)/linux_mmu_csky.c)                  \

+             $(wildcard $(_MDL_SRC_PATH)/linux_ramdump_csky.c)

+

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/linux_except_csky_asm.S)

+endif

+

+_S_SOURCE += 

+_s_SOURCE += 

+

+#===============================================================================

+# ±àÒë¹æÔò

+#===============================================================================

+include $(FRAME_PATH)/rules/mdl_rules.mk

+

diff --git a/cp/ps/plat/src/oss/osa/ose/inc/ose_ramdump_arm.h b/cp/ps/plat/src/oss/osa/ose/inc/ose_ramdump_arm.h
new file mode 100644
index 0000000..2a62b98
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/ose/inc/ose_ramdump_arm.h
@@ -0,0 +1,157 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : ose_ramdump_arm.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ÌṩramdumpÏûÏ¢½á¹¹Ìå

+* ×÷    Õß : luxieji

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2010/05/26

+* ÆäËü˵Ã÷ :           

+**************************************************************************/

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/09/15

+* ÐÞ¸ÄÄÚÈÝ : PC-LINT¼ì²éÓÚ±àÂë¹æ·¶ÐÞ¸Ä EC: 617001781881  

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC: 617001781957

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+#ifndef _OSE_RAMDUMP_ARM_H

+#define _OSE_RAMDUMP_ARM_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "osa_api.h"

+#include "osa_ramdump.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* Ö¸ÁÒå */

+#define DUMPFILE_LINK_REQ                   1   /* ͬ²½ÇëÇó                             */

+#define DUMPFILE_LINK_RSP                   2   /* ͬ²½ÇëÇóÓ¦´ð,´«ÊäramdumpµÄÎļþÊýÄ¿   */

+#define DUMPFILE_FILE_REQ                   3   /* ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅµÄÎļþÐÅÏ¢       */

+#define DUMPFILE_FILE_RSP                   4   /* ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅµÄÎļþÐÅÏ¢µÄÓ¦´ð£¬

+                                                   ´«ÊäÎļþÃû¼°´óС                     */

+#define DUMPFILE_READ_REQ                   5   /* ÇëÇó¶Áȡָ¶¨Îļþ±àºÅµÄÎļþÄÚÈÝ       */

+#define DUMPFILE_READ_RSP                   6   /* ÇëÇó¶Áȡָ¶¨Îļþ±àºÅµÄÎļþÄÚÈݵÄÓ¦´ð£¬

+                                                   ´«ÊäÎļþÄÚÈÝ                         */

+#define DUMPFILE_END_REQ                    7   /* ´«Êä½áÊø                             */

+#define DUMPFILE_END_RSP                    8   /* ´«Êä½áÊøÓ¦´ð                         */

+

+/*´íÎóÀàÐÍ*/

+#define DUMPFILE_CMD_FAIL                   9   /* Ö¸Áî´íÎó                             */

+#define DUMPFILE_NO_FAIL                    10  /* ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅ´í               */

+#define DUMPFILE_LENGTH_FAIL                11  /* ÇëÇó´«µÝÖ¸¶¨ÎļþλÖôóС´í           */

+#define CMD_BUFFER_LEN                      16  /* Ö¸ÁîÖ¡³¤¶È                           */

+

+/* ¸ß¶ÎÄÚ´æ¿é´óСÅäÖà */

+#define HIGHMEM_CMM_INFO_SIZE               (4096)

+#define HIGHMEM_CONFIGURED_REGION_SIZE      (4096)

+#define HIGHMEM_PARSED_REGION_SIZE          (4096)

+#define HIGHMEM_FILE_INFO_SIZE              (2048)

+#define HIGHMEM_ERR_CODE_SIZE               (1024)

+#define HIGHMEM_IO_READBUF_SIZE             (1024)

+#define HIGHMEM_IO_WRITEBUF_SIZE            (1024)

+

+#ifdef _USE_ARM1_RAMDUMP

+#define HIGHMEM_FLAG_ARM02ARM1_SIZE         (4)

+#define HIGHMEM_FLAG_ARM12ARM0_SIZE         (4)

+#endif

+

+/* arm0²à¸ß¶ÎÄÚ´æ¿é¿Õ¼äÅäÖà */

+#define HIGHMEM_ARM0_CMM_INFO_BASE          (HIGHMEM_ARM0_BASE)

+#define HIGHMEM_ARM0_CONFIGURED_REGION_BASE (HIGHMEM_ARM0_CMM_INFO_BASE          + HIGHMEM_CMM_INFO_SIZE         )

+#define HIGHMEM_ARM0_PARSED_REGION_BASE     (HIGHMEM_ARM0_CONFIGURED_REGION_BASE + HIGHMEM_CONFIGURED_REGION_SIZE)

+#define HIGHMEM_ARM0_FILE_INFO_BASE         (HIGHMEM_ARM0_PARSED_REGION_BASE     + HIGHMEM_PARSED_REGION_SIZE    )

+#define HIGHMEM_ARM0_ERR_CODE_BASE          (HIGHMEM_ARM0_FILE_INFO_BASE         + HIGHMEM_FILE_INFO_SIZE        )

+#define HIGHMEM_ARM0_IO_READBUF_BASE        (HIGHMEM_ARM0_ERR_CODE_BASE          + HIGHMEM_ERR_CODE_SIZE         )

+#define HIGHMEM_ARM0_IO_WRITEBUF_BASE       (HIGHMEM_ARM0_IO_READBUF_BASE        + HIGHMEM_IO_READBUF_SIZE       )

+

+#ifdef _USE_ARM1_RAMDUMP

+/* arm1²à¸ß¶ÎÄÚ´æ¿é¿Õ¼äÅäÖà */

+#define HIGHMEM_ARM1_CMM_INFO_BASE          (HIGHMEM_ARM1_BASE)

+#define HIGHMEM_ARM1_CONFIGURED_REGION_BASE (HIGHMEM_ARM1_CMM_INFO_BASE          + HIGHMEM_CMM_INFO_SIZE         )

+#define HIGHMEM_ARM1_PARSED_REGION_BASE     (HIGHMEM_ARM1_CONFIGURED_REGION_BASE + HIGHMEM_CONFIGURED_REGION_SIZE)

+#define HIGHMEM_ARM1_ERR_CODE_BASE          (HIGHMEM_ARM1_PARSED_REGION_BASE     + HIGHMEM_PARSED_REGION_SIZE    )

+#define HIGHMEM_ARM1_FLAG_ARM02ARM1_BASE    (HIGHMEM_ARM1_ERR_CODE_BASE          + HIGHMEM_ERR_CODE_SIZE         )

+#define HIGHMEM_ARM1_FLAG_ARM12ARM0_BASE    (HIGHMEM_ARM1_FLAG_ARM02ARM1_BASE    + HIGHMEM_FLAG_ARM02ARM1_SIZE   )

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ramdumpÄ£¿éÏûÏ¢Ì嶨Òå

+**************************************************************************/

+/* ͬ²½ÇëÇóÓ¦´ð */

+typedef struct

+{

+    UINT32 fileNum;                     /* Òª´«ÊäµÄÎļþ¸öÊý         */

+}T_DUMPFILE_LINK_RSP;

+

+/* ¿ªÊ¼Îļþ´«ÊäÇëÇóÏûÏ¢Ìå */

+typedef struct

+{

+    UINT32 fileNo;                      /* Îļþ±àºÅ,0¿ªÊ¼           */

+}T_DUMPFILE_FILE_REQ;

+

+/* ¿ªÊ¼Îļþ´«Ê仨ӦÏûÏ¢Ìå */

+typedef struct

+{

+    CHAR   fileName[DUMPFILENMAE_LEN];  /* ÎļþÃû                   */

+    UINT32 size;                        /* Îļþ´óС                 */

+}T_DUMPFILE_FILE_RSP;

+

+/* ¶ÁÊý¾ÝÇëÇóÏûÏ¢Ìå */

+typedef struct

+{

+    UINT32 fileNo;                      /* Îļþ±àºÅ                 */

+    UINT32 offset;                      /* offsetΪÊý¾ÝÆ«ÒÆ         */

+    UINT32 length;                      /* lengthΪÊý¾Ý³¤¶È         */

+}T_DUMPFILE_READ_REQ;

+

+/* ¶ÁÊý¾Ý»ØÓ¦ÏûÏ¢Ìå */

+typedef struct

+{

+    CHAR data[1];              		    /* Êý¾ÝÄÚÈÝ£¬ºóÐø»¹ÓÐÊý¾Ý£¬

+                                           ¿É±ä,ΪÇëÇó³¤¶È          */

+}T_DUMPFILE_READ_RSP;

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+VOID zOss_RamdumpUsbInit(VOID);

+VOID zOss_RamdumpUsbReadData(UINT8 *buffer, UINT32 size);

+VOID zOss_RamdumpUsbWriteData(UINT8 *buffer, UINT32 size);

+VOID zOss_RamdumpUsbFinish(VOID);

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif/* _OSE_RAMDUMP_ARM_H */

+

diff --git a/cp/ps/plat/src/oss/osa/ose/inc/ose_typedef.h b/cp/ps/plat/src/oss/osa/ose/inc/ose_typedef.h
new file mode 100644
index 0000000..ec603d2
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/ose/inc/ose_typedef.h
@@ -0,0 +1,79 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : ose_typedef.h 

+* ÎÄ ¼þ Ãû : ose_typedef.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ¶¨ÒåÁËose²Ù×÷ϵͳÖÐÐèÒªÓõ½µÄÀàÐÍ

+* ×÷    Õß : ºÎº£½¨

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007/06/01

+* ÆäËü˵Ã÷ : ¶¨ÒåÁËose²Ù×÷ϵͳÖÐÐèÒªÓõ½µÄÀàÐÍ          

+**************************************************************************/

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/09/15

+* ÐÞ¸ÄÄÚÈÝ : PC-LINT¼ì²éÓÚ±àÂë¹æ·¶ÐÞ¸Ä EC: 617001781881  

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC: 617001781957

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#ifndef _OSE_TYPEDEF_H

+#define _OSE_TYPEDEF_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    SIGSELECT   sig_no;                         /* ³ÉÔ±ÔڽṹÌåÖеÄλÖò»ÄÜ¸Ä±ä     */

+    UINT32      size;                           /* ¼Ç¼Êý¾ÝËùÕ¼×Ö½ÚÊý               */

+    VOID        *msg_ptr;                       /* ÏûÏ¢ÌåÖ¸Õë                       */

+}T_OsaMsgSig;

+

+

+/**************************************************************************

+* ³£Á¿¶¨ÒåÇø

+**************************************************************************/

+#define OSA_LOWESTPRIORITY      (31)            /* ×îµÍÓÅÏȼ¶                       */

+#define OSA_TIMESLICE           (5)             /* ´´½¨½ø³ÌµÄʱ¼äƬ                 */

+#define SIGNAL_MSG_NUMBER       (256)           /* ÓÃÓÚÊÕ·¢ÏûÏ¢º¯ÊýÄÚ²¿signal number Reserved for users/applications, 256-29999 */

+#define SIGNAL_OSSFD_MSG_NUMBER (300)           /* ÓÃÓÚoss_fd¹²ÏíÊÕ·¢ÏûÏ¢           */ 	

+#define OSA_TIMEOUT_INTERVAL    (10)            /* ³¬Ê±ÂÖѯ¼ä¸ô                     */

+

+#define OSA_THREADFUN           "ThreadFun"     /* EÏ̻߳·¾³±äÁ¿Ãû,Èë¿Úº¯Êý         */

+#define OSA_THREADARG           "ThreadArg"     /* Ï̻߳·¾³±äÁ¿Ãû,Èë¿Úº¯ÊýÐβΠ     */

+#define OSA_THREADPREEMPT       "ThreadPeempt"  /* Ï̻߳·¾³±äÁ¿Ãû                   */

+#define OSA_TASKTRF             "TaskTrfParam"  /* ÈÎÎñID»·¾³±äÁ¿Ãû                 */

+

+#define OSA_PID_TO_INDEX(pid) ((UINT32)(pid) & 0xffffu)

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _OSE_TYPEDEF_H */

+

diff --git a/cp/ps/plat/src/oss/osa/ose/src/ose_card.c b/cp/ps/plat/src/oss/osa/ose/src/ose_card.c
new file mode 100644
index 0000000..aa95dec
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/ose/src/ose_card.c
@@ -0,0 +1,868 @@
+/**************************************************************************
+*
+*                  Copyright (c) 2012 ZTE Corporation.
+*
+***************************************************************************
+* Ä£ ¿é Ãû : ose_card.c
+* ÎÄ ¼þ Ãû : ose_card.c
+* Ïà¹ØÎļþ : 
+* ʵÏÖ¹¦ÄÜ : uÅÌÄ£¿é
+* ×÷    Õß : ÁõÑÇÄÏ
+* °æ    ±¾ : V1.0
+* Íê³ÉÈÕÆÚ : 2010/10/08
+* ÆäËü˵Ã÷ :          
+**************************************************************************/
+/**************************************************************************
+* Ð޸ļǼ
+**************************************************************************/
+/**************************************************************************
+* Ð޸ıàºÅ : 0001
+* ÐÞ ¸Ä ÈË : junkuiZhao
+* ÐÞ¸ÄÈÕÆÚ : 2012/09/15
+* ÐÞ¸ÄÄÚÈÝ : PC-LINT¼ì²éÓÚ±àÂë¹æ·¶ÐÞ¸Ä EC: 617001781881  
+**************************************************************************/
+/**************************************************************************
+* Ð޸ıàºÅ : 0002
+* ÐÞ ¸Ä ÈË : junkuiZhao
+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10
+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC: 617001781957
+**************************************************************************/
+
+/**************************************************************************
+* #includeÇø
+**************************************************************************/
+#include <string.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include "ose.h"
+#include "ose_err.h"
+#include "osetypes.h"
+#include "assert.h"
+#include "stdlib.h"
+#include "efs.h"
+#include "efs_err.h"
+#include "efs.sig"
+#include "fss.sig"
+#include "ddb.sig"
+#include "cpu.h"
+#include "ramlog.h"
+#include "sysparam.h"
+#include "oss_api.h"
+#include "Hal_fsms.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/**************************************************************************
+* ³£Á¿¶¨ÒåÇø
+**************************************************************************/
+#define DDBUNIT             2
+#define DDBNAME             "udisk"
+#define DDBWHAT             "EFS udisk ddb"
+#define BIOSHANDLE          0   /* Bios/trap interface not used. */
+#define BLOCK_SIZE          512
+
+#ifndef UDISK_MAX_CLIENTS
+#define UDISK_MAX_CLIENTS   4
+#endif
+
+#define DISCNUM             0
+
+/**************************************************************************
+* Êý¾Ý½á¹¹¶¨ÒåÇø
+**************************************************************************/ 
+
+typedef union SIGNAL 
+{
+    SIGSELECT sigNo;
+} T_ZOsa_Card_Signal;
+
+typedef struct 
+{
+    PROCESS     pid;
+    OSATTREF    attref;
+    UINT32      low_blk;
+    UINT32      high_blk;
+} T_ZOsa_Card_Client;
+
+typedef struct 
+{
+    PROCESS             fss_pid;
+    OSATTREF            fss_attref;
+    UINT32              num_blks;   /* udisk size   */
+    T_ZOsa_Card_Client  clients[UDISK_MAX_CLIENTS];
+    int                 fd;
+} T_ZOsa_Card_State;
+
+/**************************************************************************
+* ¾Ö²¿¾²Ì¬±äÁ¿
+**************************************************************************/
+
+/**************************************************************************
+* È«¾Ö±äÁ¿
+**************************************************************************/
+
+/************************************************************************** 
+* Íⲿ±äÁ¿ÉùÃ÷
+**************************************************************************/   
+
+/**************************************************************************  
+* Íⲿº¯ÊýÉùÃ÷
+**************************************************************************/
+//¿ÉÒÔÓ¦ÓÃÍ·Îļþ
+extern FS_MS_ERROR_TYPE FS_MS_GetGeometry( unsigned int DiscNR, 
+                                           unsigned int *total_lba, 
+                                           unsigned int* sector_size);
+
+extern PROCESS create_and_supervise( const char *name,
+                                     OSENTRYPOINT *entrypoint,
+                                     OSADDRESS stacksize,
+                                     OSPRIORITY priority,
+                                     OSATTREF *attref);
+
+/**************************************************************************
+* ¾Ö²¿º¯ÊýʵÏÖ
+**************************************************************************/
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic UINT32 udisk_number_clients(const T_ZOsa_Card_State *st)
+* ¹¦ÄÜÃèÊö£º¼ÆËãudiskÖа²×°µÄ¿Í»§¶Ë(ijÖÖÎļþϵͳ)µÄÊýÁ¿
+* ²ÎÊý˵Ã÷£º(IN)    st  udisk״̬½á¹¹ÌåÖ¸Õë
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºudiskÖÐÒѾ­mountµÄÎļþϵͳÊýÁ¿
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static UINT32 udisk_number_clients(const T_ZOsa_Card_State *st)
+{
+    UINT32 cnt    = 0;
+    UINT32 count  = 0;
+
+    zOss_AssertEx(st != NULL, 0);
+
+    for (; cnt < UDISK_MAX_CLIENTS; cnt++)
+    {
+        if (st->clients[cnt].pid != 0)
+        {
+            count++;
+        }
+    }
+
+    return count;
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic T_ZOsa_Card_Client   *udisk_find_match(T_ZOsa_Card_State *st,
+                                                   PROCESS pid,
+                                                   UINT32 low_blk,
+                                                   UINT32 high_blk)
+* ¹¦ÄÜÃèÊö£ºÔÚudiskÒѾ­°²×°µÄ¿Í»§¶ËÖУ¬²éÕÒÖ¸¶¨ÎļþϵͳÏß³ÌidºÅºÍÖ¸¶¨block·¶Î§
+            µÄÎļþϵͳ
+* ²ÎÊý˵Ã÷£º(IN)    st: udisk״̬½á¹¹ÌåÖ¸Õë
+                    pid: ´ý²éÕÒÎļþϵͳµÄ¹ÜÀíÏß³ÌidºÅ
+                    low_blk: ×îСblockºÅ
+                    high_blk: ×î´óblockºÅ
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºÕÒµ½µÄÎļþϵͳ¿Í»§¶Ë
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static T_ZOsa_Card_Client   *udisk_find_match( T_ZOsa_Card_State *st,
+                                        PROCESS pid,
+                                        UINT32 low_blk,
+                                        UINT32 high_blk )
+{
+    UINT32              cnt     = 0;
+    T_ZOsa_Card_Client *client  = NULL;
+
+    zOss_ASSERT(low_blk <= high_blk);
+
+    zOss_AssertEx(st != NULL, NULL);
+
+    for (; cnt < UDISK_MAX_CLIENTS; cnt++)
+    {
+        client = &st->clients[cnt];
+
+        if (client->pid != 0 &&
+            pid == client->pid &&
+            low_blk >= client->low_blk &&
+            high_blk <= client->high_blk)
+        {
+            return client;
+        }
+    }
+
+    return NULL;
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic VOID udisk_init_state(T_ZOsa_Card_State *st)
+* ¹¦ÄÜÃèÊö£º³õʼ»¯udisk״̬½á¹¹Ìå
+* ²ÎÊý˵Ã÷£º(IN)    st  ´ý³õʼ»¯µÄudisk״̬½á¹¹ÌåÖ¸Õë
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºVOID
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static VOID udisk_init_state(T_ZOsa_Card_State *st)
+{
+    UINT32 total_lba      = 0;
+    UINT32 sector_size    = 0;
+    
+    T_ZOsa_Card_Signal *sig = alloc(sizeof(SIGSELECT), HUNT_FSS);
+    
+    zOss_AssertExN(st != NULL);
+
+    hunt("ose_fss", 0, NULL, &sig);
+
+    zOss_Memset(st, 0, sizeof(*st));
+
+    FS_MS_GetGeometry(DISCNUM, (unsigned int *)&total_lba, (unsigned int *)&sector_size);
+
+    st->num_blks = total_lba;
+    
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic BOOL udisk_read_block(const T_ZOsa_Card_State *st,
+                                            UINT32 blk_nr,
+                                            UINT32 *dest_addr)
+* ¹¦ÄÜÃèÊö£º´ÓudiskÖжÁȡһ¸öblockµ½ÄÚ´æµØÖ·:dest_addr´¦
+* ²ÎÊý˵Ã÷£º(IN)    st:udisk״̬½á¹¹ÌåÖ¸Õë
+                    blk_nr:´ý¶ÁÈ¡µÄblock±àºÅ
+                    dest_addr:Ä¿µÄµØÖ·
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºÈç¹û¶ÁÈ¡³É¹¦£¬·µ»ØTRUE£»·ñÔò·µ»ØFALSE
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static BOOL udisk_read_block( const T_ZOsa_Card_State *st,
+                              UINT32 blk_nr,
+                              UINT32 num_blks,
+                              UINT32 *dest_addr )
+{        
+    if( FS_MS_OK == hal_FsMs_Read(DISCNUM, (UINT32)blk_nr, num_blks, (VOID * )dest_addr))
+    {
+        return TRUE;
+    }
+    else
+    {
+        return FALSE;
+    }
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic BOOL udisk_write_block(const T_ZOsa_Card_State *st,
+                                             UINT32 blk_nr,
+                                             const UINT32 *src_addr)
+* ¹¦ÄÜÃèÊö£º½«Ò»¸öÄÚ´æblockдµ½udiskÖÐ
+* ²ÎÊý˵Ã÷£º(IN)    st:udisk״̬½á¹¹ÌåÖ¸Õë
+                    blk_nr:´ýдÈëudiskµÄblock±àºÅ
+                    src_addr:Ô´µØÖ·
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºÈç¹ûдÈë³É¹¦£¬·µ»ØTRUE£»·ñÔò·µ»ØFALSE
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static BOOL udisk_write_block( const T_ZOsa_Card_State *st,
+                               UINT32 blk_nr,
+                               UINT32 num_blks,
+                               const UINT32 *src_addr )
+{
+    if( FS_MS_OK == hal_FsMs_Write(DISCNUM , (UINT32) blk_nr, num_blks, (const VOID *) src_addr))
+    {
+        return TRUE;
+    }
+    else
+    {
+        return FALSE;
+    }
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic VOID udisk_examine_disk(struct DdbExamineDiskRequest *req,
+                                           const T_ZOsa_Card_State *st)
+* ¹¦ÄÜÃèÊö£ºDDB_EXAMINE_DISK_REQUESTÏûÏ¢µÄ´¦Àíº¯Êý
+* ²ÎÊý˵Ã÷£º(IN)    req:DDB_EXAMINE_DISK_REQUESTÇëÇóµÄ½á¹¹ÌåÖ¸Õë
+                    st:udisk״̬½á¹¹ÌåÖ¸Õë
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºVOID
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static VOID udisk_examine_disk(struct DdbExamineDiskRequest *req, const T_ZOsa_Card_State *st)
+{
+    struct DdbExamineDiskReply *reply = NULL;
+
+    zOss_AssertExN(req != NULL);
+
+    if (req->unit == DDBUNIT)
+    {
+        struct DdbDiskInfo  *info       = NULL;
+        UINT32            cnt         = 0;
+        UINT32            client_cnt  = 0;
+        UINT32            num_clients = udisk_number_clients(st);
+        zOss_AssertExN(st != NULL); 
+        reply = (struct DdbExamineDiskReply *) alloc(sizeof (struct DdbExamineDiskReply) + 
+                (num_clients - 1) * sizeof (struct DdbBlockRange), DDB_EXAMINE_DISK_REPLY);
+         
+        reply->status           = EFS_SUCCESS;
+        info                    = &reply->info;
+        info->diskSize          = st->num_blks;
+        info->cylinders         = 1;
+        info->surfaces          = 1;
+        info->blocksPerTrack    = st->num_blks;
+        info->blockSize         = BLOCK_SIZE;
+        info->interleave        = 0;    /* No interleaving necessary.       */
+        info->dmaAddrMask       = ~0UL; /* All addresses are ok for DMA.    */
+        info->dmaAddrLo         = 0;    /* Lowest address ok for DMA.       */
+        info->dmaAddrHi         = ~0UL; /* Highest address ok for DMA.      */
+        info->access            = (UINT32)DDB_ACCESS_READ | (UINT32)DDB_ACCESS_WRITE | (UINT32)DDB_ACCESS_RANDOM;
+        info->verify            = FALSE;
+        info->cacheSize         = 0;
+        info->numLocks          = num_clients;
+        for (; cnt < UDISK_MAX_CLIENTS; cnt++)
+        {
+            const T_ZOsa_Card_Client   *client = &st->clients[cnt];
+            if (client->pid != 0)
+            {
+                zOss_ASSERT(client_cnt < num_clients);
+                 
+                info->locks[client_cnt].loBlock = client->low_blk;
+                info->locks[client_cnt].hiBlock = client->high_blk;
+                info->locks[client_cnt].owner   = client->pid;
+                info->locks[client_cnt].pad     = 0;
+                client_cnt++;
+            }
+        }
+    }
+    else
+    {
+        reply           = (struct DdbExamineDiskReply *)alloc(sizeof(struct DdbExamineDiskReply),
+                                                               DDB_EXAMINE_DISK_REPLY);
+        reply->status   = DDB_EINVALID_PARAMETER;
+    }
+    send((T_ZOsa_Card_Signal **) &reply, sender((T_ZOsa_Card_Signal **) &req));
+    free_buf((T_ZOsa_Card_Signal **) &req);
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic BOOL udisk_check_overlap(const T_ZOsa_Card_State *st,
+                                               UINT32 low_blk,
+                                               UINT32 high_blk)
+* ¹¦ÄÜÃèÊö£º¼ì²éudisk_mountµÄһЩ²ÎÊýÊÇ·ñÓÐЧ
+* ²ÎÊý˵Ã÷£º(IN)    st:udisk״̬½á¹¹ÌåÖ¸Õë
+                    low_blk:×îСµÄblock±àºÅ
+                    high_blk:×î´óµÄblock±àºÅ
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØTRUE£»·ñÔò·µ»ØFALSE
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static BOOL udisk_check_overlap(const T_ZOsa_Card_State *st,
+                                UINT32 low_blk,
+                                UINT32 high_blk)
+{
+    UINT32 cnt = 0;
+
+    zOss_ASSERT(low_blk <= high_blk);
+    
+    for (; cnt < UDISK_MAX_CLIENTS; cnt++)
+    {
+        const T_ZOsa_Card_Client   *client = &st->clients[cnt];
+
+        if (client->pid != 0 &&
+            low_blk <= client->high_blk &&
+            high_blk >= client->low_blk)
+        {
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic BOOL udisk_new_client(T_ZOsa_Card_State *st,
+                                            PROCESS pid,
+                                            OSATTREF attref,
+                                            UINT32 low_blk,
+                                            UINT32 high_blk)
+* ¹¦ÄÜÃèÊö£ºÔÚudiskµÄ¿Í»§¶ËÊý×éÖÐѰÕÒÒ»¸ö¿ÕÏеĿͻ§¶Ë
+* ²ÎÊý˵Ã÷£º(IN     st:udisk״̬½á¹¹ÌåÖ¸Õë
+                    pid:Îļþϵͳ¹ÜÀíÏ̵߳Äpid
+                    attref:attach(Îļþϵͳ¹ÜÀíÏß³Ì)µÄ·µ»ØÖµ
+                    low_blk:×îСµÄblock±àºÅ
+                    high_blk:×î´óµÄblock±àºÅ
+            (OUT)	VOID
+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØTRUE£»·ñÔò·µ»ØFALSE
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static BOOL udisk_new_client(T_ZOsa_Card_State *st,
+                             PROCESS pid,
+                             OSATTREF attref,
+                             UINT32 low_blk,
+                             UINT32 high_blk)
+{
+    UINT32 cnt = 0;
+
+    for (; cnt < UDISK_MAX_CLIENTS; cnt++)
+    {
+        T_ZOsa_Card_Client   *client = &st->clients[cnt];
+
+        if (client->pid == 0)
+        {
+            client->pid         = pid;
+            client->attref      = attref;
+            client->low_blk     = low_blk;
+            client->high_blk    = high_blk;
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic VOID udisk_mount(struct DdbMount *req, T_ZOsa_Card_State *st)
+* ¹¦ÄÜÃèÊö£ºDDB_MOUNT_REQUESTÏûÏ¢µÄ´¦Àíº¯Êý
+* ²ÎÊý˵Ã÷£º(IN)    req:DDB_MOUNT_REQUESTÏûÏ¢µÄ½á¹¹ÌåÖ¸Õë
+                    st:udisk״̬½á¹¹ÌåÖ¸Õë
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºVOID
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static VOID udisk_mount(struct DdbMount *req, T_ZOsa_Card_State *st)
+{
+    PROCESS sender_pid  = sender((T_ZOsa_Card_Signal **) &req);
+    SINT32  low_blk     = 0;
+    SINT32  high_blk    = 0;
+
+    zOss_AssertExN(req != NULL && st != NULL);
+
+    req->sigNo = DDB_MOUNT_REPLY;
+    if (0 == st->num_blks)      // ¼ì²éudiskµÄblockÊýÁ¿
+    {
+        req->status = DDB_ENO_DISK;
+        send((T_ZOsa_Card_Signal **) &req, sender_pid);
+        return;
+    }
+    if (efs_get_number(req->params, "lo", &low_blk) &&
+        efs_get_number(req->params, "hi", &high_blk))
+    {
+        if (req->unit == DDBUNIT &&
+            low_blk >= 0 &&
+            high_blk < (SINT32)st->num_blks &&
+            low_blk <= high_blk)
+        {
+            if (!udisk_check_overlap(st, (UINT32)low_blk, (UINT32)high_blk))
+            {
+                if (udisk_new_client(st, sender_pid,
+                                     attach(NULL, sender_pid),
+                                     (UINT32) low_blk,
+                                     (UINT32) high_blk))
+                {
+                    req->status = EFS_SUCCESS;
+                }
+                else /* Too many clients. */
+                {
+                    req->status = DDB_EDISK_IN_USE;
+                }
+            }
+            else
+            {
+                req->status = DDB_EDISK_IN_USE;
+            }
+        }
+        else
+        {
+            req->status = DDB_EINVALID_PARAMETER;
+        }
+    }
+    else
+    {
+        req->status = DDB_EINVALID_PARAMETER;
+    }
+    
+    send((T_ZOsa_Card_Signal **)&req, sender_pid);
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic VOID udisk_unmount(struct DdbUnmount *req, T_ZOsa_Card_State *st)
+* ¹¦ÄÜÃèÊö£ºDDB_UNMOUNT_REQUESTÏûÏ¢µÄ´¦Àíº¯Êý
+* ²ÎÊý˵Ã÷£º(IN)    req:DDB_MOUNT_REQUESTÏûÏ¢µÄ½á¹¹ÌåÖ¸Õë
+                    st:udisk״̬½á¹¹ÌåÖ¸Õë
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºVOID
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static VOID udisk_unmount(struct DdbUnmount *req, T_ZOsa_Card_State *st)
+{
+    PROCESS sender_pid  = sender((T_ZOsa_Card_Signal **) &req);
+    SINT32  low_blk     = 0;
+    SINT32  high_blk    = 0;
+
+    zOss_AssertExN(req != NULL);
+
+    req->sigNo = DDB_UNMOUNT_REPLY;
+
+    if (efs_get_number(req->params, "lo", &low_blk) &&
+        efs_get_number(req->params, "hi", &high_blk) &&
+        low_blk <= high_blk && req->unit == DDBUNIT)
+    {
+        T_ZOsa_Card_Client   *client = udisk_find_match(st, sender_pid, (UINT32)low_blk, (UINT32)high_blk);
+
+        if (client != NULL && client->low_blk == (UINT32)low_blk && client->high_blk == (UINT32)high_blk)
+        {
+            detach(&client->attref);
+            
+            client->pid = 0;
+            req->status = EFS_SUCCESS;
+        }
+        else
+        {
+            req->status = DDB_EINVALID_PARAMETER;
+        }
+    }
+    else
+    {
+        req->status = DDB_EINVALID_PARAMETER;
+    }
+
+    send((T_ZOsa_Card_Signal **)&req, sender_pid);
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic VOID udisk_read(struct DdbRead *req, T_ZOsa_Card_State *st)
+* ¹¦ÄÜÃèÊö£º´¦Àí¶ÁÇëÇó
+* ²ÎÊý˵Ã÷£º(IN)    req:¶ÁÇëÇó½á¹¹ÌåÖ¸Õë
+                    st:udisk״̬½á¹¹ÌåÖ¸Õë
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºVOID
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static VOID udisk_read(struct DdbRead *req, T_ZOsa_Card_State *st)
+{
+    PROCESS             sender_pid  = sender((T_ZOsa_Card_Signal **)&req);
+    UINT32              cnt         = 0;
+    UINT32              block       = 0;
+    UINT32              num_blks    = 0;
+    BOOL                ret         = FALSE;
+    UINT8               *buffer     = NULL;
+    struct DdbOperation *oper       = NULL;
+
+    zOss_AssertExN(req != NULL && st != NULL);
+
+    req->status = EFS_SUCCESS;
+
+    for (; cnt < req->numOps; cnt++)
+    {
+        oper        = &req->ops[cnt];
+        block       = oper->position;
+        num_blks    = oper->requested;
+        buffer      = (UINT8 *) oper->buffer;
+        zOss_ASSERT(num_blks > 0);
+        if(num_blks > 0)
+        {
+            ret = udisk_read_block(st, block, num_blks, (UINT32*)buffer);
+        }
+        else
+        {
+            ret = FALSE;
+        }
+        zOss_ASSERT(ret == TRUE);
+        
+        if(ret)
+        {
+            oper->actual = num_blks;
+        }
+        else
+        {
+            oper->actual = 0x00;
+        }
+    }
+
+    req->sigNo = DDB_READ_REPLY;
+    send((T_ZOsa_Card_Signal **) &req, sender((T_ZOsa_Card_Signal **) &req));
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic VOID udisk_write(struct DdbWrite *req, T_ZOsa_Card_State *st)
+* ¹¦ÄÜÃèÊö£º´¦ÀíдÇëÇó
+* ²ÎÊý˵Ã÷£º(IN)    req:дÇëÇó½á¹¹ÌåÖ¸Õë
+                    st:udisk״̬½á¹¹ÌåÖ¸Õë
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºVOID
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static VOID udisk_write(struct DdbWrite *req, T_ZOsa_Card_State *st)
+{
+    PROCESS             sender_pid  = sender((T_ZOsa_Card_Signal **)&req);
+    UINT32              cnt         = 0;
+    UINT32              block       = 0;
+    UINT32              num_blks    = 0;
+    BOOL                ret         = FALSE;
+    UINT8               *buffer     = NULL;      
+    struct DdbOperation *oper       = NULL;  
+    T_ZOsa_Card_Client  *client     = NULL;  
+
+    zOss_AssertExN(req != NULL && st != NULL);
+    
+    req->status = EFS_SUCCESS;
+    for (cnt = 0; cnt < req->numOps; cnt++)
+    {
+        oper        = &req->ops[cnt];
+        buffer      = (UINT8 *)oper->buffer;
+        block       = oper->position;
+        num_blks    = oper->requested;
+        client      = udisk_find_match(st, sender_pid, block, block + num_blks - 1);
+        if (client == NULL)
+        {
+            req->status = DDB_EINVALID_PARAMETER;  /* Sender has not mounted/locked (complete) block range. */
+            break;
+        }
+        zOss_ASSERT(num_blks > 0);
+        if(num_blks > 0)
+        {
+            ret = udisk_write_block(st, block, num_blks, (UINT32*)buffer);
+        }
+        else
+        {
+            ret = FALSE;
+        }
+        zOss_ASSERT(ret == TRUE);
+        
+        if(ret)
+        {
+            oper->actual = num_blks;
+        }
+        else
+        {
+            oper->actual = 0x0;
+        }
+    }
+    
+    req->sigNo = DDB_WRITE_REPLY;
+    send((T_ZOsa_Card_Signal **)&req, sender((T_ZOsa_Card_Signal **)&req));
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic VOID udisk_format_disk(struct DdbFormatDisk *req, T_ZOsa_Card_State *st)
+* ¹¦ÄÜÃèÊö£º´¦Àí¸ñʽ»¯ÇëÇó
+* ²ÎÊý˵Ã÷£º(IN)    req:¸ñʽ»¯ÇëÇó½á¹¹ÌåÖ¸Õë
+                    st:udisk״̬½á¹¹ÌåÖ¸Õë
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºVOID
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static VOID udisk_format_disk(struct DdbFormatDisk *req, T_ZOsa_Card_State *st)
+{
+    PROCESS sender_pid = sender((T_ZOsa_Card_Signal **)&req);
+    SINT32 low  = 0;
+    SINT32 high = 0;
+
+    zOss_AssertExN(req != NULL);
+
+    if (efs_get_number(req->params, "lo", &low) &&
+        efs_get_number(req->params, "hi", &high))
+    {
+        T_ZOsa_Card_Client   *client = udisk_find_match(st, sender_pid, (UINT32) low, (UINT32) high);
+
+        if (client != NULL)
+        {
+            req->status = EFS_SUCCESS;
+        }
+        else
+        {
+            req->status = DDB_EINVALID_PARAMETER;
+        }
+    }
+    else
+    {
+        req->status = DDB_EINVALID_PARAMETER;
+    }
+
+    req->sigNo = DDB_FORMAT_DISK_REPLY;
+    send((T_ZOsa_Card_Signal **)&req, sender_pid);
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£º static VOID udisk_client_lost(PROCESS pid, T_ZOsa_Card_State *st)
+* ¹¦ÄÜÃèÊö£º Îļþϵͳ¹ÜÀíÏ̱߳»killµÄʱºò£¬udisk»áÊÕµ½À´×Ô¸ÃÎļþϵͳ¹ÜÀíÏ̵߳Ä
+             Ò»¸öÏûÏ¢£¬Ä¬ÈÏÊÇOS_ATTACH_SIG£¬µ÷Óñ¾º¯Êý´¦Àí¸ÃÏûÏ¢
+* ²ÎÊý˵Ã÷£º (IN)   pid:Îļþϵͳ¹ÜÀíÏ̵߳Äpid
+                    st:udisk״̬½á¹¹ÌåÖ¸Õë
+             (OUT)  VOID
+* ·µ »Ø Öµ£º VOID
+* ÆäËü˵Ã÷£º VOID
+**************************************************************************/
+static VOID udisk_client_lost(PROCESS pid, T_ZOsa_Card_State *st)
+{
+    UINT32 cnt = 0;
+
+    zOss_AssertExN(st != NULL);
+
+    for (; cnt < UDISK_MAX_CLIENTS; cnt++)
+    {
+        T_ZOsa_Card_Client   *client = &st->clients[cnt];
+
+        if (client->pid == pid)
+        {
+            client->pid     = 0;
+            client->attref  = 0;
+            return;
+        }
+    }
+
+    abort();    /* Attach signal without any corresponding client structure.    */
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºstatic BOOL udisk_register_fss(const char *name,
+                                              EfsEnum type,
+                                              BOO     local,
+                                              PROCESS fss_)
+* ¹¦ÄÜÃèÊö£º×¢²áudiskÏ̵߳½FSS(File System Server)
+* ²ÎÊý˵Ã÷£º(IN)    name:udiskÄ£¿éµÄÃû³Æ
+                    type:udiskÄ£¿éµÄÀàÐÍ
+                    local:udiskÄ£¿éÔÚfssÖÐÊÇ·ñÈ«¾Ö¿É¼û
+                    fss:fssÏ̵߳Äpid
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºÈç¹û×¢²á³É¹¦£¬·µ»ØTRUE£»·ñÔò·µ»ØFALSE
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+static Boolean udisk_register_fss(const char *name, EfsEnum type, BOOL local, PROCESS fss_)
+{
+    BOOL                    success     = TRUE;
+    static const SIGSELECT  sigsel[]    = {2, FSS_REGISTER_REPLY, ATTACH_FSS};
+    struct FssRegister      *reply      = NULL;
+
+    sendFssRegisterRequest(name, type, local, fss_);
+
+    reply = (struct FssRegister *)receive(sigsel);
+    if (reply != NULL && reply->sigNo == FSS_REGISTER_REPLY)
+    {
+        if (reply->status != EFS_SUCCESS)
+        {
+            error2((OSE_EFATAL_MASK | OSE_EFS_EREGISTER_FAILED),
+                    ((OSERRCODE)reply->status));
+
+            kill_proc(current_process());
+        }
+
+        success = TRUE;
+    }
+    else
+    {
+        success = FALSE;
+    }
+
+    free_buf((T_ZOsa_Card_Signal **)&reply);
+
+    return success;
+}
+ 
+/**************************************************************************
+ *                           È«¾Öº¯ÊýʵÏÖ                                 *
+ **************************************************************************/
+VOID zOss_UdiskInit(VOID)
+{
+    extern OSENTRYPOINT ose_udisk;
+    PROCESS ose_extfm_pid = create_and_supervise("ose_udiskfm", ose_udisk, (OSADDRESS)2000, 25, NULL);
+    start(ose_extfm_pid);
+}
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºVOID ose_udisk(VOID)
+* ¹¦ÄÜÃèÊö£ºudiskÖ÷Ï̵߳ÄÈë¿Úº¯Êý
+* ²ÎÊý˵Ã÷£º(IN)    VOID
+            (OUT)   VOID
+* ·µ »Ø Öµ£ºVOID
+* ÆäËü˵Ã÷£ºVOID
+**************************************************************************/
+OS_PROCESS(ose_udisk)
+{
+    T_ZOsa_Card_State st = {0};
+    
+    udisk_init_state(&st);
+    for(;;)
+    {
+        static const SIGSELECT  sel_all[]   = {0};
+        T_ZOsa_Card_Signal      *sig        = receive(sel_all);
+        PROCESS                 sender_pid  = sender(&sig);
+
+        switch (sig->sigNo)
+        {
+            case OS_ATTACH_SIG:
+            {
+                udisk_client_lost(sender_pid, &st);
+                free_buf(&sig);
+                break;
+            }
+            case HUNT_FSS:
+            {
+                sig->sigNo      = ATTACH_FSS;
+                st.fss_pid      = sender_pid;
+                st.fss_attref   = attach(&sig, st.fss_pid);
+                if (FALSE == udisk_register_fss(DDBNAME, FSS_TYPE_BLOCKDEV, TRUE, st.fss_pid))
+                {                    
+                    sig = alloc(sizeof (SIGSELECT), HUNT_FSS); /* Lost contact with FSS. */
+
+                    hunt("ose_fss", 0, NULL, &sig);
+                    st.fss_pid  = 0;
+                }
+                break;
+            }
+            case ATTACH_FSS:
+            {
+                sig->sigNo = HUNT_FSS;
+                
+                hunt("ose_fss", 0, NULL, &sig);
+                st.fss_pid = 0;
+                break;
+            }
+            case DDB_EXAMINE_DISK_REQUEST:
+            {
+                udisk_examine_disk((struct DdbExamineDiskRequest *) sig, &st);
+                break;
+            }
+            case DDB_INTERFACE_REQUEST:
+            {
+                sendDdbInterfaceReply(EFS_SUCCESS, DDBWHAT, BIOSHANDLE,
+                                      DDB_INTERFACE_REQUEST,
+                                      DDB_FORMAT_DISK_REQUEST, sender_pid);
+                free_buf(&sig);
+                break;
+            }
+            case DDB_MOUNT_REQUEST:
+            {
+                udisk_mount((struct DdbMount *)sig, &st);
+                break;
+            }
+            case DDB_UNMOUNT_REQUEST:
+            {
+                udisk_unmount((struct DdbUnmount *)sig, &st);
+                break;
+            }
+            case DDB_READ_REQUEST:
+            {
+                udisk_read((struct DdbRead *)sig, &st);
+                break;
+            }
+            case DDB_WRITE_REQUEST:
+            {
+                udisk_write((struct DdbWrite *)sig, &st);
+                break;
+            }
+            case DDB_FORMAT_DISK_REQUEST:
+            {
+                udisk_format_disk((struct DdbFormatDisk *)sig, &st);
+                break;
+            }
+            default:
+            {
+                error2(OSE_EFS_EUNKNOWN_SIGNAL, (OSERRCODE)sig);
+                free_buf(&sig);
+                break;
+            }
+        }
+    }
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/cp/ps/plat/src/oss/osa/ose/src/ose_except_arm.c b/cp/ps/plat/src/oss/osa/ose/src/ose_except_arm.c
new file mode 100644
index 0000000..e9e4cf8
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/ose/src/ose_except_arm.c
@@ -0,0 +1,1104 @@
+/**************************************************************************
+*
+*                  Copyright (c) 2012 ZTE Corporation.
+*
+***************************************************************************
+* Ä£ ¿é Ãû : ose_except_arm.c
+* ÎÄ ¼þ Ãû : ose_except_arm.c
+* Ïà¹ØÎļþ : 
+* ʵÏÖ¹¦ÄÜ : 
+* ×÷    Õß : olli
+* °æ    ±¾ : V1.0
+* Íê³ÉÈÕÆÚ : 2005/31/05
+* ÆäËü˵Ã÷ : 
+*            @(#) $FilePath: /vobs/ose5/system/refsys/common/sys_err_hnd.c
+*            @(#) $FileRevision: /main/tb_current_ose5/36  $
+**************************************************************************/
+/**************************************************************************
+* Ð޸ļǼ
+**************************************************************************/
+/**************************************************************************
+* Ð޸ıàºÅ : 0001
+* ÐÞ ¸Ä ÈË : junkuiZhao
+* ÐÞ¸ÄÈÕÆÚ : 2012/09/15
+* ÐÞ¸ÄÄÚÈÝ : PC-LINT¼ì²éÓÚ±àÂë¹æ·¶ÐÞ¸Ä EC: 617001781881  
+**************************************************************************/
+/**************************************************************************
+* Ð޸ıàºÅ : 0002
+* ÐÞ ¸Ä ÈË : junkuiZhao
+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10
+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC: 617001781957
+**************************************************************************/
+
+/**************************************************************************
+* #includeÇø
+**************************************************************************/
+#include "ose_typedef.h"
+#include "oss_api.h"
+#include "sysparam.h"
+#include "cpu_intlock.h"
+#include "comm_api.h"
+#include "hal_comm.h"
+#include "cpu_hal_arch.h"
+#include "efmi.h"
+#include "hfmi.h"
+#include "ramlog.h"
+#include "osa_ramdump.h"
+#include "ose_err/ose_err.h"
+#include "ose_err/efs_err.h"
+#include "ose_err/heap_err.h"
+#include "ose_spi/exception.h"
+#include "sys_func_atcfg.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/**************************************************************************
+* ºê¶¨ÒåÇø
+**************************************************************************/
+
+#ifdef _USE_OPOA
+/*¶¨ÒåmmuËùʹÓÃÄÚ´æµÄ»ùµØÖ·ºÍ¿½±´Ê±pageÊýÄ¿*/
+#define MMU_PAGE_SIZE           4096
+#define ALIGN_NEXT(size,align)  (((UINT32)(size)+align-1)&(~(align-1)))
+#define CP15_CONTROL_REG_V      0x2000  /* Exception vectors low(0) or high(1). */
+#define CP15_FAULT_REG_PAGE     0x7     /* »ùÓÚÒ³µÄµØÖ·±ä»»Ê§Ð§                 */
+
+/*×îºóËù¼ÓÖµÐèÒª¸ù¾Ýʵ¼ÊÈ·¶¨*/
+#define MMU_FISRT_DESCRIPTION(pageBase) (((UINT32)pageBase&(~0x3ffUL))+0x11)
+#define MMU_SECOND_DESCRIPTOR(phyBase)  (((UINT32)phyBase&(~0xFFFUL))+0x55e)   /* 0x55e=0b010101011110 */
+#define  LOCK_ENABLE(old_lockstate)     ((old_lockstate)=LOCK_ENABLE_())
+
+#endif
+/*OSE MMU²ÉÓöÎ(1M)»òÕßСҳ(4K)¿ØÖÆ*/ 
+#define MMU_FIRST_INDEX(virtualAddress)     ((UINT32)virtualAddress >> 20)              /* ȡbit31-20   */
+#define MMU_SECOND_INDEX(virtualAddress)    (((UINT32)virtualAddress & 0xff000) >> 12)  /* ȡbit19-12   */
+
+/**************************************************************************
+* Êý¾Ý½á¹¹¶¨ÒåÇø
+**************************************************************************/
+typedef struct
+{
+    const CHAR  *expr;
+    const CHAR  *file;
+    UINT32      line;
+} T_ZOss_Except_Info;
+
+#ifdef _USE_OPOA
+typedef struct tig_NODE         /* Node of a linked list. */
+{
+    struct tig_NODE *next;              /* Points at the next node in the list      */
+    struct tig_NODE *previous;          /* Points at the previous node in the list  */
+    UINT32          *secondPageBase;    /* ´ÖÁ£¶È¶þ¼¶Ð¡Ò³±í»ùÖ·                     */
+    UINT32          secondPageOffset;   /* Сҳ±íÖÐµÄÆ«ÒÆ,¶ÔÓ¦¶þ¼¶ÃèÊö·ûµØÖ·        */
+    UINT32          phyAddress;         /* Ò³±í¶ÔÓ¦µÄÎïÀíµØÖ·                       */
+    UINT32          logicAddress;       /* Ò³±í¶ÔÓ¦µÄÂß¼­µØÖ·                       */
+}T_Mmu_Node;
+
+/* Header for a linked list. */
+typedef struct             
+{
+    SINT32      count;                  /* Number of nodes in list  */
+    T_Mmu_Node  *HEAD;
+    T_Mmu_Node  *TAIL;
+}T_Mmu_List;
+
+typedef struct 
+{
+    UINT32              logic_sector_start;
+    UINT32              physicAddress;
+    ZOSS_SEMAPHORE_ID   semaphore_ptr;
+}T_MMU_EXCEPT_MSG;
+#endif
+/**************************************************************************
+* È«¾Ö±äÁ¿¶¨ÒåÇø
+**************************************************************************/ 
+static struct cpu_regdump   *Osa_ArmExceptDump  = NULL;
+struct cpu_core             Osa_CoreRegisters   = {0};
+static UINT32               lcdBase             = 0;
+
+#ifdef _USE_OPOA
+static ZOSS_QUEUE_ID    g_mmuExceptQueueID  = 0;
+static T_Mmu_List       g_mmuLruList        = {0};
+static T_Mmu_Node       g_mmuLruNode[1000]  = {0};
+UINT32                  Image_mmu_base      = 0;
+UINT32                  Image_mmu_Limit     = 0;
+UINT32                  mmu_secondPage_base = 0;
+#endif
+/************************************************************************** 
+* Íⲿ±äÁ¿ÉùÃ÷
+**************************************************************************/   
+
+/**************************************************************************  
+* Íⲿº¯ÊýÉùÃ÷
+**************************************************************************/  
+extern VOID zOss_SaveRegisters(VOID);
+extern VOID ddLcd_DisplayError(UINT16 x, UINT16 y, CHAR *pBuf, CHAR *text, UINT16 len);
+extern VOID sys_err_hnd_hook_install(OSADDRESS (*hook)(OSBOOLEAN, OSERRCODE, OSERRCODE));
+
+#ifdef _USE_OPOA
+extern SINT32 nand_Read(UINT32 dwStart, UINT32 dwLen, UINT8* to);
+OSADDRESS zte_sys_err_hnd(OSBOOLEAN user_called, OSERRCODE ecode, OSERRCODE extra);
+extern VOID zprefetch_exception(VOID);
+extern VOID zdata_exception(VOID);
+extern VOID  zzRestoreArmExceptRegister(struct cpu_core * pCore, UINT32 exceptPc, UINT32 spsr);
+#endif
+/**************************************************************************
+* ¾Ö²¿º¯ÊýʵÏÖ
+**************************************************************************/
+#ifdef _USE_OPOA
+/*Read mmu table register.*/
+static inline UINT32 ARMV4T_READ_TABLE_REG(VOID)
+{
+    UINT32 control_reg = 0;
+    __asm
+    {
+        mrc p15,0,control_reg,c2,c0,0;
+    }
+    
+    return control_reg;
+}
+
+/*Read control register.*/
+static inline UINT32 ARMV4T_READ_CONTROL_REG(VOID)
+{
+    UINT32 control_reg = 0;
+    __asm
+    {
+        mrc p15,0,control_reg,c1,c0,0;
+    }
+    
+    return control_reg;
+}
+
+static  inline UINT32 ARMV4T_READ_FAULTSTATUS_REG(VOID)
+{
+    UINT32 control_reg = 0;
+    __asm
+    {
+        mrc p15,0,control_reg,c5,c0,0;
+    }
+    
+    return control_reg;
+}
+
+static inline  UINT32 ARMV4T_READ_FAULTADDRESS_REG(VOID)
+{
+    UINT32 control_reg = 0;
+    __asm
+    {
+        mrc p15,0,control_reg,c6,c0,0;
+    }
+    
+    return control_reg;
+}
+
+/*
+ * Requires following armv4t cp15 function.
+ * To use all TLB flush opertaions is is a defensive but on this
+ * costly operation we are willing to take this small extra cost.
+ */
+static inline VOID ARMV4T_INVALIDATE_TLB(VOID)
+{
+    UINT32 zero = 0;
+    __asm
+    {
+        mcr  p15,0,(zero),c8,c7,0;
+        mcr  p15,0,(zero),c8,c5,0;
+        mcr  p15,0,(zero),c8,c6,0;
+    }
+}
+
+static inline UINT32 LOCK_ENABLE_(VOID)
+{ 
+    register UINT32 old_lockstate = 0;
+    register UINT32 new_lockstate = 0;
+    __asm 
+    {
+        MRS old_lockstate, CPSR;
+        BIC new_lockstate, old_lockstate,#(IRQ_DISABLE |FIQ_DISABLE);
+        MSR CPSR_c, (new_lockstate) 
+    }
+    
+    return old_lockstate;
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ: zOss_ListInit
+* ¹¦ÄÜÃèÊö: ³õʼ»¯Ë«ÏòÁ´±í
+* ²ÎÊý˵Ã÷£º 
+            (IN)
+                pList:Á´±íÖ¸Õë
+            (OUT)
+* ·µ »Ø Öµ:  
+**************************************************************************/ 
+static VOID zMmu_ListInit(T_Mmu_List *pList)
+{
+    zOss_AssertExN(pList != NULL);
+    pList->HEAD  = NULL;
+    pList->TAIL  = NULL;
+    pList->count = 0;
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ: zOss_ListFirst
+* ¹¦ÄÜÃèÊö: »ñÈ¡Á´±íµÄÊ×½Úµã
+* ²ÎÊý˵Ã÷£º 
+            (IN)
+               pList:Á´±íÖ¸Õë
+            (OUT)
+* ·µ »Ø Öµ: ½ÚµãÖ¸Õë(µ±Á´±íÖÐûÓнڵãʱ£¬·µ»Ø¿Õ)
+**************************************************************************/ 
+static  T_Mmu_Node *zMmu_ListFirst(T_Mmu_List *pList)
+{
+    zOss_AssertEx(pList != NULL, NULL);
+    return (pList->HEAD);
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ: zOss_ListDelete
+* ¹¦ÄÜÃèÊö: ÒÆ³ýÁ´±íÖÐÖ¸¶¨µÄ½Úµã
+* ²ÎÊý˵Ã÷£º 
+            (IN)
+                pList:Á´±íÖ¸Õë
+                pNode:´ýɾ³ý½ÚµãÖ¸Õë
+            (OUT)
+* ·µ »Ø Öµ:  
+**************************************************************************/ 
+static VOID zMmu_ListDelete(T_Mmu_List *pList, T_Mmu_Node *pNode)
+{
+    zOss_AssertExN(pList != NULL && pNode != NULL);
+    if (pNode->previous == NULL)
+    {
+        pList->HEAD = pNode->next;
+    }
+    else
+    {
+        pNode->previous->next = pNode->next;
+    }
+
+    if (pNode->next == NULL)
+    {
+        pList->TAIL = pNode->previous;
+    }
+    else
+    {
+        pNode->next->previous = pNode->previous;
+    }
+
+    /* update node count */
+    pList->count--;
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ: zOss_ListInsert
+* ¹¦ÄÜÃèÊö: ÏòÁ´±íÖ¸¶¨µÄ½Úµãºó²åÈë½Úµã
+* ²ÎÊý˵Ã÷£º 
+            (IN)
+                pList:Á´±íÖ¸Õë
+                pPrev:²åÈëµã½ÚµãÖ¸Õ룬µ±pPrevΪ¿Õʱ£¬±íʾ²åÈëµ½Á´±íÊ×λÖÃ
+                pNode:´ý²åÈëµÄ½ÚµãÖ¸Õë
+            (OUT)
+* ·µ »Ø Öµ:  
+**************************************************************************/ 
+static VOID zMmu_ListInsert (T_Mmu_List *pList, T_Mmu_Node *pPrev, T_Mmu_Node *pNode)
+{
+    T_Mmu_Node *pNext = NULL;
+
+    zOss_AssertExN(pList != NULL && pNode != NULL);
+    
+    if (pPrev == NULL)
+    {   /* new node is to be first in list */
+        pNext = pList->HEAD;
+        pList->HEAD = pNode;
+    }
+    else
+    {   /* make prev node point fwd to new */
+        pNext = pPrev->next;
+        pPrev->next = pNode;
+    }
+
+    if (pNext == NULL)
+    {
+        pList->TAIL = pNode;    /* new node is to be last in list */
+    }
+    else
+    {
+        pNext->previous = pNode;    /* make next node point back to new */
+    }
+
+    /* set pointers in new node, and update node count */
+
+    pNode->next     = pNext;
+    pNode->previous = pPrev;
+
+    pList->count++;
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ: zOss_ListAdd
+* ¹¦ÄÜÃèÊö: ÏòÁ´±íβÌí¼Ó½Úµã
+* ²ÎÊý˵Ã÷£º 
+            (IN)
+                pList:Á´±íÖ¸Õë
+                pNode:´ýÌí¼Ó½ÚµãÖ¸Õë
+            (OUT)
+* ·µ »Ø Öµ:  
+**************************************************************************/ 
+static VOID zMmu_ListAdd (T_Mmu_List *pList, T_Mmu_Node *pNode)
+{
+    zMmu_ListInsert(pList, pList->TAIL, pNode);
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£º mmuExceptThread
+* ¹¦ÄÜÃèÊö£º ¶ÁÈ¡flash´úÂëÖÁÎïÀíÄÚ´æ
+* ²ÎÊý˵Ã÷£º (IN):
+                  
+*            (OUT):ÎÞ
+* ·µ »Ø Öµ£º   
+* ÆäËü˵Ã÷£º 
+**************************************************************************/
+static VOID mmuExceptThread(SINT32 arg)
+{
+    T_MMU_EXCEPT_MSG    pMmuExceptMsg       = {0};
+    UINT32              logic_sector_start  = 0;
+    UINT32              physicAddress       = 0;
+    ZOSS_SEMAPHORE_ID   semaphore_ptr       = NULL;
+    
+    for(;;)
+    {
+        zOss_QueueRecv(g_mmuExceptQueueID, &pMmuExceptMsg, sizeof(T_MMU_EXCEPT_MSG), ZOSS_WAIT_FOREVER);
+        logic_sector_start  = pMmuExceptMsg.logic_sector_start;
+        physicAddress       = pMmuExceptMsg.physicAddress;
+        semaphore_ptr       = pMmuExceptMsg.semaphore_ptr;
+        nand_Read(logic_sector_start, MMU_PAGE_SIZE, (unsigned char *)physicAddress); /* 8=4096/512 */
+        zOss_PutSemaphore(semaphore_ptr);
+    }
+}
+/**************************************************************************
+* º¯ÊýÃû³Æ£º Osa_SysErrHndInit
+* ¹¦ÄÜÃèÊö£º ½Ó¹Ü²Ù×÷ϵͳÒì³£´¦Àíº¯Êý
+* ²ÎÊý˵Ã÷£º (IN):
+                  
+*            (OUT):ÎÞ
+* ·µ »Ø Öµ£º   
+* ÆäËü˵Ã÷£º 
+**************************************************************************/
+static VOID Osa_Mmu_Init(UINT32 pagenum, CHAR *PhysicalAddress)
+{
+    UINT32 phyAddress   = 0;
+    UINT32 i            = 0;
+    PROCESS Process_ID  = 0;
+    
+    /* ³õʼ»¯LRU½áµã */
+    phyAddress = ALIGN_NEXT(PhysicalAddress, 0x1000);   /* 4kb¶ÔÆë  */
+    zMmu_ListInit((T_Mmu_List *)&g_mmuLruList);
+    
+    for(i = 0; i < pagenum; i++)
+    {
+        g_mmuLruNode[i].phyAddress = phyAddress + i * 0x1000;
+        
+        zMmu_ListAdd(&g_mmuLruList, &g_mmuLruNode[i]);
+    }
+    g_mmuExceptQueueID  = zOss_QueueCreate("mmuExceptQueue", 100, sizeof(T_MMU_EXCEPT_MSG));
+    Process_ID          = create_process(OS_PRI_PROC, 
+                                        "mmuExceptThread",
+                                        (OSENTRYPOINT *)mmuExceptThread, 
+                                        4096,  
+                                        5, 
+                                        0,
+                                        (PROCESS) 0, 
+                                        (struct OS_redir_entry *) NULL, 
+                                        (OSVECTOR) 0, 
+                                        (OSUSER) 0);
+    start(Process_ID);
+}
+/**************************************************************************
+* º¯ÊýÃû³Æ£º arm_mmu_Address_map
+* ¹¦ÄÜÃèÊö£º °´Ð¡Ò³¼ÓÔØ´úÂëÖÁÄڴ棬Âß¼­µØÖ·MMUÖØÓ³Éä
+* ²ÎÊý˵Ã÷£º (IN):
+                  logicAddress:´ýÖØÓ³ÉäµÄÂß¼­µØÖ·
+*            (OUT):ÎÞ
+* ·µ »Ø Öµ£º   
+* ÆäËü˵Ã÷£º
+**************************************************************************/
+static  UINT32 arm_mmu_Address_map(UINT32 logicAddress)
+{
+    UINT32 adjustAddress    = 0;
+    UINT32 *mmuSecondBase   = NULL;
+    //UINT32 mmudescriptor    = 0;
+    UINT32 mmuOffset        = 0;
+    UINT32 physicAddress    = 0;
+    UINT32 mask             = 0;
+    
+    T_MMU_EXCEPT_MSG    mmuExceptMsg = {0};
+    ZOSS_SEMAPHORE_ID   mmuExceptSem = {0};
+    T_Mmu_Node          *node        = NULL;
+
+    adjustAddress   = logicAddress & (~0xFFFUL);   /* 4KB¶ÔÆë   */
+    node            = (T_Mmu_Node *)zMmu_ListFirst(&g_mmuLruList);
+    physicAddress   = node->phyAddress;
+    if(node->secondPageBase != NULL)
+    {
+        node->secondPageBase[node->secondPageOffset] = 0;/* ʹÖû»PAGEÎÞЧ  */
+    }
+    ARMV4T_INVALIDATE_TLB();
+    mmuSecondBase           = (UINT32 *)(mmu_secondPage_base + ((adjustAddress-Image_mmu_base) / 0x100000) * 1024);    
+    mmuOffset               = MMU_SECOND_INDEX(adjustAddress);
+    
+    zMmu_ListDelete(&g_mmuLruList, node);
+    
+    node->secondPageBase    = mmuSecondBase;
+    node->secondPageOffset  = mmuOffset;
+    node->phyAddress        = physicAddress;
+    node->logicAddress      = adjustAddress;
+    
+    LOCK_ENABLE(mask); 
+    
+    mmuExceptMsg.logic_sector_start = adjustAddress;
+    mmuExceptMsg.physicAddress      = physicAddress;
+    /* »ñÈ¡ÐźÅÁ¿ */
+    mmuExceptSem                = zOss_CreateSemaphore( "mmuExceptSem", 0);
+    mmuExceptMsg.semaphore_ptr  = mmuExceptSem;
+    
+    zOss_QueueSend(g_mmuExceptQueueID, &mmuExceptMsg, sizeof(T_MMU_EXCEPT_MSG), ZOSS_NO_WAIT, ZOSS_QUEUE_MSG_PRI_NORMAL);
+    zOss_GetSemaphore(mmuExceptSem,ZOSS_WAIT_FOREVER);  /* »ñÈ¡³É¹¦±íʾ´úÂë¼ÓÔØÍê³É */
+    zOss_DeleteSemaphore(mmuExceptSem);
+
+    LOCK_RESTORE(mask);
+    
+    mmuSecondBase[mmuOffset] = MMU_SECOND_DESCRIPTOR(physicAddress);
+    
+    ARMV4T_INVALIDATE_TLB();
+    zMmu_ListAdd(&g_mmuLruList, node);
+    return 1;
+    
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£º armv4t_mmu_valid_fault
+* ¹¦ÄÜÃèÊö£º ·µ»ØÊ§Ð§µÄµØÖ·
+* ²ÎÊý˵Ã÷£º (IN):
+                 extra:
+*            (OUT):ÎÞ
+* ·µ »Ø Öµ£º ʧЧµØÖ·»òÕß0
+* ÆäËü˵Ã÷£º ÕæÕý¹ÊÕÏʱ·µ»Ø0
+**************************************************************************/
+static UINT32 armv4t_mmu_valid_fault(struct cpu_regdump *extra)
+{
+   UINT32 fault_status = 0;
+
+   zOss_AssertEx(extra != NULL, 0);
+    
+   if(!extra->fault_data_set) 
+   {
+        return 0;
+   }
+
+   if(extra->fault_data_addr < (UINT32)Image_mmu_base || extra->fault_data_addr >= (UINT32)(Image_mmu_Limit - 1))
+   {
+        return 0;
+   }
+   if (extra->vector == 0x10)   /* Êý¾Ý·ÃÎÊÒì³£ */
+    {        
+        fault_status = ((struct cpu_core *)(extra->sect[0].address))->fault_status & 0xf;
+        if (fault_status != CP15_FAULT_REG_PAGE)
+        {
+            return 0;    /* ÕæÕýµÄÒì³£ÎÞÐëµØÖ·ÖØÓ³Éä    */
+        }
+        else
+        {
+            return extra->fault_data_addr;
+        }
+    }
+   else if(extra->vector == 0xc)    /* ԤȡָÁîÒì³£ */
+   {
+        return extra->fault_data_addr;
+    }
+   else
+   {
+        return 0;   /* Õý³£²»»áÔËÐÐ */
+   }
+}
+
+/**************************************************************************
+* È«¾Öº¯ÊýʵÏÖ
+**************************************************************************/
+/**************************************************************************
+* º¯ÊýÃû³Æ£º zzexception_c
+* ¹¦ÄÜÃèÊö£º ½Ó¹Ü²Ù×÷ϵͳÒì³£´¦Àíº¯ÊýÔËÐÐÔÚµ±Ç°Ï̻߳·¾³ÏÂ
+* ²ÎÊý˵Ã÷£º (IN):
+                  
+*            (OUT):ÎÞ
+* ·µ »Ø Öµ£º   
+* ÆäËü˵Ã÷£º 
+**************************************************************************/
+VOID zexception_c(SINT32 vector, UINT32 exceptPc, struct cpu_core * pCore)
+{
+    struct cpu_regdump  regDump         = {0};
+    UINT32              cpsr            = 0;
+    UINT32              faultAddress    = 0;
+    UINT32              mask            = 0;
+    UINT32              reg             = 0;
+
+    zOss_AssertExN(pCore != NULL);
+
+    if(vector == 0x0c)     /* ԤȡָÁîÒ쳣ʱ,c5 c6²»»á¸üÐÂ,ÓëоƬÏà¹Ø   */
+    {
+        pCore->fault_status     = 0;
+        regDump.fault_data_set  = 1;
+        regDump.fault_data_addr = pCore->abort.lr;
+    }
+    else if(vector == 0x10)  /* Êý¾Ý·ÃÎÊÒì³£ */
+    {
+        reg                     = ARMV4T_READ_FAULTADDRESS_REG();
+        regDump.fault_data_addr = reg;
+        reg                     = ARMV4T_READ_FAULTSTATUS_REG();
+        pCore->fault_status     = reg;
+        reg                     |= 0x100;
+        regDump.fault_data_set  = reg;
+    }
+    else
+    {
+        pCore->fault_status     = 0;
+        regDump.fault_data_set  = 0;
+        regDump.fault_data_addr = 0;
+    }
+    LOCK_ENABLE(mask); /* ¿ªÖжϲ¢±£´æÖ®Ç°µÄ״̬ */
+    
+    regDump.pc      = exceptPc;
+    cpsr            = pCore->user.psr;
+    regDump.sr      = cpsr;
+    regDump.vector  = (UINT32)vector;
+    switch (cpsr & 0x1f)
+    {
+        case 0x13:  /* svrģʽ */
+        {
+            regDump.sp = pCore->supervisor.sp;
+            break;
+        }
+        case 0x17:  /* abort */
+        {
+            regDump.sp = pCore->abort.sp;
+            break;
+        }
+        case 0x1b:  /* undefined */
+        {
+            regDump.sp = pCore->undefined.sp;
+            break;
+        }
+        case 0x1f:  /* system */
+        case 0x10:   /* usr,ÓësystemʹÓÃͬÑùµÄÎïÀí¼Ä´æÆ÷ */
+        {
+            regDump.sp = pCore->user.sp;
+            break;
+        }
+        case 0x11:   /* FIQ */
+        {
+            regDump.sp = pCore->fiq.sp;
+            break;
+        }
+        case 0x12:  /* IRQ */
+        {
+            regDump.sp = pCore->irq.sp;
+            break;
+        }
+        default:
+        {
+            regDump.sp = 0;
+            break;
+        }
+    }
+
+    regDump.magic               = 0x2daea;    /* magicÖµÎÞÓÃ·ÏÆú */
+    regDump.no_sects            = 1;
+    regDump.sect[0].identity    = 0;
+    regDump.sect[0].size        = sizeof(struct cpu_core);
+    regDump.sect[0].address     = (UINT32)pCore;
+    faultAddress                = armv4t_mmu_valid_fault(&regDump);
+    
+    LOCK_RESTORE(mask); /* ÀûÓÃmaskµÄÖµ»Ö¸´µ½ËøÖжÏ״̬ */
+    
+    if(faultAddress)
+    {
+        arm_mmu_Address_map(faultAddress);
+        zzRestoreArmExceptRegister(pCore, exceptPc, cpsr); /* ²»·µ»ØÖ±½ÓÌø×ªÖÁ²úÉúÒì³£µÄ»ã±àÐÐ */
+    }
+    else    /* ÕæÕýµÄÒì³£   */
+    {
+        zte_sys_err_hnd(0, OSE_EUNEXPECTED_EXCEPTION_REGDUMP, (UINT32)&regDump);
+    }
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ: zOSS_MmuOpoa_Init
+* ¹¦ÄÜÃèÊö: Æô¶¯mmuµÄ°´Ðè¼ÓÔØ¹¦ÄÜ
+* ²ÎÊý˵Ã÷£º 
+            (IN)
+    		     base:»ùµØÖ·
+    		     size:´óС
+            (OUT)
+* ·µ »Ø Öµ:  
+**************************************************************************/ 
+VOID zOSS_MmuOpoa_Init(UINT32 base, UINT32 size, UINT32 page_num, CHAR *mmu_map, CHAR *phybuf)
+{
+    UINT32 vectorType           = 0;
+    UINT32 vectorBase           = 0;
+    UINT32 phyaddress           = 0;
+    Msr    old_msr              = 0;
+    UINT32 LogicAddressBegin    = 0;
+    UINT32 LogicAddressEnd      = 0;
+    UINT32 LogicAddress         = 0;
+    UINT32 *mmuFirstBase        = NULL;
+    UINT32 mmuOffset            = 0; 
+
+    if(page_num==0)
+    {
+        return;
+    }
+    Image_mmu_base      = base;
+    Image_mmu_Limit     = size;
+    mmu_secondPage_base = (UINT32)mmu_map;
+    LOCK_SAVE(old_msr);
+    hal_arch_cpu_descriptor->disable_mmu();
+    mmuFirstBase        = (UINT32 *)ARMV4T_READ_TABLE_REG();
+    vectorType          = ARMV4T_READ_CONTROL_REG() & CP15_CONTROL_REG_V;
+    if(!vectorType)
+    {
+        vectorBase = 0;
+    }
+    else
+    {
+        vectorBase = 0xffff0000UL;
+    }
+    *(UINT32 *)(vectorBase + 0x2c) = (UINT32)zprefetch_exception;
+    *(UINT32 *)(vectorBase + 0x30) = (UINT32)zdata_exception;
+
+    LogicAddressBegin   = Image_mmu_base;
+    LogicAddressEnd     = Image_mmu_Limit - 1;/* Image$$resouce$$LimitµØÖ·²»ÊôÓÚ¸ÃÓò */
+    phyaddress          = ALIGN_NEXT(mmu_secondPage_base, 0x400);
+    for(LogicAddress = LogicAddressBegin; LogicAddress < LogicAddressEnd; LogicAddress += 0x100000)
+    {
+        mmuOffset               = MMU_FIRST_INDEX(LogicAddress);
+        mmuFirstBase[mmuOffset] = MMU_FISRT_DESCRIPTION(phyaddress);/* g_next_small_pg_map_item_tbl_baseϵͳ³õʼ»¯ÒѾ­1kb¶ÔÆë */
+        phyaddress              += 0x400; /* ´ÖÁ£¶ÈСҳ1kb¶ÔÆë */
+    }
+    hal_arch_cpu_descriptor->enable_mmu(1, 1, 0, 0, 0, (UINT32)mmuFirstBase);
+    LOCK_RESTORE(old_msr);
+
+    Osa_Mmu_Init(page_num,phybuf);
+}
+#endif
+
+/**************************************************************************
+* ¾Ö²¿º¯ÊýʵÏÖ
+**************************************************************************/
+/**************************************************************************
+* º¯ÊýÃû³Æ£º Osa_GetSysPoolInfo
+* ¹¦ÄÜÃèÊö£º²éѯϵͳÄÚ´æ³ØÐÅÏ¢
+* ²ÎÊý˵Ã÷£º(IN)
+* ·µ »Ø Öµ£º
+* ÆäËü˵Ã÷: 
+**************************************************************************/
+static UINT32 Osa_GetSysPoolInfo(VOID)
+{
+    EfmiStatus              rv          = EFMI_OK;
+    struct EfmiPoolCursor   pc          = {0};
+    struct EfmiPoolInfo     pool_info   = {0};
+    struct EfmiSignalCursor psc         = {0};
+    struct EfmiSignalInfo   ps_info     = {0};
+    
+    int  count          = 0;
+    BOOL firstSignal    = TRUE;
+    BOOL firstPool      = TRUE;
+
+    ramlog_printf("µØÖ·: ËùÓÐÕß: ´óС: ·¢ËÍÕß:ÃèÊö:\n");
+
+    for(; ;)
+    {
+        if(firstPool)
+        {
+            rv          = ose_efmi_get_first_pool(&pc, &pool_info, sizeof(pool_info));
+            firstPool   = FALSE;
+        }
+        else
+        {
+            rv          = ose_efmi_get_next_pool(&pc, &pool_info);
+            firstSignal = TRUE;
+            if(rv == EFMI_END_OF_LIST)
+            {
+                ramlog_printf("¸öÊý:%d\n", count);
+                return ZOSS_SUCCESS;
+            }
+            else if(rv != EFMI_OK)
+            {
+                return ZOSS_ERROR;/* ½áÊøÑ­»· */
+            }
+                
+        }
+        
+        for(; ;)
+        {
+            if(firstSignal)
+            {
+                rv          = ose_efmi_get_first_pool_signal(pool_info.pool_id, 
+                                                             &psc, 
+                                                             &ps_info, 
+                                                             sizeof(ps_info));
+                firstSignal = FALSE;
+            }
+            else
+            {
+                rv = ose_efmi_get_next_pool_signal(&psc, &ps_info);
+
+                if(rv == EFMI_END_OF_LIST)
+                {
+                    break;
+                }
+                else if(rv != EFMI_OK)
+                {
+                    return ZOSS_ERROR;/* ½áÊøÑ­»· */
+                }
+            }
+
+            if(ps_info.sig_status == EFMI_SS_VALID)
+            {
+                /* µØÖ·: ËùÓÐÕß: ´óС: ·¢ËÍÕß:ÃèÊö */
+                ramlog_printf("%#x:%x:%d:%#x\n", ps_info.signal_pointer, ps_info.owner,
+                                 ps_info.size_in_pool, ps_info.sender_pid);
+            }
+            else if(ps_info.sig_status == EFMI_SS_NO_ENDMARK)
+            {
+                ramlog_printf("%#x:%x:%d:%#x:endmark broken\n", ps_info.signal_pointer, 
+                                ps_info.owner, ps_info.size_in_pool, ps_info.sender_pid);
+            }
+            else if(ps_info.sig_status == EFMI_SS_BROKEN_SIGADM)
+            {
+                ramlog_printf("%#x:%x:%d:%#x:controlBlock broken\n", ps_info.signal_pointer,
+                            ps_info.owner, ps_info.size_in_pool, ps_info.sender_pid);
+            }
+            else
+            {
+                continue;
+            }
+            
+            count++;
+        }
+    }
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£ºOsa_GetSysHeapInfo
+* ¹¦ÄÜÃèÊö£º²éѯ¶ÑÄÚ´æÏêϸÐÅÏ¢
+* ²ÎÊý˵Ã÷£º(IN)
+* ·µ »Ø Öµ£º
+* ÆäËü˵Ã÷: 
+**************************************************************************/
+static UINT32 Osa_GetSysHeapInfo(VOID)
+{
+    HfmiStatus                  rv  = HFMI_OK;
+    struct HfmiHeapCursor       hhc = {0};
+    struct HfmiHeapInfo         hi  = {0};
+    struct HfmiBufferCursor     bc  = {0};
+    struct HfmiBufferInfo       bi  = {0};
+    struct HfmiHeapStatistics   hs  = {0};
+    
+    CHAR            *file       = NULL;
+    int             line        = 0;
+    int             count       = 0;
+    BOOL            firstbuffer = TRUE;
+    BOOL            firstheap   = TRUE;
+    ExtAnnotation   *ad         = NULL;
+    UINT32          pid         = 0;
+    UINT32          RamSize     = 0;
+    UINT32          HeapMaxSize = 0;
+    T_Mem_MemInfo   mem_info    = {0};
+    
+    ramlog_printf("µØÖ·(0x):Ïß³Ì(0x):Îļþ(0x):ÐкÅ:\n");
+
+    for(; ;)
+    {
+        if(firstheap)
+        {
+            rv          = (HfmiStatus)ose_hfmi_get_first_heap(&hhc, &hi, sizeof(hi));
+            firstheap   = FALSE;
+        }
+        else
+        {
+            rv          = (HfmiStatus)ose_hfmi_get_next_heap(&hhc, &hi, sizeof(hi));
+            firstbuffer = TRUE;
+            if(rv == HFMI_END_OF_LIST)
+            {
+                ramlog_printf("¸öÊý:%d\n", count);
+                sysparam_readattr_long("krn/log_mem/RAM", "size", (long *)&RamSize);
+                sysparam_readattr_long("heap", "max_size", (long *)&HeapMaxSize);
+                HeapMaxSize         = HeapMaxSize > RamSize ? RamSize : HeapMaxSize;
+                mem_info.nMemTotal  = mem_info.nMemTotal < HeapMaxSize ? HeapMaxSize : mem_info.nMemTotal;
+                ramlog_printf("heaptotal:%d heapused:%d\n", mem_info.nMemTotal, mem_info.nMemUsed);
+                return ZOSS_SUCCESS;
+            }
+            else if(rv != HFMI_OK)
+            {
+                return ZOSS_ERROR; /* ½áÊøÑ­»· */
+            }
+                
+        }
+        
+        ose_hfmi_get_heap_statistics(hi.href, &hs, sizeof(hs));
+        mem_info.nMemTotal  += hs.total_used + hs.total_free;
+        mem_info.nMemUsed   += hs.total_used;
+        
+        for(; ;)
+        {
+            if(firstbuffer)
+            {
+                rv          = (HfmiStatus)ose_hfmi_get_first_buffer(hi.href, &bc, &bi, sizeof(bi));
+                firstbuffer = FALSE;
+            }
+            else
+            {
+                rv = (HfmiStatus)ose_hfmi_get_next_buffer(&bc, &bi, sizeof(bi));
+                if(rv == HFMI_END_OF_LIST)
+                {
+                    break;
+                }
+                else if(rv != HFMI_OK)
+                {
+                    return ZOSS_ERROR; /* ½áÊøÑ­»· */
+                }
+            }
+            //rv = ose_hfmi_get_buffer_file_line(&bc,0,filename, sizeof(filename),&line);
+            if(!(bi.status & HFMI_BUFFER_ALLOCATED))
+            {
+                continue; /* free heap buffer */
+            }
+
+            if(bi.status & HFMI_BUFFER_IS_ANNOTATED)
+            {
+                ad      = (ExtAnnotation*)(bi.data_address - sizeof(ExtAnnotation));
+                file    = (CHAR *)ad->def_annot.file;
+                line    = HDM_GET_LINE(ad->def_annot.control);
+                pid     = ad->pid;
+            }
+            else
+            {
+                file    = NULL;
+                line    = 0;
+                pid     = 0;
+            }
+            count++;
+            /* µØÖ·: Ïß³Ì: Îļþ: ÐкÅ: */
+            ramlog_printf("%#x:%x:%#x:%d\n", bi.data_address, pid, file, line);
+        }
+    }
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£º Osa_EncodeError
+* ¹¦ÄÜÃèÊö£º ÏòLCDÏÔʾ»ù±¾µÄÒì³£ÐÅÏ¢
+* ²ÎÊý˵Ã÷£º (IN):
+                   user_called:ÎªÕæÊ±,±íʾ´íÎóÀ´×ÔÓû§µ÷ÓÃ,Ϊ¼Ùʱ,±íʾ´íÎóÀ´×ÔÄÚºË
+                   ecode:´íÎóÂë
+                   extra:´íÎ󸽼ÓÂë
+*            (OUT):ÎÞ
+**************************************************************************/
+static VOID Osa_EncodeError(CHAR *buf, OSBOOLEAN user_called, OSERRCODE ecode, OSERRCODE extra)
+{
+    OSERRCODE cause = ecode & OSE_EERROR_MASK;
+
+    if (ecode == 0xFFFFFFFF && extra != 0)
+    {
+        /* Assertion failed. */
+        T_ZOss_Except_Info *efl = (T_ZOss_Except_Info *)extra;
+        
+        zOss_SaveRegisters();
+        sprintf((char *)buf, "Failed assertion: %s File: %s line:%u\n", efl->expr, 
+                efl->file, efl->line);
+        return;
+    }
+
+    /* ARMÒì³£ */
+    if (cause == OSE_EUNEXPECTED_EXCEPTION_REGDUMP)
+    {
+        struct cpu_dumpsection *sect0   = NULL;
+        Osa_ArmExceptDump               = (struct cpu_regdump *)extra;
+        sect0                           = &Osa_ArmExceptDump->sect[0];
+        Osa_CoreRegisters               = *(struct cpu_core *)sect0->address;
+        
+        sprintf((char *)buf, "ARM exception Vector:%#lx PC=%#lx SR=%#lx SP=%#lx\n",
+                Osa_ArmExceptDump->vector, Osa_ArmExceptDump->pc, 
+                Osa_ArmExceptDump->sr, Osa_ArmExceptDump->sp);
+        return;
+    }
+
+    /* ÆäËûÒÑÖªµÄϵͳÒì³£ */
+    /* ±£´æµ±Ç°¼Ä´æÆ÷Öµ */
+    zOss_SaveRegisters();
+    
+    if (user_called)/* Óû§´¥·¢µÄÒì³£ */
+    {
+        if (ecode == 0xFFFFFFFE && extra != 0)
+        {
+            /* Unknown signal received. */
+            sprintf((char *)buf, "Unknown signal received\n");
+        }
+        else if (ecode == OSE_EFS_EABORT_CALLED)
+        {
+            OseEfsAbortFileLine *efl = (OseEfsAbortFileLine *)extra;
+            
+            zOss_AssertExN(efl != NULL);
+            sprintf((char *)buf, "Abort called file:%s line:%u\n",
+                     efl->file, efl->line);
+        }
+        /* Check for error reported by HEAP. */
+        else if ((ecode & OSE_ESUBCODE_MASK) == OSE_HEAP_EBASE)
+        {
+            const CHAR *desc = NULL;
+            /*desc = heaperr_str(ecode & ~OSE_EFATAL_MASK);*/
+            sprintf((char *)buf, "Heap reports error %#lx: %s\n",
+                     ecode, desc != NULL ? desc : "unknown");
+
+            /* Heap exhausted errors could be handled (for instance by extending
+               the heap) or just ignored (in such cases malloc() would return
+               NULL). */
+            Osa_GetSysHeapInfo();
+        }
+        else /* Other application specific error codes. */
+        {
+            sprintf((char *)buf, "Application reports error %#lx "
+                     "extra %#lx\n", ecode, extra);
+        }
+    }
+    else /* Kernel detected/reported error. */
+    {
+        sprintf((char *)buf, "Kernel detected error %#lx "
+            "extra %#lx\n", ecode, extra);
+        Osa_GetSysPoolInfo();
+    }
+
+    return;
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£º Osa_heap_debug_alloc_hook
+* ¹¦ÄÜÃèÊö£º heap alloc hook£¬Ìî³äfile line ownerÐÅÏ¢
+* ²ÎÊý˵Ã÷£º (IN):
+                  
+*            (OUT):ÎÞ
+* ·µ »Ø Öµ£º   
+* ÆäËü˵Ã÷£º 
+**************************************************************************/
+VOID Osa_heap_debug_alloc_hook(OSHEAP heap, VOID *ptr, size_t size, size_t annsz,
+                                         PROCESS owner, const CHAR *file, UINT32 line)
+{
+    ExtAnnotation *ad = (ExtAnnotation*)((CHAR *)ptr - sizeof(ExtAnnotation));
+    if(owner == 0)
+    {
+        ad->pid = current_process();
+    }
+    else
+    {
+        ad->pid = owner;
+    }
+    
+    ad->def_annot.file      = (const char *)file;
+    ad->def_annot.control   = line;
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£º Osa_heap_debug_fileline_hook
+* ¹¦ÄÜÃèÊö£º heap fileline hook£¬»ñÈ¡file line ownerÐÅÏ¢
+* ²ÎÊý˵Ã÷£º (IN):
+                  
+*            (OUT):ÎÞ
+* ·µ »Ø Öµ£º   
+* ÆäËü˵Ã÷£º 
+**************************************************************************/
+VOID Osa_heap_debug_fileline_hook(OSHEAP heap, struct HeapBufferInfoReply *hbi, UINT32 offset)
+{
+    return;
+}
+
+/**************************************************************************
+* È«¾Öº¯ÊýʵÏÖ
+**************************************************************************/
+/**************************************************************************
+ * º¯ÊýÃû³Æ£º zte_sys_err_hnd
+ * ¹¦ÄÜÃèÊö£º ½Ó¹ÜOSEϵͳÒì³£´¦Àíº¯Êý
+ * ²ÎÊý˵Ã÷£º (IN):
+                   user_called:ÎªÕæÊ±,±íʾ´íÎóÀ´×ÔÓû§µ÷ÓÃ,Ϊ¼Ùʱ,±íʾ´íÎóÀ´×ÔÄÚºË
+                   ecode:´íÎóÂë
+                   extra:´íÎ󸽼ÓÂë
+*             (OUT):ÎÞ
+ * ·µ »Ø Öµ£º»á·¢ÉúÕý³£ÖØÆô»òÒì³£ÖØÆô²»»áÖ´Ðе½·µ»ØÖµ£»
+ * ÆäËü˵Ã÷£º 
+**************************************************************************/
+OSADDRESS zte_sys_err_hnd(OSBOOLEAN user_called, OSERRCODE ecode, OSERRCODE extra)
+{ 
+    static UINT32   iCount          = 0;
+    UINT8           excepResetFlag  = 0;
+    Msr             oldMsr          = 0;
+    UINT32          errcodeBase     = 0;
+    UINT32          errcodeSize     = 0;
+
+    /* ËøARMÖÐ¶Ï */
+    LOCK_SAVE(oldMsr);
+    iCount++;
+    if(iCount > 1)/* Ö»±£´æµÚÒ»´Î³ö´íÏÖ³¡ */
+    {
+        for ( ; ; ) ;
+    }
+
+    excepResetFlag = (UINT8)zOss_GetExceptResetFlag();
+    if (excepResetFlag != EXCEPT_RESET_ENABLE)
+    {
+        zOss_RamdumpforEncodeError( &errcodeBase , &errcodeSize );
+        /* ½âÎö´íÎóÂë */
+        Osa_EncodeError( (CHAR *)errcodeBase, user_called, ecode, extra);
+        /* LCDÏÔʾÒì³£ÐÅÏ¢ */
+        if(USE_RAMDUMP_DISPLAY_ENABLE == zOss_GetRamdumpDisplayFlag())
+        {
+            ddLcd_DisplayError(0, 0, (CHAR *)lcdBase,
+                               (CHAR *)errcodeBase, (UINT16)errcodeSize);
+        }
+        /* Ö´ÐÐramdumpÒì³£´¦Àíº¯Êý */
+        zOss_RamdumpMain();
+        for ( ; ; ) ;
+    }
+    else
+    {
+        zDrv_Soft_Reset(RESET_TO_EXCEPTRESET);/* Òì³£ÖØÆô */
+    }
+    LOCK_RESTORE(oldMsr);
+    return 0;
+ }
+
+/**************************************************************************
+* º¯ÊýÃû³Æ£º Osa_SysErrHndInit
+* ¹¦ÄÜÃèÊö£º ½Ó¹Ü²Ù×÷ϵͳÒì³£´¦Àíº¯Êý
+* ²ÎÊý˵Ã÷£º (IN):
+                  
+*            (OUT):ÎÞ
+* ·µ »Ø Öµ£º   
+* ÆäËü˵Ã÷£º 
+**************************************************************************/
+VOID Osa_SysErrHndInit(VOID)
+{   
+    HeapDebugHooks hooks = {0};
+    /* ramdisk */
+    sysparam_readattr_long("ramdisk", "base", (long *)&lcdBase);
+    
+    hooks.debug_alloc       = (DEBUG_ALLOC_FUNC)Osa_heap_debug_alloc_hook;
+    hooks.debug_fileline    = (DEBUG_FILELINE_FUNC)Osa_heap_debug_fileline_hook;
+    
+    ose_heap_set_debug_hooks(ose_heap_ref(0), sizeof(ExtAnnotation), &hooks);
+    sys_err_hnd_hook_install(zte_sys_err_hnd);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cp/ps/plat/src/oss/osa/ose/src/ose_except_arm_asm.s b/cp/ps/plat/src/oss/osa/ose/src/ose_except_arm_asm.s
new file mode 100644
index 0000000..4a5d0ba
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/ose/src/ose_except_arm_asm.s
@@ -0,0 +1,92 @@
+;/*********************************************************************

+; °æÈ¨ËùÓÐ (C)2001,ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+;

+; ÎļþÃû³Æ£º ose_except_arm_asm.s

+; Îļþ±êʶ£º

+; ÄÚÈÝÕªÒª£º 

+;

+; ÐÞ¸ÄÈÕÆÚ     °æ±¾ºÅ     Ð޸ıê¼Ç     ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+; --------------------------------------------------------------------

+; 2009/11/16   V1.0        ´´½¨        ºÎº£½¨            ´´½¨

+;********************************************************************/

+

+;/*********************************************************************

+;*                        Í·Îļþ°üº¬                                  *

+;********************************************************************/

+

+

+;/********************************************************************

+;*                        ºê¶¨Òå                                     *

+;********************************************************************/

+

+;/********************************************************************

+;*                        ³£Á¿                                       *

+;********************************************************************/

+

+;/********************************************************************

+;*                        Êý¾ÝÀàÐÍ                                   *

+;********************************************************************/

+

+;/********************************************************************

+;*                        staticº¯ÊýÉùÃ÷                             *

+;********************************************************************/

+

+;/********************************************************************

+;*                        È«¾Ö±äÁ¿¶¨Òå                               *

+;********************************************************************/

+     EXPORT zOss_SaveRegisters

+     IMPORT Osa_CoreRegisters

+;/********************************************************************

+;*                        º¯ÊýʵÏÖ                                   *

+;********************************************************************/

+    PRESERVE8

+    AREA   OsaExcept, CODE, READONLY

+       CODE32

+;/********************************************************************

+; º¯ÊýÃû³Æ£ºzOss_SaveRegisters 

+; ¹¦ÄÜÃèÊö£º ±£´æÒì³£·¢ÉúʱËùÓеļĴæÖµÖÁ½á¹¹Ìå±äÁ¿(Osa_CoreRegisters),

+;ÔÚµ÷Óú¯Êý֮ǰÐè½ûÖ¹ËùÓÐÖжÏ

+; ²ÎÊý˵Ã÷£º (IN):ÎÞ

+;            (OUT):ÎÞ

+; ·µ »Ø Öµ£º    ÎÞ

+; ÆäËü˵Ã÷£º 

+;********************************************************************/

+;VOID  zOss_SaveRegisters(VOID)

+zOss_SaveRegisters 

+    PUSH     {r14}

+    LDR      r14,=Osa_CoreRegisters

+    STM      r14!,{r0-r12}      ;//±£´ær0-r12

+    MOV      r0,r14             ;//±£´ær14ÖÁr0£¬ºóÐøÒÔr0Ϊ»ùµØÖ·Ñ¹Õ»

+    LDR      r14,[r13],#4       ;//»¹Ô­r13,r14

+    MRS      r1,CPSR            ;//±£´æcpsrÖÁr1

+    MSR      CPSR_c,#0xdf       ;//SYS modeµÈ¼Ûusr mode

+    STM      r0!,{r13,r14}      ;//½«{r13,r14}ÈëÕ»

+    MRS      r2,SPSR

+    STR      r2,[r0],#4         ;//½«SPSRÈëÕ»

+    MSR      CPSR_c,#0xd3       ;//svc mode

+    STM      r0!,{r13,r14}      ;//½«{r13,r14}ÈëÕ»

+    MRS      r2,SPSR

+    STR      r2,[r0],#4         ;//½«SPSRÈëÕ»

+    MSR      CPSR_c,#0xd7       ;//ABT mode

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xdb       ;//UND mode

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xd2       ;//IRQ mode

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xd1       ;//FIQ mode

+    MRS      r2,SPSR

+    STM      r0!,{r8-r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,r1          ;//»¹Ô­CPRS

+    LDR      r14,=Osa_CoreRegisters ;//»¹Ô­¼Ä´æÆ÷      

+    LDM      r14!,{r0-r12}      ;//»¹Ô­r0-r12£¬r13µÄֵ֮ǰÒÑ»¹Ô­

+    LDMDB    r13,{R14}          ;//»¹Ô­r14

+    BX       r14                ;//·µ»Ø

+    END

+

diff --git a/cp/ps/plat/src/oss/osa/ose/src/ose_except_opoa_arm.s b/cp/ps/plat/src/oss/osa/ose/src/ose_except_opoa_arm.s
new file mode 100644
index 0000000..b3457e7
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/ose/src/ose_except_opoa_arm.s
@@ -0,0 +1,178 @@
+;/*********************************************************************
+; °æÈ¨ËùÓÐ (C)2001,ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+;
+; ÎļþÃû³Æ£º ose_except_arm_opoa.s
+; Îļþ±êʶ£º
+; ÄÚÈÝÕªÒª£º 
+;
+; ÐÞ¸ÄÈÕÆÚ     °æ±¾ºÅ     Ð޸ıê¼Ç     ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ
+; --------------------------------------------------------------------
+; 2009/11/16   V1.0        ´´½¨        ºÎº£½¨            ´´½¨
+;********************************************************************/
+;/********************************************************************
+;*                        ÍⲿÉùÃ÷                                  *
+;********************************************************************/
+	EXPORT zdata_exception
+	EXPORT zprefetch_exception
+	EXPORT zundefined_instruction_exception
+	EXPORT zzSetArmExceptStack
+	EXPORT zzRestoreArmExceptRegister
+    
+;/********************************************************************
+;*                        ÍⲿÒýÓà                                   *
+;********************************************************************/
+	IMPORT zexception_c
+	
+;/********************************************************************
+;*                        º¯ÊýʵÏÖ                                   *
+;********************************************************************/
+    PRESERVE8
+    AREA   EXCEPT_OPOA, CODE, READONLY
+    CODE32
+    
+;/********************************************************************
+; zzundefined_instruction_exception 
+; ¹¦ÄÜÃèÊö£º ARM䶨ÒåÖ¸ÁîÒì³£´¦Àíº¯Êý
+; ²ÎÊý˵Ã÷£º (IN):ÎÞ
+;            (OUT):ÎÞ
+; ·µ »Ø Öµ£º    ÎÞ
+; ÆäËü˵Ã÷£º 
+;********************************************************************/
+zundefined_instruction_exception
+	MSR      CPSR_c,#0xdb     	;//Ìí¼Ó½ûÖ¹FIQ,½øÀ´Ê±ÒѽûÖ¹IRQ´¦ÓÚUNDģʽ
+	STMDB    R13!,{r0}
+	MRS      r0,SPSR
+	TST      r0,#0x20
+	SUBEQ    r14,r14,#4
+	SUBNE    r14,r14,#2
+	MOV      r0,#4
+	B        zexception
+	
+;/********************************************************************
+; zzprefetch_exception 
+; ¹¦ÄÜÃèÊö£º ARMԤȡָÁîÒì³£´¦Àíº¯Êý
+; ²ÎÊý˵Ã÷£º (IN):ÎÞ
+;            (OUT):ÎÞ
+; ·µ »Ø Öµ£º    ÎÞ
+; ÆäËü˵Ã÷£º 
+;********************************************************************/
+zprefetch_exception
+	MSR      CPSR_c,#0xd3     	;//½ûÖ¹FIQ,Çл»ÖÁsvcģʽ	
+	SUB      r13,r13,#0x94		;//sizeof(struct cpu_core)=0x94
+	STMIA    R13!,{r0-r12}		;//R0-R12ÈësvcģʽÏÂÕ»
+	MOV      r2, r13		    ;//ºóÐøÒÔr2Ϊ»ùµØÖ·Ñ¹Õ»
+	MOV      r0,#0xc			;//±£´æÒ쳣ģʽ
+	MSR      CPSR_c,#0xd7     	;//Çл»ÖÁÒì³£(abt)ģʽ
+	MRS      R3,SPSR			;//±£´æÒ쳣ģʽϵÄSPSRÖÁr3£¬SYS modeѹÈë
+	SUB      r14,r14,#4
+	mov      r1,r14				;//±£´æ²úÉúÒì³£»ã±àÐÐ(pc)
+	MSR      CPSR_c,#0xd3		;//Çл»ÖÁsvcģʽ
+	ADD      R13,R13,#0x60		;//»¹Ô­r13,0x60=0x94-0x34(R0-R12)
+	B        zexception
+	
+;/********************************************************************
+; zzdata_exception 
+; ¹¦ÄÜÃèÊö£º ARMÊý¾Ý·ÃÎÊÒì³£´¦Àíº¯Êý
+; ²ÎÊý˵Ã÷£º (IN):ÎÞ
+;            (OUT):ÎÞ
+; ·µ »Ø Öµ£º    ÎÞ
+; ÆäËü˵Ã÷£º 
+;********************************************************************/
+;VOID  zzdata_exception(VOID)
+zdata_exception
+	MSR      CPSR_c,#0xd3     	;//½ûÖ¹FIQ,Çл»ÖÁsvcģʽ	
+	SUB      r13,r13,#0x94		;//sizeof(struct cpu_core)=0x94
+	STMIA    R13!,{r0-r12}		;//R0-R12ÈësvcģʽÏÂÕ»
+	MOV      r2, r13		    ;//ºóÐøÒÔr2Ϊ»ùµØÖ·Ñ¹Õ»
+	MOV      r0,#0x10			;//±£´æÒ쳣ģʽ
+	MSR      CPSR_c,#0xd7     	;//Çл»ÖÁÒì³£(abt)ģʽ
+	MRS      R3,SPSR			;//±£´æÒ쳣ģʽϵÄSPSRÖÁr3£¬SYS modeѹÈë
+	SUB      r14,r14,#8
+	mov      r1,r14				;//±£´æ²úÉúÒì³£»ã±àÐÐ(pc)
+	MSR      CPSR_c,#0xd3		;//Çл»ÖÁsvcģʽ
+	ADD      R13,R13,#0x60		;//»¹Ô­r13,0x60=0x94-0x34(R0-R12)
+	B        zexception
+	
+;/********************************************************************
+; zzexception 
+; ¹¦ÄÜÃèÊö£º ±£´æ¼Ä´æÆ÷ÏÖ³¡£¬Ö´ÐÐCÓïÑÔÒì³£´¦Àíº¯Êý
+; ²ÎÊý˵Ã÷£º (IN):type:ARMÒì³£ÖжÏÏòÁ¿±íµØÖ·
+;            (OUT):ÎÞ
+; ·µ »Ø Öµ£º    ÎÞ
+; ÆäËü˵Ã÷£º 
+;********************************************************************/
+;VOID  zzexception(UINT32 type, UINT32 exceptPc,UINT32 stackBase, UINT32 spsr) 
+zexception
+	MSR      CPSR_c,#0xdf     	;//SYS modeµÈ¼Ûusr mode
+	STMIA    r2!,{r13,r14}    	;//½«{r13,r14}ÈëÕ»
+	STR      r3,[r2],#4       	;//½«r3(Ò쳣ģʽϵÄCPSR)ÈëÕ»,SYSģʽûÓÐspsr
+	MSR      CPSR_c,#0xd3     	;//svc mode
+	STMIA    r2!,{r13,r14}    	;//½«{r13,r14}ÈëÕ»
+	MRS      r3,SPSR
+	STR      r3,[r2],#4       	;//½«SPSRÈëÕ»
+	MSR      CPSR_c,#0xd7     	;//ABT mode
+	MRS      r3,SPSR
+	STMIA    r2!,{r13,r14}
+	STR      r3,[r2],#4
+	MSR      CPSR_c,#0xdb     	;//UND mode
+	MRS      r3,SPSR
+	STMIA    r2!,{r13,r14}
+	STR      r3,[r2],#4
+	MSR      CPSR_c,#0xd2     	;//IRQ mode
+	MRS      r3,SPSR
+	STMIA    r2!,{r13,r14}
+	STR      r3,[r2],#4
+	MSR      CPSR_c,#0xd1     	;//FIQ mode
+	MRS      r3,SPSR
+	STMIA    r2!,{r8-r14}
+	STR      r3,[r2],#4
+	MSR      CPSR_c,#0xd3     	;//svc mode
+	SUB      r13,r13,#0x94		;//¸üÐÂr13,sizeof(struct cpu_core)=0x94
+	MOV      R2,R13
+	B        zexception_c  		;//½øÐÐÒì³£´¦Àí£¬r0=Ò쳣ģʽ,r1=pc,r2=cpu_core½á¹¹ÌåµÄÊ×µØÖ·
+	
+;/********************************************************************
+; zzRestoreArmExceptRegister
+; ¹¦ÄÜÃèÊö£º»¹Ô­Òì³£·¢ÉúǰµÄ¼Ä´æÆ÷
+;ÔÚµ÷Óú¯Êý֮ǰÐè½ûÖ¹ËùÓÐÖжÏ
+; ²ÎÊý˵Ã÷£º (IN):
+;					pCore:
+;                  exceptPc:
+;					cpsr:
+;            (OUT):ÎÞ
+; ·µ »Ø Öµ£º    ÎÞ
+; ÆäËü˵Ã÷£º 
+;********************************************************************/
+;VOID  zzRestoreArmExceptRegister(struct cpu_core * pCore, UINT32 exceptPc, UINT32 cpsr)
+zzRestoreArmExceptRegister
+    ADD      R14,R0,#0x40		;//Ö¸ÏòpCore->supervisor.sp
+	LDMIA    R14!,{R13}         ;//»¹Ô­¼Ä´æÆ÷R13
+	LDMIA    R14!,{R3}			;//¶ÁÈ¡pCore->supervisor.lrÖÁR3
+	MSR      SPSR_cxfs,r2       ;//´æcpsrÖÁspsr,ºóÐø»¹Ô­cpsr״̬ÓÃ
+	MOV      R4,R1
+	STMDB    R13!,{R3,R4}		;//½«pCore->supervisor.lr,exceptPc±£´æÖÁ¶ÑÕ»
+	MOV      r14,R0 			;//»¹Ô­¼Ä´æÆ÷     
+	LDMIA    r14!,{r0-r12}     	;//»¹Ô­r0-r12
+	LDMIA    R13!,{R14,pc}^		;//»¹Ô­R13,r14,·µ»Ø²úÉúÒì³£µÄ»ã±à		
+;/********************************************************************
+; º¯ÊýÃû³Æ£ºzzSetArmExceptStack
+; ¹¦ÄÜÃèÊö£ºÉèÖÃARM abort¼°undefÒì³£µÄÕ»Ö¸Õë
+;ÔÚµ÷Óú¯Êý֮ǰÐè½ûÖ¹ËùÓÐÖжÏ
+; ²ÎÊý˵Ã÷£º (IN):
+;					armmode:Ò쳣ģʽ(0xd7:abtģʽ;0xdb:Çл»ÖÁundģʽ)
+;					stackTop:Õ»µÄ¸ßµØÖ·
+;            (OUT):ÎÞ
+; ·µ »Ø Öµ£º    ÎÞ
+; ÆäËü˵Ã÷£º 
+;********************************************************************/
+;VOID  zzSetArmExceptStack(UINT32 armMode, UINT32 stackTop)
+zzSetArmExceptStack
+	STMDB    R13!,{R2,R14}
+	MRS      R2,CPSR
+	MSR      CPSR_c, R0
+    MOV      r13, r1
+	MSR      CPSR_c,R2
+	LDMIA    R13!,{R2,pc}
+    
+    END
+
diff --git a/cp/ps/plat/src/oss/osa/ose/src/ose_kernel.c b/cp/ps/plat/src/oss/osa/ose/src/ose_kernel.c
new file mode 100644
index 0000000..3e7a292
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/ose/src/ose_kernel.c
@@ -0,0 +1,2052 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : ose_kernel.c

+* ÎÄ ¼þ Ãû : ose_kernel.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ²Ù×÷ϵͳ³éÏó²ã,°üÀ¨²Ù×÷ϵͳµÄ»ù±¾º¯Êý

+* ×÷    Õß : ºÎº£½¨

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007/06/01

+* ÆäËü˵Ã÷ :          

+**************************************************************************/

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ºÎº£½¨  

+* ÐÞ¸ÄÈÕÆÚ : 2008/02/12

+* ÐÞ¸ÄÄÚÈÝ : ÌṩÏ߳̿ռä

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/09/15

+* ÐÞ¸ÄÄÚÈÝ : PC-LINT¼ì²éÓÚ±àÂë¹æ·¶ÐÞ¸Ä EC: 617001781881  

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC: 617001781957

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "ose_typedef.h"

+#include "osa.h"

+#include "sup.h"

+#include "bios.h"

+#include "hwtimer.h"

+#include "Dyn_config.h"

+#include <time.h>

+#include "rtc.h"

+#include "sysparam.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define THREAD_MSG_HEAD_SIZE        sizeof( T_THREAD_MSG_HEAD )

+#define THREAD_MSG_HEAD(buf)        (T_THREAD_MSG_HEAD *)((UINT8 *)(buf) - THREAD_MSG_HEAD_SIZE)

+#define THREAD_MSG_BUF(head)        (VOID *)((UINT8 *)(head) + THREAD_MSG_HEAD_SIZE)

+#define THREAD_MSG_SIZE(size)       ((size) + THREAD_MSG_HEAD_SIZE)

+#define THREAD_MSG_MAGIC            0x3A3A3A3A

+

+#define THREAD_MSG_HOOK_TYPE_MAX    ZOSS_SETHOOKFLAG_INTER

+#define THREAD_MSG_HOOK_DIRE_MAX    ZOSS_MSGDIRE_INOUT

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    SIGSELECT   sig_no; /* ³ÉÔ±ÔڽṹÌåÖеÄλÖò»Äܸıä */

+    UINT32      id;

+    UINT32      buf_size;

+    UINT32      magic;

+}T_THREAD_MSG_HEAD;

+

+typedef struct

+{

+    T_ZOss_Node     Node;                           /* Ïà¶ÔλÖò»ÄÜ¸Ä±ä             */

+    ZOSS_THREAD_ID  thread_id;

+    UINT8           dire[THREAD_MSG_HOOK_TYPE_MAX]; /* 0: ZOSS_SETHOOKFLAG_MONI=1   */

+    THREAD_MSG_HOOK func[THREAD_MSG_HOOK_TYPE_MAX]; /* 0: ZOSS_SETHOOKFLAG_MONI=1   */

+}THREAD_MSG_HOOK_CONTENT;

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+T_ZOsa_ThreadUserArea   **gp_OsaThreadUserArea  = NULL;     /* ±£´æÏß³ÌÓû§¿Õ¼äµØÖ·     */

+static long int         hwt_handle              = 0;

+static UINT32           gOsa_SwapLastTime       = 0;

+static  UINT32          gOsa_CpuStartTime       = 0;        /* ¿ªÊ¼Í³¼ÆÏß³ÌÖ´ÐÐʱ¼ä     */

+static BOOL             gOsa_SwapFlag           = FALSE;    /* Ïß³Ìhook¿ªÆô±êÖ¾         */

+static ZOSS_TASK_ID     *gOsa_AllTaskIdArray    = NULL;

+BOOL                    gOsa_SwapTimeFlag       = FALSE;    /* Ïß³ÌÇл»¼Ç¼cpuʱ¼ä±êÖ¾  */

+UINT32                  gOse_maxthreads         = 0;

+UINT32                  gOsa_SysCpuFreq         = 0;        /* Ó²¼þ¼ÆÊýÆ÷ƵÂÊ           */

+

+VOID zOss_checkUBlist(VOID);

+

+#ifdef _USE_TRACE_INT_THREAD

+

+UINT32          gSwapInIndex            = 0;

+ZOSS_THREAD_ID  gSwapInThreadsID[5000];

+UINT32          gSwapInTimes[5000];

+UINT32          gSum                    = 0;

+

+UINT32          gSwapOutIndex           = 0;

+ZOSS_THREAD_ID  gSwapOutThreadsID[5000];

+UINT32          gSwapOutTimes[5000];

+

+#endif

+

+static T_ZOss_List  s_thread_msg_hook_list = { 0 };

+/************************************************************************** 

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/   

+extern UINT32           gMem_UBStart ;    /* ÄÚ´æ³ØÆðʼָÕë   */

+

+/**************************************************************************  

+* Íⲿº¯ÊýÉùÃ÷

+**************************************************************************/ 

+extern UINT32 MEM_Init(VOID);

+extern VOID Osa_SysErrHndInit(VOID);

+extern VOID FS_Init(VOID);

+#ifdef _USE_PSM

+extern UINT32 zOss_PsmAdjustFreq312M(VOID);

+#endif

+

+/*************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+*************************************************************************/

+/*************************************************************************

+* º¯ÊýÃû³Æ: zOss_IdVerify

+* ¹¦ÄÜÃèÊö: Ö¤ÊµÌØ¶¨IDµÄ´æÔÚ

+* ²ÎÊý˵Ã÷:

+* ·µ »Ø Öµ: ZOSS_SUCCESS:ÓÐЧID;ZOSS_ERROR:ÎÞЧID

+* ÆäËü˵Ã÷:

+*************************************************************************/

+static UINT32 zOss_IdVerify(ZOSS_THREAD_ID thread_id)

+{

+    enum PROCESS_TYPE  ProcessType;

+

+    zOss_AssertEx(NULL != thread_id, ZOSS_ERROR);

+    ProcessType = get_ptype((PROCESS) thread_id);

+

+    if (OS_ILLEGAL == ProcessType || OS_ZOOMBIE == ProcessType)   /* ÎÞЧµÄÏß³ÌID */

+    {

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        return ZOSS_SUCCESS;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: Osa_OseThreadEntry

+* ¹¦ÄÜÃèÊö: OSE½ø³ÌÈë¿Úº¯Êý

+* ²ÎÊý˵Ã÷: (IN)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷: Ö»ÄÜÓÉzOss_CreateThread()º¯Êýµ÷ÓÃ,ÊÇOSEÏß³ÌÈë¿Úº¯Êý,

+*           ¸Ãº¯ÊýÄÚ²¿Ö´ÐÐÓû§Ïß³ÌʵÌ庯Êý.¸ù¾ÝOSE Ï̻߳·¾³±äÁ¿Ô­Àí

+*           À´ÊµÏÖµ÷ÓÃʵÌ庯Êý¼°ÏòʵÌ庯Êý´«µÝÐβÎ.

+**************************************************************************/

+static VOID Osa_OseThreadEntry(VOID)

+{

+    PROCESS         thread_id   = current_process();

+    ZOSS_THREAD_FUN thread_fun  = (ZOSS_THREAD_FUN)get_envp((PROCESS)thread_id, OSA_THREADFUN); /* Ö¸Õë */

+    SINT32          arg         = (SINT32)get_envp((PROCESS)thread_id, OSA_THREADARG);          /* Ö¸Õë */

+

+    if (NULL == thread_fun)

+    {

+        zOss_ASSERT(NULL != thread_fun);

+        zOss_ExitThread();/* ±ØÐëÏÔʽÍ˳ö,·ñÔòÏß³ÌÖ´ÐÐÍêºóÒÀÈ»´æÔÚ  */

+        return;

+    }

+

+    thread_fun(arg);    /* Ö´ÐÐÓû§ÊµÌ庯Êý                         */

+    zOss_ExitThread();  /* ±ØÐëÏÔʽÍ˳ö,·ñÔòÏß³ÌÖ´ÐÐÍêºóÒÀÈ»´æÔÚ    */

+}

+

+static THREAD_MSG_HOOK_CONTENT* find_thread_content( ZOSS_THREAD_ID thread_id )

+{

+    THREAD_MSG_HOOK_CONTENT *p_content = (THREAD_MSG_HOOK_CONTENT *)zOss_ListFirst( &s_thread_msg_hook_list );

+    while ( NULL != p_content )

+    {

+        if ( thread_id == p_content->thread_id )

+        {

+            break;

+        }

+        p_content = (THREAD_MSG_HOOK_CONTENT *)zOss_ListNext( (T_ZOss_Node *)p_content );

+    }

+

+    return p_content;

+}

+

+#ifdef _USE_THREADMSG_HOOK

+static BOOL is_sender_task( VOID *senderId )

+{

+    ZOSS_TASK_ID task_id = zOss_GetSelfTaskID();

+    if ( ZOSS_INVALID_TASK_ID != task_id )

+    {

+        *(UINT32 *)senderId = (UINT32)task_id;

+        return TRUE;

+    }

+    else

+    {

+        *(UINT32 *)senderId = (UINT32)zOss_GetCurThreadID();

+        return FALSE;

+    }    

+}

+

+static UINT32 proc_thread_msg_hook( UINT8 dire, 

+                                    UINT32 msg_id, 

+                                    VOID *p_buf, 

+                                    UINT16 buf_size, 

+                                    ZOSS_THREAD_ID thread_id )

+{

+    UINT32 i = 0;

+    

+    THREAD_MSG_HOOK_CONTENT *p_content = find_thread_content( thread_id );

+    if ( NULL == p_content )

+    {

+        return 0;

+    }

+

+    for ( ; i < THREAD_MSG_HOOK_TYPE_MAX; i++ )

+    {

+        if ( 0 != (dire & p_content->dire[i])  )

+        {

+            (VOID)(p_content->func[i]( msg_id, p_buf, buf_size, dire ));

+        }

+    }

+

+    return (0 != (dire & p_content->dire[ZOSS_SETHOOKFLAG_INTER - 1])) ? ZOSS_SETHOOKFLAG_INTER : 0;

+}

+

+static UINT32 proc_task_msg_hook( UINT8 dire, 

+                                  UINT32 msg_id, 

+                                  VOID *p_buf, 

+                                  UINT16 buf_size, 

+                                  ZOSS_TASK_ID task_id )

+{

+    T_ZOss_TCB          *task_tcb   = (T_ZOss_TCB *)task_id;

+    T_ZOss_TaskMsgHead  msg_head    = { 0 };

+    UINT32              i           = 0;

+

+    msg_head.msgID = msg_id;

+    for ( ; i < THREAD_MSG_HOOK_TYPE_MAX; i++ )

+    {

+        if ( 0 != (dire & task_tcb->dire[i])  )

+        {

+            (VOID)(task_tcb->HookEntry[i]( &msg_head, dire ));

+        }

+    }

+

+    return (0 != (dire & task_tcb->dire[ZOSS_SETHOOKFLAG_INTER - 1])) ? ZOSS_SETHOOKFLAG_INTER : 0;

+}

+

+static UINT32 proc_msg_hook( UINT32 msg_id, VOID *p_buf, UINT16 buf_size, ZOSS_THREAD_ID d_thread_id )

+{

+    VOID    *senderId   = NULL;

+    UINT32  ret         = 0;

+    

+    if ( is_sender_task(&senderId) )

+    {

+        ret = proc_task_msg_hook( ZOSS_MSGDIRE_OUT, msg_id, p_buf, buf_size, (ZOSS_TASK_ID)senderId );

+    }

+    else

+    {

+        ret = proc_thread_msg_hook( ZOSS_MSGDIRE_OUT, msg_id, p_buf, buf_size, (ZOSS_THREAD_ID)senderId );

+    }

+    if ( ZOSS_SETHOOKFLAG_INTER == ret )

+    {

+        return ret;

+    }

+

+    ret = proc_thread_msg_hook( ZOSS_MSGDIRE_IN, msg_id, p_buf, buf_size, d_thread_id );

+    return ret;

+}

+#endif

+/**************************************************************************

+* º¯ÊýÃû³Æ:  zOss_PsmSleep

+* ¹¦ÄÜÃèÊö: (Ê¡µç°æ±¾)ʹÏß³Ì˯ÃßÒ»¶Îʱ¼ä,±ØÐëÔÚÆ½Ì¨¶¨Ê±Æ÷Ä£¿é³õʼ»¯ºóµ÷ÓÃ

+* ²ÎÊý˵Ã÷: (IN) time_in_ms: Ïß³Ì˯Ãßʱ¼ä,µ¥Î»ÎªºÁÃë

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+static VOID sleepCallBack(SINT32 th_param)

+{

+    zOss_PutSemaphore((ZOSS_SEMAPHORE_ID)th_param);

+}

+

+static VOID zOss_PsmSleep(UINT32 time_len)

+{  

+    UINT32          status      = 0;

+    ZOSS_TIMER_ID   timerId     = NULL; 

+    ZOSS_THREAD_ID  threadId    = zOss_GetCurThreadID();

+    UINT32          iIndex      = 0;

+    T_ZOsa_ThreadUserArea *ua   = NULL;

+

+    if (time_len == 0 || threadId == NULL)

+    {

+        return;

+    }

+

+    zOss_AssertExN(get_ptype((PROCESS)threadId) == OS_PRI_PROC);

+    iIndex = OSA_PID_TO_INDEX(threadId);

+    ua     = gp_OsaThreadUserArea[iIndex];

+    if(NULL == ua)

+    {

+        delay((OSTIME)time_len);

+        return;

+    }

+    

+    if(ua->sleepsem == NULL)

+    {

+        ua->sleepsem = zOss_CreateSemaphore("SleepSem", 0);

+        zOss_AssertExN(ua->sleepsem != NULL);

+    }

+    timerId = zOss_CreateTimer("psmSleep", (ZOSS_TIMER_FUN)sleepCallBack, (SINT32)ua->sleepsem, FALSE);

+    zOss_AssertExN(timerId != NULL);

+    ua->sleepTimerId    = timerId;

+    status = zOss_StartTimer(timerId, time_len, (ZOSS_TIMER_FUN)sleepCallBack, (SINT32)ua->sleepsem);

+    zOss_AssertExN(status == ZOSS_SUCCESS);

+    zOss_GetSemaphore(ua->sleepsem, ZOSS_WAIT_FOREVER);

+    zOss_KillTimer(timerId);

+    ua->sleepTimerId = NULL;    

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  obtain_timebase_frequency

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN)    :

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+static UINT32 obtain_timebase_frequency(VOID)

+{

+    UINT32 freq = 0;

+

+    hwt_handle = (long int)biosOpen(HWTIMER_BIOSNAME);

+

+    if (hwt_handle == 0)

+    {

+        return 0;

+    }

+

+    freq = hwtimer_freq(hwt_handle, -1);

+

+    if (freq == 0)

+    {

+        OSPRIORITY  oldpri  = get_pri(current_process());

+        UINT32         begin   = 0;

+

+        set_pri(0);

+        /* Short delay to synchronize with system tick. */

+        delay(1);

+        begin   = hwtimer_read(hwt_handle);

+        delay(1000);

+        freq    = hwtimer_read(hwt_handle) - begin;

+        set_pri(oldpri);

+        zOss_ASSERT(freq != 0);

+    }

+

+    return freq;

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  OSA_Init

+* ¹¦ÄÜÃèÊö:  OSAÄ£¿é³õʼ»¯,ÔÚ²Ù×÷ϵͳÆô¶¯Ê±µ÷ÓÃ

+* ²ÎÊý˵Ã÷:

+* ·µ »Ø Öµ:  ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:  ÖØ¸´³õʼ»¯·µ»ØZOSS_ERROR(¸Ã½Ó¿Úδ³õʼ»¯Ç°²»ÔÊÐíµ÷ÓÃÄÚ´æÉêÇë\ÊͷŽӿÚ)

+**************************************************************************/

+UINT32 OSA_Init(VOID)

+{

+    static BOOL             bOsaInit    = TRUE;

+    UINT32                  status      = ZOSS_ERROR;

+    UINT32                  nRet        = ZOSS_SUCCESS;

+    T_ZOsa_ThreadUserArea   **ua        = NULL;

+    

+    if (bOsaInit)

+    {

+        /*==========================================

+                  Initialize Mem

+         ==========================================*/

+        nRet = MEM_Init();

+        if (nRet != ZOSS_SUCCESS)

+        {

+            zOss_RamLog((CHAR *)"SysEntry: MEM_Init Fail, Code = 0x%x!", nRet);

+            return nRet;

+        }

+        zOss_RamLog((CHAR *)"SysEntry(%u): MEM_Init Start OK!", zOss_GetTickCount());

+      

+        gOse_maxthreads = max_processes();

+        if (gp_OsaThreadUserArea == NULL)/* ÖØÐ·ÖÅä */

+        {

+            ua = (T_ZOsa_ThreadUserArea **)zOss_Malloc(gOse_maxthreads * sizeof (VOID *));

+            zOss_AssertEx(ua != NULL, ZOSS_ERROR);

+            zOss_Memset(ua, 0, gOse_maxthreads * sizeof (VOID *));

+            gp_OsaThreadUserArea = ua;

+        }  

+        zOss_ListInit(&s_thread_msg_hook_list); /* Initialize Thread List Info,Ö§³ÖÏß³ÌÏûÏ¢¹ÜÀíhook */

+

+        FS_Init();

+

+        Osa_SysErrHndInit();

+

+        status      = ZOSS_SUCCESS;

+        bOsaInit    = FALSE;

+    }

+    else

+    {

+        status = ZOSS_ERROR;

+    }

+

+    return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º OSA_IdentifyThread

+* ¹¦ÄÜÃèÊö£º ÅжÏÒ»¸öÏß³ÌÊÇ·ñÓÐЧ

+* ²ÎÊý˵Ã÷£º (IN)

+                  ZOSS_THREAD_ID : Ïß³ÌID

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS;ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 OSA_IdentifyThread( ZOSS_THREAD_ID threadID )

+{

+    return zOss_IdVerify(threadID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_GetprioCfg

+* ¹¦ÄÜÃèÊö: »ñÈ¡ÓÅÏȼ¶Öµ

+* ²ÎÊý˵Ã÷: iIndex ȡֵΪ0~31

+* ·µ »Ø Öµ: ÕýÈ··µ»ØÓÅÏȼ¶ÊýÖµ£¬´íÎó·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷: iIndex ȡֵΪ0~31

+**************************************************************************/

+UINT32 zOss_GetPrioCfg(UINT8 offset)

+{

+    T_OSS_PARAM *pOssParam = NULL;

+

+    zOss_AssertEx(offset <= 31, ZOSS_ERROR);

+

+    pOssParam = zOss_GetOssCfg();

+

+    if (NULL != pOssParam->OsaCfg.pPrioMap)

+    {

+        return (UINT32)(*(pOssParam->OsaCfg.pPrioMap))[offset];

+    }

+    else

+    {

+        return(UINT32)(offset);

+    }

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ:  zOss_CreateThread

+* ¹¦ÄÜÃèÊö:  Ï̴߳´½¨

+* ²ÎÊý˵Ã÷:  (IN)   thread_name:Ïß³ÌÃû³Æ;

+                    entry:Óû§Èë¿ÚʵÌ庯Êý

+                    arg:Ïß³ÌʵÌ庯ÊýµÄ²ÎÊý;

+                    stack_size:Ïß³ÌÓµÓеĶÑÕ»´óС;

+                    priority:Ï̵߳ÄÓÅÏȵȼ¶0-31;

+                    preempt:ͬÓÅÏȼ¶Ïß³ÌÊÇ·ñÔÊÐíÇÀÕ¼,·Ç0ֵΪÇÀÕ¼Ïß³Ì,

+                            0ֵΪ²»¿ÉÇÀÕ¼Ïß³Ì,¼´ÊÇ·ñÖ´ÐÐʱ¼äƬµ÷¶È;

+                    auto_start:´´½¨Ï̺߳óÊÇ·ñ×Ô¶¯Ö´ÐÐ;

+

+* ·µ »Ø Öµ:  ³É¹¦:Ïß³ÌID;ʧ°Ü:ZOSS_INVALID_THREAD_ID

+* ÆäËü˵Ã÷:

+**************************************************************************/

+ZOSS_THREAD_ID zOss_CreateThread(const CHAR *thread_name, VOID (*entry)(SINT32),

+                                 SINT32 arg, UINT32 stack_size, UINT32 priority, UINT32 preempt, UINT32 auto_start)

+{

+    PROCESS                 Process_ID  = 0;

+    enum PROCESS_TYPE       ProcessType = OS_PRI_PROC;

+    OSTIME                  timeslice   = 0;

+    UINT32                  iIndex      = 0;

+    T_ZOsa_ThreadUserArea   *ua         = NULL;

+

+    zOss_AssertEx(NULL != thread_name && 

+                  NULL != entry && 

+                  0 < stack_size && 

+                  priority <= OSA_LOWESTPRIORITY, 

+                  (ZOSS_THREAD_ID)ZOSS_INVALID_THREAD_ID);

+

+    if (strlen((char *)thread_name) > MAX_THREADNAME_LEN)

+    {

+        return(ZOSS_THREAD_ID)ZOSS_INVALID_THREAD_ID;

+    }

+

+    if (0 == preempt)/* ²»ÔÊÐíÇÀÕ¼ */

+    {

+        timeslice = 0;

+    }

+    else

+    {

+        timeslice = OSA_TIMESLICE;

+    }

+

+    Process_ID = create_process(ProcessType, (char *)thread_name, Osa_OseThreadEntry,

+                                (OSADDRESS)stack_size, (OSPRIORITY)priority, (OSTIME)timeslice,

+                                (PROCESS) 0, (struct OS_redir_entry *) NULL, (OSVECTOR) 0, (OSUSER) 0);

+

+    /* ʹÓÃset_envp()½øÐвÎÊý´«µÝ */

+    if (!set_envp((PROCESS)Process_ID, OSA_THREADFUN, (OSADDRESS)entry))

+    {

+        kill_proc(Process_ID);

+        return(ZOSS_THREAD_ID)ZOSS_INVALID_THREAD_ID;

+    }

+

+    if (!set_envp((PROCESS)Process_ID, OSA_THREADARG, (OSADDRESS)arg))

+    {

+        kill_proc(Process_ID);

+        return(ZOSS_THREAD_ID)ZOSS_INVALID_THREAD_ID;

+    }

+

+    if (!set_envp((PROCESS)Process_ID, OSA_THREADPREEMPT, (OSADDRESS)preempt))

+    {

+        kill_proc(Process_ID);

+        return(ZOSS_THREAD_ID)ZOSS_INVALID_THREAD_ID;

+    }

+

+    iIndex = OSA_PID_TO_INDEX(Process_ID);

+

+    if (!gOsa_SwapFlag)/* ûÓдò¿ªÏß³ÌÇл»hook */

+    {

+        /* µ÷ÓÃÆ½Ì¨º¯ÊýÍ˳öÏß³ÌÔòÓû§¿Õ¼äÒÑÊÍ·Å£¬ÖØÐÂÉêÇëÓû§¿Õ¼ä*/

+        if (NULL == gp_OsaThreadUserArea[iIndex])

+        {

+            ua = (T_ZOsa_ThreadUserArea *)zOss_Malloc(sizeof(T_ZOsa_ThreadUserArea));

+            zOss_AssertEx(ua != NULL, (ZOSS_THREAD_ID)ZOSS_INVALID_THREAD_ID);

+            gp_OsaThreadUserArea[iIndex] = ua;

+        }

+        else

+        {

+            /* µ÷ÓÃ·ÇÆ½Ì¨º¯ÊýÍ˳öÏß³ÌÔòÓû§¿Õ¼äδÊÍ·Å£¬Ö±½ÓʹÓÃ*/

+            ua = gp_OsaThreadUserArea[iIndex];

+        }        

+        zOss_Memset(gp_OsaThreadUserArea[iIndex], 0, sizeof(T_ZOsa_ThreadUserArea));

+    }

+    else

+    {

+        ua = gp_OsaThreadUserArea[iIndex];

+    }

+    zOss_AssertEx(ua != NULL, (ZOSS_THREAD_ID)ZOSS_INVALID_THREAD_ID);

+    /* ¸üÐÂÏß³ÌÓû§¿Õ¼ä²¿·ÖÐÅÏ¢,ÆäËûÐÅÏ¢ÔÚOsa_GetThreadUserAreaÄÚ¸üР*/

+    ua->threadid    = (ZOSS_THREAD_ID)Process_ID;

+    ua->topstack    = 0;    /* Osa_GetThreadUserAreaʹÓøÃÖµ½øÐжԲ»±äÁ¿½øÐиüР   */

+    ua->heapsize    = 0;

+    ua->ubsize      = 0;

+    ua->ptrf        = 0;

+    ua->curtaskid   = 0;

+    ua->sleepsem    = NULL;

+

+    if (auto_start != 0)

+    {

+        start(Process_ID);

+    }

+

+    return(ZOSS_THREAD_ID)Process_ID;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_ExitThread

+* ¹¦ÄÜÃèÊö: Í˳öµ±Ç°Ïß³Ì

+* ²ÎÊý˵Ã÷:

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID zOss_ExitThread(VOID)

+{

+    T_ZOsa_ThreadUserArea   *ua         = NULL;

+    PROCESS                 thread_id   = current_process();

+    UINT32                  iIndex      = OSA_PID_TO_INDEX(thread_id);

+

+    ua                           = gp_OsaThreadUserArea[iIndex];

+    gp_OsaThreadUserArea[iIndex] = NULL;

+

+    /* ½â¾öose 78MÖ÷ƵÏÂÍ˳öÏ̵߳¼ÖµÄGP0ËÀ»úÎÊÌâ */

+#ifdef _USE_PSM

+    zOss_PsmAdjustFreq312M();

+#endif

+

+    if (!gOsa_SwapFlag && ua)

+    {

+        if (ua->curpath)

+        {

+            zOss_Free(ua->curpath);/*ɾ³ýÏ̵߳±Ç°Â·¾¶¿Õ¼ä*/

+        }

+

+        zOss_Free(ua);   /*ɾ³ýÏß³ÌÓû§¿Õ¼ä*/

+    }

+

+    kill_proc(thread_id);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SuspendThread

+* ¹¦ÄÜÃèÊö: Ïß³ÌÐü¹Ò

+* ²ÎÊý˵Ã÷: (IN)  thread_id:Ïß³ÌIDºÅ;

+* ·µ »Ø Öµ: ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_SuspendThread(ZOSS_THREAD_ID thread_id)

+{

+    UINT32          status = ZOSS_ERROR;

+    struct OS_pcb   *pPcb  = NULL;

+

+    zOss_AssertEx(NULL != thread_id, ZOSS_ERROR);

+

+    pPcb = get_pcb((PROCESS)thread_id);

+

+    if (NULL != pPcb && OS_ILLEGAL != pPcb->type && OS_ZOOMBIE != pPcb->type)   /* ÓÐЧµÄÏß³ÌID */

+    {

+        stop((PROCESS)thread_id);

+        status = ZOSS_SUCCESS;

+    }

+    else/* ÎÞЧµÄÏß³ÌID */

+    {

+        status = ZOSS_ERROR;

+    }

+

+    if (NULL != pPcb)/* Êͷſռä */

+    {

+        free_buf( (union SIGNAL **) &pPcb);

+    }

+

+    return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  zOss_ResumeThread

+* ¹¦ÄÜÃèÊö:  Ïָ̻߳´£¬Ê¹Ï̴߳Ó×èÈû̬תµ½¾ÍÐ÷״̬

+* ²ÎÊý˵Ã÷:  (IN) thread_id:Ïß³ÌIDºÅ;

+* ·µ »Ø Öµ:  ZOSS_SUCCESS:³É¹¦;ZOSS_ERROR:ʧ°Ü

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32  zOss_ResumeThread(ZOSS_THREAD_ID thread_id)

+{

+    struct OS_pcb   *pPcb   = NULL;

+    UINT32          status  = ZOSS_ERROR;

+

+    zOss_AssertEx(NULL != thread_id, ZOSS_ERROR);

+

+    pPcb = get_pcb( (PROCESS)thread_id);

+

+    if (NULL != pPcb && OS_ILLEGAL != pPcb->type && OS_ZOOMBIE != pPcb->type)   /* ÓÐЧµÄÏß³ÌID */

+    {

+        start((PROCESS)thread_id);

+        status = ZOSS_SUCCESS;

+    }

+    else

+    {

+        status = ZOSS_ERROR;

+    }

+

+    if (NULL != pPcb)/* Êͷſռä */

+    {

+        free_buf( (union SIGNAL **) &pPcb);

+    }

+

+    return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_Sleep

+* ¹¦ÄÜÃèÊö: ʹÏß³Ì˯ÃßÒ»¶Îʱ¼ä

+* ²ÎÊý˵Ã÷: (IN) time_in_ms: Ïß³Ì˯Ãßʱ¼ä,µ¥Î»ÎªºÁÃë

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID zOss_Sleep(UINT32 time_in_ms)

+{

+    if (!Osa_GetTimerInitStatus())

+    {

+        delay((OSTIME)time_in_ms);

+    }

+    else

+    {

+        zOss_PsmSleep(time_in_ms);

+    }   

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_DeleteThread

+* ¹¦ÄÜÃèÊö: Ïß³Ìɾ³ý

+* ²ÎÊý˵Ã÷: (IN)    thread_id:Ïß³ÌIDºÅ

+* ·µ »Ø Öµ: ZOSS_SUCCESS:³É¹¦;ZOSS_ERROR:ʧ°Ü

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32  zOss_DeleteThread(ZOSS_THREAD_ID thread_id)

+{

+    UINT32 iIndex;

+    T_ZOsa_ThreadUserArea *ua = NULL;

+

+    zOss_AssertEx(NULL != thread_id, ZOSS_ERROR);

+

+    if (ZOSS_ERROR == zOss_IdVerify(thread_id))   /* ÎÞЧµÄÏß³ÌID */

+    {

+        return  ZOSS_ERROR;

+    }

+

+    iIndex                       = OSA_PID_TO_INDEX(thread_id);

+    ua                           = gp_OsaThreadUserArea[iIndex];

+    gp_OsaThreadUserArea[iIndex] = NULL;

+

+    if ((PROCESS)thread_id == current_process())/* ×Ôɱ */

+    {

+        if (!gOsa_SwapFlag && ua)

+        {

+            if (ua->curpath)

+            {

+                zOss_Free(ua->curpath);/* ɾ³ýÏ̵߳±Ç°Â·¾¶¿Õ¼ä */

+            }

+

+            zOss_Free(ua);   /* ɾ³ýÏß³ÌÓû§¿Õ¼ä */

+        }

+

+        kill_proc((PROCESS)thread_id);

+    }

+    else

+    {

+        kill_proc((PROCESS)thread_id);

+

+        if (!gOsa_SwapFlag && ua)

+        {

+            if (ua->curpath)

+            {

+                zOss_Free(ua->curpath);/* ɾ³ýÏ̵߳±Ç°Â·¾¶¿Õ¼ä */

+            }

+

+            if (ua->sleepTimerId)

+            {

+                zOss_KillTimer(ua->sleepTimerId);

+            }

+

+            zOss_Free(ua);   /* ɾ³ýÏß³ÌÓû§¿Õ¼ä */

+        }

+    }

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_GetCurThreadID

+* ¹¦ÄÜÃèÊö: »ñÈ¡µ±Ç°Ï̵߳ÄIDºÅ

+* ²ÎÊý˵Ã÷:

+* ·µ »Ø Öµ: ³É¹¦:µ±Ç°Ï̵߳ÄIDºÅ;ʧ°Ü:ZOSS_INVALID_THREAD_ID

+* ÆäËü˵Ã÷:

+**************************************************************************/

+ZOSS_THREAD_ID zOss_GetCurThreadID(VOID)

+{

+    return (ZOSS_THREAD_ID)current_process();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_GetThreadIDByName

+* ¹¦ÄÜÃèÊö: ¸ù¾ÝÏß³ÌÃû»ñÈ¡Ïß³ÌIDºÅ

+* ²ÎÊý˵Ã÷: (IN)        thread_name:Ïß³ÌÃû

+* ·µ »Ø Öµ: ³É¹¦:µ±Ç°Ï̵߳ÄIDºÅ;ʧ°Ü:ZOSS_INVALID_THREAD_ID;

+* ÆäËü˵Ã÷:

+**************************************************************************/

+ZOSS_THREAD_ID zOss_GetThreadIDByName (const CHAR *thread_name)

+{

+    PROCESS     thread_id   = 0;

+    OSBOOLEAN   status      = hunt((char *)thread_name, 0, &thread_id, NULL);/* Á¢¼´·µ»Ø */

+

+    if (status)/* »ñÈ¡³É¹¦ */

+    {

+        return(ZOSS_THREAD_ID)thread_id;

+    }

+    else

+    {

+        return ZOSS_INVALID_THREAD_ID;

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³Ìid£¬»ñÈ¡¸ÃÏ̵߳ÄÏß³ÌÃû³Æ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:      ´ý»ñÈ¡Ïß³ÌÃû³ÆµÄÏß³Ìid

+*   (´«³ö²ÎÊý)  thread_name:    Ïß³ÌÃû³Æ´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØÏß³ÌÃû³ÆÖ¸Õ룻·ñÔòϵͳ¶ÏÑÔ»ò·µ»Ø¿ÕÖ¸Õë

+* ÆäËü˵Ã÷:     OSE²Ù×÷ϵͳÖУ¬µ÷ÓÃget_pcb½Ó¿Ú»ñÈ¡Ïß³ÌÐÅÏ¢ºó£¬ÐèÒª½«Ïß³ÌÃû

+                ³Æ´ÓÏûÏ¢Öп½±´µ½Óû§ÌṩµÄÏß³ÌÃû³Æ´æ·ÅµØÖ·£¬È»ºóÔÙÊͷŸÃÏû

+                Ï¢£¬ËùÒÔthread_name²ÎÊý±ØÐëΪ·Ç¿ÕÖ¸Õ룬¶øº¯ÊýµÄ·µ»ØÖµÊ¼ÖÕΪ

+                Óû§´«ÈëµÄthread_name²ÎÊý

+**************************************************************************/

+CHAR *zOss_GetThreadName(ZOSS_THREAD_ID thread_id, CHAR *thread_name)

+{

+    struct OS_pcb *pPcb = NULL;

+

+    zOss_AssertEx(NULL != thread_id, NULL);

+    zOss_AssertEx(NULL != thread_name, NULL);

+

+    pPcb = get_pcb((PROCESS)thread_id);

+    if(NULL == pPcb)

+    {

+        return NULL;

+    }

+

+    if(OS_ILLEGAL == pPcb->type || OS_ZOOMBIE == pPcb->type)

+    {

+        free_buf((union SIGNAL **)&pPcb);

+        return NULL;

+    }

+

+    strcpy((char *)thread_name, &pPcb->strings[pPcb->name]);

+    free_buf((union SIGNAL **)&pPcb);

+

+    return thread_name;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_GetThreadInfo

+* ¹¦ÄÜÃèÊö: ¸ù¾ÝÏß³ÌID»ñÈ¡Ïß³ÌÏêϸÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+                 thread_id:Ï̵߳ÄIDºÅ;

+            (OUT)

+                 thread_name:Ïß³ÌÃû,Óû§·ÖÅä×î´óÏß³ÌÃû¿Õ¼ä

+                 stat:Ï̵߳Ä״̬,²»Í¬µÄλ¾ßÓв»Í¬µÄÐÅÏ¢

+                 priority:0-31

+                 preempt:·Ç0ֵΪÇÀÕ¼,×ÜÊÇ·µ»Ø·Ç0Öµ

+* ·µ »Ø Öµ: ZOSS_SUCCESS:³É¹¦;ZOSS_ERROR:ʧ°Ü

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_GetThreadInfo(ZOSS_THREAD_ID thread_id, CHAR *thread_name, UINT32 *stat,

+                          UINT32 *priority, UINT32 *preempt)

+{

+    struct OS_pcb   *pPcb       = NULL;

+    char            *name       = NULL;

+    PROCESS         process_id  = (PROCESS)thread_id;

+    

+    zOss_AssertEx(NULL != thread_id, ZOSS_ERROR);

+    

+    pPcb = get_pcb(process_id);

+    if(NULL == pPcb)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    if(OS_ILLEGAL == pPcb->type || OS_ZOOMBIE == pPcb->type)

+    {

+        free_buf((union SIGNAL **)&pPcb);

+        return ZOSS_ERROR;

+    }

+    

+    /* ÓÐЧµÄÏß³ÌID */

+    if (NULL != thread_name)

+    {

+        name = &pPcb->strings[pPcb->name];/* pcbÖеÄnameÊÇÖ¸ÔÚpcbµÄstringsÖÐµÄÆ«ÒÆ */

+        strcpy((char *)thread_name, name);

+    }

+    

+    if (NULL != stat)

+    {

+        if (pPcb->status == 0) /* running or ready sets none bits */

+        {

+            if (process_id == current_process()) /* current is running */

+            {

+                *stat = ZOSS_OS_RUN;

+            }

+            else /* or ready */

+            {

+                *stat = ZOSS_OS_READY;

+            }

+        }

+        else

+        {

+            *stat = ZOSS_OS_BLOCK;

+        }

+    }

+    

+    if (NULL != priority)

+    {

+        *priority = (UINT32)(pPcb->priority);

+    }

+    

+    if (NULL != preempt)

+    {

+        *preempt = (UINT32)get_envp(process_id, OSA_THREADPREEMPT);

+    }

+    

+    free_buf((union SIGNAL **)&pPcb);

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetThreadPri

+* ¹¦ÄÜÃèÊö: ÉèÖÃÏß³ÌÓÅÏȼ¶

+* ²ÎÊý˵Ã÷: (IN)  thread_id:Ï̵߳ÄIDºÅ

+                  priority:Ïß³ÌÓÅÏȼ¶

+* ·µ »Ø Öµ: Èç¹ûÉèÖóɹ¦, ·µ»ØZOSS_SUCCESS; ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32  zOss_SetThreadPri(ZOSS_THREAD_ID thread_id, UINT32 priority)

+{

+    OSPRIORITY OldPrio  = 0;

+    OSPRIORITY Prio     = 0;

+

+    if (ZOSS_ERROR == zOss_IdVerify(thread_id))/* ÎÞЧµÄÏß³ÌID,zOss_IdVerify()ÄÚº¬ÓÐthread_id¶ÏÑÔ */

+    {

+        return  ZOSS_ERROR;

+    }

+

+    zOss_AssertEx(priority <= OSA_LOWESTPRIORITY, ZOSS_ERROR);

+

+    OldPrio = get_pri((PROCESS )thread_id);

+

+    if (OldPrio == (OSPRIORITY)priority)   /* оÉÏß³ÌÓÅÏȼ¶Ò»Ñù,ÎÞÐèÉèÖà */

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        Prio = set_pri_for((PROCESS)thread_id, (OSPRIORITY)priority);

+    }

+

+    if (Prio == OldPrio)   /* ÉèÖÃÏß³ÌÓÅÏȼ¶Ê§°Ü */

+    {

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        return ZOSS_SUCCESS;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  zOss_GetThreadPri

+* ¹¦ÄÜÃèÊö: »ñÈ¡Ïß³ÌÓÅÏȼ¶

+* ²ÎÊý˵Ã÷: (IN)    thread_id:Ï̵߳ÄIDºÅ

+                 (OUT)    priority:Ïß³ÌÓÅÏȼ¶

+* ·µ »Ø Öµ: Èç¹û»ñÈ¡³É¹¦, ·µ»ØZOSS_SUCCESS; ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_GetThreadPri(ZOSS_THREAD_ID thread_id, UINT32 *priority)

+{

+    OSPRIORITY  Prio    = 0;

+    UINT32      status  = zOss_IdVerify(thread_id);

+

+    /* ÎÞЧµÄÏß³ÌID,zOss_IdVerify()ÄÚº¬ÓÐthread_id¶ÏÑÔ */

+    zOss_AssertEx(NULL != priority && ZOSS_ERROR != status, ZOSS_ERROR);

+

+    Prio        = get_pri((PROCESS)thread_id);

+    *priority   = (UINT32)Prio ;

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÑéÖ¤Ò»¸öÏß³ÌÊÇ·ñÓÐЧ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ýÑéÖ¤µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÈôÏß³ÌÓÐЧ£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 zOss_IdentifyThread(ZOSS_THREAD_ID threadID)

+{

+    return zOss_IdVerify(threadID);

+}

+

+/*******************************************************************************

+* ¹¦ÄÜÃèÊö: »ñÈ¡Ïß³ÌÓû§Êý¾Ý¿Õ¼äµÄÖ¸Õë

+* ²ÎÊý˵Ã÷:     

+*           (´«Èë²ÎÊý)    thread_id:  ´ý»ñÈ¡Óû§Êý¾Ý¿Õ¼äÖ¸ÕëµÄÏß³Ìid

+*           (´«³ö²ÎÊý)    VOID

+* ·µ »Ø Öµ: Ï̵߳ÄÓû§Êý¾Ý¿Õ¼äµÄÖ¸Õë

+* ÆäËü˵Ã÷: VOID

+*******************************************************************************/

+T_ZOsa_ThreadUserArea *zOss_GetThreadUserArea(ZOSS_THREAD_ID thread_id)

+{

+    UINT32                  thread_index    = 0;

+    T_ZOsa_ThreadUserArea   *user_area      = NULL;

+

+    zOss_ASSERT(thread_id != NULL);

+    thread_index    = OSA_PID_TO_INDEX(thread_id);

+    user_area       = gp_OsaThreadUserArea[thread_index];

+    

+    return user_area;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SendMsg

+* ¹¦ÄÜÃèÊö: ·¢ËÍÏûÏ¢,Á㿽±´,´«Ë͵ÄÊÇÖ¸Õë

+* ²ÎÊý˵Ã÷: (IN)  thread_id:

+                  msg_ptr:zOss_GetUB()º¯Êý·µ»ØµÄÏûÏ¢µØÖ·Ö¸Õë

+                  size:´ý·¢ËÍÊý¾Ýʵ¼ÊËùÕ¼×Ö½ÚÊý

+                  timeout:µ±ÏûÏ¢¶ÓÁÐÂúʱ,µÈ´ýʱ¼ä.¸Ã²ÎÊý²» Ö§³Ö,

+                          ±»ºöÂÔ .º¯ÊýÁ¢¼´·µ»ØÇÒÄܱ£Ö¤ÕýÈ··¢ËÍÏûÏ¢

+* ·µ »Ø Öµ: ZOSS_SUCCESS:³É¹¦;ZOSS_ERROR:ʧ°Ü.

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_SendMsg(ZOSS_THREAD_ID thread_id, VOID *msg_ptr, UINT32 size, UINT32 timeout)

+{

+    T_OsaMsgSig* pmsgsig = NULL;

+

+    zOss_AssertEx(msg_ptr != NULL && thread_id != NULL, ZOSS_ERROR);

+

+    /* ½«·ÖÅäµÄsigalÖ¸Õëת»¯³É×Ô¶¨Òå±ê×¼signalÀàÐÍ,·ÖÅäʧ°ÜΪ²úÉú

+    OSEÒì³££¬ÕâÀïÎÞÐ迼ÂÇ */

+    pmsgsig             = (T_OsaMsgSig *)alloc(sizeof(T_OsaMsgSig), SIGNAL_MSG_NUMBER);

+    pmsgsig->msg_ptr    = msg_ptr;

+    pmsgsig->size       = size;/* ʵ¼ÊÏûÏ¢µÄ³¤¶È */

+    send((union SIGNAL **)&pmsgsig, (PROCESS)thread_id);

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_RecvMsg

+* ¹¦ÄÜÃèÊö: ½ÓÊÕ·¢Ë͸øµ÷ÓÃÏ̵߳ÄÏûÏ¢,Á㿽±´,½ÓÊÕµÄÊÇÖ¸Õë

+                Óû§´¦ÀíÍêºó,µ÷ÓÃzOss_RetUB()ÊÍ·Å

+* ²ÎÊý˵Ã÷: (IN)    msg_ptr:Ö¸Ïò´ý½ÓÊÕÏûÏ¢µÄÖ¸Õë

+                    size:´ý½ÓÊÕÊý¾ÝËùÕ¼×Ö½ÚÊý,¿ÉÒÔΪNULL

+                    timeout:µ±ÏûÏ¢¶ÓÁпÕʱ,µÈ´ýʱ¼ä.

+* ·µ »Ø Öµ: ZOSS_SUCCESS:³É¹¦;ZOSS_ERROR:ʧ°Ü.

+* ÆäËü˵Ã÷: ¿ÉÒÔÓÃÓÚÖжϺ¯Êý»ò¶¨Ê±Æ÷º¯ÊýÖÐ,´ËʱtimeoutĬÈÏΪZOSS_NO_WAIT,

+*           Ò²Ö»ÄÜÊÇOSS_NO_WAIT.Èç¹û²»ÊÇ,º¯ÊýÄÚ²¿»á¸ü¸ÄΪOSS_NO_WAIT.

+*           ´Ëʱ,¸Ãº¯ÊýÊÇ·Ç×èÈûʽµÄ.

+**************************************************************************/

+UINT32 zOss_RecvMsg(VOID **msg_ptr, UINT32 *size, UINT32  timeout)

+{

+    static const SIGSELECT  any_sig[]   = {0};

+    T_OsaMsgSig             *pmsgsig    = NULL;

+    UINT32                  status      = 0;

+

+    zOss_AssertEx(msg_ptr != NULL && size != NULL, ZOSS_ERROR);

+

+    if (ZOSS_WAIT_FOREVER == timeout)

+    {

+        pmsgsig = (T_OsaMsgSig *)receive(any_sig);

+

+        if (NIL != (union SIGNAL *)pmsgsig && pmsgsig->sig_no == SIGNAL_MSG_NUMBER)

+        {

+            *msg_ptr    = pmsgsig->msg_ptr;

+            *size       = pmsgsig->size;

+            free_buf((union SIGNAL **)&pmsgsig);

+            status      = ZOSS_SUCCESS;

+        }

+        else if (NIL != (union SIGNAL *)pmsgsig && pmsgsig->sig_no != SIGNAL_MSG_NUMBER)

+        {

+            free_buf((union SIGNAL **)&pmsgsig);

+            status = ZOSS_ERROR;

+        }

+        else

+        {

+            status = ZOSS_ERROR;

+        }

+    }

+    else

+    {

+        pmsgsig = (T_OsaMsgSig *)receive_w_tmo((OSTIME)timeout, any_sig);

+

+        if ((union SIGNAL *)pmsgsig != NIL && pmsgsig->sig_no == SIGNAL_MSG_NUMBER)

+        {

+            *msg_ptr    = pmsgsig->msg_ptr;

+            *size       = pmsgsig->size;

+            free_buf((union SIGNAL **)&pmsgsig);

+            status      = ZOSS_SUCCESS;

+        }

+        else if (NIL != (union SIGNAL *)pmsgsig && pmsgsig->sig_no != SIGNAL_MSG_NUMBER)

+        {

+            free_buf((union SIGNAL **)&pmsgsig);

+            status = ZOSS_ERROR;

+        }

+        else

+        {

+            status = ZOSS_ERROR;

+        }

+    }

+

+    return status;

+}

+

+VOID* zOss_ThreadGetMsgBuf( UINT32 size )

+{

+    T_THREAD_MSG_HEAD *p_msg_head = NULL;

+    

+    zOss_AssertEx( 0 != size, NULL );

+    

+    p_msg_head = (T_THREAD_MSG_HEAD *)alloc( THREAD_MSG_SIZE(size), SIGNAL_MSG_NUMBER );

+    zOss_AssertEx( p_msg_head != NULL, NULL );

+

+    p_msg_head->magic = THREAD_MSG_MAGIC;

+

+    return THREAD_MSG_BUF(p_msg_head);

+}

+

+VOID zOss_ThreadRetMsgBuf( VOID *p_buf )

+{

+    T_THREAD_MSG_HEAD *p_msg_head = NULL;

+    

+    zOss_AssertExN( p_buf != NULL );

+

+    p_msg_head = THREAD_MSG_HEAD( p_buf );

+

+    free_buf( (union SIGNAL **)&p_msg_head );

+}

+

+UINT32 zOss_ThreadSendMsg( UINT32 msg_id, VOID *p_buf, UINT16 buf_size, ZOSS_THREAD_ID thread_id )

+{

+    T_THREAD_MSG_HEAD   *p_msg_head = NULL;

+    UINT32              status      = OSA_IdentifyThread(thread_id);

+

+    zOss_AssertEx(  status == ZOSS_SUCCESS, ZOSS_ERROR );

+

+#ifdef _USE_THREADMSG_HOOK

+    if ( ZOSS_SETHOOKFLAG_INTER == proc_msg_hook(msg_id, p_buf, buf_size, thread_id) )

+    {

+        if ( NULL != p_buf )

+        {

+            zOss_ThreadRetMsgBuf( p_buf );

+        }

+        return ZOSS_SUCCESS;

+    }

+#endif

+

+    if ( (NULL == p_buf) || (0 == buf_size) )

+    {

+        buf_size = 0;   /* make sure the bufer size is zero */

+

+        /* for emtpy message, buffer should be alloced by ourself */

+        p_msg_head          = (T_THREAD_MSG_HEAD *)alloc( THREAD_MSG_SIZE(0), SIGNAL_MSG_NUMBER );

+        zOss_AssertEx( p_msg_head != NULL, ZOSS_ERROR );

+        p_msg_head->magic   = THREAD_MSG_MAGIC;

+    }

+    else

+    {

+        p_msg_head = THREAD_MSG_HEAD( p_buf );

+        zOss_AssertEx( THREAD_MSG_MAGIC == p_msg_head->magic, ZOSS_ERROR );

+    }

+    p_msg_head->id       = msg_id;

+    p_msg_head->buf_size = buf_size;

+

+    send( (union SIGNAL **)&p_msg_head, (PROCESS)thread_id );

+

+    return ZOSS_SUCCESS;

+}

+

+UINT32 zOss_ThreadRecvMsg( UINT32 *p_msg_id, VOID **p_buf, UINT32 *p_buf_size, UINT32 timeout )

+{

+    T_THREAD_MSG_HEAD       *p_msg_head = NULL;

+    static const SIGSELECT  any_sig[]   = { 0 };

+

+    zOss_AssertEx( (p_msg_id != NULL) && (p_buf != NULL) && (p_buf_size != NULL), ZOSS_ERROR );

+

+    if ( ZOSS_WAIT_FOREVER == timeout )

+    {

+        p_msg_head = (T_THREAD_MSG_HEAD *)receive( any_sig );

+    }

+    else

+    {

+        p_msg_head = (T_THREAD_MSG_HEAD *)receive_w_tmo( (OSTIME)timeout, any_sig );

+    }

+    zOss_AssertEx( THREAD_MSG_MAGIC == p_msg_head->magic, ZOSS_ERROR );

+

+    *p_msg_id   = p_msg_head->id;

+    *p_buf_size = p_msg_head->buf_size;

+    if ( 0 == p_msg_head->buf_size )

+    {

+        *p_buf  = NULL;

+        /* for empty message, buffer is alloced by ourself */

+        free_buf( (union SIGNAL **)&p_msg_head );

+    }

+    else

+    {

+        *p_buf  = THREAD_MSG_BUF( p_msg_head );

+    }

+

+    return ZOSS_SUCCESS;

+}

+

+UINT32 zOss_RegThreadMsgHook( ZOSS_THREAD_ID thread_id, UINT8 type, UINT8 dire, THREAD_MSG_HOOK func )

+{

+    THREAD_MSG_HOOK_CONTENT *p_content  = NULL;

+    UINT32                  status      = OSA_IdentifyThread(thread_id);

+    zOss_AssertEx( ((ZOSS_SUCCESS == status)&& 

+                    (THREAD_MSG_HOOK_TYPE_MAX >= type) && 

+                    (THREAD_MSG_HOOK_DIRE_MAX >= dire) && 

+                    (NULL != func)), 

+                    ZOSS_ERROR );

+    

+    p_content = find_thread_content( thread_id );

+    if ( NULL == p_content )

+    {

+        p_content = (THREAD_MSG_HOOK_CONTENT *)zOss_Malloc( sizeof(THREAD_MSG_HOOK_CONTENT) );

+        zOss_Memset( p_content, 0, sizeof(THREAD_MSG_HOOK_CONTENT) );

+        p_content->thread_id = thread_id;

+        zOss_ListAdd( &s_thread_msg_hook_list, (T_ZOss_Node *)p_content );

+    }

+

+    p_content->dire[type - 1] = dire;

+    p_content->func[type - 1] = func;

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_CreateSemaphore

+* ¹¦ÄÜÃèÊö: ´´½¨ÐźÅÁ¿

+* ²ÎÊý˵Ã÷: (IN)   name_ptr:ÐźÅÁ¿Ãû³Æ,´Ë´¦±»ºöÂÔ,¿ÉÒÔÉèÖóÉNULL

+                   initial_count:ÐźÅÁ¿µÄ³õʼ״̬, ±ØÐëΪ·Ç¸ºÊý,ͨ³£Îª0»ò1;

+* ·µ »Ø Öµ: ³É¹¦:ÐźÅÁ¿ID;ʧ°Ü:ZOSS_NULL

+* ÆäËü˵Ã÷:

+**************************************************************************/

+ZOSS_SEMAPHORE_ID zOss_CreateSemaphore(const CHAR *name_ptr, UINT32 initial_count)

+{

+    if (name_ptr)

+    {

+        name_ptr = name_ptr;

+    }

+

+    return (ZOSS_SEMAPHORE_ID)create_sem((OSSEMVAL) initial_count);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_GetSemaphore

+* ¹¦ÄÜÃèÊö: »ñÈ¡ÐźÅÁ¿

+* ²ÎÊý˵Ã÷: (IN)   sem_id:ÐźÅÁ¿ID

+                   timeout:µÈ´ýÊôÐÔ,ΪZOSS_WAIT_FOREVER,OSS_NO_WAIT.

+                   timeoutʱ¼ä²»Ö§³ÖÓëZOSS_NO_WAITͬÑù¶Ô´ý

+* ·µ »Ø Öµ: Èç¹û»ñÈ¡³É¹¦, ·µ»ØZOSS_SUCCESS; ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_GetSemaphore(ZOSS_SEMAPHORE_ID sem_id,  UINT32 timeout)

+{

+    OSPRIORITY  OldPri = 0;

+    SINT32      count  = 0;

+

+    zOss_AssertEx(sem_id != NULL, ZOSS_ERROR);

+    OldPri = get_pri(current_process());

+

+    if ((ZOSS_WAIT_FOREVER == timeout) || (0 > (SINT32)timeout))   /* Ò»Ö±µÈ´ý */        

+    {

+        wait_sem((SEMAPHORE *)sem_id);

+        return ZOSS_SUCCESS;

+    }

+    else if (ZOSS_NO_WAIT == timeout)

+    {

+        set_pri(0);   /* ÁÙʱ°Ñ½ø³ÌÓÅÏȼ¶µ÷µ½×î¸ß,·ÀÖ¹½ø³ÌÇл» */

+

+        if (get_sem((SEMAPHORE *)sem_id) > 0)

+        {

+            wait_sem((SEMAPHORE *)sem_id);

+            set_pri(OldPri);                           /* µ÷»ØÔ­À´µÄ½ø³ÌÓÅÏȼ¶ */

+            return ZOSS_SUCCESS;

+        }

+        else

+        {

+            set_pri(OldPri);                           /* µ÷»ØÔ­À´µÄ½ø³ÌÓÅÏȼ¶ */

+            return ZOSS_ERROR;

+        }

+    }

+    else

+    {

+        count = (SINT32)timeout;

+

+        while (count > 0)

+        {

+            if (get_sem((SEMAPHORE *)sem_id) > 0)

+            {

+                wait_sem((SEMAPHORE *)sem_id);

+                return ZOSS_SUCCESS;

+            }

+

+            delay(OSA_TIMEOUT_INTERVAL);

+            count -= OSA_TIMEOUT_INTERVAL;

+        }

+

+        return ZOSS_ERROR;

+    }

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_PutSemaphore

+* ¹¦ÄÜÃèÊö: ÊÍ·ÅÐźÅÁ¿

+* ²ÎÊý˵Ã÷: (IN)   sem_id:ÐźÅÁ¿ID

+* ·µ »Ø Öµ: ³É¹¦:ZOSS_SUCCESS; ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_PutSemaphore(ZOSS_SEMAPHORE_ID sem_id)

+{

+    zOss_AssertEx(sem_id != NULL, ZOSS_ERROR);

+

+    signal_sem((SEMAPHORE *)sem_id);

+    return(UINT32)ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_GetSemaphoreCount

+* ¹¦ÄÜÃèÊö: »ñÈ¡ÐźÅÁ¿¼ÆÊýÖµ

+* ²ÎÊý˵Ã÷: (IN)   sem_id:ÐźÅÁ¿ID

+* ·µ »Ø Öµ: ³É¹¦, ·µ»Øµ±Ç°¼ÆÊýÖµ; ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷: Èç¹û´«ÈëÎÞЧµÄsem_id,¿ÉÄÜ»áÔì³ÉϵͳÒì³£

+**************************************************************************/

+UINT32 zOss_GetSemaphoreCount(ZOSS_SEMAPHORE_ID sem_id)

+{

+    OSSEMVAL result = 0;

+    

+    zOss_AssertEx(sem_id != NULL, ZOSS_ERROR);

+

+    result = get_sem((SEMAPHORE *) sem_id);

+    result = result < 0 ? 0 : result;/* oseÐźÅÁ¿¼ÆÊý¿ÉΪ¸ºÖµ£¬ÓëÆäËû²Ù×÷ϵͳ²»Ò»Ö */

+    return(UINT32)result;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSS_DeleteSemaphore

+* ¹¦ÄÜÃèÊö: ɾ³ýÐźÅÁ¿

+* ²ÎÊý˵Ã÷: (IN)        sem_id:ÐźÅÁ¿ID

+* ·µ »Ø Öµ: ³É¹¦:OSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷: ²»ÄÜɾ³ý¾²Ì¬ÐźÅÁ¿

+**************************************************************************/

+UINT32 zOss_DeleteSemaphore(ZOSS_SEMAPHORE_ID sem_id)

+{

+    zOss_AssertEx(sem_id != NULL, ZOSS_ERROR);

+

+    if (0 <= get_sem((SEMAPHORE *)sem_id))   /* ÐźÅûÓб»Ê¹ÓÃ,¿ÉÒÔ°²È«É¾³ý */

+    {

+        kill_sem((SEMAPHORE *)sem_id);

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_CreateMutex

+* ¹¦ÄÜÃèÊö: ´´½¨»¥³âÌå

+* ²ÎÊý˵Ã÷: (IN)name_ptr:»¥³âÌåÃû³ÆÖ¸Õë,´Ë´¦±»ºöÂÔ,¿ÉÒÔÉèÖóÉNULL.

+                priority_inherit:ZOSS_INHERIT,°´ÓÅÏȼ¶»ñÈ¡;

+                                 ZOSS_NO_INHERIT,°´Ë³Ðò»ñÈ¡.

+* ·µ »Ø Öµ: Èç¹û´´½¨³É¹¦,·µ»Ø»¥³âÐźÅÁ¿Ö¸Õë;·ñÔò,·µ»ØZOSS_NULL

+* ÆäËü˵Ã÷: default:ZOSS_NO_INHERIT

+**************************************************************************/

+ZOSS_MUTEX_ID zOss_CreateMutex(const CHAR *name_ptr, UINT32 priority_inherit)

+{

+    MUTEX       *mutex_id   = NULL;

+    OSADDRESS   attr        = 0;

+

+    if (name_ptr)

+    {

+        name_ptr = name_ptr;

+    }

+

+    mutex_id = (MUTEX *)malloc(sizeof(MUTEX)); /* ƽ̨²à·â×°µÄmem_mallocÖлáÓÐÒÀÀµÓÚ»¥³âÌå´´½¨µÄ

+                                                   ²Ù×÷£¬Èç¹ûÐ޸ĻáÔì³ÉÑ­»·ÒÀÀµ */

+

+    if (NULL == mutex_id)   /* ûÓÐ×ã¹»µÄ¿Õ¼ä */

+    {

+        return(ZOSS_MUTEX_ID)NULL;

+    }

+

+    if (ZOSS_NO_INHERIT == priority_inherit)

+    {

+        attr =  OSE_MUTEX_RECURSIVE;    /* ͬһ¸öÏ߳̿ÉÒÔ¶à´Îµ÷ÓÃOSS_GetMutex() */

+    }

+    else/*ZOSS_INHERIT*/

+    {

+        /* °´ÓÅÏȼ¶»ñÈ¡»¥³âÌå,ͬһ¸öÏ߳̿ÉÒÔ¶à´Îµ÷ÓÃzOss_GetMutex() */

+        attr = OSE_MUTEX_PRIO_INHERIT | OSE_MUTEX_RECURSIVE;

+    }

+

+    ose_mutex_init(mutex_id, attr);

+

+    return(ZOSS_MUTEX_ID)mutex_id;

+

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  zOss_GetMutex

+* ¹¦ÄÜÃèÊö: »ñÈ¡»¥³âÌå

+* ²ÎÊý˵Ã÷: (IN) mutex_id:»¥³âÌåIDºÅ

+                 timeout:ZOSS_WAIT_FOREVER,Ò»Ö±µÈ´ý

+                         ZOSS_NO_WAIT,Á¢¼´·µ»Ø

+                         ÆäËû:µÈ´ý³¬Ê±Ê±¼ä,µ¥Î»ms,

+                                 ÓëZOSS_NO_WAITͬÑù¶Ô´ý.

+* ·µ »Ø Öµ: ZOSS_SUCCESS:»ñÈ¡³É¹¦;ZOSS_ERROR:»ñȡʧ°Ü.

+* ÆäËü˵Ã÷: ͬһ¸öÏ߳̿ÉÒÔ¶à´Îµ÷ÓÃzOss_GetMutex(),µ«±ØÐëÓë

+            zOss_PutMutex()³É¶ÔʹÓÃ

+**************************************************************************/

+UINT32 zOss_GetMutex( ZOSS_MUTEX_ID mutex_id,  UINT32 timeout)

+{

+    zOss_AssertEx(mutex_id != NULL, ZOSS_ERROR);

+

+    if ((ZOSS_WAIT_FOREVER == timeout) || (0 > (SINT32)timeout))   /* Ò»Ö±µÈ´ý */

+    {

+        ose_mutex_lock((MUTEX *)mutex_id);

+        return ZOSS_SUCCESS;

+    }

+    else if (ZOSS_NO_WAIT == timeout)

+    {

+        if (ose_mutex_trylock((MUTEX *)mutex_id) != 0 )

+        {

+            return ZOSS_SUCCESS;

+        }

+    }

+    else/* ³¬Ê± */

+    {

+        UINT32 count   = timeout;

+

+        while (count > 0)

+        {

+            if (ose_mutex_trylock((MUTEX *)mutex_id) != 0 )

+            {

+                return ZOSS_SUCCESS;

+            }

+            delay(OSA_TIMEOUT_INTERVAL);

+            count -= OSA_TIMEOUT_INTERVAL;

+        }

+    }

+

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_PutMutex

+* ¹¦ÄÜÃèÊö: ÊÍ·Å»¥³âÐźÅÁ¿.±ØÐëºÍ»ñÈ¡»¥³âÐźÅÁ¿

+*           zOss_GetMutex()³É¶ÔʹÓÃ,ͬһ¸öÏ߳̿ÉÒÔ¶à´Îµ÷Óøú¯Êý.

+* ²ÎÊý˵Ã÷: (IN)    mutex_id:»¥³âÌåIDºÅ

+* ·µ »Ø Öµ: ZOSS_SUCCESS:Êͷųɹ¦;ZOSS_ERROR:ÊÍ·Åʧ°Ü.

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_PutMutex(ZOSS_MUTEX_ID mutex_id)

+{

+    zOss_AssertEx(mutex_id != NULL, ZOSS_ERROR);

+

+    ose_mutex_unlock((MUTEX *)mutex_id);/* ÎÞЧµÄmutex_id»á²úÉúOSEÒì³£ */

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_DeleteMutex

+* ¹¦ÄÜÃèÊö: ɾ³ý»¥³âÌå

+* ²ÎÊý˵Ã÷: (IN)    mutex_id:»¥³âÌåIDºÅ

+* ·µ »Ø Öµ: ZOSS_SUCCESS:ɾ³ý³É¹¦;ZOSS_ERROR:ɾ³ýʧ°Ü.

+* ÆäËü˵Ã÷: ɾ³ýÒ»¸öÕýÔÚʹÓõĻ¥³âÌ彫»áÔì³Éϵͳ´íÎó

+**************************************************************************/

+UINT32 zOss_DeleteMutex(ZOSS_MUTEX_ID mutex_id)

+{

+    zOss_AssertEx(mutex_id != NULL, ZOSS_ERROR);

+

+    ose_mutex_destroy((MUTEX *)mutex_id);   /* ÎÞЧµÄmutex_id»á²úÉúOSEÒì³£  */

+    free(mutex_id);                         /* ÊÍ·ÅÄÚ´æ                     */

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_GetTickCount

+* ¹¦ÄÜÃèÊö: »ñµÃϵͳ¼Óµçºóµ½µ±Ç°µÄtickÊý,tickµ¥Î»ÓɲÙ×÷ϵͳÅäÖã¬ÀýÈçÈôÔÚOSE

+            ²Ù×÷ϵͳÖÐÓÐÈçÏÂÅäÖã¬krn/system_timer= 1 ¼´±íʾ 1 tick = 1 ms

+* ²ÎÊý˵Ã÷:

+* ·µ »Ø Öµ: tickÊý

+* ÆäËü˵Ã÷:  

+**************************************************************************/

+UINT32 zOss_GetTickCount(VOID)

+{

+#ifdef _USE_PSM

+# ifdef _USE_PSM_NEW_FRAMEWORK

+    return (UINT32)(get_ticks() + zOss_CompensateTicks());

+# else

+    return (UINT32)(get_ticks() + zOss_GetSleepTimeForTicks());

+# endif

+#else

+    return (UINT32)(get_ticks());

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: Osa_GetThreadUserArea

+* ¹¦ÄÜÃèÊö: ÏÔʾÏß³ÌÏêϸÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+                thread_id:Ïß³ÌID

+* ·µ »Ø Öµ: ³É¹¦:Ïß³ÌÓû§¿Õ¼äÖ¸Õë;ʧ°Ü:¿Õ

+* ÆäËü˵Ã÷: ÔÚÏß³ÌÇл»hookº¯ÊýÖУ¬bupdateÖ»ÄÜΪFALSE,Ïß³ÌID²»½ø

+*           ÐÐÓÐЧÐÔÅжÏ

+**************************************************************************/

+T_ZOsa_ThreadUserArea *Osa_GetThreadUserArea(ZOSS_THREAD_ID thread_id, BOOL bupdate)

+{

+    struct OS_pcb           *pPcb       = NULL;

+    T_ZOsa_ThreadUserArea   *ua         = NULL;

+    UINT32                  iIndex      = 0;

+    UINT32                  *pbot       = NULL;

+    UINT32                  *ptop       = NULL;

+    ZOSS_THREAD_ID          cur_id      = NULL;

+

+    zOss_AssertEx(thread_id != NULL, NULL);

+

+    iIndex = OSA_PID_TO_INDEX(thread_id);

+

+    if (!bupdate)

+    {

+        if (iIndex < gOse_maxthreads && gp_OsaThreadUserArea[iIndex] != NULL && gp_OsaThreadUserArea[iIndex]->threadid == thread_id)

+        {

+            return gp_OsaThreadUserArea[iIndex];

+        }

+        else

+        {

+            return NULL;/* ÎÞЧÏß³ÌID */

+        }

+    }

+

+    pPcb = get_pcb((PROCESS)thread_id);

+

+    if (pPcb == NULL || OS_ILLEGAL == pPcb->type || OS_ZOOMBIE == pPcb->type)   /* ÎÞЧµÄÏß³ÌID */

+    {

+        return NULL;

+    }

+

+    if (!gp_OsaThreadUserArea[iIndex])/* ·ÇzOss_CreateThread´´½¨Ïß³Ì */

+    {

+        ua = (T_ZOsa_ThreadUserArea *)zOss_Malloc(sizeof(T_ZOsa_ThreadUserArea));

+        zOss_AssertEx(ua != NULL, NULL);

+        zOss_Memset(ua, 0, sizeof(T_ZOsa_ThreadUserArea));

+        ua->threadid = thread_id;

+        gp_OsaThreadUserArea[iIndex] = ua;

+    }

+    else

+    {

+         ua = gp_OsaThreadUserArea[iIndex];

+    }

+

+    cur_id          = zOss_GetCurThreadID();

+    ua->priority    = (UINT8)(pPcb->priority);

+

+    if (ua->topstack == 0)

+    {

+        /* pcbÖеÄnameÊÇÖ¸ÔÚpcbµÄstringsÖÐµÄÆ«ÒÆ */

+        strncpy((char *)ua->threadname, &pPcb->strings[pPcb->name], 16);

+        ua->threadname[15]  = 0;

+        ua->topstack        = pPcb->stack_limit;    /* Õ»µÍµØÖ·,TRACE32±£³ÖÒ»Ö */

+        ua->stacksize       = (pPcb->stack_top - pPcb->stack_limit) + 1;

+        ua->threadid        = thread_id;

+        ua->heapsize        = 0xFFFFFFFF;           /* mallocͳ¼ÆÎ´ÊµÏÖ         */

+    }

+

+    ua->msgnum = pPcb->sig_cnt_in_q;

+    if (ua->runtime > 0)

+    {

+        ua->RunTimeInMs = ua->runtime / 1000;   /* runtimeµ¥Î»:΢Ãë */

+//        ua->RunTimeInMs = (UINT32)((FLOAT)ua->runtime / (gOsa_SysCpuFreq / 1000));

+    }

+

+    /* ¼ÆËã¶ÑÕ»×î´óʹÓÃÂÊ */

+    pbot = (UINT32 *)pPcb->stack_limit;

+    ptop = (UINT32 *)pPcb->stack_top + 1;

+

+    while (pbot < ptop && *pbot == 0xEEEEEEEE)

+    {

+        pbot++;

+    }

+

+    if (pbot < ptop)

+    {

+        ua->maxstack = (UINT8)(((UINT32)ptop - (UINT32)pbot) * 100 / ua->stacksize);

+    }

+    else/* ¶ÑÕ»´ÓδʹÓà */

+    {

+        ua->maxstack = 0;

+    }

+

+    switch (pPcb->status)

+    {

+    case 0:

+        if (thread_id == cur_id)

+        {

+            ua->runstatus = ZOSS_OS_RUN;

+        }

+        else

+        {

+            ua->runstatus = ZOSS_OS_READY;

+        }

+        

+        break;

+    default:/*OS_RECEIVE,OS_DELAY,OS_SEMAPHORE,OS_FSEMAPHORE,OS_REMOTE,OS_STOPPED and OS_INTERCEPTED */

+        ua->runstatus = ZOSS_OS_BLOCK;

+        break;

+    }

+

+    free_buf( (union SIGNAL **) &pPcb);

+    return ua;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: Osa_GetAllThreadId

+* ¹¦ÄÜÃèÊö: »ñÈ¡ËùÓÐÏß³ÌID

+* ²ÎÊý˵Ã÷: (IN)

+            (OUT)

+                  threadarray:Ïß³ÌIDÊý×éÖ¸Õë

+* ·µ »Ø Öµ: Ïß³ÌÊý

+* ÆäËü˵Ã÷: ·µ»ØÏß³ÌÊý²»Îª0ʱ,´«³öµÄÊý×é¿Õ¼äÓÉÓû§ÊÍ·Å

+**************************************************************************/

+UINT32 Osa_GetAllThreadId(ZOSS_THREAD_ID *threadarray[])

+{

+    struct OS_pid_list  *bidlist    = NULL;

+    struct OS_pid_list  *pidlist    = NULL;

+    UINT8               i           = 0;

+    UINT8               j           = 0;

+    UINT32              count       = 0;

+    ZOSS_THREAD_ID      *thread_id  = NULL;

+

+    count       = (UINT32)gOse_maxthreads;

+    thread_id   = (ZOSS_THREAD_ID *)zOss_Malloc(count * sizeof(ZOSS_THREAD_ID));

+    zOss_AssertEx(thread_id != NULL, 0);

+    bidlist     = get_bid_list(0);

+    count       = 0;

+

+    for (i = 0; i < bidlist->count; i++)

+    {

+        pidlist = get_pid_list(bidlist->list[i]);

+

+        for (j = 0; j < pidlist->count; j++)

+        {

+            thread_id[count] = (ZOSS_THREAD_ID)pidlist->list[j];

+            count++;

+        }

+

+        free_buf((union SIGNAL **) &pidlist);

+    }

+

+    free_buf((union SIGNAL **) &bidlist);

+

+    if (count > 0)

+    {

+        *threadarray = thread_id;

+    }

+    else

+    {

+        zOss_Free(thread_id);

+        *threadarray = NULL;

+    }

+

+    return count;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_create_handler

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN)    thread_id:

+* ·µ »Ø Öµ: ³É¹¦:task_id;ʧ°Ü:NULL

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID Osa_create_handler(T_ZOsa_ThreadUserArea *ua, PROCESS pid, PROCESS parent_pid)

+{

+    UINT32 iIndex = OSA_PID_TO_INDEX(pid);

+

+    if (0 == gOsa_SysCpuFreq)

+    {

+        gOsa_SwapFlag       = TRUE;

+        gOsa_SwapLastTime   = Osa_HwTimeRead();

+#if defined (_USE_PSM) && defined (_USE_CPU_DFM)

+        zOss_RecordPsmLastSwapTime();

+#endif

+        gOsa_SysCpuFreq     = obtain_timebase_frequency();

+    }

+

+    zOss_AssertExN(ua != NULL);

+    zOss_Memset(ua, 0, sizeof(T_ZOsa_ThreadUserArea));

+    

+    ua->threadid    = (ZOSS_THREAD_ID)pid;

+    ua->runcount    = 0;

+    ua->cputime     = 0;

+    ua->psmCpuTime  = 0;

+    if (gp_OsaThreadUserArea != NULL)

+    {

+        gp_OsaThreadUserArea[iIndex] = ua;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: Osa_kill_handler

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN)    thread_id:

+* ·µ »Ø Öµ: ³É¹¦:task_id;ʧ°Ü:NULL

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID Osa_kill_handler(T_ZOsa_ThreadUserArea *ua, PROCESS pid)

+{

+    if (gp_OsaThreadUserArea != NULL)

+    {

+        gp_OsaThreadUserArea[OSA_PID_TO_INDEX(pid)] = NULL;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_swapin_handler

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN) thread_id:

+* ·µ »Ø Öµ:  ³É¹¦:task_id;ʧ°Ü:NULL

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID Osa_swapin_handler(T_ZOsa_ThreadUserArea *ua)

+{

+    UINT32  iIndex  = 0;

+    UINT32  nowtime = 0;

+    

+    zOss_AssertExN(ua != NULL);

+    

+#ifdef _USE_TRACE_INT_THREAD

+    if(gSum <= 5000)

+    {

+        gSum++;

+    }

+    else

+    {

+        gSwapInThreadsID[gSwapInIndex] = ua->threadid;

+        gSwapInTimes[gSwapInIndex]     = Osa_HwTimeRead();

+        gSwapInIndex++;

+        if ( gSwapInIndex >= 5000 )

+        {

+            gSwapInIndex = 0;

+        }

+    }

+#endif

+

+    if (gp_OsaThreadUserArea != NULL)

+    {

+        iIndex = OSA_PID_TO_INDEX(ua->threadid);

+

+        if (gp_OsaThreadUserArea[iIndex] == NULL)

+        {

+            gp_OsaThreadUserArea[iIndex] = ua;

+        }

+    }

+#if defined (_USE_PSM) && defined (_USE_CPU_DFM)

+    zOss_ThreadSwapInPsmHook((T_ZOsa_ThreadUserArea *)ua);

+#endif

+    

+    if (gOsa_SwapTimeFlag)

+    {

+        UINT32  len = 0;

+        (ua->runcount)++;

+        nowtime = Osa_HwTimeRead();

+        len = nowtime - gOsa_SwapLastTime;

+        ua->cputime += len;

+        ua->runtime += len;

+        if (NULL != ua->curtaskid)

+        {

+            T_ZOss_TCB *pTCB = NULL;

+            pTCB = (T_ZOss_TCB *)(ua->curtaskid);

+            pTCB->cputime += len;

+            pTCB->runtime += len;

+            pTCB->task_time = nowtime;

+        }

+        gOsa_SwapLastTime = nowtime;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_swapout_handler

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN) thread_id:

+* ·µ »Ø Öµ:  ³É¹¦:task_id;ʧ°Ü:NULL

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID Osa_swapout_handler(T_ZOsa_ThreadUserArea *ua)

+{

+    UINT32 nowtime = 0;

+

+    zOss_AssertExN(ua != NULL);

+            

+#ifdef _USE_TRACE_INT_THREAD

+    if(gSum > 5000)

+    {

+        gSwapOutThreadsID[gSwapOutIndex]    = ua->threadid;

+        gSwapOutTimes[gSwapOutIndex]        = (UINT32)Osa_HwTimeRead();

+        gSwapOutIndex++;

+        if ( gSwapOutIndex >= 5000 )

+        {

+            gSwapOutIndex = 0;

+        }

+    }

+#endif

+

+#if defined (_USE_PSM) && defined (_USE_CPU_DFM)

+    zOss_ThreadSwapOutPsmHook((T_ZOsa_ThreadUserArea *)ua);

+#endif

+

+    if (gOsa_SwapTimeFlag)

+    {

+        UINT32      len     = 0;

+        T_ZOss_TCB  *pTCB   = NULL;

+        

+        nowtime = Osa_HwTimeRead();

+        len = nowtime - gOsa_SwapLastTime; /* Ïß³ÌÖ´ÐÐʱ¼ä */

+        ua->cputime += len;

+        ua->runtime += len;

+        if (NULL != ua->curtaskid)

+        {

+            pTCB = (T_ZOss_TCB *)(ua->curtaskid);

+            len = nowtime - pTCB->task_time; 

+            pTCB->cputime += len;

+            pTCB->runtime += len;

+        }

+        gOsa_SwapLastTime = nowtime;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_SwapCtl

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷:  (IN) :

+* ·µ »Ø Öµ:  ³É¹¦:task_id;ʧ°Ü:NULL

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID Osa_SwapCtl(BOOL enableRunTime)

+{

+    UINT32      i           = 0;

+    PROCESS     my_pid      = 0;

+    OSPRIORITY  my_pri      = 0;

+    UINT32      maxthread   = 0;

+

+    if ((enableRunTime == gOsa_SwapTimeFlag))

+    {

+        return;

+    }

+    my_pid = current_process();

+    my_pri = get_pri(my_pid);

+    set_pri(0);

+

+    if ((enableRunTime == TRUE) && (gOsa_SwapTimeFlag == FALSE))

+    {

+        if (NULL == gOsa_AllTaskIdArray)

+        {

+            T_OSS_PARAM *pPlatCfg = NULL;

+

+            pPlatCfg            = zOss_GetOssCfg();

+            gOsa_AllTaskIdArray = (VOID **)zOss_Malloc(sizeof(ZOSS_TASK_ID) * pPlatCfg->TaskCfg.max_task_num);

+            zOss_ASSERT(gOsa_AllTaskIdArray != NULL);

+        }

+

+        maxthread = (UINT32)gOse_maxthreads;

+        while (i < maxthread)

+        {

+            if (NULL != gp_OsaThreadUserArea[i])

+            {

+                gp_OsaThreadUserArea[i]->cputime = 0;

+            }

+            i++;

+        }

+        gOsa_CpuStartTime = Osa_HwTimeRead();

+        gOsa_SwapLastTime = gOsa_CpuStartTime;

+    }

+    gOsa_SwapTimeFlag   = enableRunTime;

+    set_pri(my_pri);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_UpdateCpu

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷:  (IN) :

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID Osa_UpdateCpu(VOID)

+{

+    if (gOsa_SwapTimeFlag)//Ö»ÓмǼ²ÅÓмÆËãcpuµÄ±ØÒª

+    {

+        UINT32                  i           = 0;

+        UINT32                  totaltime   = 0;

+        UINT32                  nowtime     = 0;

+        UINT32                  excetime    = 0;

+        UINT32                  maxthread   = gOse_maxthreads;

+        PROCESS                 my_pid      = 0;

+        OSPRIORITY              my_pri      = 0;

+        T_ZOsa_ThreadUserArea   *pUa        = NULL;

+

+        my_pid = current_process();

+        my_pri = get_pri(my_pid);

+        set_pri(0);

+        nowtime = Osa_HwTimeRead();

+        totaltime = nowtime - gOsa_CpuStartTime; /* Ïß³ÌÖ´ÐÐʱ¼ä */

+        for (i = 0; i < maxthread; i++)

+        {

+            pUa = gp_OsaThreadUserArea[i];

+            if (pUa)

+            {

+                if (pUa->cputime > totaltime)

+                {

+                    pUa->cputime = 0xFFFFFFFF - pUa->cputime;

+                }

+

+                if (pUa->cputime > 0x28F5C28) /* Êý¾ÝÌ«´ó£¬³Ë100»áUINT32Òç³ö */

+                {

+                    excetime        = (pUa->cputime >> 10 ) * 100;

+                    pUa->cpupercent = (((FLOAT)excetime) / (totaltime >> 10));

+                }

+                else

+                {

+                    excetime        = pUa->cputime * 100;

+                    pUa->cpupercent = (((FLOAT)excetime) / totaltime);

+                }

+                pUa->cputime = 0;/* ¼ÆËãÍêÁ˽«cputimeÇå 0*/

+            }

+

+        }

+

+        if (gOsa_AllTaskIdArray)

+        {

+            T_ZOss_TCB *pTCB = NULL;

+

+            maxthread = zOss_GetAllTaskID(gOsa_AllTaskIdArray);

+

+            for (i = 0; i < maxthread; i++)

+            {

+                pTCB = (T_ZOss_TCB *)gOsa_AllTaskIdArray[i];

+                if (pTCB != pTCB->task_id)

+                {

+                    continue;/* may SDL task */

+                }

+

+                if (pTCB->cputime > totaltime)

+                {

+                    pTCB->cputime = 0xFFFFFFFF - pTCB->cputime;

+                }

+

+                if (pTCB->cputime > 0x28F5C28) /* Êý¾ÝÌ«´ó£¬³Ë100»áUINT32Òç³ö */

+                {

+                    excetime            = (pTCB->cputime >> 10 ) * 100;

+                    pTCB->cpupercent    = ((FLOAT)excetime) / (totaltime >> 10);

+                }

+                else

+                {

+                    excetime            = pTCB->cputime * 100;

+                    pTCB->cpupercent    = (((FLOAT)excetime) / totaltime);

+                }

+                pTCB->cputime = 0;/* ¼ÆËãÍêÁ˽«cputimeÇå0 */

+

+            }

+

+        }

+        gOsa_CpuStartTime = Osa_HwTimeRead();

+        gOsa_SwapLastTime = gOsa_CpuStartTime;

+

+        set_pri(my_pri);

+    }

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_DisplayThreadExecInfo

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷:  (IN) :

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 Osa_DisplayThreadExecInfo(PROCESS pid)

+{        

+    T_ZOsa_ThreadUserArea *pt = NULL;

+    

+    if (gOsa_SwapTimeFlag)

+    {

+        pt = Osa_GetThreadUserArea((ZOSS_THREAD_ID)pid, TRUE);

+        zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "%-20s  %-16s  %16s  %16s  %16s  %16s",

+                    "ThreadName", "ThreadID", "CpuPercent", "RunTimeInMs", "MsgNum", "RunCount");

+        if (NULL != pt->threadid)

+        {

+            zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "%-20s  0x%08x   %16.2f  %16u   %16u   %16u",

+                        pt->threadname, pt->threadid, pt->cpupercent,  pt->RunTimeInMs, pt->msgnum,pt->runcount);

+        }

+        else

+        {

+            zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_ABNORMAL, "ûÓÐÕÒµ½Ïß³Ì0x%08x", (UINT32)pid);

+            return ZOSS_ERROR;

+        }

+    }

+

+    return ZOSS_SUCCESS;

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_DisplayThreadsExecInfo

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷:  (IN) :

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 Osa_DisplayThreadsExecInfo(UINT32 type)

+{

+    UINT32                  i                   = 0;

+    UINT32                  excetime            = 0;

+    UINT32                  thread_num          = 0;    /* Ïß³ÌÊý               */

+    ZOSS_THREAD_ID          *AllThreadIdArray   = NULL; /* ËùÓÐÏß³ÌIDÊý×éÖ¸Õë   */

+    T_ZOsa_ThreadUserArea   *pThreadInfo        = NULL; /* Ïß³ÌUAÖ¸Õë           */

+

+    if (gOsa_SwapTimeFlag)

+    {

+        thread_num = Osa_GetAllThreadId(&AllThreadIdArray);/* º¯ÊýÄÚÉêÇë¿Õ¼ä */

+        if (0 == thread_num || NULL == AllThreadIdArray)

+        {

+            return ZOSS_ERROR;

+        }

+        zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "%-20s  %-16s  %16s  %16s  %16s  %16s",

+                    "ThreadName", "ThreadID", "CpuPercent", "RunTimeInMs", "MsgNum", "RunCount");

+        for (i = 0;i < thread_num;i++)

+        {

+            pThreadInfo = Osa_GetThreadUserArea(AllThreadIdArray[i], TRUE);

+            excetime    = pThreadInfo->runtime;

+            if ((type & SUP_THREAD_LIVE_BIT) && 0 == excetime)

+            {

+                continue;/* Ìø¹ýûÓлµÄÏß³Ì */

+            }

+            else if ((type & SUP_THREAD_LAZY_BIT) && 0 != excetime)

+            {

+                continue;/* Ìø¹ý»î¶¯µÄÏß³Ì */

+            }

+            

+            zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "%-20s  0x%08x   %16.2f   %16u   %16u    %16u",

+                        pThreadInfo->threadname, pThreadInfo->threadid, pThreadInfo->cpupercent, pThreadInfo->RunTimeInMs, pThreadInfo->msgnum, pThreadInfo->runcount);

+        }

+        zOss_Free(AllThreadIdArray);

+    }

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_DisplayThreadsExecInfo

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷:  (IN) :

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+FLOAT Osa_GetProcessCPU(ZOSS_THREAD_ID tid)

+{

+    UINT32 i = 0;

+

+    if (gOsa_SwapTimeFlag)

+    {

+        for (i = 0; i < gOse_maxthreads; i++)

+        {

+            if ((gp_OsaThreadUserArea[i] != NULL) && (tid == (ZOSS_THREAD_ID) gp_OsaThreadUserArea[i]->threadid))

+            {

+                return gp_OsaThreadUserArea[i]->cpupercent;

+            }

+        }

+    }

+

+    return 0;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/ose/src/ose_mmu_arm.c b/cp/ps/plat/src/oss/osa/ose/src/ose_mmu_arm.c
new file mode 100644
index 0000000..1dde9ae
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/ose/src/ose_mmu_arm.c
@@ -0,0 +1,656 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : ose_mmu_arm.c

+* ÎÄ ¼þ Ãû : ose_mmu_arm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ºÎº£½¨

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011-8-15

+* ÆäËü˵Ã÷ :          

+**************************************************************************/

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/09/15

+* ÐÞ¸ÄÄÚÈÝ : PC-LINT¼ì²éÓÚ±àÂë¹æ·¶ÐÞ¸Ä EC: 617001781881  

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC: 617001781957

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "cpu_hal_arch.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+#define MMU_REGION_MAX          (255)

+

+#define LV1_SECTION_SIZE        0x100000    /* 1M                                           */

+#define LV2_LARGE_SIZE          0x10000     /* 64k */

+#define LV2_SMALL_SIZE          0x1000      /* 4k  */

+#define LV2_TINY_SIZE           0x400       /* 1k  */

+

+/* virtual address */

+#define VA_OFFSET_SECTION(v)    ((UINT32)(v) & 0x000FFFFF)          /* 19~0  */

+#define VA_OFFSET_LARGE(v)      ((UINT32)(v) & 0x0000FFFF)          /* 15~0  */

+#define VA_OFFSET_SMALL(v)      ((UINT32)(v) & 0x00000FFF)          /* 11~0  */

+#define VA_OFFSET_TINY(v)       ((UINT32)(v) & 0x000003FF)          /*  9~0  */

+

+/* physical address */

+#define PA_SECTION(d1,v)        (LV1_DESC_PTA_S(d1) | VA_OFFSET_SECTION(v))

+#define PA_LARGR(d2,v)          (LV2_DESC_PA_L(d2) | VA_OFFSET_LARGE(v))

+#define PA_SMALL(d2,v)          (LV2_DESC_PA_S(d2) | VA_OFFSET_SMALL(v))

+#define PA_TINY(d2,v)           (LV2_DESC_PA_T(d2)  | VA_OFFSET_TINY(v))

+

+/* access permision */

+#define AP_USER_RW              (3)

+#define AP_USER_RO              (2)

+#define AP_USER_NA              (1)

+

+#define AP_SECTION(d)           (((d) & LV1_DESC_AP(0x3)) >> 10)

+#define AP_LARGE(d)             (((d) & LV2_DESC_AP_L(0x3)) >> 10)

+#define AP_SMALL(d)             (((d) & LV2_DESC_AP_S(0x3)) >> 10)

+#define AP_TINY(d)              (((d) & LV2_DESC_AP_T(0x3)) >> 4)

+

+/* domain */

+#define DOMAIN_NA               (0x0)

+

+#define DOMAIN_RESERVED         (0x2)

+#define DOMAIN_SU               (0x3)

+#define DOMAIN_VAL(r,d)         (((r)>>((d)<<1)) & 0x3)

+

+/* lv1 descriptor address */

+#define LV1_DESC_ADDR(c2,v)     (((UINT32)(c2)&0xFFFFC000) | (((v)&0xFFF00000)>>18))   /* 31~14, 13~2, 1~0 */

+

+/* lv1 descriptor */

+#define LV1_DESC_PTA_S(a)       ((UINT32)(a) & 0xFFF00000)  /* 31~20 */

+

+#define LV1_DESC_AP(p)          (((p)&0x3) << 10)           /* 11~10 */          

+#define LV1_DESC_DOMAIN(d)      (((d)&0xF) << 5)            /*  8~5  */

+

+/* lv1 descriptor */

+#define LV1_FINE                (3)

+#define LV1_SECTION             (2)

+#define LV1_COARSE              (1)

+#define LV1_FAULT               (0)

+#define LV1_TYPE(d)             ((d) & 0x3)

+#define LV1_DOMAIN(d)           (((d) & LV1_DESC_DOMAIN(0xF)) >> 5)

+

+/* lv2 descriptor address */

+#define LV2_DESC_ADDR_C(d,v)    (((UINT32)(d)&0xFFFFFC00) | (((v)&0x000FF000)>>10))   /* 31~10,  9~2, 1~0 */

+#define LV2_DESC_ADDR_F(d,v)    (((UINT32)(d)&0xFFFFF000) | (((v)&0x000FFC00)>>8))    /* 31~12, 11~2, 1~0 */

+

+/* lv2 descriptor */

+#define LV2_DESC_PA_L(a)        ((UINT32)(a) & 0xFFFF0000) /* 31~16 */

+#define LV2_DESC_PA_S(a)        ((UINT32)(a) & 0xFFFFF000) /* 31~12 */

+#define LV2_DESC_PA_T(a)        ((UINT32)(a) & 0xFFFFFC00) /* 31~10 */

+#define LV2_DESC_AP_L(p)        ((((p)&0x3)<<10) | (((p)&0x3)<<8) | (((p)&0x3)<<6) | (((p)&0x3)<<4))    /* 11~4 */

+#define LV2_DESC_AP_S(p)        ((((p)&0x3)<<10) | (((p)&0x3)<<8) | (((p)&0x3)<<6) | (((p)&0x3)<<4))    /* 11~4 */

+#define LV2_DESC_AP_T(p)        (((p)&0x3)<<4)             /* 6~4   */

+

+/* lv2 descriptor */

+#define LV2_TINY                (3)

+#define LV2_SMALL               (2)

+#define LV2_LARGE               (1)

+#define LV2_FAULT               (0)

+#define LV2_TYPE(d)             ((d) & 0x3)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef enum

+{

+    C1_M = 1<<0,

+    C1_A = 1<<1,

+    C1_C = 1<<2,

+    C1_W = 1<<3,

+    C1_S = 1<<8,

+    C1_R = 1<<9,

+    C1_I = 1<<12,

+    C1_V = 1<<13

+}MMU_C1;

+

+typedef enum

+{

+    SU_NA_USR_NA,

+    SU_RO_USR_NA,

+    SU_RO_USR_RO,

+    SU_RW_USR_NA,

+    SU_RW_USR_RO,

+    SU_RW_USR_RW

+}MMU_AP;

+

+typedef struct

+{

+    T_ZOss_Node node;

+    UINT32      p_start;

+    UINT32      v_start;

+    UINT32      v_end;

+    UINT32      lv1_type;

+    UINT32      lv2_type;

+    UINT32      access;

+}MMU_NODE;

+/**************************************************************************

+* ¾Ö²¿³£Á¿¶¨Òå

+**************************************************************************/

+#pragma arm section rodata = "MMU_RO_DATA"

+

+static const UINT32 s_page_size_table[4][4] = 

+{   /* fault            large             small             tiny */

+    { LV1_SECTION_SIZE, LV1_SECTION_SIZE, LV1_SECTION_SIZE, LV1_SECTION_SIZE }, /* fault    */

+    { LV2_TINY_SIZE,    LV2_LARGE_SIZE,   LV2_SMALL_SIZE,   LV2_TINY_SIZE    }, /* coarse   */

+    { LV1_SECTION_SIZE, LV1_SECTION_SIZE, LV1_SECTION_SIZE, LV1_SECTION_SIZE }, /* section  */

+    { LV2_TINY_SIZE,    LV2_LARGE_SIZE,   LV2_SMALL_SIZE,   LV2_TINY_SIZE    }  /* fine     */

+};

+

+#pragma arm section rodata

+

+static const CHAR *s_lv1_type_name[LV1_TYPE(0xFFFFFFFF)+1] = 

+{ 

+    (const CHAR *)"FAULT",

+    (const CHAR *)"COARSE",

+    (const CHAR *)"SECTION",

+    (const CHAR *)"FINE" 

+};

+

+static const CHAR *s_lv2_type_name[LV1_TYPE(0xFFFFFFFF)+1][LV2_TYPE(0xFFFFFFFF)+1] = 

+{

+    { (const CHAR *)"--",    (const CHAR *)"--",    (const CHAR *)"--",    (const CHAR *)"--"   },

+    { (const CHAR *)"FAULT", (const CHAR *)"LARGE", (const CHAR *)"SMALL", (const CHAR *)"--"   },

+    { (const CHAR *)"--",    (const CHAR *)"--",    (const CHAR *)"--",    (const CHAR *)"--"   },

+    { (const CHAR *)"FAULT", (const CHAR *)"LARGE", (const CHAR *)"SMALL", (const CHAR *)"TINY" }

+};

+

+static const CHAR *s_mmu_accessible[] = 

+{

+    (const CHAR *)"SU_NA_USR_NA",

+    (const CHAR *)"SU_RO_USR_NA",

+    (const CHAR *)"SU_RO_USR_RO",

+    (const CHAR *)"SU_RW_USR_NA",

+    (const CHAR *)"SU_RW_USR_RO",

+    (const CHAR *)"SU_RW_USR_RW"

+};

+

+/**************************************************************************

+* ¾Ö²¿±äÁ¿¶¨Òå

+**************************************************************************/

+T_ZOss_List         s_mmu_list                      = { 0 };

+static MMU_NODE     s_mmu_regions[MMU_REGION_MAX]   = { 0 };

+static UINT32       s_mmu_region_cnt                = 0;

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+const UINT32 s_mmu_stack_bottom = 0;

+/**************************************************************************

+* È«¾Öº¯ÊýÉùÃ÷

+**************************************************************************/

+extern UINT32 cp15_readControlRegister(VOID);

+//extern VOID   cp15_writeControlRegister(UINT32);

+extern UINT32 cp15_readDomainRegister(VOID);

+extern UINT32 cp15_readTTB(VOID);

+extern UINT32 get_arm_mode(VOID);

+#pragma arm section code = "MMU_CODE"

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+static VOID mmu_get_desc(UINT32 v_addr, UINT32 *p_lv1_desc, UINT32 *p_lv2_desc)

+{

+    UINT32 c2       = cp15_readTTB();

+    UINT32 lv1_desc = 0;

+    UINT32 lv1_type = 0;

+

+    lv1_desc = *(UINT32 *)LV1_DESC_ADDR(c2, v_addr);

+    if (NULL != p_lv1_desc)

+    {

+        *p_lv1_desc = lv1_desc;

+    }

+

+    if (NULL != p_lv2_desc)

+    {

+        lv1_type = LV1_TYPE(lv1_desc);

+        if (LV1_COARSE == lv1_type)

+        {

+            *p_lv2_desc = *(UINT32 *)LV2_DESC_ADDR_C(lv1_desc, v_addr);

+        }

+        else if (LV1_FINE == lv1_type)

+        {

+            *p_lv2_desc = *(UINT32 *)LV2_DESC_ADDR_F(lv1_desc, v_addr);

+        }

+        else

+        {

+            *p_lv2_desc = LV2_FAULT;

+        }

+    }

+}

+

+static BOOL mmu_is_addr_valid(UINT32 v_addr)

+{

+    UINT32 lv1_desc = 0;

+    UINT32 lv1_type = 0;

+    UINT32 lv2_desc = 0;

+    UINT32 lv2_type = 0;

+

+    mmu_get_desc(v_addr, &lv1_desc, &lv2_desc);

+    

+    lv1_type = LV1_TYPE(lv1_desc);

+    lv2_type = LV2_TYPE(lv2_desc);

+    if ((LV1_FAULT == lv1_type) || ((LV1_COARSE == lv1_type) && ((LV2_FAULT == lv2_type) || (LV2_TINY == lv2_type))) || ((LV1_FINE == lv1_type) && (LV2_FAULT == lv2_type)))

+    {

+        return FALSE;

+    }

+    else

+    {

+        return TRUE;

+    }

+}

+

+static UINT32 mmu_get_phy_addr(UINT32 v_addr)

+{

+    UINT32 lv1_desc = 0;

+    UINT32 lv1_type = 0;

+    UINT32 lv2_desc = 0;

+    UINT32 lv2_type = 0;

+    UINT32 p_addr   = 0;

+

+    if (!mmu_is_addr_valid(v_addr))

+    {

+        return ZOSS_ERROR;

+    }

+    

+    mmu_get_desc(v_addr, &lv1_desc, &lv2_desc);

+    lv1_type = LV1_TYPE(lv1_desc);

+    lv2_type = LV2_TYPE(lv2_desc);

+    if (LV1_SECTION == lv1_type)

+    {

+        p_addr = PA_SECTION(lv1_desc, v_addr);

+    }

+    else if (LV2_LARGE == lv2_type)

+    {

+        p_addr = PA_LARGR(lv2_desc, v_addr);

+    }

+    else if (LV2_SMALL == lv2_type)

+    {

+        p_addr = PA_SMALL(lv2_desc, v_addr);

+    }

+    else if (LV2_TINY == lv2_type)

+    {

+        p_addr = PA_TINY(lv2_desc, v_addr);

+    }

+    else

+    {

+        zOss_ASSERT(0);

+    }

+

+    return p_addr;

+}

+

+static UINT32 mmu_get_ap(UINT32 v_addr)

+{

+    UINT32 lv1_desc = 0;

+    UINT32 lv1_type = LV1_FAULT;

+    UINT32 lv2_desc = 0;

+    UINT32 lv2_type = LV2_FAULT;

+    UINT32 ap       = 0;

+

+    if (!mmu_is_addr_valid(v_addr))

+    {

+        return AP_USER_NA;

+    }

+

+    mmu_get_desc(v_addr, &lv1_desc, &lv2_desc);

+    lv1_type = LV1_TYPE(lv1_desc);

+    lv2_type = LV2_TYPE(lv2_desc);

+    

+    if (LV1_SECTION == lv1_type)

+    {

+        ap = AP_SECTION(lv1_desc);

+    }

+    else if (LV2_LARGE == lv2_type)

+    {

+        ap = AP_LARGE(lv2_desc);

+    }

+    else if (LV2_SMALL == lv2_type)

+    {

+        ap = AP_SMALL(lv2_desc);

+    }

+    else if (LV2_TINY == lv2_type)

+    {

+        ap = AP_TINY(lv2_desc);

+    }

+    else

+    {

+        zOss_ASSERT(0);

+    }

+

+    return ap;

+}

+

+static UINT32 mmu_get_access_permmision(UINT32 v_addr)

+{

+    UINT32 lv1_desc = 0;

+    UINT32 c1       = 0;

+    UINT32 c3       = 0;

+    UINT32 d        = 0;

+    UINT32 ap       = 0;

+    UINT32 s        = 0;

+    UINT32 r        = 0;

+    

+    if (!mmu_is_addr_valid(v_addr))

+    {

+        return SU_NA_USR_NA;

+    }

+

+    mmu_get_desc(v_addr, &lv1_desc, NULL);

+    c3 = cp15_readDomainRegister();

+    d  = DOMAIN_VAL(c3, LV1_DOMAIN(lv1_desc));

+    if ((DOMAIN_NA == d) || (DOMAIN_RESERVED == d))

+    {

+        return SU_NA_USR_NA;

+    }

+    else if (DOMAIN_SU == d)

+    {

+        return SU_RW_USR_RW;

+    }

+    else

+    {

+        ap = mmu_get_ap(v_addr);

+        if (AP_USER_NA == ap)

+        {

+            return SU_RW_USR_NA;

+        }

+        else if (AP_USER_RO == ap)

+        {

+            return SU_RW_USR_RO;

+        }

+        else if (AP_USER_RW == ap)

+        {

+            return SU_RW_USR_RW;

+        }

+        else

+        {

+            MMU_C1 temp = C1_S; /* È¥³ýPC-LINT ¸æ¾¯ÓÃ*/

+            c1 = cp15_readControlRegister();

+            s  = (0 == (c1 & temp)) ? 0 : 1;

+            r  = (0 == (c1 & C1_R)) ? 0 : 1;

+            if ((1 == s) && (0 == r))

+            {

+                return SU_RO_USR_NA;

+            }

+            else if ((0 == s) && (1 == r))

+            {

+                return SU_RO_USR_RO;

+            }

+            else

+            {

+                return SU_NA_USR_NA;

+            }

+        }

+    }

+}

+

+static BOOL mmu_is_readable(UINT32 v_addr)

+{

+    UINT32 mode = 0;

+    UINT32 ap   = 0;

+    UINT32 c2   = cp15_readTTB();

+    

+    mode = get_arm_mode();

+    

+    hal_arch_cpu_descriptor->disable_mmu();

+    

+    ap = mmu_get_access_permmision(v_addr);

+    

+    hal_arch_cpu_descriptor->enable_mmu(1, 1, 0, 0, 0, c2);

+

+    if (0 == mode)    /* user mode */

+    {

+        MMU_AP temp = SU_NA_USR_NA; /* È¥³ýPC-LINT ¸æ¾¯ÓÃ*/

+        if ((temp == ap) || (SU_RO_USR_NA == ap) || (SU_RW_USR_NA == ap))

+        {

+            return FALSE;

+        }

+    }

+    else    /*privileged modes */

+    {

+        if (SU_NA_USR_NA == ap)

+        {

+            return FALSE;

+        }

+    }

+

+    return TRUE;

+}

+

+BOOL mmu_is_writeable(UINT32 v_addr)

+{

+    UINT32 mode = 0;

+    UINT32 ap   = 0;

+    UINT32 c2   = cp15_readTTB();

+    

+    mode = get_arm_mode();

+    

+    hal_arch_cpu_descriptor->disable_mmu();

+    

+    ap = mmu_get_access_permmision(v_addr);

+    

+    hal_arch_cpu_descriptor->enable_mmu(1, 1, 0, 0, 0, c2);

+

+    if (0 == mode)    /* user mode */

+    {

+        MMU_AP temp = SU_RW_USR_RW; /* È¥³ýPC-LINT ¸æ¾¯ÓÃ*/

+        if ( temp != ap)

+        {

+            return FALSE;

+        }

+    }

+    else    /*privileged modes */    

+    {

+        if (SU_NA_USR_NA == ap || SU_RO_USR_NA == ap || SU_RO_USR_RO == ap)

+        {

+            return FALSE;

+        }

+    }

+

+    return TRUE;

+}

+

+

+static MMU_NODE *mmu_alloc_region_buf(VOID)

+{

+    if (MMU_REGION_MAX > s_mmu_region_cnt)

+    {

+        return &s_mmu_regions[s_mmu_region_cnt++];

+    }

+    else

+    {

+        return NULL;

+    }

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+VOID mmu_generate_info(VOID)

+{

+    UINT32      c2               = cp15_readTTB();

+    UINT32      lv1_desc         = 0;

+    UINT32      lv2_desc         = 0;

+    UINT32      lv1_type         = LV1_FAULT;

+    UINT32      lv2_type         = LV2_FAULT;

+    UINT32      v_addr           = 0;

+    UINT32      v_addr_last      = 0;

+    UINT32      accessible       = SU_NA_USR_NA;

+    UINT32      accessible_last  = SU_NA_USR_NA;

+    BOOL        is_start         = FALSE;

+    BOOL        is_end           = FALSE;

+    MMU_NODE    *node            = NULL;

+    static BOOL isInit           = FALSE;

+

+    if(isInit == TRUE)

+    {

+        return;

+    }

+    

+    zOss_ListInit(&s_mmu_list);

+

+    zOss_Memset(s_mmu_regions, 0, sizeof(s_mmu_regions));

+    

+    s_mmu_region_cnt = 0;

+    

+    hal_arch_cpu_descriptor->disable_mmu();

+    for (v_addr=0, v_addr_last=0; ; v_addr_last = v_addr, v_addr += s_page_size_table[lv1_type][lv2_type])

+    {

+        /* address overflow */

+        if (v_addr < v_addr_last)

+        {

+            if (NULL != node)

+            {

+                node->v_end = 0xFFFFFFFF;

+                zOss_ListAdd(&s_mmu_list, (T_ZOss_Node *)node);

+            }

+            break;

+        }

+

+        /* descriptor & type */

+        mmu_get_desc(v_addr, &lv1_desc, &lv2_desc);

+        lv1_type = LV1_TYPE(lv1_desc);

+        lv2_type = LV2_TYPE(lv2_desc);

+

+        /* access permision */

+        accessible = mmu_get_access_permmision(v_addr);

+

+        if ( /*(lv1_type_last != lv1_type)

+            || (lv2_type_last != lv2_type)

+            ||*/ (accessible_last != accessible))

+        {

+            if (mmu_is_addr_valid(v_addr))

+            {

+                is_start = TRUE;

+            }

+            if (NULL != node)

+            {

+                is_end = TRUE;

+            }

+        }

+

+        if (is_end)

+        {

+            zOss_ASSERT(NULL != node);

+            node->v_end = v_addr - 1;

+            zOss_ListAdd(&s_mmu_list, (T_ZOss_Node *)node);

+            node = NULL;

+        }

+        if (is_start)

+        {

+            node = mmu_alloc_region_buf();

+            zOss_ASSERT(NULL != node);

+            

+            node->p_start  = mmu_get_phy_addr(v_addr);

+            node->v_start  = v_addr;

+            node->lv1_type = lv1_type;

+            node->lv2_type = lv2_type;

+            node->access   = accessible;

+        }

+        accessible_last = accessible;

+        is_start        = FALSE;

+        is_end          = FALSE;

+    }

+    

+    hal_arch_cpu_descriptor->enable_mmu(1, 1, 0, 0, 0, c2);

+

+    isInit = TRUE;

+}

+

+BOOL mmu_get_readable_region(UINT32 begin, UINT32 end , UINT32 *p_begin, UINT32 *p_end)

+{

+    MMU_NODE    *node           = NULL;

+    UINT32      region_start    = 0;

+    UINT32      region_end      = 0;

+

+    if(begin > end)

+    {

+        return FALSE;

+    } 

+    node = (MMU_NODE *)zOss_ListFirst(&s_mmu_list);

+    while (NULL != node)

+    {

+        if (mmu_is_readable(node->v_start))

+        {

+            region_start = node->v_start;

+            region_end   = node->v_end;   

+            if ((region_start <= begin) && (region_end >= begin))

+            {

+                *p_begin =  begin;

+                *p_end   = (region_end > end) ? end : region_end;

+                return TRUE;

+            }

+            else if ((region_start > begin) && (region_start <= end))

+            {

+                *p_begin = region_start;

+                *p_end   = (region_end > end) ? end : region_end;

+                return TRUE;

+            }

+        }

+        node = (MMU_NODE *)zOss_ListNext((T_ZOss_Node *)node);

+    }

+    

+    return FALSE;

+}

+

+VOID print_mmu_info(VOID)

+{

+    MMU_NODE    *node   = NULL;

+    Msr         oldMsr  = 0;

+

+    LOCK_SAVE(oldMsr);   

+    mmu_generate_info();

+    LOCK_RESTORE(oldMsr);

+    

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "########################################");

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "mmu configuration start");

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "phy_start\tvirtual_start\tvirtual_end\tlv1_type\tlv2_type\taccess");

+    

+    node = (MMU_NODE *)zOss_ListFirst(&s_mmu_list);

+    while (NULL != node)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "0x%08x\t0x%08x\t0x%08x\t%s\t\t%s\t\t%s",

+                    node->p_start,

+                    node->v_start,

+                    node->v_end,

+                    s_lv1_type_name[node->lv1_type],

+                    s_lv2_type_name[node->lv1_type][node->lv2_type],

+                    s_mmu_accessible[node->access]);

+        

+        node = (MMU_NODE *)zOss_ListNext((T_ZOss_Node *)node);

+    }

+

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "mmu configuration end");

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "########################################");

+}

+

+#pragma arm section code

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/ose/src/ose_mmu_arm_asm.s b/cp/ps/plat/src/oss/osa/ose/src/ose_mmu_arm_asm.s
new file mode 100644
index 0000000..d59a224
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/ose/src/ose_mmu_arm_asm.s
@@ -0,0 +1,271 @@
+    

+;/*****************************************************/

+    PRESERVE8

+    AREA    MMU_CODE, CODE, READONLY

+    CODE32

+

+;/*****************************************************/

+; ID Code Register c0

+

+    EXPORT cp15_readIDCode

+

+cp15_readIDCode

+

+    MRC     p15, 0, r0, c0, c0, 0

+    BX      LR

+

+;/*****************************************************/

+; Cache Type Register c0

+

+    EXPORT cp15_readCacheType

+

+cp15_readCacheType

+

+    MRC     p15, 0, r0, c0, c0, 1

+    BX      LR

+

+;/*****************************************************/

+; TCM Status Register c0

+

+    EXPORT cp15_readTCMStatus

+

+cp15_readTCMStatus

+

+    MRC     p15, 0, r0, c0, c0, 2

+    BX      LR

+

+;/*****************************************************/

+; Control Register c1

+

+    EXPORT  cp15_readControlRegister

+    EXPORT  cp15_writeControlRegister

+

+cp15_readControlRegister

+

+    MRC     p15, 0, r0, c1, c0, 0

+    BX      LR

+

+cp15_writeControlRegister

+

+    MCR     p15, 0, r0, c1, c0, 0

+    BX      LR

+

+;/*****************************************************/

+; Translation Table Base Register c2

+

+    EXPORT  cp15_readTTB

+    EXPORT  cp15_writeTTB

+

+cp15_readTTB

+

+    MRC     p15, 0, r0, c2, c0, 0   

+    BX      LR

+

+cp15_writeTTB

+

+    MCR     p15, 0, r0, c2, c0, 0   

+    BX      LR

+    

+;/*****************************************************/

+; Domain Access Control Register c3

+

+    EXPORT  cp15_readDomainRegister

+    EXPORT  cp15_writeDomainRegister

+

+cp15_readDomainRegister

+

+    MRC     p15, 0, r0, c3, c0, 0

+    BX      LR

+

+cp15_writeDomainRegister

+

+    MCR     p15, 0, r0, c3, c0, 0

+    BX      LR

+

+;/*****************************************************/

+; Fault Status Register c5

+

+    EXPORT  cp15_readDFSR

+    EXPORT  cp15_writeDFSR

+    EXPORT  cp15_readIFSR

+    EXPORT  cp15_writeIFSR

+

+cp15_readDFSR

+

+    MRC     p15, 0, r0, c5, c0, 0

+    BX      LR

+

+cp15_writeDFSR

+

+    MCR     p15, 0, r0, c5, c0, 0

+    BX      LR

+

+cp15_readIFSR

+

+    MRC     p15, 0, r0, c5, c0, 1

+    BX      LR

+

+cp15_writeIFSR

+

+    MCR     p15, 0, r0, c5, c0, 1

+    BX      LR

+

+;/*****************************************************/

+; Fault Address Register c6

+

+    EXPORT  cp15_readFaultAddress

+    EXPORT  cp15_writeFaultAddress

+

+cp15_readFaultAddress

+

+    MRC     p15, 0, r0, c6, c0, 0

+    BX      LR

+ 

+cp15_writeFaultAddress

+

+    MCR     p15, 0, r0, c6, c0, 0

+    BX      LR

+

+;/*****************************************************/

+; Cache Operations Register c7

+

+;/*****************************************************/

+; TLB Operations Register c8

+

+    EXPORT cp15_InvalidateTLB

+

+cp15_InvalidateTLB

+

+    MCR     p15, 0, r0, c7, c7, 0       ; invalidate caches

+    MCR     p15, 0, r0, c8, c7, 0  

+    BX      LR

+

+;/*****************************************************/

+; TLB Lockdown Register c10

+

+    EXPORT  cp15_setLockedAddr

+

+cp15_setLockedAddr

+

+    LDR     r1, [r0]                ; access the memory section which will be locked

+    MCR     p15, 0, r0, c8, c7, 1   ; invalidate TLB single entry to ensure that LockAddr is not already in the TLB

+    MRC     p15, 0, r1, c10, c0, 0  ; read the lockdown register

+    ORR     r1, r1, #1              ; set the preserve bit

+    MCR     p15, 0, r1, c10, c0, 0  ; write to the lockdown register

+    LDR     r0,[r0]                 ; TLB will miss, and entry will be loaded

+    MRC     p15, 0, r1, c10, c0, 0  ; read the lockdown register (victim will have incremented)

+    BIC     r1, r1, #1              ; clear preserve bit

+    MCR     p15, 0, r1, c10, c0, 0  ; write to the lockdown register

+    BX      LR

+

+;/*****************************************************/

+    EXPORT  mem_zero

+    EXPORT  mem_copy

+

+mem_zero

+;addr    RN  0

+;len     RN  1

+

+    STMFD   SP!, {R4-R11}

+

+    MOV     R4, #0

+    MOV     R5, #0

+    MOV     R6, #0

+    MOV     R7, #0

+    MOV     R8, #0

+    MOV     R9, #0

+    MOV     R10, #0

+    MOV     R11, #0

+

+_zi_loop

+    SUBS    R1, R1, #32     ;~32

+    STMCSIA R0!, {R4-R11}

+    BHI     _zi_loop

+

+    MOVS    R1, R1, lsl #28 ;31~16

+    STMCSIA R0!, {R4-R7}

+

+    MOVS    R1, R1, lsl #1  ;15~8

+    STMCSIA R0!, {R4-R5}

+

+    MOVS    R1, R1, lsl #1  ;7~4

+    STRCS   R4, [R0], #4

+

+    MOVS    R1, R1, lsl #1  ;3~2

+    STRHCS  R4, [R0], #2

+

+    STRBMI  R4, [R0], #1    ;1

+

+    LDMFD   SP!,{R4-R11}

+    BX      LR

+

+

+mem_copy

+;dest    RN  0

+;src     RN  1

+;len     RN  2

+

+    STMFD   SP!, {R4-R11}

+

+_copy_loop

+    SUBS    R2, R2, #32     ;~32

+    LDMCSIA r1!, {r4-r11}

+    STMCSIA R0!, {R4-R11}

+    BHI     _copy_loop

+

+    MOVS    R2, R2, lsl #28 ;31~16

+    LDMCSIA R1!, {R4-R7}

+    STMCSIA R0!, {R4-R7}

+

+    MOVS    R2, R2, lsl #1  ;15~8

+    LDMCSIA R1!, {R4-R5}

+    STMCSIA R0!, {R4-R5}

+

+    MOVS    R2, R2, lsl #1  ;7~4

+    LDRCS   R4, [R1], #4

+    STRCS   R4, [R0], #4

+

+    MOVS    R2, R2, lsl #1  ;3~2

+    LDRHCS  R4, [R1], #2

+    STRHCS  R4, [R0], #2

+

+    LDRBMI  R4, [R1], #1    ;1

+    STRBMI  R4, [R0], #1    ;1

+

+    LDMFD   SP!, {R4-R11}

+    BX      LR    

+     

+;/*****************************************************/

+    EXPORT  get_arm_mode

+

+OS_CPU_ARM_MODE_MASK	EQU	0x1F

+

+get_arm_mode

+

+    MRS     R0, CPSR

+    AND     R0, R0, #OS_CPU_ARM_MODE_MASK

+

+    BX      LR

+    

+;/*****************************************************/

+    EXPORT  read_cpsr

+

+read_cpsr

+

+    MRS     R0, CPSR

+

+    BX      LR

+

+;/*****************************************************/

+    EXPORT  busy_delay

+

+busy_delay

+

+    SUBS    r0, r0, #1

+    BCS     busy_delay

+

+    BX      LR

+

+    

+    END

+

diff --git a/cp/ps/plat/src/oss/osa/ose/src/ose_pool_info.c b/cp/ps/plat/src/oss/osa/ose/src/ose_pool_info.c
new file mode 100644
index 0000000..29237d2
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/ose/src/ose_pool_info.c
@@ -0,0 +1,409 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : ose_pool_info.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ʵÏÖoseϵͳpoolÄÚ´æµÄÐÅÏ¢»ñÈ¡

+* ×÷    Õß : 

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC:617001782003

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#ifdef _OS_OSE

+#include "stdio.h"

+#include "ose.h"

+#include "ose_spi/ose_spi.h"

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define pool_printf(...)  zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, ##__VA_ARGS__)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºlist_pool_info

+* ¹¦ÄÜÃèÊö£ºÁгöpoolÄÚ´æ¿éµÄÏêϸÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+            pool_id:poolÄÚ´æID

+            (OUT)   

+* ·µ »Ø Öµ:

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+static VOID list_pool_info(PROCESS pool_id)

+{

+    OSADDRESS   *value      = NULL;

+    OSADDRESS   *value1     = NULL;

+    OSADDRESS   loop        = 0;

+    OSADDRESS   inUse       = 0;

+    CHAR        temp[100]   = {0};

+    CHAR        temp1[100]  = {0};

+    

+    struct OS_poolcb *pool = get_poolcb(pool_id);

+    

+    if (pool == NULL)

+    {

+        pool_printf("Error: %#lx is not a valid pool identifier.", pool_id);

+        return;

+    }

+    

+    pool_printf("Pool id.....: %#lx", pool_id);

+    pool_printf("Total size..: %lu", pool->tot_size);

+    pool_printf("Never used..: %lu (%lu%%)", pool->free_size, (100 * (pool->free_size)) / pool->tot_size);

+    pool_printf("Max used....: %lu (%lu%%)", (pool->tot_size - pool->free_size), (100 * (pool->tot_size - pool->free_size)) / pool->tot_size);

+    pool_printf("--------------------------------------------------------------------------------");

+    

+    pool_printf("Stack sizes: %lu", pool->stk_conf_entries);

+    

+    if (pool->stk_conf_entries > 0)

+    {

+        value = &pool->values[pool->stk_conf_sizes];

+        loop = pool->stk_conf_entries;

+        sprintf((char *)temp, " Conf.: ");

+        

+        while (loop--)

+        {

+            sprintf((char *)temp1, "%7lu", *value++);

+            strcat((char *)temp, (const char *)temp1);

+        }

+        

+        pool_printf("%s", (char *)temp);

+        temp[0] = 0;

+        sprintf((char *)temp, " Alloc:");

+        value = &pool->values[pool->stk_alloc_sizes];

+        loop  = pool->stk_conf_entries;

+        inUse = 0;

+        

+        while (loop--) 

+        {

+            inUse += *value;

+            sprintf((char *)temp1, "%7lu", *value++);

+            strcat((char *)temp, (const char *)temp1);

+        }

+        

+        sprintf((char *)temp1, " Sum: %lu", inUse);

+        strcat((char *)temp, (const char *)temp1);

+        pool_printf("%s", (char *)temp);

+        

+        temp[0] = 0;

+        sprintf((char *)temp, " Mem..:");

+        value  = &pool->values[pool->stk_conf_sizes];

+        value1 = &pool->values[pool->stk_alloc_sizes];

+        loop   = pool->stk_conf_entries;

+        inUse  = 0;

+        

+        while (loop--)

+        {

+            inUse += (*value) * (*value1);

+            sprintf((char *)temp1, "%7lu", (*value++) * (*value1++));

+            strcat((char *)temp, (const char *)temp1);

+        }

+        

+        sprintf((char *)temp1, " Sum: %lu", inUse);

+        strcat((char *)temp, (const char *)temp1);

+        pool_printf("%s", (char *)temp);

+    }

+    

+    pool_printf("--------------------------------------------------------------------------------");

+    pool_printf("Signal sizes: %lu", pool->sig_conf_entries);

+    if (pool->sig_conf_entries > 0)

+    {

+        value = &pool->values[pool->sig_conf_sizes];

+        loop  = pool->sig_conf_entries;

+        temp[0] = 0;

+        sprintf((char *)temp, " Conf.: ");

+        

+        while (loop--)

+        {

+            sprintf((char *)temp1, "%7lu", *value++);

+            strcat((char *)temp, (const char *)temp1);

+        }

+        

+        pool_printf("%s", (char *)temp);

+        

+        temp[0] = 0;

+        sprintf((char *)temp, " Alloc:");

+        value = &pool->values[pool->sig_alloc_sizes];

+        loop  = pool->sig_conf_entries;

+        inUse = 0;

+        

+        while (loop--)

+        {

+            inUse += *value;

+            sprintf((char *)temp1, "%7lu", *value++);

+            strcat((char *)temp, (const char *)temp1);

+        }

+        

+        sprintf((char *)temp1, " Sum: %lu", inUse);

+        strcat((char *)temp, (const char *)temp1);

+        pool_printf("%s", (char *)temp);

+        

+        temp[0] = 0;

+        sprintf((char *)temp, " Mem..:");

+        value  = &pool->values[pool->sig_conf_sizes];

+        value1 = &pool->values[pool->sig_alloc_sizes];

+        loop   = pool->sig_conf_entries;

+        inUse  = 0;

+        

+        while (loop--)

+        {

+            inUse += (*value) * (*value1);

+            sprintf((char *)temp1, "%7lu", (*value++) * (*value1++));

+            strcat((char *)temp, (const char *)temp1);

+        }

+        

+        sprintf((char *)temp1, " Sum: %lu", inUse);

+        strcat((char *)temp, (const char *)temp1);

+        pool_printf("%s", (char *)temp);

+    }

+    

+    free_buf((union SIGNAL **)&pool);

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºlist_pools

+* ¹¦ÄÜÃèÊö£ºÁгöËùÓÐpoolÄÚ´æµÄÏêϸÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)   

+* ·µ »Ø Öµ:

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+VOID list_pools(VOID)

+{

+    struct OS_pid_list *list = get_pool_list(0);

+    

+    if (list != NULL)

+    {

+        OSBUFSIZE count = list->count;

+        unsigned int i = 0;

+        

+        for(i = 0 ; i < count; i++)

+        {

+            list_pool_info(list->list[i]);

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºlist_pool_info

+* ¹¦ÄÜÃèÊö£ºÁгö½ø³ÌÐźŵÄÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+            pid:½ø³ÌID

+            listDetail:ÊÇ·ñÁгöÏêϸÐÅÏ¢

+            (OUT)   

+* ·µ »Ø Öµ:

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+VOID list_proc_sig_info(PROCESS pid, OSBOOLEAN listDetail)

+{

+    struct OS_sig_info  sig_info    = {0};

+    PROCESS             sig_pool    = get_sig_poolid(pid);

+    struct OS_poolcb    *pool       = get_poolcb(sig_pool);

+    OSBOOLEAN           status      = get_sig_info(&sig_info, sig_pool, pid, 0);

+    

+    if (status == 5)

+    {

+        OSADDRESS       *value          = &pool->values[pool->sig_conf_sizes];

+        OSADDRESS       loop            = pool->sig_conf_entries;

+        int             sig_alloc[10]   = {0};

+        OSADDRESS       sigptr          = sig_info.next;

+        CHAR            thread_name[64] = {0};

+        CHAR            temp[100]       = {0};

+        CHAR            temp1[100]      = {0};

+        unsigned int    i               = 0;

+        struct OS_pcb   *pPcb           = get_pcb(pid);

+        

+        if (NULL != pPcb && OS_ILLEGAL != pPcb->type)

+        {

+            strcpy((char *)thread_name, &pPcb->strings[pPcb->name]);

+            free_buf((union SIGNAL **)&pPcb);

+            pool_printf("Signals owned by process %s(%#lx)", (char *)thread_name, pid);

+        }

+        

+        if (listDetail > 0)

+        {

+            pool_printf("%10s %10s %10s %10s %10s %10s %10s", "sigptr", "sig_no", "owner", "sender_pid", "addressee_pid", "sig_size", "size_in_pool");

+        }

+        while (sigptr > 0)

+        {

+            status = get_sig_info(&sig_info, sig_pool, pid, sigptr);

+            

+            switch (status)

+            {

+            case 1:

+                {

+                    for (i = 0; i < loop; i++)

+                    {

+                        if (sig_info.sig_size <= value[i])

+                        {

+                            sig_alloc[i]++;

+                        }

+                        else

+                        {

+                            break;

+                        }

+                    }

+                    

+                    break;

+                }

+            case 2:

+                {

+                    pool_printf("No valid endmark found");

+                    break;

+                }

+            case 3:

+                {

+                    pool_printf("The signal's administration block is faulty");

+                    return; /* Not safe to continue */

+                }

+            case 4:

+                {

+                    pool_printf("The signal's address is wild (inside a pool)");

+                    return; /* Not safe to continue */

+                }

+            case 5:

+                {

+                    pool_printf("The signal's address is wild (not inside any pool)");

+                    return; /* Not safe to continue */

+                }

+            default:

+                {

+                    return;

+                }

+            }

+            

+            if (listDetail > 0)

+            {

+                pool_printf("%#10lx %#10lx %#10lx %#10lx %#10lx %10ld %10ld", sigptr, sig_info.sig_no, sig_info.owner, \

+                            sig_info.sender_pid, sig_info.addressee_pid, sig_info.sig_size, sig_info.size_in_pool);

+            }

+            

+            sigptr = sig_info.next;

+        }

+        

+        pool_printf("statistics:");

+        

+        temp[0] = 0;

+        sprintf((char *)temp, " Conf.: ");

+        for (i = 0; i < loop; i++) 

+        {

+            sprintf((char *)temp1, "%7lu", value[i]);

+            strcat((char *)temp, (const char *)temp1);

+        }

+        

+        pool_printf("%s", (char *)temp);

+        

+        temp[0] = 0;

+        sprintf((char *)temp, " Alloc:");

+        

+        for (i = 0; i < loop; i++) 

+        {

+            sprintf((char *)temp1, "%7lu", sig_alloc[i]);

+            strcat((char *)temp, (const char *)temp1);

+        }

+        

+        pool_printf("%s", (char *)temp);

+        pool_printf("--------------------------------------------------------------------------------");

+    }

+    

+    free_buf((union SIGNAL **)&pool);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºlist_all_sig_info

+* ¹¦ÄÜÃèÊö£ºÁгöËùÓнø³ÌÐźŵÄÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)   

+* ·µ »Ø Öµ:

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+VOID list_all_sig_info(VOID)

+{

+    struct OS_pid_list  *bidlist    = NULL;

+    struct OS_pid_list  *pidlist    = NULL;

+    OSBUFSIZE           bid_count   = 0;

+    OSBUFSIZE           pid_count   = 0;

+    unsigned int        i           = 0;

+    unsigned int        j           = 0;

+    

+    bidlist     = get_bid_list(0);

+    bid_count   = bidlist->count;

+    

+    for(i = 0; i < bid_count; i++)

+    {

+        pidlist = get_pid_list(bidlist->list[i]);

+        if(pidlist != NULL)

+        {

+            pid_count = pidlist->count;

+            

+            for(j = 0; j < pid_count; j++)

+            {

+                list_proc_sig_info(pidlist->list[j], 0);

+            }

+            

+            free_buf((union SIGNAL **)&pidlist);

+        }

+        else

+        {

+            continue;

+        }

+    }

+    

+    free_buf((union SIGNAL **)&bidlist);

+}

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/ose/src/ose_ramdump_arm.c b/cp/ps/plat/src/oss/osa/ose/src/ose_ramdump_arm.c
new file mode 100644
index 0000000..9cf63b8
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/ose/src/ose_ramdump_arm.c
@@ -0,0 +1,891 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : ose_ramdump_arm.c 

+* ÎÄ ¼þ Ãû : ose_ramdump_arm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ¶Ôramdump½øÐÐÓÅ»¯

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/02/17

+* ÆäËü˵Ã÷ :          

+**************************************************************************/

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/09/15

+* ÐÞ¸ÄÄÚÈÝ : PC-LINT¼ì²éÓÚ±àÂë¹æ·¶ÐÞ¸Ä EC: 617001781881  

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : junkuiZhao

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC: 617001781957

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "ose_typedef.h" 

+#include "oss_api.h"

+#include "sysparam.h"

+#include "ose_ramdump_arm.h"

+#include "drvs_usbpoll.h"

+#include "ose_spi/exception.h"

+

+#ifdef _USE_ARM1_RAMDUMP

+#include "drvs_icp.h"

+#include "ps_ephy_interface.h"

+#endif

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define  RAMDUMP_DIR_NAME           "ramdump_dir"       /* ±£´æramdumpĿ¼Ãû    */

+#define  RAMDUMP_ARM0_FILE_NAME     "arm0_memory.bin"   /* ±£´æarm0ÄÚ´æÎļþÃû   */

+#define  RAMDUMP_ARM1_FILE_NAME     "arm1_memory.bin"   /* ±£´æarm1ÄÚ´æÎļþÃû   */

+    

+#define  RAMDUMP_FLAG               0x22222222

+

+/* io read/write buffer: [msg][data] */

+#define RAMDUMP_IO_DATA_BASE(addr)  ((UINT32)addr + 4)

+

+/* T_RamdumpCmmFileInfo */

+#define CMM_FILE_BUF_SIZE(addr)     (*(UINT32 *)addr)

+#define CMM_FILE_BUF_BASE(addr)     ((UINT32)addr + 4)

+

+#ifdef _USE_ARM1_RAMDUMP

+#define ARM0_NOFITY_ARM1                \

+        ramdump_send_msg_to_arm1();     \

+        *(UINT32 *)HIGHMEM_ARM1_FLAG_ARM02ARM1_BASE = RAMDUMP_FLAG

+    

+#define ARM0_WAIT_ARM1                  \

+        while ( RAMDUMP_FLAG != *(volatile UINT32*)HIGHMEM_ARM1_FLAG_ARM12ARM0_BASE ){}

+          

+#ifdef _USE_PSM

+extern  SINT32 zOss_PsmGetSleepFlag(VOID);  /* arm1˯Ãß±êÖ¾½Ó¿Ú */

+extern  VOID   zL1e_WriteWakeUpEphyToRam(VOID);

+#ifdef _USE_PSM_NEW_FRAMEWORK

+#define ARM0_WAIT_DDR1_READY

+#else

+#define ARM0_WAIT_DDR1_READY            \

+        zL1e_WriteWakeUpEphyToRam();    \

+        while ( PSM_DEEP_SLEEP == (UINT32)zOss_PsmGetSleepFlag()){}

+#endif

+#endif

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    UINT32  buf_size;

+    CHAR    buf[1];

+}T_RamdumpCmmFileInfo;

+

+typedef struct

+{

+   UINT32   start_addr;

+   UINT32   end_addr;

+   UINT32   map_start_addr;

+   UINT32   copy_start_addr;

+}T_RamdumpRegion;

+

+typedef struct

+{

+   UINT32           region_num;

+   T_RamdumpRegion  regions[1];         /* ºóÐø¿ÉÄÜ»¹ÓÐÊý¾Ý */

+}T_RamdumpRegionInfo;

+

+typedef struct

+{

+    CHAR   fileName[DUMPFILENMAE_LEN];  /* ÎļþÃû           */

+    UINT32 baseAddr;                    /* ÄÚ´æ»ùµØÖ·       */

+    UINT32 size;                        /* ´óС             */

+}T_RamdumpFile;

+

+typedef struct

+{

+    UINT32          fileNum;            /* Îļþ¸öÊý         */

+    T_RamdumpFile   fileInfo[1];        /* ºóÐø¿ÉÄÜ»¹ÓÐÊý¾Ý */

+}T_RamdumpFileInfo;

+

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static struct cpu_regdump *Osa_ArmExceptDump = NULL;

+static UINT8 Osa_ArmMode[6] = /* Êý×é˳ÐòÓëstruc coreÖеÄ˳ÐòÒ»Ö£¬²»Äܸü¸Ä */

+{

+    0xdf,   /* SYS  */

+    0xd3,   /* SVC  */

+    0xd7,   /* ABT  */

+    0xdb,   /* UND  */

+    0xd2,   /* IRQ  */

+    0xd1,   /* FIQ  */

+}; 

+

+static CHAR *Osa_BankRegsiter[3] = {(CHAR *)"r13", (CHAR *)"r14", (CHAR *)"spsr"};

+

+extern struct cpu_core Osa_CoreRegisters; 

+

+#ifdef _USE_ARM1_RAMDUMP

+static UINT32               HIGHMEM_ARM1_BASE           = 0;

+#endif

+static UINT32               HIGHMEM_ARM0_BASE           = 0;

+static T_RamdumpCmmFileInfo *g_cmm_file_info            = NULL;

+static UINT32               g_cmm_file_max              = 0;

+static T_RamdumpRegionInfo  *g_configured_regions_info  = NULL;

+static UINT32               g_configured_regions_max    = 0;

+static T_RamdumpRegionInfo  *g_parsed_regions_info      = NULL;

+static UINT32               g_parsed_regions_max        = 0;

+static T_RamdumpFileInfo    *g_ramdump_file_info        = NULL;

+static UINT32               g_ramdump_file_max          = 0;

+static CHAR                 *g_err_code_buf             = NULL;

+

+static T_zOss_RamdumpHookFunc g_zRamump_Hook[_USE_RAMDUMP_HOOK_NUM] = {NULL};

+

+static T_zOss_RamdumpIoOpt g_zRamdumpIoOpt = { zOss_RamdumpUsbInit,  zOss_RamdumpUsbReadData,

+                                               zOss_RamdumpUsbWriteData, zOss_RamdumpUsbFinish};

+/************************************************************************** 

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/   

+

+/**************************************************************************  

+* Íⲿº¯ÊýÉùÃ÷

+**************************************************************************/

+extern UINT32 cp15_readControlRegister( VOID );

+extern UINT32 cp15_readDomainRegister( VOID );

+extern UINT32 cp15_readTTB( VOID );

+extern UINT32 read_cpsr( VOID );

+

+extern VOID mmu_generate_info( VOID );

+extern BOOL mmu_get_readable_region( UINT32 begin, UINT32 end , UINT32 *p_begin, UINT32 *p_end );

+

+extern OSADDRESS image_text_start(void);

+extern OSADDRESS image_text_end(void);

+extern OSADDRESS image_data_start(void);

+extern OSADDRESS image_data_end(void);

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_create_cmm_file

+ * ¹¦ÄÜÃèÊö£ºÉú³Ét32½Å±¾Îļþ

+ * ²ÎÊý˵Ã÷£º(IN): 

+ *           (OUT):

+ * ·µ »Ø Öµ£º  

+ * ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID ramdump_create_cmm_file( VOID )

+{

+    char    *cmmAddress     = NULL; 

+    //char    *cmmbufferbase  = NULL;

+    UINT32  *paddress       = NULL;

+    UINT32  length          = 0;

+    UINT32  value           = 0;

+    UINT32  i               = 0;

+    UINT32  j               = 0;

+    UINT32  control_reg     = 0;

+  

+    cmmAddress  = (char *)g_cmm_file_info->buf;

+    length      = (UINT32)sprintf( cmmAddress, "ENTRY &%s\r\n", RAMDUMP_DIR_NAME );

+    cmmAddress  += length;

+

+    if(Osa_ArmExceptDump != NULL)

+    {

+        value = Osa_ArmExceptDump->pc;

+    }

+    else

+    {

+        value = Osa_CoreRegisters.supervisor.lr;

+    }

+    length      = (UINT32)sprintf(cmmAddress, "r.s pc %#lx\r\n", value);

+    cmmAddress += length;

+

+    /* Çл»µ½svcģʽ£¬»¹Ô­r0-r12 */

+    length      = (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", Osa_ArmMode[0]);

+    cmmAddress += length;

+    

+    for(i = 0; i < 13; i++)

+    {

+        length      = (UINT32)sprintf(cmmAddress, "r.s r%d %#lx\r\n", i, Osa_CoreRegisters.r[i]);

+        cmmAddress += length;

+    }

+

+    paddress = &Osa_CoreRegisters.user.sp;

+    /* Êä³ö³ýfiqÖ®ÍâµÄÆäËûģʽ±¸·Ý¼Ä´æÆ÷ */

+    for(i = 0; i < 5; i++)

+    {

+        length      = (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", Osa_ArmMode[i]);

+        cmmAddress  += length;

+        for(j = 0; j < 3; j++)

+        {

+            length      = (UINT32)sprintf(cmmAddress, "r.s %s %#lx\r\n", Osa_BankRegsiter[j], *paddress);

+            cmmAddress += length;

+            paddress++; 

+        }

+    }

+

+    /* Êä³öFIQ r8-r14 */

+    length      = (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", Osa_ArmMode[5]);

+    cmmAddress += length;

+    for(i = 8; i < 15; i++)

+    {

+        length      = (UINT32)sprintf(cmmAddress, "r.s r%d %#lx\r\n", i, *paddress);

+        cmmAddress  += length;

+        paddress++;

+    }

+    /* Êä³öFIQ spsr */

+    length      = (UINT32)sprintf(cmmAddress, "r.s spsr %#lx\r\n", *paddress);

+    cmmAddress  += length;

+

+    /* Êä³öcpsr */

+    if(Osa_ArmExceptDump != NULL)

+    {

+        switch(Osa_ArmExceptDump->vector)

+        {

+            case 0x04:/* undefined instruction */

+            {

+                value = Osa_CoreRegisters.undefined.psr;

+                break;

+            }

+            case 0x0C:/* prefetch abort */

+            {

+                value = Osa_CoreRegisters.abort.psr;

+                break;

+            }

+            case 0x10:/* data abort */

+            {

+                value = Osa_CoreRegisters.abort.psr;

+                break;

+            }

+            case 0x18:/* IRQ */

+            {

+                value = Osa_CoreRegisters.irq.psr;

+                break;

+            }

+            case 0x1C:/* FIQ */

+            {

+                value = Osa_CoreRegisters.fiq.psr;

+                break;

+            }

+            default:

+            {

+                break;

+            }

+        }

+    }

+    else

+    {

+        value = read_cpsr();

+    }

+    length      = (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", value);

+    cmmAddress += length;

+

+    control_reg = cp15_readControlRegister();

+    

+    /* ½ûÖ¹MMU */

+    length      = (UINT32)sprintf(cmmAddress, "per.s c15:0x1 %%long %#lx\r\n", (control_reg & 0xfffffffe));

+    cmmAddress += length;

+

+    /* Êä³öramdumpÎļþ */

+    for ( i = 0; i < g_parsed_regions_info->region_num; i++)

+    {   

+        length      = (UINT32)sprintf(cmmAddress, "data.load.binary &%s\\%s_%d %#lx--%#lx /noclear\r\n",RAMDUMP_DIR_NAME, RAMDUMP_ARM0_FILE_NAME,i,

+                              g_parsed_regions_info->regions[i].start_addr ,g_parsed_regions_info->regions[i].end_addr);

+        cmmAddress += length;

+    }

+  

+    /* Êä³öcp15 c1 MMU¿ØÖƼĴæÆ÷ */

+    control_reg = cp15_readControlRegister();

+    length      = (UINT32)sprintf(cmmAddress, "per.s c15:0x1 %%long %#lx\r\n", control_reg);

+    cmmAddress += length;

+    

+    /* Êä³öcp15 c2 MMUÒ³±í¼Ä´æÆ÷ */

+    control_reg = cp15_readTTB();

+    length      = (UINT32)sprintf(cmmAddress, "per.s c15:0x2 %%long %#lx\r\n", control_reg);

+    cmmAddress += length;

+    

+    /* Êä³öcp15 c3 MMUÓò¼Ä´æÆ÷ */

+    control_reg = cp15_readDomainRegister();

+    length      = (UINT32)sprintf(cmmAddress, "per.s c15:0x3 %%long %#lx\r\n", control_reg);

+    cmmAddress += length;

+

+    /* Êä³ö½áÊø·û */

+    length      = (UINT32)sprintf(cmmAddress, "ENDDO\r\n");

+    cmmAddress += length;

+

+    g_cmm_file_info->buf_size = (UINT32)(cmmAddress - (char *)g_cmm_file_info->buf);

+    zOss_AssertExN( g_cmm_file_info->buf_size <= g_cmm_file_max );

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_transfer_data

+ * ¹¦ÄÜÃèÊö£º ÓëPC²à¹¤¾ß½øÐн»»¥£¬´«µÝÐèÒª±£´æµÄÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN): 

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_transfer_data( VOID )

+{

+    UINT32          *reqCmd     = NULL;

+    UINT32          *rspCmd     = NULL;

+    UINT32          rspDataLen  = 0;

+    CHAR            *reqBuffer  = NULL;

+    CHAR            *rspBuffer  = NULL;

+    T_RamdumpFile   *fileInfo   = NULL;

+    

+    reqBuffer = (CHAR *)HIGHMEM_ARM0_IO_READBUF_BASE;

+    rspBuffer = (CHAR *)HIGHMEM_ARM0_IO_WRITEBUF_BASE;

+    rspCmd    = (UINT32 *)rspBuffer;

+    reqCmd    = (UINT32 *)reqBuffer;

+    fileInfo  = g_ramdump_file_info->fileInfo;

+

+    g_zRamdumpIoOpt.init();

+    

+    for(;;)

+    {

+        /* ´ÓͨѶ¿Ú¶ÁÊý¾Ý */

+        g_zRamdumpIoOpt.read((UINT8 *)reqBuffer, CMD_BUFFER_LEN);

+        switch (*reqCmd)

+        {

+            case DUMPFILE_LINK_REQ:    /* ͬ²½ÇëÇó */

+            {

+                T_DUMPFILE_LINK_RSP *rspMsg = NULL;

+                *rspCmd                     = DUMPFILE_LINK_RSP;

+                rspMsg                      = (T_DUMPFILE_LINK_RSP *)RAMDUMP_IO_DATA_BASE(rspBuffer);

+                rspMsg->fileNum             = g_ramdump_file_info->fileNum;

+                rspDataLen                  = sizeof(*rspCmd) + sizeof(T_DUMPFILE_LINK_RSP);

+                break;

+            }

+            

+            case DUMPFILE_FILE_REQ:    /* ¶ÁÈ¡ÎļþÐÅÏ¢£¬¿ªÊ¼´«ÊäÎļþÇëÇó */

+            {

+                T_DUMPFILE_FILE_REQ *reqMsg = NULL;

+                T_DUMPFILE_FILE_RSP *rspMsg = NULL;

+                *rspCmd                     = DUMPFILE_FILE_RSP;

+                reqMsg                      = (T_DUMPFILE_FILE_REQ *)RAMDUMP_IO_DATA_BASE(reqBuffer);

+                rspMsg                      = (T_DUMPFILE_FILE_RSP *)RAMDUMP_IO_DATA_BASE(rspBuffer);

+

+                /* ÅжÏÎļþ±àºÅÊÇ·ñÕýÈ· */

+                if (reqMsg->fileNo < g_ramdump_file_info->fileNum)

+                {

+                    strcpy((char *)rspMsg->fileName, (char *)fileInfo[reqMsg->fileNo].fileName);

+                    rspMsg->size    = fileInfo[reqMsg->fileNo].size;

+                    rspDataLen      = sizeof(*rspCmd) + sizeof(T_DUMPFILE_FILE_RSP);

+                }

+                else

+                {

+                    *rspCmd     = DUMPFILE_NO_FAIL;

+                    rspDataLen  = sizeof(*rspCmd);

+                }

+

+                break;

+            }

+            

+            case DUMPFILE_READ_REQ:     /* ¶ÁÈ¡ÎļþÄÚÈÝ */

+            {

+                T_DUMPFILE_READ_REQ *reqMsg = NULL;

+                *rspCmd                     = DUMPFILE_READ_RSP;

+                rspDataLen                  = sizeof(*rspCmd);

+                reqMsg                      = (T_DUMPFILE_READ_REQ *)RAMDUMP_IO_DATA_BASE(reqBuffer);

+

+                if (reqMsg->fileNo >= g_ramdump_file_info->fileNum) 

+                {

+                    *rspCmd = DUMPFILE_LENGTH_FAIL;

+                    break;

+                }

+                

+                if (reqMsg->offset + reqMsg->length > fileInfo[reqMsg->fileNo].size)

+                {

+                    *rspCmd = DUMPFILE_NO_FAIL;

+                    break;

+                }

+

+                g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, rspDataLen);

+                g_zRamdumpIoOpt.write((UINT8 *)(fileInfo[reqMsg->fileNo].baseAddr + reqMsg->offset), reqMsg->length);

+                continue;/* ¼ÌÐøÖ´ÐÐÏÂÒ»´Î¶Á */

+            }

+            

+            case DUMPFILE_END_REQ:     /* ´«Êä½áÊø */

+            {

+                *rspCmd     = DUMPFILE_END_RSP;

+                rspDataLen  = sizeof(*rspCmd);

+                g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, rspDataLen);

+                g_zRamdumpIoOpt.finish();

+                return;

+            }

+            

+            default:                    /* ´íÎóÖ¸Áî */

+            {

+                *rspCmd     = DUMPFILE_CMD_FAIL;

+                rspDataLen  = sizeof(*rspCmd);

+                break;

+            }

+        }

+

+        /* ÏòͨѶ¿ÚдÊý¾Ý */

+        g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, rspDataLen);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_save_all_files_info

+ * ¹¦ÄÜÃèÊö£º½«ÎļþÐÅÏ¢±£´æÖÁ¸ß¶ÎÄÚ´æ

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_save_file_info( const CHAR *name, UINT32 base_addr, UINT32 size )

+{

+    T_RamdumpFile *pfileInfo = NULL;

+

+    zOss_AssertExN(name != NULL);

+    

+    pfileInfo = g_ramdump_file_info->fileInfo + g_ramdump_file_info->fileNum;

+    strcpy( (char *)pfileInfo->fileName, (const char *)name );

+    pfileInfo->baseAddr = base_addr;

+    pfileInfo->size     = size;

+    

+    g_ramdump_file_info->fileNum ++;

+    zOss_AssertExN( g_ramdump_file_info->fileNum < g_ramdump_file_max); 

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_save_all_files_info

+ * ¹¦ÄÜÃèÊö£ºÕûÀíÄÚ´æ¿éµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_save_region_file_info( T_RamdumpRegionInfo *p_region_info, const CHAR *file_name )

+{

+    UINT32  i                       = 0;

+    CHAR    name[DUMPFILENMAE_LEN]  = {0};

+    zOss_AssertExN(p_region_info != NULL);

+    

+    for (; i < p_region_info->region_num; i++ )

+    {

+        sprintf((char *)name, "%s_%d", file_name, i );

+        ramdump_save_file_info( name, 

+                                p_region_info->regions[i].start_addr,

+                               (p_region_info->regions[i].end_addr - p_region_info->regions[i].start_addr) + 1 );

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_save_all_files_info

+ * ¹¦ÄÜÃèÊö£ºÕûÀíµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_save_all_files_info( VOID )

+{

+    UINT32 arm0_errcode_len = 0;

+#ifdef _USE_ARM1_RAMDUMP

+    UINT32 arm1_errcode_len = 0;

+#endif

+

+    ramdump_save_region_file_info( g_parsed_regions_info, (const CHAR *)RAMDUMP_ARM0_FILE_NAME );

+    ramdump_save_file_info( (const CHAR *)"arm0_targetstate.cmm", (UINT32)g_cmm_file_info->buf, g_cmm_file_info->buf_size );

+

+    arm0_errcode_len = strlen((const char *)g_err_code_buf );

+#ifndef _USE_ARM1_RAMDUMP

+    ramdump_save_file_info( (const CHAR *)"err_log.txt", (UINT32)g_err_code_buf, arm0_errcode_len );

+#else

+    arm1_errcode_len = strlen( (char *)HIGHMEM_ARM1_ERR_CODE_BASE );

+    strcpy( (char *)(g_err_code_buf + arm0_errcode_len), (char *)HIGHMEM_ARM1_ERR_CODE_BASE );

+    ramdump_save_file_info( "err_log.txt", (UINT32)g_err_code_buf, (arm0_errcode_len + arm1_errcode_len ));

+    

+    ramdump_save_region_file_info( (T_RamdumpRegionInfo *)HIGHMEM_ARM1_PARSED_REGION_BASE, RAMDUMP_ARM1_FILE_NAME );

+    ramdump_save_file_info( "arm1_targetstate.cmm", CMM_FILE_BUF_BASE(HIGHMEM_ARM1_CMM_INFO_BASE), CMM_FILE_BUF_SIZE(HIGHMEM_ARM1_CMM_INFO_BASE) );

+#endif

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º  ramdump_get_available_region

+ * ¹¦ÄÜÃèÊö£º  ¶ÔĬÈÏÅäÖõÄÄÚ´æ¿éÊý¾ÝÓëMMU½âÎöµÄÄÚ´æ¿éÊý¾Ý¶Ô±È£¬

+               ±£´æ¿Éµ¼³öÀ´µÄÄÚ´æ¿é

+ * ²ÎÊý˵Ã÷£º (IN):  ÄÚ´æ¿éµÄÆðʼµØÖ·memAddBegin£¬½áÊøµØÖ·end,½âÎöºóÄÚ´æ¿éÊý

+                     ¾ÝµÄдÈëµØÖ·memorybase

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_get_available_region( UINT32 memAddBegin, UINT32 end, UINT32 map_base, UINT32 copy_base,UINT32 memorybase )

+{

+    UINT32 region_start = 0;

+    UINT32 region_end   = 0;

+    UINT32 region_cnt   = 0;

+    UINT32 *addr        = NULL;

+    

+    zOss_ASSERT( memAddBegin <= end );

+

+    region_cnt = *(UINT32 *)memorybase; /* ÒÑÓÐÄÚ´æ¿éÊýÄ¿ */

+    zOss_AssertExN( region_cnt < g_parsed_regions_max );

+    addr = (UINT32 *)memorybase + region_cnt * 4 + 1;   /* ¼ÆËãµØÖ·Æ«ÒÆ */

+    while ( mmu_get_readable_region(memAddBegin, end, &region_start, &region_end) )

+    {

+        *addr++ = region_start;

+        *addr++ = region_end;

+        if(map_base != memAddBegin)

+        {

+           *addr++ = map_base  + region_start - memAddBegin;

+        }

+        else

+        {

+           *addr++ = map_base;

+        }

+        if(copy_base != 0)

+        {

+            *addr++ = copy_base + region_start - memAddBegin;

+        }

+        else

+        {

+            *addr++ = 0;

+        }

+        region_cnt ++;

+ 

+        memAddBegin = region_end + 1;

+        if (memAddBegin < region_end) break;

+    }

+    *(UINT32 *)memorybase = region_cnt;

+}

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_parse_region_info

+ * ¹¦ÄÜÃèÊö£º½âÎöÄÚ´æ¿éÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN): ĬÈÏÅäÖõØÖ·£¬½âÎöÍê³ÉµØÖ·

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_parse_region_info( UINT32 configured_region_base, UINT32 parsed_region_base )

+{   

+    UINT32 i = 0;

+    T_RamdumpRegionInfo *p_configured_info = NULL;

+    T_RamdumpRegionInfo *p_parsed_info     = NULL;

+

+    p_configured_info = (T_RamdumpRegionInfo *)configured_region_base;

+    p_parsed_info     = (T_RamdumpRegionInfo *)parsed_region_base;

+    

+    for ( ; i < p_configured_info->region_num; i++ )

+    {

+        ramdump_get_available_region( p_configured_info->regions[i].start_addr,

+                                      p_configured_info->regions[i].end_addr,

+                                      p_configured_info->regions[i].map_start_addr,

+                                      p_configured_info->regions[i].copy_start_addr,

+                                      (UINT32)p_parsed_info );

+    }

+}

+#ifdef _USE_ARM1_RAMDUMP

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_send_msg_to_arm1

+ * ¹¦ÄÜÃèÊö£º Arm0 ICP ÏûÏ¢ID·¢Ëͺ¯Êý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_send_msg_to_arm1( VOID )

+{

+    T_HalIcp_Msg icp_msg;

+

+    zOss_Memset(&icp_msg, 0, sizeof(icp_msg));

+    

+    icp_msg.SrcModId            = ICP_ARM0_MODULE_ID_OS;

+    icp_msg.desModId            = ICP_ARM1_MODULE_ID_OS;

+    icp_msg.IntInfo.high_word   = ZPLAT_LTE_ICP_ARM02ARM1_RAMDUMP_CF;

+    zDrvIcp_SendMsg( (const T_HalIcp_Msg *)&icp_msg );

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_process_msg_from_arm1

+ * ¹¦ÄÜÃèÊö£º Arm0 ICPÏûÏ¢½ÓÊÜ´¦Àíº¯Êý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_process_msg_from_arm1( const T_HalIcp_Msg *pMsg )

+{

+    T_HalIcp_Dword state = { 0 };

+   

+    zDrvIcp_GetState( ICP_MSG_ACTOR_ARM, &state );

+    zDrvIcp_ClearState( ICP_MSG_ACTOR_ARM, state  );

+

+    /* ¼Ç¼ËÀ»ú·½Ê½ */

+    strcpy( (char *)g_err_code_buf, "arm0: force error!" );

+

+    /* ʹµÃarm0²úÉúÒì³££¬ÒԱ㿪ʼramdump */

+    zOss_ASSERT( FALSE );

+}

+#endif  

+

+/*****************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+******************************************************************************/

+/*****************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpConfigureMem

+ * ¹¦ÄÜÃèÊö£º ±£´æÄÚ´æ¶ÎÊý¾ÝÅäÖÃÐÅÏ¢

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                 base:      ÅäÖÃÄÚ´æ¶ÎÔÚARM0²à¿´¼ûÆðʼµØÖ·£»

+ *                 size :     ÅäÖÃÄÚ´æ¶Î´óС£»

+ *                 map_base:  ÅäÖÃÄÚ´æ¶ÎÔÚ×ÔÉí²à¿´µ½µÄÆðʼµØÖ·£»

+ *                 copy_base: ramdump¹ý³ÌÖÐÐèÒª½«Ìض¨Êý¾Ý¿½±´µ½Ö¸¶¨µÄÄÚ´æµÄµØÖ·£¬

+ *                            ²»ÐèÒªÇëÖÃ0 [base , size]:[copy_base , size ]

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+******************************************************************************/

+VOID zOss_RamdumpConfigureMem( UINT32 base, UINT32 size ,UINT32 map_base ,UINT32 copy_base )

+{

+    if (size == 0)

+        return;

+    if ((size - 1) > (0xFFFFFFFF - base))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "Hello,ÄÚ´æ¶ÎµØÖ·ÅäÖôíÎó,Çë²éѯºóÔÙʹÓÃ!");

+        return;

+    }

+    zOss_AssertExN( g_configured_regions_info->region_num < g_configured_regions_max);

+    g_configured_regions_info->regions[g_configured_regions_info->region_num].start_addr        = base;

+    g_configured_regions_info->regions[g_configured_regions_info->region_num].end_addr          = base + size - 1;

+    g_configured_regions_info->regions[g_configured_regions_info->region_num].map_start_addr    = map_base;

+    g_configured_regions_info->regions[g_configured_regions_info->region_num].copy_start_addr   = copy_base;

+    (g_configured_regions_info->region_num)++;

+}

+ 

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpHndInit

+ * ¹¦ÄÜÃèÊö£º µØÖ·È«¾Ö±äÁ¿³õʼ»¯,»ñÈ¡ramdumpÄÚ´æ¿éĬÈÏÅäÖÃ

+                                  arm0ºÍarm1ͬ²½»úÖÆ

+ * ²ÎÊý˵Ã÷£º (IN):

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpInit( VOID )

+{  

+    UINT32 base = 0;

+    UINT32 size = 0;

+    UINT32 map_base     = 0;

+    UINT32 copy_base    = 0;

+

+    /*==========================================

+          µØÖ·È«¾Ö±äÁ¿³õʼ»¯

+    ==========================================*/

+    sysparam_readattr_long( "krn/region/highmemory", "base", (long *)&HIGHMEM_ARM0_BASE );

+    #ifdef _USE_ARM1_RAMDUMP

+    sysparam_readattr_long( "krn/region/highmemory_arm1", "base", (long *)&HIGHMEM_ARM1_BASE );

+    #endif

+    g_cmm_file_info             = (T_RamdumpCmmFileInfo * )HIGHMEM_ARM0_CMM_INFO_BASE;

+    g_cmm_file_info->buf_size   = 0;

+    g_cmm_file_max              = (HIGHMEM_CMM_INFO_SIZE - 4);/* 4±íʾ½á¹¹µÚÒ»¸ö³ÉÔ±µÄ´óС£¬ÏÂͬ */ 

+    

+    g_configured_regions_info               = (T_RamdumpRegionInfo *)(HIGHMEM_ARM0_CONFIGURED_REGION_BASE);

+    g_configured_regions_info->region_num   = 0;

+    g_configured_regions_max                = (HIGHMEM_CONFIGURED_REGION_SIZE - 4) / sizeof(T_RamdumpRegion);

+    

+    g_parsed_regions_info               = (T_RamdumpRegionInfo *)(HIGHMEM_ARM0_PARSED_REGION_BASE);

+    g_parsed_regions_info->region_num   = 0;

+    g_parsed_regions_max                = (HIGHMEM_PARSED_REGION_SIZE - 4) / sizeof(T_RamdumpRegion);

+

+    g_ramdump_file_info             = (T_RamdumpFileInfo *)HIGHMEM_ARM0_FILE_INFO_BASE;

+    g_ramdump_file_info->fileNum    = 0;

+    g_ramdump_file_max              = (HIGHMEM_FILE_INFO_SIZE - 4) / sizeof(T_RamdumpFile);

+

+    g_err_code_buf = (CHAR *)HIGHMEM_ARM0_ERR_CODE_BASE;

+    zOss_Memset( g_err_code_buf, 0, (UINT32)HIGHMEM_ERR_CODE_SIZE );

+    strcpy( (char *)g_err_code_buf, "arm0: exact error!" );

+   

+    /*==========================================================

+          ramdumpÄÚ´æ¿éĬÈÏÅäÖÃ,ĬÈÏÅäÖÃ˳Ðò²»Òª¸Ä¶¯

+    ==========================================================*/

+    /*  ´úÂë¶Î */

+    base = image_text_start();

+    size = (image_text_end() - base) + 1;

+    map_base    = base;

+    copy_base   = 0;

+    zOss_RamdumpConfigureMem( base, size , map_base , copy_base);

+   

+     /*  Êý¾Ý¶Î */

+    base = image_data_start();

+    size = (image_data_end() - base) + 1;

+    map_base    = base;

+    copy_base   = 0;

+    zOss_RamdumpConfigureMem( base, size , map_base , copy_base);

+ 

+     /*  ¶Ñ¶Î */

+    sysparam_readattr_long( "krn/log_mem/RAM", "base", (long *)&base );

+    sysparam_readattr_long( "krn/log_mem/RAM", "size", (long *)&size );

+    map_base    = base;

+    copy_base   = 0;

+    zOss_RamdumpConfigureMem( base, size , map_base , copy_base);

+     

+     /* ARMÖжÏÏòÁ¿¶Î */

+    sysparam_readattr_long( "krn/region/vectors", "base", (long *)&base );

+    sysparam_readattr_long( "krn/region/vectors", "size", (long *)&size );

+    map_base    = base;

+    copy_base   = 0;

+    zOss_RamdumpConfigureMem( base, size , map_base , copy_base);

+

+     /* highmemory */

+    sysparam_readattr_long( "krn/region/highmemory", "base", (long *)&base );

+    sysparam_readattr_long( "krn/region/highmemory", "size", (long *)&size );

+    map_base    = base;

+    copy_base   = 0;

+    zOss_RamdumpConfigureMem( base, size , map_base , copy_base);

+    

+#ifdef _USE_ARM1_RAMDUMP    

+    /*==========================================

+          arm0ºÍarm1ͬ²½»úÖÆ

+    ==========================================*/

+    /* *(volatile UINT32 *)HIGHMEM_ARM1_FLAG_ARM12ARM0_BASE = RAMDUMP_FLAG ; */

+    *(volatile UINT32 *)HIGHMEM_ARM1_FLAG_ARM02ARM1_BASE = 0;

+    zDrvIcp_RegCallback( ICP_ARM0_MODULE_ID_OS, ICP_ARM1_MODULE_ID_OS, ramdump_process_msg_from_arm1, ICP_ISR_CALLBACK ); 

+#endif

+    

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpMain

+ * ¹¦ÄÜÃèÊö£º RAMDUMP´¦ÀíÖ÷º¯Êý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *            (OUT):

+ * ·µ »Ø Öµ£º    

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpMain( VOID )

+{   

+    UINT32 cnt = 0;

+        

+    mmu_generate_info();

+    ramdump_parse_region_info( (UINT32)g_configured_regions_info , (UINT32)g_parsed_regions_info);

+    ramdump_create_cmm_file();

+    

+#ifdef _USE_ARM1_RAMDUMP

+#ifdef _USE_PSM

+    ARM0_WAIT_DDR1_READY;

+#endif   

+    ramdump_parse_region_info(HIGHMEM_ARM1_CONFIGURED_REGION_BASE, HIGHMEM_ARM1_PARSED_REGION_BASE);

+

+    ARM0_NOFITY_ARM1;

+    ARM0_WAIT_ARM1;

+#endif   

+

+    /*Ö´ÐÐramdumpÊý¾Ý´¦Àíº¯Êý*/

+    ramdump_save_all_files_info();

+

+    for (cnt = 0; cnt < _USE_RAMDUMP_HOOK_NUM; cnt++)

+    {

+        if (g_zRamump_Hook[cnt])

+        {

+            g_zRamump_Hook[cnt]();

+        }

+    }

+    

+    ramdump_transfer_data();

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpforEncodeError

+ * ¹¦ÄÜÃèÊö£º Ϊ´íÎóÂë½âÎö·ÖÅäÄÚ´æµØÖ·¿Õ¼ä

+ * ²ÎÊý˵Ã÷£º (IN): 

+ *            (OUT): »ùÖ·ºÍ´óС

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpforEncodeError( UINT32 *p_base ,UINT32 *p_size )

+{  

+    UINT32 len  = strlen( (char *)HIGHMEM_ARM0_ERR_CODE_BASE );

+

+    zOss_AssertExN(p_base != NULL && p_size != NULL);

+    

+    *p_base = HIGHMEM_ARM0_ERR_CODE_BASE + len;

+    *p_size = (HIGHMEM_ERR_CODE_SIZE - len) - 1;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpForceException

+ * ¹¦ÄÜÃèÊö£º Ç¿ÖÆ²úÉúÒì³£,ÒÔ±ãramdump

+ * ²ÎÊý˵Ã÷£º (IN): 0:ARMÒì³£ 1: ¶ÏÑÔÒì³£ 2: ²Ù×÷ϵͳ¶ÏÑÔÒì³£

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpForceException( UINT32 type )

+{   

+    CHAR *errlogBase = (CHAR *)HIGHMEM_ARM0_ERR_CODE_BASE ;

+    strcpy((char *)errlogBase, "arm0: force error!");

+    

+    if ( 0 == type )

+    {   

+        assert(FALSE);

+    }

+    else

+    {   

+        zOss_ASSERT(FALSE);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumHookInstall

+ * ¹¦ÄÜÃèÊö£º RAMDUMP¶ÔÍâÌṩµÄ×¢²á°²×°½Ó¿Ú

+ * ²ÎÊý˵Ã÷£º (IN): 

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpHookInstall(T_zOss_RamdumpHookFunc hook)

+{

+    UINT32 cnt = 0;

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    for (cnt = 0; cnt < _USE_RAMDUMP_HOOK_NUM; cnt++)

+    {

+        if (g_zRamump_Hook[cnt] == NULL)

+        {

+            g_zRamump_Hook[cnt] = hook;

+        }

+    }

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpSetIoOpt

+ * ¹¦ÄÜÃèÊö£º ÉèÖÃramdump Io ͨµÀ£»

+ * ²ÎÊý˵Ã÷£º (IN): 

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpSetIoOpt(T_zOss_RamdumpIoOpt hook)

+{

+    g_zRamdumpIoOpt.init    = hook.init;

+    g_zRamdumpIoOpt.read    = hook.read;

+    g_zRamdumpIoOpt.write   = hook.write;

+    g_zRamdumpIoOpt.finish  = hook.finish;    

+}

+

+#ifdef __cplusplus

+}

+#endif

+

+

diff --git a/cp/ps/plat/src/oss/osa/ose/ws/makefile b/cp/ps/plat/src/oss/osa/ose/ws/makefile
new file mode 100644
index 0000000..7b81ddf
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/ose/ws/makefile
@@ -0,0 +1,49 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: Makefile

+#* ÄÚÈÝÕªÒª: °üº¬OSA_OSEºÍCommonÁ½¸öÄ£¿é

+#* ʹÓ÷½·¨:     

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2013/01/01      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+include $(PRJ_PATH)/config/project.mk

+

+#===============================================================================

+#·¾¶ÉèÖÃ

+#===============================================================================

+_SUBSYS_NAME = plat_osa_ose

+

+_SUBSYS_LIB_PATH = $(PLAT_LIB_INTERNAL_PATH)

+

+_ALL_MDLS = osa_ose com

+_ALL_OBJECTS = $(wildcard $(OBJ_PATH)/plat/oss/osa/com/*.o)   \

+               $(wildcard $(OBJ_PATH)/plat/oss/osa/osa_ose/*.o)

+

+#===============================================================================

+# common

+#===============================================================================

+com:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(PLAT_PATH)/src/oss/osa/com

+comclean:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(PLAT_PATH)/src/oss/osa/com clean

+

+#===============================================================================

+# osa_ose

+#===============================================================================

+osa_ose:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(PLAT_PATH)/src/oss/osa/ose/ws -f osa_ose.mk

+osa_oseclean:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(PLAT_PATH)/src/oss/osa/ose/ws -f osa_ose.mk clean

+

+#===============================================================================

+# ±àÒë¹æÔò

+#===============================================================================

+include $(FRAME_PATH)/rules/lib_rules.mk

+

+

diff --git a/cp/ps/plat/src/oss/osa/ose/ws/osa_ose.mk b/cp/ps/plat/src/oss/osa/ose/ws/osa_ose.mk
new file mode 100644
index 0000000..9edbc04
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/ose/ws/osa_ose.mk
@@ -0,0 +1,51 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: Makefile

+#* ÄÚÈÝÕªÒª: osa_oseÄ£¿é±àÒë

+#* ʹÓ÷½·¨:     

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2013/01/01      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+include $(PRJ_PATH)/config/project.mk

+#===============================================================================

+#·¾¶ÉèÖÃ

+#===============================================================================

+_MDL_NAME = osa_ose

+

+_MDL_SRC_PATH = $(PLAT_PATH)/src/oss/osa/ose/src

+_MDL_INC_PATH = $(PLAT_PATH)/src/oss/osa/ose/inc

+_MDL_OBJ_PATH = $(OBJ_PATH)/plat/oss/osa/$(_MDL_NAME)

+

+#===============================================================================

+#¸÷Ä£¿éÒÀÀµ¹«¹²Í·ÎļþÉèÖÃ

+#===============================================================================

+INCLUDE += -I$(OSE_ROOT)/refsys/common      \

+           -I$(PLAT_PATH)/inc               \

+           -I$(PLAT_PATH)/inc/oss           \

+           -I$(PLAT_PATH)/inc/Drv           \

+           -I$(PLAT_PATH)/src/oss/osa/inc   \

+           -I$(PLAT_PATH)/src/oss/sup/inc   \

+           -I$(_MDL_INC_PATH)

+

+#===============================================================================

+#×ÓϵͳÀ©Õ¹¶¨Òå

+#===============================================================================

+DEFINE += 

+#===============================================================================

+#Ä£¿éÎļþÐÅÏ¢ 

+#=============================================================================== 

+_C_SOURCE = $(wildcard $(_MDL_SRC_PATH)/*.c)

+_s_SOURCE = $(wildcard $(_MDL_SRC_PATH)/*.s)

+_S_SOURCE =

+

+#===============================================================================

+# ±àÒë¹æÔò

+#===============================================================================

+include $(FRAME_PATH)/rules/mdl_rules.mk

+

diff --git a/cp/ps/plat/src/oss/osa/tos/inc/tos_except_arm.h b/cp/ps/plat/src/oss/osa/tos/inc/tos_except_arm.h
new file mode 100644
index 0000000..bfffd75
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/inc/tos_except_arm.h
@@ -0,0 +1,130 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_arm.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ARM´¦ÀíÆ÷Òì³£´¦ÀíÄ£¿éÍ·Îļþ

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/02/29

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _TOS_EXCEPT_ARM_H

+#define _TOS_EXCEPT_ARM_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/kernel/kapi.h>

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+struct cpu_dumpsection

+{

+  UINT32   identity;

+  UINT32   size;

+  UINT32   ddress;

+};

+

+struct cpu_regdump

+{

+  UINT32   pc;

+  UINT32   sp;

+  UINT32   sr;

+  UINT32   vector;

+  UINT32   fault_data_set;

+  UINT32   fault_data_addr;

+  UINT32   magic;

+  UINT32   no_sects;

+  struct cpu_dumpsection sect[1];

+};

+

+typedef struct cpu_mode_reg_bank 

+{

+  UINT32   sp;

+  UINT32   lr;

+  UINT32   psr;

+} CPU_REG_BANK; /* Mode specific core register bank */  

+

+struct cpu_core

+{

+  UINT32   r[13];  /* Shared r0-r12 for all modes but FIQ, FIQ has own set for r8-r12 */

+  CPU_REG_BANK  user;

+  CPU_REG_BANK  supervisor;

+  CPU_REG_BANK  abort;

+  CPU_REG_BANK  undefined;

+  CPU_REG_BANK  irq;

+

+  UINT32        fiq_r8;

+  UINT32        fiq_r9;

+  UINT32        fiq_r10;

+  UINT32        fiq_r11;

+  UINT32        fiq_r12;

+  CPU_REG_BANK  fiq;

+  UINT32           fault_status;

+};  /* Complete set of core registers */                  

+

+#ifndef __ARMCC_VERSION

+typedef struct

+{

+    

+} tos_except_register_t;

+#endif

+

+typedef struct 

+{

+    cyg_code_t  nr;

+    const CHAR  *exp;

+    const CHAR  *file;

+    const CHAR  *func;

+    int         line;

+    BOOL        trace_flag;

+} tos_except_t;

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+extern char *ramdump_error_log_exp(char *mem);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _TOS_EXCEPT_ARM_H */

+

+

+

diff --git a/cp/ps/plat/src/oss/osa/tos/inc/tos_except_cortexm.h b/cp/ps/plat/src/oss/osa/tos/inc/tos_except_cortexm.h
new file mode 100644
index 0000000..d9e95e1
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/inc/tos_except_cortexm.h
@@ -0,0 +1,113 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_arm.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ARM´¦ÀíÆ÷Òì³£´¦ÀíÄ£¿éÍ·Îļþ

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/02/29

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _TOS_EXCEPT_CORTEXM_H

+#define _TOS_EXCEPT_CORTEXM_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/kernel/kapi.h>

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+struct cpu_dumpsection

+{

+  UINT32   identity;

+  UINT32   size;

+  UINT32   ddress;

+};

+

+struct cpu_regdump

+{

+  UINT32   pc;

+  UINT32   sp;

+  UINT32   sr;

+  UINT32   vector;

+  UINT32   fault_data_set;

+  UINT32   fault_data_addr;

+  UINT32   magic;

+  UINT32   no_sects;

+  struct cpu_dumpsection sect[1];

+};

+

+struct cpu_core

+{

+  UINT32   r[13];  /* Shared r0-r12 */

+  UINT32   sp;

+  UINT32   lr;

+  UINT32   psr;

+  UINT32   primask;

+  UINT32   control;

+};  /* Complete set of core registers */                  

+

+typedef struct 

+{

+    

+} tos_except_register_t;

+

+typedef struct 

+{

+    cyg_code_t  nr;

+    const CHAR  *exp;

+    const CHAR  *file;

+    const CHAR  *func;

+    int         line;

+    BOOL        trace_flag;

+} tos_except_t;

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+extern char *ramdump_error_log_exp(char *mem);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _TOS_EXCEPT_CORTEXM_H */

+

+

+

diff --git a/cp/ps/plat/src/oss/osa/tos/inc/tos_except_csky.h b/cp/ps/plat/src/oss/osa/tos/inc/tos_except_csky.h
new file mode 100644
index 0000000..f88ba44
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/inc/tos_except_csky.h
@@ -0,0 +1,120 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_csky.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : cskycpu´¦ÀíÆ÷Òì³£´¦ÀíÄ£¿éÍ·Îļþ

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/02/29

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _TOS_EXCEPT_CSKY_H

+#define _TOS_EXCEPT_CSKY_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/kernel/kapi.h>

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct {

+    unsigned int r0;

+    unsigned int r1;

+    unsigned int r2;

+    unsigned int r3;

+    unsigned int r4;

+    unsigned int r5;

+    unsigned int r6;

+    unsigned int r7;

+    unsigned int r8;

+    unsigned int r9;

+    unsigned int r10;

+    unsigned int r11;

+    unsigned int r12;

+    unsigned int r13;

+    unsigned int r14;

+    unsigned int r15;

+

+    unsigned int psr;

+    unsigned int vbr;

+    unsigned int epsr;

+    unsigned int fpsr;

+    unsigned int epc;

+    unsigned int fpc;

+    unsigned int ss0;

+    unsigned int ss1;

+    unsigned int ss2;

+    unsigned int ss3;

+    unsigned int ss4;

+    unsigned int gcr;

+

+    unsigned int gsr;

+    unsigned int cr13;

+    unsigned int cr14;

+    unsigned int cr15;

+    unsigned int cr17;

+    unsigned int cr18;

+    unsigned int cr19;

+    unsigned int cr20;

+    unsigned int cr21;

+    unsigned int pad;

+} tos_except_register_t;

+

+typedef struct 

+{

+    cyg_code_t  nr;

+    const char  *exp;

+    const char  *file;

+    const char  *func;

+    int         line;

+    cyg_bool    trace_flag;

+} tos_except_t;

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+tos_except_register_t *tos_dump_except_register(void);

+extern char *ramdump_error_log_exp(char *mem);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _TOS_EXCEPT_CSKY_H */

+

diff --git a/cp/ps/plat/src/oss/osa/tos/inc/tos_mmu_csky.h b/cp/ps/plat/src/oss/osa/tos/inc/tos_mmu_csky.h
new file mode 100644
index 0000000..037d59c
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/inc/tos_mmu_csky.h
@@ -0,0 +1,149 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_mmu_csky.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : csky´¦ÀíÆ÷µÄmmuÅäÖÃÍ·Îļþ

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/11/22 

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ÁõÑÇÄÏ

+* °æ ±¾ ºÅ : V1.1

+* ÐÞ¸ÄÈÕÆÚ : 2012/03/09

+* ÐÞ¸ÄÄÚÈÝ : ´ÓÄÚºËÄ¿Â¼ÒÆÖ²µ½platĿ¼

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _TOS_MMU_CSKY_H

+#define _TOS_MMU_CSKY_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/infra/cyg_type.h>

+#include <pkgconf/hal_cskycpu.h>

+#include <cyg/hal/hal_arch.h>

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#ifdef CYG_HAL_CSKYCPU_MMU

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define CSKY_PAGE_CACHE_ENABLE  (3<<3)

+#define CSKY_PAGE_CACHE_DISABLE (2<<3)

+#define CSKY_PAGE_DIRTY         (1<<2)

+#define CSKY_PAGE_VALID         (1<<1)

+#define CSKY_PAGE_GLOBAL        (1<<0)

+

+#define CSKY_PAGE_SIZE_4K       (1<<12)

+#define CSKY_PAGE_SIZE_16K      (1<<14)

+#define CSKY_PAGE_SIZE_64K      (1<<16)

+#define CSKY_PAGE_SIZE_256K     (1<<18)

+#define CSKY_PAGE_SIZE_1M       (1<<20)

+#define CSKY_PAGE_SIZE_4M       (1<<22)

+#define CSKY_PAGE_SIZE_16M      (1<<24)

+#define CSKY_PAGE_SIZE_DEFAULT  (CSKY_PAGE_SIZE_16M)

+

+#define CSKY_PAGE_MASK_OFFSET   (13)

+#define CSKY_PAGE_MASK_4K       (0x000<<CSKY_PAGE_MASK_OFFSET)

+#define CSKY_PAGE_MASK_16K      (0x003<<CSKY_PAGE_MASK_OFFSET)

+#define CSKY_PAGE_MASK_64K      (0x00f<<CSKY_PAGE_MASK_OFFSET)

+#define CSKY_PAGE_MASK_256K     (0x03f<<CSKY_PAGE_MASK_OFFSET)

+#define CSKY_PAGE_MASK_1M       (0x0ff<<CSKY_PAGE_MASK_OFFSET)

+#define CSKY_PAGE_MASK_4M       (0x3ff<<CSKY_PAGE_MASK_OFFSET)

+#define CSKY_PAGE_MASK_16M      (0xfff<<CSKY_PAGE_MASK_OFFSET)

+

+#define CSKY_PFN_OFFSET         (6)

+#define CSKY_PFN_MASK           (((1<<20) - 1)<<CSKY_PFN_OFFSET)

+

+#define CSKY_VPN_OFFSET         (12)

+#define CSKY_VPN_MASK           (((1<<20) - 1)<<CSKY_VPN_OFFSET)

+

+#define CSKY_TLB_NUM            (64)

+#ifdef CYG_HAL_CSKYCPU_MMU_MAP_USEG

+# define CSKY_TLB_REG_START     (0x01)  /* tlb[0] is used by 32M RAM */

+#else

+# define CSKY_TLB_REG_START     (0x00)

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct csky_mmu_region 

+{

+    cyg_uint32 phy_addr;            /* physical address */

+    cyg_uint32 vir_addr;            /* virtual address  */

+    cyg_uint32 size;                /* region size      */

+    cyg_uint32 attr;                /* region attribute */

+    struct csky_mmu_region *next;   /* next region      */

+} csky_mmu_region_t;

+

+typedef struct 

+{

+    cyg_uint32 MRR;

+    cyg_uint32 MEL0;

+    cyg_uint32 MEL1;

+    cyg_uint32 MEH;

+} csky_tlb_entry_t;

+

+typedef struct 

+{

+    /* read from MEH */

+    cyg_uint32 MEH;

+    cyg_uint32 vpn;

+    cyg_uint32 asid;

+

+    /* read from MCR */

+    cyg_uint32 MCR;

+    cyg_uint32 pte_base;

+    cyg_uint32 bad_vpn2;

+

+    /* epc */

+    cyg_uint32 epc;

+} csky_tlb_mismatch_t;

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+extern void tos_csky_mmu_init(void);

+extern void tos_csky_mmu_tlb_mismatch(HAL_SavedRegisters *reg);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#endif  /* CYG_HAL_CSKYCPU_MMU */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _TOS_MMU_CSKY_H */

+

diff --git a/cp/ps/plat/src/oss/osa/tos/inc/tos_ramdump.h b/cp/ps/plat/src/oss/osa/tos/inc/tos_ramdump.h
new file mode 100644
index 0000000..1e6ddfb
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/inc/tos_ramdump.h
@@ -0,0 +1,120 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_ramdump.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ÌṩramdumpÏûÏ¢½á¹¹Ìå

+* ×÷    Õß : luxieji

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2010/05/26

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _TOS_RAMDUMP_H

+#define _TOS_RAMDUMP_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "osa_ramdump.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* Ö¸ÁÒå */

+#define DUMPFILE_LINK_REQ       1   /*ͬ²½ÇëÇó*/

+#define DUMPFILE_LINK_RSP       2   /*ͬ²½ÇëÇóÓ¦´ð,´«ÊäramdumpµÄÎļþÊýÄ¿*/

+#define DUMPFILE_FILE_REQ       3   /*ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅµÄÎļþÐÅÏ¢*/

+#define DUMPFILE_FILE_RSP       4   /*ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅµÄÎļþÐÅÏ¢µÄÓ¦´ð£¬´«ÊäÎļþÃû¼°´óС*/

+#define DUMPFILE_READ_REQ       5   /*ÇëÇó¶Áȡָ¶¨Îļþ±àºÅµÄÎļþÄÚÈÝ*/

+#define DUMPFILE_READ_RSP       6   /*ÇëÇó¶Áȡָ¶¨Îļþ±àºÅµÄÎļþÄÚÈݵÄÓ¦´ð£¬´«ÊäÎļþÄÚÈÝ*/

+#define DUMPFILE_END_REQ        7   /*´«Êä½áÊø*/

+#define DUMPFILE_END_RSP        8   /*´«Êä½áÊøÓ¦´ð*/

+

+/* ´íÎóÀàÐÍ */

+#define DUMPFILE_CMD_FAIL       9   /*Ö¸Áî´íÎó*/

+#define DUMPFILE_NO_FAIL        10  /*ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅ´í*/

+#define DUMPFILE_LENGTH_FAIL    11  /*ÇëÇó´«µÝÖ¸¶¨ÎļþλÖôóС´í*/

+

+#define CMD_BUFFER_LEN          16  /* Ö¸ÁîÖ¡³¤¶È */

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/* ramdumpÄ£¿éÏûÏ¢Ì嶨Òå */

+

+/* ͬ²½ÇëÇóÓ¦´ð */

+typedef struct

+{

+    UINT32  fileNum;                    /*Òª´«ÊäµÄÎļþ¸öÊý*/

+}T_DUMPFILE_LINK_RSP;

+

+/* ¿ªÊ¼Îļþ´«ÊäÇëÇóÏûÏ¢Ìå */

+typedef struct

+{

+    UINT32  fileNo;                     /*Îļþ±àºÅ,0¿ªÊ¼*/

+}T_DUMPFILE_FILE_REQ;

+

+/* ¿ªÊ¼Îļþ´«Ê仨ӦÏûÏ¢Ìå */

+typedef struct

+{

+    CHAR   fileName[DUMPFILENMAE_LEN];  /*ÎļþÃû*/

+    UINT32 size;                        /*Îļþ´óС*/

+}T_DUMPFILE_FILE_RSP;

+

+/* ¶ÁÊý¾ÝÇëÇóÏûÏ¢Ìå */

+typedef struct

+{

+    UINT32 fileNo;                      /*Îļþ±àºÅ*/

+    UINT32 offset;                      /*offsetΪÊý¾ÝÆ«ÒÆ*/

+    UINT32 length;                      /*lengthΪÊý¾Ý³¤¶È*/

+}T_DUMPFILE_READ_REQ;

+

+/* ¶ÁÊý¾Ý»ØÓ¦ÏûÏ¢Ìå*/

+typedef struct

+{

+    CHAR   data[1];              	    /*Êý¾ÝÄÚÈÝ£¬ºóÐø»¹ÓÐÊý¾Ý£¬¿É±ä,ΪÇëÇ󳤶È*/

+}T_DUMPFILE_READ_RSP;

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+VOID zOss_RamdumpUsbInit(VOID);

+VOID zOss_RamdumpUsbReadData(UINT8 *buffer, UINT32 size);

+VOID zOss_RamdumpUsbWriteData(UINT8 *buffer, UINT32 size);

+VOID zOss_RamdumpUsbFinish(VOID);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _TOS_RAMDUMP_H */

+

diff --git a/cp/ps/plat/src/oss/osa/tos/inc/tos_ramlog.h b/cp/ps/plat/src/oss/osa/tos/inc/tos_ramlog.h
new file mode 100644
index 0000000..13ea98a
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/inc/tos_ramlog.h
@@ -0,0 +1,66 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_ramlog.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : TOS 3.0²Ù×÷ϵͳ֧³Å²ãµÄramlogÄ£¿éÍ·Îļþ

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/04/10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _TOS_RAMLOG_H

+#define _TOS_RAMLOG_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define TOS_RAMLOG

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+int tos_ramlog_printf(const char *fmt, ...);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _TOS_RAMLOG_H */

+

diff --git a/cp/ps/plat/src/oss/osa/tos/inc/tos_typedef.h b/cp/ps/plat/src/oss/osa/tos/inc/tos_typedef.h
new file mode 100644
index 0000000..aa8f49a
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/inc/tos_typedef.h
@@ -0,0 +1,75 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_typedef.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ºË¸ß»ùTOS²Ù×÷ϵͳ»ù±¾Êý¾ÝÀàÐÍÍ·Îļþ

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/01/10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _TOS_TYPEDEF_H

+#define _TOS_TYPEDEF_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define OSA_HIGHESTPRIORITY (0)     /* TOSÏ̵߳Ä×î¸ßÓÅÏȼ¶ */

+#define OSA_LOWESTPRIORITY  (31)    /* TOSÏ̵߳Ä×îµÍÓÅÏȼ¶ */

+#define SIGNAL_MSG_NUMBER   (256)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/* zOss_SendMsgºÍzOss_RecvMsg½Ó¿ÚʹÓõÄÊý¾ÝÀàÐÍ */

+typedef struct thread_msg {

+    void        *msg_ptr;

+    cyg_uint32  msg_size;

+}thread_msg_t;

+

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _TOS_TYPEDEF_H */

+

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_card.c b/cp/ps/plat/src/oss/osa/tos/src/tos_card.c
new file mode 100644
index 0000000..6c29ecf
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_card.c
@@ -0,0 +1,263 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2011, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     tos_card.c
+* Îļþ±êʶ:     tos_card.c
+* ÄÚÈÝÕªÒª:     TOS 3.0 fat32 ÎļþϵͳT¿¨É豸¹ÜÀíÄ£Ð͵ÄÖ§³Å²ãÊÊÅäÄ£¿é
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2011/07/17      V1.0        Create                    ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "drv_pub.h"
+#include "hal_fsms.h"
+#include "oss_api.h"
+#include <cyg/io/devtab.h>
+#include <cyg/io/disk.h>
+
+/*******************************************************************************
+*                                  ³£Á¿¶¨Òå                                    *
+*******************************************************************************/
+
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+#define DISCNUM    0
+#define CYGDAT_DEVS_DISK_SD_DISK0_NAME   "disksd"
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+typedef struct cyg_sd_disk_info_t {
+    cyg_uint32      sd_saved_baudrate;
+    cyg_uint32      sd_block_count;
+    cyg_bool        sd_read_only;
+    cyg_bool        sd_connected;
+    cyg_uint32      sd_heads_per_cylinder;
+    cyg_uint32      sd_sectors_per_head;
+    cyg_uint32      sd_read_block_length;
+    cyg_uint32      sd_write_block_length;
+} cyg_sd_disk_info_t;
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+
+/*******************************************************************************
+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *
+*******************************************************************************/
+
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+static Cyg_ErrNo    sd_disk_read(disk_channel *chan, void* buf_arg, cyg_uint32 blocks, cyg_uint32 first_block);
+static Cyg_ErrNo    sd_disk_write(disk_channel* chan, const void* buf_arg, cyg_uint32 blocks, cyg_uint32 first_block);
+static Cyg_ErrNo    sd_disk_get_config(disk_channel* chan, cyg_uint32 key, const void* buf, cyg_uint32* len);
+static Cyg_ErrNo    sd_disk_set_config(disk_channel* chan, cyg_uint32 key, const void* buf, cyg_uint32* len);
+static cyg_bool     sd_disk_init(struct cyg_devtab_entry* tab);
+static Cyg_ErrNo    sd_disk_lookup(struct cyg_devtab_entry** tab, struct cyg_devtab_entry *sub_tab, const char* name);
+static Cyg_ErrNo    sd_disk_lookup(struct cyg_devtab_entry** tab, struct cyg_devtab_entry *sub_tab, const char* name);
+
+extern FS_MS_ERROR_TYPE FS_MS_GetGeometry(unsigned int DiscNR, unsigned int *total_lba, unsigned int* sector_size);
+extern FS_MS_ERROR_TYPE FS_MS_Write(unsigned int DiscNR, unsigned int startSector, unsigned int nofSectors, const void * userAddress);
+extern FS_MS_ERROR_TYPE FS_MS_Read(unsigned int DiscNR, unsigned int startSector, unsigned int nofSectors, void * userAddress);
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+DISK_FUNS(cyg_sd_disk_funs,
+          sd_disk_read,
+          sd_disk_write,
+          sd_disk_get_config,
+          sd_disk_set_config);
+static cyg_sd_disk_info_t cyg_sd_disk0_hwinfo = { .sd_connected = 0 };
+DISK_CONTROLLER(cyg_sd_disk_controller_0, cyg_sd_disk0_hwinfo);
+DISK_CHANNEL(cyg_sd_disk0_channel,
+             cyg_sd_disk_funs,
+             cyg_sd_disk0_hwinfo,
+             cyg_sd_disk_controller_0,
+             false,                         
+             1);
+             
+BLOCK_DEVTAB_ENTRY(cyg_sd_disk0,
+                   CYGDAT_DEVS_DISK_SD_DISK0_NAME,
+                   0,
+                   &cyg_io_disk_devio,
+                   &sd_disk_init,
+                   &sd_disk_lookup,
+                   &cyg_sd_disk0_channel);
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     sd¿¨¶Á½Ó¿Ú
+* ²ÎÊý˵Ã÷:     
+*                      (IN)  
+*                          chan :ͨµÀ;
+*                          buf_arg:bufferÖ¸Õë;
+*                          blocks  :¶ÁÈ¡µÄblockµÄ¸öÊý;
+*                          first_block:µÚÒ»¸öblock;
+*                      (OUT)  
+*                          ³É¹¦·µ»Ø0,ʧ°Ü·µ»Ø·ÇÁãÖµ;                       
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+static  Cyg_ErrNo sd_disk_read(disk_channel* chan, void* buf_arg, cyg_uint32 blocks, cyg_uint32 first_block)
+{
+    cyg_sd_disk_info_t* disk    = (cyg_sd_disk_info_t*) chan->dev_priv;
+    cyg_uint8*          buf     = (cyg_uint8*) buf_arg;
+    FS_MS_ERROR_TYPE   retCode  = FS_MS_OK;
+
+    //CYG_TRACE_FUNC_START_ALWAYS();
+    if (! disk->sd_connected) {
+        return -ENODEV;
+    }
+    retCode = FS_MS_Read(DISCNUM,first_block , blocks, buf);
+    if (retCode != FS_MS_OK)
+    {
+        zOss_ASSERT(0);
+    }
+
+    //CYG_TRACE_FUNC_END_ALWAYS();
+
+    return ENOERR;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     sd¿¨Ð´½Ó¿Ú
+* ²ÎÊý˵Ã÷:     
+*                      (IN)  
+*                          chan :ͨµÀ;
+*                          buf_arg:bufferÖ¸Õë;
+*                          blocks  :¶ÁÈ¡µÄblockµÄ¸öÊý;
+*                          first_block:µÚÒ»¸öblock;
+*                      (OUT)  
+*                          ³É¹¦·µ»Ø0,ʧ°Ü·µ»Ø·ÇÁãÖµ;                       
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+static Cyg_ErrNo  sd_disk_write(disk_channel* chan, const void* buf_arg, cyg_uint32 blocks, cyg_uint32 first_block)
+{
+    cyg_sd_disk_info_t*    disk = (cyg_sd_disk_info_t*) chan->dev_priv;
+    FS_MS_ERROR_TYPE   retCode  = FS_MS_OK;
+
+    //CYG_TRACE_FUNC_START_ALWAYS();
+
+    if (! disk->sd_connected) {
+        return -ENODEV;
+    }
+    retCode = FS_MS_Write(DISCNUM, first_block,blocks,buf_arg);
+    if (retCode != FS_MS_OK)
+    {
+        zOss_ASSERT(0);
+    }
+
+    //CYG_TRACE_FUNC_END_ALWAYS();
+
+    return ENOERR;
+}
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    »ñÈ¡sdÅäÖýӿÚ
+* ²ÎÊý˵Ã÷:     
+*                      (IN)  
+*                          chan :ͨµÀ;
+*                          key:¹Ø¼ü×Ö;
+*                          buf  :bufferÖ¸Õë;
+*                          len:³¤¶È;
+*                      (OUT)  
+*                          ³É¹¦·µ»Ø0,ʧ°Ü·µ»Ø·ÇÁãÖµ;                       
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+static Cyg_ErrNo
+sd_disk_get_config(disk_channel* chan, cyg_uint32 key, const void* buf, cyg_uint32* len)
+{
+    return ENOERR;
+}
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ÉèÖÃsdÅäÖýӿÚ
+* ²ÎÊý˵Ã÷:     
+*                      (IN)  
+*                          chan :ͨµÀ;
+*                          key:¹Ø¼ü×Ö;
+*                          buf  :bufferÖ¸Õë;
+*                          len:³¤¶È;
+*                      (OUT)  
+*                          ³É¹¦·µ»Ø0,ʧ°Ü·µ»Ø·ÇÁãÖµ;                       
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+static Cyg_ErrNo
+sd_disk_set_config(disk_channel* chan, cyg_uint32 key, const void* buf, cyg_uint32* len)
+{
+    return ENOERR;
+}
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:   sd¿¨³õʼ»¯º¯Êý
+* ²ÎÊý˵Ã÷:     
+*                      (IN)  
+*                          tab :É豸Èë¿Ú±í
+*                      (OUT)  
+*                          ³É¹¦·µ»ØTRUE,ʧ°ÜFALSE;                       
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+static cyg_bool
+sd_disk_init(struct cyg_devtab_entry* tab)
+{
+    disk_channel*   chan    = (disk_channel*) tab->priv;
+    return (*chan->callbacks->disk_init)(tab);
+}
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:   ²éÕÒsdÉ豸º¯Êý
+* ²ÎÊý˵Ã÷:     
+*                      (IN)  
+*                          tab :É豸Èë¿Ú±íÖ¸Õë;
+*                          sub_tab:´Î¼¶É豸Èë¿Ú±í;
+*                          name  :É豸µÄÃû×Ö;
+*                      (OUT)  
+*                          ³É¹¦·µ»Ø0,ʧ°Ü·µ»Ø·ÇÁãÖµ;                       
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+static Cyg_ErrNo
+sd_disk_lookup(struct cyg_devtab_entry** tab, struct cyg_devtab_entry *sub_tab, const char* name)
+{
+    disk_channel*           chan    = (disk_channel*) (*tab)->priv;
+    cyg_sd_disk_info_t     *disk    = (cyg_sd_disk_info_t*) chan->dev_priv;
+    cyg_disk_info_t  *chanInfo      = chan->info;
+    FS_MS_ERROR_TYPE  retCode       = FS_MS_OK;
+    unsigned int  totalLib          = 0;
+    unsigned int sectorSize         = 0;
+    retCode = FS_MS_GetGeometry(DISCNUM,&totalLib,&sectorSize);
+    if (retCode != FS_MS_OK)
+    {
+        zOss_ASSERT(0);
+    }
+   // chanInfo->connected = true;
+   // chanInfo->block_size = sectorSize;
+   // chanInfo->blocks_num = totalLib;
+    chanInfo->ident.max_transfer   = 0xFFFFFFFF;
+    disk->sd_connected = false;
+    chan->valid     = true; 
+    if(!disk->sd_connected)
+    {
+        cyg_disk_identify_t ident;
+        ident.lba_sectors_num   = totalLib;
+        ident.phys_block_size   = 1;
+        disk->sd_connected      = true;
+        (*chan->callbacks->disk_connected)(*tab, &ident);
+    }
+    return (*chan->callbacks->disk_lookup)(tab, sub_tab, name);
+}
+
+
diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_except_arm.c b/cp/ps/plat/src/oss/osa/tos/src/tos_except_arm.c
new file mode 100644
index 0000000..140eb0e
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_except_arm.c
@@ -0,0 +1,249 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_arm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : TOS 3.0 arm´¦ÀíÆ÷µÄÒì³£´¦ÀíÄ£¿é

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/05/08

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "tos_except_arm.h"

+#ifdef _USE_MULTI_CORE_RAMDUMP

+#include "sup_ramdump.h"

+#endif

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+extern void cyg_user_idle(void);

+extern int zte_sys_err_hnd(int user_called, int ecode, int extra);

+extern unsigned long ramdump_arch_get_pc(unsigned int mode);

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define EXCEPT_LOCK()   ZOSS_SAVE_IRQ(old_intr)

+#define EXCEPT_UNLOCK() ZOSS_RESTORE_IRQ(old_intr)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+enum {

+    TOS_EXCEPT_NONE         = -1,

+    TOS_EXCEPT_CPU_START    = CYGNUM_HAL_EXCEPTION_MIN,

+    TOS_EXCEPT_CPU_END      = CYGNUM_HAL_EXCEPTION_MAX,

+    TOS_EXCEPT_ASSERT       = 128

+};

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static tos_except_t tos_except = {0};

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     cksy´¦ÀíÆ÷Òì³£´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  data:               Òì³£´¦Àíº¯ÊýµÄÈë²Î

+                exception_number:   Òì³£±àºÅ

+                info:               Òì³£·¢ÉúʱµÄCPU context

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+#ifdef CYGPKG_KERNEL_EXCEPTIONS

+static void tos_except_handler( cyg_addrword_t  data,

+                                cyg_code_t      exception_number,

+                                cyg_addrword_t  info)

+{

+    cyg_uint32 old_intr;

+    

+    EXCEPT_LOCK();

+    tos_except.nr = exception_number;

+    EXCEPT_UNLOCK();

+    zOss_ASSERT(0);

+}

+#endif

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¶ÏÑÔʧ°Ü»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  exp:    ¶ÏÑÔ±í´ïʽ

+                file:   ¶ÏÑÔµÄÎļþÃû

+                line:   ¶ÏÑÔµÄÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ¸Ãº¯ÊýÖ»Ó¦¸ÃÔÚzOss_ASSERT¶ÏÑÔʧ°ÜµÄÇé¿öϱ»µ÷ÓÃ

+**************************************************************************/

+void tos_assert_failed(const char *exp, const char *file, const char *func, int line)

+{

+    cyg_uint32 old_intr;

+    

+    EXCEPT_LOCK();

+    if (tos_except.nr == TOS_EXCEPT_NONE)

+    {

+        tos_except.nr = TOS_EXCEPT_ASSERT;

+    }

+    tos_except.exp     = exp;

+    tos_except.file    = file;

+    tos_except.func    = func;

+    tos_except.line    = line;

+    

+#if 1

+# ifdef _USE_MULTI_CORE_RAMDUMP

+    zOss_RamdumpHandle(1, 1, 1);

+# else

+    zte_sys_err_hnd(1, 1, 1);

+# endif

+#else

+    while (tos_except.trace_flag == FALSE) 

+    {

+        HAL_BREAK();

+    }

+#endif

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´¦ÀíÆ÷Òì³£´¦ÀíµÄ³õʼ»¯º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³õʼ»¯½á¹û

+* ÆäËü˵Ã÷:     ²Î¿¼±ê×¼¿âÖÐerrnoµÄ¶¨Òå

+**************************************************************************/

+int zOss_ExceptInit(void)

+{

+#ifdef CYGPKG_KERNEL_EXCEPTIONS

+    cyg_code_t cnt = 0;

+#endif

+    cyg_uint32 old_intr;

+

+    EXCEPT_LOCK();

+    tos_except.nr      = TOS_EXCEPT_NONE;

+    tos_except.exp     = NULL;

+    tos_except.file    = NULL;

+    tos_except.func    = NULL;

+    tos_except.line    = -1;

+    EXCEPT_UNLOCK();

+    

+#ifdef CYGPKG_KERNEL_EXCEPTIONS

+    for (cnt = CYGNUM_HAL_EXCEPTION_MIN; cnt < CYGNUM_HAL_EXCEPTION_MAX; cnt++) 

+    {

+        cyg_exception_set_handler(cnt,                  /* exception_number */

+                                  tos_except_handler,   /* new_handler      */

+                                  0x00,                 /* new_data         */

+                                  NULL,                 /* old_handler      */

+                                  NULL);                /* old_data         */

+    }

+#endif

+

+    return ENOERR;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡±£´æÒì³£¼Ä´æÆ÷µÄÄÚ´æµØÖ·

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ±£´æÒì³£¼Ä´æÆ÷µÄÄÚ´æµØÖ·

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+#ifndef __ARMCC_VERSION

+tos_except_register_t *tos_dump_except_register(void)

+{

+    return NULL;

+}

+#endif

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     TOS 3.0²Ù×÷ϵͳidleÏß³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  loop_count:     idleÏß³ÌÑ­»·µÄ´ÎÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_idle_thread(cyg_uint32 loop_count)

+{

+    cyg_user_idle();

+}

+

+char *ramdump_error_log_exp(char *mem)

+{

+	CHAR *name = zOss_GetThreadName(zOss_GetCurThreadID(), NULL);

+	if(tos_except.nr == TOS_EXCEPT_ASSERT)

+	{

+	    mem += snprintf(

+	        mem, 

+	        800,

+	        "except thread:%s\n nr:%d\n fun: %s\n file: %s\n line:%d\n exp: %s\n", 

+	        name,

+	        tos_except.nr,

+	        tos_except.func,

+	        tos_except.file,

+	        tos_except.line,

+	        tos_except.exp);

+	}

+	else

+	{

+		mem += sprintf(

+        mem, 

+        "except thread:%s\n nr: %d\n pc = 0x%lx\n", 

+		name,

+        tos_except.nr,

+        ramdump_arch_get_pc(tos_except.nr));

+	}

+

+    return mem;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_except_arm_asm.s b/cp/ps/plat/src/oss/osa/tos/src/tos_except_arm_asm.s
new file mode 100644
index 0000000..f1465e6
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_except_arm_asm.s
@@ -0,0 +1,129 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_arm_asm.S

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : arm´¦ÀíÆ÷

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/12/16

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýÉùÃ÷

+**************************************************************************/

+.global zOss_RamdumpSaveRegisters

+.global cp15_readControlRegister

+.global cp15_readDomainRegister

+.global cp15_readTTB

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+.extern Osa_CoreRegisters

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_SaveRegisters 

+ ¹¦ÄÜÃèÊö£º ±£´æÒì³£·¢ÉúʱËùÓеļĴæÖµÖÁ½á¹¹Ìå±äÁ¿(Osa_CoreRegisters),

+ ÔÚµ÷Óú¯Êý֮ǰÐè½ûÖ¹ËùÓÐÖжÏ

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.text

+.balign 4

+.type zOss_RamdumpSaveRegisters, %function

+zOss_RamdumpSaveRegisters:    

+    PUSH     {r14}

+    LDR      r14, =Osa_CoreRegisters

+    STM      r14!, {r0-r12}             /* ±£´ær0-r12   */

+    MOV      r0, r14                    /* ±£´ær14ÖÁr0£¬ºóÐøÒÔr0Ϊ»ùµØÖ·Ñ¹Õ» */

+    LDR      r14, [r13], #4             /* »¹Ô­r13,r14  */

+    MRS      r1, CPSR                   /* ±£´æcpsrÖÁr1 */

+    MSR      CPSR_c, #0xdf              /* SYS modeµÈ¼Ûusr mode */

+    STM      r0!, {r13, r14}            /* ½«{r13,r14}ÈëÕ»  */

+    MRS      r2, SPSR

+    STR      r2, [r0], #4               /* ½«SPSRÈëÕ»   */

+    MSR      CPSR_c, #0xd3              /* svc mode     */

+    STM      r0!, {r13, r14}            /* ½«{r13,r14}  */

+    MRS      r2, SPSR

+    STR      r2,  [r0], #4              /* ½«SPSRÈëÕ»   */

+    MSR      CPSR_c, #0xd7              /* ABT mode     */

+    MRS      r2,  SPSR

+    STM      r0!, {r13, r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, #0xdb              /* UND mode     */

+    MRS      r2, SPSR

+    STM      r0!, {r13, r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, #0xd2              /* IRQ mode     */

+    MRS      r2, SPSR

+    STM      r0!, {r13, r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, #0xd1              /* FIQ mode     */

+    MRS      r2, SPSR

+    STM      r0!, {r8-r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, r1                 /* »¹Ô­CPRS     */

+    LDR      r14, =Osa_CoreRegisters    /* »¹Ô­¼Ä´æÆ÷   */      

+    LDM      r14!, {r0-r12}             /* »¹Ô­r0-r12£¬r13µÄֵ֮ǰÒÑ»¹Ô­    */

+    LDMDB    r13, {R14}                 /* »¹Ô­r14      */

+    BX       r14                        /* ·µ»Ø         */

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readControlRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.type cp15_readControlRegister, %function

+cp15_readControlRegister:

+    MRC     p15, 0, r0, c1, c0, 0

+    BX      LR

+    

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readDomainRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.type cp15_readDomainRegister, %function

+cp15_readDomainRegister:

+    MRC     p15, 0, r0, c3, c0, 0

+    BX      LR

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readTTB 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.type cp15_readTTB, %function

+cp15_readTTB:

+    MRC     p15, 0, r0, c2, c0, 0   

+    BX      LR

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_except_arm_asm_rvct.S b/cp/ps/plat/src/oss/osa/tos/src/tos_except_arm_asm_rvct.S
new file mode 100644
index 0000000..6770b65
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_except_arm_asm_rvct.S
@@ -0,0 +1,130 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_arm_asm_rvct.S

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : arm´¦ÀíÆ÷

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/12/16

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýÉùÃ÷

+**************************************************************************/

+    EXPORT zOss_RamdumpSaveRegisters

+    EXPORT cp15_readControlRegister

+    EXPORT cp15_readDomainRegister

+    EXPORT cp15_readTTB

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+    IMPORT Osa_CoreRegisters

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_SaveRegisters 

+ ¹¦ÄÜÃèÊö£º ±£´æÒì³£·¢ÉúʱËùÓеļĴæÖµÖÁ½á¹¹Ìå±äÁ¿(Osa_CoreRegisters),

+ ÔÚµ÷Óú¯Êý֮ǰÐè½ûÖ¹ËùÓÐÖжÏ

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+    CODE32

+    AREA ||.text||, CODE, ALIGN = 2

+zOss_RamdumpSaveRegisters    

+    PUSH     {r14}

+    LDR      r14,=Osa_CoreRegisters

+    STM      r14!,{r0-r12}          /* ±£´ær0-r12                           */

+    MOV      r0,r14                 /* ±£´ær14ÖÁr0£¬ºóÐøÒÔr0Ϊ»ùµØÖ·Ñ¹Õ»    */

+    LDR      r14,[r13],#4           /* »¹Ô­r13,r14                          */

+    MRS      r1,CPSR                /* ±£´æcpsrÖÁr1                         */

+    MSR      CPSR_c,#0xdf           /*SYS modeµÈ¼Ûusr mode                  */

+    STM      r0!,{r13,r14}          /* ½«{r13,r14}ÈëÕ»                      */

+    MRS      r2,SPSR

+    STR      r2,[r0],#4             /* ½«SPSRÈëÕ»                           */

+    MSR      CPSR_c,#0xd3           /*svc mode                              */

+    STM      r0!,{r13,r14}          /* ½«{r13,r14}                          */

+    MRS      r2,SPSR

+    STR      r2,[r0],#4             /* ½«SPSRÈëÕ»                           */

+    MSR      CPSR_c,#0xd7           /* ABT mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xdb           /* UND mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xd2           /* IRQ mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xd1           /* FIQ mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r8-r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,r1              /* »¹Ô­CPRS                             */

+    LDR      r14,=Osa_CoreRegisters /* »¹Ô­¼Ä´æÆ÷                           */      

+    LDM      r14!,{r0-r12}          /* »¹Ô­r0-r12£¬r13µÄֵ֮ǰÒÑ»¹Ô­        */

+    LDMDB    r13,{R14}              /* »¹Ô­r14                              */

+    BX       r14                    /* ·µ»Ø                                 */

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readControlRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+cp15_readControlRegister

+

+    MRC     p15, 0, r0, c1, c0, 0

+    BX      LR

+    

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readDomainRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+cp15_readDomainRegister

+

+    MRC     p15, 0, r0, c3, c0, 0

+    BX      LR

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readTTB 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+cp15_readTTB

+

+    MRC     p15, 0, r0, c2, c0, 0   

+    BX      LR

+

+    END

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_except_cortexm.c b/cp/ps/plat/src/oss/osa/tos/src/tos_except_cortexm.c
new file mode 100644
index 0000000..7bf4f7e
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_except_cortexm.c
@@ -0,0 +1,247 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_arm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : TOS 3.0 arm´¦ÀíÆ÷µÄÒì³£´¦ÀíÄ£¿é

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/05/08

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/infra/cyg_type.h>

+#include <cyg/kernel/kapi.h>

+#include <cyg/infra/diag.h>

+#include <cyg/hal/hal_intr.h>

+#include <cyg/hal/hal_arch.h>

+#include <errno.h>

+

+#include "oss_api.h"

+#include "tos_except_cortexm.h"

+#include "sup_ramdump.h"

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+extern void cyg_user_idle(void);

+extern int zte_sys_err_hnd(int user_called, int ecode, int extra);

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define EXCEPT_LOCK()   ZOSS_SAVE_IRQ(old_intr)

+#define EXCEPT_UNLOCK() ZOSS_RESTORE_IRQ(old_intr)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+enum {

+    TOS_EXCEPT_NONE         = -1,

+    TOS_EXCEPT_CPU_START    = CYGNUM_HAL_EXCEPTION_MIN,

+    TOS_EXCEPT_CPU_END      = CYGNUM_HAL_EXCEPTION_MAX,

+    TOS_EXCEPT_ASSERT       = 128

+};

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static tos_except_t tos_except = {0};

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     cksy´¦ÀíÆ÷Òì³£´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  data:               Òì³£´¦Àíº¯ÊýµÄÈë²Î

+                exception_number:   Òì³£±àºÅ

+                info:               Òì³£·¢ÉúʱµÄCPU context

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+#ifdef CYGPKG_KERNEL_EXCEPTIONS

+static void tos_except_handler( cyg_addrword_t  data,

+                                cyg_code_t      exception_number,

+                                cyg_addrword_t  info)

+{

+    cyg_uint32 old_intr;

+    

+    EXCEPT_LOCK();

+    tos_except.nr = exception_number;

+    EXCEPT_UNLOCK();

+    zOss_ASSERT(0);

+}

+#endif

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zte_sys_err_hnd

+ * ¹¦ÄÜÃèÊö£º Ramdump´¦Àíº¯Êý

+ * ²ÎÊý˵Ã÷£º 

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º ´ò׮ʵÏָú¯Êý£»

+ *

+ **************************************************************************/

+int  zte_sys_err_hnd(int  user_called, int  ecode, int extra)

+{

+    

+    ZOSS_INTR       old_intr;

+

+    ZOSS_SAVE_IRQ(old_intr);

+    for ( ; ; ) ;

+

+    return 0;

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¶ÏÑÔʧ°Ü»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  exp:    ¶ÏÑÔ±í´ïʽ

+                file:   ¶ÏÑÔµÄÎļþÃû

+                line:   ¶ÏÑÔµÄÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ¸Ãº¯ÊýÖ»Ó¦¸ÃÔÚzOss_ASSERT¶ÏÑÔʧ°ÜµÄÇé¿öϱ»µ÷ÓÃ

+**************************************************************************/

+void tos_assert_failed(const char *exp, const char *file, const char *func, int line)

+{

+    cyg_uint32 old_intr;

+    

+    EXCEPT_LOCK();

+    if (tos_except.nr == TOS_EXCEPT_NONE)

+    {

+        tos_except.nr = TOS_EXCEPT_ASSERT;

+    }

+    tos_except.exp     = exp;

+    tos_except.file    = file;

+    tos_except.func    = func;

+    tos_except.line    = line;

+

+#if 1

+# ifdef _USE_MULTI_CORE_RAMDUMP

+    zOss_RamdumpHandle(1, 1, 1);

+# else

+    zte_sys_err_hnd(1, 1, 1);

+# endif

+#else

+    while (tos_except.trace_flag == FALSE) 

+    {

+        HAL_BREAK();

+    }

+#endif

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´¦ÀíÆ÷Òì³£´¦ÀíµÄ³õʼ»¯º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³õʼ»¯½á¹û

+* ÆäËü˵Ã÷:     ²Î¿¼±ê×¼¿âÖÐerrnoµÄ¶¨Òå

+**************************************************************************/

+int zOss_ExceptInit(void)

+{

+#ifdef CYGPKG_KERNEL_EXCEPTIONS

+    cyg_code_t cnt = 0;

+#endif

+    cyg_uint32 old_intr;

+

+    EXCEPT_LOCK();

+    tos_except.nr      = TOS_EXCEPT_NONE;

+    tos_except.exp     = NULL;

+    tos_except.file    = NULL;

+    tos_except.func    = NULL;

+    tos_except.line    = -1;

+    EXCEPT_UNLOCK();

+    

+#ifdef CYGPKG_KERNEL_EXCEPTIONS

+    for (cnt = CYGNUM_HAL_EXCEPTION_MIN; cnt < CYGNUM_HAL_EXCEPTION_MAX; cnt++) 

+    {

+        cyg_exception_set_handler(cnt,                  /* exception_number */

+                                  tos_except_handler,   /* new_handler      */

+                                  0x00,                 /* new_data         */

+                                  NULL,                 /* old_handler      */

+                                  NULL);                /* old_data         */

+    }

+#endif

+

+    //return ENOERR;

+	return 0;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡±£´æÒì³£¼Ä´æÆ÷µÄÄÚ´æµØÖ·

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ±£´æÒì³£¼Ä´æÆ÷µÄÄÚ´æµØÖ·

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+tos_except_register_t *tos_dump_except_register(void)

+{

+    return NULL;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     TOS 3.0²Ù×÷ϵͳidleÏß³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  loop_count:     idleÏß³ÌÑ­»·µÄ´ÎÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_idle_thread(cyg_uint32 loop_count)

+{

+    cyg_user_idle();

+}

+

+char *ramdump_error_log_exp(char *mem)

+{

+	return mem;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_except_csky.c b/cp/ps/plat/src/oss/osa/tos/src/tos_except_csky.c
new file mode 100644
index 0000000..bf03df8
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_except_csky.c
@@ -0,0 +1,259 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_csky.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : TOS 3.0 cskycpu´¦ÀíÆ÷µÄÒì³£´¦ÀíÄ£¿é

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/11/03

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/infra/cyg_type.h>

+#include <cyg/kernel/kapi.h>

+#include <cyg/infra/diag.h>

+#include <cyg/hal/hal_intr.h>

+#include <errno.h>

+

+#include "oss_api.h"

+#include "tos_except_csky.h"

+#include "tos_mmu_csky.h"

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+extern void cyg_user_idle(void);

+extern int zte_sys_err_hnd(int user_called, int ecode, int extra);

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define EXCEPT_LOCK()   ZOSS_SAVE_IRQ(old_intr)

+#define EXCEPT_UNLOCK() ZOSS_RESTORE_IRQ(old_intr)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+enum {

+    TOS_EXCEPT_NONE         = -1,

+    TOS_EXCEPT_CPU_START    = 0,

+    TOS_EXCEPT_CPU_END      = 127,

+    TOS_EXCEPT_ASSERT       = 128

+};

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static tos_except_t    tos_except             = {0};

+tos_except_register_t  *tos_except_register   = NULL;

+

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     cksy´¦ÀíÆ÷Òì³£´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  data:               Òì³£´¦Àíº¯ÊýµÄÈë²Î

+                exception_number:   Òì³£±àºÅ

+                info:               Òì³£·¢ÉúʱµÄCPU context

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void tos_except_handler( cyg_addrword_t  data,

+                                cyg_code_t      exception_number,

+                                cyg_addrword_t  info)

+{

+    tos_except.nr = exception_number;

+    switch (exception_number) 

+    {

+    case CYGNUM_HAL_VECTOR_TLBMISMATCH:

+        {

+            tos_csky_mmu_tlb_mismatch((HAL_SavedRegisters *)info);

+            break;

+        }

+    default:

+        {

+            break;

+        }

+    }

+    

+    zOss_ASSERT(0);

+}

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¶ÏÑÔʧ°Ü»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  exp:    ¶ÏÑÔ±í´ïʽ

+                file:   ¶ÏÑÔµÄÎļþÃû

+                line:   ¶ÏÑÔµÄÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ¸Ãº¯ÊýÖ»Ó¦¸ÃÔÚzOss_ASSERT¶ÏÑÔʧ°ÜµÄÇé¿öϱ»µ÷ÓÃ

+**************************************************************************/

+void tos_assert_failed(const char *exp, const char *file, const char *func, int line)

+{

+    cyg_uint32 old_intr;

+    

+    EXCEPT_LOCK();

+    if (tos_except.nr == TOS_EXCEPT_NONE)

+    {

+        tos_except.nr = TOS_EXCEPT_ASSERT;

+    }

+    tos_except.exp     = exp;

+    tos_except.file    = file;

+    tos_except.func    = func;

+    tos_except.line    = line;

+    

+#if 1

+# ifdef _USE_MULTI_CORE_RAMDUMP

+    zOss_RamdumpHandle(1, 1, 1);

+# else

+    zte_sys_err_hnd(1, 1, 1);

+# endif

+#else

+    while (tos_except.trace_flag == FALSE) 

+    {

+        HAL_BREAK();

+    }

+#endif

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´¦ÀíÆ÷Òì³£´¦ÀíµÄ³õʼ»¯º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³õʼ»¯½á¹û

+* ÆäËü˵Ã÷:     ²Î¿¼±ê×¼¿âÖÐerrnoµÄ¶¨Òå

+**************************************************************************/

+int zOss_ExceptInit(void)

+{

+    cyg_code_t cnt = 0;

+    cyg_uint32 old_intr;

+

+    EXCEPT_LOCK();

+    tos_except.nr      = TOS_EXCEPT_NONE;

+    tos_except.exp     = NULL;

+    tos_except.file    = NULL;

+    tos_except.func    = NULL;

+    tos_except.line    = -1;

+    EXCEPT_UNLOCK();

+    for (cnt = CYGNUM_HAL_VECTOR_RESET; cnt < CYGNUM_HAL_VECTOR_SYS; cnt++) 

+    {

+        if (cnt == CYGNUM_HAL_VECTOR_AUTOVEC)

+        {

+            continue;

+        }

+        

+        cyg_exception_set_handler(cnt,                  /* exception_number */

+                                  tos_except_handler,   /* new_handler      */

+                                  0x00,                 /* new_data         */

+                                  NULL,                 /* old_handler      */

+                                  NULL);                /* old_data         */

+    }

+

+    return ENOERR;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡±£´æÒì³£¼Ä´æÆ÷µÄÄÚ´æµØÖ·

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ±£´æÒì³£¼Ä´æÆ÷µÄÄÚ´æµØÖ·

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+tos_except_register_t *tos_dump_except_register(void)

+{

+    return tos_except_register;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     TOS 3.0²Ù×÷ϵͳidleÏß³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  loop_count:     idleÏß³ÌÑ­»·µÄ´ÎÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_idle_thread(cyg_uint32 loop_count)

+{

+    cyg_user_idle();

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     fatalÒì³£´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_fatal_except_handler(void)

+{

+    cyg_uint32 old_intr;

+

+    EXCEPT_LOCK();

+

+    pool_print_leak(0x00);

+    pool_print_free();

+    pool_print_alloc_fail();

+    pool_print_alloc_statistic();

+    pool_trace_leak_end(0x00);

+

+    HAL_BREAK();

+}

+

+char *ramdump_error_log_exp(char *mem)

+{

+	return mem;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_except_csky_asm.s b/cp/ps/plat/src/oss/osa/tos/src/tos_except_csky_asm.s
new file mode 100644
index 0000000..cca39a9
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_except_csky_asm.s
@@ -0,0 +1,210 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_csky_asm.S

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : 

+* °æ    ±¾ : 

+* Íê³ÉÈÕÆÚ : 

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <pkgconf/hal.h>

+#include <pkgconf/system.h>

+#include <cyg/hal/board.h>

+#ifdef CYGPKG_KERNEL

+#include <pkgconf/kernel.h>

+#endif

+#include <pkgconf/hal_cskycpu.h>

+#include <cyg/hal/arch.inc>

+#include <pkgconf/kernel.h>

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö±äÁ¿ÉùÃ÷

+**************************************************************************/

+.globl  zOss_SaveRegisters

+//.globl  zOss_LoadRegisters

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+.extern gRamdumpAdrress

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ * ±£´æ¼Ä´æÆ÷ÐÅÏ¢ 

+ * º¯ÊýÔ­ÐÍ VOID  zOss_SaveRegisters(VOID)

+ **************************************************************************/

+.text

+.balign 4

+zOss_SaveRegisters:

+        subi    r0,4

+        stw     r10,(r0,0)  //°Ñr15ѹջ£¬ÒÔ±ãºóÐøÊ¹Ó㻽èÓÃr10£»

+        lrw     r10,gRamdumpAdrress

+/* ±£´ær0-r15 */

+        stw     r1,(r10,4)

+        stw     r2,(r10,8)

+        stw     r3,(r10,12)

+        stw     r4,(r10,16)

+        stw     r5,(r10,20)

+        stw     r6,(r10,24)

+        stw     r7,(r10,28)

+        stw     r8,(r10,32)

+        stw     r9,(r10,36)

+        ldw     r1, (r0, 0)    

+        stw     r1,(r10,40)

+        addi    r0, 4           

+        stw     r0,(r10,0)

+        stw     r11,(r10,44)

+        stw     r12,(r10,48)

+        stw     r13,(r10,52)

+        stw     r14,(r10,56)

+        stw     r15,(r10,60)

+/* ±£´æ¿ØÖƼĴæÆ÷ */

+        addi    r10,32

+        addi    r10,32

+        mfcr    r1, psr

+        stw     r1,(r10,0)

+        mfcr    r1, VBR

+	    stw     r1,(r10,4)

+	    mfcr    r1, epsr

+	    stw     r1,(r10,8)

+	    mfcr    r1, fpsr

+	    stw     r1,(r10,12)

+	    mfcr    r1, epc

+	    stw     r1,(r10,16)

+	    mfcr    r1, fpc

+	    stw     r1,(r10,20)

+	    mfcr    r1, ss0

+	    stw     r1,(r10,24)

+	    mfcr    r1, ss1

+	    stw     r1,(r10,28)

+	    mfcr    r1, ss2

+        stw     r1,(r10,32)

+        mfcr    r1, ss3

+        stw     r1,(r10,36)

+        mfcr    r1, ss4

+        stw     r1,(r10,40)

+        mfcr    r1, gcr

+        stw     r1,(r10,44)

+        mfcr    r1, gsr

+        stw     r1,(r10,48)

+        mfcr    r1, cr13    //²úÆ·ÐòºÅ¼Ä´æÆ÷cr13

+        stw     r1,(r10,52)

+        mfcr    r1, cr14    //dsp¿ØÖÆ×´Ì¬¼Ä´æÆ÷£»

+        stw     r1,(r10,56)

+        mfcr    r1, cr15    //½ö´æÔÚÓÚ´øÐ­´¦ÀíÆ÷½Ó¿ÚµÄck_core´¦ÀíÆ÷ÖÐ(Èçck610M¡¢ck610sµÈ)

+        stw     r1,(r10,60)

+        addi    r10,32

+        addi    r10,32

+        mfcr    r1, cr17    //¸ßËÙ»º´æ¼Ä´æÆ÷£»

+        stw     r1,(r10,0)

+        mfcr    r1, cr18    //¸ßËÙ»º´æÅäÖüĴæÆ÷£»

+        stw     r1,(r10,4)

+        mfcr    r1, cr19    //¿É¸ßËٺͷÃÎÊȨÏÞÅäÖüĴæÆ÷£»

+        stw     r1,(r10,8)

+        mfcr    r1, cr20    //±£»¤Çø¿ØÖƼĴæÆ÷£»

+        stw     r1,(r10,12)

+        mfcr    r1, cr21    //±£»¤Çø Ñ¡Ôñ¼Ä´æÆ÷£»

+        stw     r1,(r10,16)

+        jmp     r15

+#if 0

+/**************************************************************************

+ * ±£´æ¼Ä´æÆ÷ÐÅÏ¢ 

+ * º¯ÊýÔ­ÐÍ VOID  zOss_LoadRegisters(VOID)

+ *¸Ãº¯ÊýµÄʹÓÃÐèҪעÒâzOss_SaveRegistersº¯Êý

+ **************************************************************************/

+.text

+.balign 4

+zOss_LoadRegisters:

+        lrw     r10,gRamdumpAdrress

+	 addi    r10,32

+        addi    r10,32

+//¼ÓÔØ¿ØÖƼĴæÆ÷

+       ldw    r1,(r10,0)

+       mtcr   r1, psr

+       ldw    r1,(r10,4)

+       mtcr   r1, VBR

+       ldw    r1,(r10,8)

+       mtcr   r1, epsr

+       ldw    r1,(r10,12)

+       mtcr   r1, fpsr

+       ldw    r1,(r10,16)

+       mtcr   r1, epc

+       ldw    r1,(r10,20)

+       mtcr   r1, fpc

+       ldw    r1,(r10,24)

+       mtcr   r1, ss0

+       ldw    r1,(r10,28)

+       mtcr   r1, ss1

+       ldw    r1,(r10,32)

+       mtcr   r1, ss2

+       ldw    r1,(r10,36)

+       mtcr   r1, ss3

+       ldw    r1,(r10,40)

+       mtcr   r1, ss4

+       ldw    r1,(r10,44)

+       mtcr   r1, gcr

+       ldw    r1,(r10,48)

+       mtcr   r1, gsr

+       ldw    r1,(r10,52)

+       mtcr   r1, cr13

+       ldw    r1,(r10,56)

+       mtcr   r1, cr14

+       ldw    r1,(r10,60)

+       mtcr   r1,cr15

+       addi    r10,32

+       addi    r10,32

+       ldw     r1,(r10,0)

+       mtcr   r1,cr17

+       ldw    r1,(r10,4)

+       mtcr  r1,cr18

+       ldw    r1,(r10,8)

+       mtcr  r1,cr19

+       ldw   r1,(r10,12)

+       mtcr  r1,cr20

+       ldw    r1,(r10,16)

+       mtcr  r1,cr21

+

+	subi  r10,32

+	subi  r10,32

+	subi  r10,32

+	subi  r10,32

+//¼ÓÔØr0-r15

+        ldw     r0,(r10,0)

+        ldw     r1,(r10,4)

+        ldw     r2,(r10,8)

+        ldw     r3,(r10,12)

+        ldw     r4,(r10,16)

+        ldw     r5,(r10,20)

+        ldw     r6,(r10,24)

+        ldw     r7,(r10,28)

+        ldw     r8,(r10,32)

+        ldw     r9,(r10,36)

+        ldw     r11,(r10,44)

+        ldw     r12,(r10,48)

+        ldw      r13,(r10,52)

+        ldw      r14,(r10,56)

+        ldw      r15,(r10,60)

+        ldw     r10,(r10,40)

+        jmp    r15

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_irq.c b/cp/ps/plat/src/oss/osa/tos/src/tos_irq.c
new file mode 100644
index 0000000..73a29e1
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_irq.c
@@ -0,0 +1,749 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_irq.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : TOS 3.0µÄÖжÏÇëÇóÄ£¿éʵÏÖ

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/09/23

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/kernel/kapi.h>

+#include <cyg/hal/hal_intr.h>

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+#ifdef TOS_STATISTIC_IRQ

+extern int tos_statistic_irq_init_flag;

+extern unsigned int tos_statistic_irq_assert_tick;

+#endif

+

+#ifdef _USE_MONITOR

+extern T_ZOss_Mon_Event oss_trace_event_info;

+#endif

+

+void tos_statistic_irq_isr_start(unsigned int vector) __attribute__((weak));

+void tos_statistic_irq_isr_end(unsigned int vector) __attribute__((weak));

+void tos_statistic_irq_dsr_start(unsigned int vector) __attribute__((weak));

+void tos_statistic_irq_dsr_end(unsigned int vector) __attribute__((weak));

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef TOS_TRACE_IRQ

+# ifdef _USE_OSS_MIN

+#  define TOS_TRACE_IRQ_NUM             10

+# else

+#  define TOS_TRACE_IRQ_NUM             100

+# endif

+#endif

+

+#ifdef TOS_STATISTIC_IRQ

+# ifdef _USE_OSS_MIN

+#  define TOS_STATISTIC_IRQ_NUM         10

+# else

+#  define TOS_STATISTIC_IRQ_NUM         100

+# endif

+#endif

+   

+/* TOS_STATISTIC_IRQ_ATTACH_TAG */

+#define TOS_STATISTIC_IRQ_ATTACH

+#ifdef TOS_STATISTIC_IRQ_ATTACH

+# ifdef _USE_OSS_MIN

+#  define TOS_STATISTIC_IRQ_ATTACH_NUM  10

+# else

+#  define TOS_STATISTIC_IRQ_ATTACH_NUM  30

+# endif

+#endif

+

+#ifdef CYGNUM_HAL_VECTOR_INTRFIRST

+# define TOS_IRQ_VECTOR_BASE            CYGNUM_HAL_VECTOR_INTRFIRST

+#else

+# define TOS_IRQ_VECTOR_BASE            0

+#endif

+

+#ifdef CYGPKG_HAL_CORTEXM

+# define TOS_TRANSLATE_VECTOR(_vector_, _index_) ((_index_) = (_vector_) + 1)

+#else

+# define TOS_TRANSLATE_VECTOR(_vector_, _index_)

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+#ifdef TOS_STATISTIC_IRQ

+typedef struct {

+    unsigned int    vector;

+    unsigned long   start_tick;

+    unsigned long   end_tick;

+} tos_statistic_irq_t;

+

+typedef struct {

+    unsigned long   start_tick;

+    unsigned long   end_tick;

+} tos_statistic_irq_thread_t;

+

+typedef struct {

+    unsigned long   tick;

+    cyg_handle_t    thread;

+    char            *thread_name;

+} tos_statistic_irq_assert_t;

+#endif

+

+#ifdef TOS_STATISTIC_IRQ_ATTACH

+typedef struct {

+    unsigned int    vector;

+    unsigned int    priority;

+    unsigned int    data;

+    void            *isr;

+    void            *dsr;

+} tos_statistic_irq_create_t;

+#endif

+

+#ifdef TOS_TRACE_IRQ

+typedef struct {

+    const char      *file;

+    unsigned int    line;

+    unsigned int    tick;

+} tos_trace_irq_t;

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+extern UINT32 oss_trace_get_time(VOID);

+extern UINT64 oss_trace_get_time64(VOID);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+#ifdef TOS_STATISTIC_IRQ

+int                         tos_statistic_irq_init_flag     = 0;

+unsigned int                tos_statistic_irq_isr_count     = 0;

+unsigned int                tos_statistic_irq_dsr_count     = 0;

+unsigned int                tos_statistic_irq_thread_count  = 0;

+unsigned int                tos_statistic_irq_assert_count  = 0;

+tos_statistic_irq_t         tos_statistic_irq_isr[TOS_STATISTIC_IRQ_NUM];

+tos_statistic_irq_t         tos_statistic_irq_dsr[TOS_STATISTIC_IRQ_NUM];

+tos_statistic_irq_thread_t  tos_statistic_irq_thread[TOS_STATISTIC_IRQ_NUM];

+unsigned int                tos_statistic_irq_assert_tick;

+tos_statistic_irq_assert_t  tos_statistic_irq_assert_array[TOS_STATISTIC_IRQ_NUM];

+#endif

+

+#ifdef TOS_STATISTIC_IRQ_ATTACH

+unsigned int                tos_statistic_irq_attach_count;

+tos_statistic_irq_create_t  tos_statistic_irq_attach[TOS_STATISTIC_IRQ_ATTACH_NUM];

+#endif

+

+#ifdef TOS_TRACE_IRQ

+int                         tos_trace_irq_disable_flag          = 0;

+unsigned int                tos_trace_irq_disable_count         = 0;

+unsigned int                tos_trace_irq_disable_total_count   = 0;

+tos_trace_irq_t             tos_trace_irq_disable[TOS_TRACE_IRQ_NUM];

+

+int                         tos_trace_irq_enable_flag           = 0;

+unsigned int                tos_trace_irq_enable_count          = 0;

+unsigned int                tos_trace_irq_enable_total_count;

+tos_trace_irq_t             tos_trace_irq_enable[TOS_TRACE_IRQ_NUM];

+

+int                         tos_trace_irq_save_flag             = 0;

+unsigned int                tos_trace_irq_save_count            = 0;

+unsigned int                tos_trace_irq_save_total_count;

+tos_trace_irq_t             tos_trace_irq_save[TOS_TRACE_IRQ_NUM];

+

+int                         tos_trace_irq_restore_flag          = 0;

+unsigned int                tos_trace_irq_restore_count         = 0;

+unsigned int                tos_trace_irq_restore_total_count   = 0;

+tos_trace_irq_t             tos_trace_irq_restore[TOS_TRACE_IRQ_NUM];

+#endif

+

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef TOS_STATISTIC_IRQ

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´ò¿ªÖжÏͳ¼Æ¹¦ÄÜ£»

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_open(void)

+{

+    tos_statistic_irq_init_flag = 1;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¹Ø±ÕÖжÏͳ¼Æ¹¦ÄÜ£»

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_close(void)

+{

+    tos_statistic_irq_init_flag = 0;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÖжÏͳ¼Æ¹¦ÄܵĶÏÑÔº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_assert(void)

+{

+    if (tos_statistic_irq_init_flag) 

+    {

+        tos_statistic_irq_assert_array[tos_statistic_irq_assert_count].tick = tos_statistic_irq_assert_tick;

+        tos_statistic_irq_assert_array[tos_statistic_irq_assert_count].thread = cyg_thread_self();

+#ifdef CYGOPT_KERNEL_EXTEND_THREAD_NAME

+        tos_statistic_irq_assert_array[tos_statistic_irq_assert_count].thread_name = cyg_thread_get_name(cyg_thread_self());

+#else        

+        tos_statistic_irq_assert_array[tos_statistic_irq_assert_count].thread_name = NULL;

+#endif

+        if (++tos_statistic_irq_assert_count >= TOS_STATISTIC_IRQ_NUM)

+        {

+            tos_statistic_irq_assert_count = 0x00;

+        }

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼ÆÖжϴ¦Àíº¯Êý¿ªÊ¼Ö´ÐÐʱµÄʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  vector:     ÖжÏÏòÁ¿ºÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_isr_start(unsigned int vector)

+{

+    if (tos_statistic_irq_init_flag) 

+    {

+        tos_statistic_irq_isr[tos_statistic_irq_isr_count].vector = vector - TOS_IRQ_VECTOR_BASE;

+        tos_statistic_irq_isr[tos_statistic_irq_isr_count].start_tick = oss_trace_get_time();

+        tos_statistic_irq_isr[tos_statistic_irq_isr_count].end_tick = 0x00;

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼ÆÖжϴ¦Àíº¯Êý½áÊøÖ´ÐÐʱµÄʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  vector:     ÖжÏÏòÁ¿ºÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_isr_end(unsigned int vector)

+{

+    if (tos_statistic_irq_init_flag) 

+    {

+        tos_statistic_irq_isr[tos_statistic_irq_isr_count].end_tick = oss_trace_get_time();

+        if (++tos_statistic_irq_isr_count >= TOS_STATISTIC_IRQ_NUM)

+        {

+            tos_statistic_irq_isr_count = 0x00;

+        }

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼ÆÑÓ³ÙÖжϴ¦Àíº¯Êý¿ªÊ¼Ö´ÐÐʱµÄʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  vector:     ÖжÏÏòÁ¿ºÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_dsr_start(unsigned int vector)

+{

+    if (tos_statistic_irq_init_flag)

+    {

+        tos_statistic_irq_dsr[tos_statistic_irq_dsr_count].vector = vector - TOS_IRQ_VECTOR_BASE;

+        tos_statistic_irq_dsr[tos_statistic_irq_dsr_count].start_tick = oss_trace_get_time();

+

+#if defined (OSS_TRACE_THREAD) && defined(_USE_MONITOR)

+        if (gOsa_MonitorFlag)

+        {

+            UINT32 cnt = oss_trace_event_info.num;

+

+            oss_trace_event_info.ele[cnt].event        = OSS_MON_EVENT_DSR_SWAPIN;

+            oss_trace_event_info.ele[cnt].name         = "dsr";

+            oss_trace_event_info.ele[cnt].handle       = vector - TOS_IRQ_VECTOR_BASE;

+            oss_trace_event_info.ele[cnt].tickstamp    = oss_trace_get_time64();

+            if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+            {

+                cnt = 0;

+            }

+            oss_trace_event_info.num = cnt;

+        }

+#endif

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼ÆÑÓ³ÙÖжϴ¦Àíº¯Êý½áÊøÖ´ÐÐʱµÄʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  vector:     ÖжÏÏòÁ¿ºÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_dsr_end(unsigned int vector)

+{

+    if (tos_statistic_irq_init_flag) 

+    {

+        tos_statistic_irq_dsr[tos_statistic_irq_dsr_count].end_tick = oss_trace_get_time();

+        if (++tos_statistic_irq_dsr_count >= TOS_STATISTIC_IRQ_NUM)

+        {

+            tos_statistic_irq_dsr_count = 0x00;

+        }        

+#if defined (OSS_TRACE_THREAD) && defined(_USE_MONITOR)

+        if (gOsa_MonitorFlag)

+        {

+            UINT32 cnt = oss_trace_event_info.num;

+

+            oss_trace_event_info.ele[cnt].event        = OSS_MON_EVENT_DSR_SWAPOUT;

+            oss_trace_event_info.ele[cnt].name         = "dsr";

+            oss_trace_event_info.ele[cnt].handle       = vector - TOS_IRQ_VECTOR_BASE;

+            oss_trace_event_info.ele[cnt].tickstamp    = oss_trace_get_time64();

+            if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+            {

+                cnt = 0;

+            }

+            oss_trace_event_info.num = cnt;

+        }

+#endif

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼Æ±»Öжϻ½ÐÑÏ߳̿ªÊ¼Ö´ÐÐʱµÄʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_thread_start(void)

+{

+    if (tos_statistic_irq_init_flag) 

+    {

+        tos_statistic_irq_thread[tos_statistic_irq_thread_count].start_tick = oss_trace_get_time();

+        tos_statistic_irq_thread[tos_statistic_irq_thread_count].end_tick = 0x00;

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ͳ¼Æ±»Öжϻ½ÐÑÏ߳̽áÊøÖ´ÐÐʱµÄʱ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_thread_end(void)

+{

+    if (tos_statistic_irq_init_flag) 

+    {

+        tos_statistic_irq_thread[tos_statistic_irq_thread_count].end_tick = oss_trace_get_time();

+        if (++tos_statistic_irq_thread_count >= TOS_STATISTIC_IRQ_NUM)

+        {

+            tos_statistic_irq_thread_count = 0x00;

+        }

+    }

+}

+#endif

+

+

+#ifdef TOS_STATISTIC_IRQ_ATTACH

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Cyg_Interrupt::attachº¯ÊýÖе÷Óô˺¯Êý£¬ÒÔͳ¼ÆÏµÍ³ÖÐËùÓÐÖжÏÔ´µÄ

+                vector¡¢priority¡¢data¡¢isr¡¢dsr

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  vector:     ÏòÁ¿ºÅ

+                priority:   ÓÅÏȼ¶

+                data:       Èë²Î

+                isr:        ÖжϷþÎñ³ÌÐòµØÖ·

+                dsr:        ÑÓ³ÙÖжϷþÎñ³ÌÐòµØÖ·

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_statistic_irq_attach_hook(unsigned int vector,

+                                   unsigned int priority,

+                                   unsigned int data,

+                                   void *isr,

+                                   void *dsr)

+{

+    tos_statistic_irq_attach[tos_statistic_irq_attach_count].vector   = vector - TOS_IRQ_VECTOR_BASE;

+    tos_statistic_irq_attach[tos_statistic_irq_attach_count].priority = priority;

+    tos_statistic_irq_attach[tos_statistic_irq_attach_count].data     = data;

+    tos_statistic_irq_attach[tos_statistic_irq_attach_count].isr      = isr;

+    tos_statistic_irq_attach[tos_statistic_irq_attach_count].dsr      = dsr;

+    tos_statistic_irq_attach_count++;

+    if (tos_statistic_irq_attach_count == TOS_STATISTIC_IRQ_ATTACH_NUM)

+    {

+        tos_statistic_irq_attach_count = 0x00;

+    }

+}

+#endif

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ĬÈϵÄÖжϷþÎñÀý³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  vector:     ÖжÏÏòÁ¿ºÅ

+                data:       ´´½¨ÖжϷþÎñÀý³Ìʱ´«ÈëµÄ²ÎÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ²Î¼ûCyg_Interrupt::CALL_DSRºÍCyg_Interrupt::HANDLEDµÄʹÓ÷½·¨

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 tos_default_isr( UINT32 vector, UINT32 data)

+{

+    //HAL_INTERRUPT_MASK(vector);

+    return 0x03;    /* Cyg_Interrupt::CALL_DSR | Cyg_Interrupt::HANDLED */

+}

+

+#ifdef _USE_OSS_MIN

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´´½¨Ìض¨ÖжϵÄÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ²Î¼û²ÎÊýÁбíÖеÄ×¢ÊÍ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³ÌµÄ¾ä±ú

+* ÆäËü˵Ã÷:     1) Èô´´½¨Ê§°Ü£¬ÏµÍ³¶ÏÑÔ£»

+                2) ¸Ãº¯ÊýÖÐÉêÇëµÄÄÚ´æ¿Õ¼ä£¬ÔÚtos_delete_irqº¯ÊýÖÐÊÍ·Å£»

+**************************************************************************/

+UINT32 tos_create_irq(

+                UINT32 vector,              /* ÖжÏÏòÁ¿         */

+                UINT32 priority,            /* ÖжÏÓÅÏȼ¶       */

+                UINT32 data,                /* Êý¾ÝÖ¸Õë         */

+                tos_isr_t  isr,             /* ÖжϷþÎñÀý³Ì     */

+                tos_dsr_t  dsr,             /* ÖжÏÑÓ³Ù·þÎñÀý³Ì */

+                cyg_interrupt *interrupt)   /* ÖжϽṹÌåÖ¸Õë   */

+{

+    cyg_handle_t interrupt_handle = 0x00;

+

+    CYG_ASSERT(interrupt != NULL, "NULL");

+

+    TOS_TRANSLATE_VECTOR(vector, vector);

+    if (isr == NULL)

+        isr = tos_default_isr;

+

+    cyg_interrupt_create(

+        vector,             /* Vector to attach to          */

+        priority,           /* Queue priority               */

+        data,               /* Data pointer                 */

+        (cyg_ISR_t *)isr,   /* Interrupt Service Routine    */

+        (cyg_DSR_t *)dsr,   /* Deferred Service Routine     */

+        &interrupt_handle,  /* returned handle              */

+        interrupt           /* put interrupt here           */

+    );

+    CYG_ASSERT(interrupt_handle != 0x00, "NULL");

+    cyg_interrupt_attach( interrupt_handle );

+    cyg_interrupt_unmask(vector);

+

+    return interrupt_handle;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ɾ³ýÌØ¶¨ÖжϵÄÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  interrupt_handle:   ´ýɾ³ýµÄÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³ÌµÄ¾ä±ú

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ×¢Òâϵͳµ÷ÓõÄ˳Ðò£¬²»Äܵߵ¹:

+                1) ½û¸ÃÖжϣ»

+                2) ½â³ýÖжϹҽӣ»

+                3) ɾ³ýÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³Ì£»

+                4) ÊÍ·Åtos_create_irqº¯ÊýÖÐÉêÇëµÄÄÚ´æ¿Õ¼ä£»

+**************************************************************************/

+VOID tos_delete_irq(UINT32 interrupt_handle)

+{

+    cyg_interrupt *icb = NULL;     /* interrupt control block */

+

+    CYG_ASSERT(interrupt_handle != 0x00, "NULL");

+

+    icb = (cyg_interrupt*)interrupt_handle;

+    cyg_interrupt_mask(icb->vector);

+    cyg_interrupt_detach(interrupt_handle);

+    cyg_interrupt_delete(interrupt_handle);

+}

+#else

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´´½¨Ìض¨ÖжϵÄÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ²Î¼û²ÎÊýÁбíÖеÄ×¢ÊÍ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³ÌµÄ¾ä±ú

+* ÆäËü˵Ã÷:     1) Èô´´½¨Ê§°Ü£¬ÏµÍ³¶ÏÑÔ£»

+                2) ¸Ãº¯ÊýÖÐÉêÇëµÄÄÚ´æ¿Õ¼ä£¬ÔÚtos_delete_irqº¯ÊýÖÐÊÍ·Å£»

+**************************************************************************/

+UINT32 tos_create_irq(UINT32 vector,        /* ÖжÏÏòÁ¿         */

+                      UINT32 priority,      /* ÖжÏÓÅÏȼ¶       */

+                      UINT32 data,          /* Êý¾ÝÖ¸Õë         */

+                      tos_isr_t isr,        /* ÖжϷþÎñÀý³Ì     */

+                      tos_dsr_t dsr)        /* ÖжÏÑÓ³Ù·þÎñÀý³Ì */

+{

+    cyg_interrupt   *interrupt          = NULL;      /* interrupt control block */

+    cyg_handle_t    interrupt_handle    = 0x00;

+

+    interrupt = (cyg_interrupt*)malloc(sizeof(cyg_interrupt));

+    zOss_AssertEx(interrupt != NULL, ZOSS_ERROR);

+

+    TOS_TRANSLATE_VECTOR(vector, vector);

+

+    if (isr == NULL)

+        isr = tos_default_isr;

+

+    cyg_interrupt_create(

+        vector,             /* Vector to attach to          */

+        priority,           /* Queue priority               */

+        data,               /* Data pointer                 */

+        (cyg_ISR_t *)isr,   /* Interrupt Service Routine    */

+        (cyg_DSR_t *)dsr,   /* Deferred Service Routine     */

+        &interrupt_handle,  /* returned handle              */

+        interrupt           /* put interrupt here           */

+    );

+    zOss_AssertEx(interrupt_handle != 0x00, ZOSS_ERROR);

+    cyg_interrupt_attach( interrupt_handle );

+    cyg_interrupt_unmask(vector);

+

+    return interrupt_handle;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ɾ³ýÌØ¶¨ÖжϵÄÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  interrupt_handle:   ´ýɾ³ýµÄÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³ÌµÄ¾ä±ú

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ×¢Òâϵͳµ÷ÓõÄ˳Ðò£¬²»Äܵߵ¹:

+                1) ½û¸ÃÖжϣ»

+                2) ½â³ýÖжϹҽӣ»

+                3) ɾ³ýÖжϷþÎñÀý³ÌºÍÖжÏÑÓ³Ù·þÎñÀý³Ì£»

+                4) ÊÍ·Åtos_create_irqº¯ÊýÖÐÉêÇëµÄÄÚ´æ¿Õ¼ä£»

+**************************************************************************/

+VOID tos_delete_irq(UINT32 interrupt_handle)

+{

+    cyg_interrupt *icb = NULL;     /* interrupt control block */

+    zOss_AssertExN(interrupt_handle != 0x00);

+    

+    icb = (cyg_interrupt*)interrupt_handle;

+    cyg_interrupt_mask(icb->vector);

+    cyg_interrupt_detach(interrupt_handle);

+    cyg_interrupt_delete(interrupt_handle);

+    free((void*)interrupt_handle);

+}

+#endif

+

+

+#ifdef TOS_TRACE_IRQ

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´ò¿ªirq¸ú×Ù¹¦ÄÜ£»

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_irq_open(void)

+{

+    tos_trace_irq_disable_flag = 1;

+    tos_trace_irq_enable_flag  = 1;

+    tos_trace_irq_save_flag    = 1;

+    tos_trace_irq_restore_flag = 1;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¹Ø±Õirq¸ú×Ù¹¦ÄÜ£»

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_irq_close(void)

+{

+    tos_trace_irq_disable_flag = 0;

+    tos_trace_irq_enable_flag  = 0;

+    tos_trace_irq_save_flag    = 0;

+    tos_trace_irq_restore_flag = 0;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×ÙȥʹÄÜÖжÏ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  file:   ÎļþÃû

+                line:   ÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_disable_irq(const char *file, unsigned int line)

+{

+    if (tos_trace_irq_disable_flag) 

+    {

+        tos_trace_irq_disable[tos_trace_irq_disable_count].file   = file;

+        tos_trace_irq_disable[tos_trace_irq_disable_count].line   = line;

+        tos_trace_irq_disable[tos_trace_irq_disable_count].tick   = oss_trace_get_time();

+        tos_trace_irq_disable_total_count++;

+        if (++tos_trace_irq_disable_count >= TOS_TRACE_IRQ_NUM)

+        {

+            tos_trace_irq_disable_count = 0x00;

+        }

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×ÙʹÄÜÖжÏ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  file:   ÎļþÃû

+                line:   ÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_enable_irq(const char *file, unsigned int line)

+{

+    if (tos_trace_irq_enable_flag) 

+    {

+        tos_trace_irq_enable[tos_trace_irq_enable_count].file = file;

+        tos_trace_irq_enable[tos_trace_irq_enable_count].line = line;

+        tos_trace_irq_enable[tos_trace_irq_enable_count].tick = oss_trace_get_time();

+        tos_trace_irq_enable_total_count++;

+        if (++tos_trace_irq_enable_count >= TOS_TRACE_IRQ_NUM)

+        {

+            tos_trace_irq_enable_count = 0x00;

+        }

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×Ù±£´æÖжÏ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  file:   ÎļþÃû

+                line:   ÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_save_irq(const char *file, unsigned int line)

+{

+    if (tos_trace_irq_save_flag) 

+    {

+        tos_trace_irq_save[tos_trace_irq_save_count].file = file;

+        tos_trace_irq_save[tos_trace_irq_save_count].line = line;

+        tos_trace_irq_save[tos_trace_irq_save_count].tick = oss_trace_get_time();

+        tos_trace_irq_save_total_count++;

+        if (++tos_trace_irq_save_count >= TOS_TRACE_IRQ_NUM)

+        {

+            tos_trace_irq_save_count = 0x00;

+        }

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ú×Ù»Ö¸´ÖжÏ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  file:   ÎļþÃû

+                line:   ÐкÅ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_restore_irq(const char *file, unsigned int line)

+{

+    if (tos_trace_irq_restore_flag) 

+    {

+        tos_trace_irq_restore[tos_trace_irq_restore_count].file   = file;

+        tos_trace_irq_restore[tos_trace_irq_restore_count].line   = line;

+        tos_trace_irq_restore[tos_trace_irq_restore_count].tick   = oss_trace_get_time();

+        tos_trace_irq_restore_total_count++;

+        if (++tos_trace_irq_restore_count >= TOS_TRACE_IRQ_NUM)

+        {

+            tos_trace_irq_restore_count = 0x00;

+        }

+    }

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²âÊÔ¸ú×ÙÖжϽӿÚÊÇ·ñÕý³£

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+                void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_trace_irq_assert(void)

+{

+    //volatile int cnt;

+    ZOSS_INTR old_intr;

+

+    ZOSS_SAVE_IRQ(old_intr);

+    *(unsigned int *)0x01 = 0x12345678;

+    //for (cnt = 0x00; cnt < 60000000; cnt++);

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+#endif  /* TOS_TRACE_IRQ */

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_kernel.c b/cp/ps/plat/src/oss/osa/tos/src/tos_kernel.c
new file mode 100644
index 0000000..aa41bfd
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_kernel.c
@@ -0,0 +1,2527 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_kernel.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ¶ÔTOS²Ù×÷ϵͳÌṩµÄ½Ó¿Ú½øÐзâ×°£¬ÒÔÌṩͳһµÄ²Ù×÷ϵͳÊÊÅä²ã½Ó¿Ú

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/02/15

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ÁõÑÇÄÏ

+* °æ ±¾ ºÅ : V1.1

+* ÐÞ¸ÄÈÕÆÚ : 2012/03/02

+* ÐÞ¸ÄÄÚÈÝ : ¼ÓÈëÏ̴߳´½¨¡¢É¾³ý¡¢ÇÐÈë¡¢ÇгöµÄÖ§³Å²ã¹³×Óº¯Êý

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+#include "oss_api.h"

+#include "osa.h"

+#include "sup.h"

+#include "tos_typedef.h"

+

+#ifdef _USE_PSM

+#include "drvs_pow.h"

+#include "drvs_pwr.h"

+#endif

+#include "drvs_l2cache.h"

+#include "tos_link_info.h"

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷                                  

+**************************************************************************/

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷                                  

+**************************************************************************/

+extern VOID Osa_SysErrHndInit(VOID);

+extern void tos_cache_clean_all(void);

+

+#ifdef _USE_PSM

+extern SINT32  Hal_GetArmCoreFreq(UINT32*feq);

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef _USE_THREAD

+#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK

+# define TOS_THREAD_STACK_IRQ_MIN_SIZE (512)

+#else

+# define TOS_THREAD_STACK_IRQ_MIN_SIZE  (2048)

+#endif

+#define TOS_THREAD_STACK_MIN_SIZE       (CYGNUM_HAL_STACK_SIZE_MINIMUM + TOS_THREAD_STACK_IRQ_MIN_SIZE)

+#endif

+

+#ifdef _USE_MESSAGE

+# define THREAD_MSG_HEAD_SIZE           (sizeof(T_THREAD_MSG_HEAD))

+# define THREAD_MSG_HEAD(buf)           ((T_THREAD_MSG_HEAD *)((UINT8 *)(buf) - THREAD_MSG_HEAD_SIZE))

+# define THREAD_MSG_BUF(head)           ((VOID *)((UINT8 *)(head) + THREAD_MSG_HEAD_SIZE))

+# define THREAD_MSG_SIZE(size)          ((size) + THREAD_MSG_HEAD_SIZE)

+# define THREAD_MSG_MAGIC               0x3A3A3A3A

+# define THREAD_MSG_HOOK_TYPE_MAX       ZOSS_SETHOOKFLAG_INTER

+# define THREAD_MSG_HOOK_DIRE_MAX       ZOSS_MSGDIRE_INOUT

+#endif

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/* Thread state values */

+enum {                          

+    OSA_THREAD_RUNNING      = 0,    /* Thread is runnable or running                */

+    OSA_THREAD_SLEEPING     = 1,    /* Thread is waiting for something to happen    */

+    OSA_THREAD_COUNTSLEEP   = 2,    /* Sleep in counted manner                      */

+    OSA_THREAD_SUSPENDED    = 4,    /* Suspend count is non-zero                    */

+    OSA_THREAD_CREATING     = 8,    /* Thread is being created                      */

+    OSA_THREAD_EXITED       = 16,   /* Thread has exited                            */

+    /* This is the set of bits that must be cleared by a generic wake() or release(). */

+    OSA_THREAD_SLEEPSET     = (OSA_THREAD_SLEEPING | OSA_THREAD_COUNTSLEEP)

+};                                  

+

+#ifdef _USE_MESSAGE 

+typedef struct {

+    SIGSELECT   sig_no; /* ³ÉÔ±ÔڽṹÌåÖеÄλÖò»Äܸıä */

+    UINT32      id;

+    UINT32      buf_size;

+    UINT32      magic;

+} T_THREAD_MSG_HEAD;

+

+typedef struct {

+    T_ZOss_Node     Node;                           /* Ïà¶ÔλÖò»ÄÜ¸Ä±ä             */

+    ZOSS_THREAD_ID  thread_id;

+    UINT8           dire[THREAD_MSG_HOOK_TYPE_MAX]; /* 0: ZOSS_SETHOOKFLAG_MONI=1   */

+    THREAD_MSG_HOOK func[THREAD_MSG_HOOK_TYPE_MAX]; /* 0: ZOSS_SETHOOKFLAG_MONI=1   */

+} THREAD_MSG_HOOK_CONTENT;

+#endif

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+UINT32 Osa_HwTimeRead(VOID);

+UINT32 Osa_DisplayThreadsExecInfo(UINT32 type);

+

+#ifdef TOS_STATISTIC_TIMESLICE

+static ZOSS_TIMER_ID zOss_GetStatisticTimesliceTimer(void);

+static void zOss_SetStatisticTimesliceTimer(ZOSS_TIMER_ID timer_id);

+static void zOss_StatisticTimesliceEnd(SINT32 param);

+#endif

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static BOOL         gOsa_SwapFlag           = FALSE;    /* Ïß³Ìhook¿ªÆô±êÖ¾         */

+static UINT32       gOsa_SwapLastTime       = 0;        /* ×îºóÒ»´Îͳ¼ÆÏß³ÌÇл»Ê±¼ä */

+static UINT32       gOsa_CpuStartTime       = 0;        /* ¿ªÊ¼Í³¼ÆÏß³ÌÖ´ÐÐʱ¼ä     */

+static ZOSS_TASK_ID *gOsa_AllTaskIdArray    = NULL;     /* ÈÎÎñͳ¼ÆÊý×é             */

+#ifdef _USE_MESSAGE

+static T_ZOss_List  s_thread_msg_hook_list  = {0};      /* Ï̹߳³×ÓÏûÏ¢Á´±í         */

+#endif

+

+#ifdef _USE_MONITOR

+static T_ZOss_Mon_Msg gOsa_MsgInfo = {0};

+#endif

+

+#ifdef TOS_STATISTIC_TIMESLICE

+static ZOSS_TIMER_ID tos_statistic_timeslice_timer = NULL;

+#endif

+

+UINT32  gOsa_SysCpuFreq     = 0;        /* Ó²¼þ¼ÆÊýÆ÷ƵÂÊ               */

+BOOL    gOsa_SwapTimeFlag   = FALSE;    /* Ïß³ÌÇл»¼Ç¼cpuʱ¼ä±êÖ¾      */

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÑéÖ¤Ïß³ÌÊÇ·ñÓÐЧ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:´ýÑéÖ¤µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static UINT32 zOss_IdVerify(ZOSS_THREAD_ID thread_id)

+{

+    zOss_AssertEx(thread_id != NULL, ZOSS_ERROR);

+    

+#ifdef CYGOPT_KERNEL_EXTEND_CHECK_THREAD_VALID

+    if (cyg_thread_check_valid((cyg_handle_t)thread_id) == true)

+    {

+        return ZOSS_SUCCESS;

+    }

+#endif

+    return ZOSS_ERROR;

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ³õʼ»¯Ï̵߳ÄÓû§¿Õ¼ä

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     ´ý³õʼ»¯Óû§Êý¾Ý¿Õ¼äµÄÏß³Ì

+                user_area:  Ïß³ÌÓû§Êý¾ÝÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void zOss_InitThreadUserArea(cyg_handle_t thread, T_ZOsa_ThreadUserArea *user_area)

+{

+    zOss_AssertExN(thread != 0x00 && user_area != NULL);

+    

+    strcpy((char *)user_area->threadname, cyg_thread_get_name(thread));

+    user_area->stacksize    = (UINT32)cyg_thread_get_stack_size_real(thread);

+    user_area->topstack     = (UINT32)cyg_thread_get_stack_base_real(thread);

+    user_area->topstack     += user_area->stacksize;

+    user_area->heapsize     = 0xFFFFFFFF;

+    user_area->threadid     = (ZOSS_THREAD_ID)thread;

+    user_area->ubsize       = 0;

+    user_area->ptrf         = 0;

+    user_area->runcount     = 0;

+    user_area->curtaskid    = 0;

+    user_area->cpupercent   = 0;

+    user_area->runtime      = 0;

+    user_area->cputime      = 0;

+    user_area->RunTimeInMs  = 0;

+    user_area->sleepsem     = NULL;    

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼ÆËãÏß³ÌÕ»¿Õ¼äµÄʹÓÃÂÊ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ï̵߳Äid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Ïß³ÌÕ»¿Õ¼äµÄʹÓÃÂÊ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static UINT8 zOss_GetThreadStackUsed( ZOSS_THREAD_ID thread_id)

+{

+    cyg_handle_t    thread_handle   = 0x00;

+    cyg_uint32      stack_used      = 0x00;

+    cyg_uint32      stack_size      = 0x00;

+

+    zOss_ASSERT(thread_id != NULL);

+

+    thread_handle   = (cyg_handle_t)thread_id;

+#ifdef CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT

+    stack_used  = cyg_thread_measure_stack_usage(thread_handle);

+#else

+    stack_used  = 0x00;

+#endif

+    stack_size  = cyg_thread_get_stack_size_real(thread_handle);

+

+    return (UINT8)((stack_used * 100) / stack_size);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸üÐÂϵͳÖÐËùÓÐÏ̵߳ÄCPUÕ¼ÓÃÂÊ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void Osa_UpdateThreadCpu(void)

+{

+    cyg_handle_t            thread_handle   = 0x00;

+    cyg_uint16              thread_id       = 0x00;

+    T_ZOsa_ThreadUserArea   *user_area      = NULL;

+    UINT32                  totaltime       = 0;

+

+    /* ¶¨Ê±Ë¢ÐµÄÏß³ÌÖ´ÐÐÇé¿ö,ʱ¼äµÄ»ñÈ¡µ÷ÓÃÇý¶¯µÄº¯Êý,µ¥Î»Î¢Ãî,¾«¶È½Ï¸ß */

+    totaltime = Osa_HwTimeRead() - gOsa_CpuStartTime;

+    

+    while (cyg_thread_get_next(&thread_handle, &thread_id)) 

+    {

+        zOss_AssertExN(thread_handle != 0x00 && thread_id != 0x00);

+        

+        user_area = (T_ZOsa_ThreadUserArea *)cyg_thread_get_user_area(thread_handle);

+        zOss_AssertExN(user_area != NULL);

+        

+        user_area->cpupercent = (FLOAT)(user_area->cputime) * 100 / totaltime;

+        user_area->cputime = 0;

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸üÐÂϵͳÖÐËùÓÐÈÎÎñµÄCPUÕ¼ÓÃÂÊ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void Osa_UpdateTaskCpu(void)

+{

+    UINT32      cnt         = 0;

+    UINT32      tcb_no      = 0;

+    T_ZOss_TCB  *tcb        = NULL;

+    UINT32      totaltime   = 0;

+

+    totaltime = Osa_HwTimeRead() - gOsa_CpuStartTime;

+    

+    zOss_AssertExN(gOsa_AllTaskIdArray != NULL);

+

+    tcb_no = zOss_GetAllTaskID(gOsa_AllTaskIdArray);

+    for (cnt = 0x00; cnt < tcb_no; cnt++)

+    {

+        tcb = (T_ZOss_TCB *)gOsa_AllTaskIdArray[cnt];

+        if (tcb->task_id != tcb)

+        {    

+            continue;

+        }

+        tcb->cpupercent = (FLOAT)(tcb->cputime) * 100 / totaltime;

+        tcb->cputime = 0;

+    }

+}

+

+#ifdef TOS_STATISTIC_TIMESLICE

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñȡʱ¼äƬͳ¼Æ¶¨Ê±Æ÷

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ʱ¼äƬͳ¼Æ¶¨Ê±Æ÷

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static ZOSS_TIMER_ID zOss_GetStatisticTimesliceTimer(void)

+{

+    return tos_statistic_timeslice_timer;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÉèÖÃʱ¼äƬͳ¼Æ¶¨Ê±Æ÷

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  timer_id:   ʱ¼äƬͳ¼Æ¶¨Ê±Æ÷µÄid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void zOss_SetStatisticTimesliceTimer(ZOSS_TIMER_ID timer_id)

+{

+    ZOSS_INTR old_intr = 0;

+

+    ZOSS_SAVE_IRQ(old_intr);

+    tos_statistic_timeslice_timer = timer_id;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¿ªÊ¼Í³¼ÆÖ¸¶¨Ê±¼ä¶ÎÄÚµÄʱ¼äƬ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  time_len:   ³¬Ê±Ê±¼ä£¬µ¥Î»: ms

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void zOss_StatisticTimesliceStart(UINT32 time_len, UINT32 type)

+{

+    ZOSS_TIMER_ID timer_id = NULL;

+

+    timer_id = zOss_GetStatisticTimesliceTimer();

+    if(timer_id != NULL)

+    {

+        zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_ABNORMAL, "ÕýÔÚͳ¼ÆÏß³ÌÖ´ÐÐÇé¿ö£¬ÇëÉÔºò");

+        return;

+    }

+    

+#ifdef CYGOPT_KERNEL_EXTEND_CLOCK_STATISTIC_TIMESLICE

+    cyg_zero_statistic_counter_value();

+#endif

+

+#ifdef CYGOPT_KERNEL_EXTEND_THREAD_STATISTIC_TIMESLICE

+    cyg_thread_zero_all_statistic_timeslice();

+#endif

+

+    timer_id = zOss_CreateTimer("tos_statistic_timeslice_timer",    /* name     */

+                                zOss_StatisticTimesliceEnd,         /* callback */

+                                (SINT32)type,                       /* param    */

+                                FALSE);                             /* period   */

+    zOss_SetStatisticTimesliceTimer(timer_id);

+    zOss_StartTimer(timer_id, time_len, zOss_StatisticTimesliceEnd, (SINT32)type);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ½áÊøÍ³¼ÆÖ¸¶¨Ê±¼ä¶ÎÄÚµÄʱ¼äƬ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  param:  ¶¨Ê±Æ÷²ÎÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void zOss_StatisticTimesliceEnd(SINT32 param)

+{

+    ZOSS_TIMER_ID timer_id = NULL;

+

+    timer_id = zOss_GetStatisticTimesliceTimer();

+    zOss_KillTimer(timer_id);

+    zOss_SetStatisticTimesliceTimer(NULL);

+

+    Osa_DisplayThreadsExecInfo((UINT32)param);

+}

+#endif

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾ÝÏß³Ìid£¬´ÓÏß³ÌÏûÏ¢¹³×ÓÁ´±íÖвéÕÒÆ¥ÅäµÄ½Úµã

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ïß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ²éÕҳɹ¦£¬·µ»ØÆ¥ÅäµÄ½Úµã£¬·ñÔò·µ»ØNULL

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+#ifdef _USE_MESSAGE

+static THREAD_MSG_HOOK_CONTENT* find_thread_content(ZOSS_THREAD_ID thread_id)

+{

+    THREAD_MSG_HOOK_CONTENT *msg_hook = (THREAD_MSG_HOOK_CONTENT *)zOss_ListFirst(&s_thread_msg_hook_list);

+

+    while (msg_hook) 

+    {

+        if (msg_hook->thread_id == thread_id)

+        {

+            break;

+        }

+        

+        msg_hook = (THREAD_MSG_HOOK_CONTENT *)zOss_ListNext((T_ZOss_Node *)msg_hook);

+    }

+

+    return msg_hook;

+}

+#endif

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ÏûÏ¢½Ó¿Ú·¢ËÍÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  msg_head:  ÏûÏ¢ÐÅÏ¢´æ·ÅµØÖ·

+*               thread_id: Ä¿±êÏ̵߳ÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+#ifdef _USE_MESSAGE

+static inline void zOss_GetSendMsgInfo(thread_msg_t *msg_head, ZOSS_THREAD_ID thread_id)

+{

+#if defined (OSS_TRACE_THREAD) && defined(_USE_MONITOR)

+    if (gOsa_MonitorFlag)

+    {

+        ZOSS_INTR   old_intr    = 0;

+        UINT32      cnt         = 0;

+        

+        ZOSS_SAVE_IRQ(old_intr);

+        cnt = gOsa_MsgInfo.num;

+        gOsa_MsgInfo.ele[cnt].msgId     = 0x00;

+        gOsa_MsgInfo.ele[cnt].ptr       = (UINT32)msg_head->msg_ptr;

+        gOsa_MsgInfo.ele[cnt].size      = msg_head->msg_size;

+        gOsa_MsgInfo.ele[cnt].receiver  = zOss_GetThreadName(thread_id, NULL);

+        gOsa_MsgInfo.ele[cnt].sender    = zOss_GetThreadName((ZOSS_THREAD_ID)cyg_thread_self(), NULL);

+        gOsa_MsgInfo.ele[cnt].timestamp = Osa_HwTimeRead();

+        if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+        {

+            cnt = 0;

+        }

+        gOsa_MsgInfo.num = cnt;

+        ZOSS_RESTORE_IRQ(old_intr);

+    }

+#endif 

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ÏûÏ¢½Ó¿Ú½ÓÊÜÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  msg_head:  ÏûÏ¢ÐÅÏ¢´æ·ÅµØÖ·

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static inline void zOss_GetRecvMsgInfo(thread_msg_t *msg_head)

+{

+#ifdef _USE_MONITOR

+    if (gOsa_MonitorFlag)

+    {

+        ZOSS_INTR   old_intr    = 0;

+        UINT32      cnt         = 0;

+

+        ZOSS_SAVE_IRQ(old_intr);

+        cnt = gOsa_MsgInfo.num;

+        gOsa_MsgInfo.ele[cnt].msgId     = 0x00;

+        gOsa_MsgInfo.ele[cnt].ptr       = (UINT32)msg_head->msg_ptr;

+        gOsa_MsgInfo.ele[cnt].size      = msg_head->msg_size;

+        gOsa_MsgInfo.ele[cnt].receiver  = zOss_GetThreadName((ZOSS_THREAD_ID)cyg_thread_self(), NULL);

+        gOsa_MsgInfo.ele[cnt].sender    = "unknown";

+        gOsa_MsgInfo.ele[cnt].timestamp = Osa_HwTimeRead();

+        if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+        {

+            cnt = 0;

+        }

+        gOsa_MsgInfo.num = cnt;

+        ZOSS_RESTORE_IRQ(old_intr);

+    }

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡Ïß³ÌÏûÏ¢½Ó¿Ú·¢ËÍÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  msg_id:           ÏûÏ¢id

+*               thread_msg_head:  ÏûÏ¢ÐÅÏ¢´æ·ÅµØÖ·

+*               thread_id:        Ä¿±êÏ̵߳ÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static inline void zOss_GetThreadSendMsgInfo(

+                            UINT32 msg_id, 

+                            T_THREAD_MSG_HEAD *thread_msg_head,

+                            ZOSS_THREAD_ID thread_id)

+{

+#ifdef _USE_MONITOR

+        if (gOsa_MonitorFlag)

+        {

+            ZOSS_INTR   old_intr    = 0;

+            UINT32      cnt         = 0;

+

+            ZOSS_SAVE_IRQ(old_intr);

+            cnt = gOsa_MsgInfo.num;

+            gOsa_MsgInfo.ele[cnt].msgId     = msg_id;

+            gOsa_MsgInfo.ele[cnt].ptr       = (UINT32)thread_msg_head;

+            gOsa_MsgInfo.ele[cnt].size      = thread_msg_head->buf_size;

+            gOsa_MsgInfo.ele[cnt].receiver  = zOss_GetThreadName(thread_id, NULL);

+            gOsa_MsgInfo.ele[cnt].sender    = zOss_GetThreadName((ZOSS_THREAD_ID)cyg_thread_self(), NULL);

+            gOsa_MsgInfo.ele[cnt].timestamp = Osa_HwTimeRead();

+            if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+            {

+                cnt = 0;

+            }

+            gOsa_MsgInfo.num = cnt;

+            ZOSS_RESTORE_IRQ(old_intr);

+        }

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡Ïß³ÌÏûÏ¢½Ó¿Ú½ÓÊÜÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_msg_head:  ÏûÏ¢ÐÅÏ¢´æ·ÅµØÖ·               

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static inline void zOss_GetThreadRecvMsgInfo(T_THREAD_MSG_HEAD *thread_msg_head)                       

+{

+#ifdef _USE_MONITOR

+    if (gOsa_MonitorFlag)

+    {

+        ZOSS_INTR   old_intr    = 0;

+        UINT32      cnt         = 0;

+

+        ZOSS_SAVE_IRQ(old_intr);

+        cnt = gOsa_MsgInfo.num; 

+        gOsa_MsgInfo.ele[cnt].msgId     = thread_msg_head->id;

+        gOsa_MsgInfo.ele[cnt].ptr       = (UINT32)thread_msg_head;

+        gOsa_MsgInfo.ele[cnt].size      = thread_msg_head->buf_size;

+        gOsa_MsgInfo.ele[cnt].receiver  = zOss_GetThreadName((ZOSS_THREAD_ID)cyg_thread_self(), NULL);

+        gOsa_MsgInfo.ele[cnt].sender    = "unknown";

+        gOsa_MsgInfo.ele[cnt].timestamp = Osa_HwTimeRead();

+        if (++cnt >= OSS_MON_INFO_MAX_NUMBER)

+        {

+            cnt = 0;

+        }

+        gOsa_MsgInfo.num = cnt;

+        ZOSS_RESTORE_IRQ(old_intr);

+    }

+#endif

+}

+#endif

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Osa_AddrInText

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  addr: Ö¸¶¨µÄµØÖ·

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ÅжÏÖ¸¶¨µÄµØÖ··¶Î§ÊÇ·ñÊôÓÚ´úÂë¶Î

+**************************************************************************/

+static BOOL Osa_AddrInText(UINT32 addr)

+{

+    if((addr <= tos_text_vma_end() && addr >= tos_text_vma_start())

+       || (addr < tos_itcm_vma_end() && addr>= tos_itcm_vma_start())) 

+    {

+        return TRUE;

+    }

+    return FALSE;

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+#ifdef _USE_THREAD

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄÏ̴߳´½¨º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ¼ûÁбí

+*   (´«³ö²ÎÊý)  ¼ûÁбí

+* ·µ »Ø Öµ:     ÒÑ´´½¨µÄÏ߳̾ä±ú(Ï߳̿ØÖÆ¿éµÄÖ¸Õë)

+* ÆäËü˵Ã÷:     ÈôÏ̴߳´½¨Ê§°Ü£¬ÏµÍ³¶ÏÑÔ

+**************************************************************************/

+ZOSS_THREAD_ID zOss_CreateThread(

+                    const CHAR *thread_name,    /* name                 */

+                    VOID (*entry)(SINT32),      /* entry                */

+                    SINT32 arg,                 /* arguments pointer    */

+                    UINT32 stack_size,          /* stack size           */

+                    UINT32 priority,            /* priority             */

+                    UINT32 preempt,             /* useless              */

+                    UINT32 auto_start)          /* auto start           */

+{

+    cyg_handle_t thread_handle = 0x00;

+

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && 

+                  tos_get_dsr_nesting_level() == 0x00 &&

+                  thread_name != NULL, 

+                  NULL);

+    zOss_AssertEx(strlen((char *)thread_name) <= CYGOPT_KERNEL_EXTEND_THREAD_NAME, NULL);

+    zOss_AssertEx(entry != NULL && priority <= OSA_LOWESTPRIORITY, NULL);

+

+    stack_size += TOS_THREAD_STACK_IRQ_MIN_SIZE;

+    cyg_thread_create(priority,                       /* scheduling info (eg pri) */

+                      (cyg_thread_entry_t  *)entry,   /* entry point function     */

+                      (cyg_addrword_t)arg,            /* entry data               */

+                      (char*)thread_name,             /* optional thread name     */

+                      NULL,                           /* stack base, NULL = alloc */

+                      stack_size,                     /* stack size, 0 = default  */

+                      &thread_handle,                 /* returned thread handle   */

+                      NULL);                          /* put thread here          */

+    preempt = preempt;

+

+    if (auto_start)

+    {

+        cyg_thread_resume(thread_handle);

+    }

+

+    return (ZOSS_THREAD_ID)thread_handle;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄÏß³ÌÍ˳öº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID zOss_ExitThread(VOID)

+{

+    zOss_AssertExN(tos_get_isr_nesting_level() == 0x00 && tos_get_dsr_nesting_level() == 0x00);

+    cyg_thread_exit();

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄÏß³Ì¹ÒÆðº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ðè±»¹ÒÆðµÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     ±¾º¯Êý¿ÉÒÔÓÃÓÚÏ̵߳Ä×ÔÎÒ¹ÒÆð

+**************************************************************************/

+UINT32 zOss_SuspendThread(ZOSS_THREAD_ID thread_id)

+{

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && 

+                  tos_get_dsr_nesting_level() == 0x00 &&

+                  thread_id != NULL, 

+                  ZOSS_ERROR);

+

+#ifdef CYGOPT_KERNEL_EXTEND_CHECK_THREAD

+    if (cyg_thread_check_valid((cyg_handle_t)thread_id) == false)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+

+    cyg_thread_suspend((cyg_handle_t)thread_id);

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄÏָ̻߳´º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ðè±»»Ö¸´µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     ±¾º¯ÊýÖ»ÊÇʹÏ߳̽øÈë¾ÍÐ÷̬£¬ÈôÓиßÓÅÏȼ¶µÄÏß³ÌÔÚÖ´Ðлò´¦ÓÚ¾ÍÐ÷̬

+                £¬±¾Ïß³ÌÈÔÐèµÈ´ý.

+**************************************************************************/

+UINT32 zOss_ResumeThread(ZOSS_THREAD_ID thread_id)

+{

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && 

+                  tos_get_dsr_nesting_level() == 0x00 &&

+                  thread_id != NULL, 

+                  ZOSS_ERROR);

+

+#ifdef CYGOPT_KERNEL_EXTEND_CHECK_THREAD

+    if (cyg_thread_check_valid((cyg_handle_t)thread_id) == false)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+

+    cyg_thread_resume((cyg_handle_t)thread_id);

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄÏß³Ì˯Ãߺ¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  time_in_ms:     Ï߳̽«ÒªË¯ÃßµÄʱ¼ä£¬µ¥Î»: ms

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ϵͳʱÖӵįµÂÊÉÐδÑéÖ¤£¬ÑÓ³Ùʱ¼ä²»×¼È·

+**************************************************************************/

+VOID zOss_Sleep(UINT32 time_in_ms)

+{

+    zOss_AssertExN(tos_get_isr_nesting_level() == 0x00 && tos_get_dsr_nesting_level() == 0x00);

+    cyg_thread_delay((cyg_tick_count_t)time_in_ms);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄÏß³Ìɾ³ýº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ½«±»É¾³ýµÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     zOss_CreateThreadº¯ÊýÖÐÉêÇëµÄÏß³ÌÕ»¿Õ¼äºÍÏ߳̿ØÖÆ¿é½á¹¹¿Õ¼ä»áÔÚ

+                Cyg_Thread::exitº¯ÊýÖÐÊÍ·Å£¬ÒòΪÔÚcyg_thread_deleteº¯ÊýÖ´ÐÐÍêºó£¬

+                ºóÃæµÄËùÓдúÂëËæ×ű¾Ï̵߳ÄÏûÍö¶ø±äµÃÎÞЧÁË¡£

+**************************************************************************/

+UINT32 zOss_DeleteThread(ZOSS_THREAD_ID thread_id)

+{

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && 

+                  tos_get_dsr_nesting_level() == 0x00 &&

+                  thread_id != NULL, 

+                  ZOSS_ERROR);

+

+#ifdef CYGOPT_KERNEL_EXTEND_CHECK_THREAD

+    if (cyg_thread_check_valid((cyg_handle_t)thread_id) == false)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+

+    cyg_thread_delete((cyg_handle_t)thread_id);

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²Ù×÷ϵͳÊÊÅä²ãµÄ»ñÈ¡µ±Ç°Ïß³ÌidµÄº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     µ±Ç°Ö´ÐÐÏ̵߳ÄÏß³Ìid

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+ZOSS_THREAD_ID zOss_GetCurThreadID(VOID)

+{

+    return (ZOSS_THREAD_ID)cyg_thread_self();

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³ÌÃû³Æ£¬²éÕÒ¸ÃÏ̵߳ÄÏß³Ìid

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_name:    Ïß³ÌÃû³Æ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô²éÕҳɹ¦£¬·µ»ØÏ̵߳ÄÓÐЧÏß³Ìid£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+ZOSS_THREAD_ID zOss_GetThreadIDByName (const CHAR *thread_name)

+{

+    zOss_AssertEx(thread_name != NULL, NULL);

+

+    return (ZOSS_THREAD_ID)cyg_thread_find_by_name(thread_name);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³Ìid£¬»ñÈ¡¸ÃÏ̵߳ÄÏß³ÌÃû³Æ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:      ´ý»ñÈ¡Ïß³ÌÃû³ÆµÄÏß³Ìid

+*   (´«³ö²ÎÊý)  thread_name:    Ïß³ÌÃû³Æ´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØÏß³ÌÃû³ÆÖ¸Õ룻·ñÔòϵͳ¶ÏÑÔ»ò·µ»Ø¿ÕÖ¸Õë

+* ÆäËü˵Ã÷:     Èôthread_name·Ç¿Õ£¬±íʾÐèÒª½«²Ù×÷ϵͳÌṩµÄÏß³ÌÃû³Æ¿½±´µ½¸Ã

+                ÄÚ´æµØÖ·£¬·ñÔòÎÞÐ追±´£¬Ö»Ðè·µ»ØÏß³ÌÃû³ÆÖ¸Õë

+**************************************************************************/

+CHAR *zOss_GetThreadName(ZOSS_THREAD_ID thread_id, CHAR *thread_name)

+{

+    char *name = NULL;

+

+    zOss_AssertEx(thread_id != NULL, NULL);

+

+#ifdef CYGOPT_KERNEL_EXTEND_CHECK_THREAD

+    if (cyg_thread_check_valid((cyg_handle_t)thread_id) == false)

+    {

+        return NULL;

+    }

+#endif

+

+    name = cyg_thread_get_name((cyg_handle_t)thread_id);

+    if (thread_name)

+    {

+        strcpy((char *)thread_name, name);

+    }

+

+    return (CHAR *)name;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³Ìid£¬»ñÈ¡¸ÃÏ̵߳ÄÏß³ÌÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ý»ñÈ¡Ïß³ÌÐÅÏ¢µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  ¼ûÁбí

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 zOss_GetThreadInfo(ZOSS_THREAD_ID thread_id,   /* id       */

+                          CHAR *thread_name,          /* Ãû³Æ     */

+                          UINT32 *stat,               /* ״̬     */

+                          UINT32 *priority,           /* ÓÅÏȼ¶   */

+                          UINT32 *preempt)            /* ¿ÉÇÀÕ¼   */

+{

+    cyg_thread_info info;

+    cyg_handle_t    thread_handle   = 0x00;

+    cyg_uint16      id              = 0x00;

+    cyg_bool        ret             = false;

+

+    zOss_AssertEx(thread_id != NULL, ZOSS_ERROR);

+

+#ifdef CYGOPT_KERNEL_EXTEND_CHECK_THREAD

+    if (cyg_thread_check_valid((cyg_handle_t)thread_id) == false)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+

+    thread_handle   = (cyg_handle_t)thread_id;

+    id              = cyg_thread_get_id(thread_handle);

+    ret             = cyg_thread_get_info( thread_handle, id, &info);

+    

+    zOss_AssertEx(ret == (cyg_bool)true, ZOSS_ERROR);

+

+    if (thread_name)

+    {

+        strcpy(thread_name, info.name);

+    }

+    

+    if (stat)

+    {   

+        *stat = info.state;

+    }

+    

+    if (priority)

+    {

+        *priority = info.cur_pri;

+    }

+    

+    if (preempt)

+    {

+        *preempt = 1;

+    }

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡µ±Ç°ËùÓÐÏ̵߳ÄÏà¹ØÐÅÏ¢(¼à¿ØÄ£¿é)

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void              

+*   (´«³ö²ÎÊý)  pMonThreadInfo: Ïß³ÌÐÅÏ¢´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ´Ëº¯ÊýÉêÇëµÄÄÚ´æ¿Õ¼ä£¬±ØÐëÓÉʹÓÃÕßÊÍ·Å£¬·ñÔò»áÔì³ÉÄÚ´æÐ¹Â¶¡£

+**************************************************************************/

+VOID z0ss_GetAllThreadInfo(T_ZOss_Mon_Thread *pMonThreadInfo)

+{

+#ifdef _USE_MONITOR

+    T_ZOss_Mon_Thread    threadInfo     = {0};

+    ZOSS_THREAD_ID      *thread_array   = NULL;

+    UINT32              cnt             = 0;

+

+    if (pMonThreadInfo == NULL)

+    {

+        return;

+    }

+

+    threadInfo.num = Osa_GetAllThreadId(&thread_array);

+    if (threadInfo.num == 0 || threadInfo.num == ZOSS_ERROR || thread_array == NULL)

+    {

+        return;

+    }

+

+    threadInfo.ele = (T_ZOss_Mon_Thread_Ele *)zOss_GetUB(threadInfo.num * sizeof(T_ZOss_Mon_Thread_Ele));

+    zOss_AssertExN(threadInfo.ele != NULL);

+    for (cnt = 0; cnt < threadInfo.num; cnt++)

+    {

+        T_ZOsa_ThreadUserArea   *user_area      = NULL;

+        cyg_handle_t            threadId        = 0;

+        cyg_uint32              stackSize       = 0;

+        cyg_addrword_t          stackBase       = 0;

+        cyg_addrword_t          stackPtr        = 0;

+#ifdef CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT

+        cyg_uint32              stackMaxUsed    = 0;

+#endif

+

+        user_area = Osa_GetThreadUserArea(thread_array[cnt], TRUE);

+        if (user_area == NULL)

+        {        

+            continue;

+        }

+

+        threadId                        = (cyg_handle_t)user_area->threadid;

+        threadInfo.ele[cnt].name        = user_area->threadname;

+        threadInfo.ele[cnt].handle      = (UINT32)threadId;

+        threadInfo.ele[cnt].msg_num     = user_area->msgnum;

+        threadInfo.ele[cnt].status      = user_area->runstatus;

+        threadInfo.ele[cnt].priority    = user_area->priority;

+        

+        stackSize   = cyg_thread_get_stack_size_real(threadId);

+        stackBase   = cyg_thread_get_stack_base_real(threadId);

+        stackPtr    = cyg_thread_get_stack_ptr(threadId);

+        

+        threadInfo.ele[cnt].stack_used      = (unsigned short)(((stackBase + stackSize - stackPtr) * 

+                                              OSS_MON_PERCENT_RADIO / stackSize) * OSS_MON_PERCENT_RADIO);      

+#ifdef CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT

+        stackMaxUsed                        = cyg_thread_measure_stack_usage(threadId);   

+        threadInfo.ele[cnt].stack_max_used  = (unsigned short)((stackMaxUsed * OSS_MON_PERCENT_RADIO /

+                                              stackSize) * OSS_MON_PERCENT_RADIO);

+#else

+        threadInfo.ele[cnt].stack_max_used  = 0;

+#endif

+        threadInfo.ele[cnt].cpu_load        = (unsigned short)(Osa_GetProcessCPU((ZOSS_THREAD_ID)threadId) * 

+                                              OSS_MON_PERCENT_RADIO);

+    }

+

+    zOss_Free(thread_array);

+    thread_array        = NULL;

+

+    pMonThreadInfo->num = threadInfo.num;

+    pMonThreadInfo->ele = threadInfo.ele;

+#endif   

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³Ìid£¬ÉèÖøÃÏ̵߳ÄÏß³ÌÓÅÏȼ¶

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ýÉèÖÃÓÅÏȼ¶µÄÏß³Ìid

+                priority:   Ï߳̽«±»ÉèÖõÄÓÅÏȼ¶

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 zOss_SetThreadPri(ZOSS_THREAD_ID thread_id, UINT32 priority)

+{

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && 

+                  tos_get_dsr_nesting_level() == 0x00 &&

+                  thread_id != NULL && 

+                  priority <= OSA_LOWESTPRIORITY, 

+                  ZOSS_ERROR);

+    

+#ifdef CYGOPT_KERNEL_EXTEND_CHECK_THREAD

+    if (cyg_thread_check_valid((cyg_handle_t)thread_id) == false)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+

+    cyg_thread_set_priority((cyg_handle_t)thread_id, (cyg_priority_t)priority);

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸ù¾Ý²ÎÊýÌṩµÄÏß³Ìid£¬»ñÈ¡¸ÃÏ̵߳ÄÏß³ÌÓÅÏȼ¶

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ý»ñÈ¡ÓÅÏȼ¶µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  priority:   »ñÈ¡µÄÏß³ÌÓÅÏȼ¶´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 zOss_GetThreadPri(ZOSS_THREAD_ID thread_id, UINT32 *priority)

+{

+    zOss_AssertEx(thread_id != NULL && priority != NULL, ZOSS_ERROR);

+

+#ifdef CYGOPT_KERNEL_EXTEND_CHECK_THREAD

+    if (cyg_thread_check_valid((cyg_handle_t)thread_id) == false)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+

+    *priority = (UINT32)cyg_thread_get_priority((cyg_handle_t)thread_id);

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡Ïß³ÌÓû§Êý¾Ý¿Õ¼äµÄÖ¸Õë

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ý»ñÈ¡Óû§Êý¾Ý¿Õ¼äÖ¸ÕëµÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Ï̵߳ÄÓû§Êý¾Ý¿Õ¼äµÄÖ¸Õë

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+T_ZOsa_ThreadUserArea *zOss_GetThreadUserArea(ZOSS_THREAD_ID thread_id)

+{

+    cyg_handle_t            thread_handle   = 0x00;

+    T_ZOsa_ThreadUserArea   *user_area      = NULL;

+

+    zOss_AssertEx(thread_id != NULL, NULL);

+    thread_handle   = (cyg_handle_t)thread_id;

+    user_area       = (T_ZOsa_ThreadUserArea *)cyg_thread_get_user_area(thread_handle);

+    zOss_AssertEx(user_area != NULL, NULL);

+

+    return user_area;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÑéÖ¤Ò»¸öÏß³ÌÊÇ·ñÓÐЧ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ýÑéÖ¤µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÈôÏß³ÌÓÐЧ£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 zOss_IdentifyThread(ZOSS_THREAD_ID threadID)

+{

+    return zOss_IdVerify(threadID);

+}

+

+#endif

+

+#ifdef _USE_MESSAGE

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÏòÖ¸¶¨µÄÏ̷߳¢ËÍÏûÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ä¿±êÏ̵߳ÄÏß³Ìid

+                msg_ptr:    ÏûÏ¢Êý¾ÝµÄÖ¸Õë

+                size:       ÏûÏ¢µÄ´óС£¬ÎÞЧ²ÎÊý

+                time_out:   ·¢ËÍÏûÏ¢µÄ³¬Ê±Ê±¼ä

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     Èô²ÎÊýtimeoutÊÇZOSS_WAIT_FOREVER£¬ÔòÒ»Ö±µÈ´ýÏûÏ¢·¢Ëͳɹ¦ÔÙ·µ»Ø£»

+                Èô²ÎÊýtimeoutÊÇZOSS_NO_WAIT£¬Ôò³¢ÊÔ·¢ËÍÏûÏ¢£¬·¢ËÍʧ°Ü£¬Ö±½Ó·µ»Ø£»

+                ·ñÔòtimeoutÊdz¬Ê±µÄʱ¼ä£¬¼ÆËã·½·¨Êǽ«µ±Ç°ÏµÍ³Ê±¼äºÍtimeoutÏà¼Ó£¬

+                ³ÉΪabs_timeout,È»ºóÆô¶¯Ò»¸ö¶¨Ê±Æ÷£¬Ö±ÖÁÏûÏ¢·¢Ëͳɹ¦»ò³¬Ê±

+**************************************************************************/

+UINT32 zOss_SendMsg(ZOSS_THREAD_ID thread_id, VOID *msg_ptr, UINT32 size, UINT32 timeout)

+{

+    cyg_handle_t    mbox        = 0x00;

+    cyg_bool        ret         = false;

+    thread_msg_t    *threadMsg  = NULL;

+    

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00, ZOSS_ERROR);

+

+    if (thread_id == NULL || msg_ptr == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+    

+#ifdef CYGOPT_KERNEL_EXTEND_CHECK_THREAD

+    if (cyg_thread_check_valid((cyg_handle_t)thread_id) == false)

+    {

+        return ZOSS_ERROR;

+    }

+    

+#endif

+

+    threadMsg = (thread_msg_t *)palloc(sizeof(thread_msg_t));

+    if (threadMsg == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+    threadMsg->msg_ptr     = msg_ptr;

+    threadMsg->msg_size    = size;

+    mbox = cyg_thread_get_mbox((cyg_handle_t)thread_id);

+    zOss_AssertEx(mbox != 0x00, ZOSS_ERROR);

+

+    if (timeout == ZOSS_WAIT_FOREVER)

+    {

+        ret = cyg_mbox_put(mbox, (void *)threadMsg);

+    }

+    else if (timeout == ZOSS_NO_WAIT) 

+    {

+        ret = cyg_mbox_tryput(mbox, (void *)threadMsg);

+    }

+    else 

+    {

+        cyg_tick_count_t abs_timeout;

+        

+        abs_timeout = (cyg_tick_count_t)timeout;

+        abs_timeout += cyg_current_time();

+        ret         = cyg_mbox_timed_put(mbox, (void *)threadMsg, abs_timeout);

+    }

+

+    if (ret)

+    {

+        zOss_GetSendMsgInfo(threadMsg, thread_id);

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ½ÓÊÕÏûÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  time_out:   ½ÓÊÕÏûÏ¢µÄ³¬Ê±Ê±¼ä

+*   (´«³ö²ÎÊý)  msg_ptr:    ÏûÏ¢Ö¸ÕëµÄ´æ·ÅµØÖ·

+                size:       ÏûÏ¢Êý¾Ý´óСµÄ´æ·ÅµØÖ·£¬ÎÞЧ²ÎÊý

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     Èô²ÎÊýtimeoutÊÇZOSS_WAIT_FOREVER£¬ÔòÒ»Ö±µÈ´ýÏûÏ¢·¢Ëͳɹ¦ÔÙ·µ»Ø£»

+                Èô²ÎÊýtimeoutÊÇZOSS_NO_WAIT£¬Ôò³¢ÊÔ·¢ËÍÏûÏ¢£¬·¢ËÍʧ°Ü£¬Ö±½Ó·µ»Ø£»

+                ·ñÔòtimeoutÊdz¬Ê±µÄʱ¼ä£¬¼ÆËã·½·¨Êǽ«µ±Ç°ÏµÍ³Ê±¼äºÍtimeoutÏà¼Ó£¬

+                ³ÉΪabs_timeout,È»ºóÆô¶¯Ò»¸ö¶¨Ê±Æ÷£¬Ö±ÖÁÏûÏ¢·¢Ëͳɹ¦»ò³¬Ê±

+**************************************************************************/

+UINT32 zOss_RecvMsg(VOID **msg_ptr, UINT32 *size, UINT32  timeout)

+{

+    cyg_handle_t mbox           = 0x00;

+    thread_msg_t *threadMsg    = NULL;

+

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && 

+                  tos_get_dsr_nesting_level() == 0x00 &&

+                  msg_ptr != NULL, 

+                  ZOSS_ERROR);

+

+    mbox = cyg_thread_get_mbox(cyg_thread_self());

+    zOss_AssertEx(mbox != 0x00, ZOSS_ERROR);

+

+    if (timeout == ZOSS_WAIT_FOREVER)

+    {

+        threadMsg = (thread_msg_t *)cyg_mbox_get(mbox);

+    }

+    else if (timeout == ZOSS_NO_WAIT) 

+    {

+        threadMsg = (thread_msg_t *)cyg_mbox_tryget(mbox);

+    } 

+    else 

+    {

+        cyg_tick_count_t abs_timeout;

+        

+        abs_timeout = (cyg_tick_count_t)timeout;

+        abs_timeout += cyg_current_time();

+        threadMsg  = (thread_msg_t *)cyg_mbox_timed_get(mbox, abs_timeout);

+    }

+

+    if (threadMsg == NULL)

+    {  

+        return ZOSS_ERROR;

+    }

+    

+    zOss_GetRecvMsgInfo(threadMsg);

+

+    *msg_ptr    = threadMsg->msg_ptr;

+    *size       = threadMsg->msg_size;

+    pfree((void *)threadMsg);

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ÏûÏ¢µÄÊÕ·¢ÐÅÏ¢(¼à¿ØÄ£¿é)

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void              

+*   (´«³ö²ÎÊý)  pMonMsgInfo: »ñÈ¡ÏûÏ¢µÄÐÅÏ¢µÄ´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID z0ss_GetMsgInfo(T_ZOss_Mon_Msg *pMonMsgInfo)

+{

+#ifdef _USE_MONITOR

+    if (pMonMsgInfo)

+    {

+        *pMonMsgInfo = gOsa_MsgInfo;

+    }

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´ÓÄÚ´æ³ØÉêÇëÏûϢͷ+»º³åÇø£¬²¢·µ»Ø»º³åÇøÖ¸Õë

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  size:   »º³åÇø´óС

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     »º³åÇøÖ¸Õë

+* ÆäËü˵Ã÷:     ±ØÐëºÍzOss_ThreadRetMsgBufÅä¶ÔʵÏÖ

+**************************************************************************/

+VOID* zOss_ThreadGetMsgBuf(UINT32 size)

+{

+    T_THREAD_MSG_HEAD *msg_head = NULL;

+

+    zOss_AssertEx(size != 0, NULL);

+    

+    msg_head = (T_THREAD_MSG_HEAD *)palloc(THREAD_MSG_SIZE(size));

+    

+    zOss_AssertEx(msg_head != NULL, NULL);

+

+    msg_head->sig_no    = SIGNAL_MSG_NUMBER;

+    msg_head->magic     = THREAD_MSG_MAGIC;

+

+    return THREAD_MSG_BUF(msg_head);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÏòÄÚ´æ³Ø·µ»ØÏûϢͷ+»º³åÇø

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  p_buf:  »º³åÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ±ØÐëºÍzOss_ThreadGetMsgBufÅä¶ÔʵÏÖ

+**************************************************************************/

+VOID zOss_ThreadRetMsgBuf(VOID *p_buf)

+{

+    zOss_AssertExN(p_buf != NULL);

+

+    pfree(THREAD_MSG_HEAD(p_buf));

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïòthread_idÏ̷߳¢ËÍÏûÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  msg_id:     ÏûÏ¢id

+                p_buf:      »º³åÇøÖ¸Õë

+                buf_size:   »º³åÇø´óС

+                thread_id:  Ä¿±êÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     ±ØÐëºÍzOss_ThreadRecvMsgÅä¶ÔʵÏÖ

+**************************************************************************/

+UINT32 zOss_ThreadSendMsg(UINT32 msg_id, VOID *p_buf, UINT16 buf_size, ZOSS_THREAD_ID thread_id)

+{

+    cyg_bool            ret         = false;

+    cyg_handle_t        mbox        = 0x00;

+    T_THREAD_MSG_HEAD   *msg_head   = NULL;

+    

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00, ZOSS_ERROR);

+

+    if ((p_buf == NULL && buf_size != 0x00) || (p_buf != NULL && buf_size == 0x00)) 

+    {

+        return ZOSS_ERROR;

+    }

+    zOss_AssertEx(thread_id != NULL, ZOSS_ERROR);

+    

+#ifdef CYGOPT_KERNEL_EXTEND_CHECK_THREAD

+    if (cyg_thread_check_valid((cyg_handle_t)thread_id) == false)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+    

+    if (p_buf == NULL) 

+    {

+        msg_head = (T_THREAD_MSG_HEAD *)palloc(THREAD_MSG_SIZE(0));

+        zOss_AssertEx(msg_head != NULL, ZOSS_ERROR);

+        

+        msg_head->sig_no = SIGNAL_MSG_NUMBER;

+        msg_head->magic = THREAD_MSG_MAGIC;

+    } 

+    else 

+    {

+        msg_head = THREAD_MSG_HEAD(p_buf);

+        zOss_AssertEx(msg_head->magic == THREAD_MSG_MAGIC, ZOSS_ERROR);

+    }

+    msg_head->id = msg_id;

+    msg_head->buf_size = buf_size;

+    

+    mbox = cyg_thread_get_mbox((cyg_handle_t)thread_id);

+    zOss_AssertEx(mbox != 0x00, ZOSS_ERROR);

+    

+    ret = cyg_mbox_put(mbox, (void *)msg_head);

+    if (ret)

+    {

+        zOss_GetThreadSendMsgInfo(msg_id, msg_head, thread_id);

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;    

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Ï߳̽ÓÊÕÏûÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  timeout:    ½ÓÊÕÏûÏ¢µÄ³¬Ê±Ê±¼ä

+*   (´«³ö²ÎÊý)  p_msg_id:   ÏûÏ¢idµÄ´æ·ÅµØÖ·

+                p_buf:      ÏûÏ¢Ö¸ÕëµÄ´æ·ÅµØÖ·

+                p_buf_size: ÏûÏ¢´óСµÄ´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     ±ØÐëºÍzOss_ThreadSendMsgÅä¶ÔʵÏÖ

+**************************************************************************/

+UINT32 zOss_ThreadRecvMsg(UINT32 *p_msg_id, VOID **p_buf, UINT32 *p_buf_size, UINT32 timeout)

+{

+    cyg_handle_t        mbox        = 0x00;

+    T_THREAD_MSG_HEAD   *msg_head   = NULL;

+    

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 &&

+                  tos_get_dsr_nesting_level() == 0x00, 

+                  ZOSS_ERROR);

+    

+    zOss_AssertEx(p_msg_id != NULL && p_buf != NULL && p_buf_size != NULL, ZOSS_ERROR);

+    

+    mbox = cyg_thread_get_mbox(cyg_thread_self());

+    zOss_AssertEx(mbox != 0x00, ZOSS_ERROR);

+    

+    if (timeout == ZOSS_WAIT_FOREVER)

+    {

+        msg_head = (T_THREAD_MSG_HEAD *)cyg_mbox_get(mbox);

+    }

+    else if (timeout == ZOSS_NO_WAIT) 

+    {

+        msg_head = (T_THREAD_MSG_HEAD *)cyg_mbox_tryget(mbox);

+    } 

+    else 

+    {

+        cyg_tick_count_t abs_timeout;

+        

+        abs_timeout = (cyg_tick_count_t)timeout;

+        abs_timeout += cyg_current_time();

+        msg_head = (T_THREAD_MSG_HEAD *)cyg_mbox_timed_get(mbox, abs_timeout);

+    }

+    

+    if (msg_head == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    zOss_AssertEx(msg_head->magic == THREAD_MSG_MAGIC, ZOSS_ERROR);

+

+    zOss_GetThreadRecvMsgInfo(msg_head);                    

+

+    *p_msg_id = msg_head->id;

+    *p_buf_size = msg_head->buf_size;

+    if (msg_head->buf_size == 0x00) 

+    {

+        pfree(msg_head);

+        *p_buf = NULL;

+    } 

+    else

+    {

+        *p_buf = THREAD_MSG_BUF(msg_head);

+    }

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ×¢²áÏß³ÌÏûÏ¢¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ïß³Ìid

+                type:       ¹³×Óº¯ÊýÀàÐÍ

+                dire:       ¹³×Óº¯ÊýÅäÖÃ

+                func:       ¹³×Óº¯ÊýÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 zOss_RegThreadMsgHook(ZOSS_THREAD_ID thread_id, UINT8 type, UINT8 dire, THREAD_MSG_HOOK func)

+{

+    THREAD_MSG_HOOK_CONTENT *msg_hook = NULL;

+

+    zOss_AssertEx(type <= THREAD_MSG_HOOK_TYPE_MAX && dire <= THREAD_MSG_HOOK_DIRE_MAX && func != NULL, ZOSS_ERROR);

+    

+#ifdef CYGOPT_KERNEL_EXTEND_CHECK_THREAD

+    if (cyg_thread_check_valid((cyg_handle_t)thread_id) == false)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+    

+    msg_hook = find_thread_content(thread_id);

+    if (msg_hook == NULL)

+    {

+        msg_hook = (THREAD_MSG_HOOK_CONTENT *)zOss_Malloc(sizeof(THREAD_MSG_HOOK_CONTENT));

+        zOss_AssertEx(msg_hook != NULL, ZOSS_ERROR);

+        

+        zOss_Memset(msg_hook, 0x00, sizeof(THREAD_MSG_HOOK_CONTENT));

+        msg_hook->thread_id = thread_id;

+        zOss_ListAdd(&s_thread_msg_hook_list, &msg_hook->Node);

+    }

+    msg_hook->dire[type - 1] = dire;

+    msg_hook->func[type - 1] = func;

+    

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef _USE_SEMAPHORE

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´´½¨ÐźÅÁ¿

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  name_ptr:       ÐźÅÁ¿µÄÃû³Æ£¬ÎÞЧ²ÎÊý

+                initial_count:  ÐźÅÁ¿µÄ³õʼ¼ÆÊýÖµ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ´´½¨³É¹¦£¬·µ»ØÐźÅÁ¿µÄ¾ä±ú£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+ZOSS_SEMAPHORE_ID zOss_CreateSemaphore(const CHAR *name_ptr, UINT32 initial_count)

+{

+    cyg_sem_t *sem = NULL;

+

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 &&

+                  tos_get_dsr_nesting_level() == 0x00, 

+                  NULL);

+

+    if (name_ptr)

+    {  

+        name_ptr = name_ptr;

+    }

+

+    sem = (cyg_sem_t *)zOss_Malloc(sizeof(cyg_sem_t));

+    zOss_AssertEx(sem != NULL, NULL);

+

+    cyg_semaphore_init(sem, (cyg_count32)initial_count);

+

+    return (ZOSS_SEMAPHORE_ID)sem;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ÐźÅÁ¿

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  sem_id:     ÕýÔÚ»ñÈ¡µÄÐźÅÁ¿id

+                timeout:    ³¬Ê±¼ÆÊý

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     Èô²ÎÊýtimeoutÊÇZOSS_WAIT_FOREVER£¬ÔòÒ»Ö±µÈ´ýÏûÏ¢·¢Ëͳɹ¦ÔÙ·µ»Ø£»

+                Èô²ÎÊýtimeoutÊÇZOSS_NO_WAIT£¬Ôò³¢ÊÔ·¢ËÍÏûÏ¢£¬·¢ËÍʧ°Ü£¬Ö±½Ó·µ»Ø£»

+                ·ñÔòtimeoutÊdz¬Ê±µÄʱ¼ä£¬¼ÆËã·½·¨Êǽ«µ±Ç°ÏµÍ³Ê±¼äºÍtimeoutÏà¼Ó£¬

+                ³ÉΪabs_timeout,È»ºóÆô¶¯Ò»¸ö¶¨Ê±Æ÷£¬Ö±ÖÁÏûÏ¢·¢Ëͳɹ¦»ò³¬Ê±

+**************************************************************************/

+UINT32 zOss_GetSemaphore(ZOSS_SEMAPHORE_ID sem_id, UINT32 timeout)

+{

+    cyg_sem_t   *sem    = NULL;

+    cyg_bool    ret     = false;

+

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && 

+                  tos_get_dsr_nesting_level() == 0x00 &&

+                  sem_id != NULL, 

+                  ZOSS_ERROR);

+

+    sem = (cyg_sem_t *)sem_id;

+    if (timeout == ZOSS_WAIT_FOREVER)

+    {

+        ret = cyg_semaphore_wait(sem);

+    }

+    else if (timeout == ZOSS_NO_WAIT)

+    {

+        ret = cyg_semaphore_trywait(sem);

+    }

+    else

+    {

+        ret = cyg_semaphore_timed_wait(sem, (cyg_tick_count_t )timeout + cyg_current_time());

+    }

+

+    if (ret)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÊÍ·ÅÐźÅÁ¿

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  sem_id:     ÕýÔÚÊͷŵÄÐźÅÁ¿id

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 zOss_PutSemaphore(ZOSS_SEMAPHORE_ID sem_id)

+{

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && sem_id != NULL, ZOSS_ERROR);

+

+    cyg_semaphore_post((cyg_sem_t *)sem_id);

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ÐźÅÁ¿µÄµ±Ç°¼ÆÊýÖµ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  sem_id:     ÕýÔÚ±»»ñÈ¡¼ÆÊýÖµµÄÐźÅÁ¿id

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ¸ÃÐźÅÁ¿µÄµ±Ç°¼ÆÊýÖµ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 zOss_GetSemaphoreCount(ZOSS_SEMAPHORE_ID sem_id)

+{

+    cyg_count32 cnt     = 0x00;

+

+    zOss_AssertEx(sem_id != NULL, ZOSS_ERROR);

+

+    cyg_semaphore_peek((cyg_sem_t *)sem_id, &cnt);

+

+    return (UINT32)cnt;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ɾ³ýÐźÅÁ¿

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  sem_id:     ½«±»É¾³ýµÄÐźÅÁ¿id

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     ÐèÒªÊÍ·ÅÔÚzOss_CreateSemaphoreº¯ÊýÖÐÉêÇëµÄÄÚ´æ¿Õ¼ä£¬·ñÔò»áµ¼ÖÂÄÚ

+                ´æÐ¹Â¶

+**************************************************************************/

+UINT32 zOss_DeleteSemaphore(ZOSS_SEMAPHORE_ID sem_id)

+{

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && 

+                  tos_get_dsr_nesting_level() == 0x00 &&

+                  sem_id != NULL, 

+                  ZOSS_ERROR);

+

+    cyg_semaphore_destroy((cyg_sem_t *)sem_id);

+    zOss_Free((void *)sem_id);

+

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef _USE_MUTEX

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´´½¨»¥³âÌå

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  name_ptr:   »¥³âÌåÃû³Æ

+                priority_inherit:   »¥³âÌåÊôÐÔ£¬Èç¹ûÊÇZOSS_INHERIT£¬ÔòÏß³ÌÖ®¼ä°´

+                ÓÅÏȼ¶Ë³Ðò»ñÈ¡»¥³âÌ壻Èç¹ûÊÇZOSS_NO_INHERIT£¬Ôò°´µÈ´ýµÄ˳Ðò»ñÈ¡

+                »¥³âÌå

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»Ø´´½¨µÄ»¥³âÌå¾ä±ú£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+ZOSS_MUTEX_ID zOss_CreateMutex(const CHAR *name_ptr, UINT32 priority_inherit)

+{

+    cyg_mutex_t *mutex = NULL;

+

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 &&

+                  tos_get_dsr_nesting_level() == 0x00, 

+                  NULL);

+

+    if (name_ptr)

+    {

+        name_ptr = name_ptr;

+    }

+

+    mutex = (cyg_mutex_t *)zOss_Malloc(sizeof(cyg_mutex_t));

+    zOss_AssertEx(mutex != NULL, NULL);

+

+    cyg_mutex_init(mutex);

+    if (priority_inherit == ZOSS_INHERIT)

+    {

+        cyg_mutex_set_protocol(mutex, (enum cyg_mutex_protocol)CYG_MUTEX_PROTOCOL_INHERIT);

+    }

+    else

+    {

+        cyg_mutex_set_protocol(mutex, (enum cyg_mutex_protocol)CYG_MUTEX_PROTOCOL_NONE);

+    }

+

+    return (ZOSS_MUTEX_ID)mutex;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡»¥³âÌå

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mutex_id:   ´ý»ñÈ¡µÄ»¥³âÌåid

+                timeout:    »ñÈ¡µÄ³¬Ê±Ê±¼ä

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 zOss_GetMutex( ZOSS_MUTEX_ID mutex_id,  UINT32 timeout)

+{

+    cyg_mutex_t *mutex  = NULL;

+    cyg_bool    ret     = false;

+

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && 

+                  tos_get_dsr_nesting_level() == 0x00 &&

+                  mutex_id != NULL, 

+                  ZOSS_ERROR);

+

+    mutex = (cyg_mutex_t *)mutex_id;

+    if (timeout == ZOSS_WAIT_FOREVER)

+    {

+        ret = cyg_mutex_lock(mutex);

+    }

+    else if (timeout == ZOSS_NO_WAIT)

+    { 

+        ret = cyg_mutex_trylock(mutex);

+    }

+    else 

+    {

+        ret = cyg_mutex_timed_lock(mutex, cyg_current_time() + (cyg_tick_count_t )timeout);

+    }

+

+    if (ret)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÊÍ·Å»¥³âÌå

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mutex_id:   ´ýÊͷŵĻ¥³âÌåid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 zOss_PutMutex(ZOSS_MUTEX_ID mutex_id)

+{

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && 

+                  tos_get_dsr_nesting_level() == 0x00 &&

+                  mutex_id != NULL, 

+                  ZOSS_ERROR);

+

+    cyg_mutex_unlock((cyg_mutex_t *)mutex_id);

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïú»Ù»¥³âÌå

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mutex_id:   ´ýÏú»ÙµÄ»¥³âÌåid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     ÐèÒªÊÍ·ÅÔÚzOss_CreateMutexº¯ÊýÖÐÉêÇëµÄÄÚ´æ¿Õ¼ä£¬·ñÔò»áµ¼ÖÂÄÚ´æ

+                й¶

+**************************************************************************/

+UINT32 zOss_DeleteMutex(ZOSS_MUTEX_ID mutex_id)

+{

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && 

+                  tos_get_dsr_nesting_level() == 0x00 &&

+                  mutex_id != NULL, 

+                  ZOSS_ERROR);

+

+    cyg_mutex_destroy((cyg_mutex_t *)mutex_id);

+    zOss_Free((void *)mutex_id);

+

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef _USE_EVENT

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´´½¨ ʼþ±êÖ¾×é

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  name:   ʼþ±êÖ¾×éÃû³Æ£¬ÎÞЧ²ÎÊý               

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»Ø´´½¨µÄ ʼþ±êÖ¾×é¾ä±ú£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+ZOSS_EVENT_ID zOss_CreateEvent(const CHAR *name_ptr)

+{

+    cyg_flag_t *event = NULL;

+

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 &&

+                  tos_get_dsr_nesting_level() == 0x00, 

+                  NULL);

+

+    zOss_AssertEx(ZOSS_EVENTS_OR == CYG_FLAG_WAITMODE_OR && 

+                  ZOSS_EVENTS_AND == CYG_FLAG_WAITMODE_AND &&

+                  ZOSS_EVENTS_OR_CLEAR == CYG_FLAG_WAITMODE_CLR, 

+                  NULL);

+

+    if (name_ptr)

+    {

+        name_ptr = name_ptr;

+    }

+    event = (cyg_flag_t *)zOss_Malloc(sizeof(cyg_flag_t));

+    zOss_AssertEx(event != NULL, NULL);

+

+    cyg_flag_init(event);

+

+    return (ZOSS_EVENT_ID)event;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_GetEvent

+* ¹¦ÄÜÃèÊö: »ñȡʼþ×é

+* ²ÎÊý˵Ã÷: (IN)

+                event_id:ʼþ×éid

+                events:32λʼþ±ê¼Ç

+                get_options:ÃèÊöÈçºÎ»ñÈ¡¸Ãʼþ±ê¼Ç×éºÏ

+                    ZOSS_EVENTS_AND:±íʾeventsÖ¸¶¨µÄËùÓÐʼþ±ê¼Ç¶¼Òª·ûºÏ

+                    ZOSS_EVENTS_OR:±íʾeventsÖ¸¶¨µÄʼþ±ê¼ÇÖ»ÒªÓÐÈκÎÒ»

+                                   ¸ö·ûºÏ¼´¿É

+                    ZOSS_EVENTS_AND_CLEAR:±íʾ°´ZOSS_EVENTS_AND·½Ê½»ñÈ¡Íêºó,

+                                          ½«·ûºÏÌõ¼þµÄʼþ±ê¼ÇÖÃΪ0

+                    ZOSS_EVENTS_OR_CLEAR:±íʾ°´ZOSS_EVENTS_OR·½Ê½»ñÈ¡Íêºó,

+                                         ½«·ûºÏÌõ¼þµÄʼþ±ê¼ÇÖÃΪ0

+                pEventsReceived:´æ·Å»ñÈ¡µ½µÄʼþ±êÖ¾Ö¸Õë,²»ÄÜΪ¿Õ

+                timeout:³¬Ê±ÊôÐÔ.ZOSS_WAIT_FOREVER, ZOSS_NO_WAIT,»ò¾ßÌåʱ¼ä

+                        µ¥Î»ºÁÃë

+* ·µ »Ø Öµ: ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_GetEvent(ZOSS_EVENT_ID event_id, UINT32  events, UINT32 getOptions,

+                     UINT32 *pEventsReceived, UINT32 timeout)

+{

+    cyg_flag_t *event = NULL;

+    UINT32     result = 0;

+

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && tos_get_dsr_nesting_level() == 0x00, ZOSS_ERROR);

+    zOss_AssertEx(event_id != NULL && pEventsReceived != NULL && events != 0, ZOSS_ERROR);

+

+    event = (cyg_flag_t *)event_id;

+    if (timeout == ZOSS_WAIT_FOREVER)

+    {

+        result = cyg_flag_wait(event,events,getOptions);

+    }

+    else if (timeout == ZOSS_NO_WAIT)

+    {

+        result = cyg_flag_poll(event,events,getOptions);

+    }

+    else

+    {

+        cyg_tick_count_t abs_timeout;

+        

+        abs_timeout = (cyg_tick_count_t )timeout + cyg_current_time();

+        result      = cyg_flag_timed_wait(event,events,getOptions, abs_timeout);

+    }

+

+    if(result)

+    {

+        *pEventsReceived = result;

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+       

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetEvent

+* ¹¦ÄÜÃèÊö: ÉèÖÃʼþ×éʼþ±ê־룬Ó뵱ǰʼþ×é½øÐÐλ»ò

+* ²ÎÊý˵Ã÷: (IN)

+                 eventId:ʼþ×éid

+                 events:32-bit unsigned variable that represents the 

+                        requested event flags.

+                 setOptions:ÃèÊöÈçºÎÉèÖøÃʼþ±ê¼Ç×é

+                            ZOSS_EVENTS_AND: ÓëeventsÅäºÏʹÓã¬Íê³É32λ±ê¼Ç

+                                             ÇåÁ㹦ÄÜ¡£´Ëʱevents±ØÐëΪ0¡£

+                            ZOSS_EVENTS_OR ½«eventsͬµ±Ç°Öµ½øÐлòÔËËã¡£

+* ·µ »Ø Öµ: ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_SetEvent(ZOSS_EVENT_ID event_id, UINT32  events, UINT32 setOptions)

+{

+    cyg_flag_t *event = NULL;

+

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && event_id != NULL, ZOSS_ERROR);

+

+    event = (cyg_flag_t *)event_id;

+  

+    if(setOptions == ZOSS_EVENTS_AND)

+    {

+        if(events == 0)

+        {

+            cyg_flag_maskbits(event,events);

+            return ZOSS_SUCCESS;

+        }

+        else

+        {

+            return ZOSS_ERROR;

+        }

+    }

+

+    cyg_flag_setbits(event,events);

+

+    return ZOSS_SUCCESS; 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_DeleteEvent

+* ¹¦ÄÜÃèÊö: ɾ³ýʼþ×é

+* ²ÎÊý˵Ã÷: (IN)

+                event_id:ʼþ×éid

+* ·µ »Ø Öµ: ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_DeleteEvent(ZOSS_EVENT_ID event_id)

+{

+    zOss_AssertEx(tos_get_isr_nesting_level() == 0x00 && 

+                  tos_get_dsr_nesting_level() == 0x00 &&

+                  event_id != NULL, 

+                  ZOSS_ERROR);

+

+    cyg_flag_destroy((cyg_flag_t *)event_id);

+    zOss_Free((void *)event_id);

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_QueryEvent

+* ¹¦ÄÜÃèÊö:²éѯʼþ×鵱ǰ±êÖ¾Öµ

+* ²ÎÊý˵Ã÷: (IN)	

+                event_id:ʼþ×éid

+* ·µ »Ø Öµ: ʼþ×鵱ǰ±êÖ¾Öµ

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+UINT32 zOss_QueryEvent(ZOSS_EVENT_ID event_id)

+{

+    zOss_AssertEx(event_id != NULL, ZOSS_ERROR); 

+    

+    return cyg_flag_peek((cyg_flag_t *)event_id);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_WaitingEvent

+* ¹¦ÄÜÃèÊö:²éѯÊÇ·ñÓÐÏ̵߳ȴýʼþ×é

+* ²ÎÊý˵Ã÷: (IN)

+                event_id:ʼþ×éid

+* ·µ »Ø Öµ: ÓÐÏ̵߳ȴý:True ;ÎÞÏ̵߳ȴý:False

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+BOOL zOss_WaitingEvent(ZOSS_EVENT_ID event_id)

+{

+    zOss_ASSERT(event_id != NULL);

+

+    return cyg_flag_waiting((cyg_flag_t *)event_id);

+}

+#endif

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡²Ù×÷ϵͳµÄµ±Ç°µÎ´ðÊý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ²Ù×÷ϵͳµÄµ±Ç°µÎ´ðÊý

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 zOss_GetTickCount(VOID)

+{

+#ifdef _USE_PSM

+# ifdef _USE_PSM_NEW_FRAMEWORK

+    return (UINT32)(cyg_current_time_lo());

+# else

+    return (UINT32)(cyg_current_time_lo() + zOss_GetSleepTimeForTicks());

+# endif

+#else

+    return (UINT32) cyg_current_time_lo();

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     OSE²Ù×÷ϵͳÖеÄÏ̴߳´½¨º¯Êý£¬TOSÖÐÖ»ÄÜÓÃÓÚ´´½¨ÖжϷþÎñÀý³Ì

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ¼û²ÎÊýÁбíÖеÄ×¢ÊÍ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Öжϴ¦ÀíÀý³ÌµÄ¾ä±ú

+* ÆäËü˵Ã÷:     ÓÉÓÚĿǰµÄÇý¶¯Ä£¿éÖÐÒÑʹÓô˽ӿڣ¬ËùÒÔÐèÒª½«´Ëº¯Êý´ÓOSE²Ù×÷ϵͳ

+                ÖÐÒÆÖ²¹ýÀ´¡£

+                1) ´Ëº¯ÊýÖ»ÄÜÓÃÓÚ´´½¨ÖжϷþÎñÀý³Ì£»

+                2) ´Ëº¯Êý²»ÄÜÔÚÖжÏÖе÷Óã»

+                3) Èô´´½¨Ê§°Ü£¬ÏµÍ³¶ÏÑÔ£»

+                4) ²»ÍƼöÔÚÐÂÄ£¿éÖе÷Óô˺¯Êý½Ó¿Ú£»

+**************************************************************************/

+PROCESS create_process(enum PROCESS_TYPE        proc_type,      /* Ïß³ÌÀàÐÍ£¬Ö»ÄÜΪOS_INT_PROC  */

+                       const char               *name,          /* ºöÂԴ˲ÎÊý                   */

+                       OSENTRYPOINT             *entrypoint,    /* Ïß³ÌÈë¿Úµã                   */

+                       OSADDRESS                stack_size,     /* ºöÂԴ˲ÎÊý                   */

+                       OSPRIORITY               priority,       /* ºöÂԴ˲ÎÊý                   */

+                       OSTIME                   timeslice,      /* ºöÂԴ˲ÎÊý                   */

+                       PROCESS                  block,          /* ºöÂԴ˲ÎÊý                   */

+                       struct OS_redir_entry    *router_table,  /* ºöÂԴ˲ÎÊý                   */

+                       OSVECTOR                 vec,            /* ÖжÏÏòÁ¿ºÅ                   */

+                       OSUSER                   user)           /* ±ØÐëΪ0                      */

+{

+    cyg_handle_t interrupt_handle = 0x00;

+    

+    zOss_ASSERT(tos_get_isr_nesting_level() == 0x00 && 

+                tos_get_dsr_nesting_level() == 0x00 &&

+                proc_type == OS_INT_PROC

+                && entrypoint != NULL

+                && user == 0x00);

+    ZOSS_UNUSED_PTR(name);

+    ZOSS_UNUSED_PARAM(stack_size);

+    ZOSS_UNUSED_PARAM(priority);

+    ZOSS_UNUSED_PARAM(timeslice);

+    ZOSS_UNUSED_PARAM(block);

+    ZOSS_UNUSED_PTR(router_table);

+    

+    switch (proc_type) 

+    {

+    case OS_INT_PROC:

+        {

+#ifdef CYGOPT_KERNEL_EXTEND_CALLING_DSR

+            interrupt_handle = tos_create_irq(vec, priority, 0x00, tos_default_isr, (tos_dsr_t *)entrypoint);

+#else

+            interrupt_handle = tos_create_isr(vec, priority, 0x00, (tos_isr_t *)entrypoint);

+#endif

+            break;

+        }

+    default:

+        {

+            zOss_ASSERT(0);

+            break;

+        }

+    }

+    

+    return (PROCESS)interrupt_handle;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     OSE²Ù×÷ϵͳÖеÄÏß³Ìɾ³ýº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  id:     ´ýɾ³ýÏ̵߳ÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     1) ÈôÏ̴߳´½¨Ê§°Ü£¬ÏµÍ³¶ÏÑÔ£»

+                2) ²»ÍƼöÔÚÐÂÄ£¿éÖе÷Óô˺¯Êý½Ó¿Ú£»

+**************************************************************************/

+void kill_proc(PROCESS id)

+{

+    zOss_AssertExN(tos_get_isr_nesting_level() == 0x00 && 

+                   tos_get_dsr_nesting_level() == 0x00 &&

+                   id != 0x00);

+    tos_delete_irq((cyg_handle_t)id);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     OSAÄ£¿é³õʼ»¯,ÔÚTOS²Ù×÷ϵͳÆô¶¯Ê±µ÷ÓÃ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Èô³É¹¦£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     ÖØ¸´³õʼ»¯£¬Ôòϵͳ¶ÏÑÔ

+**************************************************************************/

+UINT32 OSA_Init(VOID)

+{

+    static BOOL init_flag       = FALSE;

+    cyg_uint32      ret         = 0x00;

+    

+    zOss_AssertEx(init_flag == FALSE, ZOSS_ERROR);

+    

+    zOss_AssertEx((cyg_bool)(CYGOPT_KERNEL_EXTEND_THREAD_USER_AREA == ALIGN_TO(sizeof(T_ZOsa_ThreadUserArea), sizeof(int))), ZOSS_ERROR);

+

+    pool_init();

+    

+    ret = MEM_Init();

+    zOss_AssertEx(ret == ZOSS_SUCCESS, ZOSS_ERROR);

+    

+    FS_Init();

+

+    Osa_SysErrHndInit();

+    

+#ifdef _USE_MONITOR

+    gOsa_MsgInfo.num = 0;

+    gOsa_MsgInfo.ele = (T_ZOss_Mon_Msg_Ele *)zOss_GetUB(OSS_MON_INFO_MAX_NUMBER * sizeof(T_ZOss_Mon_Msg_Ele));

+    zOss_AssertEx(gOsa_MsgInfo.ele != NULL, ZOSS_ERROR);

+#endif 

+

+    ret = TIMER_Init();

+    zOss_AssertEx(ret == ZOSS_SUCCESS, ZOSS_ERROR);

+

+    init_flag = TRUE;

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÑéÖ¤Ò»¸öÏß³ÌÊÇ·ñÓÐЧ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ýÑéÖ¤µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÈôÏß³ÌÓÐЧ£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 OSA_IdentifyThread(ZOSS_THREAD_ID threadID)

+{

+    zOss_AssertEx(threadID != NULL, ZOSS_ERROR);

+    return zOss_IdVerify(threadID);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡Ï̵߳ÄCPUÕ¼ÓÃÂÊ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  Ïß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Ï̵߳ÄCPUÕ¼ÓÃÂÊ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+FLOAT Osa_GetProcessCPU(ZOSS_THREAD_ID thread_id)

+{

+    T_ZOsa_ThreadUserArea *user_area = NULL;

+    

+    if (gOsa_SwapTimeFlag)

+    {

+        if (thread_id == NULL)

+        {

+            return 0;

+        }

+        

+#ifdef CYGOPT_KERNEL_EXTEND_CHECK_THREAD

+        if (cyg_thread_check_valid((cyg_handle_t)thread_id) == false)

+        {

+            return 0;

+        }

+#endif

+        user_area = (T_ZOsa_ThreadUserArea *)cyg_thread_get_user_area((cyg_handle_t)thread_id);

+        zOss_AssertEx(user_area != NULL, 0);

+

+        return user_area->cpupercent;

+    }

+    

+    return 0;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡Ïß³ÌÓû§Êý¾Ý¿Õ¼äµÄÖ¸Õë

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ý»ñÈ¡Óû§Êý¾Ý¿Õ¼äÖ¸ÕëµÄÏß³Ìid

+                bupdate:    ÎªÕæ£¬Ôò¸üÐÂÓû§Êý¾Ý¿Õ¼ä£»·ñÔò·µ»ØÓû§Êý¾Ý¿Õ¼äµÄÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     Ï̵߳ÄÓû§Êý¾Ý¿Õ¼äµÄÖ¸Õë

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+T_ZOsa_ThreadUserArea *Osa_GetThreadUserArea(ZOSS_THREAD_ID thread_id, BOOL bupdate)

+{

+    T_ZOsa_ThreadUserArea   *user_area      = NULL;

+    cyg_handle_t            thread_handle   = 0x00;

+    cyg_uint32              state           = 0x00;

+

+    zOss_AssertEx(thread_id != NULL, NULL);

+        

+    thread_handle = (cyg_handle_t)thread_id;

+    user_area = (T_ZOsa_ThreadUserArea *)cyg_thread_get_user_area(thread_handle);

+    zOss_AssertEx(user_area != NULL, NULL);

+    

+    if (bupdate == FALSE)

+    {

+        return user_area;

+    }

+    

+    user_area->topstack = cyg_thread_get_stack_ptr(thread_handle);

+    user_area->maxstack = zOss_GetThreadStackUsed(thread_id);

+    user_area->priority = (UINT8)cyg_thread_get_priority(thread_handle);

+    user_area->msgnum   = (UINT32)cyg_mbox_peek(cyg_thread_get_mbox(thread_handle));

+    if (user_area->runtime > 0)

+    {

+        user_area->RunTimeInMs = (UINT32)((FLOAT)user_area->runtime / 1000);

+    }

+    state = cyg_thread_get_state(thread_handle);

+    switch (state) 

+    {

+    case OSA_THREAD_RUNNING:

+        {

+            if (thread_handle == cyg_thread_self())

+            {

+                user_area->runstatus = ZOSS_OS_RUN;

+            }

+            else

+            {

+                user_area->runstatus = ZOSS_OS_READY;

+            }

+            break;

+        }

+        

+    default:

+        {

+            user_area->runstatus = ZOSS_OS_BLOCK;

+            break;

+        }

+    }

+    

+    return user_area;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ËùÓÐÏ̵߳ÄÏß³Ìid

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  threadarray:    ´æ·ÅÏß³ÌidµÄÊý¾ÝµÄÖ¸Õë

+* ·µ »Ø Öµ:     ËùÓÐÏ̵߳Ä×ÜÊý

+* ÆäËü˵Ã÷:     ´Ëº¯ÊýÉêÇëµÄÄÚ´æ¿Õ¼ä£¬±ØÐëÓÉʹÓÃÕßÊÍ·Å£¬·ñÔò»áÔì³ÉÄÚ´æÐ¹Â¶¡£

+**************************************************************************/

+UINT32 Osa_GetAllThreadId(ZOSS_THREAD_ID *threadarray[])

+{

+    cyg_uint32      total                   = 0x00;

+    cyg_handle_t    *thread_handle_saved    = NULL;

+

+    zOss_AssertEx(threadarray != NULL, ZOSS_ERROR);

+    

+    total = cyg_thread_count_all_thread();

+    zOss_AssertEx(total != 0x00, ZOSS_ERROR);

+    

+    thread_handle_saved = (cyg_handle_t*)zOss_Malloc(total*sizeof(cyg_handle_t));

+    zOss_AssertEx(thread_handle_saved != NULL, ZOSS_ERROR);

+

+    cyg_thread_get_all_thread(thread_handle_saved);

+    *threadarray = (ZOSS_THREAD_ID *)thread_handle_saved;

+

+    return total;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´òÓ¡Ïß³ÌÔËÐÐʱÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  pid:    ´ý´òÓ¡ÐÅÏ¢µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦£¬·µ»ØZOSS_SUCCESS£»Ê§°Ü£¬·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 Osa_DisplayThreadExecInfo(PROCESS pid)

+{

+    T_ZOsa_ThreadUserArea *user_area = NULL;

+    

+    user_area = Osa_GetThreadUserArea((ZOSS_THREAD_ID)pid, TRUE);

+    if (user_area == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+        

+    zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "%-28s  %-16s  %16s  %16s  %16s  %16s",

+                "ThreadName", "ThreadID", "RunTimeInMs", "CpuPercent", "MsgNum", "RunCount");

+    if (user_area->threadid) 

+    {

+        zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "%-28s  0x%08x  %16u  %16f  %16u  %16u",

+                    user_area->threadname,

+                    user_area->threadid,

+                    user_area->RunTimeInMs,

+                    user_area->cpupercent,

+                    user_area->msgnum,

+                    user_area->runcount);

+    }

+    else 

+    {

+        zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_ABNORMAL, "ûÓÐÕÒµ½Ïß³Ì0x%08x", (UINT32)pid);

+        return ZOSS_ERROR;

+    }

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´òÓ¡ËùÓÐÏ̵߳ÄÔËÐÐʱÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  type:   

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦£¬·µ»ØZOSS_SUCCESS£»Ê§°Ü£¬·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 Osa_DisplayThreadsExecInfo(UINT32 type)

+{

+    UINT32                  cnt             = 0;

+    UINT32                  thread_num      = 0;

+    FLOAT                   cpu_percent     = 0;

+    UINT32                  run_time        = 0;

+    ZOSS_THREAD_ID          *thread_array   = NULL;

+    cyg_tick_count_t        total_time      = 0;

+    T_ZOsa_ThreadUserArea   *user_area      = NULL;

+    

+    thread_num = Osa_GetAllThreadId(&thread_array);

+    if (thread_num == 0 || thread_array == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+    

+#ifdef _USE_PSM

+    zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "\t**********************Current CPU Frequency is %u**********************",  zDrvPow_GetPsCoreFreq());

+#endif

+    zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "%-28s %-16s %16s %16s %16s %16s",

+                "ThreadName", "ThreadID", "RunTimeInMs", "CpuPercent", "MsgNum", "RunCount");

+    for (cnt = 0; cnt < thread_num; cnt++)

+    {

+        user_area = Osa_GetThreadUserArea(thread_array[cnt], TRUE);

+        if (user_area == NULL)

+        {        

+            continue;

+        }

+

+        if (type & SUP_THREAD_STATISTIC_INFO_BIT)   /* ͳ¼ÆÖ¸¶¨Ê±¼äÄÚµÄÏß³ÌÖ´ÐÐÇé¿ö,ʱ¼äµÄ»ñȡʹÓÃϵͳʱÖÓtick,µ¥Î»ºÁÃë,¾«¶È½ÏµÍ */

+        {

+#ifdef CYGOPT_KERNEL_EXTEND_THREAD_STATISTIC_TIMESLICE

+            run_time    = (UINT32)cyg_thread_get_statistic_timeslice((cyg_handle_t)thread_array[cnt]);

+            total_time  = cyg_current_statistic_time();

+            cpu_percent = (FLOAT)run_time * 100 / total_time;

+            run_time    = (UINT32)((FLOAT)run_time * (gOsa_SysCpuFreq / 1000));

+#endif

+        }

+        else    /* ¶¨Ê±Ë¢ÐµÄÏß³ÌÖ´ÐÐÇé¿ö,ʱ¼äµÄ»ñÈ¡µ÷ÓÃÇý¶¯µÄº¯Êý,µ¥Î»Î¢Ãî,¾«¶È½Ï¸ß */

+        {

+            run_time = user_area->RunTimeInMs;

+            cpu_percent = user_area->cpupercent;

+        }

+        

+        if ((type & SUP_THREAD_LIVE_BIT) && run_time == 0)

+        {

+            continue;   /* Ìø¹ýûÓлµÄÏß³Ì */

+        }

+        else if ((type & SUP_THREAD_LAZY_BIT) && run_time != 0)

+        {

+            continue;   /* Ìø¹ý»î¶¯µÄÏß³Ì */

+        }

+        

+        zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "%-28s  0x%08x  %16u  %16f  %16u  %16u",

+                    user_area->threadname,

+                    user_area->threadid,

+                    run_time,

+                    cpu_percent,

+                    user_area->msgnum,

+                    user_area->runcount);

+    }

+    

+    zOss_Free(thread_array);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³ÌÇл»¼Ç¼º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  enableRunTime:  ÊÇ·ñÔÊÐí¼Ç¼ÔËÐÐʱÐÅÏ¢£»

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID Osa_SwapCtl(BOOL enableRunTime)

+{    

+    if ((enableRunTime == gOsa_SwapTimeFlag))

+    {

+        return;

+    }

+    

+    if ((enableRunTime == TRUE) && (gOsa_SwapTimeFlag == FALSE)) 

+    {

+        if (gOsa_AllTaskIdArray == NULL)

+        {

+            T_OSS_PARAM *pPlatCfg;

+            

+            pPlatCfg = zOss_GetOssCfg();

+            gOsa_AllTaskIdArray = (ZOSS_TASK_ID *)zOss_Malloc(sizeof(ZOSS_TASK_ID) * pPlatCfg->TaskCfg.max_task_num);

+            zOss_AssertExN(gOsa_AllTaskIdArray != NULL);

+        }

+        

+        gOsa_CpuStartTime = Osa_HwTimeRead();

+        gOsa_SwapLastTime = gOsa_CpuStartTime;

+    }

+    

+    gOsa_SwapTimeFlag   = enableRunTime;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¸üÐÂϵͳÖÐËùÓÐÏ̺߳ÍÈÎÎñµÄCPUÕ¼ÓÃÂÊ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID Osa_UpdateCpu(VOID)

+{

+    if (gOsa_SwapTimeFlag) 

+    {

+        cyg_scheduler_lock();

+        

+        Osa_UpdateThreadCpu();        

+        Osa_UpdateTaskCpu();

+        

+        gOsa_CpuStartTime = Osa_HwTimeRead();

+        gOsa_SwapLastTime = gOsa_CpuStartTime;

+

+        cyg_scheduler_unlock();

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Ï̴߳´½¨Ê±µÄÖ§³Å²ã¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     Ïß³ÌÖ¸Õë

+                user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void Osa_create_handler(void *thread, void *user_area)

+{

+    zOss_AssertExN(thread != NULL && user_area != NULL);

+        

+    if (gOsa_SysCpuFreq == 0x00) 

+    {

+        gOsa_SwapFlag       = TRUE;

+        gOsa_SwapLastTime   = Osa_HwTimeRead();

+#if defined (_USE_PSM) && defined (_USE_CPU_DFM)

+        zOss_RecordPsmLastSwapTime();

+#endif

+        gOsa_SysCpuFreq     = CYGNUM_HAL_RTC_PERIOD;

+    }

+    

+    zOss_InitThreadUserArea((cyg_handle_t)thread, (T_ZOsa_ThreadUserArea *)user_area);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³Ìɾ³ýʱµÄÖ§³Å²ã¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     Ïß³ÌÖ¸Õë

+                user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void Osa_kill_handler(void *thread, void *user_area)

+{

+    zOss_AssertExN(thread != NULL && user_area != NULL);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³ÌÇÐÈëʱµÄÖ§³Å²ã¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     Ïß³ÌÖ¸Õë

+                user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void Osa_swapin_handler(void *thread, void *user_area)

+{

+    zOss_AssertExN(thread != NULL && user_area != NULL);

+    

+#ifdef OSS_TRACE_THREAD    

+    oss_trace_thread_swapin(thread);

+    oss_trace_func_swapin(thread);

+#endif

+

+#if defined (_USE_PSM) && defined (_USE_CPU_DFM)

+    zOss_ThreadSwapInPsmHook((T_ZOsa_ThreadUserArea *)user_area);

+#endif

+    

+    if (gOsa_SwapTimeFlag) 

+    {

+        UINT32 past_time;

+        UINT32 current_time;

+        T_ZOsa_ThreadUserArea *ua = (T_ZOsa_ThreadUserArea *)user_area;

+

+        current_time        = Osa_HwTimeRead();

+        past_time           = current_time - gOsa_SwapLastTime;

+        gOsa_SwapLastTime   = current_time;

+        ua->runcount++;

+        ua->cputime += past_time;

+        ua->runtime += past_time;

+        

+        if (ua->curtaskid != NULL) 

+        {

+            T_ZOss_TCB *tcb = (T_ZOss_TCB *)(ua->curtaskid);

+            

+            tcb->cputime    += past_time;

+            tcb->runtime    += past_time;

+            tcb->task_time  = current_time;

+        }

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Ïß³ÌÇгöʱµÄÖ§³Å²ã¹³×Óº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread:     Ïß³ÌÖ¸Õë

+                user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void Osa_swapout_handler(void *thread, void *user_area)

+{

+    zOss_AssertExN(thread != NULL && user_area != NULL);

+    

+#ifdef OSS_TRACE_THREAD   

+    oss_trace_thread_swapout(thread);  

+    oss_trace_func_swapout(thread);

+#endif    

+

+#if defined (_USE_PSM) && defined (_USE_CPU_DFM)

+    zOss_ThreadSwapOutPsmHook((T_ZOsa_ThreadUserArea *)user_area);

+#endif

+    

+    if (gOsa_SwapTimeFlag)

+    {

+        UINT32 past_time;

+        UINT32 current_time;

+        T_ZOsa_ThreadUserArea *ua = (T_ZOsa_ThreadUserArea *)user_area;

+

+        current_time        = Osa_HwTimeRead();

+        past_time           = current_time - gOsa_SwapLastTime;

+        gOsa_SwapLastTime   = current_time;

+        ua->cputime += past_time;

+        ua->runtime += past_time;

+        

+        if (ua->curtaskid != NULL)

+        {

+            T_ZOss_TCB *tcb = (T_ZOss_TCB *)(ua->curtaskid);

+

+            past_time       = current_time - tcb->task_time;

+            tcb->cputime    += past_time;

+            tcb->runtime    += past_time;

+        }

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     zOss_CleanCacheT32

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ½ö¹©T32½Å±¾Ê¹ÓÃ

+**************************************************************************/

+VOID zOss_CleanCacheT32(VOID)

+{

+    tos_cache_clean_all();

+    for ( ; ; ) 

+        ;

+}

+

+#define HAL_DCACHE_CLEAN_RANGE(start, end)                                  \

+CYG_MACRO_START                                                             \

+    asm volatile (                                                          \

+        "mov    r4, %0;"                                                    \

+        "mov    r5, %1;"                                                    \

+        "bic    r4, r4, #31;"                                               \

+    "1:"                                                                    \

+        "mcr    p15, 0, r4, c7, c10, 1;"/* Clean d-cache line */            \

+        "add    r4, r4, #32;"                                               \

+        "cmp    r4, r5;"                                                    \

+        "bls    1b;"                                                        \

+        :                                                                   \

+        : "r"(start),"r"(end)                                               \

+        : "r4", "r5"  /* Clobber list */                                    \

+    );                                                                      \

+CYG_MACRO_END

+

+

+#define HAL_DCACHE_INV_RANGE(start, end)                                    \

+CYG_MACRO_START                                                             \

+    asm volatile (                                                          \

+        "mov    r4, %0;"                                                    \

+        "mov    r5, %1;"                                                    \

+        "bic    r4, r4, #31;"                                               \

+    "1:"                                                                    \

+        "mcr    p15, 0, r4, c7, c6, 1;"/* Invalidate d-cache line */        \

+        "add    r4, r4, #32;"                                               \

+        "cmp    r4, r5;"                                                    \

+        "bls    1b;"                                                        \

+        :                                                                   \

+        : "r"(start),"r"(end)                                               \

+        : "r4", "r5"  /* Clobber list */                                    \

+    );                                                                      \

+CYG_MACRO_END

+

+/* cache µØÖ·³¤¶È line¶ÔÆëºê */

+#define CACHE_LINESIZE                           (UINT32)(32)

+#define CACHE_ALIGN_TO_LINESIZE(ADDR, LEN)       ((LEN) = (((LEN) + ((ADDR) - ((ADDR) & (~(CACHE_LINESIZE - 1u)))) + \

+		                                  CACHE_LINESIZE - 1u) & (~(CACHE_LINESIZE - 1u)))); \

+		                                  ((ADDR) = ((ADDR) & (~(CACHE_LINESIZE - 1u))))

+

+VOID zOss_CacheCleanRange(UINT32 base, UINT32 size)

+{

+#ifdef _USE_CACHE_TEST

+    cyg_uint32 old_intr;

+

+    CACHE_ALIGN_TO_LINESIZE(base, size);

+    HAL_DISABLE_INTERRUPTS(old_intr);

+    HAL_DCACHE_CLEAN_RANGE(base, base + size - 1);

+    asm volatile("dsb;");

+    zDrvL2x0_Clean_Range(base, size);

+    HAL_RESTORE_INTERRUPTS(old_intr);

+#endif

+}

+

+VOID zOss_CacheInvalidateRange(UINT32 base, UINT32 size)

+{

+#ifdef _USE_CACHE_TEST

+    cyg_uint32 old_intr;

+    

+    CACHE_ALIGN_TO_LINESIZE(base, size);

+    HAL_DISABLE_INTERRUPTS(old_intr);

+    HAL_DCACHE_INV_RANGE(base, base + size - 1);

+    asm volatile("dsb;");

+    zDrvL2x0_Inv_Range(base, size);

+    HAL_RESTORE_INTERRUPTS(old_intr);

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     zOss_DumpStack

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  to:   ´æ·Åº¯Êýµ÷ÓùØÏµµÄ¿Õ¼ä

+*   (´«Èë²ÎÊý)  size: ¿Õ¼äµÄ´óС£¨×Ö½Ú£©

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ½öÖ§³ÖGCC±àÒëÁ´£¬32λ´¦ÀíÆ÷

+**************************************************************************/

+VOID zOss_DumpStack(VOID *to, UINT32 size)

+{

+#ifdef __GNUC__

+    UINT32         *current_sp;

+    UINT32         *stack_top;

+    UINT32         *space;

+    UINT32          addr;

+    cyg_handle_t    thread;

+

+    if(to == NULL || size < sizeof(VOID *) || (UINT32)to % sizeof(VOID *) != 0)

+    {

+        return;

+    }

+

+    asm volatile ("mov %0, sp" : "=r"(current_sp));

+

+    thread     = cyg_thread_self();

+    space      = (UINT32 *)to;

+    stack_top  = (UINT32 *)(cyg_thread_get_stack_base_real(thread) + cyg_thread_get_stack_size_real(thread));

+

+    while(1)

+    {

+        addr = *current_sp++;

+        if(Osa_AddrInText(addr))

+        {

+            *space++ = addr;

+            size -= sizeof(VOID *);

+        }

+        

+        if(size <= 0 || (UINT32)current_sp >= (UINT32)stack_top)

+        {

+            return;

+        }

+    }

+#endif

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_mem.c b/cp/ps/plat/src/oss/osa/tos/src/tos_mem.c
new file mode 100644
index 0000000..8859298
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_mem.c
@@ -0,0 +1,286 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_mem.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : TOS 3.0µÄUBÄÚ´æÊÊÅä

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/12/10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <pkgconf/system.h>

+#include CYGHWR_MEMORY_LAYOUT_H

+#include "oss_api.h"

+#include "osa.h"

+

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÄÚ´æÄ£¿é³õʼ»¯

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 MEM_Init(VOID)

+{

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñȡϵͳÄÚ´æµ÷ÊÔÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 Mem_GetSysMemDebugInfo(T_ZOss_List *mem_debug_info_lst)

+{

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡UBÄÚ´æÊ¹ÓÃÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 Mem_GetUBUseInfo(T_Mem_UBPoolGrpInfo *ub_pool_grp_info, UINT8 num)

+{

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼ì²éUBÄÚ´æÐ¹Â¶ÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 Mem_CheckUBLeak(T_Mem_UBLeakInfo *ub_leak_info,

+                       UINT32           ub_leak_time,

+                       UINT8            poolNum,

+                       UINT32           size)

+{

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡Ï̵߳ÄUBÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 Mem_ThreadUBInfo(ZOSS_THREAD_ID      threadId,

+                        T_Mem_UBBlockInfo   *threadUbInfo,

+                        UINT32              num,

+                        UINT8               poolNum)

+{

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ÈÎÎñµÄUBÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 Mem_TaskUBInfo (ZOSS_TASK_ID         taskId,

+                       T_Mem_UBBlockInfo    *taskUbInfo,

+                       UINT32               num,

+                       UINT8                poolNum)

+{

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡UBÄÚ´æµÄ¿ÕÏÐÂÊ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  ubSize:     UBÄÚ´æ¿éµÄ´óС

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     UBÄÚ´æµÄʹÓÃÂÊ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+FLOAT zOss_GetUBFreeRate(UINT32 ubSize)

+{

+    return (FLOAT)(0.8);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ³õʼ»¯heapµ÷ÊÔÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID HeapDbg_Init(VOID)

+{

+

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼ì²éÄÚ´æÐ¹Â¶Æðʼʱ¼äºÍÅäÖÃÄÚ´æÐ¹Â¶µÄ¼ì²é·§Öµ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  leak_threadhold:    ÄÚ´æÐ¹Â¶µÄ¼ì²é·§Öµ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID zOss_MemLeakStart(UINT32 leak_threadhold)

+{

+

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼ì²éij¶Îʱ¼äÄÚµÄÄÚ´æÐ¹Â¶Çé¿ö

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID zOss_MemLeakEnd(VOID)

+{

+

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¼ì²éÄÚ´æÐ¹Â¶Çé¿ö

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID zOss_CheckMem(VOID)

+{

+    tos_heap_print_leak(0);

+    tos_heap_trace_overflow();

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÅäÖÃUBÄÚ´æµÄµ÷ÊÔ¿ª¹Ø

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  dbgFlag:    UBÄÚ´æµÄµ÷ÊÔ¿ª¹Ø

+                TRUE:       ´ò¿ª

+                FALSE:      ¹Ø±Õ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID zOss_SetUbDbgSwitch(UINT32 dbgFlag)

+{

+

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡¶ÑÄÚ´æµÄͳ¼ÆÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  mem_info:   ¶ÑÄÚ´æÍ³¼ÆÐÅÏ¢µÄ´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     ³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 zOss_GetSysMemInfo(T_Mem_MemInfo *mem_info)

+{

+    struct mallinfo heap_info = {0};

+

+    zOss_AssertEx(mem_info != NULL, ZOSS_ERROR);

+

+    heap_info = mallinfo();

+    mem_info->nMemTotal = (UINT32)heap_info.arena;

+    mem_info->nMemUsed  = (UINT32)heap_info.uordblks;

+    mem_info->nMemMaxFree  = (UINT32)heap_info.maxfree;

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡¶ÑÄÚ´æµÄʹÓÃÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  pMonHeapInfo:   ¶ÑÄÚ´æÊ¹ÓÃÐÅÏ¢µÄ´æ·ÅµØÖ·

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID z0ss_GetHeapInfo(T_ZOss_Mon_Heap *pMonHeapInfo)

+{

+#ifdef _USE_MONITOR

+    T_Mem_MemInfo memInfo = {0};

+

+    if (pMonHeapInfo)

+    {

+        zOss_GetSysMemInfo(&memInfo);

+        pMonHeapInfo->base = (UINT32)CYGMEM_SECTION_heap1;

+        pMonHeapInfo->size = memInfo.nMemTotal;

+        pMonHeapInfo->used = memInfo.nMemUsed;

+    }

+#endif

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_mmu_csky.c b/cp/ps/plat/src/oss/osa/tos/src/tos_mmu_csky.c
new file mode 100644
index 0000000..f7b95af
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_mmu_csky.c
@@ -0,0 +1,533 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_mmu_csky.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : csky´¦ÀíÆ÷mmu¹¦ÄÜʵÏÖÄ£¿é

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/11/09

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ÁõÑÇÄÏ

+* °æ ±¾ ºÅ : V1.1

+* ÐÞ¸ÄÈÕÆÚ : 2011/11/23

+* ÐÞ¸ÄÄÚÈÝ : ÖØ¹¹

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : ÁõÑÇÄÏ

+* °æ ±¾ ºÅ : V1.2

+* ÐÞ¸ÄÈÕÆÚ : 2012/03/09

+* ÐÞ¸ÄÄÚÈÝ : ´ÓÄÚºËÄ¿Â¼ÒÆÖ²µ½platĿ¼

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0004

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "tos_mmu_csky.h"

+#include <cyg/infra/cyg_ass.h>

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+#ifdef CYG_HAL_CSKYCPU_MMU

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define CSKY_MMU_DEBUG

+

+#define DPRAM_PHY_ADDR  (0x40000000)

+#define DPRAM_VIR_ADDR  (0x40000000)

+#define DPRAM_SIZE      (CSKY_PAGE_SIZE_16M)

+#define DPRAM_ATTR      (CSKY_PAGE_CACHE_DISABLE | CSKY_PAGE_DIRTY | CSKY_PAGE_VALID)

+

+#define ICP_PHY_ADDR    (0x50000000)

+#define ICP_VIR_ADDR    (0x50000000)

+#define ICP_SIZE        (CSKY_PAGE_SIZE_16M)

+#define ICP_ATTR        (CSKY_PAGE_CACHE_DISABLE | CSKY_PAGE_DIRTY | CSKY_PAGE_VALID)

+

+#define IO_PHY_ADDR     (0x60000000)

+#define IO_VIR_ADDR     (0x60000000)

+#define IO_SIZE         (CSKY_PAGE_SIZE_16M)

+#define IO_ATTR         (CSKY_PAGE_CACHE_DISABLE | CSKY_PAGE_DIRTY | CSKY_PAGE_VALID)

+

+#define NAND_PHY_ADDR   (0x82000000)

+#define NAND_VIR_ADDR   (0xCA000000)

+#define NAND_SIZE       (CSKY_PAGE_SIZE_16M)

+#define NAND_ATTR       (CSKY_PAGE_CACHE_DISABLE | CSKY_PAGE_DIRTY | CSKY_PAGE_VALID)

+

+#define GSM_PHY_ADDR    (0xF4000000)

+#define GSM_VIR_ADDR    (0xF4000000)

+#define GSM_SIZE        (0x3000000)

+#define GSM_ATTR        (CSKY_PAGE_CACHE_DISABLE | CSKY_PAGE_DIRTY | CSKY_PAGE_VALID)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static csky_tlb_mismatch_t  tos_csky_tlb_mismatch      = {0};

+

+static csky_mmu_region_t    *tos_csky_mmu_region_head  = NULL;

+

+static csky_mmu_region_t    tos_csky_mmu_region[]      = 

+{

+    {

+        DPRAM_PHY_ADDR, /* physical address */

+        DPRAM_VIR_ADDR, /* virtual address  */

+        DPRAM_SIZE,     /* region size      */

+        DPRAM_ATTR,     /* region attribute */

+        NULL

+    },

+    

+    {

+        ICP_PHY_ADDR,   /* physical address */

+        ICP_VIR_ADDR,   /* virtual address  */

+        ICP_SIZE,       /* region size      */

+        ICP_ATTR,       /* region attribute */

+        NULL

+    },

+

+    {

+        IO_PHY_ADDR,    /* physical address */

+        IO_VIR_ADDR,    /* virtual address  */

+        IO_SIZE,        /* region size      */

+        IO_ATTR,        /* region attribute */

+        NULL

+    },

+

+    {

+        NAND_PHY_ADDR,  /* physical address */

+        NAND_VIR_ADDR,  /* virtual address  */

+        NAND_SIZE,      /* region size      */

+        NAND_ATTR,      /* region attribute */

+        NULL

+    },

+

+    {

+        GSM_PHY_ADDR,   /* physical address */

+        GSM_VIR_ADDR,   /* virtual address  */

+        GSM_SIZE,       /* region size      */

+        GSM_ATTR,       /* region attribute */

+        NULL

+    },

+};

+

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Э´¦ÀíÆ÷Ñ¡ÔñMMU

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     socоƬÉÏ¿ÉÄÜ´æÔÚ¶à¸öЭ´¦ÀíÆ÷£¬±¾º¯ÊýʵÏÖMMUЭ´¦ÀíÆ÷µÄÑ¡Ôñ¹¦ÄÜ

+**************************************************************************/

+static inline void tos_csky_mmu_select_cp(void)

+{

+    asm volatile (                                                          \

+        "cpseti cp15;"  /* select mmu coprocessor */                        \

+        :                                                                   \

+        :                                                                   \

+        :                                                                   \

+    );

+}

+

+#ifdef CSKY_MMU_DEBUG

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¶Ámir(MMU Index Register)¼Ä´æÆ÷

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     mir¼Ä´æÆ÷µÄÖµ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static inline cyg_uint32 tos_csky_mmu_mir_read(void)

+{

+    cyg_uint32 MIR = 0x00;

+

+    asm volatile (                                                          \

+        "cpseti cp15;"                                                      \

+        "cprcr  r1, cpcr0;"                                                 \

+        "mov    %0, r1;"                                                    \

+        : "=r"(MIR)                                                         \

+        :                                                                   \

+        : "r1"                                                              \

+    );

+

+    return MIR & 0x3F;

+}

+#endif

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     дmir(MMU Index Register)¼Ä´æÆ÷

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  MIR:    ´ýдÈëMIR¼Ä´æÆ÷µÄÖµ

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static inline void tos_csky_mmu_mir_write(cyg_uint32 MIR)

+{

+    asm volatile (                                                          \

+        "cpseti cp15;"                                                      \

+        "mov    r1, %0;"                                                    \

+        "cpwcr  r1, cpcr0;"                                                 \

+        :                                                                   \

+        : "r"(MIR)                                                          \

+        : "r1"                                                              \

+    );

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     дmmuµÄmpr(MMU Page mask Register)¼Ä´æÆ÷

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ²Î¼ûck610оƬÊÖ²áÖйØÓÚmpr¼Ä´æÆ÷µÄ˵Ã÷

+**************************************************************************/

+static inline void tos_csky_mmu_write_mpr(int value)

+{

+    asm volatile (                                                          \

+        "cpseti cp15;"      /* select mmu coprocessor */                    \

+        "mov    r1, %0;"                                                    \

+        "cpwcr  r1, cpcr6;"                                                 \

+        :                                                                   \

+        : "r"(value)                                                        \

+        : "r1"                                                              \

+    );

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¶ÁÒ»¸ötlb±íÏî

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  MIR:    tlb±íÏîË÷Òý

+                tlb:    tlb±íÏî±£´æµØÖ·

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ²Î¼ûck610оƬÊÖ²áÖйØÓÚTLBRIÃüÁîµÄ˵Ã÷

+**************************************************************************/

+static inline void tos_csky_mmu_tlb_read(cyg_uint32 MIR, csky_tlb_entry_t *tlb)

+{

+    if (MIR >= CSKY_TLB_NUM)

+    {

+        return;

+    }

+    

+    if (tlb == NULL)

+    {

+        return;

+    }

+

+    tos_csky_mmu_mir_write(MIR);

+

+    asm volatile (                                                          \

+        "cpseti cp15;"                                                      \

+        "lrw    r1, (1<<29);"                                               \

+        "cpwcr  r1, cpcr8;"     /* Write MICR               */              \

+        "cprcr  r1, cpcr1;"     /* MRR(MMU Random Register) */              \

+        "cprcr  r2, cpcr2;"     /* MEL0(MMU Entry Low 0)    */              \

+        "cprcr  r3, cpcr3;"     /* MEL0(MMU Entry Low 0)    */              \

+        "cprcr  r4, cpcr4;"     /* MEH(MMU Entry High)      */              \

+        "mov    r5, %0;"                                                    \

+        "stw    r1, (r5, 0);"                                               \

+        "stw    r2, (r5, 4);"                                               \

+        "stw    r3, (r5, 8);"                                               \

+        "stw    r4, (r5, 12);"                                              \

+        :                                                                   \

+        : "r"(tlb)                                                          \

+        : "r1", "r2", "r3", "r4", "r5"                                      \

+    );

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ʹָ¶¨asidµÄËùÓÐtlb±íÏîʧЧ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  asid:   asid Stands for Address Space Identify

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ²Î¼ûck610оƬÊÖ²áÖйØÓÚTLBINVÃüÁîµÄ˵Ã÷

+**************************************************************************/

+static inline void tos_csky_mmu_tlb_invalid(cyg_uint8 asid)

+{

+    asm volatile (                                                          \

+        "cpseti cp15;"          /* select mmu coprocessor */                \

+        "mov    r1, %0;"                                                    \

+        "cpwcr  r1, cpcr4;"     /* MEH = asid       */                      \

+        "lrw    r1, (1<<27);"   /* TLBINV           */                      \

+        "cpwcr  r1, cpcr8;"     /* execute TLBINV   */                      \

+        :                                                                   \

+        : "r"(asid)                                                         \

+        : "r1"                                                              \

+    );

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ´ò¿ªcsky´¦ÀíÆ÷µÄmmu¹¦ÄÜ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void tos_csky_mmu_enable(void)

+{

+    asm volatile (                                                          \

+        "mfcr   r1, cr18;"                                                  \

+        "bseti  r1, 0;"                                                     \

+        "bclri  r1, 1;"                                                     \

+        "mtcr   r1, cr18;"                                                  \

+        :                                                                   \

+        :                                                                   \

+        : "r1"                                                              \

+    );

+}

+

+

+#if 0

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ¹Ø±Õcsky´¦ÀíÆ÷µÄmmu¹¦ÄÜ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void tos_csky_mmu_disable(void)

+{

+    asm volatile (                                                          \

+        "mfcr   r1, cr18;"                                                  \

+        "bclri  r1, 0;"                                                     \

+        "bclri  r1, 1;"                                                     \

+        "mtcr   r1, cr18;"                                                  \

+        :                                                                   \

+        :                                                                   \

+        : "r1"                                                              \

+    );

+}

+#endif

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÉèÖÃÒ»¸ötlb±íÏî

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  MEL0:   MMU Entry Low 0£¬´æ·ÅPFN(Physical Frame Number)

+                MEL1:   MMU Entry Low 1£¬´æ·ÅPFN(Physical Frame Number)

+                MEH:    MMU Entry High£¬´æ·ÅVPN(Virtual Page Number)

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     ²Î¼ûck610оƬÊÖ²áÖйØÓÚTLBWIÃüÁîµÄ˵Ã÷

+**************************************************************************/

+static inline void tos_csky_mmu_tlb_set(cyg_uint32 MEL0, cyg_uint32 MEL1, cyg_uint32 MEH)

+{

+    asm volatile (                                                          \

+        "cpseti cp15;"          /* select mmu coprocessor */                \

+        "mov    r1, %0;"                                                    \

+        "cpwcr  r1, cpcr2;"     /* MEL0             */                      \

+        "mov    r1, %1;"                                                    \

+        "cpwcr  r1, cpcr3;"     /* MEL1             */                      \

+        "mov    r1, %2;"                                                    \

+        "cpwcr  r1, cpcr4;"     /* MEH              */                      \

+        "lrw    r1, (1<<28);"   /* TLBWR            */                      \

+        "cpwcr  r1, cpcr8;"     /* execute TLBWR    */                      \

+        :                                                                   \

+        : "r"(MEL0), "r"(MEL1), "r"(MEH)                                    \

+        : "r1"                                                              \

+    );

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ³õʼ»¯Óû§ÅäÖõÄtlb±íÏî

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     tos_csky_mmu_region±íÏîÒªÇóÈçÏ£¬·ñÔòϵͳ¶ÏÑÔ:

+                1. µ¥¸ö±íÏîÅäÖõÄÎïÀíÆðʼµØÖ·ÐëCSKY_PAGE_SIZE_DEFAULT´óС¶ÔÆë£»

+                2. µ¥¸ö±íÏîÅäÖõÄÐéÄâÆðʼµØÖ·ÐëCSKY_PAGE_SIZE_DEFAULT´óС¶ÔÆë£»

+                3. µ¥¸ö±íÏîÅäÖõÄÒ³´óС²»µÍÓÚCSKY_PAGE_SIZE_DEFAULT;

+                4. Á½¸öÏàÁÚ±íÏîÅäÖõĵØÖ·¿Õ¼ä²»ÄÜÖØµþ;

+**************************************************************************/

+static void tos_csky_mmu_tlb_init(void)

+{

+    cyg_uint32          cnt         = 0;

+    cyg_uint32          page_cnt    = 0;

+    cyg_uint32          MEL0        = 0;

+    cyg_uint32          MEL1        = 0;

+    cyg_uint32          MEH         = 0;

+    cyg_uint32          MIR         = 0;

+    cyg_uint32          addr        = 0;

+    csky_mmu_region_t   *region     = NULL;

+    csky_mmu_region_t   *region_end = ARRAY_END(tos_csky_mmu_region);

+    

+    region = ARRAY_START(tos_csky_mmu_region);

+    for (; region < region_end; region++) 

+    {

+        zOss_ASSERT((region->phy_addr%CSKY_PAGE_SIZE_DEFAULT) == 0);

+        zOss_ASSERT((region->vir_addr%CSKY_PAGE_SIZE_DEFAULT) == 0);

+        zOss_ASSERT(region->size >= CSKY_PAGE_SIZE_DEFAULT);

+        if (region < region_end - 1)

+        {

+            zOss_ASSERT((region->phy_addr + region->size) <= (region + 1)->phy_addr);

+        }

+    }

+    

+    MIR = CSKY_TLB_REG_START;

+    region = ARRAY_START(tos_csky_mmu_region);

+    tos_csky_mmu_region_head = region;

+    for (; region < region_end && MIR < CSKY_TLB_NUM; region++) 

+    {

+        page_cnt = region->size/(2*CSKY_PAGE_SIZE_DEFAULT);

+        if (region->size%(2*CSKY_PAGE_SIZE_DEFAULT))

+        {

+            page_cnt++;

+        }

+        

+        for (cnt = 0x00; cnt < page_cnt; cnt++, MIR++)

+        {

+            addr    = (region->phy_addr + (cnt*2)*CSKY_PAGE_SIZE_DEFAULT) >> CSKY_PFN_OFFSET;

+            MEL0    = addr | region->attr;

+            

+            addr    = (region->phy_addr + (cnt*2+1)*CSKY_PAGE_SIZE_DEFAULT) >> CSKY_PFN_OFFSET;

+            MEL1    = addr | region->attr;

+            

+            MEH     = region->vir_addr + cnt*2*CSKY_PAGE_SIZE_DEFAULT;

+            

+            tos_csky_mmu_tlb_set(MEL0, MEL1, MEH);

+        }

+        

+        region->next = (csky_mmu_region_t *)(region + 1);

+        if (region == region_end - 1)

+        {

+            region->next = NULL;

+        }

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     csky´¦ÀíÆ÷tlbÆ¥Åäʧ°Üʱ±£´æÏÖ³¡

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mismatch:   ʧƥÅä½á¹¹ÌåÖ¸Õ룬ÓÃÓÚ±£´æÏÖ³¡

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void tos_csky_mmu_tlb_mismatch_save_context(csky_tlb_mismatch_t *mismatch)

+{

+    cyg_uint32 MEH = 0x00;

+    cyg_uint32 MCR = 0x00;

+    cyg_uint32 EPC = 0x00;

+

+    zOss_AssertExN(mismatch != NULL);

+    asm volatile (

+        "cprcr  r2, cpcr4;"

+        "cprcr  r3, cpcr5;"

+        "mfcr   r4, epc;"

+        "mov    %0, r2;"

+        "mov    %1, r3;"

+        "mov    %2, r4;"

+        : "=r"(MEH), "=r"(MCR), "=r"(EPC)

+        :

+        : "r2", "r3", "r4"

+    );

+

+    mismatch->MEH       = MEH;

+    mismatch->vpn       = MEH>>12;

+    mismatch->asid      = MEH & ((0x1<<8) - 1);

+

+    mismatch->MCR       = MCR;

+    mismatch->pte_base  = MCR>>22;

+    mismatch->bad_vpn2  = (MCR>>3) & ((0x1<<19) - 1);

+

+    mismatch->epc       = EPC;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     csky´¦ÀíÆ÷tlbÆ¥Åäʧ°ÜÊ±ÖØÌîtlb±íÏî

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  mismatch:   ʧƥÅä½á¹¹ÌåÖ¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+static void tos_csky_mmu_tlb_mismatch_refill(csky_tlb_mismatch_t *mismatch)

+{

+    zOss_ASSERT(mismatch != NULL);

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     csky´¦ÀíÆ÷mmu¹¦Äܳõʼ»¯

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_csky_mmu_init(void)

+{

+    tos_csky_mmu_write_mpr(CSKY_PAGE_MASK_16M);

+

+    tos_csky_mmu_tlb_init();

+

+    tos_csky_mmu_enable();

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     csky´¦ÀíÆ÷tlbÆ¥Åäʧ°Ü

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  reg:    vectors.SÖб£´æµÄÏÖ³¡¼Ä´æÆ÷Õ»Ö¡

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+void tos_csky_mmu_tlb_mismatch(HAL_SavedRegisters *reg)

+{

+    tos_csky_mmu_tlb_mismatch_save_context(&tos_csky_tlb_mismatch);

+    tos_csky_mmu_tlb_mismatch_refill(&tos_csky_tlb_mismatch);

+}

+

+#endif  /* CYG_HAL_CSKYCPU_MMU */

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_monitor.c b/cp/ps/plat/src/oss/osa/tos/src/tos_monitor.c
new file mode 100644
index 0000000..fc723d3
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_monitor.c
@@ -0,0 +1,173 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_monitor.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : TOS 3.0²Ù×÷ϵͳÖеÄÖ§³Å²ã¼à¿Ø

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/03/21

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <cyg/kernel/kapi.h>

+#include <cyg/hal/hal_io.h>

+#include "oss_api.h"

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define CK_DDR_CTRL_BASE            (0x50001000)

+#define CK_DDR_CTRL_LPDDR_CTL_35    (CK_DDR_CTRL_BASE + 0x8c)

+#define CK_DDR_CTRL_LPDDR_CTL_37    (CK_DDR_CTRL_BASE + 0x94)

+#define CK_DDR_CTRL_LPDDR_CTL_38    (CK_DDR_CTRL_BASE + 0x98)

+

+#define CK_DDR_CTRL_LPDDR_CTL_35_MEM_ACCESS_OUTRANGE    (0x00000003)

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct 

+{

+    unsigned int    LPDDR_CTL_35;

+    unsigned int    LPDDR_CTL_37;

+    unsigned int    LPDDR_CTL_38;

+} ddr_monitor_t;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+VOID tos_monitor(VOID) CYGBLD_ATTRIB_SECTION(".ispm");

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static ddr_monitor_t ddr_monitor CYGBLD_ATTRIB_SECTION(".dspm");

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     Ö§³Å²ã¼à¿Øº¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  VOID

+*   (´«³ö²ÎÊý)  VOID

+* ·µ »Ø Öµ:     VOID

+* ÆäËü˵Ã÷:     VOID

+**************************************************************************/

+VOID tos_monitor(VOID)

+{

+    ddr_monitor.LPDDR_CTL_35 = HAL_REG_UINT32(CK_DDR_CTRL_LPDDR_CTL_35);

+    if (ddr_monitor.LPDDR_CTL_35 & CK_DDR_CTRL_LPDDR_CTL_35_MEM_ACCESS_OUTRANGE) 

+    {

+        ddr_monitor.LPDDR_CTL_37 = HAL_REG_UINT32(CK_DDR_CTRL_LPDDR_CTL_37);

+        ddr_monitor.LPDDR_CTL_38 = HAL_REG_UINT32(CK_DDR_CTRL_LPDDR_CTL_38);

+        zOss_ASSERT(0);

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²âÊÔ¸ú×Ùº¯ÊýÄ£¿é¹¦ÄÜ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  VOID

+*   (´«³ö²ÎÊý)  VOID

+* ·µ »Ø Öµ:     VOID

+* ÆäËü˵Ã÷:     VOID

+**************************************************************************/

+VOID tos_trace_func0(VOID)

+{

+    ZOSS_TRACE_FUNC_START_ALWAYS();

+    zOss_Sleep(1000);

+    ZOSS_TRACE_FUNC_END_ALWAYS();

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²âÊÔ¸ú×Ùº¯ÊýÄ£¿é¹¦ÄÜ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  VOID

+*   (´«³ö²ÎÊý)  VOID

+* ·µ »Ø Öµ:     VOID

+* ÆäËü˵Ã÷:     VOID

+**************************************************************************/

+VOID tos_trace_func1(VOID)

+{

+    ZOSS_TRACE_FUNC_START_ALWAYS();

+    zOss_Sleep(1000);

+    ZOSS_TRACE_FUNC_END_ALWAYS();

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²âÊÔ¸ú×Ùº¯ÊýÄ£¿é¹¦ÄÜ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  VOID

+*   (´«³ö²ÎÊý)  VOID

+* ·µ »Ø Öµ:     VOID

+* ÆäËü˵Ã÷:     VOID

+**************************************************************************/

+VOID tos_trace_func2(VOID)

+{

+    ZOSS_TRACE_FUNC_START_ALWAYS();

+    zOss_Sleep(1000);

+    ZOSS_TRACE_FUNC_END_ALWAYS();

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ²âÊÔitcmºÍdtcmÄ£¿é¹¦ÄÜ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  VOID

+*   (´«³ö²ÎÊý)  VOID

+* ·µ »Ø Öµ:     VOID

+* ÆäËü˵Ã÷:     VOID zOss_Sleep(UINT32 time_in_ms) __attribute__((long_call));

+**************************************************************************/

+VOID __tcm_func tos_itcm_func(VOID)

+{

+    for(;;) 

+    {

+        static unsigned int cnt = 0;

+        static int tos_dtcm_data[1000] CYGBLD_ATTRIB_SECTION(".dtcm");

+        

+        tos_dtcm_data[cnt] = (int)cnt;

+        if (++cnt >= sizeof(tos_dtcm_data)/sizeof(tos_dtcm_data[0]))

+        {

+            cnt = 0x00;

+        }

+        zOss_Sleep(1000);

+    }

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_ramdump.c b/cp/ps/plat/src/oss/osa/tos/src/tos_ramdump.c
new file mode 100644
index 0000000..b85800c
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_ramdump.c
@@ -0,0 +1,80 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû :  tos_ramdump.c

+* ÎÄ ¼þ Ãû :  tos_ramdump.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ :  ʵÏÖTOS²Ù×÷ϵͳRamdumpÏà¹ØµÄ¹¦ÄÜ

+* ×÷    Õß :  ¸ß»ª·å

+* °æ    ±¾ :  v1.0

+* Íê³ÉÈÕÆÚ :  2013/10/28

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "sup_ramdump.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_RamdumpEncodeError

+* ¹¦ÄÜÃèÊö£º ÏòLCDÏÔʾ»ù±¾µÄÒì³£ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º (IN):

+*                  pBuff: ÄÚÈÝÖ¸Õë

+*                  user_called: ÎªÕæÊ±,±íʾ´íÎóÀ´×ÔÓû§µ÷ÓÃ,Ϊ¼Ùʱ,±íʾ´íÎóÀ´×ÔÄÚºË

+*                  ecode: ´íÎóÂë

+*                  extra: ´íÎ󸽼ÓÂë

+*            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_RamdumpEncodeError(CHAR *pBuff, UINT16 user_called, UINT16 ecode, UINT16 extra)

+{    

+    zOss_RamdumpSaveRegisters();

+    

+    /* ramdump ´¦Àí֮ǰµÄhook */

+    if (g_zRamdump_Optfunc.ramdump_Process_PreHook != NULL)

+    {

+        g_zRamdump_Optfunc.ramdump_Process_PreHook();

+    }

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_ramdump_arm.c b/cp/ps/plat/src/oss/osa/tos/src/tos_ramdump_arm.c
new file mode 100644
index 0000000..2199e37
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_ramdump_arm.c
@@ -0,0 +1,947 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_ramdump_arm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2012/06/18

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "tos_ramdump.h"

+#include "comm_api.h"

+#include "hal_comm.h"

+#include "sys_func_atcfg.h"

+#include "tos_except_arm.h"

+#include "tos_mem.cfg"

+#ifdef _USE_ARM1_RAMDUMP

+#include "drvs_icp.h"

+#include "ps_ephy_interface.h"

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+#include "drvs_usbpoll.h"

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+extern VOID zOss_RamdumpSaveRegisters(VOID);

+extern UINT32 cp15_readControlRegister( VOID );

+extern UINT32 cp15_readDomainRegister( VOID );

+extern UINT32 cp15_readTTB( VOID );

+extern cyg_bool zTos_MmuGetReadableRegion(cyg_uint32 start, cyg_uint32 end, cyg_uint32 *p_start, cyg_uint32 *p_end);

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* ¹æ»®·ÖÅäµÄÄÚ´æ¿Õ¼äËÄ×Ö½Ú¶ÔÆë */

+#define CMM_BUFFER_SIZE                     4096    /* 4k */

+#define CONFIGURED_REGIONS_SIZE             4096    /* 4K */

+#define PARSED_REGIONS_SIZE                 4096    /* 4K */

+#define RAMDUMP_FILE_SIZE                   2048    /* 2K */

+#define ERROR_CODE_SIZE                     1024    /* 1k */ 

+#define IO_READ_BUFFER                      1024    /* 1K */

+#define IO_WRITE_BUFFER                     1024    /* 1k */

+

+#ifdef _USE_ARM1_RAMDUMP

+#define HIGHMEM_FLAG_ARM02ARM1_SIZE         (4)

+#define HIGHMEM_FLAG_ARM12ARM0_SIZE         (4)

+#endif

+/* io read/write buffer: [msg][data] */

+#define RAMDUMP_IO_DATA_BASE(addr)          ((UINT32)addr + 4)

+

+/* T_RamdumpCmmFileInfo */

+#define CMM_FILE_BUF_SIZE(addr)             (*(UINT32 *)addr)

+#define CMM_FILE_BUF_BASE(addr)             ((UINT32)addr + 4)

+

+

+/* RamdumpÎļþµÄÃû×Ö */

+#define RAMDUMP_DIR_NAME                    "ramdump_dir"   /* ±£´æramdumpĿ¼Ãû    */

+#define RAM_ARM0_NAME                       "arm0_ram.bin"  /* ±£´æarm0_ramÎļþÃû   */

+

+#ifdef _USE_ARM1_RAMDUMP

+#define RAM_ARM1_NAME                       "arm1_memory.bin"  /* ±£´æarm1_ramÎļþÃû   */

+#define RAMDUMP_FLAG                        0x22222222

+#define HIGHMEM_ARM1_CMM_INFO_BASE          0x20060000

+#define HIGHMEM_ARM1_CONFIGURED_REGION_BASE (HIGHMEM_ARM1_CMM_INFO_BASE             + CMM_BUFFER_SIZE)

+#define HIGHMEM_ARM1_PARSED_REGION_BASE     (HIGHMEM_ARM1_CONFIGURED_REGION_BASE    + CONFIGURED_REGIONS_SIZE)

+#define HIGHMEM_ARM1_FLAG_ARM02ARM1_BASE    (HIGHMEM_ARM1_PARSED_REGION_BASE        + PARSED_REGIONS_SIZE + ERROR_CODE_SIZE)

+#define HIGHMEM_ARM1_FLAG_ARM12ARM0_BASE    (HIGHMEM_ARM1_FLAG_ARM02ARM1_BASE       + HIGHMEM_FLAG_ARM02ARM1_SIZE)

+

+#define ARM0_NOFITY_ARM1                                            \

+    ramdump_send_msg_to_arm1();                                     \

+    *(UINT32 *)HIGHMEM_ARM1_FLAG_ARM02ARM1_BASE = RAMDUMP_FLAG

+    

+#define ARM0_WAIT_ARM1                                              \

+    while (RAMDUMP_FLAG != *(volatile UINT32*)HIGHMEM_ARM1_FLAG_ARM12ARM0_BASE) {}

+        

+#ifdef _USE_PSM

+extern  SINT32 zOss_PsmGetSleepFlag(VOID);   /* arm1˯Ãß±êÖ¾½Ó¿Ú */

+extern  VOID   zL1e_WriteWakeUpEphyToRam(VOID);

+

+#define ARM0_WAIT_DDR1_READY                                        \

+    zL1e_WriteWakeUpEphyToRam();                                    \

+    while ( PSM_DEEP_SLEEP == (UINT32)zOss_PsmGetSleepFlag() ) {}

+#endif

+

+#endif

+

+#ifdef __GNUC__

+

+#ifdef __thumb__

+# define HAL_ARM_MODE(reg)                                          \

+    "adr    "#reg", 1f;"                                            \

+    "bx     "#reg";"                                                \

+    ".arm   ;"                                                      \

+    "1:     ;"

+

+# define HAL_THUMB_MODE(reg)                                        \

+    "adr    "#reg", 1f + 1;"                                        \

+    "bx     "#reg";"                                                \

+    "1:     ;"                                                      \

+    ".thumb ;"

+

+# define HAL_ARM_THUMB_REG(reg)                                     \

+    ""#reg""

+#else

+

+# define HAL_ARM_MODE(reg)      ";"

+# define HAL_THUMB_MODE(reg)    ";"

+# define HAL_ARM_THUMB_REG(reg)

+

+# endif

+

+#define HAL_CLEAN_FLASH_CACHE()                                     \

+    do                                                              \

+    {                                                               \

+        asm volatile (                                              \

+            HAL_ARM_MODE(r0)                                        \

+            "mov r0, #0;"                                           \

+            "mcr p15, 0, r0, c7, c14, 0;"                           \

+            "mcr p15, 0, r0, c7, c5, 0;"                            \

+            "mcr p15, 0, r0, c7, c15, 0;"                           \

+            "mcr p15, 0, r0, c7, c10, 4;"                           \

+            HAL_THUMB_MODE(r0)                                      \

+            :                                                       \

+            :                                                       \

+            :"r0"                                                   \

+        );                                                          \

+    }while(0)

+

+#elif defined (__ARMCC_VERSION)

+

+#define HAL_CLEAN_FLASH_CACHE()                                     \

+    do                                                              \

+    {                                                               \

+        asm {                                                       \

+            mov ip,  0;                                             \

+            mcr p15, 0, ip, c7, c14, 0;                             \

+            mcr p15, 0, ip, c7, c5, 0;                              \

+            mcr p15, 0, ip, c7, c15, 0;                             \

+            mcr p15, 0, ip, c7, c10, 4;                             \

+        }                                                           \

+    }while(0)

+    

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    UINT32 cmmFileSize;

+    CHAR   cmmFileBuffer[1];    /* cmmÎļþ»º³å£¬ºóÃæ»¹Óпռä */

+}T_RamdumpCmmFileInfo;

+

+typedef struct

+{

+    CHAR *cmmBuffer;                /* ´æ·ÅÉú³ÉµÄ»Ö¸´ÏÖ³¡½Å±¾µÄ»ùÖ· */

+    CHAR *configured_regions_info;  /* ´æ·Å³õʼ»¯ÄÚ´æ¶Î»ù´¡         */

+    CHAR *parsed_regions_info;      /* ´æ·ÅÐèµ¼³öµÄÄÚ´æ¶Î»ù´¡       */

+    CHAR *ramdump_file_info;        /* ´æ·Å´«ÊäÊý¾ÝµÄÎļþÐÅÏ¢       */

+    CHAR *ioReadBuffer;             /* ´«ÊäÊý¾ÝµÄ¶Á»º³å»ùÖ·         */

+    CHAR *ioWriteBuffer;            /* ´«ÊäÊý¾ÝµÄд»º³å»ùÖ·         */

+}T_RamDumpCfg;

+

+typedef struct

+{

+    CHAR    fileName[DUMPFILENMAE_LEN]; /* ÎļþÃû       */

+    UINT32  baseAddr;                   /* ÄÚ´æ»ùµØÖ·   */

+    UINT32  size;                       /* ´óС         */

+} T_RamdumpFile;

+

+typedef struct

+{

+    UINT32          fileNum;        /* Îļþ¸öÊý          */

+    T_RamdumpFile   fileInfo[1];    /* ºóÐø¿ÉÄÜ»¹ÓÐÊý¾Ý  */

+} T_RamdumpFileInfo;

+

+typedef struct

+{

+   UINT32   start_addr;

+   UINT32   end_addr;

+   UINT32   map_start_addr;

+   UINT32   copy_start_addr;

+}T_RamdumpRegion;

+

+typedef struct

+{

+   UINT32           region_num;

+   T_RamdumpRegion  regions[1]; /* ºóÐø¿ÉÄÜ»¹ÓÐÊý¾Ý */

+} T_RamdumpRegionInfo;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID ramdump_main(VOID);

+static VOID ramdump_transfer_data(VOID);

+static VOID ramdump_create_cmm_file(VOID);

+static VOID ramdump_save_file_info( const CHAR *name, UINT32 base_addr, UINT32 size );

+static VOID ramdump_save_region_file_info( T_RamdumpRegionInfo *p_region_info, const CHAR *file_name );

+static VOID IO_ReadData(UINT8 *buffer, UINT32 size);

+static VOID IO_WriteData(UINT8 *buffer, UINT32 size);

+static VOID ramdump_get_available_region( UINT32 memAddBegin, UINT32 end, UINT32 map_base, UINT32 copy_base,UINT32 memorybase );

+static VOID ramdump_parse_region_info( UINT32 configured_region_base, UINT32 parsed_region_base );

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static struct cpu_regdump *Osa_ArmExceptDump = NULL;

+static UINT8 Osa_ArmMode[6] =   /* Êý×é˳ÐòÓëstruc coreÖеÄ˳ÐòÒ»Ö£¬²»Äܸü¸Ä */

+{

+    0xdf,   /* SYS */

+    0xd3,   /* SVC */

+    0xd7,   /* ABT */

+    0xdb,   /* UND */

+    0xd2,   /* IRQ */

+    0xd1,   /* FIQ */

+}; 

+

+static CHAR *Osa_BankRegsiter[3]    = {(CHAR *)"r13", (CHAR *)"r14", (CHAR *)"spsr"};

+struct cpu_core Osa_CoreRegisters   = {0};

+static T_RamDumpCfg  gOsa_Ramdump   = {0};  /* ±£´æramdumpµÄÅäÖÃÐÅÏ¢ */

+

+static T_RamdumpCmmFileInfo *g_cmm_file_info            = NULL;

+static UINT32                g_cmm_file_max             = 0;

+static T_RamdumpRegionInfo  *g_configured_regions_info  = NULL;

+static UINT32                g_configured_regions_max   = 0;

+static T_RamdumpRegionInfo  *g_parsed_regions_info      = NULL;

+static UINT32                g_parsed_regions_max       = 0;

+static T_RamdumpFileInfo    *g_ramdump_file_info        = NULL;

+static UINT32                g_ramdump_file_max         = 0;

+static T_zOss_RamdumpIoOpt  g_zRamdumpIoOpt = { zOss_RamdumpUsbInit,  zOss_RamdumpUsbReadData,

+                                                zOss_RamdumpUsbWriteData, zOss_RamdumpUsbFinish};

+

+/**************************************************************************
+* ¾Ö²¿º¯ÊýʵÏÖ
+**************************************************************************/

+/* Read CPSR register */

+static inline UINT32 ARMV4T_READ_CPSR_REG(void)

+{
+    UINT32 control_reg = 0;

+

+#ifdef __GNUC__

+    asm volatile (

+        HAL_ARM_MODE(r1)

+        "MRS  %0, CPSR;"

+        HAL_THUMB_MODE(r1)

+        :"+r"(control_reg)

+        :

+        :HAL_ARM_THUMB_REG(r1)

+    );

+#elif defined (__ARMCC_VERSION)

+    __asm {

+        MRS  control_reg, CPSR

+    }

+#endif

+

+    return control_reg;

+}

+

+/******************************************************************************

+ * º¯ÊýÃû³Æ£º  ramdump_transfer_data

+ * ¹¦ÄÜÃèÊö£º  ÓëPC²à¹¤¾ß½øÐн»»¥£¬´«µÝÐèÒª±£´æµÄÊý¾Ý

+ * ²ÎÊý˵Ã÷£º  (IN):

+ *                               pRamdkumpInfo:ÎļþÐÅÏ¢

+ *                              (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ *******************************************************************************/

+static VOID ramdump_transfer_data()

+{

+    CHAR            *reqBuffer  = gOsa_Ramdump.ioReadBuffer;    /* ÇëÇóÏûÏ¢»º³åÇø   */

+    CHAR            *rspBuffer  = gOsa_Ramdump.ioWriteBuffer;   /* »ØÓ¦ÏûÏ¢»º³åÇø   */

+    UINT32          rspDataLen  = 0;                            /* »ØÓ¦ÏûÏ¢³¤¶È     */

+    UINT32          *reqCmd     = NULL;

+    UINT32          *rspCmd     = NULL;

+    T_RamdumpFile   *fileInfo   = NULL;

+    

+    rspCmd      = (UINT32 *)rspBuffer;

+    reqCmd      = (UINT32 *)reqBuffer;

+    fileInfo    = g_ramdump_file_info->fileInfo;

+    

+    g_zRamdumpIoOpt.init();

+    

+    for(;;)

+    {

+        /* ´ÓͨѶ¿Ú¶ÁÊý¾Ý */

+        g_zRamdumpIoOpt.read((UINT8 *)reqBuffer, CMD_BUFFER_LEN);

+        

+        switch (*reqCmd)

+        {

+        case DUMPFILE_LINK_REQ: /* ͬ²½ÇëÇó */

+            {

+                T_DUMPFILE_LINK_RSP *rspMsg;

+                *rspCmd = DUMPFILE_LINK_RSP;

+                rspMsg = (T_DUMPFILE_LINK_RSP *)RAMDUMP_IO_DATA_BASE(rspBuffer);

+                rspMsg->fileNum = g_ramdump_file_info->fileNum;

+                rspDataLen = sizeof(*rspCmd) + sizeof(T_DUMPFILE_LINK_RSP);

+                break;

+            }

+        case DUMPFILE_FILE_REQ: /* ¶ÁÈ¡ÎļþÐÅÏ¢£¬¿ªÊ¼´«ÊäÎļþÇëÇó */

+            {

+                T_DUMPFILE_FILE_REQ *reqMsg;

+                T_DUMPFILE_FILE_RSP *rspMsg;

+                *rspCmd = DUMPFILE_FILE_RSP;

+                reqMsg = (T_DUMPFILE_FILE_REQ *)RAMDUMP_IO_DATA_BASE(reqBuffer);

+                rspMsg = (T_DUMPFILE_FILE_RSP *)RAMDUMP_IO_DATA_BASE(rspBuffer);

+                

+                /* ÅжÏÎļþ±àºÅÊÇ·ñÕýÈ· */

+                if (reqMsg->fileNo < g_ramdump_file_info->fileNum)

+                {

+                    strcpy((char *)rspMsg->fileName, (char *)fileInfo[reqMsg->fileNo].fileName);

+                    rspMsg->size = fileInfo[reqMsg->fileNo].size;

+                    rspDataLen = sizeof(*rspCmd) + sizeof(T_DUMPFILE_FILE_RSP);

+                }

+                else

+                {

+                    *rspCmd = DUMPFILE_NO_FAIL;

+                    rspDataLen = sizeof(*rspCmd);

+                }

+                

+                break;

+            }

+        case DUMPFILE_READ_REQ: /* ¶ÁÈ¡ÎļþÄÚÈÝ */

+            {

+                T_DUMPFILE_READ_REQ *reqMsg;

+                *rspCmd = DUMPFILE_READ_RSP;

+                rspDataLen = sizeof(*rspCmd);

+                reqMsg = (T_DUMPFILE_READ_REQ *)RAMDUMP_IO_DATA_BASE(reqBuffer);

+                

+                if (reqMsg->fileNo >= g_ramdump_file_info->fileNum)

+                {

+                    *rspCmd = DUMPFILE_LENGTH_FAIL;

+                    break;

+                }

+                

+                if (reqMsg->offset + reqMsg->length > fileInfo[reqMsg->fileNo].size)

+                {

+                    *rspCmd = DUMPFILE_NO_FAIL;

+                    break;

+                }

+                

+                g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, rspDataLen);

+                g_zRamdumpIoOpt.write((UINT8 *)(fileInfo[reqMsg->fileNo].baseAddr + reqMsg->offset), reqMsg->length);

+                continue;   /* ¼ÌÐøÖ´ÐÐÏÂÒ»´Î¶Á */

+            }

+        case DUMPFILE_END_REQ:  /* ´«Êä½áÊø */

+            {

+                *rspCmd = DUMPFILE_END_RSP;

+                rspDataLen = sizeof(*rspCmd);

+                g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, rspDataLen);

+                g_zRamdumpIoOpt.finish();

+                return;

+            }

+        default:    /* ´íÎóÖ¸Áî */

+            {

+                *rspCmd = DUMPFILE_CMD_FAIL;

+                rspDataLen = sizeof(*rspCmd);

+                break;

+            }

+        }

+        

+        /* ÏòͨѶ¿ÚдÊý¾Ý */

+        g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, rspDataLen);

+    }

+}

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_create_cmm_file

+ * ¹¦ÄÜÃèÊö£º Éú³É»Ö¸´¶ÑÕ»µÄT32½Å±¾

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *                             (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+static VOID ramdump_create_cmm_file(VOID )

+{

+    char    *cmmAddress = NULL;

+    UINT32  *paddress   = NULL; 

+    UINT32  length      = 0;

+    UINT32  value       = 0;

+    UINT32  control_reg = 0;

+    int     i           = 0;

+    int     j           = 0;

+    

+    cmmAddress = (char *)g_cmm_file_info->cmmFileBuffer;

+    

+    length = (UINT32)sprintf( cmmAddress, "ENTRY &%s\r\n", RAMDUMP_DIR_NAME );

+    cmmAddress += length;

+    

+    if(Osa_ArmExceptDump != NULL)

+    {

+        value = Osa_ArmExceptDump->pc;

+    }

+    else

+    {

+        value = Osa_CoreRegisters.supervisor.lr;

+    }

+    length = (UINT32)sprintf(cmmAddress, "r.s pc %#lx\r\n", value);

+    cmmAddress += length;

+    

+    /* Çл»µ½svcģʽ£¬»¹Ô­r0-r12 */

+    length = (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", (UINT32)Osa_ArmMode[0]);

+    cmmAddress += length;

+    

+    for(i = 0; i < 13; i++)

+    {

+        length = (UINT32)sprintf(cmmAddress, "r.s r%d %#lx\r\n", i, Osa_CoreRegisters.r[i]);

+        cmmAddress += length;

+    }

+    

+    paddress = (UINT32 *)(&Osa_CoreRegisters.user.sp);

+    /* Êä³ö³ýfiqÖ®ÍâµÄÆäËûģʽ±¸·Ý¼Ä´æÆ÷ */

+    for(i = 0; i < 5; i++)

+    {

+        length = (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", (UINT32)Osa_ArmMode[i]);

+        cmmAddress += length;

+        for(j = 0; j < 3; j++)

+        {

+            length = (UINT32)sprintf(cmmAddress, "r.s %s %#lx\r\n", Osa_BankRegsiter[j], *paddress);

+            cmmAddress += length;

+            paddress++; 

+        }

+    }

+    

+    /* Êä³öFIQ r8-r14 */

+    length = (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", (UINT32)Osa_ArmMode[5]);

+    cmmAddress += length;

+    for(i = 8; i < 15; i++)

+    {

+        length = (UINT32)sprintf(cmmAddress, "r.s r%d %#lx\r\n", i, *paddress);

+        cmmAddress += length;

+        paddress++;

+    }

+    /* Êä³öFIQ spsr */

+    length = (UINT32)sprintf(cmmAddress, "r.s spsr %#lx\r\n", *paddress);

+    cmmAddress += length;

+    

+    /* Êä³öcpsr */

+    if(Osa_ArmExceptDump != NULL)

+    {

+        switch(Osa_ArmExceptDump->vector)

+        {

+        case 0x04:  /* undefined instruction */

+            {

+                value = Osa_CoreRegisters.undefined.psr;

+                break;

+            }

+        case 0x0C:  /* prefetch abort */

+            {

+                value = Osa_CoreRegisters.abort.psr;

+                break;

+            }

+        case 0x10:  /* data abort */

+            {

+                value = Osa_CoreRegisters.abort.psr;

+                break;

+            }

+        case 0x18:  /* IRQ */

+            {

+                value = Osa_CoreRegisters.irq.psr;

+                break;

+            }

+        case 0x1C:  /* FIQ */

+            {

+                value = Osa_CoreRegisters.fiq.psr;

+                break;

+            }

+        default:

+            {

+                break;

+            }

+        }

+    }

+    else

+    {

+        value = ARMV4T_READ_CPSR_REG();

+    }

+    length = (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", value);

+    cmmAddress += length;

+    

+    control_reg = cp15_readControlRegister();

+    /* ½ûÖ¹MMU */   

+    length = (UINT32)sprintf(cmmAddress, "per.s c15:0x1 %%long %#lx\r\n", (control_reg & 0xfffffffe));  

+    cmmAddress += length;

+    

+    /* Êä³öramdump ÄÚ´æ¶ÎÎļþ */

+    for ( i = 0; i < (int)g_parsed_regions_info->region_num; i++)

+    {   

+        length = (UINT32)sprintf(cmmAddress, "data.load.binary &%s\\%s_%d %#lx--%#lx /noclear\r\n",RAMDUMP_DIR_NAME, RAM_ARM0_NAME,i,

+                                 g_parsed_regions_info->regions[i].start_addr ,g_parsed_regions_info->regions[i].end_addr);

+        cmmAddress += length;

+    }

+    /* Êä³öcp15 c1 MMU¿ØÖƼĴæÆ÷ */

+    control_reg = cp15_readControlRegister();

+    length = (UINT32)sprintf(cmmAddress, "per.s c15:0x1 %%long %#lx\r\n", control_reg);

+    cmmAddress += length;

+    

+    /* Êä³öcp15 c2 MMUÒ³±í¼Ä´æÆ÷ */

+    control_reg = cp15_readTTB();

+    length = (UINT32)sprintf(cmmAddress, "per.s c15:0x2 %%long %#lx\r\n", control_reg);

+    cmmAddress += length;

+    

+    /* Êä³öcp15 c3 MMUÓò¼Ä´æÆ÷ */

+    control_reg = cp15_readDomainRegister();

+    length = (UINT32)sprintf(cmmAddress, "per.s c15:0x3 %%long %#lx\r\n", control_reg);

+    cmmAddress += length;

+    

+    /* Êä³ö½áÊø·û */

+    length = (UINT32)sprintf(cmmAddress, "ENDDO\r\n");

+    cmmAddress += length;

+    

+    g_cmm_file_info->cmmFileSize = (UINT32)(cmmAddress - g_cmm_file_info->cmmFileBuffer);

+    zOss_AssertExN( g_cmm_file_info->cmmFileSize <= g_cmm_file_max );

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º  ramdump_get_available_region

+ * ¹¦ÄÜÃèÊö£º  ¶ÔĬÈÏÅäÖõÄÄÚ´æ¿éÊý¾ÝÓëMMU½âÎöµÄÄÚ´æ¿éÊý¾Ý¶Ô±È£¬

+                                 ±£´æ¿Éµ¼³öÀ´µÄÄÚ´æ¿é

+ * ²ÎÊý˵Ã÷£º (IN):  ÄÚ´æ¿éµÄÆðʼµØÖ·start£¬½áÊøµØÖ·end,½âÎöºóÄÚ´æ¿éÊý

+                                  ¾ÝµÄдÈëµØÖ·memorybase

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_get_available_region( UINT32 memAddBegin, UINT32 end, UINT32 map_base, UINT32 copy_base,UINT32 memorybase )

+{

+    UINT32 region_start = 0;

+    UINT32 region_end   = 0;

+    UINT32 region_cnt   = 0;

+    UINT32 *addr        = NULL;

+    

+    zOss_ASSERT( memAddBegin <= end );

+

+    region_cnt = *(UINT32 *)memorybase; /* ÒÑÓÐÄÚ´æ¿éÊýÄ¿ */

+    zOss_AssertExN( region_cnt < g_parsed_regions_max );

+    addr = (UINT32 *)memorybase + region_cnt * 4 + 1;   /* ¼ÆËãµØÖ·Æ«ÒÆ */

+    while ( zTos_MmuGetReadableRegion(memAddBegin, end, (cyg_uint32 *)&region_start, (cyg_uint32 *)&region_end) )

+    {

+        *addr++ = region_start;

+        *addr++ = region_end;

+        if(map_base != memAddBegin)

+        {

+           *addr++ = map_base  + region_start - memAddBegin;

+        }

+        else

+        {

+           *addr++ = map_base;

+        }

+        if(copy_base != 0)

+        {

+            *addr++ = copy_base + region_start - memAddBegin;

+        }

+        else

+        {

+            *addr++ = 0;

+        }

+        region_cnt ++;

+ 

+        memAddBegin = region_end + 1;

+        if (memAddBegin < region_end) break;

+    }

+    *(UINT32 *)memorybase = region_cnt;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_parse_region_info

+ * ¹¦ÄÜÃèÊö£º½âÎöÄÚ´æ¿éÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN): ĬÈÏÅäÖõØÖ·£¬½âÎöÍê³ÉµØÖ·

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_parse_region_info( UINT32 configured_region_base, UINT32 parsed_region_base )

+{   

+    UINT32 i = 0;

+    T_RamdumpRegionInfo *p_configured_info = NULL;

+    T_RamdumpRegionInfo *p_parsed_info     = NULL;

+

+    p_configured_info = (T_RamdumpRegionInfo *)configured_region_base;

+    p_parsed_info     = (T_RamdumpRegionInfo *)parsed_region_base;

+    

+    for ( ; i < p_configured_info->region_num; i++ )

+    {

+        ramdump_get_available_region( p_configured_info->regions[i].start_addr,

+                                      p_configured_info->regions[i].end_addr,

+                                      p_configured_info->regions[i].map_start_addr,

+                                      p_configured_info->regions[i].copy_start_addr,

+                                      (UINT32)p_parsed_info );

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_save_file_info

+ * ¹¦ÄÜÃèÊö£º½«ÎļþÐÅÏ¢±£´æÖÁ¸ß¶ÎÄÚ´æ

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_save_file_info( const CHAR *name, UINT32 base_addr, UINT32 size )

+{

+    T_RamdumpFile *pfileInfo = NULL;

+    

+    pfileInfo = g_ramdump_file_info->fileInfo + g_ramdump_file_info->fileNum;

+    strcpy( (char *)pfileInfo->fileName, name );

+    pfileInfo->baseAddr = base_addr;

+    pfileInfo->size     = size;

+    

+    g_ramdump_file_info->fileNum ++;

+    zOss_AssertExN( g_ramdump_file_info->fileNum <  g_ramdump_file_max); 

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_save_region_file_info

+ * ¹¦ÄÜÃèÊö£ºÕûÀíÄÚ´æ¿éµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_save_region_file_info( T_RamdumpRegionInfo *p_region_info, const CHAR *file_name )

+{

+    int     i           = 0;

+    CHAR    name[32]    = {0};

+    

+    for ( i=0; i<(int)p_region_info->region_num; i++ )

+    {

+        sprintf( name, "%s_%d", file_name, i );

+        ramdump_save_file_info(name, 

+                               p_region_info->regions[i].start_addr,

+                               (p_region_info->regions[i].end_addr - p_region_info->regions[i].start_addr) + 1 );

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_save_all_files_info

+ * ¹¦ÄÜÃèÊö£ºÕûÀíµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_save_all_files_info( VOID )

+{

+    ramdump_save_region_file_info( g_parsed_regions_info, RAM_ARM0_NAME );

+    ramdump_save_file_info( "arm0_targetstate.cmm", (UINT32)g_cmm_file_info->cmmFileBuffer, g_cmm_file_info->cmmFileSize);

+

+#ifdef _USE_ARM1_RAMDUMP

+    ramdump_save_region_file_info( (T_RamdumpRegionInfo *)HIGHMEM_ARM1_PARSED_REGION_BASE, RAM_ARM1_NAME );

+    ramdump_save_file_info( "arm1_targetstate.cmm", CMM_FILE_BUF_BASE(HIGHMEM_ARM1_CMM_INFO_BASE), CMM_FILE_BUF_SIZE(HIGHMEM_ARM1_CMM_INFO_BASE) );

+#endif

+}

+

+#ifdef _USE_ARM1_RAMDUMP

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_send_msg_to_arm1

+ * ¹¦ÄÜÃèÊö£º Arm0 ICP ÏûÏ¢ID·¢Ëͺ¯Êý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_send_msg_to_arm1( VOID )

+{

+    T_HalIcp_Msg icp_msg;

+    zOss_Memset(&icp_msg, 0, sizeof(icp_msg));

+    

+    icp_msg.SrcModId = ICP_ARM0_MODULE_ID_OS;

+    icp_msg.desModId = ICP_ARM1_MODULE_ID_OS;

+    icp_msg.IntInfo.high_word = ZPLAT_LTE_ICP_ARM02ARM1_RAMDUMP_CF;

+    zDrvIcp_SendMsg( (const T_HalIcp_Msg *)&icp_msg );

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_process_msg_from_arm1

+ * ¹¦ÄÜÃèÊö£º Arm0 ICPÏûÏ¢½ÓÊÜ´¦Àíº¯Êý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                             (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_process_msg_from_arm1( const T_HalIcp_Msg *pMsg )

+{

+    T_HalIcp_Dword state = { 0 };

+   

+    zDrvIcp_GetState( ICP_MSG_ACTOR_ARM, &state );

+    zDrvIcp_ClearState( ICP_MSG_ACTOR_ARM, state );

+

+    /* ʹµÃarm0²úÉúÒì³££¬ÒԱ㿪ʼramdump */

+    zOss_ASSERT( FALSE );

+}

+#endif

+

+/*****************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_main

+ * ¹¦ÄÜÃèÊö£º Ö´ÐÐramdump£¬ÓëPC²à¹¤¾ß½øÐн»»¥£¬´«µÝÐèÒª±£´æµÄÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+static VOID ramdump_main(VOID)

+{

+    /* ¸ù¾ÝMMU½âÎöÁбí¶ÔÄÚ´æ¶Î½øÐбȶԷÖÎö */

+    ramdump_parse_region_info( (UINT32)g_configured_regions_info, (UINT32)g_parsed_regions_info);

+    /* Éú³É»Ö¸´¼Ä´æÆ÷T32½Å±¾Îļþ */

+    ramdump_create_cmm_file();

+

+#ifdef _USE_ARM1_RAMDUMP

+#ifdef _USE_PSM

+    ARM0_WAIT_DDR1_READY;

+#endif   

+    ramdump_parse_region_info(HIGHMEM_ARM1_CONFIGURED_REGION_BASE, HIGHMEM_ARM1_PARSED_REGION_BASE);

+

+    ARM0_NOFITY_ARM1;

+    ARM0_WAIT_ARM1;

+#endif   

+

+    /* Ö´ÐÐramdumpÊý¾Ý´¦Àíº¯Êý */

+    ramdump_save_all_files_info();

+

+    /* ¼ì²âUSBÁ¬½Ó,×¼±¸´«ÊäÊý¾Ý */

+    ramdump_transfer_data();

+    return;

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zte_sys_err_hnd

+ * ¹¦ÄÜÃèÊö£º Ramdump´¦Àíº¯Êý

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º1¡¢Èç¹ûÊÇÖÂÃü´íÎó,´íÎó»áÅ×Ïò¸ü¸ßÒ»¼¶´¦Àí

+ *           2¡¢Èç¹ûexcepNum´óÓÚ1˵Ã÷ÔÚramdump¹ý³ÌÓÖ³öÏÖÁËÒì³£

+ **************************************************************************/

+int  zte_sys_err_hnd(int  user_called, int  ecode, int extra)

+{

+    static UINT32   excepNum        = 0;

+    UINT32          excepResetFlag  = 0;

+    ZOSS_INTR       old_intr;

+    /* ËøÖÐ¶Ï */

+    ZOSS_SAVE_IRQ(old_intr);

+    excepNum++;

+    if (excepNum > 1)   /* Ö»±£´æµÚÒ»´Î³ö´íÏÖ³¡ */

+    {

+        for ( ; ; ) ;

+    }

+

+    excepResetFlag = zOss_GetExceptResetFlag();

+    if ( excepResetFlag != EXCEPT_RESET_ENABLE)

+    {

+        /* ±£´æ¼Ä´æÆ÷ÐÅÏ¢ */

+        zOss_RamdumpSaveRegisters();

+        /* Ö´ÐÐramdumpÒì³£´¦Àíº¯Êý */

+        ramdump_main();

+        for ( ; ; ) ;

+    }

+    else

+    {

+        zDrv_Soft_Reset(RESET_TO_EXCEPTRESET);   /* Òì³£ÖØÆô */

+    }

+    return 0;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpConfigureMem

+ * ¹¦ÄÜÃèÊö£º ±£´æÄÚ´æ¶ÎÊý¾ÝÅäÖÃÐÅÏ¢

+ * ²ÎÊý˵Ã÷£º (IN):

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpConfigureMem( UINT32 base, UINT32 size ,UINT32 map_base ,UINT32 copy_base )

+{

+    if (size == 0)

+        return;

+    if ((size - 1) > (0xFFFFFFFF - base))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "Hello,ÄÚ´æ¶ÎµØÖ·ÅäÖôíÎó,Çë²éѯºóÔÙʹÓÃ!");

+        return;

+    }

+    zOss_AssertExN( g_configured_regions_info->region_num < g_configured_regions_max);

+    g_configured_regions_info->regions[g_configured_regions_info->region_num].start_addr        = base;

+    g_configured_regions_info->regions[g_configured_regions_info->region_num].end_addr          = base + size - 1;

+    g_configured_regions_info->regions[g_configured_regions_info->region_num].map_start_addr    = map_base;

+    g_configured_regions_info->regions[g_configured_regions_info->region_num].copy_start_addr   = copy_base;

+    (g_configured_regions_info->region_num)++;

+}

+ 

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º  Osa_SysErrHndInit

+ * ¹¦ÄÜÃèÊö£º µØÖ·È«¾Ö±äÁ¿³õʼ»¯,»ñÈ¡ramdumpÄÚ´æ¿éĬÈÏÅäÖÃ

+                                  arm0ºÍarm1ͬ²½»úÖÆ

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ***************************************************************************/

+VOID Osa_SysErrHndInit(VOID)

+{

+    UINT32 base   = 0;

+    UINT32 size   = 0;

+    UINT32 map_base     = 0;

+    UINT32 copy_base    = 0;

+    /* µØÖ·È«¾Ö±äÁ¿³õʼ»¯ */

+    zOss_Memset((char *)tos_ramdump_vma_start(), 0, tos_ramdump_vma_end() - tos_ramdump_vma_start());

+    gOsa_Ramdump.cmmBuffer                = (CHAR *)tos_ramdump_vma_start();

+    gOsa_Ramdump.configured_regions_info  = gOsa_Ramdump.cmmBuffer               + CMM_BUFFER_SIZE;

+    gOsa_Ramdump.parsed_regions_info      = gOsa_Ramdump.configured_regions_info + CONFIGURED_REGIONS_SIZE;

+    gOsa_Ramdump.ramdump_file_info        = gOsa_Ramdump.parsed_regions_info     + PARSED_REGIONS_SIZE + ERROR_CODE_SIZE;

+    gOsa_Ramdump.ioReadBuffer             = gOsa_Ramdump.ramdump_file_info       + RAMDUMP_FILE_SIZE;

+    gOsa_Ramdump.ioWriteBuffer            = gOsa_Ramdump.ioReadBuffer            + IO_READ_BUFFER;

+    

+    g_cmm_file_info = (T_RamdumpCmmFileInfo * )gOsa_Ramdump.cmmBuffer;

+    g_cmm_file_info->cmmFileSize = 0;

+    g_cmm_file_max  = (CMM_BUFFER_SIZE - 4);    /* 4±íʾ½á¹¹µÚÒ»¸ö³ÉÔ±µÄ´óС£¬ÏÂͬ */ 

+    

+    g_configured_regions_info= (T_RamdumpRegionInfo *)gOsa_Ramdump.configured_regions_info;

+    g_configured_regions_info->region_num = 0;

+    g_configured_regions_max = (CONFIGURED_REGIONS_SIZE - 4) / sizeof(T_RamdumpRegion);

+    

+    g_parsed_regions_info = (T_RamdumpRegionInfo *)gOsa_Ramdump.parsed_regions_info;

+    g_parsed_regions_info->region_num = 0;

+    g_parsed_regions_max = (PARSED_REGIONS_SIZE - 4) / sizeof(T_RamdumpRegion);

+    

+    g_ramdump_file_info  = (T_RamdumpFileInfo*)gOsa_Ramdump.ramdump_file_info;

+    g_ramdump_file_info->fileNum = 0;

+    g_ramdump_file_max = (RAMDUMP_FILE_SIZE - 4) / sizeof(T_RamdumpFile);

+    

+    /* ramdumpÄÚ´æ¿éĬÈÏÅäÖÃ,ĬÈÏÅäÖÃ˳Ðò²»Òª¸Ä¶¯ */

+    base        = tos_ram_vma_start();

+    size        = tos_ram_vma_end() - tos_ram_vma_start();

+    map_base    = base;

+    copy_base   = 0;

+    zOss_RamdumpConfigureMem(base, size, map_base, copy_base);

+    

+    base        = tos_itcm_vma_start();

+    size        = ITCM_SIZE;

+    map_base    = base;

+    copy_base   = 0;

+    zOss_RamdumpConfigureMem(base, size, map_base, copy_base);

+    

+    base        = tos_dtcm_vma_start();

+    size        = DTCM_SIZE;

+    map_base    = base;

+    copy_base   = 0;

+    zOss_RamdumpConfigureMem(base, size, map_base, copy_base);

+    

+#ifdef _USE_ARM1_RAMDUMP

+    /* arm0ºÍarm1ͬ²½»úÖÆ */

+    *(volatile UINT32 *)HIGHMEM_ARM1_FLAG_ARM12ARM0_BASE = RAMDUMP_FLAG ;

+    *(volatile UINT32 *)HIGHMEM_ARM1_FLAG_ARM02ARM1_BASE = 0;

+    HAL_CLEAN_FLASH_CACHE();

+    zDrvIcp_RegCallback( ICP_ARM0_MODULE_ID_OS, ICP_ARM1_MODULE_ID_OS, ramdump_process_msg_from_arm1, ICP_ISR_CALLBACK ); 

+#endif

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpInit

+ * ¹¦ÄÜÃèÊö£º ICP»Øµ÷³õʼ»¯

+ * ²ÎÊý˵Ã÷£º (IN): 

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpInit( VOID )

+{

+#ifdef _USE_ARM1_RAMDUMP

+    zDrvIcp_RegCallback( ICP_ARM0_MODULE_ID_OS, ICP_ARM1_MODULE_ID_OS, ramdump_process_msg_from_arm1, ICP_ISR_CALLBACK );

+#endif

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpForceException

+ * ¹¦ÄÜÃèÊö£º Ç¿ÖÆ²úÉúÒì³£,ÒÔ±ãramdump

+ * ²ÎÊý˵Ã÷£º (IN): 0:ARMÒì³£ 1: ¶ÏÑÔÒì³£ 2: ²Ù×÷ϵͳ¶ÏÑÔÒì³£

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpForceException( UINT32 type )

+{

+    if ( 0 == type )

+    {

+        *(int *)0x05 = 0x00;

+    }

+    else

+    {

+        zOss_AssertExN( FALSE );

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpSetIoOpt

+ * ¹¦ÄÜÃèÊö£º ÉèÖÃramdump Io ͨµÀ£»

+ * ²ÎÊý˵Ã÷£º (IN): 

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpSetIoOpt(T_zOss_RamdumpIoOpt hook)

+{

+    g_zRamdumpIoOpt.init    = hook.init;

+    g_zRamdumpIoOpt.read    = hook.read;

+    g_zRamdumpIoOpt.write   = hook.write;

+    g_zRamdumpIoOpt.finish  = hook.finish;    

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_ramdump_csky.c b/cp/ps/plat/src/oss/osa/tos/src/tos_ramdump_csky.c
new file mode 100644
index 0000000..b207afa
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_ramdump_csky.c
@@ -0,0 +1,534 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_ramdump_csky.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : 

+* °æ    ±¾ : 

+* Íê³ÉÈÕÆÚ : 

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "tos_ramdump.h"

+#include "comm_api.h"

+#include "hal_comm.h"

+#include "kpd_api.h"

+#include "sys_func_atcfg.h"

+

+#include "tos_except_csky.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+#include "drvs_usbpoll.h"

+//#include "drvs_kpd.h"

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+extern VOID zOss_SaveRegisters(VOID);

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* ¹æ»®·ÖÅäµÄ¶Ñ¿Õ¼äËÄ×Ö½Ú¶ÔÆë */

+#define CMM_BUFFER_SIZE                 5120    /* 5k */

+#define IO_FILE_INFO                    1024    /* 1K */

+#define IO_READ_BUFFER                  1024    /* 1K */

+#define IO_WRITE_BUFFER                 1024    /* 1k */

+#define RAM_DUMPBUFER_SIZE              (CMM_BUFFER_SIZE+IO_FILE_INFO\

+	                                    +IO_READ_BUFFER+IO_WRITE_BUFFER)

+#define GET_TRANSFER_DATA_AREA(buffer)  ((char *)buffer + 4)

+

+/* RamdumpÎļþµÄÃû×Ö */

+#define RAM_NAME        "ram.bin"           /* ±£´æramÎļþÃû     */

+#define CDS_SCRIPT_NAME "targetstate.scr"   /* TOS½Å±¾ÎļþÃû    */

+#define REG_TOTAL_NUM   80

+#define NORMAL_REG_NUM  16

+#define CTRL_REG_NUM    22

+extern unsigned char _ram_start[], _ram_end[];

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/* ±£´æsas ram¿É·ÃÎʵÄÒ»¶ÎÄÚ´æµÄÆðʼµØÖ· */

+typedef struct

+{

+    UINT32 accessStart;

+    UINT32 accessEnd;

+    UINT32 accessLength;

+}T_RamSection;

+

+/* cmmÎļþ»º³å */

+typedef struct

+{

+    UINT32 cmmFileSize;

+    CHAR  cmmFileBuffer[1]; /* ºóÃæ»¹Óпռä */

+}T_CmmFile;

+

+/* »ñÈ¡TOS ÅäÖÃÐÅÏ¢,ÓÃÓÚramdump */

+typedef struct

+{

+    CHAR *cmmBuffer;        /* ´æ·ÅÉú³ÉµÄ»Ö¸´ÏÖ³¡½Å±¾µÄ»ùÖ· */

+    CHAR *ioFileInfo;       /* ´æ·Å´«ÊäÊý¾ÝµÄÎļþÐÅÏ¢       */

+    CHAR *ioReadBuffer;     /* ´«ÊäÊý¾ÝµÄ¶Á»º³å»ùÖ·         */

+    CHAR *ioWriteBuffer;    /* ´«ÊäÊý¾ÝµÄд»º³å»ùÖ·         */

+}T_OsaRamDumpCfg;

+

+typedef struct

+{

+    CHAR    fileName[DUMPFILENMAE_LEN]; /* ÎļþÃû       */

+    UINT32  baseAddr;                   /* ÄÚ´æ»ùµØÖ·   */

+    UINT32  size;                       /* ´óС         */

+} T_RamdumpFile;

+

+typedef struct

+{

+    UINT32          fileNum;        /* Îļþ¸öÊý         */

+    T_RamdumpFile   fileInfo[1];    /* ºóÐø¿ÉÄÜ»¹ÓÐÊý¾Ý */

+} T_RamdumpFileInfo;

+

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+VOID Osa_RamdumpMain(VOID);

+static VOID IO_ReadData(UINT8 *buffer, UINT32 size);

+static VOID IO_WriteData(UINT8 *buffer, UINT32 size);

+VOID zOss_TransferRamdumpData(T_RamdumpFileInfo *pioFileInfo);

+VOID Osa_CreateCdsBatch(VOID);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+T_OsaRamDumpCfg         gOsa_Ramdump                    = {0};  /* ±£´æTOSµÄÅäÖÃÐÅÏ¢   */

+volatile UINT32         gRamdumpAdrress[REG_TOTAL_NUM]  = {0};  /* ±£´æ¼Ä´æÆ÷ÐÅÏ¢       */

+tos_except_register_t  *gEceptRegister                  = NULL;

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖÇø

+**************************************************************************/

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºOsa_SysErrHndInit

+ * ¹¦ÄÜÃèÊö£ºÒì³£´¦Àí³õʼ»¯º¯Êý

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID Osa_SysErrHndInit(VOID)

+{

+    gOsa_Ramdump.cmmBuffer      = (CHAR *)zOss_Malloc(RAM_DUMPBUFER_SIZE);

+    zOss_Memset(gOsa_Ramdump.cmmBuffer , 0, RAM_DUMPBUFER_SIZE);

+    gOsa_Ramdump.ioFileInfo     =  gOsa_Ramdump.cmmBuffer + CMM_BUFFER_SIZE;

+    gOsa_Ramdump.ioReadBuffer   =  gOsa_Ramdump.ioFileInfo + IO_FILE_INFO;

+    gOsa_Ramdump.ioWriteBuffer  = gOsa_Ramdump.ioReadBuffer +IO_READ_BUFFER;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zte_sys_err_hnd

+ * ¹¦ÄÜÃèÊö£º Ramdump´¦Àíº¯Êý

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º1¡¢Èç¹ûÊÇÖÂÃü´íÎó,´íÎó»áÅ×Ïò¸ü¸ßÒ»¼¶´¦Àí

+ *           2¡¢Èç¹ûexcepNum´óÓÚ1˵Ã÷ÔÚramdump¹ý³ÌÓÖ³öÏÖÁËÒì³£

+**************************************************************************/

+int  zte_sys_err_hnd(int  user_called, int  ecode, int extra)

+{

+    static UINT32   excepNum        = 0;

+    UINT32          excepResetFlag  = 0;

+    ZOSS_INTR       old_intr;

+

+    /* ËøÖÐ¶Ï */

+    ZOSS_SAVE_IRQ(old_intr);

+

+    excepNum++;

+    if (excepNum > 1)   /* Ö»±£´æµÚÒ»´Î³ö´íÏÖ³¡ */

+    {

+        for ( ; ; ) ;

+    }

+

+    excepResetFlag = zOss_GetExceptResetFlag();

+    if (excepResetFlag != EXCEPT_RESET_ENABLE)

+    {

+        gEceptRegister = tos_dump_except_register();

+        if (gEceptRegister)

+        {

+            zOss_Memcpy((VOID *)gRamdumpAdrress,gEceptRegister,sizeof(tos_except_register_t));

+        }

+        else

+        {

+            zOss_SaveRegisters();

+        }

+        /* Éú³É»Ö¸´¼Ä´æÆ÷tos½Å±¾Îļþ */

+        Osa_CreateCdsBatch();

+        /* Ö´ÐÐramdumpÒì³£´¦Àíº¯Êý */

+        Osa_RamdumpMain();

+        for ( ; ; ) ;

+    }

+    else

+    {

+        zDrv_Soft_Reset(RESET_TO_EXCEPTRESET);   /* Òì³£ÖØÆô */

+    }

+    return 0;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º  zOss_TransferRamdumpData

+ * ¹¦ÄÜÃèÊö£º  ÓëPC²à¹¤¾ß½øÐн»»¥£¬´«µÝÐèÒª±£´æµÄÊý¾Ý

+ * ²ÎÊý˵Ã÷£º  (IN):pRamdkumpInfo:ÎļþÐÅÏ¢

+ *             (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_TransferRamdumpData(T_RamdumpFileInfo *pioFileInfo)

+{

+    CHAR            *reqBuffer  = gOsa_Ramdump.ioReadBuffer;    /* ÇëÇóÏûÏ¢»º³åÇø   */

+    CHAR            *rspBuffer  = gOsa_Ramdump.ioWriteBuffer;   /* »ØÓ¦ÏûÏ¢»º³åÇø   */

+    UINT32          rspDataLen  = 0;                            /* »ØÓ¦ÏûÏ¢³¤¶È     */

+    UINT32          *reqCmd     = NULL;

+    UINT32          *rspCmd     = NULL;

+    T_RamdumpFile   *fileInfo   = NULL;

+    BOOL            result      = FALSE;

+

+    zOss_AssertExN(pioFileInfo != NULL);

+    

+    rspCmd      = (UINT32 *)rspBuffer;

+    reqCmd      = (UINT32 *)reqBuffer;

+    fileInfo    = pioFileInfo->fileInfo;

+    

+    /* ³õʼ»¯USB */

+    zDrvUsbPoll_Init();

+    

+    /* ²éѯUSBÊÇ·ñÁ¬½Ó */

+    while (!result)

+    {

+        result = zDrvUsbPoll_isConnect();

+    }

+    

+    for(;;)

+    {

+        /* ´ÓͨѶ¿Ú¶ÁÊý¾Ý */

+        IO_ReadData((UINT8 *)reqBuffer, CMD_BUFFER_LEN);

+        

+        switch (*reqCmd)

+        {

+        case DUMPFILE_LINK_REQ: /* ͬ²½ÇëÇó */

+            {

+                T_DUMPFILE_LINK_RSP *rspMsg;

+                *rspCmd = DUMPFILE_LINK_RSP;

+                rspMsg = (T_DUMPFILE_LINK_RSP *)GET_TRANSFER_DATA_AREA(rspBuffer);

+                rspMsg->fileNum = pioFileInfo->fileNum;

+                rspDataLen = sizeof(*rspCmd) + sizeof(T_DUMPFILE_LINK_RSP);

+                break;

+            }

+        case DUMPFILE_FILE_REQ: /* ¶ÁÈ¡ÎļþÐÅÏ¢£¬¿ªÊ¼´«ÊäÎļþÇëÇó */

+            {

+                T_DUMPFILE_FILE_REQ *reqMsg;

+                T_DUMPFILE_FILE_RSP *rspMsg;

+                *rspCmd = DUMPFILE_FILE_RSP;

+                reqMsg = (T_DUMPFILE_FILE_REQ *)GET_TRANSFER_DATA_AREA(reqBuffer);

+                rspMsg = (T_DUMPFILE_FILE_RSP *)GET_TRANSFER_DATA_AREA(rspBuffer);

+                

+                /* ÅжÏÎļþ±àºÅÊÇ·ñÕýÈ· */

+                if (reqMsg->fileNo < pioFileInfo->fileNum)

+                {

+                    strcpy((char *)rspMsg->fileName, (char *)fileInfo[reqMsg->fileNo].fileName);

+                    rspMsg->size = fileInfo[reqMsg->fileNo].size;

+                    rspDataLen = sizeof(*rspCmd) + sizeof(T_DUMPFILE_FILE_RSP);

+                }

+                else

+                {

+                    *rspCmd = DUMPFILE_NO_FAIL;

+                    rspDataLen = sizeof(*rspCmd);

+                }

+                

+                break;

+            }

+        case DUMPFILE_READ_REQ: /*¶ÁÈ¡ÎļþÄÚÈÝ*/

+            {

+                T_DUMPFILE_READ_REQ *reqMsg;

+                *rspCmd = DUMPFILE_READ_RSP;

+                rspDataLen = sizeof(*rspCmd);

+                reqMsg = (T_DUMPFILE_READ_REQ *)GET_TRANSFER_DATA_AREA(reqBuffer);

+                

+                if (reqMsg->fileNo >= pioFileInfo->fileNum)

+                {

+                    *rspCmd = DUMPFILE_LENGTH_FAIL;

+                    break;

+                }

+                

+                if (reqMsg->offset + reqMsg->length > fileInfo[reqMsg->fileNo].size)

+                {

+                    *rspCmd = DUMPFILE_NO_FAIL;

+                    break;

+                }

+                

+                IO_WriteData((UINT8 *)rspBuffer, rspDataLen);

+                IO_WriteData((UINT8 *)(fileInfo[reqMsg->fileNo].baseAddr + reqMsg->offset), reqMsg->length);

+                continue;   /* ¼ÌÐøÖ´ÐÐÏÂÒ»´Î¶Á */

+            }

+        case DUMPFILE_END_REQ:  /* ´«Êä½áÊø */

+            {

+                *rspCmd = DUMPFILE_END_RSP;

+                rspDataLen = sizeof(*rspCmd);

+                IO_WriteData((UINT8 *)rspBuffer, rspDataLen);

+                {

+                    int i ;

+                    for (i= 0; i< 100;i++)  /* µÈ´ýÊý¾Ý·¢ËÍÍêºó£¬ÔÙÖØÆô */

+                    {

+                        zDrvUsbPoll_Isr();

+                    }

+                }

+                return;

+            }

+        default:    /* ´íÎóÖ¸Áî */

+            {

+                *rspCmd = DUMPFILE_CMD_FAIL;

+                rspDataLen = sizeof(*rspCmd);

+                break;

+            }

+        }

+        

+        /* ÏòͨѶ¿ÚдÊý¾Ý */

+        IO_WriteData((UINT8 *)rspBuffer, rspDataLen);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º Osa_RamdumpMain

+ * ¹¦ÄÜÃèÊö£º Ö´ÐÐramdump£¬ÓëPC²à¹¤¾ß½øÐн»»¥£¬´«µÝÐèÒª±£´æµÄÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID Osa_RamdumpMain(VOID)

+{

+    T_RamdumpFileInfo   *pioFileInfo    = NULL;

+    T_RamdumpFile       *pfileInfo      = NULL;

+

+    pioFileInfo = (T_RamdumpFileInfo *)gOsa_Ramdump.ioFileInfo;

+    zOss_AssertExN(pioFileInfo != NULL);

+    

+    pfileInfo   = pioFileInfo->fileInfo;

+    zOss_AssertExN(pfileInfo != NULL);

+    

+    /* TOS  batch head */

+    strcpy((char *)pfileInfo->fileName,CDS_SCRIPT_NAME);

+    pfileInfo->baseAddr = (UINT32)((T_CmmFile *)gOsa_Ramdump.cmmBuffer)->cmmFileBuffer;

+    pfileInfo->size = ((T_CmmFile *)gOsa_Ramdump.cmmBuffer)->cmmFileSize;

+    pfileInfo++;

+    pioFileInfo->fileNum++;

+    /* ram head */

+    strcpy((char *)pfileInfo->fileName,RAM_NAME);

+    pfileInfo->baseAddr = (UINT32)_ram_start;

+    pfileInfo->size = (UINT32)(_ram_end - _ram_start);

+    pfileInfo++;

+    pioFileInfo->fileNum++;

+    /* ¼ì²âUSBÁ¬½Ó,×¼±¸´«ÊäÊý¾Ý */

+    zOss_TransferRamdumpData(pioFileInfo);

+    return;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º Osa_CreateCdsBatch

+ * ¹¦ÄÜÃèÊö£º Éú³É»Ö¸´¶ÑÕ»µÄCDS½Å±¾

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID Osa_CreateCdsBatch(VOID )

+{

+    char    *cmmAddress = NULL;

+    char    *cmmBase    = NULL;

+    SINT32  length      = 0;

+    SINT32  regIndex    = 0;

+    int     i           = 0 ;

+    

+    T_CmmFile *cmmFile = (T_CmmFile *)gOsa_Ramdump.cmmBuffer;

+    zOss_AssertExN(cmmFile != NULL );

+    cmmBase     = (char *)cmmFile->cmmFileBuffer;

+    cmmAddress = cmmBase;

+    /* Êä³ö¼ÓÔØRAM */

+    length = sprintf(cmmAddress, "restore  %s binary %#lx\r\n",RAM_NAME, (UINT32)_ram_start);

+    cmmAddress += length;

+    /* Êä³ö¿ØÖƼĴæÆ÷, gRamdumpAdrress µØÖ·Ç°Ãæ±£´æµÄÊÇr0-r15,ËùÒÔregIndexÊÇ´Ó16¿ªÊ¼µÄ */

+    regIndex = 16;

+    if(gEceptRegister)

+    {

+        length  = sprintf(cmmAddress,"set $cr0 = %#lx\r\n",(int)gEceptRegister->epsr);

+        regIndex++;

+    }

+    else

+    {

+        length = sprintf(cmmAddress, "set $cr0 = %#lx\r\n",  gRamdumpAdrress[regIndex++]);

+    }

+    cmmAddress += length;

+    for (i = 1; i <CTRL_REG_NUM; i++)

+    {

+        if (i == 16)

+        {

+            continue;

+        }

+        length = sprintf(cmmAddress,"set $cr%d =  %#lx\r\n",i,gRamdumpAdrress[regIndex++]);

+        cmmAddress += length;

+    }

+    /* Êä³ör0-r15 */

+    regIndex = 0;

+    for (i = 0; i < NORMAL_REG_NUM; i++)

+    {

+        length = sprintf(cmmAddress, "set  $r%d =  %#lx\r\n", i, gRamdumpAdrress[regIndex++]);

+        cmmAddress += length;

+    }

+    if(gEceptRegister)

+    {

+        length = sprintf(cmmAddress, "set  $pc =  %#lx\r\n",(unsigned int) gEceptRegister->epc );

+    }

+    else

+    {

+        length = sprintf(cmmAddress, "set  $pc =  %#lx\r\n",  gRamdumpAdrress[--regIndex]);

+    }

+    

+    cmmAddress += length;

+    cmmFile->cmmFileSize = (UINT32)(cmmAddress - cmmBase);

+    return;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpConfigureMem

+ * ¹¦ÄÜÃèÊö£º ±£´æÄÚ´æ¶ÎÊý¾ÝÅäÖÃÐÅÏ¢

+ * ²ÎÊý˵Ã÷£º 

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpConfigureMem( UINT32 base, UINT32 size ,UINT32 map_base ,UINT32 copy_base )

+{

+    return ;    

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpInit

+ * ¹¦ÄÜÃèÊö£º ICP»Øµ÷³õʼ»¯

+ * ²ÎÊý˵Ã÷£º 

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpInit( VOID)

+{

+    return ;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpForceException

+ * ¹¦ÄÜÃèÊö£º Ç¿ÖÆ²úÉúÒì³£,ÒÔ±ãramdump

+ * ²ÎÊý˵Ã÷£º (IN): 0:ARMÒì³£ 1: ¶ÏÑÔÒì³£ 2: ²Ù×÷ϵͳ¶ÏÑÔÒì³£

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpForceException( UINT32 type )

+{   

+   

+    if ( 0 == type )

+    {   

+        UINT32 *temp = (UINT32 *)0xFFFFFFFF;

+        *temp = 5;

+    }

+    else if ( 2 == type )

+    {   

+        assert( FALSE );

+    }

+    else

+    {   

+        zOss_AssertExN( FALSE );

+    }

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖÇø

+**************************************************************************/

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º IO_ReadData

+ * ¹¦ÄÜÃèÊö£º¶ÁUSBÊý¾Ý

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID IO_ReadData(UINT8 *buffer, UINT32 size)

+{

+    UINT32 count = 0;

+

+    do

+    {

+        zDrvUsbPoll_Isr();

+        count = (UINT32)zDrvUsbPoll_Read(buffer, size);

+        if( size <= count)

+        {

+            break;

+        }

+

+        buffer += count;

+        size -=count;

+    }while (size > 0);

+    

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º IO_WriteData

+ * ¹¦ÄÜÃèÊö£º дUSBÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):pRamdkumpInfo:ÎļþÐÅÏ¢

+ *            (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+static VOID IO_WriteData(UINT8 *buffer, UINT32 size)

+{

+    UINT32 count = 0;

+

+    while (size > 0)

+    {

+        zDrvUsbPoll_Isr();

+        count = (UINT32)zDrvUsbPoll_Write(buffer, size);

+        if( size <= count)

+        {

+            break;

+        }

+

+        buffer += count;

+        size -=count;

+    }

+

+}

+

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/tos/src/tos_ramlog.c b/cp/ps/plat/src/oss/osa/tos/src/tos_ramlog.c
new file mode 100644
index 0000000..d9e68f9
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/src/tos_ramlog.c
@@ -0,0 +1,200 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_ramlog.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : TOS 3.0²Ù×÷ϵͳ֧³Å²ãµÄramlogÄ£¿é

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/04/10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+#include <stdarg.h>

+#include "oss_api.h"

+#include "tos_ramlog.h"

+

+#ifdef __cplusplus

+extern "C" 

+{

+#endif

+

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+#ifdef __GNUC__

+

+extern char _ramlog_start[];

+extern char _ramlog_end[];

+

+#elif defined (__ARMCC_VERSION)

+

+extern char Image$$RAMLOG$$ZI$$Base[];

+extern char Image$$RAMLOG$$ZI$$Limit[];

+

+# define _ramlog_start  Image$$RAMLOG$$ZI$$Base

+# define _ramlog_end    Image$$RAMLOG$$ZI$$Limit

+

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef TOS_RAMLOG

+# define RAMLOG_LOCK()      //ZOSS_SAVE_IRQ(old_intr)

+# define RAMLOG_UNLOCK()    //ZOSS_RESTORE_IRQ(old_intr)

+#endif

+

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+#ifdef TOS_RAMLOG

+typedef struct {

+    char * const start;

+    char * const end;

+    char *ptr;

+    int full;

+} tos_ramlog_t;

+#endif

+

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+#ifdef TOS_RAMLOG

+static tos_ramlog_t tos_ramlog = {

+    _ramlog_start,

+    _ramlog_end,

+    _ramlog_start,

+    0x00,

+};

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ramlog´òÓ¡º¯Êý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  fmt:    ¸ñʽ»¯²ÎÊý

+                ...:    ¿É±ä²ÎÊýÁбí

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÒÑ´òÓ¡µÄ×Ö·ûÊý

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+int tos_ramlog_printf(const char *fmt, ...)

+{

+#ifdef TOS_RAMLOG

+    int size = 0;

+    va_list ap;

+    

+    RAMLOG_LOCK();

+    va_start(ap, fmt);

+    size = vsnprintf(tos_ramlog.ptr, (size_t)(_ramlog_end - tos_ramlog.ptr), fmt, ap);

+    va_end(ap);

+    tos_ramlog.ptr += size;

+    if (tos_ramlog.ptr >= _ramlog_end)

+    {

+        tos_ramlog.ptr = _ramlog_start;

+        tos_ramlog.full = 0x01;

+    }

+    RAMLOG_UNLOCK();

+    

+    return size;

+#else

+    return 0x00;

+#endif

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     »ñÈ¡ramlogʹÓÃÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  start:  ramlogÆðʼµØÖ·

+                end:    ramlog½áÊøµØÖ·

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     Èç¹ûfull±ê־λÖÃ룬±íʾramlog»º³åÇøÒÑÂú

+**************************************************************************/

+void tos_ramlog_info(char **start, char **end)

+{

+    if (start == NULL || end == NULL)

+    {

+        return;

+    }

+     

+    RAMLOG_LOCK();

+    *start = tos_ramlog.start;

+    if (tos_ramlog.full)

+    {

+        *end = tos_ramlog.end;

+    }      

+    else

+    {

+        *end = tos_ramlog.ptr;

+    }        

+    RAMLOG_UNLOCK();

+}

+

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÌṩramlogʹÓõĻù±¾ÐÅÏ¢ÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  pMonRamlogInfo: ramlogÐÅÏ¢´æ·ÅµØÖ·             

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID z0ss_GetRamlogInfo(T_ZOss_Mon_Ramlog *pMonRamlogInfo)

+{

+#ifdef _USE_MONITOR

+    char *ramlogStart = NULL;

+    char *ramlogEnd   = NULL;

+

+    if (pMonRamlogInfo)

+    {

+        tos_ramlog_info(&ramlogStart, &ramlogEnd);

+        pMonRamlogInfo->ramlog   = ramlogStart;

+        pMonRamlogInfo->size     = (UINT32)(ramlogEnd - ramlogStart);

+    }

+#endif    

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/tos/ws/makefile b/cp/ps/plat/src/oss/osa/tos/ws/makefile
new file mode 100644
index 0000000..4081e0a
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/ws/makefile
@@ -0,0 +1,62 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: Makefile

+#* ÄÚÈÝÕªÒª: TOSÊÊÅä²ã±àÒë

+#* ʹÓ÷½·¨:     

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2013/01/01      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+#===============================================================================

+#¹«¹²Í·Îļþ

+#===============================================================================

+include $(PRJ_PATH)/config/project.mk

+

+#===============================================================================

+#×ÓϵͳÃû³Æ

+#===============================================================================

+_SUBSYS_NAME = plat_osa_tos

+

+#===============================================================================

+#×ÓϵͳÉú³ÉµÄ¿âÎļþ·¾¶

+#===============================================================================

+_SUBSYS_LIB_PATH = $(PLAT_LIB_INTERNAL_PATH)

+

+#===============================================================================

+#Ä£¿éÎļþÅäÖÃ

+#===============================================================================

+ifeq ($(USE_OSS_MIN), yes)

+_ALL_MDLS     = osa_tos

+_ALL_OBJECTS  = $(wildcard $(OBJ_PATH)/plat/oss/osa/osa_tos/*.o)

+else

+_ALL_MDLS     = osa_tos com

+_ALL_OBJECTS  = $(wildcard $(OBJ_PATH)/plat/oss/osa/com/*.o)      \

+                $(wildcard $(OBJ_PATH)/plat/oss/osa/osa_tos/*.o)

+endif

+

+#===============================================================================

+#commonÄ¿±êµÄmake¹æÔò

+#===============================================================================

+com:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(PLAT_PATH)/src/oss/osa/com

+comclean:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(PLAT_PATH)/src/oss/osa/com clean

+

+#===============================================================================

+#osa_tosÄ¿±êµÄmake¹æÔò

+#===============================================================================

+osa_tos:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(PLAT_PATH)/src/oss/osa/tos/ws -f osa_tos.mk

+osa_tosclean:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(PLAT_PATH)/src/oss/osa/tos/ws -f osa_tos.mk clean

+

+#===============================================================================

+#±àÒë¹æÔò

+#===============================================================================

+include $(FRAME_PATH)/rules/lib_rules.mk

+

diff --git a/cp/ps/plat/src/oss/osa/tos/ws/osa_tos.mk b/cp/ps/plat/src/oss/osa/tos/ws/osa_tos.mk
new file mode 100644
index 0000000..f7c21a8
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/tos/ws/osa_tos.mk
@@ -0,0 +1,146 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: Makefile

+#* ÄÚÈÝÕªÒª: TOSÊÊÅä²ã±àÒëÅäÖÃÎļþ

+#* ʹÓ÷½·¨: include osa_tos.mk

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2013/01/01      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+#===============================================================================

+#¹«¹²Í·Îļþ

+#===============================================================================

+include $(PRJ_PATH)/config/project.mk

+

+#===============================================================================

+#Ä£¿éÃû³Æ

+#===============================================================================

+_MDL_NAME = osa_tos

+

+#===============================================================================

+#Ä£¿é·¾¶

+#===============================================================================

+_MDL_SRC_PATH = $(PLAT_PATH)/src/oss/osa/tos/src

+_MDL_INC_PATH = $(PLAT_PATH)/src/oss/osa/tos/inc

+_MDL_OBJ_PATH = $(OBJ_PATH)/plat/oss/osa/$(_MDL_NAME)

+

+#===============================================================================

+#Í·Îļþ²éÕÒ·¾¶

+#===============================================================================

+INCLUDE += -I$(PLAT_PATH)/inc                                               \

+           -I$(PLAT_PATH)/inc/oss                                           \

+           -I$(PLAT_PATH)/inc/Drv                                           \

+           -I$(PLAT_PATH)/src/oss/osa/inc                                   \

+           -I$(PLAT_PATH)/src/oss/sup/inc                                   \

+           -I$(PLAT_PATH)/inc/oss/tp                                        \

+           -I$(PLAT_PATH)/inc/drv/hal                                       \

+           -I$(COMMOM_PATH)/src/appstart/inc                                \

+           -I$(COMMOM_PATH)/inc/config                                      \

+           -I$(DRV_PATH)/inc                                                \

+           -I$(PRJ_PATH)/ws/dosmake/makefw/os/tos                           \

+           -I$(_MDL_INC_PATH)

+

+#===============================================================================

+#×ÓϵͳÀ©Õ¹¶¨Òå

+#===============================================================================

+DEFINE  +=

+

+#===============================================================================

+#Ä£¿éÎļþÐÅÏ¢

+#===============================================================================

+ifeq ($(USE_OSS_MIN), yes)

+_C_SOURCE  = $(wildcard $(_MDL_SRC_PATH)/tos_irq.c)

+else

+_C_SOURCE  = $(wildcard $(_MDL_SRC_PATH)/tos_kernel.c)                      \

+             $(wildcard $(_MDL_SRC_PATH)/tos_irq.c)                         \

+             $(wildcard $(_MDL_SRC_PATH)/tos_ramlog.c)

+endif

+

+ifeq ($(CPU_ARCH), armv5)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_arm.c)                  

+ifeq ($(USE_MULTI_CORE_RAMDUMP), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_ramdump.c)

+else

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_ramdump_arm.c)

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_arm_asm_rvct.S)

+endif

+ifeq ($(CMPL_TYPE), gcc_arm)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_arm_asm.S)

+endif

+endif

+endif

+

+ifeq ($(CPU_ARCH), armv6)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_arm.c)

+ifeq ($(USE_MULTI_CORE_RAMDUMP), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_ramdump.c)

+else

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_ramdump_arm.c)          

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_arm_asm_rvct.S)

+endif

+ifeq ($(CMPL_TYPE), gcc_arm)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_arm_asm.S)

+endif

+endif

+endif

+

+ifeq ($(CPU_ARCH), armv7-r)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_arm.c)

+ifeq ($(USE_MULTI_CORE_RAMDUMP), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_ramdump.c)

+else

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_ramdump_arm.c)          

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_arm_asm_rvct.S)

+endif

+ifeq ($(CMPL_TYPE), gcc_arm)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_arm_asm.S)

+endif

+endif

+endif

+

+ifeq ($(CPU_ARCH), armv7-a)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_arm.c)

+ifeq ($(USE_MULTI_CORE_RAMDUMP), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_ramdump.c)

+else

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_ramdump_arm.c)          

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_arm_asm_rvct.S)

+endif

+ifeq ($(CMPL_TYPE), gcc_arm)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_arm_asm.S)

+endif

+endif

+endif

+

+ifeq ($(CPU_ARCH), armv6-m)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_cortexm.c)

+ifeq ($(USE_MULTI_CORE_RAMDUMP), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_ramdump.c)

+endif

+endif

+

+ifeq ($(CPU_ARCH), ck610)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_csky.c)                 \

+             $(wildcard $(_MDL_SRC_PATH)/tos_mmu_csky.c)                    \

+             $(wildcard $(_MDL_SRC_PATH)/tos_ramdump_csky.c)

+

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/tos_except_csky_asm.S)

+endif

+

+_S_SOURCE += 

+_s_SOURCE += 

+

+#===============================================================================

+# ±àÒë¹æÔò

+#===============================================================================

+include $(FRAME_PATH)/rules/mdl_rules.mk

+

diff --git a/cp/ps/plat/src/oss/osa/windows/inc/win_fs.h b/cp/ps/plat/src/oss/osa/windows/inc/win_fs.h
new file mode 100644
index 0000000..7afb328
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/windows/inc/win_fs.h
@@ -0,0 +1,64 @@
+/************************************************************************

+* °æÈ¨ËùÓÐ (C)2007,ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+* 

+* ÎļþÃû³Æ£º win_fs.h

+* Îļþ±êʶ£º 

+* ÄÚÈÝÕªÒª£º ÐéÄâÎļþϵͳͷÎļþ

+*

+* ÐÞ¸ÄÈÕÆÚ     °æ±¾ºÅ     Ð޸ıê¼Ç     ÐÞ¸ÄÈË	     ÐÞ¸ÄÄÚÈÝ      

+* ---------------------------------------------------------------------

+* 2007/10/26    V1.0                   ¶­ºé²¨          ´´½¨

+************************************************************************/

+

+#ifndef VDD_FS_H_

+#define VDD_FS_H_

+

+#ifdef __cplusplus

+   extern "C"

+   {

+#endif

+

+#include "oss_api.h"

+#include <sys\stat.h>

+

+/**************************************************************************

+ *                         ³£Á¿                                           *

+ **************************************************************************/

+#ifdef _OS_WIN               

+typedef struct

+{

+    HANDLE          dirHandle;

+    BOOL            isFirstFile;

+    WIN32_FIND_DATA dirEntry;

+} DIR;

+#endif

+/**************************************************************************

+*                         È«¾Öº¯Êý                                        *

+**************************************************************************/

+

+/**********************************************************************

+* º¯ÊýÃû³Æ£ºVDD_FsInit

+* ¹¦ÄÜÃèÊö£ºÐéÄâÎļþϵͳע²á½Ó¿Ú

+* ²ÎÊý˵Ã÷£º

+* ·µ »Ø Öµ£º

+* ZOSS_SUCCESS:É豸³õʼ»¯³É¹¦

+* ZOSS_ERROR  :É豸³õʼ»¯Ê§°Ü

+* ÆäËü˵Ã÷£ºÎÞ

+***********************************************************************/

+UINT32 VDD_FsInit( VOID );

+

+/**********************************************************************

+* º¯ÊýÃû³Æ£ºVDD_FsExit

+* ¹¦ÄÜÃèÊö£ºÐéÄâÎļþϵͳעÏú½Ó¿Ú

+* ²ÎÊý˵Ã÷£º

+* ·µ »Ø Öµ£º

+* ZOSS_SUCCESS:É豸עÏú³É¹¦

+* ZOSS_ERROR  :É豸עÏúʧ°Ü

+* ÆäËü˵Ã÷£ºÎÞ

+***********************************************************************/

+UINT32 VDD_FsExit( VOID );

+

+#ifdef __cplusplus

+   }

+#endif

+#endif /*VDD_FS_H_*/

diff --git a/cp/ps/plat/src/oss/osa/windows/inc/win_typedef.h b/cp/ps/plat/src/oss/osa/windows/inc/win_typedef.h
new file mode 100644
index 0000000..3e32eab
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/windows/inc/win_typedef.h
@@ -0,0 +1,97 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : win_typedef.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : xuxingkui

+* °æ    ±¾ : 

+* Íê³ÉÈÕÆÚ : 2007-05-28

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é  EC:617001781798

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é   EC:617001781846 

+**************************************************************************/

+#ifndef _WIN_API_H

+#define _WIN_API_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "osa.h"

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define MAX_THREAD_NUM      (SINT32)200                 /* ×î¶àÏß³ÌÊý                   */

+#define MAX_SEM_CNTS        (SINT32)0x7FFFFFFF          /* ÐźÅÁ¿×î¶à¿É¹²Ïí·ÃÎʵÄÊýÄ¿   */

+#define MAX_QUEUE_SIZE      (UINT32)10240               /* ÿÈÎÎñ¶ÓÁдóС               */

+#define SIGNAL_MSG_NUMBER   (256)                       /* ÓÃÓÚÊÕ·¢ÏûÏ¢º¯ÊýÄÚ²¿         */

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/*Ïß³ÌÉÏÏÂÎÄ*/

+typedef struct 

+{

+    T_ZOss_Node             node;

+    CHAR                    thread_name[MAX_THREADNAME_LEN+1];     /* Ïß³ÌÃû³Æ              */

+    HANDLE                  thread_handle;                         /* Ï߳̾ä±ú              */

+    SINT32                  thread_real_id;                        /* Ï̵߳ÄÊý×ÖID          */

+    UINT32                  priority;                              /* Ïß³ÌÓÅÏȼ¶            */

+    UINT32                  preempt;                               /* Ïß³ÌÊÇ·ñÔÊÐíÇÀÕ¼      */

+    UINT32                  auto_start;                            /* Ïß³ÌÊÇ·ñ×Ô¶¯Æô¶¯      */

+    T_ZOss_Queue            *msgQueue;                             /* ÏûÏ¢¶ÓÁÐ              */

+    ZOSS_THREAD_FUN         ThreadEntry;                           /* ĬÈϵÄÏß³ÌÈë¿Úº¯Êý    */

+    T_ZOsa_ThreadUserArea   ua;                                    /* Ïß³ÌÓû§¿Õ¼ä          */

+}ThreadContext;

+

+typedef struct 

+{

+    HANDLE  semID;       /* ´´½¨µÄÐźÅÁ¿ID */

+    SINT32  semCount;    /* µ±Ç°ÐźÅÁ¿ÊýÁ¿ */

+}T_SemContext; 

+

+typedef struct 

+{

+    UINT32  sig_no;      /* ³ÉÔ±ÔڽṹÌåÖеÄλÖò»ÄÜ¸Ä±ä    */

+    UINT32  size;        /* ¼Ç¼Êý¾ÝËùÕ¼×Ö½ÚÊý              */

+    VOID    *msg_ptr;    /* ÏûÏ¢ÌåÖ¸Õë,Óû§·ÖÅä¿Õ¼ä         */

+}T_Osa_Signal;

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _WIN_API_H */

+

diff --git a/cp/ps/plat/src/oss/osa/windows/src/win_fs.c b/cp/ps/plat/src/oss/osa/windows/src/win_fs.c
new file mode 100644
index 0000000..5b06ba5
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/windows/src/win_fs.c
@@ -0,0 +1,1457 @@
+/************************************************************************

+* °æÈ¨ËùÓÐ (C)2007,ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+*

+* ÎļþÃû³Æ£º win_fs.c

+* Îļþ±êʶ£º

+* ÄÚÈÝÕªÒª£º ÐéÄâÎļþϵͳºÍÎļþϵͳ½Ó¿Ú£»

+*

+* ÐÞ¸ÄÈÕÆÚ     °æ±¾ºÅ     Ð޸ıê¼Ç     ÐÞ¸ÄÈË	     ÐÞ¸ÄÄÚÈÝ

+* ---------------------------------------------------------------------

+* 2007/06/28   V1.0			           ¶­ºé²¨          ´´½¨

+* 2007/10/22   V1.0       ÐÞ¸Ä         ¶­ºé²¨          ÖØÐÂÐÞ¸ÄÇý¶¯½Ó¿Ú

+************************************************************************/

+

+/**************************************************************************

+ *                        Í·Îļþ°üº¬                                      *

+ **************************************************************************/

+#include "oss_api.h"

+#include "tools_api.h"

+#include "win_fs.h"

+#include <stdio.h>

+#include <io.h>

+#include <sys\stat.h>

+/*2008.8.6 pc-lint

+#include <shlwapi.h>

+*/

+#include <direct.h>

+#include <winbase.h>

+

+#ifdef __GNUC__

+#include <dirent.h>

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+#define FILELEN (ZOSS_MAX_FILENAME_LEN +1)/*×î´óµÄÎļþÃû,°üº¬Â·¾¶½áÊø·û*/

+

+/**************************************************************************

+ *                           È«¾Ö±äÁ¿                                      *

+ **************************************************************************/

+static BOOL g_fs_init_flag = FALSE;                              /*ÎļþϵͳÊÇ·ñÒѾ­³õʼ»¯*/

+static T_ZDrvFS_DiskInfo g_fs_reflexmap;                         /*ÐéÄâÅÌ·ûºÍÕæÊµÄ¿Â¼µÄÓ³Éä±í*/

+

+/**************************************************************************

+ *                           ¾Ö²¿±äÁ¿                                      *

+ **************************************************************************/

+UINT32 VDD_FNameMap (const CHAR *filename,CHAR* changedname);

+UINT32 VDD_FBackNameMap (const CHAR *filename,CHAR* changedname);

+

+/**************************************************************************

+*                         È«¾Öº¯ÊýʵÏÖ                                    *

+**************************************************************************/

+

+/**********************************************************************

+* º¯ÊýÃû³Æ£ºVDD_FsInit

+* ¹¦ÄÜÃèÊö£ºÐéÄâÎļþϵͳע²á½Ó¿Ú

+* ²ÎÊý˵Ã÷£º

+* ·µ »Ø Öµ£º

+* ZOSS_SUCCESS:É豸³õʼ»¯³É¹¦

+* ZOSS_ERROR  :É豸³õʼ»¯Ê§°Ü

+* ÆäËü˵Ã÷£ºÎÞ

+***********************************************************************/

+UINT32 VDD_FsInit( VOID )

+{

+    UINT32 ureturn;

+    SINT32 ret;

+    UINT32 i;

+    BOOL bRet;

+    CHAR * currentDir = NULL;

+    UINT32 result;

+    if (TRUE == g_fs_init_flag )

+    {

+        return ZOSS_SUCCESS;

+    }

+    if (ZOSS_ERROR == VDD_SND( SIM_MSG_VDD_FS_DISK_GETINFO, (PBYTE)(&g_fs_reflexmap), sizeof(T_ZDrvFS_DiskInfo)))

+    {

+        return ZOSS_ERROR;

+    }

+    g_fs_init_flag = TRUE;

+    for (i = 0;i<g_fs_reflexmap.disknum;i++)

+    {

+        ret = (SINT32)strlen(g_fs_reflexmap.diskinfo[i].realpath);

+        if (g_fs_reflexmap.diskinfo[i].realpath[ret-1] == '\\')

+            g_fs_reflexmap.diskinfo[i].realpath[ret-1] = 0;

+        ret = (SINT32)strlen(g_fs_reflexmap.diskinfo[i].virtualpath);

+        if (g_fs_reflexmap.diskinfo[i].virtualpath[ret-1] == '\\')

+            g_fs_reflexmap.diskinfo[i].virtualpath[ret-1] = 0;

+        ret = _access( g_fs_reflexmap.diskinfo[i].realpath, 0 );

+        if ( -1 == ret)

+        {

+            ureturn = 0;

+            ureturn = (UINT32)_mkdir(g_fs_reflexmap.diskinfo[i].realpath);

+            if (ureturn == ZOSS_ERROR)

+            {

+                return ZOSS_ERROR;

+            }

+

+        }

+    }

+    currentDir = zOss_Malloc(FILELEN);

+    if ( NULL == currentDir )

+    {

+        return ZOSS_ERROR;

+    }

+

+    result = VDD_FNameMap("C:",currentDir);

+    if ( ZOSS_SUCCESS != result )

+    {

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        /* pc-lint 2008.8.6 */

+        bRet = SetCurrentDirectory(currentDir);

+        if (!bRet)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    return ZOSS_SUCCESS;

+}

+

+/**********************************************************************

+* º¯ÊýÃû³Æ£ºVDD_FsExit

+* ¹¦ÄÜÃèÊö£ºÐéÄâÎļþϵͳעÏú½Ó¿Ú

+* ²ÎÊý˵Ã÷£º

+* ·µ »Ø Öµ£º

+* ZOSS_SUCCESS:É豸עÏú³É¹¦

+* ZOSS_ERROR  :É豸עÏúʧ°Ü

+* ÆäËü˵Ã÷£ºÎÞ

+***********************************************************************/

+UINT32 VDD_FsExit( VOID )

+{

+    zOss_Memset(&g_fs_reflexmap,0,sizeof(T_ZDrvFS_DiskInfo));

+    g_fs_init_flag = FALSE;

+    return ZOSS_SUCCESS;

+}

+

+/**********************************************************************

+* º¯ÊýÃû³Æ£ºVDD_FsUpdate

+* ¹¦ÄÜÃèÊö£ºÐéÄâÎļþϵͳ¸üнӿÚ

+* ²ÎÊý˵Ã÷£º

+* ·µ »Ø Öµ£º

+* ZOSS_SUCCESS:É豸³õʼ»¯³É¹¦

+* ZOSS_ERROR  :É豸³õʼ»¯Ê§°Ü

+* ÆäËü˵Ã÷£ºÎÞ

+***********************************************************************/

+UINT32 VDD_FsUpdate( VOID )

+{

+    if (FALSE == g_fs_init_flag )

+    {

+        return ZOSS_ERROR;

+    }

+    if (ZOSS_ERROR == VDD_SND( SIM_MSG_VDD_FS_DISK_GETINFO, (PBYTE)(&g_fs_reflexmap), sizeof(T_ZDrvFS_DiskInfo)))

+    {

+        return ZOSS_ERROR;

+    }

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º VDD_FNameMap

+* ¹¦ÄÜÃèÊö£º ¸ù¾ÝÐéÄâÓ³ÉäµÄÎļþÃû³ÆÀ´´´½¨Êµ¼ÊµÄÎļþ

+* ²ÎÊý˵Ã÷£º (IN)  filename:ÐéÄâÓ³ÏñµÄÎļþÃû³Æ

+* ·µ »Ø Öµ£º ³É¹¦:·µ»ØÊµ¼ÊÎļþÃû³ÆÖ¸Õë;ʧ°Ü:·µ»ØNULL.

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 VDD_FNameMap (const CHAR *filename,CHAR* changedname)

+{

+    SINT32 i,state,realName,vDiskLen,Disk_num;

+    CHAR temp[FILELEN]={0};

+    CHAR dirName[FILELEN]={0};

+    char * colon = NULL;

+    state = 0; 

+

+    colon = strchr((char *)filename, ':');

+    if (colon == NULL)/*ûÓÐÕÒµ½,Ïà¶Ô·¾¶*/

+    {

+        strcpy((char *)changedname, (const char *)filename);

+        return ZOSS_SUCCESS;

+    }

+    else if (colon == (char *)filename +1)/*´øÅÌ·ûµÄ¾ø¶Ô·¾¶,ÅÌ·ûÒ»¸ö×Öĸ*/

+    {

+        Disk_num = (SINT32)g_fs_reflexmap.disknum;

+        for (i = 0;i<Disk_num;i++)

+        {

+            vDiskLen = (SINT32)strlen(g_fs_reflexmap.diskinfo[i].virtualpath);

+            memcpy(temp,filename,(UINT32)vDiskLen);

+            if (temp[0] == 'c')

+            {

+                temp[0] = 'C';

+            }

+            temp[vDiskLen] = 0;

+            state = memcmp(temp,g_fs_reflexmap.diskinfo[i].virtualpath,(UINT32)vDiskLen);

+            if (state == 0)

+            {

+                memcpy(dirName,filename + vDiskLen,strlen(filename)-(UINT32)vDiskLen);

+                dirName[strlen(filename)-(UINT32)vDiskLen] = 0;

+                state = 1;

+                break;

+            }

+        }

+        if (i >= Disk_num)

+        {

+            return ZOSS_ERROR;

+        }

+        realName = (SINT32)strlen(g_fs_reflexmap.diskinfo[i].realpath);

+        Disk_num = realName + strlen(dirName);

+        if (Disk_num >254)

+            return ZOSS_ERROR;

+        memcpy(changedname,g_fs_reflexmap.diskinfo[i].realpath,(UINT32)realName);

+        memcpy(changedname+realName,dirName,strlen(dirName));

+        changedname[(UINT32)realName+strlen(dirName)]= 0;

+

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        *changedname = 0;/*Çå¿Õ×Ö·û´®*/

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º VDD_FBackNameMap

+* ¹¦ÄÜÃèÊö£º ¸ù¾ÝÐéÄâÓ³ÉäµÄÎļþÃû³ÆÀ´´´½¨Êµ¼ÊµÄÎļþ

+* ²ÎÊý˵Ã÷£º (IN)  filename:ÐéÄâÓ³ÏñµÄÎļþÃû³Æ

+* ·µ »Ø Öµ£º ³É¹¦:·µ»ØÊµ¼ÊÎļþÃû³ÆÖ¸Õë;ʧ°Ü:·µ»ØNULL.

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 VDD_FBackNameMap (const CHAR *filename,CHAR* changedname)

+{

+    SINT32 i,state,nameLen,vDiskLen,Disk_num;

+    /*char *temp = (char*)malloc(FILELEN);

+    //char *dirName = (char*)malloc(FILELEN);*/

+    CHAR temp[FILELEN]={0};

+    CHAR dirName[FILELEN]={0};

+    state = 0;

+    Disk_num = (SINT32)g_fs_reflexmap.disknum;

+    for (i = 0;i<Disk_num;i++)

+    {

+        vDiskLen = (SINT32)strlen(g_fs_reflexmap.diskinfo[i].realpath);

+        memcpy(temp,filename,(UINT32)vDiskLen);

+        temp[vDiskLen] = 0;

+        state = memcmp(temp,g_fs_reflexmap.diskinfo[i].realpath,(UINT32)vDiskLen);

+        if (state == 0)

+        {

+            memcpy(dirName,filename + vDiskLen,strlen(filename)-(UINT32)vDiskLen);

+            dirName[strlen(filename)-(UINT32)vDiskLen] = 0;

+            state = 1;

+            break;

+        }

+    }

+    if (i >= Disk_num)

+    {

+        return ZOSS_ERROR;

+    }

+    nameLen = (SINT32)strlen(g_fs_reflexmap.diskinfo[i].virtualpath);

+    memcpy(changedname,g_fs_reflexmap.diskinfo[i].virtualpath,(UINT32)nameLen);

+    memcpy(changedname+nameLen,dirName,strlen(dirName));

+    changedname[(UINT32)nameLen+strlen(dirName)]= '\0';

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_Mkdir

+* ¹¦ÄÜÃèÊö£º´´½¨Ä¿Â¼

+* ²ÎÊý˵Ã÷£º (IN)   dirname:Ŀ¼Ãû

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR,Èç¹ûÎļþ´æÔÚ£¬Ôò

+                            ´´½¨Ò²ÊÇʧ°ÜµÄ¡£

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_Mkdir(const CHAR * dirname)

+{

+    UINT32 result;

+    SINT32 createResult;

+

+    CHAR * changedName = NULL;

+

+    changedName = zOss_Malloc( FILELEN );

+    if ( NULL == changedName )

+    {

+        return ZOSS_ERROR;

+    }

+    zOss_Memset( changedName, 0, FILELEN );

+

+    result = VDD_FNameMap( dirname , changedName );

+    if ( result != ZOSS_SUCCESS )

+    {

+        zOss_Free( changedName );

+        return ZOSS_ERROR;

+    }

+

+    createResult = CreateDirectory( changedName, NULL );

+    if ( createResult != 0 )

+    {

+        zOss_Free( changedName );

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        zOss_Free( changedName );

+        return ZOSS_ERROR;

+    }

+

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_Rmdir

+* ¹¦ÄÜÃèÊö£ºÉ¾³ýĿ¼

+* ²ÎÊý˵Ã÷£º (IN)

+             dirname:Ŀ¼Ãû

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_Rmdir(const CHAR * dirname)

+{

+    UINT32 result;

+    SINT32 rmResult;

+

+    CHAR * changedName = NULL;

+    changedName = zOss_Malloc( FILELEN );

+    if ( NULL == changedName )

+    {

+        return ZOSS_ERROR;

+    }

+    zOss_Memset( changedName, 0, FILELEN );

+

+    result = VDD_FNameMap( dirname , changedName );

+    if ( result != ZOSS_SUCCESS )

+    {

+        zOss_Free( changedName );

+        return ZOSS_ERROR;

+    }

+

+    rmResult = _rmdir( changedName );

+    if ( rmResult != 0 )

+    {

+        zOss_Free( changedName );

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        zOss_Free( changedName );

+        return ZOSS_SUCCESS;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_Rndir

+* ¹¦ÄÜÃèÊö£º¸ü¸ÄĿ¼Ãû

+* ²ÎÊý˵Ã÷£º (IN)   old_dirname:ԭĿ¼Ãû;new_dirname:ÐÂĿ¼Ãû

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_Rndir(const CHAR * old_dirname, const CHAR *new_dirname)

+{

+    UINT32 result;

+    CHAR * changedNameold = NULL;

+    CHAR * changedNamenew = NULL;

+

+    changedNameold = zOss_Malloc ( FILELEN );

+    if ( NULL == changedNameold )

+    {

+        return ZOSS_ERROR;

+    }

+

+    changedNamenew = zOss_Malloc ( FILELEN );

+    if ( NULL == changedNamenew )

+    {

+        zOss_Free( changedNameold );

+        return ZOSS_ERROR;

+    }

+

+    zOss_Memset( changedNameold, 0, FILELEN );

+    zOss_Memset( changedNamenew, 0, FILELEN );

+

+    result = VDD_FNameMap( old_dirname , changedNameold );

+    if ( ZOSS_SUCCESS != result )

+    {

+        zOss_Free( changedNameold );

+        zOss_Free( changedNamenew );

+        return ZOSS_ERROR;

+    }

+

+    result = VDD_FNameMap( new_dirname , changedNamenew );

+    if ( ZOSS_SUCCESS != result )

+    {

+        zOss_Free( changedNameold );

+        zOss_Free( changedNamenew );

+        return ZOSS_ERROR;

+    }

+

+    if (0 != rename(changedNameold, changedNamenew))

+    {

+        zOss_Free( changedNameold );

+        zOss_Free( changedNamenew );

+        return ZOSS_ERROR;

+    }

+

+    zOss_Free( changedNameold );

+    zOss_Free( changedNamenew );

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetPwd

+* ¹¦ÄÜÃèÊö£º»ñÈ¡µ±Ç°Ä¿Â¼Ãû

+* ²ÎÊý˵Ã÷£º (IN)   dirname:Ŀ¼Ãû;dirnamelen:Ŀ¼Ãû³¤¶È

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_GetPwd(CHAR * dirname, UINT32 dirnamelen)

+{

+    UINT32 mapRet;

+    CHAR * oldName = NULL;

+    CHAR * retGet;

+    UINT32 len;

+

+    if (NULL == dirname)

+    {

+        assert(NULL != dirname);

+        return ZOSS_ERROR;

+    }

+

+    oldName = zOss_Malloc( FILELEN );

+    if ( oldName == NULL )

+    {

+        return ZOSS_ERROR;

+    }

+    zOss_Memset( oldName, 0, FILELEN );

+

+    retGet = _getcwd(oldName, FILELEN);

+

+    if ( retGet != NULL )

+    {

+        len = strlen(oldName);

+        if ( len >= FILELEN )

+        {

+            return ZOSS_ERROR;

+        }

+

+        mapRet = VDD_FBackNameMap( oldName , dirname );

+        if ( mapRet != ZOSS_SUCCESS )

+        {

+            zOss_Free( oldName );

+            return ZOSS_ERROR;

+        }

+

+        len = strlen(dirname);

+        if (len == 2)

+        {

+            dirname[len] = '\\';

+            dirname[len + 1] = '\0';

+        }

+

+        zOss_Free( oldName );

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        zOss_Free( oldName );

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_ChDir

+* ¹¦ÄÜÃèÊö£ºÉèÖõ±Ç°Â·¾¶

+* ²ÎÊý˵Ã÷£º (IN)   dirname:Ŀ¼Ãû

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_ChDir(CHAR * dirname)

+{

+    int result;

+    UINT32 status;

+    CHAR changedname[FILELEN];

+

+    assert(NULL != dirname);

+

+    if (NULL == dirname )

+    {

+        return ZOSS_ERROR;

+    }

+

+    status = VDD_FNameMap(dirname, changedname);

+

+    if (status == ZOSS_ERROR)

+    {

+        return status;

+    }

+

+    result = _chdir(changedname);

+

+    if (0 == result)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_IsDir

+* ¹¦ÄÜÃèÊö£ºÅбðÊÇ·ñΪĿ¼

+* ²ÎÊý˵Ã÷£º (IN)   dirname:Ŀ¼Ãû

+* ·µ »Ø Öµ£º Ŀ¼:TRUE;Îļþ»òÆäËû:FALSE

+* ÆäËü˵Ã÷£ºµ÷ÓÃOSEºê½øÐÐÅбð

+**************************************************************************/

+BOOL  zOss_IsDir(const CHAR * dirname)

+{

+    UINT32 mapResult;

+    CHAR * changedName = NULL;

+    struct _stat statinfo;

+    SINT32 statRet;

+

+    zOss_ASSERT( NULL != dirname );

+

+    changedName = zOss_Malloc( FILELEN );

+    if ( changedName == NULL )

+    {

+        return FALSE;

+    }

+

+    zOss_Memset( changedName, 0, FILELEN );

+

+    mapResult = VDD_FNameMap( dirname , changedName );

+    if ( ZOSS_ERROR == mapResult )

+    {

+        zOss_Free( changedName );

+        return FALSE;

+    }

+

+    statRet = _stat(changedName, &statinfo);

+    if (statRet!=0)

+    {

+        zOss_Free( changedName );

+        return FALSE;

+    }

+

+    zOss_Free( changedName );

+

+    if ( statinfo.st_mode & _S_IFDIR )

+    {

+        return TRUE;

+    }

+    else

+    {

+        return FALSE;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_OpenDir

+* ¹¦ÄÜÃèÊö£º¸ù¾ÝÖ¸¶¨Ä¿Â¼Ãû»ñȡĿ¼·ÃÎÊÈë¿Ú

+* ²ÎÊý˵Ã÷£º (IN)

+                dirname:Ŀ¼Ãû;

+             (OUT)

+                dir_entry_ptr:Ŀ¼·ÃÎÊÈë¿Ú;

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32  zOss_OpenDir(const CHAR * dirname, VOID **dir_entry_ptr)

+{

+    DIR *temp;

+    UINT32 mapResult;

+#ifndef __GNUC__

+    HANDLE  handle;

+    BOOL setResult;

+#endif

+    CHAR * changedName = NULL;

+

+    assert(NULL != dirname);

+    assert(NULL != dir_entry_ptr);

+

+    changedName = zOss_Malloc( FILELEN );

+    if ( changedName == NULL )

+    {

+        return ZOSS_ERROR;

+    }

+    zOss_Memset( changedName, 0, FILELEN );

+

+    mapResult = VDD_FNameMap( dirname , changedName );

+    if ( ZOSS_SUCCESS != mapResult )

+    {

+        zOss_Free( changedName );

+        return ZOSS_ERROR;

+    }

+

+#ifndef __GNUC__

+    /* ¸øÐµÄDIR·ÖÅä¿Õ¼ä */

+    temp = ( DIR * )zOss_Malloc( sizeof( DIR ) );

+    if ( NULL == temp )

+    {

+        zOss_Free( changedName );

+        return ZOSS_ERROR;

+    }

+

+    /* ÉèÖõ±Ç°Â·¾¶ */

+    setResult = SetCurrentDirectory( changedName );

+    if ( 0 == setResult )

+    {

+        zOss_Free( changedName );

+        zOss_Free( temp );

+        return ZOSS_ERROR;

+    }

+

+    /* »ñÈ¡´ò¿ªÎļþµÄ¾ä±ú */

+    handle =  FindFirstFile( "*", &temp->dirEntry);

+    if ( INVALID_HANDLE_VALUE == handle )

+    {

+        zOss_Free( changedName );

+        zOss_Free( temp );

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        temp->isFirstFile = TRUE;

+        temp->dirHandle = handle;

+        * dir_entry_ptr =  temp;

+        zOss_Free( changedName );

+        return ZOSS_SUCCESS;

+    }

+#else

+    temp = opendir(changedName);

+    *dir_entry_ptr = temp;

+    if (NULL == temp)

+    {

+        zOss_Free( changedName );

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        zOss_Free( changedName );

+        return ZOSS_SUCCESS;

+    }

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º OSS_CloseDir

+* ¹¦ÄÜÃèÊö£º¹Ø±ÕĿ¼·ÃÎÊÈë¿Ú

+* ²ÎÊý˵Ã÷£º (IN)   dir_entry_ptr:Ŀ¼·ÃÎÊÈë¿Ú;

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_CloseDir(VOID **dir_entry_ptr)

+{

+#ifndef __GNUC__

+    DIR *temp;

+    CHAR * currentDir;

+#endif

+    BOOL result;

+    UINT32 ret;

+

+    assert(NULL != dir_entry_ptr);

+#ifndef __GNUC__

+    temp = ( DIR * )( * dir_entry_ptr );

+    result = FindClose( temp->dirHandle );

+    if ( result != 0 )

+    {

+        currentDir = zOss_Malloc(FILELEN);

+        if ( NULL == currentDir )

+        {

+            return ZOSS_ERROR;

+        }

+

+        ret = VDD_FNameMap("C:\\",currentDir);

+        if ( ZOSS_SUCCESS != ret )

+        {

+            return ZOSS_ERROR;

+        }

+        else

+        {

+            result = SetCurrentDirectory(currentDir);

+            if (!result)

+            {

+                return ZOSS_ERROR;

+            }

+        }

+

+        zOss_Free( currentDir );

+        zOss_Free( * dir_entry_ptr );

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#else

+    result = closedir(*dir_entry_ptr);

+    if (result == 0)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_ReadDir

+* ¹¦ÄÜÃèÊö£º»ñȡָ¶¨Ä¿Â¼ÏµÄÎļþºÍĿ¼

+* ²ÎÊý˵Ã÷£º (IN)   dir_entry_ptr:Ŀ¼·ÃÎÊÈë¿Ú;

+        dir_item_ptr:´æ·ÅĿ¼ÏîÐÅÏ¢µÄ½á¹¹Ö¸Õ룬ÓÉÓû§·ÖÅä

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_ReadDir(VOID **dir_entry_ptr,ZOSS_S_DIRENT* dir_item_ptr)

+{

+#ifndef __GNUC__

+    DIR *temp;

+#endif

+

+    BOOL result;

+

+#ifdef __GNUC__

+    struct dirent *entry;

+#endif

+    assert( NULL != dir_entry_ptr );

+    assert( NULL != dir_item_ptr );

+    if (NULL == dir_entry_ptr || NULL == dir_item_ptr)

+    {

+        return ZOSS_ERROR;

+    }

+

+#ifndef __GNUC__

+    temp = (DIR *) (*dir_entry_ptr);

+    if (temp->isFirstFile == TRUE)

+    {

+        temp->isFirstFile = FALSE;

+        zOss_Memcpy( dir_item_ptr->d_name, temp->dirEntry.cFileName, 255);

+        return ZOSS_SUCCESS;

+    }

+

+    result =  FindNextFile( temp->dirHandle, &temp->dirEntry );

+    if ( 0 != result )

+    {

+        zOss_Memcpy( dir_item_ptr->d_name, temp->dirEntry.cFileName, 255);

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+#else

+    entry = readdir((DIR *)( *dir_entry_ptr) );

+    if (NULL == entry)

+    {

+        zOss_Memset(dir_item_ptr, 0 , sizeof(ZOSS_S_DIRENT));

+        result = ZOSS_ERROR;

+    }

+    else

+    {

+        zOss_Memcpy(dir_item_ptr->d_name, entry->d_name,255);

+        result = ZOSS_SUCCESS;

+    }

+    return result;

+#endif

+

+}

+

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_Rewinddir

+* ¹¦ÄÜÃèÊö: ¸´Î»Ä¿Â¼Á÷£¬´ÓÍ·¿ªÊ¼·ÃÎÊĿ¼¡£

+* ²ÎÊý˵Ã÷: 

+            (IN)  

+                dir_entry_ptr:Ŀ¼·ÃÎÊÈë¿Ú;

+           

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷:

+**************************************************************************/ 

+VOID zOss_Rewinddir(VOID *dir_entry_ptr)

+{

+    if (NULL == dir_entry_ptr)

+    {

+        assert(NULL != dir_entry_ptr);

+        return;

+    }

+#ifndef __GNUC__

+

+#else

+    rewinddir(dir_entry_ptr);

+#endif

+    return;        

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_ChMod

+* ¹¦ÄÜÃèÊö£º¸ü¸ÄÎļþ»òĿ¼ÊôÐÔ

+* ²ÎÊý˵Ã÷£º (IN)   pathname:Îļþ»òĿ¼Ãû;attrs:Îļþ»òĿ¼ÐµÄÊôÐÔ

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_ChMod(const CHAR *pathname, mode_t attrs)

+{

+    SINT32 result;

+    UINT32 mapResult;

+    CHAR changedName[FILELEN];

+

+    mapResult = VDD_FNameMap( pathname , changedName );

+

+    if ( mapResult != ZOSS_SUCCESS )

+    {

+        return mapResult;

+    }

+

+    result = chmod((const char *)changedName, (int)attrs);

+

+    if ( 0 == result )

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_Stat

+* ¹¦ÄÜÃèÊö£º»ñÈ¡Îļþ»òĿ¼µÄÏêϸÐÅÏ¢

+* ²ÎÊý˵Ã÷£º (IN)   pathname:Îļþ»òĿ¼Ãû;buf:ÓÃÓÚ´æ´¢ÐÅÏ¢µÄstat½á¹¹

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_Stat(const CHAR *pathname, ZOSS_S_STAT *buf)

+{

+    UINT32 ureturn;

+    struct stat statinfo;

+    

+    CHAR Dname[FILELEN] = {0};

+    assert(NULL != pathname);

+    assert(NULL != buf);

+

+    if ( NULL == pathname)

+    {

+        return ZOSS_ERROR;

+    }

+    if ( NULL == buf)

+    {

+        return ZOSS_ERROR;

+    }

+    ureturn = VDD_FNameMap (pathname,Dname);

+    if (ureturn == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+

+    if (0 != stat(Dname, &statinfo))

+    {

+        return ZOSS_ERROR;

+    }

+

+    /* ¸ø×Ô¼º¶¨ÒåµÄ³ÉÔ±¸³Öµ£¬³ÉÔ±ÀàÐÍÓеã²î±ð */

+    buf->st_atime = statinfo.st_atime;

+    buf->st_ctime = statinfo.st_ctime;

+    buf->st_dev = statinfo.st_dev;

+    buf->st_gid = ( UINT32 )( statinfo.st_gid );

+    buf->st_ino = statinfo.st_ino;

+    buf->st_mode = statinfo.st_mode;

+    buf->st_mtime = statinfo.st_mtime;

+    buf->st_nlink = (UINT16)(statinfo.st_nlink);

+    buf->st_rdev = statinfo.st_rdev;

+    buf->st_size = (UINT32)statinfo.st_size;

+    buf->st_uid = (UINT32)(statinfo.st_uid);

+

+    return ZOSS_SUCCESS;

+}

+

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FExist

+* ¹¦ÄÜÃèÊö£º ÅбðÎļþÊÇ·ñ´æÔÚ

+* ²ÎÊý˵Ã÷£º (IN)   filename:ÎļþÃû

+* ·µ »Ø Öµ£º ´æÔÚ:TRUE;²»´æÔÚ:FALSE

+* ÆäËü˵Ã÷£º ¿ÉÒÔÅбðÎļþºÍĿ¼ÊÇ·ñ´æÔÚ

+**************************************************************************/

+BOOL zOss_FExist(const CHAR *filename)

+{

+    UINT32 mapResult;

+    CHAR * changedName = NULL;

+    struct _stat statinfo;

+    SINT32 statRet;

+

+    zOss_ASSERT( NULL != filename );

+

+    changedName = zOss_Malloc( FILELEN );

+    if ( changedName == NULL )

+    {

+        return FALSE;

+    }

+

+    zOss_Memset( changedName, 0, FILELEN );

+

+    mapResult = VDD_FNameMap( filename , changedName );

+    if ( ZOSS_ERROR == mapResult )

+    {

+        zOss_Free( changedName );

+        return FALSE;

+    }

+

+    statRet = _stat(changedName, &statinfo);

+    if (statRet!=0)

+    {

+        zOss_Free( changedName );

+        return FALSE;

+    }

+

+    zOss_Free( changedName );

+

+    if ( statinfo.st_mode & _S_IFDIR )

+    {

+        return FALSE;

+    }

+    else

+    {

+        return TRUE;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FCreate

+* ¹¦ÄÜÃèÊö£º ´´½¨Îļþ

+* ²ÎÊý˵Ã÷£º (IN)  filename:ÎļþÃû

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR.

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_FCreate (const CHAR *filename)

+{

+    FILE *fp;

+    UINT32 ureturn;

+    CHAR create_file[FILELEN] ={0};

+

+    assert(NULL != filename);

+    if (NULL == filename)

+    {

+        return ZOSS_ERROR;

+    }

+

+    ureturn = VDD_FNameMap(filename,create_file);

+    if (ZOSS_ERROR == ureturn)

+    {

+        return ZOSS_ERROR;

+    }

+    fp = fopen(create_file,"wb");

+    if (NULL == fp)

+    {

+        return ZOSS_ERROR;

+    }

+    fclose(fp);

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FOpen

+* ¹¦ÄÜÃèÊö£º ´ò¿ªÒ»¸öÎļþ

+* ²ÎÊý˵Ã÷£º (IN)  filename:ÎļþÃû

+           mode:´ò¿ª·½Ê½.

+             "r": Open text file for reading.

+                     "w": Truncate to zero length or create text file for writing.

+                     "a": Append; open or create text file for writing at end of file.

+                     "rb": Open binary file for reading.

+                     "wb": Truncate to zero length or create binary file for writing.

+                     "ab": Append; open or create binary file for writing at end of file

+                     "r+": Open text file for update (reading and writing).

+                     "w+": Truncate to zero length or create text file for update.

+                     "a+": Append open or create text file for update, writing at end of file.

+                     "r+b" or "rb+": Open binary file for update (reading and writing).

+                     "w+b" or "wb+": Truncate to zero length or create binary file for update.

+                     "a+b" or "ab+": Append; open or create binary file for update, writing at end of file.

+* ·µ »Ø Öµ£º ³É¹¦:ÎļþÃèÊö·û;ʧ°Ü:ZOSS_NULL.

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+FILE *zOss_FOpen (const CHAR * filename, const CHAR * mode)

+{

+    FILE *fp = NULL;

+    UINT32 ureturn;

+    CHAR open_file[FILELEN]= {0};

+

+    assert(NULL != filename);

+    assert(NULL != mode);

+    ureturn = VDD_FNameMap(filename,open_file);

+    if (ZOSS_ERROR == ureturn)

+    {

+        return ZOSS_NULL;

+    }

+    fp = fopen(open_file,mode);

+    if (NULL == fp)

+    {

+        return ZOSS_NULL;

+    }

+    return fp;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º VDD_FSeek

+* ¹¦ÄÜÃèÊö£º ¶¨Î»ÔÚÎļþÖеĶÁдλÖÃ

+* ²ÎÊý˵Ã÷£º (IN)   fd: ÎļþÃèÊö·û,VDD_FOpen()µÄ·µ»ØÖµ

+            offset:´ÓԭʼλÖÿªÊ¼ÒªÒƶ¯µÄÆ«ÒÆÁ¿

+            whence:

+            ZOSS_SEEK_SET :´ÓÎļþ¿ªÊ¼

+            ZOSS_SEEK_CUR :µ±Ç°Î»ÖÃ

+            ZOSS_SEEK_END :´ÓÎļþ½áβ

+* ·µ »Ø Öµ£º ³É¹¦:ÕýÈ··µ»ØZOSS_SUCCESS;ʧ°Ü:·µ»Ø´íÎó´úÂë.

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_FSeek (FILE *stream, SINT32 offset, SINT32 whence)

+{

+    SINT32 uReturn;

+    assert(NULL != stream);

+    if ( NULL == stream )

+    {

+        return ZOSS_ERROR;

+    }

+

+    uReturn = fseek(stream, offset, whence);

+    if (0 == uReturn)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FRead

+* ¹¦ÄÜÃèÊö£º ¶ÁÎļþ

+* ²ÎÊý˵Ã÷£º (IN)   data:´æ·Å¶ÁÈ¡Êý¾ÝµÄÄÚ´æÖ¸Õë

+            size:Êý¾Ýµ¥ÔªµÄ´óС

+            count:¶ÁÈ¡µÄ¸öÊý

+            stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º ʵ¼Ê¶ÁµÄ×Ö½ÚÊý

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+SSIZE_T zOss_FRead(void *data, SSIZE_T size, SSIZE_T count, FILE *stream)

+{

+    SINT32 uReturn;

+    assert(NULL != stream);

+    assert(NULL != data);

+    if (NULL == data)

+    {

+        return 0;

+    }

+    if (size <0)

+    {

+        return 0;

+    }

+    if (NULL == stream)

+    {

+        return 0;

+    }

+

+    uReturn = (SINT32)fread(data,(UINT32)size,(UINT32)count,stream);

+    return uReturn;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FWrite

+* ¹¦ÄÜÃèÊö£º дÎļþ

+* ²ÎÊý˵Ã÷£º (IN)    data:´æ·ÅдÈëÊý¾ÝµÄÄÚ´æÖ¸Õë

+             size:Êý¾Ýµ¥ÔªµÄ´óС

+             count:дÈëµÄ¸öÊý

+             stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º ʵ¼ÊдµÄ×Ö½ÚÊý

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+SSIZE_T zOss_FWrite(const void *data, SSIZE_T size, SSIZE_T count, FILE *stream)

+{

+    SSIZE_T uReturn;

+    assert(NULL != stream);

+    assert(NULL != data);

+    if (NULL == data)

+    {

+        return 0;

+    }

+    if (size <0)

+    {

+        return 0;

+    }

+    if (NULL == stream)

+    {

+        return 0;

+    }

+

+

+    uReturn = (SINT32)fwrite(data,(UINT32)size,(UINT32)count,stream);

+    return uReturn;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FEof

+* ¹¦ÄÜÃèÊö£º ¼ì²éÊÇ·ñµ½Îļþ½áβ

+* ²ÎÊý˵Ã÷£º (IN)    stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º ·ÇÁã±íʾµ±Ç°ÎļþÖ¸ÕëÒѵ½Îļþ½áβ,Áã±íʾûÓÐ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_FEof(FILE *stream)

+{

+    assert(NULL != stream);

+    if (NULL == stream)

+    {

+        return 0;

+    }

+

+    return feof(stream);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FTell

+* ¹¦ÄÜÃèÊö£º ·µ»Ø´ÓÎļþ¿ªÊ¼´¦µÄµ±Ç°ÎļþÖ¸ÕëλÖÃ

+* ²ÎÊý˵Ã÷£º (IN)    stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º ³É¹¦:´ÓÎļþ¿ªÊ¼´¦µÄµ±Ç°ÎļþÖ¸ÕëλÖÃ;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_FTell(FILE *stream)

+{

+    SINT32 uReturn;

+

+    assert(NULL != stream);

+    if (NULL == stream)

+    {

+        return 0;

+    }

+

+    uReturn = ftell(stream);

+    if (-1 == uReturn)

+    {

+        return ZOSS_ERROR;

+    }

+    return(UINT32)uReturn;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FClose

+* ¹¦ÄÜÃèÊö£º ¹Ø±ÕÎļþ

+* ²ÎÊý˵Ã÷£º (IN)   stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_FClose(FILE *stream)

+{

+    SINT32 uReturn;

+    assert(NULL != stream);

+    if (NULL == stream)

+    {

+        return ZOSS_ERROR;

+    }

+    uReturn = fclose(stream);

+    if (0 == uReturn)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º VDD_FRename

+* ¹¦ÄÜÃèÊö£º ÎļþÖØÃüÃû

+* ²ÎÊý˵Ã÷£º (IN)   old_filename:Ô­ÎļþÃû

+                        new_filename:ÐÂÎļþÃû

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_FRename(const CHAR *old_filename, const CHAR *new_filename)

+{

+    UINT32 uReturn;

+    CHAR source_file[FILELEN] ={0};

+    CHAR dest_file [FILELEN]={0};

+

+    assert(NULL != old_filename);

+    assert(NULL != new_filename);

+    if ((NULL ==old_filename)||(NULL == new_filename))

+    {

+        return ZOSS_ERROR;

+    }

+    uReturn = VDD_FNameMap(old_filename,source_file);

+    if (ZOSS_ERROR == uReturn)

+    {

+        return ZOSS_ERROR;

+    }

+    uReturn = VDD_FNameMap(new_filename,dest_file);

+    if (ZOSS_ERROR == uReturn)

+    {

+        return ZOSS_ERROR;

+    }

+    uReturn = (UINT32)rename(source_file,dest_file);

+    if (0 == uReturn)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º VDD_FDelete

+* ¹¦ÄÜÃèÊö£º ɾ³ýÎļþ

+* ²ÎÊý˵Ã÷£º (IN)   filename:ÎļþÃû

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_FDelete(const CHAR * filename)

+{

+    UINT32 uReturn;

+    CHAR delete_file[FILELEN]= {0};

+

+    assert(NULL != filename);

+    if (NULL == filename)

+    {

+        return ZOSS_ERROR;

+    }

+    uReturn = VDD_FNameMap(filename,delete_file);

+    if (ZOSS_ERROR == uReturn)

+    {

+        return ZOSS_ERROR;

+    }

+    uReturn = (UINT32)remove(delete_file);

+    if (0 == uReturn)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º VDD_FLength

+* ¹¦ÄÜÃèÊö£º »ñÈ¡Îļþ³¤¶È

+* ²ÎÊý˵Ã÷£º (IN)   stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º ·µ»ØÎļþ³¤¶È,´íÎó·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_FLength(FILE *stream)

+{

+    UINT32 ret;

+    struct stat statbuf;

+

+    assert(NULL != stream);

+    if (NULL == stream)

+    {

+        return ZOSS_ERROR;

+    }

+

+    /* get information about the file */

+    ret = (UINT32)fstat(fileno(stream), &statbuf);

+    if (ret != 0)

+    {

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        return(UINT32)statbuf.st_size;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FError

+* ¹¦ÄÜÃèÊö£º¸ù¾ÝÖ¸¶¨Ä¿Â¼Ãû»ñȡĿ¼·ÃÎÊÈë¿Ú

+* ²ÎÊý˵Ã÷£º (IN)    stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º Èô¼ì²âµ½´íÎ󷵻طÇ0 Öµ£»·ñÔò£¬·µ»Ø0¡£

+* ÆäËü˵Ã÷£ºÓÉÓڵײãʵÏÖÔ­Òò£¬º¯Êý·µ»ØµÄ·Ç0ÖµµÄº¬Ò壬

+¿ÉÄÜÓë±ê×¼c¿âÖÐferrorµÄº¬Òå²»Ò»Ö¡£

+**************************************************************************/

+UINT32 zOss_FError(FILE *stream)

+{

+    assert(NULL != stream);

+

+    if (NULL == stream)

+    {

+        return ZOSS_ERROR;

+    }

+

+    return(UINT32)ferror(stream);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FTruncate

+* ¹¦ÄÜÃèÊö£º

+* ²ÎÊý˵Ã÷£º (IN)    stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º

+**************************************************************************/

+UINT32 zOss_FTruncate(FILE *stream, UINT32 size)

+{

+    int result;

+    UINT32 status;

+

+    assert(NULL != stream);

+

+    if (NULL == stream)

+    {

+        return ZOSS_ERROR;

+    }

+    result = chsize(stream->_file,(long)size);

+

+    if (result == 0)

+    {

+        status = ZOSS_SUCCESS;

+    }

+    else

+    {

+        status = ZOSS_ERROR;

+    }

+

+    return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_FFlush

+* ¹¦ÄÜÃèÊö£º ͬ²½Îļþ£¬½«Îļþ»º³åÇøÄÚµÄÊý¾ÝдÈëÎļþ

+* ²ÎÊý˵Ã÷£º (IN)    stream:ÎļþÖ¸Õë

+* ·µ »Ø Öµ£º³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_FFlush(FILE *stream)

+{

+    int result;

+

+    assert(NULL != stream);

+

+    if (NULL == stream)

+    {

+        return ZOSS_ERROR;

+    }

+

+    result = fflush(stream);

+

+    if (result == -1)

+    {

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        return ZOSS_SUCCESS;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_MountDisk

+* ¹¦ÄÜÃèÊö£º¼ÓÔØ´ÅÅÌ

+* ²ÎÊý˵Ã÷£º (IN)   diskname:ÅÌ·ûÃû

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_MountDisk(CHAR diskname)

+{

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_UnMountDisk

+* ¹¦ÄÜÃèÊö£ºÐ¶ÔØ´ÅÅÌ

+* ²ÎÊý˵Ã÷£º (IN)   diskname:ÅÌ·ûÃû

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_UnMountDisk(CHAR diskname)

+{

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetDiskFreeSpace

+* ¹¦ÄÜÃèÊö£º»ñȡָ¶¨´ÅÅ̵ÄÊ£Óà¿Õ¼ä

+* ²ÎÊý˵Ã÷£º (IN)   diskname:ÅÌ·ûÃû,ÀýÈçC¡¢D.

+                              (OUT) space:Ê£Óà¿Õ¼äµÄ´óС,µ¥Î»ÊÇbyte.

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_GetDiskFreeSpace(CHAR diskname, UINT64 *space)

+{

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetDiskCapacity

+* ¹¦ÄÜÃèÊö£ºÐ¶ÔØ´ÅÅÌ

+* ²ÎÊý˵Ã÷£º (IN)   diskname:ÅÌ·ûÃû,ÀýÈçC¡¢D.

+                              (OUT) space:Ê£Óà¿Õ¼äµÄ´óС,µ¥Î»ÊÇbyte.

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_GetDiskCapacity(CHAR diskname, UINT64 *space)

+{

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetCurrentZonetime

+* ¹¦ÄÜÃèÊö£º »ñÈ¡µ±Ç°µÄÊ±Çø

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ³É¹¦:·µ»ØÊ±Çø;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_GetCurrentZonetime()

+{

+    TIME_ZONE_INFORMATION timeZone;

+    UINT32 result;

+    result = GetTimeZoneInformation(&timeZone);

+    if (result == TIME_ZONE_ID_STANDARD)

+    {

+        return(UINT32)timeZone.Bias;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SyncFS

+* ¹¦ÄÜÃèÊö£º Îļþϵͳͬ²½

+* ²ÎÊý˵Ã÷£º (IN)

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SyncFS(VOID)

+{

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º FS_Init

+* ¹¦ÄÜÃèÊö£º Îļþϵͳ³õʼ»¯

+* ²ÎÊý˵Ã÷£º (IN)

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID  FS_Init(VOID)

+{    

+    UINT32 retCode = VDD_FsInit();

+    zOss_ASSERT(retCode == ZOSS_SUCCESS);

+}

+

+#ifdef __cplusplus

+}

+#endif

diff --git a/cp/ps/plat/src/oss/osa/windows/src/win_kernel.c b/cp/ps/plat/src/oss/osa/windows/src/win_kernel.c
new file mode 100644
index 0000000..eeab736
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/windows/src/win_kernel.c
@@ -0,0 +1,1716 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_WINAPI

+* ÎÄ ¼þ Ãû : win_kernel.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : osa for windows µÄʵÏÖÎļþ

+* ×÷    Õß : xuxingkui

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007-05-28

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é  EC:617001781798

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é   EC:617001781846 

+**************************************************************************/

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "osa.h"

+#include "win_typedef.h"

+#include "sup.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+    

+/*************************************************************************

+*                           ºê¶¨Òå                                       *

+**************************************************************************/

+#define THREAD_MSG_HEAD_SIZE        sizeof(T_THREAD_MSG_HEAD)

+#define THREAD_MSG_HEAD(buf)        (T_THREAD_MSG_HEAD *)((UINT8 *)(buf) - THREAD_MSG_HEAD_SIZE)

+#define THREAD_MSG_BUF(head)        (VOID *)((UINT8 *)(head) + THREAD_MSG_HEAD_SIZE)

+#define THREAD_MSG_SIZE(size)       ((size) + THREAD_MSG_HEAD_SIZE)

+

+#define THREAD_MSG_MAGIC            0x3A3A3A3A

+

+#define THREAD_MSG_HOOK_TYPE_MAX    ZOSS_SETHOOKFLAG_INTER

+#define THREAD_MSG_HOOK_DIRE_MAX    ZOSS_MSGDIRE_INOUT

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    UINT32      id;

+    UINT32      buf_size;

+    UINT32      magic;

+} T_THREAD_MSG_HEAD;

+

+typedef struct

+{

+    T_ZOss_Node     Node;                           /*  Ïà¶ÔλÖò»ÄÜ¸Ä±ä            */

+    ZOSS_THREAD_ID  thread_id;

+    UINT8           dire[THREAD_MSG_HOOK_TYPE_MAX]; /* 0: ZOSS_SETHOOKFLAG_MONI=1   */

+    THREAD_MSG_HOOK func[THREAD_MSG_HOOK_TYPE_MAX]; /* 0: ZOSS_SETHOOKFLAG_MONI=1   */

+} THREAD_MSG_HOOK_CONTENT;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+UINT32 OSA_IdentifyThread(ZOSS_THREAD_ID threadID);

+static VOID OSA_DefaultEntry(SINT32 arg);

+static ThreadContext *OSA_GetThreadContext(SINT32 thread_real_id);

+static THREAD_MSG_HOOK_CONTENT* find_thread_content(ZOSS_THREAD_ID thread_id);

+static BOOL is_sender_task(VOID *sender);

+static UINT32 proc_thread_msg_hook(UINT32 dire, UINT32 msg_id, VOID *p_buf, UINT16 buf_size, ZOSS_THREAD_ID thread_id);

+static UINT32 proc_task_msg_hook(UINT32 dire, UINT32 msg_id, VOID *p_buf, UINT16 buf_size, ZOSS_TASK_ID task_id);

+static UINT32 proc_msg_hook(UINT32 msg_id, VOID *p_buf, UINT16 buf_size, ZOSS_THREAD_ID d_thread_id);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+/* Ïß³ÌÁ´±í */

+static T_ZOss_List      gThreadList             = {0};

+static ZOSS_MUTEX_ID    gThreadListMutex        = NULL;

+

+/* ¼ÆË㵱ǰÏ̵߳ÄÊýÄ¿ */  

+static   UINT32         gThreadCount            = 0;

+static T_OSA_PARAM      *gpOsa_Param            = NULL;     /* ÓÃÓÚÓÅÏȼ¶Ó³Éä           */

+static ZOSS_TASK_ID     *gOsa_AllTaskIdArray    = NULL;

+static T_ZOss_List      s_thread_msg_hook_list  = {0};

+UINT32                  gOsa_SysCpuFreq         = 1000;

+BOOL                    gOsa_SwapTimeFlag       = FALSE;    /* Ïß³ÌÇл»¼Ç¼cpuʱ¼ä±êÖ¾  */

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£º OSA_Init

+* ¹¦ÄÜÃèÊö£º OSA Ä£¿é³õʼ»¯

+* ²ÎÊý˵Ã÷£º (IN)

+             (OUT)

+* ·µ »Ø Öµ£º ³õʼ»¯³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 OSA_Init(VOID)

+{

+    static BOOL bInit       = TRUE;   /* ³õʼ»¯±êÖ¾ */

+    T_OSS_PARAM *pOssParam  = NULL;

+    UINT32      nRet        = ZOSS_SUCCESS;

+

+    if (bInit)

+    {

+        pOssParam = zOss_GetOssCfg();

+        gpOsa_Param = &(pOssParam->OsaCfg);

+

+        zOss_ListInit(&gThreadList);

+

+        gThreadListMutex = zOss_CreateMutex("thread_list_mutex", ZOSS_INHERIT);

+

+        if (NULL == gThreadListMutex)

+        {

+            return ZOSS_ERROR;

+        }

+

+        zOss_ListInit(&s_thread_msg_hook_list); /* Initialize Thread List Info,Ö§³ÖÏß³ÌÏûÏ¢¹ÜÀíhook */

+

+       /* Ðè¼Óʧ°ÜÅбð */

+       /* Initialize Mem */

+        nRet = MEM_Init();

+        if (nRet != ZOSS_SUCCESS)

+        {

+            zOss_RamLog("SysEntry: MEM_Init Fail, Code = 0x%x!", nRet);

+            return nRet;

+        }

+        zOss_RamLog("SysEntry(%u): MEM_Init Start OK!", zOss_GetTickCount());

+        bInit = FALSE;

+        return ZOSS_SUCCESS;

+    }

+    else/* Òѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/*************************************************************************

+*                             Ï߳̽ӿÚ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ:  zOss_GetprioCfg

+* ¹¦ÄÜÃèÊö:  »ñÈ¡ÓÅÏȼ¶Öµ

+* ²ÎÊý˵Ã÷:  offset ȡֵΪ0~31

+* ·µ »Ø Öµ:  ÕýÈ··µ»ØÓÅÏȼ¶ÊýÖµ£¬´íÎó·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:  offset ȡֵΪ0~31

+**************************************************************************/

+UINT32 zOss_GetPrioCfg(UINT8 offset)

+{

+    zOss_AssertEx(offset <= 31, ZOSS_ERROR);

+

+    zOss_AssertEx(NULL != gpOsa_Param, ZOSS_ERROR);     /* ¶ÔÈ«¾Ö±äÁ¿½øÐгõʼ»¯±£»¤ */

+    

+    if (NULL != gpOsa_Param->pPrioMap)

+    {

+        return (*(gpOsa_Param->pPrioMap))[offset];

+    }

+    else

+    {

+        return (UINT32)(offset);

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_CreateThread

+* ¹¦ÄÜÃèÊö£º ´´½¨Ïß³Ì

+* ²ÎÊý˵Ã÷£º (IN)

+             thread_name: Ïß³ÌÃû³Æ,×î´ó³¤¶È²»Äܳ¬¹ýMAX_THREADNAME_LEN

+             entry:       Ï̵߳ÄʵÌ庯Êý,ZOSS_THREAD_FUNÀàÐÍ

+             arg:         Ïß³ÌʵÌ庯ÊýµÄ²ÎÊý

+             stack_size:  ¶ÑÕ»´óС£¨µ¥Î»£º×Ö½Ú£©

+             priority:    Ïß³ÌÓÅÏȼ¶£¨0-31£©, ÖµÔ½µÍÓÅÏȼ¶Ô½¸ß

+             preempt:     ͬÓÅÏȼ¶Ïß³ÌÊÇ·ñÔÊÐíÇÀÕ¼,1 ΪÔÊÐíÇÀÕ¼,

+                          0Ϊ²»ÔÊÐíÇÀÕ¼£¬ÆäËûֵΪÔÊÐíÇÀÕ¼

+             auto_start:  ÊÇ·ñ×Ô¶¯Æô¶¯,1 Ϊ×Ô¶¯Æô¶¯,0Ϊ·Ç×Ô¶¯Æô¶¯£¬

+                          ÆäËûֵΪ×Ô¶¯Æô¶¯

+             (OUT)

+* ·µ »Ø Öµ£ºÈç¹û´´½¨³É¹¦·µ»ØÏß³ÌID£¬´´½¨Ê§°Ü·µ»ØZOSS_INVALID_THREAD_ID

+* ÆäËü˵Ã÷£º ¹ØÓÚwindowsϵÄÌØÊâ˵Ã÷£º

+            1.Ïß³ÌÓÅÏȼ¶ÔÚwindowsÏ·ÖΪ7¸öµÈ¼¶£¬ËùÒÔÕâÀï

+              0-3;4-7;8-12;13-17;18-22;23-25;26-31;·¶Î§ÄÚµÄ

+              ֵΪͬÓÅÏȼ¶µÄ;

+            2.¹ØÓÚÇÀÕ¼ÔÚwindowsÏÂÊÇÎÞЧµÄ£»

+**************************************************************************/

+ZOSS_THREAD_ID zOss_CreateThread(const CHAR *thread_name,

+                                 VOID       (*entry)(SINT32),

+                                 SINT32     arg,

+                                 UINT32     stack_size,

+                                 UINT32     priority, 

+                                 UINT32     preempt,

+                                 UINT32     auto_start)

+{

+    ThreadContext   *tmpContext = NULL;

+    int             winPriority = 0;

+    UINT32          name_len    = 0;

+    

+    

+    zOss_AssertEx((thread_name != NULL) && (entry != NULL) && (priority <= 31) && 0 < stack_size, ZOSS_INVALID_THREAD_ID);

+    

+    name_len = strlen(thread_name);

+    zOss_AssertEx((name_len <= MAX_THREADNAME_LEN), ZOSS_INVALID_THREAD_ID);

+    /* ¼ì²éµ±Ç°µÄÏß³ÌÊýÄ¿ÊÇ·ñÒÑ´ïµ½×î´ó */

+    if (gThreadCount >= MAX_THREAD_NUM)

+    {

+        return ZOSS_INVALID_THREAD_ID;

+    }

+

+    /* ÉêÇëÒ»¸öÏß³ÌÉÏÏÂÎÄ */

+    tmpContext = (ThreadContext *)zOss_Malloc(sizeof(ThreadContext));

+    if (tmpContext == NULL)

+    {

+        return ZOSS_INVALID_THREAD_ID;

+    }

+

+    zOss_Memset(tmpContext, 0, sizeof(ThreadContext));

+

+    strcpy(tmpContext->thread_name, thread_name);

+    tmpContext->priority    = priority;

+    tmpContext->preempt     = preempt;

+    tmpContext->auto_start  = auto_start;

+    tmpContext->msgQueue    = (T_ZOss_Queue *)zOss_QueueCreate(thread_name, MAX_QUEUE_SIZE, sizeof(T_Osa_Signal)); /* ´´½¨ÏûÏ¢¶ÓÁÐ*/

+

+    /* ÔÝʱÌîÈçÏÂÖµ£¬´ý²¹³ä */

+    tmpContext->ua.threadid = (ZOSS_THREAD_ID)tmpContext;

+    strncpy(tmpContext->ua.threadname, thread_name, 16);

+    tmpContext->ua.priority = (UINT8)priority;

+

+    if (tmpContext->msgQueue  == NULL)

+    {

+        zOss_Free(tmpContext);

+        return ZOSS_INVALID_THREAD_ID;

+    }

+

+    /* ÉèÖÃÏß³ÌÓÅÏȼ¶ */

+    if ((priority <= 3))

+    {

+        winPriority = THREAD_PRIORITY_TIME_CRITICAL;

+    }

+    else if ((priority >= 4)&&(priority <= 7))

+    {

+        winPriority = THREAD_PRIORITY_HIGHEST;

+    }

+    else if ((priority >= 8)&&(priority <= 12))

+    {

+        winPriority = THREAD_PRIORITY_ABOVE_NORMAL ;

+    }

+    else if ((priority >= 13)&&(priority <= 17))

+    {

+        winPriority = THREAD_PRIORITY_NORMAL ;

+    }

+    else if ((priority >= 18)&&(priority <= 22))

+    {

+        winPriority = THREAD_PRIORITY_BELOW_NORMAL;

+    }

+    else if ((priority >= 22)&&(priority <= 26))

+    {

+        winPriority = THREAD_PRIORITY_LOWEST;

+    }

+    else if ((priority >= 27)&&(priority <= 31))

+    {

+        winPriority = THREAD_PRIORITY_IDLE;

+    }

+

+    tmpContext->ThreadEntry = entry;

+

+    /* ´´½¨Ïß³Ì */

+    tmpContext->thread_handle = CreateThread(NULL, stack_size, (LPTHREAD_START_ROUTINE)OSA_DefaultEntry,

+                                              (LPVOID)arg, CREATE_SUSPENDED, (unsigned long *)&( tmpContext->thread_real_id ));

+

+    if (NULL == tmpContext->thread_handle)

+    {

+        zOss_QueueDelete(tmpContext->msgQueue);

+        zOss_Free(tmpContext);

+        return ZOSS_INVALID_THREAD_ID;

+    }

+

+    /* ÉèÖÃÏß³ÌÓÅÏȼ¶ */

+    SetThreadPriority(tmpContext->thread_handle, winPriority);

+    /* ¼Óµ½Ïß³ÌÁбíÖÐ */

+    zOss_GetMutex(gThreadListMutex, ZOSS_WAIT_FOREVER);

+    zOss_ListAdd(&gThreadList, (T_ZOss_Node *)tmpContext);

+    zOss_PutMutex(gThreadListMutex);

+

+    /* ¹ØÓÚÏß³ÌÊÇ·ñ×Ô¶¯Æô¶¯µÄ´¦Àí */

+    if (auto_start)

+    {

+        ResumeThread(tmpContext->thread_handle);

+    }

+

+    gThreadCount++;

+

+    return (ZOSS_THREAD_ID)tmpContext;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_ThreadExit

+* ¹¦ÄÜÃèÊö£º Í˳öµ±Ç°Ïß³Ì

+* ²ÎÊý˵Ã÷£º (IN)

+             (OUT)

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+VOID zOss_ExitThread(VOID)

+{

+    ThreadContext *pThreadContext = NULL;

+

+    pThreadContext = (ThreadContext *)zOss_GetCurThreadID();

+

+    if (pThreadContext == NULL)

+    {

+        return;

+    }

+

+    /* ´ÓÏß³ÌÁбíÖÐÒÆ³ý, ²¢ÊͷŸÃÏß³ÌÉÏÏÂÎÄ */

+    zOss_GetMutex(gThreadListMutex, ZOSS_WAIT_FOREVER);

+    zOss_ListDelete(&gThreadList, (T_ZOss_Node*)pThreadContext);

+    zOss_PutMutex(gThreadListMutex);

+    zOss_Free((VOID *)pThreadContext->msgQueue);

+    zOss_Free((VOID *)pThreadContext);

+    gThreadCount--;

+

+    ExitThread(0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SuspendThread

+* ¹¦ÄÜÃèÊö£º ×èÈûÏß³Ì

+* ²ÎÊý˵Ã÷£º (IN)

+             thread_id:×èÈûÏ̵߳ÄID

+             (OUT)

+* ·µ »Ø Öµ£º ×èÈû³É¹¦·µ»ØZOSS_SUCCESS£¬·ñÔòZOSS_ERROR

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 zOss_SuspendThread(ZOSS_THREAD_ID thread_id)

+{

+    ThreadContext   *pThreadContext = NULL;

+    DWORD           result          = 0;

+

+    zOss_AssertEx(NULL != thread_id, ZOSS_ERROR);

+    

+    if (ZOSS_SUCCESS != OSA_IdentifyThread(thread_id))

+    {

+        return ZOSS_ERROR;

+    }

+

+    pThreadContext = (ThreadContext *)thread_id;

+

+    /* ×èÈûÏß³Ì */

+    result = SuspendThread(pThreadContext->thread_handle);

+

+    if (result == (DWORD)-1)

+    {

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        return ZOSS_SUCCESS;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_ResumeThread

+* ¹¦ÄÜÃèÊö£º »Ö¸´Ïß³Ì

+* ²ÎÊý˵Ã÷£º (IN)

+             thread_id: ´ý»Ö¸´Ï̵߳ÄID

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS,·ñÔòZOSS_ERROR

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 zOss_ResumeThread(ZOSS_THREAD_ID thread_id)

+{

+    ThreadContext   *pThreadContext = NULL;

+    DWORD           result          = 0;

+

+    zOss_AssertEx(NULL != thread_id, ZOSS_ERROR);

+    

+    if (ZOSS_SUCCESS != OSA_IdentifyThread(thread_id))

+    {

+        return ZOSS_ERROR;

+    }

+

+    pThreadContext  = (ThreadContext *)thread_id;

+    result          = ResumeThread(pThreadContext->thread_handle);

+

+    if (result == (DWORD)-1)

+    {

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        return ZOSS_SUCCESS;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_Sleep

+* ¹¦ÄÜÃèÊö£º ʹÏß³Ì˯ÃßÒ»¶Îʱ¼ä

+* ²ÎÊý˵Ã÷£º (IN)

+             time_in_ms: Ïß³Ì˯Ãßʱ¼ä,µ¥Î»ÎªºÁÃë

+             (OUT)

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+VOID zOss_Sleep(UINT32 time_in_ms)

+{

+    Sleep(time_in_ms);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_DeleteThread

+* ¹¦ÄÜÃèÊö£º ɾ³ýÏß³Ì,Ç¿ÖÆ¹Ø±ÕÕýÔÚÔËÐеÄÏß³Ì

+* ²ÎÊý˵Ã÷£º (IN)

+             thread_id: ½«Òª±»É¾³ýÏ̵߳ÄID;

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 zOss_DeleteThread(ZOSS_THREAD_ID thread_id)

+{

+    ThreadContext   *pThreadContext = NULL;

+    HANDLE          handle          = NULL;

+

+    zOss_AssertEx(NULL != thread_id, ZOSS_ERROR);

+

+    if (ZOSS_SUCCESS != OSA_IdentifyThread(thread_id))

+    {

+        return ZOSS_ERROR;

+    }

+

+    /* Èç¹ûɾ³ýµÄÏß³ÌÊǵ±Ç°Ï̵߳÷Óà zOss_ExitThread ɾ³ý */

+    if (thread_id == zOss_GetCurThreadID())

+    {

+        zOss_ExitThread();

+        return ZOSS_SUCCESS;

+    }

+

+    pThreadContext  = (ThreadContext *)thread_id;

+    handle          = pThreadContext->thread_handle;

+

+    /* ½áÊøÏß³ÌÔËÐÐ */

+    if (0 != TerminateThread(handle, 0))

+    {

+        CloseHandle(handle);

+        /* ´ÓÏß³ÌÁбíÖÐÒÆ³ý, ²¢ÊͷŸÃÏ߳̿ØÖÆ¿é */

+        zOss_GetMutex(gThreadListMutex, ZOSS_WAIT_FOREVER);

+        zOss_ListDelete(&gThreadList, (T_ZOss_Node*)pThreadContext);

+        zOss_PutMutex(gThreadListMutex);

+        zOss_QueueDelete((VOID *)pThreadContext->msgQueue);

+        zOss_Free((VOID *)pThreadContext);

+        gThreadCount--;

+

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetCurThreadID

+* ¹¦ÄÜÃèÊö£º »ñÈ¡µ±Ç°Ï̵߳ÄID

+* ²ÎÊý˵Ã÷£º (IN)

+             (OUT)

+* ·µ »Ø Öµ£º µ±Ç°Ï̵߳ÄID

+* ÆäËü˵Ã÷£º ¶ÔÓÚʹÓÃzOss_CreateThread½Ó¿Ú´´½¨µÄÏß³Ì,ÓÃÕâ¸ö

+             ½Ó¿Ú»ñÈ¡µ±Ç°Ïß³Ì ID²ÅÄܳɹ¦,·ñÔòʧ°Ü,·µ»ØNULL

+**************************************************************************/

+ZOSS_THREAD_ID zOss_GetCurThreadID(VOID)

+{

+    ThreadContext   *pThreadContext = NULL;

+    SINT32          thread_real_id  = 0;

+

+    thread_real_id  = (SINT32)GetCurrentThreadId();

+    pThreadContext  = OSA_GetThreadContext(thread_real_id);

+

+    return (ZOSS_THREAD_ID)pThreadContext;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetThreadIDByName

+* ¹¦ÄÜÃèÊö£º ¸ù¾ÝÏß³ÌÃû³Æ»ñÈ¡Ïß³ÌID

+* ²ÎÊý˵Ã÷£º (IN)

+             thread_name: Ïß³ÌÃû³Æ

+             (OUT)

+* ·µ »Ø Öµ£º Ï̵߳ÄID

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+ZOSS_THREAD_ID zOss_GetThreadIDByName (const CHAR *thread_name)

+{

+    T_ZOss_Node     *pCurNode   = NULL;

+    ThreadContext   *pCurThread = NULL;

+

+    zOss_AssertEx(NULL != thread_name, ZOSS_INVALID_THREAD_ID);

+    

+    zOss_GetMutex(gThreadListMutex, ZOSS_WAIT_FOREVER);

+    pCurNode = zOss_ListFirst(&gThreadList);

+

+    while (pCurNode != NULL)

+    {

+        pCurThread = (ThreadContext *)pCurNode;

+

+        if (strcmp(pCurThread->thread_name, thread_name) == 0)

+        {

+            zOss_PutMutex(gThreadListMutex);

+            return (ZOSS_THREAD_ID)pCurThread;

+        }

+

+        pCurNode = zOss_ListNext(pCurNode);

+    }

+

+    zOss_PutMutex(gThreadListMutex);

+

+    return ZOSS_INVALID_THREAD_ID;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetThreadInfo

+* ¹¦ÄÜÃèÊö£º ¸ù¾ÝÏß³ÌID»ñÈ¡Ïß³ÌÏêϸÐÅÏ¢

+* ²ÎÊý˵Ã÷£º (IN)

+             thread_id:    Ïß³ÌID

+             (OUT)

+             thread_name:  Ïß³ÌÃû³ÆÖ¸Õë,ÓÉÓû§·ÖÅä¿Õ¼ä,¿ÉÒÔΪ¿Õ

+             stat:         Ï̵߳Ä״̬,¿ÉÒÔΪ¿Õ

+             priority:     Ï̵߳ÄÓÅÏȼ¶¿ÉÒÔΪ¿Õ

+             preempt:      ±íʾµ±Ç°Ïß³ÌÊÇ·ñÔÊÐíͬÓÅÏȼ¶ÇÀÕ¼¿ÉÒÔΪ¿Õ

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º windowsƽ̨µÄÌØÊâ˵Ã÷£º1.stat²ÎÊýÎÞЧ

+**************************************************************************/

+UINT32 zOss_GetThreadInfo(ZOSS_THREAD_ID thread_id,

+                          CHAR           *thread_name,

+                          UINT32         *state,

+                          UINT32         *priority,

+                          UINT32         *preempt)

+{

+    ThreadContext *pThreadContext = NULL;

+    

+    zOss_AssertEx(NULL != thread_id, ZOSS_ERROR);

+    

+    if (ZOSS_SUCCESS != OSA_IdentifyThread(thread_id))

+    {

+        return ZOSS_ERROR;

+    }

+

+    pThreadContext = (ThreadContext *)thread_id;

+

+    if (thread_name != NULL)

+    {

+        strcpy(thread_name, pThreadContext->thread_name);

+    }

+

+    if (priority != NULL)

+    {

+        *priority = pThreadContext->priority;

+    }

+

+    if (preempt != NULL)

+    {

+        *preempt = pThreadContext->preempt;

+    }

+

+    if (state != NULL)

+    {

+        *state = ZOSS_OS_BLOCK;

+    }

+

+    return ZOSS_SUCCESS;

+}

+

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetThreadPri

+* ¹¦ÄÜÃèÊö£º ÉèÖÃÏß³ÌÓÅÏȼ¶

+* ²ÎÊý˵Ã÷£º (IN)

+             thread_id: Ïß³ÌID

+             priority:  ÓÅÏȼ¶,0-31,¾ßÌå˵Ã÷¼ûZOSS_CreateThreadµÄ˵Ã÷

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 zOss_SetThreadPri(ZOSS_THREAD_ID thread_id, UINT32 priority)

+{

+    ThreadContext   *pThreadContext = NULL;

+    SINT32          winPriority     = -1;

+

+    zOss_AssertEx(NULL != thread_id && priority <= 31, ZOSS_ERROR);

+

+    if (ZOSS_SUCCESS != OSA_IdentifyThread(thread_id))

+    {

+        return ZOSS_ERROR;

+    }

+

+    pThreadContext = (ThreadContext *)thread_id;

+

+    /* ÉèÖÃÏß³ÌÓÅÏȼ¶ */

+    if (priority <= 3)

+    {

+        winPriority = THREAD_PRIORITY_TIME_CRITICAL;

+    }

+    else if ((priority >= 4)&&(priority <= 7))

+    {

+        winPriority = THREAD_PRIORITY_HIGHEST;

+    }

+    else if ((priority >= 8)&&(priority <= 12))

+    {

+        winPriority = THREAD_PRIORITY_ABOVE_NORMAL;

+    }

+    else if ((priority >= 13)&&(priority <= 17))

+    {

+        winPriority = THREAD_PRIORITY_NORMAL ;

+    }

+    else if ((priority >= 18)&&(priority <= 22))

+    {

+        winPriority = THREAD_PRIORITY_BELOW_NORMAL;

+    }

+    else if ((priority >= 23)&&(priority <= 26))

+    {

+        winPriority = THREAD_PRIORITY_LOWEST;

+    }

+    else if ((priority >= 27)&&(priority <= 31))

+    {

+        winPriority = THREAD_PRIORITY_IDLE;

+    }

+

+    pThreadContext->priority = priority;

+

+    if (0 != SetThreadPriority(pThreadContext->thread_handle, winPriority))

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetThreadPri

+* ¹¦ÄÜÃèÊö£º »ñÈ¡Ïß³ÌÓÅÏȼ¶

+* ²ÎÊý˵Ã÷£º (IN)

+             thread_id: Ïß³ÌID

+             (OUT)

+             priority: µÃµ½µÄÓÅÏȼ¶

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 zOss_GetThreadPri(ZOSS_THREAD_ID thread_id, UINT32 *priority)

+{

+    ThreadContext *pThreadContext = NULL;

+

+    zOss_AssertEx(NULL != priority && NULL != thread_id, ZOSS_ERROR);

+    

+    if (ZOSS_SUCCESS != OSA_IdentifyThread(thread_id))

+    {

+        return ZOSS_ERROR;

+    }

+

+    pThreadContext  = (ThreadContext *)thread_id;

+    *priority       = pThreadContext->priority;

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÑéÖ¤Ò»¸öÏß³ÌÊÇ·ñÓÐЧ

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  thread_id:  ´ýÑéÖ¤µÄÏß³Ìid

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     ÈôÏß³ÌÓÐЧ£¬·µ»ØZOSS_SUCCESS£»·ñÔòϵͳ¶ÏÑÔ

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+UINT32 zOss_IdentifyThread(ZOSS_THREAD_ID threadID)

+{

+    return OSA_IdentifyThread(threadID);

+}

+

+/*****************************************************************************

+*                               ÏûϢͨѶ

+******************************************************************************/

+/*****************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SendMsg

+* ¹¦ÄÜÃèÊö£º ·¢ËÍÏûÏ¢

+* ²ÎÊý˵Ã÷£º (IN)

+             thread_id:  ·¢ÍùµÄÏß³ÌID

+             msg_ptr:    ÏûÏ¢µØÖ·Ö¸Õë

+             size:       ´ý·¢ËÍÊý¾Ýʵ¼ÊËùÕ¼×Ö½ÚÊý

+             timeout:    ÏûÏ¢·¢Ë͵ȴýʱ¼ä£¬µ¥Î»ÎªºÁÃë,ʱ¼äµ½,

+                         ²»¹Ü·¢Ëͳɹ¦Óë·ñ¶¼·µ»Ø.

+                         ZOSS_NO_WAIT:Ϊ²»¹Ü·¢Ëͳɹ¦Óë·ñÁ¢¿Ì·µ»Ø,

+                         ZOSS_WAIT_FOREVER:Ò»Ö±µÈ´ý,Ö±µ½·¢ËÍ³É ¹¦²Å·µ»Ø

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR.

+* ÆäËü˵Ã÷£º ÎÞ

+*****************************************************************************/

+UINT32 zOss_SendMsg(ZOSS_THREAD_ID thread_id, VOID *msg_ptr, UINT32 size, UINT32 timeout)

+{

+    UINT32          result      = 0 ;

+    ThreadContext   *tmpContext = NULL;

+    T_Osa_Signal    osasig      = {0};

+

+    zOss_AssertEx(NULL != msg_ptr && NULL != thread_id, ZOSS_ERROR);

+    

+    if (ZOSS_SUCCESS != OSA_IdentifyThread(thread_id))

+    {

+        return ZOSS_ERROR;

+    }

+

+    tmpContext      = (ThreadContext *)thread_id;

+    osasig.sig_no   = SIGNAL_MSG_NUMBER;                  /* ½«·ÖÅäµÄsigalÖ¸Õëת»¯³É×Ô¶¨Òå ±ê×¼signalÀàÐÍ */

+    osasig.msg_ptr  = msg_ptr;

+    osasig.size     = size;                               /* ʵ¼ÊÏûÏ¢µÄ³¤¶È */

+    result          = zOss_QueueSend(tmpContext->msgQueue, &osasig, sizeof(T_Osa_Signal), timeout,

+                                    ZOSS_QUEUE_MSG_PRI_NORMAL);

+    return result;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_RecvMsg

+* ¹¦ÄÜÃèÊö£º ½ÓÊÕÏûÏ¢

+* ²ÎÊý˵Ã÷£º (IN)

+             msg_ptr: ·µ»ØµÄÏûÏ¢Ö¸Õë

+             size:    ·µ»ØµÄÏûÏ¢´óС,µ¥Î»Îª×Ö½Ú

+             timeout: ½ÓÊյȴýʱ¼ä,µ¥Î»ÎªºÁÃ룬ʱ¼äµ½,²»¹Ü

+                      ½ÓÊճɹ¦Óë·ñ¶¼·µ»Ø,

+                      ZOSS_NO_WAIT:²»¹Ü½ÓÊճɹ¦Óë·ñÁ¢¿Ì·µ»Ø,

+                      ZOSS_WAIT_FOREVER:Ò»Ö±µÈ´ý,Ö±µ½½ÓÊճɹ¦²Å·µ»Ø

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR.

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 zOss_RecvMsg(VOID**msg_ptr, UINT32 *size, UINT32 timeout)

+{

+    UINT32          result      = 0;

+    T_Osa_Signal    osasig      = {0};

+    ThreadContext   *tmpContext = NULL;

+

+    zOss_AssertEx(NULL != msg_ptr && NULL != size, ZOSS_ERROR);

+    

+    tmpContext = (ThreadContext *)zOss_GetCurThreadID();

+

+    if (tmpContext == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+

+    result = zOss_QueueRecv(tmpContext->msgQueue, &osasig, sizeof(T_Osa_Signal), timeout);

+

+    if (result == sizeof(T_Osa_Signal))

+    {

+        *msg_ptr    = osasig.msg_ptr;

+        *size       = osasig.size;              /* ʵ¼ÊÏûÏ¢µÄ³¤¶È */

+        result      = ZOSS_SUCCESS;

+    }

+    else

+    {

+        result = ZOSS_ERROR;

+    }

+

+    return result;

+}

+

+VOID* zOss_ThreadGetMsgBuf(UINT32 size)

+{

+    T_THREAD_MSG_HEAD *p_msg_head = NULL;

+    

+    zOss_AssertEx(0 != size, NULL);

+    

+    p_msg_head = (T_THREAD_MSG_HEAD *)zOss_GetUB(THREAD_MSG_SIZE(size));

+    zOss_AssertEx(NULL != p_msg_head, NULL);

+

+    p_msg_head->magic = THREAD_MSG_MAGIC;

+

+    return THREAD_MSG_BUF(p_msg_head);

+}

+

+VOID zOss_ThreadRetMsgBuf(VOID *p_buf)

+{

+    T_THREAD_MSG_HEAD   *p_msg_head = NULL;

+    

+    zOss_AssertExN(NULL != p_buf);

+    p_msg_head = THREAD_MSG_HEAD(p_buf);

+    zOss_RetUB(p_msg_head);

+}

+

+UINT32 zOss_ThreadSendMsg(UINT32 msg_id, VOID *p_buf, UINT16 buf_size, ZOSS_THREAD_ID thread_id)

+{

+    T_THREAD_MSG_HEAD   *p_msg_head = NULL;

+    UINT32              ret         = 0;

+

+    ret = OSA_IdentifyThread(thread_id);

+    zOss_AssertEx(ret == ZOSS_SUCCESS, ZOSS_ERROR);

+

+    if (ZOSS_SETHOOKFLAG_INTER == proc_msg_hook(msg_id, p_buf, buf_size, thread_id))

+    {

+        if (NULL != p_buf)

+        {

+            zOss_ThreadRetMsgBuf(p_buf);

+        }

+        return ZOSS_SUCCESS;

+    }

+

+    if ((NULL == p_buf) || (0 == buf_size))

+    {

+        buf_size = 0;   /* make sure the bufer size is zero */

+

+        /* for emtpy message, buffer should be alloced by ourself */

+        p_msg_head = (T_THREAD_MSG_HEAD *)zOss_GetUB(THREAD_MSG_SIZE(0));

+        zOss_AssertEx(NULL != p_msg_head, ZOSS_ERROR);

+        p_msg_head->magic   = THREAD_MSG_MAGIC;

+    }

+    else

+    {

+        p_msg_head = THREAD_MSG_HEAD(p_buf);

+        zOss_AssertEx(THREAD_MSG_MAGIC == p_msg_head->magic, ZOSS_ERROR);

+    }

+    p_msg_head->id          = msg_id;

+    p_msg_head->buf_size    = buf_size;

+

+    ret = zOss_SendMsg(thread_id, p_msg_head, THREAD_MSG_SIZE(buf_size), ZOSS_WAIT_FOREVER);

+    zOss_AssertEx(ZOSS_SUCCESS == ret, ZOSS_ERROR);

+

+    return ZOSS_SUCCESS;

+}

+

+UINT32 zOss_ThreadRecvMsg(UINT32 *p_msg_id, VOID **p_buf, UINT32 *p_buf_size, UINT32 timeout)

+{

+    T_THREAD_MSG_HEAD   *p_msg_head = NULL;

+    UINT32              msg_size    = 0;

+    UINT32              ret         = 0;

+

+    zOss_AssertEx((NULL != p_msg_id) && (NULL != p_buf) && (NULL != p_buf_size), ZOSS_ERROR);

+

+    ret = zOss_RecvMsg((void **)&p_msg_head, &msg_size, timeout);

+    zOss_AssertEx( ZOSS_SUCCESS == ret, ZOSS_ERROR);

+    zOss_AssertEx( THREAD_MSG_MAGIC == p_msg_head->magic, ZOSS_ERROR);

+

+    *p_msg_id   = p_msg_head->id;

+    *p_buf_size = p_msg_head->buf_size;

+    if (0 == p_msg_head->buf_size)

+    {

+        *p_buf  = NULL;

+        /* for empty message, buffer is alloced by ourself */

+        zOss_RetUB(p_msg_head);

+    }

+    else

+    {

+        *p_buf = THREAD_MSG_BUF(p_msg_head);

+    }

+

+    return ZOSS_SUCCESS;

+}

+

+UINT32 zOss_RegThreadMsgHook(ZOSS_THREAD_ID thread_id, UINT8 type, UINT8 dire, THREAD_MSG_HOOK func)

+{

+    THREAD_MSG_HOOK_CONTENT *p_content  = NULL;

+    UINT32                  ret         = 0;

+

+    ret = OSA_IdentifyThread(thread_id);

+    zOss_AssertEx(((ZOSS_SUCCESS == ret) && (THREAD_MSG_HOOK_TYPE_MAX >= type)

+                    && (THREAD_MSG_HOOK_DIRE_MAX >= dire) && (NULL != func)), ZOSS_ERROR);

+    

+    p_content = find_thread_content(thread_id);

+    if (NULL == p_content)

+    {

+        p_content = (THREAD_MSG_HOOK_CONTENT *)zOss_Malloc( sizeof(THREAD_MSG_HOOK_CONTENT));

+        zOss_Memset(p_content, 0, sizeof(THREAD_MSG_HOOK_CONTENT));

+        p_content->thread_id = thread_id;

+        zOss_ListAdd(&s_thread_msg_hook_list, (T_ZOss_Node *)p_content);

+    }

+

+    p_content->dire[type-1] = dire;

+    p_content->func[type-1] = func;

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_CreateSemaphore

+* ¹¦ÄÜÃèÊö£º ´´½¨¼ÆÊýÐźÅÁ¿

+* ²ÎÊý˵Ã÷£º (IN)

+             name_ptr:      ¼ÆÊýÐźÅÁ¿Ãû³Æ×Ö·û´®Ö¸Õë,Ãû³Æ³¤¶È²»¿É³¬¹ýMAX_SEMNAME_LEN

+             initial_count: ¼ÆÊýÐźÅÁ¿¿É¹²Ïí·ÃÎʵÄÊýÁ¿

+* ·µ »Ø Öµ£º Èç¹û´´½¨³É¹¦£¬·µ»Ø¼ÆÊýÐźÅÁ¿Ö¸Õ룻·ñÔò£¬·µ»ØZOSS_NULL

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+ZOSS_SEMAPHORE_ID zOss_CreateSemaphore(const CHAR *name_ptr, UINT32 initial_count)

+{

+    T_SemContext    *semContext = NULL;

+    UINT32          name_len    = 0;

+

+    if (name_ptr)

+    {

+        name_ptr = name_ptr;

+    }

+    

+    semContext = (T_SemContext *)zOss_Malloc(sizeof(T_SemContext));

+

+    if (NULL == semContext)

+    {

+        return NULL;

+    }

+

+    semContext->semID = CreateSemaphore(NULL, (SINT32)initial_count, MAX_SEM_CNTS,NULL);

+

+    if (NULL == semContext->semID)

+    {

+        zOss_Free(semContext);

+        semContext = NULL;

+        return NULL;

+    }

+

+    semContext->semCount = (SINT32)initial_count;

+    return (ZOSS_SEMAPHORE_ID)semContext;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetSemaphore

+* ¹¦ÄÜÃèÊö£º »ñÈ¡ÐźÅÁ¿

+* ²ÎÊý˵Ã÷£º (IN)

+             sem_id:   ÒѾ­´´½¨ºÃµÄ¼ÆÊýÐźÅÁ¿ID

+             timeout:  ZOSS_NO_WAIT±íʾ²»¹Ü»ñÈ¡ÊÇ·ñ³É¹¦,Á¢¼´·µ»Ø

+                       ZOSS_WAIT_FOREVER±íʾһֱ»ñÈ¡ÐźÅÁ¿,Ö±µ½³É¹¦

+                       »ñÈ¡ÐźÅÁ¿µÄµÈ´ýʱ¼ä,ʱ¼äµ½,²»¹Ü»ñÈ¡³É¹¦Óë·ñ¶¼·µ»Ø,

+                       µ¥Î»ºÁÃë¡£

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR.

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 zOss_GetSemaphore(ZOSS_SEMAPHORE_ID sem_id, UINT32 timeout)

+{

+    UINT32          dwWaitResult = 0;

+    T_SemContext    *semContext  = NULL;

+

+    zOss_AssertEx(NULL != sem_id, ZOSS_ERROR);

+    

+    semContext = (T_SemContext *)sem_id;

+

+    if (timeout == ZOSS_NO_WAIT)

+    {

+        dwWaitResult = WaitForSingleObject(semContext->semID, 0);

+    }

+    else if (timeout == ZOSS_WAIT_FOREVER)

+    {

+        dwWaitResult = WaitForSingleObject(semContext->semID, INFINITE);

+    }

+    else

+    {

+        dwWaitResult = WaitForSingleObject(semContext->semID, timeout);

+    }

+

+    switch (dwWaitResult)

+    {

+        case WAIT_OBJECT_0:

+        {

+            semContext->semCount--;

+            return ZOSS_SUCCESS;

+        }

+        case WAIT_TIMEOUT:

+        {

+            return ZOSS_ERROR;

+        }

+        case WAIT_ABANDONED:

+        {

+            return ZOSS_ERROR;

+        }

+        default:

+        {

+            return ZOSS_ERROR;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_PutSemaphore

+* ¹¦ÄÜÃèÊö£º ÊÍ·ÅÐźÅÁ¿

+* ²ÎÊý˵Ã÷£º (IN)

+             sem_id:½«ÒªÊͷŵļÆÊýÐźÅÁ¿ID

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR.

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 zOss_PutSemaphore(ZOSS_SEMAPHORE_ID sem_id)

+{

+    BOOL            result      = FALSE;

+    T_SemContext    *semContext = NULL;

+

+    zOss_AssertEx(NULL != sem_id, ZOSS_ERROR);

+    

+    semContext = (T_SemContext *)sem_id;

+    semContext->semCount++;                                 /* ÏÈǰֵ+1         */

+    result = ReleaseSemaphore(semContext->semID, 1, NULL);  /* ·µ»ØÖµÊ±´æÔÚ¾ºÕù */

+

+    if (result)

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        semContext->semCount--; /* »¹Ô­ÏÈǰֵ */

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_DeleteSemaphore

+* ¹¦ÄÜÃèÊö£º ɾ³ýÐźÅÁ¿

+* ²ÎÊý˵Ã÷£º (IN)

+             sem_id:½«ÒªÉ¾³ýµÄ¼ÆÊýÐźÅÁ¿¾ä±ú

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR.

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_DeleteSemaphore(ZOSS_SEMAPHORE_ID sem_id)

+{

+    T_SemContext    *semContext = NULL;

+    BOOL            status      = FALSE;

+

+    zOss_AssertEx(NULL != sem_id, ZOSS_ERROR);

+    

+    semContext  = (T_SemContext *) sem_id;

+    status      = CloseHandle(semContext->semID);

+

+    if (TRUE == status)

+    {

+        zOss_Free(sem_id);

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  zOss_GetSemaphoreCount

+* ¹¦ÄÜÃèÊö: »ñÈ¡ÐźÅÁ¿¼ÆÊýÖµ

+* ²ÎÊý˵Ã÷: (IN)

+            sem_id:ÐźÅÁ¿ID

+* ·µ »Ø Öµ: ³É¹¦, ·µ»Øµ±Ç°¼ÆÊýÖµ; ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 zOss_GetSemaphoreCount(ZOSS_SEMAPHORE_ID sem_id)

+{

+    T_SemContext    *semContext = NULL;

+    UINT32          semCount    = 0;

+    BOOL            result      = FALSE;

+    DWORD           dwFlags     = 0;

+

+    zOss_AssertEx(NULL != sem_id, ZOSS_ERROR);

+    

+    semContext  = (T_SemContext *)sem_id;

+    result      = GetHandleInformation(semContext->semID, &dwFlags);     /* ÅжÏÊÇ·ñΪÓÐЧID */

+

+    if (result)                                                          /* ³É¹¦ */

+    {

+        semCount = (UINT32)(semContext->semCount);

+    }

+    else

+    {

+        semCount = ZOSS_ERROR;

+    }

+

+    return semCount;

+}

+

+/**************************************************************************

+*                            »¥³âÐźÅÁ¿

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_CreateMutex

+* ¹¦ÄÜÃèÊö£º ´´½¨Ò»¸ö»¥³âÐźÅÁ¿

+* ²ÎÊý˵Ã÷£º

+             (IN)

+             name_ptr:         ½«Òª´´½¨µÄ»¥³âÐźÅÁ¿Ãû³Æ,³¤¶È²»¿É´óÓÚ

+                                MAX_MUTEXNAME_LEN

+             priority_inherit: ÊÇ·ñÖ§³ÖÓÅÏȼ¶¼Ì³Ð(Õâ¸ö²ÎÊýÎÞЧ)

+                                ZOSS_INHERIT    ±íʾ֧³ÖÓÅÏȼ¶¼Ì³Ð

+                                OSS_NO_INHERIT  ±íʾ²»Ö§³ÖÓÅÏȼ¶¼Ì³Ð

+             (OUT)

+* ·µ »Ø Öµ£º ·µ»Ø»¥³âÐźÅÁ¿Ö¸Õë

+* ÆäËü˵Ã÷£º priority_inherit Õâ¸ö²ÎÊýÔÚwindowsƽ̨ÏÂÎÞЧ

+**************************************************************************/

+ZOSS_MUTEX_ID zOss_CreateMutex(const CHAR *name_ptr, UINT32 priority_inherit)

+{

+    HANDLE handle = 0;

+    

+    if (name_ptr)

+    {

+        name_ptr = name_ptr;

+    }

+

+    handle = CreateMutex(NULL, FALSE, NULL);

+

+    return (ZOSS_MUTEX_ID) handle;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetMutex

+* ¹¦ÄÜÃèÊö£º »ñȡһ»¥³âÐźÅÁ¿

+* ²ÎÊý˵Ã÷£º (IN)

+             mutex_id:  »¥³âÐźÅÁ¿ID

+             timeout:   »ñÈ¡³¬Ê±Ê±¼ä,µ¥Î»ºÁÃë

+                        Èç¹ûΪZOSS_NO_WAIT,²»¹Ü»ñÈ¡ÊÇ·ñ³É¹¦,Á¢¼´·µ»Ø

+                        ZOSS_WAIT_FOREVER±íʾһֱ»ñȡʼþ,Ö±µ½³É¹¦

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR.

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 zOss_GetMutex(ZOSS_MUTEX_ID mutex_id, UINT32 timeout)

+{

+    UINT32  dwWaitResult    = 0;

+    UINT32  status          = 0;

+

+    zOss_AssertEx(NULL != mutex_id, ZOSS_ERROR);

+    

+    if (timeout==ZOSS_NO_WAIT)

+    {

+        timeout = 0;

+    }

+    else if (timeout == ZOSS_WAIT_FOREVER)

+    {

+        timeout = INFINITE;

+    }

+

+    dwWaitResult = WaitForSingleObject(mutex_id, timeout);

+

+    switch (dwWaitResult)

+    {

+    case WAIT_OBJECT_0:

+        {

+            status = ZOSS_SUCCESS;

+            break;

+        }

+    case WAIT_TIMEOUT:

+        {

+            status = ZOSS_ERROR;

+            break;

+        }

+            /* The specified object is a mutex object that was not released by the thread that owned the

+              mutex object before the owning thread terminated. Ownership of the mutex object is granted

+             to the calling thread, and the mutex is set to nonsignaled. */

+    case WAIT_ABANDONED:

+        {

+            dwWaitResult = WaitForSingleObject(mutex_id, timeout);/* ÔٴλñÈ¡£¬Åжϻ¥³âÌåÊÇ·ñÓÐЧ */

+

+            if (WAIT_FAILED == dwWaitResult)

+            {

+                status = ZOSS_ERROR;

+            }

+            else if (WAIT_OBJECT_0 == dwWaitResult)

+            {

+                if (ReleaseMutex(mutex_id) != 0)

+                {

+                    status = ZOSS_SUCCESS;

+                }

+                else

+                {

+                    status = ZOSS_ERROR;

+                }

+            }

+            else

+            {

+                status = ZOSS_ERROR;

+            }

+

+            break;

+        }

+    case WAIT_FAILED:

+        {

+            status =  ZOSS_ERROR;

+            break;

+        }

+    default:

+        {

+            status =  ZOSS_ERROR;

+            break;

+        }

+    }

+

+    return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_PutMutex

+* ¹¦ÄÜÃèÊö£º ÊÍ·ÅÒ»¸ö»¥³âÐźÅÁ¿£¬±ØÐëºÍ»ñÈ¡»¥³âÐźÅÁ¿ zOss_GetMutex()³É¶ÔʹÓã¬

+             ͬһ¸öÏ߳̿ÉÒÔ¶à´Îµ÷Óøú¯Êý¡£

+* ²ÎÊý˵Ã÷£º (IN)

+             mutex_id: »¥³âÐźÅÁ¿µÄID

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR.

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 zOss_PutMutex(ZOSS_MUTEX_ID mutex_id)

+{

+    zOss_AssertEx(NULL != mutex_id, ZOSS_ERROR);

+    

+    if (ReleaseMutex(mutex_id))

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_DeleteMutex

+* ¹¦ÄÜÃèÊö£º ɾ³ýÒ»¸ö»¥³âÐźÅÁ¿

+* ²ÎÊý˵Ã÷£º (IN)

+             mutex_id: »¥³âÐźÅÁ¿µÄID

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦:ZOSS_SUCCESS;ʧ°Ü:ZOSS_ERROR

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 zOss_DeleteMutex(ZOSS_MUTEX_ID mutex_id)

+{    

+    zOss_AssertEx(NULL != mutex_id, ZOSS_ERROR);

+

+    if (CloseHandle(mutex_id))

+    {

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetTickCount

+* ¹¦ÄÜÃèÊö£º »ñµÃϵͳ¼Óµçºóµ½µ±Ç°µÄtickÊý

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º tickÊý

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 zOss_GetTickCount(VOID)

+{

+    return (UINT32)GetTickCount();

+}

+

+/*************************************************************************

+* ¹¦ÄÜÃèÊö:  ³õʼ»¯¸ú×ÙÏ̺߳¯ÊýµÄ±ê־λ

+* ²ÎÊý˵Ã÷:     

+*            (´«Èë²ÎÊý)  void

+*            (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:  void

+* ÆäËü˵Ã÷:  void

+**************************************************************************/

+void zOss_TraceFuncInit(void)

+{

+

+}

+

+/*************************************************************************

+* ¹¦ÄÜÃèÊö:  ͳ¼Æ¸ú×Ùº¯ÊýÄ£¿éµÄ¼Ç¼ÐÅÏ¢

+* ²ÎÊý˵Ã÷:     

+*            (´«Èë²ÎÊý)  func_name:  º¯ÊýÃû³Æ£¬Èç¹ûΪ¿Õ£¬±íʾͳ¼ÆËùÓб»¸ú×Ùº¯ÊýµÄ¼Ç¼ÐÅÏ¢£¬

+                                     ·Ç¿ÕÔò±íʾͳ¼ÆÖ¸¶¨º¯ÊýµÄ¸ú×ÙÐÅÏ¢.

+*            (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:  void

+* ÆäËü˵Ã÷:  void

+**************************************************************************/

+void zOss_TraceFuncInfo(CHAR *func_name)

+{

+

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_GetThreadUserArea

+* ¹¦ÄÜÃèÊö: ÏÔʾÏß³ÌÏêϸÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)	

+            thread_id:Ïß³ÌID

+* ·µ »Ø Öµ: ³É¹¦:Ïß³ÌÓû§¿Õ¼äÖ¸Õë;ʧ°Ü:¿Õ

+* ÆäËü˵Ã÷: ÔÚÏß³ÌÇл»hookº¯ÊýÖУ¬bupdateÖ»ÄÜΪFALSE,Ïß³ÌID²»½ø

+            ÐÐÓÐЧÐÔÅжÏ

+**************************************************************************/ 

+T_ZOsa_ThreadUserArea* Osa_GetThreadUserArea(ZOSS_THREAD_ID thread_id, BOOL bupdate)

+{

+    ThreadContext           *tc     = NULL;

+    T_ZOsa_ThreadUserArea   *ua     = NULL;

+    UINT32                  temp    = 0;

+    FILETIME                CreationTime;

+    FILETIME                ExitTime;

+    FILETIME                KernelTime;

+    FILETIME                UserTime;  

+  

+    zOss_AssertEx(NULL != thread_id, NULL);

+    

+    tc = (ThreadContext *)thread_id;

+

+    if (thread_id != tc->ua.threadid)

+    {

+        return NULL;

+    }

+

+    if (!bupdate)

+    {

+        return &(tc->ua);

+    }

+

+    ua = &(tc->ua);

+    ua->priority = (UINT8)tc->priority;

+

+    if (ua->topstack == 0)

+    {

+        strncpy((char *)ua->threadname, tc->thread_name, 16);

+        ua->threadname[15]  = 0;

+        ua->topstack        = 0;

+        ua->stacksize       = 0;

+        ua->threadid        = thread_id;

+    }

+

+    ua->msgnum = (UINT32)tc->msgQueue->queue_list.count;

+

+    /* ¼ÆËãÏß³ÌÔËÐÐʱ¼ä */

+    GetThreadTimes(tc->thread_handle, &CreationTime,&ExitTime, &KernelTime, &UserTime);

+    temp = (UINT32)((((ULARGE_INTEGER*)&KernelTime)->QuadPart + ((ULARGE_INTEGER *)&UserTime)->QuadPart)

+                    / 10000);

+    ua->runtime     += temp - ua->cputime;

+    ua->cputime     = temp;

+    ua->RunTimeInMs = (UINT32)(ua->runtime / (gOsa_SysCpuFreq / 1000));

+

+    /* ¼ÆËãÏß³ÌÔËÐдÎÊý         */

+

+    /* ¼ÆËã¶ÑÕ»×î´óʹÓÃÂÊ,´ý¸Ä  */

+    ua->maxstack    = 0;

+    ua->runstatus   = ZOSS_OS_BLOCK;

+    return ua;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_SwapCtl

+* ¹¦ÄÜÃèÊö: 

+* ²ÎÊý˵Ã÷: (IN):

+* ·µ »Ø Öµ:  ³É¹¦:task_id;ʧ°Ü:NULL

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+VOID Osa_SwapCtl(BOOL enableRunTime)

+{

+    UINT32          count   = 0;

+    UINT32          i       = 0;

+    ThreadContext   *pTcb   = NULL;

+

+    pTcb    = (ThreadContext *)gThreadList.HEAD;

+    count   = (UINT32)gThreadList.count;

+

+    if (enableRunTime)

+    {

+        if (NULL == gOsa_AllTaskIdArray)

+        {

+            T_OSS_PARAM *pPlatCfg = NULL;

+

+            pPlatCfg = zOss_GetOssCfg();

+            gOsa_AllTaskIdArray = (void **)zOss_Malloc(sizeof(ZOSS_TASK_ID) *pPlatCfg->TaskCfg.max_task_num);

+            zOss_ASSERT(NULL != gOsa_AllTaskIdArray);

+        }

+

+        for (i = 0; i < count && pTcb != NULL ; i++)

+        {

+            pTcb->ua.cputime = 0;

+            pTcb = (ThreadContext *)(pTcb->node.next);

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: Osa_UpdateCpu

+* ¹¦ÄÜÃèÊö: 

+* ²ÎÊý˵Ã÷: (IN):

+* ·µ »Ø Öµ: 

+* ÆäËü˵Ã÷:  

+**************************************************************************/ 

+VOID Osa_UpdateCpu(VOID)

+{

+    UINT32                  totaltime   = 0;

+    UINT32                  excetime    = 0;

+    T_ZOsa_ThreadUserArea   *pUa        = NULL;

+    UINT32                  count       = 0;

+    UINT32                  i           = 0;

+    ThreadContext           *pTcb       = NULL;

+    FILETIME                CreationTime; 

+    FILETIME                ExitTime; 

+    FILETIME                KernelTime; 

+    FILETIME                UserTime;  

+

+    GetProcessTimes(GetCurrentProcess(), &CreationTime, &ExitTime, &KernelTime, &UserTime);

+    totaltime   = (UINT32)((((ULARGE_INTEGER*)&KernelTime)->QuadPart +

+                            ((ULARGE_INTEGER*)&UserTime)->QuadPart) / 10000);

+

+    pTcb        = (ThreadContext *)gThreadList.HEAD;

+    count       =  (UINT32)gThreadList.count;

+

+    for (i = 0; i < count && pTcb != NULL; i++)

+    {

+        pUa             = &(pTcb->ua);

+        pTcb            = (ThreadContext *)(pTcb->node.next);

+        excetime        = pUa->cputime * 100;

+        pUa->cpupercent = (FLOAT)(((double)excetime) / totaltime);

+    }

+

+    if (gOsa_AllTaskIdArray)

+    {

+        T_ZOss_TCB *pTCB = NULL;

+

+        count = zOss_GetAllTaskID(gOsa_AllTaskIdArray);

+

+        for (i = 0;i < count;i++)

+        {

+            pTCB = (T_ZOss_TCB *)gOsa_AllTaskIdArray[i];

+

+            if (pTCB != pTCB->task_id)

+            {

+                continue;/*may SDL task*/

+            }

+

+            excetime            = pTCB->cputime * 100;

+            pTCB->cpupercent    = (FLOAT)(((double)excetime) / totaltime);

+            pTCB->cputime       = 0;                             /* ¼ÆËãÍêÁ˽«cputimeÇå0 */

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_GetAllThreadId

+* ¹¦ÄÜÃèÊö: »ñÈ¡ËùÓÐÏß³ÌID

+* ²ÎÊý˵Ã÷: (IN)

+            (OUT)

+            threadarray: Ïß³ÌIDÊý×éÖ¸Õë

+* ·µ »Ø Öµ: Ïß³ÌÊý

+* ÆäËü˵Ã÷: ·µ»ØÏß³ÌÊý²»Îª0ʱ,´«³öµÄÊý×é¿Õ¼äÓÉÓû§ÊÍ·Å

+**************************************************************************/ 

+UINT32 Osa_GetAllThreadId(ZOSS_THREAD_ID *threadarray[])

+{

+    UINT32          i           = 0;

+    UINT32          count       = 0;

+    ThreadContext   *pTcb       = NULL;

+    ZOSS_THREAD_ID  *thread_id  = NULL;

+

+    zOss_AssertEx(NULL != threadarray, 0);

+    

+    pTcb    = (ThreadContext *)gThreadList.HEAD;

+    count   = (UINT32)gThreadList.count;

+

+    if (count == 0)

+    {

+        *threadarray = NULL;

+        return count;

+    }

+

+    thread_id = (ZOSS_THREAD_ID *)zOss_Malloc(MAX_THREAD_NUM * sizeof(ZOSS_THREAD_ID));

+

+    zOss_AssertEx(NULL != thread_id, 0);

+    

+    for (i = 0; i < count && pTcb != NULL; i++)

+    {

+        thread_id[i] = (ZOSS_THREAD_ID)pTcb;

+        pTcb         = (ThreadContext *)(pTcb->node.next);

+    }

+

+    *threadarray = thread_id;

+    return count;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_DisplayThreadExecInfo

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN):

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 Osa_DisplayThreadExecInfo(PROCESS pid)

+{

+    zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "¸Ã¹¦ÄÜÔÚWinûÓÐʵÏÖ");

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_DisplayThreadsExecInfo

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN):

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+UINT32 Osa_DisplayThreadsExecInfo(UINT32 type)

+{

+    zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "¸Ã¹¦ÄÜÔÚWinûÓÐʵÏÖ");

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ:  Osa_DisplayThreadsExecInfo

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN):

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+FLOAT Osa_GetProcessCPU(ZOSS_THREAD_ID tid)

+{

+    FLOAT rate = 0;

+    

+    zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_NORMAL, "¸Ã¹¦ÄÜÔÚWinûÓÐʵÏÖ");

+    return rate;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º OSA_IdentifyThread

+* ¹¦ÄÜÃèÊö£º ÅжÏÒ»¸öÏß³ÌÊÇ·ñÓÐЧ

+* ²ÎÊý˵Ã÷£º (IN)

+             ZOSS_THREAD_ID : Ïß³ÌID

+             (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS;ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ÎÞ

+**************************************************************************/

+UINT32 OSA_IdentifyThread(ZOSS_THREAD_ID threadID)

+{

+    T_ZOss_Node *pCurNode = NULL;

+

+    zOss_AssertEx(NULL != threadID, ZOSS_ERROR);

+    

+    zOss_GetMutex(gThreadListMutex, ZOSS_WAIT_FOREVER);

+    pCurNode = zOss_ListFirst (&gThreadList);

+

+    while (pCurNode != NULL)

+    {

+        if (pCurNode == threadID)

+        {

+            zOss_PutMutex(gThreadListMutex);

+            return ZOSS_SUCCESS;

+        }

+

+        pCurNode = zOss_ListNext(pCurNode);

+    }

+

+    zOss_PutMutex(gThreadListMutex);

+

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º OSA_DefaultEntry

+* ¹¦ÄÜÃèÊö£º ĬÈÏÏß³ÌÈë¿Úº¯Êý£¬ÔÚÕâÀïµ÷ÓÃÓû§µÄÈë¿Úº¯Êý

+* ²ÎÊý˵Ã÷£º (IN)

+             arg:     Ïß³ÌÈë¿Úº¯ÊýµÄ²ÎÊý

+             (OUT)

+* ·µ »Ø Öµ£º ³õʼ»¯³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ÄÚ²¿º¯Êý£¬Ä¬ÈÏÏß³ÌÈë¿Úº¯Êý;Ö÷Òª½â¾öÏß³Ì×Ô¼ºÖ´ÐÐÍêÍ˳ö¶ÔÁбíµÄÐÞ¸Ä

+**************************************************************************/

+static VOID OSA_DefaultEntry(SINT32 arg)

+{

+    ThreadContext *threadContext = NULL;

+

+    /* »ñÈ¡Ïß³ÌÉÏÏÂÎÄ */

+    threadContext = (ThreadContext *)zOss_GetCurThreadID();

+

+    if (NULL == threadContext)

+    {

+        return;

+    }

+

+    /* Ö´ÐÐÓû§Èë¿Úº¯Êý */

+    threadContext->ThreadEntry(arg);

+

+    /* Í˳öÏß³Ì */

+    zOss_ExitThread();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º OSA_GetThreadContext

+* ¹¦ÄÜÃèÊö£º ¸ù¾ÝÊý×ÖID»ñÈ¡Ï̵߳ÄÉÏÏÂÎÄ

+* ²ÎÊý˵Ã÷£º (IN)

+             thread_real_id: ´´½¨Ï̵߳ÄÊý×ÖID

+             (OUT)

+* ·µ »Ø Öµ£º Ï̵߳ÄÉÏÏÂÎÄ

+* ÆäËü˵Ã÷£º ΪÄÚ²¿½Ó¿Ú£¬¹©ÆäËû½Ó¿ÚʹÓÃ

+**************************************************************************/

+static ThreadContext* OSA_GetThreadContext(SINT32 thread_real_id)

+{

+    T_ZOss_Node     *pCurNode   = NULL;

+    ThreadContext   *pCurThread = NULL;

+

+    zOss_GetMutex(gThreadListMutex, ZOSS_WAIT_FOREVER);

+    pCurNode = zOss_ListFirst(&gThreadList);

+

+    while (pCurNode != NULL)

+    {

+        pCurThread = (ThreadContext *)pCurNode;

+

+        if (pCurThread->thread_real_id == thread_real_id)

+        {

+            zOss_PutMutex(gThreadListMutex);

+            return pCurThread;

+        }

+

+        pCurNode = zOss_ListNext(pCurNode);

+    }

+

+    zOss_PutMutex(gThreadListMutex);

+    

+    return NULL;

+}

+

+static THREAD_MSG_HOOK_CONTENT* find_thread_content(ZOSS_THREAD_ID thread_id)

+{

+    THREAD_MSG_HOOK_CONTENT *p_content = NULL;

+    

+    p_content = (THREAD_MSG_HOOK_CONTENT *)zOss_ListFirst(&s_thread_msg_hook_list);

+    while (NULL != p_content)

+    {

+        if (thread_id == p_content->thread_id)

+        {

+            break;

+        }

+        p_content = (THREAD_MSG_HOOK_CONTENT *)zOss_ListNext((T_ZOss_Node *)p_content);

+    }

+

+    return p_content;

+}

+

+static BOOL is_sender_task(VOID *sender)

+{  

+    ZOSS_TASK_ID task_id = ZOSS_INVALID_TASK_ID;

+

+    zOss_AssertEx(sender != NULL, FALSE);

+    

+    task_id = zOss_GetSelfTaskID();

+    if (ZOSS_INVALID_TASK_ID != task_id)

+    {

+        *(UINT32 *)sender = (UINT32)task_id;

+        return TRUE;

+    }

+    else

+    {

+        *(UINT32 *)sender = (UINT32)zOss_GetCurThreadID();

+        return FALSE;

+    }

+}

+

+static UINT32 proc_thread_msg_hook(UINT32 dire, UINT32 msg_id, VOID *p_buf, UINT16 buf_size, ZOSS_THREAD_ID thread_id)

+{

+    THREAD_MSG_HOOK_CONTENT *p_content = NULL;

+    UINT32                  i          = 0;

+    

+    p_content = find_thread_content(thread_id);

+    if (NULL == p_content)

+    {

+        return 0;

+    }

+

+    for (i=0; i<THREAD_MSG_HOOK_TYPE_MAX; i++)

+    {

+        if (0 != (dire & p_content->dire[i]))

+        {

+            (VOID)(p_content->func[i])(msg_id, p_buf, (UINT32)buf_size, (UINT8)dire);

+        }

+    }

+    return (0 != (dire & p_content->dire[ZOSS_SETHOOKFLAG_INTER-1])) ? ZOSS_SETHOOKFLAG_INTER : 0;

+}

+

+static UINT32 proc_task_msg_hook(UINT32 dire, UINT32 msg_id, VOID *p_buf, UINT16 buf_size, ZOSS_TASK_ID task_id)

+{

+    T_ZOss_TCB          *task_tcb   = (T_ZOss_TCB *)task_id;

+    T_ZOss_TaskMsgHead  msg_head    = {0};

+    UINT32              i           = 0;

+

+    msg_head.msgID = msg_id;

+    for (i=0; i<THREAD_MSG_HOOK_TYPE_MAX; i++)

+    {

+        if (0 != (dire & task_tcb->dire[i]))

+        {

+            (VOID)task_tcb->HookEntry[i](&msg_head, (UINT8)dire);

+        }

+    }

+

+    return (0 != (dire & task_tcb->dire[ZOSS_SETHOOKFLAG_INTER-1])) ? ZOSS_SETHOOKFLAG_INTER : 0;

+}

+

+static UINT32 proc_msg_hook(UINT32 msg_id, VOID *p_buf, UINT16 buf_size, ZOSS_THREAD_ID d_thread_id)

+{

+    VOID    *sender = NULL;

+    UINT32  ret     = 0;

+    

+    if (is_sender_task(&sender))

+    {

+        ret = proc_task_msg_hook(ZOSS_MSGDIRE_OUT, msg_id, p_buf, buf_size, (ZOSS_TASK_ID)sender);

+    }

+    else

+    {

+        ret = proc_thread_msg_hook(ZOSS_MSGDIRE_OUT, msg_id, p_buf, buf_size, (ZOSS_THREAD_ID)sender);

+    }

+    if (ZOSS_SETHOOKFLAG_INTER == ret)

+    {

+        return ret;

+    }

+    

+    return proc_thread_msg_hook(ZOSS_MSGDIRE_IN, msg_id, p_buf, buf_size, d_thread_id);

+}

+

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/windows/src/win_ramdump.c b/cp/ps/plat/src/oss/osa/windows/src/win_ramdump.c
new file mode 100644
index 0000000..f50d177
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/windows/src/win_ramdump.c
@@ -0,0 +1,113 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_RAMDUMP

+* ÎÄ ¼þ Ãû : win_ramdump.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ramdumpÓÅ»¯

+* ×÷    Õß : wuzhengjun

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012-09-11

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é  EC:617001781798

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é   EC:617001781846 

+**************************************************************************/

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_RamdumpConfigureMem 

+* ¹¦ÄÜÃèÊö£º ±£´æÄÚ´æ¶ÎÊý¾ÝÅäÖÃÐÅÏ¢ 

+* ²ÎÊý˵Ã÷£º (IN):

+*            base:      ÅäÖÃÄÚ´æ¶ÎÔÚARM0²à¿´¼ûÆðʼµØÖ·£»

+*            size:      ÅäÖÃÄÚ´æ¶Î´óС£»

+*            map_base:  ÅäÖÃÄÚ´æ¶ÎÔÚ×ÔÉí²à¿´µ½µÄÆðʼµØÖ·£»

+*            copy_base: ramdump¹ý³ÌÖÐÐèÒª½«Ìض¨Êý¾Ý¿½±´µ½Ö¸¶¨µÄÄÚ´æµÄµØÖ·£¬

+*                       ²»ÐèÒªÇëÖÃ0

+*            [base , size]:[copy_base , size]

+*            (OUT): 

+* ·µ »Ø Öµ£º   

+* ÆäËü˵Ã÷£º

+***************************************************************************/

+VOID zOss_RamdumpConfigureMem(UINT32 base, UINT32 size, UINT32 map_base, UINT32 copy_base)

+{

+    return;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpForceException

+ * ¹¦ÄÜÃèÊö£º Ç¿ÖÆ²úÉúÒì³£,ÒÔ±ãramdump

+ * ²ÎÊý˵Ã÷£º (IN): 

+              0:ARMÒì³£ 1: ¶ÏÑÔÒì³£ 2: ²Ù×÷ϵͳ¶ÏÑÔÒì³£

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpForceException(UINT32 type)

+{       

+    return;

+}

+

+/**************************************************************************
+ * º¯ÊýÃû³Æ£º zOss_RamdumpInit
+ * ¹¦ÄÜÃèÊö£º ICP»Øµ÷³õʼ»¯
+ * ²ÎÊý˵Ã÷£º (IN): 
+ *            (OUT):

+ * ·µ »Ø Öµ£º   
+ * ÆäËü˵Ã÷£º 
+**************************************************************************/
+VOID zOss_RamdumpInit(VOID)

+{

+    return;

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/osa/windows/ws/makefile b/cp/ps/plat/src/oss/osa/windows/ws/makefile
new file mode 100644
index 0000000..21699ad
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/windows/ws/makefile
@@ -0,0 +1,49 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: ±àÒëOSA_OSE¿â

+#* ÄÚÈÝÕªÒª: °üº¬OSA_OSEºÍCommonÁ½¸öÄ£¿é

+#* ʹÓ÷½·¨:     

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2013/01/01      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+include $(PRJ_PATH)/ws/dosmake/plat_pub.mk

+

+#===============================================================================

+#·¾¶ÉèÖÃ

+#===============================================================================

+_SUBSYS_NAME = plat_osa_win

+

+_SUBSYS_LIB_PATH = $(PLAT_LIB_INTERNAL_PATH)

+

+_ALL_MDLS = osa_win com

+_ALL_OBJECTS = $(wildcard $(OBJ_PATH)/oss/osa/com/*.o)        \

+               $(wildcard $(OBJ_PATH)/oss/osa/osa_win/*.o)

+

+#===============================================================================

+# common

+#===============================================================================

+com:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(PLAT_PATH)/src/oss/osa/com

+comclean:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(PLAT_PATH)/src/oss/osa/com clean

+

+#===============================================================================

+# osa_ose

+#===============================================================================

+osa_win:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(PLAT_PATH)/src/oss/osa/windows/ws -f osa_win.mk

+osa_winclean:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(PLAT_PATH)/src/oss/osa/windows/ws -f osa_win.mk clean

+

+#===============================================================================

+# ±àÒë¹æÔò

+#===============================================================================

+include $(PRJ_PATH)/ws/dosmake/lib_rules.mk

+

+

diff --git a/cp/ps/plat/src/oss/osa/windows/ws/osa_win.mk b/cp/ps/plat/src/oss/osa/windows/ws/osa_win.mk
new file mode 100644
index 0000000..640590e
--- /dev/null
+++ b/cp/ps/plat/src/oss/osa/windows/ws/osa_win.mk
@@ -0,0 +1,53 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: Makefile

+#* ÄÚÈÝÕªÒª: ±àÒëosa_winÄ£¿é

+#* ʹÓ÷½·¨:

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2011/01/10      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+include $(PRJ_PATH)/ws/dosmake/plat_pub.mk

+include $(PRJ_PATH)/ws/dosmake/inc.mk

+

+#===============================================================================

+#·¾¶ÉèÖÃ

+#===============================================================================

+_MDL_NAME = osa_win

+

+_MDL_SRC_PATH = $(PLAT_PATH)/src/oss/osa/windows/src

+_MDL_INC_PATH = $(PLAT_PATH)/src/oss/osa/windows/inc

+_MDL_OBJ_PATH = $(OBJ_PATH)/plat/oss/osa/$(_MDL_NAME)

+

+#===============================================================================

+#¸÷Ä£¿éÒÀÀµ¹«¹²Í·ÎļþÉèÖÃ

+#===============================================================================

+INCLUDE += -I$(PLAT_PATH)/inc               \

+           -I$(PLAT_PATH)/inc/oss           \

+           -I$(PLAT_PATH)/inc/drv           \

+           -I$(PLAT_PATH)/src/oss/osa/inc   \

+           -I$(PLAT_PATH)/src/oss/sup/inc   \

+           -I$(_MDL_INC_PATH)

+

+#===============================================================================

+#×ÓϵͳÀ©Õ¹¶¨Òå

+#===============================================================================

+DEFINE += 

+

+#===============================================================================

+#Ä£¿éÎļþÐÅÏ¢ 

+#===============================================================================

+_C_SOURCE = $(wildcard $(_MDL_SRC_PATH)/*.c)

+_s_SOURCE =

+_S_SOURCE =

+

+#===============================================================================

+# ±àÒë¹æÔò

+#===============================================================================

+include $(PRJ_PATH)/ws/dosmake/mdl_rules.mk

+

diff --git a/cp/ps/plat/src/oss/psm/src/makefile b/cp/ps/plat/src/oss/psm/src/makefile
new file mode 100644
index 0000000..73d7ad2
--- /dev/null
+++ b/cp/ps/plat/src/oss/psm/src/makefile
@@ -0,0 +1,85 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: Makefile

+#* ÄÚÈÝÕªÒª: ±àÒëPSMÄ£¿é

+#* ʹÓ÷½·¨:     

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2013/01/01      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+include $(PRJ_PATH)/config/project.mk

+

+#===============================================================================

+#·¾¶ÉèÖÃ

+#===============================================================================

+_MDL_NAME = psm

+

+_MDL_SRC_PATH = $(PLAT_PATH)/src/oss/psm/src

+_MDL_INC_PATH = $(PLAT_PATH)/src/oss/psm/src

+_MDL_OBJ_PATH = $(OBJ_PATH)/plat/oss/$(_MDL_NAME)

+

+#===============================================================================

+#¸÷Ä£¿éÒÀÀµ¹«¹²Í·ÎļþÉèÖÃ

+#===============================================================================

+INCLUDE += -I$(PLAT_PATH)/inc                   \

+           -I$(PLAT_PATH)/inc/oss               \

+           -I$(PLAT_PATH)/inc/drv               \

+           -I$(PLAT_PATH)/src/oss/sup/inc       \

+           -I$(PLAT_PATH)/src/oss/osa/inc       \

+           -I$(PLAT_PATH)/src/oss/osa/ose/inc   \

+           -I$(DRV_PATH)/inc                    \

+           -I$(_MDL_INC_PATH)

+

+#===============================================================================

+#×ÓϵͳÀ©Õ¹¶¨Òå

+#===============================================================================

+DEFINE += 

+

+#===============================================================================

+#Ä£¿éÎļþÐÅÏ¢ 

+#===============================================================================

+ifeq ($(PRJ_NAME),evb2963)

+_C_SOURCE = $(wildcard $(_MDL_SRC_PATH)/psm_296300.c)

+endif

+

+ifeq ($(PRJ_NAME),evb296320)

+_C_SOURCE = $(wildcard $(_MDL_SRC_PATH)/psm_296300.c)

+endif

+

+ifeq ($(PRJ_NAME),zx297502)

+_C_SOURCE = $(wildcard $(_MDL_SRC_PATH)/psm_297502.c)

+endif

+

+ifeq ($(PRJ_NAME),zx297510)

+_C_SOURCE = $(wildcard $(_MDL_SRC_PATH)/psm_297510.c)

+endif

+

+ifeq ($(PRJ_NAME),zx297520)

+_C_SOURCE = $(wildcard $(_MDL_SRC_PATH)/psm_297520.c)

+endif

+

+ifeq ($(PRJ_NAME),zx297520v1_1)

+_C_SOURCE = $(wildcard $(_MDL_SRC_PATH)/psm_297520.c)

+endif

+

+ifeq ($(PRJ_NAME),zx297520v2)

+_C_SOURCE = $(wildcard $(_MDL_SRC_PATH)/psm_297520v2.c)

+endif

+

+ifeq ($(PRJ_NAME),zx297520v3)

+_C_SOURCE = $(wildcard $(_MDL_SRC_PATH)/psm_297520v3.c)

+endif

+

+_s_SOURCE =

+_S_SOURCE =

+

+#===============================================================================

+# ±àÒë¹æÔò

+#===============================================================================

+include $(FRAME_PATH)/rules/mdl_rules.mk

+

diff --git a/cp/ps/plat/src/oss/psm/src/psm_296300.c b/cp/ps/plat/src/oss/psm/src/psm_296300.c
new file mode 100644
index 0000000..b74ec53
--- /dev/null
+++ b/cp/ps/plat/src/oss/psm/src/psm_296300.c
@@ -0,0 +1,2229 @@
+/************************************************************************

+* °æÈ¨ËùÓÐ (C)2008,ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+*

+* ÎļþÃû³Æ£º psm.c

+* Îļþ±êʶ£º

+* ÄÚÈÝÕªÒª£º Ê¡µç¹ÜÀí(power save manager)

+*

+* ÐÞ¸ÄÈÕÆÚ     °æ±¾ºÅ     Ð޸ıê¼Ç     ÐÞ¸ÄÈË      ÐÞ¸ÄÄÚÈÝ

+* ---------------------------------------------------------------------

+* 2009/06/01    v0.1              ÍõÊÀÓ        ´´½¨

+************************************************************************/

+/***************************************************************************

+*                           Í·Îļþ°üº¬                                    *

+***************************************************************************/

+#ifdef _USE_PSM

+

+#include "oss_api.h"

+#include "drvs_pow.h"

+#include "chg_api.h"

+#include "Drvs_ramlog.h"

+

+#define USE_PSM_TEST                0       /* EVB °æ±¾²âÊÔ                     */

+

+#define PSM_TD_FRAME_MS             5

+#define PSM_TD_CHIP_MS              0.00078

+#define PSM_TD_MAX_FRAMENUM         8192

+#define PSM_TD_MAX_CHIPNUM          6400

+#define PSM_GSM_FRAME_MS            4.615

+#define PSM_TD_MAX_SLEEP_FRAMENUM   2048

+

+extern UINT64 gTimer_CurTime;       /*µ±Ç°Ê±¼ä¼ÆÊý*/

+extern BOOL l1g_camp_on_cell_flag ;

+extern BOOL POW_l1g_force_wake_flag;

+

+UINT32 gPsm_SleepTime               = 0;    /* ϵͳÐÝÃßʱ¼ä                     */

+static UINT32 gPsm_SleepTicks       = 0;    /* ϵͳTICKÊý²¹³¥                   */

+static UINT32 gPsm_SleepTimeForGui  = 0;    /* ϵͳÐÝÃßʱ¼äGUI¶¨Ê±Æ÷²¹³¥Ê¹Óà    */

+static UINT16 gPsm_Gsmtime          = 0;

+static UINT32 gPSM_TdstartFram      = 0;

+static UINT32 gPSM_TdstartChip      = 0;

+

+static UINT32 gL1gSleepTime         = 0;    /* L1g ÔÊÐíÐÝÃßʱ¼ä                 */

+

+static UINT32 g_AppIdleFlag         = 0;    /* Ó¦ÓÿÕÏбêÖ¾·û,¿ØÖÆÁ¢¼´µ÷Ƶ      */

+static UINT32 gPSM_AppIdleFlag      = 0;    /* Ó¦ÓÿÕÏбêÖ¾·û£¬¿ØÖÆË¯ÃßÁ÷³ÌµÄ   */

+static UINT32 gPSM_L1gIdleFlag      = 1;    /* L1g¿ÕÏбêÖ¾·û                    */

+static UINT32 gPSM_DrvIdleFlag      = 0;    /* ϲãÇý¶¯¿ÕÏбêÖ¾·û               */

+static UINT16 gPSM_ZspFlag          = 1;

+/*±ê×¢ÐÝÃߺ¯Êý±äÁ¿*/

+static PSM_SleepFunc gPSM_KenelSleepFunc    = NULL;

+static PSM_SleepFunc gPSM_ShallowSleepFunc  = NULL;

+static PSM_SleepFunc gPSM_DeepSleepFunc     = NULL;

+/*˯ÃßµÄhookº¯Êý±äÁ¿*/

+static T_ZOSS_PSM_HOOK gPSM_Hook    = {NULL,NULL};

+

+static BOOL sleep_flag              = FALSE;    /*ÐÝÃß±êÖ¾£¬ÓÃÓÚÅжÏÊÇ·ñ½øÐÐʱ¼ä²¹³¥*/

+BOOL gSleep_CampOn_flag             = FALSE;

+ZOSS_THREAD_ID gPSMThreadID         = NULL;

+UINT32   gPSMCurrentPow             = 0;        //µ±Ç°Ö÷Ƶ

+static T_PSM_PARAM * gPsmCfg        = NULL;

+

+#ifdef   _USE_PSM_2BNEW

+#ifdef   _USE_APPFLAG_DFM

+static  ZOSS_MUTEX_ID gPSMAppPowMutexID = NULL;

+#endif

+#endif

+static  UINT32 gRTCTimeToOSTimeFlag     = 1;

+#ifdef _USE_CPU_DFM

+extern  T_ZOsa_ThreadUserArea ** gp_OsaThreadUserArea ;  /*±£´æÏß³ÌÓû§¿Õ¼äµØÖ·*/

+extern UINT32 gPsm_SwapLastTime;

+

+static UINT32  psmAdjust            = 0;

+static UINT32  psmIITCount          = 0;

+static SINT32  *psmIITIdle;

+static UINT32  psmCPUCountNum       = 0;

+UINT32  gPsm_CpuSumtime             = 0;

+ZOSS_THREAD_ID   currentPSMThread   = NULL;

+BOOL gPSMIgnoreFlags                = FALSE;

+static  UINT32  gPsm_SumIIT         = 0;

+static  UINT32  gPsm_AIT            = 0;//¿ÉÒÔÓþֲ¿±äÁ¿

+#endif

+#ifdef _OS_TOS

+BOOL   gPSMInitFlag                 = FALSE;

+#endif

+/*U118BÐèÇó*/

+#ifdef   _USE_PSM_HANDSET

+static UINT32 g_psm_deepsleeplen1       = 0;

+static UINT32 g_psm_deepsleeplastlen    = 0;

+static UINT32 g_psm_deepsleeplen        = 0;

+static UINT32 g_psm_deepsleepwakeupfc   = 0;

+static UINT32 g_psm_deepsleepwakeupcc   = 0;

+static UINT32 g_psm_deepsleepfc         = 0;

+static UINT32 g_psm_deepsleepcc         = 0;

+static BOOL g_psm_zsp2sleeptimeflag     = FALSE;

+

+/***************psm20111026*********************/

+extern VOID pow_PsmT1PichSleep(VOID);

+extern UINT16 pow_PsmT1IsrFlag(VOID);

+extern UINT16 pow_PsmPichFlag(VOID);

+extern  void POW_l1g_wakeup_by_td_only(void);

+extern UINT32 g_tdt1wakeup_psm ;

+extern WORD   zPS_urrc_rbc_get_drx_for_PSM();

+extern UINT32 zDrvTimer_ReadTimerPSM(UINT32 timerID);

+extern UINT16  pow_SetTdL1SleepFlag(UINT16 flag);

+

+UINT32 g_testt1pichsleep =0;

+

+BOOL  PSM_SleepT1toMeasure(VOID);

+VOID PSM_OffsetUpperTimer(VOID);

+

+/*******************************************/

+#endif

+/***end***/

+static UINT32 g_psm_sleepagofc  = 0;

+static UINT32 g_psm_sleepagocc  = 0;

+static UINT32 g_psm_wakeupfc    = 0;

+static UINT32 g_psm_wakeupcc    = 0;

+#ifdef _USE_PSM_HANDSET

+/*****¸Ãº¯ÊýÊÇtddÖÆÊ½Ï£¬ÅжÏЭÒéÕ»ÈÎÎñÊÇ·ñ¿ÕÏУ¬Ð·½°¸²ÅÓÃ******/

+extern BOOL zL1t_TaskIsIdle(VOID); /*ps ÈÎÎñ¿ÕÏÐ,·µ»Øtrue±íʾ¿ÕÏУ¬false±íʾæ*/

+/**************************************************************/

+#endif 

+static volatile T_Psm_BootStage gPSM_BootStageFlag = PSM_BOOT_DEFAULT;      /*ϵͳÆô¶¯½×¶Î±ê־λ*/

+static volatile BOOL gPSM_LCDPSMFlag = TRUE;          /*zcoreÆÁÄ»ÐÝÃß±ê־λ*/

+

+/**************************************************************************

+ *                       ×Ô¶¨ÒåÀàÐÍ                                     *

+ **************************************************************************/

+typedef enum

+{

+    SYS_TD  = 1,

+    SYS_GSM = 4,

+    SYS_MAX_TYPE

+}T_Psm_SysType;

+

+T_Psm_SysType sys_type=SYS_MAX_TYPE;

+

+/****************CQNJ00216067*******************************/

+#ifndef _USE_DATACARD

+extern UINT8 g_psmsleeprtctime;

+extern UINT8 g_psmwakeuprtctime;

+extern UINT8 Rtc_PsmGetTime(VOID);

+extern VOID Rtc_PsmMinInt(VOID);

+#endif

+#ifdef _USE_CPU_DFM

+UINT32  gMinCpuPerf                 = 0;

+static  UINT32  gMinCpuPerfOld      = 0;

+typedef  struct _tagpsmThreadTCB

+{

+    ZOSS_THREAD_ID thread_id;

+}T_ZOSS_PSMThread;

+T_ZOSS_PSMThread   *gPsmThreadTCB   = NULL;

+

+#define PSM_UP_ARMCLK               (UINT8)1    /* ÉýƵһ¼¶     */

+#define PSM_DOWN_ARMCLK             (UINT8)2    /* ½µÆµ         */

+#define PSM_PULL_ARMCLK             (UINT8)3    /* ÉýƵÁ½¼¶     */

+#endif

+static UINT32 gPsmSleepTimeSum      =0;

+extern  BOOL  pow_PsmGetUsbStatus(VOID);

+/**************************************************************************

+ *                       ÍⲿÒýÓú¯Êý                                     *

+ **************************************************************************/

+#ifdef _OS_OSE

+extern UINT32 SYSTIME_Init(VOID);

+#endif

+

+extern UINT16 zOss_GetZspIsidle(VOID);

+

+extern VOID zOss_GetZsp_AllowSleepTime(UINT32 *frame_num,UINT32 *chip_num,UINT32 *len);

+extern VOID zOss_SetZspSleepTime(UINT32 frame_num,UINT32 chip_num);

+extern VOID zOss_GetZspTime(UINT32 *frame_num,UINT32 *chip_num);

+extern UINT16 pow_PsmGetCamon(VOID);

+extern UINT16  SPCU_get_l1g_sleep_time(VOID);  /*get real sleep time*/

+

+extern UINT32  zOss_GetPs_SleepTimer(VOID);

+extern BOOL POW_L1g_OsIdleLoopHandler(UINT32 sys_mode);

+extern BYTE zPS_umm_GetPossibleAct(VOID);

+extern BYTE zPS_umm_IsLossOfCoverage(VOID);

+#ifdef _USE_SMARTPHONE

+extern BOOL zAti2_PsIsInFlyMode(VOID);

+#endif

+extern void POW_l1g_wakeup_psm(void);

+extern  SINT32  Hal_GetArmCoreFreq(UINT32*feq);

+extern  SINT32  Hal_SetArmCoreFreq(UINT32 freq);

+extern UINT32 Osa_HwTimeRead(VOID);

+extern VOID halChg_status_get(T_ZDrvChg_Info_Data *charger_inf);

+extern T_ZOsa_ThreadUserArea *zOss_GetThreadUserArea(ZOSS_THREAD_ID thread_id);

+

+/**************************************************************************

+ *                     ¾Ö²¿º¯ÊýǰÖÃÉùÃ÷                                      *

+ **************************************************************************/

+

+VOID PSM_IdleThreadEntry(SINT32 ignore);

+static VOID psm_sleep_handle(T_Psm_SleepMode sleep_mode);

+VOID  Psm_ZspMsToFram(UINT32 framestart,UINT32 chipstart,UINT32 *frameend,UINT32 *chipend,UINT32 len);

+UINT32  Psm_ZspFramToMs(UINT32 framestart,UINT32 chipstart,UINT32 frameend,UINT32 chipend);

+BOOL  PSM_SleepCampOnCheck(VOID);

+BOOL  PSM_SleepTdFlagCheck(VOID);

+BOOL  PSM_SleepEnableCheck(VOID);

+static void PSM_BootSleep(void);

+#ifdef _USE_SMARTPHONE

+static void PSM_AirplaneSleep(void);

+#endif

+/*----------------------------------------------------------------------------*

+**                         º¯ÊýʵÏÖ                                           *

+**---------------------------------------------------------------------------*/

+#ifdef _USE_CPU_DFM

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_GetIgnoreTime

+* ¹¦ÄÜÃèÊö£º»ñÈ¡ºöÂÔÏ̵߳Äʱ¼ä

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£º   ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static  UINT32   PSM_GetIgnoreThreadTime(VOID)

+{

+    UINT32 psmIgnoreTime = 0;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    SINT32 j  = 0;

+    

+    for ( j = 0 ; j < gPsmCfg->psmThrdNameNum; j++)

+    {

+        if (gPsmThreadTCB[j].thread_id != NULL)

+        {

+            pPsmThreadUa = zOss_GetThreadUserArea(gPsmThreadTCB[j].thread_id);

+            if (pPsmThreadUa != NULL)

+            {

+                psmIgnoreTime  +=  pPsmThreadUa->psmCpuTime;

+            }

+        }

+        else

+        {

+            break;

+        }

+    }

+    

+    return psmIgnoreTime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_GetCpuLoad

+* ¹¦ÄÜÃèÊö£º

+* ²ÎÊý˵Ã÷£º

+                            (OUT)

+                             idlecpuLoad:cpu¿ÕÏÐÂÊ

+* ·µ »Ø Öµ£º   ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static  VOID   PSM_GetCpuLoad(UINT32 *idlecpuLoad)

+{

+    SINT32   psmIgnoreTime = 0,totaltime = 0,tmpidlecpu  = 0,tmpIIT= 0,index = 0;

+    SINT32  tmpPsmTime = Osa_HwTimeRead() -gPsm_SwapLastTime;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    

+    if (currentPSMThread !=NULL)

+    {

+        pPsmThreadUa =  zOss_GetThreadUserArea(currentPSMThread);

+        if (pPsmThreadUa!=NULL)

+        {

+            pPsmThreadUa->psmCpuTime += tmpPsmTime ;

+        }

+    }

+    totaltime  =gPsm_CpuSumtime+ tmpPsmTime;

+

+    if (totaltime < 3000)

+    {

+        *idlecpuLoad = 70;

+        return ;

+    }

+    else

+    {

+        pPsmThreadUa= zOss_GetThreadUserArea(gPSMThreadID);

+        tmpidlecpu = pPsmThreadUa->psmCpuTime;

+        if(gPSM_LCDPSMFlag)

+        {

+            psmIgnoreTime = PSM_GetIgnoreThreadTime();

+        }

+        if ((psmIgnoreTime>1000)||(tmpidlecpu < psmIgnoreTime)||(totaltime-psmIgnoreTime == 0))

+        {

+            tmpIIT = (tmpidlecpu+psmIgnoreTime*0.6);

+            tmpIIT = (tmpIIT*100)/totaltime;

+        }

+        else

+        {

+            tmpIIT = (tmpidlecpu -psmIgnoreTime);

+            tmpIIT = (tmpIIT*100)/(totaltime-psmIgnoreTime);

+        }

+        *idlecpuLoad = tmpIIT;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_ClearThreadCpu

+* ¹¦ÄÜÃèÊö£ºÇå³ýÏ̵߳ÄcpuµÄ¼ÆÊ±Ê±¼ä

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£º   ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static  VOID   PSM_ClearThreadCpu(VOID)

+{

+    UINT32  i                           = 0;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    

+    pPsmThreadUa                = zOss_GetThreadUserArea(gPSMThreadID);

+    pPsmThreadUa->psmCpuTime    = 0;

+    for (i= 0 ;i<gPsmCfg->psmThrdNameNum; i++)

+    {

+        if (gPsmThreadTCB[i].thread_id != NULL)

+        {

+            pPsmThreadUa = zOss_GetThreadUserArea(gPsmThreadTCB[i].thread_id);

+            if (pPsmThreadUa!= NULL)

+            {

+                pPsmThreadUa->psmCpuTime = 0;

+            }

+        }

+        else

+        {

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_ClearIITTime

+* ¹¦ÄÜÃèÊö£ºÇå³ýÏ̵߳ÄcpuµÄ¼ÆÊ±Ê±¼ä

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£º   ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static  VOID   PSM_ClearIITTime(VOID)

+{

+    UINT32 i        =0;

+    

+    psmCPUCountNum  = 0;   //ÖØÐ²ɼ¯£»

+    gPsm_SumIIT     = 0;

+    psmAdjust       = 0;

+    for ( i = 0; i< gPsmCfg->cpuAdjustNum; i++)

+    {

+        psmIITIdle[i] = 0;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_FindDesCpuClkPara

+* ¹¦ÄÜÃèÊö£º

+* ²ÎÊý˵Ã÷£º

+                            (out)

+                              pDesCpuClkConfig:»ñÈ¡CPU ¶¯Ì¬µ÷ƵµÄÅäÖÃ

+                              pConfigCount:»ñÈ¡CPU¶¯Ì¬µ÷ƵÅäÖõĸöÊý

+* ·µ »Ø Öµ£º   ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 PSM_SearchDesCpuClk(T_ZPSM_ARMClockSet *pDesCpuClkConfig, UINT32 ConfigCount,UINT32 curArmCoreFreq,UINT32 DFMFlag)

+{

+    UINT32  i  = 0;

+    for (i= 0; i <ConfigCount; i++)

+    {

+        if (pDesCpuClkConfig[i].currentARMClock == curArmCoreFreq)

+        {

+            switch (DFMFlag)

+            {

+            case PSM_UP_ARMCLK:

+                {

+                    return pDesCpuClkConfig[i].upARMClock;

+                }

+            case PSM_DOWN_ARMCLK:

+                {

+                    return pDesCpuClkConfig[i].downARMCLock;

+                }

+            case PSM_PULL_ARMCLK:

+                {

+                    return  pDesCpuClkConfig[i].pushARMClock;

+                }

+            default:

+                    break;

+            }

+        }

+    }

+    

+    return  curArmCoreFreq;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_FindDesCpuClk

+* ¹¦ÄÜÃèÊö£º

+* ²ÎÊý˵Ã÷£º

+                            (IN)

+                              cpuload:cpuʹÓÃÂÊ

+                              curArmCoreFreq:µ±Ç°Ö÷Ƶ

+* ·µ »Ø Öµ£º   ·µ»ØÐèÒªµÄcpu¶¯Ì¬µ÷ÕûµÄÖ÷Ƶ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static   UINT32  PSM_FindDesCpuClk(UINT32  cpuload ,UINT32 curArmCoreFreq)

+{

+    UINT32 desArmCoreFeq = 0;

+    UINT32 ConfigCount =0;

+    T_ZPSM_ARMClockSet  *DesCpuClkConfig = NULL;

+    if (pow_PsmGetUsbStatus())

+    {

+        DesCpuClkConfig = gPsmCfg->usbDesClock;

+        ConfigCount     = gPsmCfg->usbDesClockNum;

+    }

+    else

+    {

+        DesCpuClkConfig = gPsmCfg->desClock;

+        ConfigCount     = gPsmCfg->desClockNum;

+    }

+    if ( ( cpuload >= gPsmCfg->scaleCpuPcnt.downCpuPercent)&&(cpuload < gPsmCfg->scaleCpuPcnt.upCpuPercent))

+    {

+        desArmCoreFeq = curArmCoreFreq;

+    }

+    else if (cpuload >= gPsmCfg->scaleCpuPcnt.pullCpuPercent)

+    {

+        desArmCoreFeq = PSM_SearchDesCpuClk(DesCpuClkConfig,ConfigCount,curArmCoreFreq,PSM_PULL_ARMCLK);

+    }

+    else if (cpuload >= gPsmCfg->scaleCpuPcnt.upCpuPercent)

+    {

+        desArmCoreFeq = PSM_SearchDesCpuClk(DesCpuClkConfig,ConfigCount,curArmCoreFreq,PSM_UP_ARMCLK);

+    }

+    else

+    {

+        desArmCoreFeq = PSM_SearchDesCpuClk(DesCpuClkConfig,ConfigCount,curArmCoreFreq,PSM_DOWN_ARMCLK);

+    }

+    

+    return desArmCoreFeq ;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_FindMinCpuClk

+* ¹¦ÄÜÃèÊö£º ÅжÏCPUµ÷ÕûµÄÖ÷ƵÊÇ·ñÂú×ãÁ¢¼´µ÷Ƶ

+* ²ÎÊý˵Ã÷£º

+                            (IN)

+                              ÎÞ

+                              * ·µ »Ø Öµ£º   ·µ»ØÐèÒªµÄÁ¢¼´Ö÷Ƶ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static  UINT32  PSM_FindMinCpuClk(VOID)

+{

+    SINT32  i = 0;

+

+    if (pow_PsmGetUsbStatus())

+    {

+        for (i=0;i<gPsmCfg->usbSysClkNum;i++)

+        {

+            if (gMinCpuPerf>gPsmCfg->usbSysClk[i])

+            {

+                continue;

+            }

+            return gPsmCfg->usbSysClk[i];

+        }

+        return  gPsmCfg->usbSysClk[gPsmCfg->usbSysClkNum-1];

+    }

+    else

+    {

+        for (i=0;i<gPsmCfg->sysClkNum;i++)

+        {

+            if (gMinCpuPerf>gPsmCfg->sysClk[i])

+            {

+                continue;

+            }

+            return gPsmCfg->sysClk[i];

+        }

+        return  gPsmCfg->sysClk[gPsmCfg->sysClkNum-1];

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_ApplyCpuPerf

+* ¹¦ÄÜÃèÊö£º Ó¦ÓûòÉ豸ÉêÇëµÄÖ÷ƵµÄ

+* ²ÎÊý˵Ã÷£º

+                            (IN)

+                              appID:Ó¦ÓûòÉ豸µÄ±ê־λ

+* ·µ »Ø Öµ£º   ·µ»ØÐèÒªµÄÁ¢¼´Ö÷Ƶ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_ApplyCpuPerf(UINT32 appID, BOOL isUsed)

+{

+    UINT32 index = appID, MinCpuClk =0, retCode = ZOSS_ERROR;

+

+    ZOSS_INTR old_intr;

+

+    ZOSS_SAVE_IRQ(old_intr);

+

+    if (isUsed)

+    {

+        if (!gPsmCfg->minClock[index].isUsed)

+        {

+            gMinCpuPerf = gMinCpuPerf + gPsmCfg->minClock[index].CPUCLK;

+            gPsmCfg->minClock[index].isUsed = TRUE;

+        }

+    }

+    else

+    {

+        if (gPsmCfg->minClock[index].isUsed)

+        {

+            gMinCpuPerf = gMinCpuPerf - gPsmCfg->minClock[index].CPUCLK;

+            gPsmCfg->minClock[index].isUsed = FALSE;

+        }

+    }

+    

+    MinCpuClk = gMinCpuPerf;

+    if (MinCpuClk >gPSMCurrentPow)

+    {

+        MinCpuClk = PSM_FindMinCpuClk();

+        retCode = Hal_SetArmCoreFreq(MinCpuClk);

+        if (retCode !=DRV_SUCCESS)

+        {

+            zOss_ASSERT(0);

+        }

+        PSM_ClearIITTime();

+        gPSMCurrentPow = MinCpuClk;

+    }

+

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º psm_SetMonitoredThread

+* ¹¦ÄÜÃèÊö£º ÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£º

+                            (IN)

+                              thread_id:Ïß³ÌID

+* ·µ »Ø Öµ£º    ³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 psm_SetMonitoredThread(ZOSS_THREAD_ID thread_id)

+{

+    UINT32 i = 0;

+    

+    ZOSS_INTR old_intr;

+

+    if (NULL == thread_id)

+    {

+        return ZOSS_ERROR;

+    }

+

+    ZOSS_SAVE_IRQ(old_intr);

+

+    for (i = 0 ; i < gPsmCfg->psmThrdNameNum;i++)

+    {

+        if (gPsmThreadTCB[i].thread_id != NULL)

+        {

+            continue;

+        }

+        gPsmThreadTCB[i].thread_id  = thread_id;

+        break;

+    }

+    

+    if  (i == gPsmCfg->psmThrdNameNum)

+    {

+        ZOSS_RESTORE_IRQ(old_intr);

+

+        return ZOSS_ERROR;

+    }

+

+    ZOSS_RESTORE_IRQ(old_intr);

+

+    return ZOSS_SUCCESS;

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ£º psm_SetMonitoredThread

+* ¹¦ÄÜÃèÊö£º ÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£º

+                            (IN)

+                              thread_id:Ïß³ÌID

+* ·µ »Ø Öµ£º    ³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32  PSM_GetARM_CPU_CLK(UINT32  psm_AIT)

+{

+    UINT32 Des_CPU_CLK  = 0, ARM_CPU_CLK =0, ARM_MIN_CLK  = 0;

+    SINT32 tmpDiffCpu   =0;

+    

+    if (psmAdjust)

+    {

+#ifndef _OS_TOS	   

+        tmpDiffCpu =  gMinCpuPerf -gMinCpuPerfOld;

+        if (tmpDiffCpu>0)

+        {

+            tmpDiffCpu = tmpDiffCpu/(gPSMCurrentPow/100);

+        }

+        else

+        {

+            tmpDiffCpu = 0;

+        }

+#endif

+        Des_CPU_CLK= PSM_FindDesCpuClk((100-psm_AIT+tmpDiffCpu),gPSMCurrentPow);

+    }

+    else

+    {

+        Des_CPU_CLK= gPSMCurrentPow;

+    }

+    ARM_MIN_CLK = PSM_FindMinCpuClk();

+    ARM_CPU_CLK = Des_CPU_CLK> ARM_MIN_CLK ? Des_CPU_CLK:ARM_MIN_CLK;

+    

+    return ARM_CPU_CLK;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º psm_GetAIT

+* ¹¦ÄÜÃèÊö£º»ñÈ¡AIT

+* ²ÎÊý˵Ã÷£º

+                            (IN)

+                              VOID

+* ·µ »Ø Öµ£º   ·µ»ØAIT

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 psm_GetAIT(UINT32  idlecpuLoad)

+{

+    gPsm_SumIIT             +=  idlecpuLoad -psmIITIdle[psmIITCount];

+    gPsm_AIT                = gPsm_SumIIT/psmCPUCountNum;

+    psmIITIdle[psmIITCount] = idlecpuLoad;

+    psmIITCount++;

+    psmIITCount             = psmIITCount%gPsmCfg->cpuAdjustNum;

+

+    return gPsm_AIT ;

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_InterruptRoutine

+* ¹¦ÄÜÃèÊö£º TI ÖжϷþÎñ³ÌÐò

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º    ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID  PSM_InterruptRoutine(SINT32 args)

+{

+    UINT32 idlecpuLoad = 0, psm_AIT= 0, ARM_CPU_CLK =0;

+

+    if (gPSMIgnoreFlags)

+    {

+        if ( psmCPUCountNum >= gPsmCfg->cpuAdjustNum)

+        {

+            psmAdjust = 1;

+

+        }

+        else

+        {

+            psmCPUCountNum++;

+        }

+        PSM_GetCpuLoad(&idlecpuLoad);

+        psm_AIT = psm_GetAIT(idlecpuLoad);

+        ARM_CPU_CLK =  PSM_GetARM_CPU_CLK(psm_AIT);

+        if (ARM_CPU_CLK!= gPSMCurrentPow)

+        {

+            UINT32 retCode = Hal_SetArmCoreFreq(ARM_CPU_CLK);

+            if (retCode !=DRV_SUCCESS)

+            {

+                zOss_ASSERT(0);

+            }

+            PSM_ClearIITTime();

+            gPSMCurrentPow =ARM_CPU_CLK;

+        }

+        gMinCpuPerfOld = gMinCpuPerf;

+    }

+    PSM_ClearThreadCpu();

+    gPsm_CpuSumtime = 0;

+    gPsm_SwapLastTime = Osa_HwTimeRead();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_WakeUp_Init

+* ¹¦ÄÜÃèÊö£º ˯ÃßÐÑÀ´ºóÒªÐèÒªÖØÐ¼ÆËãgPsm_AITµÈ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º    ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID PSM_WakeUp_Init(VOID)

+{

+    if (pow_PsmGetUsbStatus())

+    {

+        gPSMCurrentPow = CLK156M;

+    }

+    else

+    {

+        gPSMCurrentPow = CLK78M;

+    }

+    PSM_ClearThreadCpu();

+    PSM_ClearIITTime();

+    gPsm_CpuSumtime = 0;

+    psmAdjust = 0;

+    gPsm_SwapLastTime = Osa_HwTimeRead();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_SetIgnoreThread

+* ¹¦ÄÜÃèÊö£º ÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º    ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static  VOID PSM_SetIgnoreThread(VOID)

+{

+    UINT32 i =0 ;

+    ZOSS_THREAD_ID  threadID = NULL;

+

+    for (i = 0;i<gPsmCfg->psmThrdNameNum;i++)

+    {

+        if (gPsmCfg->psmThreadName[i].threadname != NULL)

+        {

+            threadID = zOss_GetThreadIDByName(gPsmCfg->psmThreadName[i].threadname);

+            psm_SetMonitoredThread(threadID);

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_CpuIntRoutine

+* ¹¦ÄÜÃèÊö£º ´¥·¢cpu¶¯Ì¬µ÷Ƶ²É¼¯Ïß³Ì

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º    ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _OS_TOS

+VOID PSM_CpuIntRoutine(VOID)

+{

+   static UINT32 cpuCount = 0;

+   if(gPSMInitFlag)

+   {

+       cpuCount++;

+       cpuCount = cpuCount%gPsmCfg->minTimeLen;       

+       

+       if(!cpuCount)

+       {    

+          PSM_InterruptRoutine(1);

+       }

+   }

+}

+#endif

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_Init

+* ¹¦ÄÜÃèÊö£º Ê¡µç¹ÜÀí³õʼ»¯

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 PSM_Init(VOID)

+{

+    T_OSS_PARAM *pOssParam = NULL;

+

+    gPSMThreadID = zOss_CreateThread("zOss_ThreadPsm",PSM_IdleThreadEntry, 0, 1024, 31,1,1);

+    if (NULL == gPSMThreadID)

+    {

+        return ZOSS_ERROR;

+    }

+#ifdef   _USE_PSM_2BNEW

+#ifdef   _USE_APPFLAG_DFM

+    gPSMAppPowMutexID = zOss_CreateMutex(" PSMappPowMutex", ZOSS_INHERIT);

+    if (NULL == gPSMAppPowMutexID)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+#endif

+

+    pOssParam = zOss_GetOssCfg(); /*»ñȡϵͳPSMÅäÖÃ*/

+    gPsmCfg = &(pOssParam->PsmCfg);

+#ifdef _USE_CPU_DFM

+    Hal_GetArmCoreFreq(&gPSMCurrentPow);

+    psmIITIdle = zOss_Malloc(sizeof(SINT32)*gPsmCfg->cpuAdjustNum);

+    zOss_AssertEx(psmIITIdle != NULL, ZOSS_ERROR);

+    zOss_Memset(psmIITIdle, 0, (sizeof(SINT32)*gPsmCfg->cpuAdjustNum));

+    gPsmThreadTCB = zOss_Malloc(gPsmCfg->psmThrdNameNum*sizeof(PSM_IgnoreThread));

+    zOss_AssertEx(gPsmThreadTCB != NULL, ZOSS_ERROR);

+    zOss_Memset(gPsmThreadTCB, 0, gPsmCfg->psmThrdNameNum*sizeof(PSM_IgnoreThread));

+#ifdef _OS_OSE

+    start(create_process(OS_TI_PROC, "PSM_TIMER_ISR", (OSENTRYPOINT *)PSM_InterruptRoutine, (OSADDRESS)1024*20,

+                         (OSPRIORITY)gPsmCfg->cpuThreadPrior, (OSTIME)gPsmCfg->minTimeLen, (PROCESS) 0, (struct OS_redir_entry *) NULL,  (OSVECTOR) 0, (OSUSER) 0));

+#else

+    gPSMInitFlag = TRUE;

+#endif

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_SleepCheckWait

+* ¹¦ÄÜÃèÊö£º ÅжÏÄÜ·ñ½øÈëÐÝÃߵȴý£¬ÓÃÓÚGSMÐÝÃߵȴý

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߵȴý£»FALSE:²»ÄܽøÈëÐÝÃߵȴý

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+BOOL  PSM_SleepCheckWait(VOID)

+{

+    gPSM_ZspFlag    = zOss_GetZspIsidle();

+    if ((!POW_l1g_force_wake_flag)&&(!gPSM_AppIdleFlag)&& (!gPSM_DrvIdleFlag)&&(gPSM_ZspFlag==1))

+    {

+        return TRUE;

+    }

+    else

+    {

+        return FALSE;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_SleepTdCheckWait

+* ¹¦ÄÜÃèÊö£º ÅжÏÄÜ·ñ½øÈëÐÝÃߵȴý£¬ÓÃÓÚTDÎïÀí²ãÐÝÃߵȴý

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߵȴý£»FALSE:²»ÄܽøÈëÐÝÃߵȴý

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+BOOL  PSM_SleepTdCheckWait(VOID)

+{

+    if ((!POW_l1g_force_wake_flag)&&(!gPSM_AppIdleFlag)&& (!gPSM_DrvIdleFlag))

+    {

+        return TRUE;

+    }

+    else

+    {

+        return FALSE;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_SleepT1toMeasure

+* ¹¦ÄÜÃèÊö£º ÅжÏÄÜ·ñ½øÈëtdd½øÈët1--measureÄÚºËÊ¡µç

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef   _USE_PSM_HANDSET

+BOOL  PSM_SleepT1toMeasure(VOID)

+{

+    UINT16 gdpram_pich          = 0;

+    UINT16 armt1_pich           = 0;

+    UINT32 gPSM_TdstartFram_t1  = 0;

+    UINT32 gPSM_TdstartChip_t1  = 0;

+    gdpram_pich =pow_PsmPichFlag();

+    zOss_GetZspTime(&gPSM_TdstartFram_t1,&gPSM_TdstartChip_t1); /*read cunrrent fc ,cc*/

+    if (gdpram_pich ==2)

+    {

+        return FALSE;

+    }

+    if(POW_l1g_force_wake_flag)

+    {

+      return FALSE;

+    }

+    if(!zL1t_TaskIsIdle())  /*Èç¹ûtddÏÂpsÈÎÎñΪæ*/

+    {

+        return FALSE;

+    }

+    g_testt1pichsleep =zDrvTimer_ReadTimerPSM(3);

+    if (g_testt1pichsleep <g_tdt1wakeup_psm)

+    {

+        return FALSE;

+    }

+    if ((g_testt1pichsleep -g_tdt1wakeup_psm)<gPsmCfg->tddT1PichSleepTimeLen )

+    {

+        return FALSE;

+    }

+

+    gPSM_ZspFlag=zOss_GetZspIsidle();

+    if ((gPSM_ZspFlag==1)||(gPSM_ZspFlag ==0))

+    {

+        return FALSE;

+    }

+    armt1_pich = pow_PsmT1IsrFlag();

+    if (armt1_pich != 1)

+    {

+        return FALSE;

+    }

+    

+    return TRUE;

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_OffsetUpperTimer

+* ¹¦ÄÜÃèÊö£º ²¹³¥Éϲ㶨ʱÆ÷(GUIºÍPS)

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID PSM_OffsetUpperTimer(VOID)

+{

+    gPsm_SleepTimeForGui    += gPsm_SleepTime;

+    gRTCTimeToOSTimeFlag    = 1;

+    gTimer_CurTime          += gPsm_SleepTime;

+    gPsm_SleepTicks         += gPsm_SleepTime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_SleepCheck

+* ¹¦ÄÜÃèÊö£º ÅжÏÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+BOOL  PSM_SleepCheck(T_Psm_SysType sys_mode)

+{

+    UINT32 td_sleeptime=0,td_sleepfram=0,td_sleepChip=0;

+

+    ZOSS_INTR old_intr;

+

+#ifdef   _USE_PSM_HANDSET

+    T_Psm_SleepMode sleepmode;

+    UINT32 td_zsp2sleepfc       = 0;

+    UINT32 td_zsp2sleepcc       = 0;

+    UINT32 td_zsp2sleeplen      = 0;

+    UINT32 gPSM_TdstartFram_t1  = 0;

+    UINT32 gPSM_TdstartChip_t1  = 0;

+    UINT16 gdpram_pich          = 0;

+    WORD   current_drx          = 0;

+    UINT16 armt1_pich           = 0;

+    UINT16 arml1tmessage        = 0;

+    UINT32 g_td_zsp2sleeplen    = 0;

+#endif

+

+    gPSM_ZspFlag=zOss_GetZspIsidle();

+

+#ifdef   _USE_PSM_HANDSET

+    armt1_pich = pow_PsmT1IsrFlag();

+#endif

+

+    if (gPSM_ZspFlag==1)

+    {

+#if USE_PSM_TEST

+        *(volatile U32 *)(0x60004008) = *(volatile U32 *)(0x60004008) & (~(1<<12));

+        *(volatile U32 *)(0x60000028) = *(volatile U32 *)(0x60000028) | (1<<12);

+        *(volatile U32 *)(0x60000008) = *(volatile U32 *)(0x60000008)| (1<<12);

+#endif

+        zOss_GetZsp_AllowSleepTime(&td_sleepfram,&td_sleepChip,&td_sleeptime);

+        if ((sys_mode==SYS_TD)&&(td_sleeptime>PSM_TD_MAX_SLEEP_FRAMENUM*PSM_TD_FRAME_MS))

+        {

+            return FALSE;

+        }

+        if(!zL1t_TaskIsIdle())

+        {

+             return FALSE;

+        }

+        gPSM_L1gIdleFlag=POW_L1g_OsIdleLoopHandler((UINT32)sys_mode);

+        

+#if USE_PSM_TEST

+        *(volatile U32 *)(0x60000008) = *(volatile U32 *)(0x60000008) & (~(1<<12));

+#endif

+        if ((gPSM_L1gIdleFlag)&& (!gPSM_AppIdleFlag)&& (!gPSM_DrvIdleFlag)&&(gPsm_SleepTime==0))

+        {

+            return TRUE;

+        }

+    }

+    

+#ifdef  _USE_PSM_HANDSET

+    else if (gPSM_ZspFlag ==2 )

+    {

+        if ((gPSM_L1gIdleFlag)&& (!gPSM_AppIdleFlag)&& (!gPSM_DrvIdleFlag)&&(POW_l1g_force_wake_flag==FALSE)&&(gPsm_SleepTime==0))

+        {

+            ZOSS_SAVE_IRQ(old_intr);

+            

+            /**********ÅжÏЭÒéÕ»ÈÎÎñÊÇ·ñ¿ÕÏУ¬Èç¹ûΪæ£¬·µ»ØFLASE,Í˳öÊ¡µçÁ÷³Ì*************/

+            if (!zL1t_TaskIsIdle())

+            {

+                ZOSS_RESTORE_IRQ(old_intr);                

+                

+                return PSM_NO_SLEEP;

+            }

+            /****************************************************************/

+            

+            if (g_psm_deepsleeplen>=gPsmCfg->secondSleepTimeLen)

+            {

+                

+                zOss_GetZspTime(&td_zsp2sleepfc,&td_zsp2sleepcc);

+                td_zsp2sleeplen =Psm_ZspFramToMs(g_psm_deepsleepwakeupfc,g_psm_deepsleepwakeupcc,td_zsp2sleepfc,td_zsp2sleepcc);			 

+                

+                if(g_psm_deepsleeplen>td_zsp2sleeplen)

+                {

+                    g_td_zsp2sleeplen=g_psm_deepsleeplen-td_zsp2sleeplen;		   

+                }

+                

+                if (g_td_zsp2sleeplen>=gPsmCfg->secondSleepTimeLen)

+                {

+                    g_psm_zsp2sleeptimeflag =TRUE;

+                }

+            }

+            gPSM_ZspFlag=zOss_GetZspIsidle();

+            if ((gPSM_L1gIdleFlag)&&(!gPSM_AppIdleFlag)&&(!gPSM_DrvIdleFlag)&&(POW_l1g_force_wake_flag==FALSE)&&(gPSM_ZspFlag ==2)&&(g_psm_zsp2sleeptimeflag)&&(gPsm_SleepTime==0))

+            {

+                g_psm_zsp2sleeptimeflag =FALSE;

+                sleepmode = PSM_DEEP_SLEEP;

+              

+                zOss_GetZspTime(&g_psm_sleepagofc,&g_psm_sleepagocc);

+                psm_sleep_handle(sleepmode);

+

+                zOss_GetZspTime(&g_psm_wakeupfc,&g_psm_wakeupcc);

+                gPsm_SleepTime +=Psm_ZspFramToMs(g_psm_sleepagofc,g_psm_sleepagocc,g_psm_wakeupfc,g_psm_wakeupcc);

+                PSM_OffsetUpperTimer();/*¶¨Ê±Æ÷²¹³¥*/

+                PSM_WakeUp_Init();

+            }

+

+            ZOSS_RESTORE_IRQ(old_intr);

+

+            return FALSE;

+        }

+    }

+    else if ( ((gPSM_ZspFlag==2)&&(armt1_pich ==1)&&(sys_mode==SYS_TD)&&(!pow_PsmGetUsbStatus())&&(gPsm_SleepTime==0))||(((gPSM_ZspFlag==3)&&(armt1_pich ==1)&&(sys_mode==SYS_TD)&&(!pow_PsmGetUsbStatus())&&(gPsm_SleepTime==0))))

+    {

+        current_drx =zPS_urrc_rbc_get_drx_for_PSM();

+        if ((current_drx == 640)||(current_drx ==1280)) /*Ö»ÓÐdrx=640ms,1280ms²ÅʹÓø÷½°¸*/

+        {

+            if ((!gPSM_AppIdleFlag)&&(!gPSM_DrvIdleFlag)&&(!POW_l1g_force_wake_flag))

+            {                 

+                ZOSS_SAVE_IRQ(old_intr);                

+                

+                if (!PSM_SleepT1toMeasure())

+                {

+                    POW_l1g_wakeup_by_td_only();

+                       

+                    ZOSS_RESTORE_IRQ(old_intr);

+                       

+                    return FALSE;

+                }

+               

+                zOss_GetZspTime(&g_psm_sleepagofc,&g_psm_sleepagocc);

+                pow_PsmT1PichSleep();

+                POW_l1g_wakeup_by_td_only();/*t1---±¨²âÁ¿ÆÚ¼äarmÄÚºËÊ¡µç£¬td±¨²âÁ¿·¢icp¸øarm²Å»½ÐÑl1g*/

+

+                zOss_GetZspTime(&g_psm_wakeupfc,&g_psm_wakeupcc);

+                gPsm_SleepTime +=Psm_ZspFramToMs(g_psm_sleepagofc,g_psm_sleepagocc,g_psm_wakeupfc,g_psm_wakeupcc);			

+                PSM_OffsetUpperTimer();/*¶¨Ê±Æ÷²¹³¥*/

+                PSM_WakeUp_Init();

+

+                ZOSS_RESTORE_IRQ(old_intr);

+            }

+        }

+    }

+    else

+    {

+        psm_sleep_handle(PSM_KENEL_SLEEP);

+    }

+#endif

+

+    return FALSE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_SleepEnableCheck

+* ¹¦ÄÜÃèÊö£º ÅжÏÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+BOOL  PSM_SleepEnableCheck(VOID)

+{

+    gPSM_ZspFlag=zOss_GetZspIsidle();

+

+    if ((!POW_l1g_force_wake_flag)&&(!gPSM_AppIdleFlag)&& (!gPSM_DrvIdleFlag)&&(gPSM_ZspFlag==2))

+    {

+        return TRUE;

+    }

+    else

+    {

+        return FALSE;

+    }

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_SleepTdFlagCheck

+* ¹¦ÄÜÃèÊö£º ÅжÏTDÎïÀí²ã±êÖ¾ÊÇ·ñµ±Ç°µÄ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+BOOL  PSM_SleepTdFlagCheck(VOID)

+{

+    gPSM_ZspFlag = zOss_GetZspIsidle();

+    if ((gPSM_ZspFlag==1)||(gPSM_ZspFlag==3))

+    {

+        return TRUE;

+    }

+    else

+    {

+        return FALSE;

+    }

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_SleepCAmpOnCheck

+* ¹¦ÄÜÃèÊö£º ÅжÏÊÇ·ñפÁôÍøÂç³É¹¦

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+

+BOOL  PSM_SleepCampOnCheck(VOID)

+{    

+    if ((l1g_camp_on_cell_flag) || (pow_PsmGetCamon()==1))

+    {

+        return TRUE;

+    }

+    else

+    {

+        return FALSE;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_ZspFramToMs

+* ¹¦ÄÜÃèÊö£º °ÑÖ¡Êýת»¯Îªms

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+

+UINT32  Psm_ZspFramToMs(UINT32 framestart,UINT32 chipstart,UINT32 frameend,UINT32 chipend)

+{

+    UINT32 frame_num=0,chip_num=0,ms=0;

+

+    if (frameend>=framestart)

+    {

+        frame_num=frameend-framestart;

+    }

+    else

+    {

+        frame_num=frameend+PSM_TD_MAX_FRAMENUM-framestart;

+    }

+

+    if (chipend>=chipstart)

+    {

+        chip_num=chipend-chipstart;

+    }

+    else if (chipend<chipstart)

+    {

+        chip_num=chipend+PSM_TD_MAX_CHIPNUM-chipstart;

+        if (frame_num>0)

+        {

+            frame_num--;

+        }

+    }

+

+    ms=frame_num*PSM_TD_FRAME_MS+(chip_num*PSM_TD_CHIP_MS);

+    return ms;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Psm_ZspMsToFram

+* ¹¦ÄÜÃèÊö£º °Ñmsת»¯Îªframe

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID  Psm_ZspMsToFram(UINT32 framestart,UINT32 chipstart,UINT32 *frameend,UINT32 *chipend,UINT32 len)

+{

+    UINT32 frame_num=0,chip_num=0;

+

+    chip_num=(len%PSM_TD_FRAME_MS)/PSM_TD_CHIP_MS;

+    frame_num=len/PSM_TD_FRAME_MS;

+

+    if (chipstart+chip_num>=PSM_TD_MAX_CHIPNUM)

+    {

+        chip_num=chipstart+chip_num-PSM_TD_MAX_CHIPNUM;

+        frame_num=framestart+frame_num+1;

+    }

+    else

+    {

+        chip_num=chipstart+chip_num;

+        frame_num=framestart+frame_num;

+    }

+    if (frame_num>=PSM_TD_MAX_FRAMENUM)

+    {

+        frame_num=frame_num-PSM_TD_MAX_FRAMENUM;

+    }

+    *frameend=frame_num;

+    *chipend=chip_num;

+

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ£º psm_GSMSleepMode

+* ¹¦ÄÜÃèÊö£º ÅжÏÔÚGSMģʽÏÂÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽÒÔ¼°¿ÉÒÔ½øÈëµÄÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºPSM_DEEP_SLEEP:¿ÉÒÔ½øÈëÉî˯Ãߣ»PSM_SHALLOW_SLEEP:¿ÉÒÔ½øÈëdz˯Ãß;PSM_NO_SLEEP:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static T_Psm_SleepMode psm_GSMSleepMode(VOID)

+{

+    T_Psm_SleepMode sleep_mode  = PSM_NO_SLEEP;

+    UINT32 gsm_sleeptime        = 0;

+

+    gsm_sleeptime=gL1gSleepTime;

+    gPsm_Gsmtime=SPCU_get_l1g_sleep_time();

+

+    if (gPsm_Gsmtime*PSM_GSM_FRAME_MS>=gsm_sleeptime)

+    {

+        sleep_mode=PSM_NO_SLEEP;

+    }

+    else if ((gsm_sleeptime-gPsm_Gsmtime*PSM_GSM_FRAME_MS)>gPsmCfg->deepSleepTimeLen)

+    {

+        sleep_mode=PSM_DEEP_SLEEP;

+    }

+    /*else if((gsm_sleeptime-gPsm_Gsmtime*PSM_GSM_FRAME_MS)>PSM_ENABLE_SHALLOWSLEEPTIME)

+         sleep_mode=PSM_SHALLOW_SLEEP;*/

+    else

+    {

+        sleep_mode=PSM_NO_SLEEP;

+    }

+    

+    return sleep_mode;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º psm_TdSleepMode

+* ¹¦ÄÜÃèÊö£º ÅжÏÔÚTDģʽÏÂÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽÒÔ¼°¿ÉÒÔ½øÈëµÄÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºPSM_DEEP_SLEEP:¿ÉÒÔ½øÈëÉî˯Ãߣ»PSM_SHALLOW_SLEEP:¿ÉÒÔ½øÈëdz˯Ãß;PSM_NO_SLEEP:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static T_Psm_SleepMode psm_TdSleepMode(VOID)

+{

+    T_Psm_SleepMode tdsleep_mode=PSM_NO_SLEEP;

+    UINT32 td_sleeptime=0,ps_timer=0,td_temptime=0;

+    UINT32 td_sleepfram=0,td_sleepChip=0,td_Setsleepfram=0,td_SetsleepChip=0;

+/**********ÅжÏЭÒéÕ»ÈÎÎñÊÇ·ñ¿ÕÏУ¬Èç¹ûΪæ£¬·µ»ØFLASE,Í˳öÊ¡µçÁ÷³Ì*************/

+#ifdef   _USE_PSM_HANDSET

+    if(!zL1t_TaskIsIdle())

+    {

+        return PSM_NO_SLEEP;

+    }

+#endif 

+/****************************************************************/

+

+    zOss_GetZsp_AllowSleepTime(&td_sleepfram,&td_sleepChip,&td_sleeptime);

+    zOss_GetZspTime(&gPSM_TdstartFram,&gPSM_TdstartChip);

+    ps_timer=zOss_GetPs_SleepTimer();

+    td_temptime=Psm_ZspFramToMs(td_sleepfram,td_sleepChip,gPSM_TdstartFram,gPSM_TdstartChip);

+    if (td_temptime>=td_sleeptime)

+    {

+        return PSM_NO_SLEEP;

+    }

+

+    td_sleeptime=td_sleeptime-td_temptime;

+    td_sleeptime=td_sleeptime>ps_timer?ps_timer:td_sleeptime;

+

+    gPSM_ZspFlag=zOss_GetZspIsidle();

+    if (gPSM_ZspFlag!=1)

+    {

+        return PSM_NO_SLEEP;

+    }

+

+    if (td_sleeptime>gPsmCfg->deepSleepTimeLen)

+    {

+        tdsleep_mode=PSM_DEEP_SLEEP;

+        Psm_ZspMsToFram(gPSM_TdstartFram,gPSM_TdstartChip,&td_Setsleepfram,&td_SetsleepChip,td_sleeptime);

+#ifdef  _USE_PSM_HANDSET

+        g_psm_deepsleeplen1 =td_sleeptime;

+#endif

+        zOss_SetZspSleepTime(td_Setsleepfram,td_SetsleepChip);

+

+    }

+    /*else if(td_sleeptime>PSM_ENABLE_SHALLOWSLEEPTIME)

+    {

+         tdsleep_mode=PSM_SHALLOW_SLEEP;

+         Psm_ZspMsToFram(gPSM_TdstartFram,gPSM_TdstartChip,&td_Setsleepfram,&td_SetsleepChip,td_sleeptime);

+         zOss_SetZspSleepTime(td_Setsleepfram,td_SetsleepChip);

+     }*/

+    else

+        tdsleep_mode=PSM_NO_SLEEP;

+

+    return tdsleep_mode;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º psm_sleep_handle

+* ¹¦ÄÜÃèÊö£º Ê¡µç´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷£ºsleep_mode:ÐÝÃßģʽ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_sleep_handle(T_Psm_SleepMode sleep_mode)

+{

+    if (gPSM_Hook.SleepHook)

+    {

+        gPSM_Hook.SleepHook();/*˯Ãßǰhook*/

+    }

+

+    switch(sleep_mode)

+    {

+        case PSM_KENEL_SLEEP:

+        {

+            sleep_flag=FALSE;

+            gPSM_KenelSleepFunc(sleep_mode);/*ÄÚºËÊ¡µç*/

+            break;

+        }

+        case PSM_DEEP_SLEEP:

+        case PSM_BOOTING_SLEEP:

+        case PSM_LOSSCOVERAGE_SLEEP:

+        case PSM_AIRPLANE_SLEEP:

+        case PSM_CHARGERING_SLEEP:

+        {

+            sleep_flag=TRUE;

+            gPSM_DeepSleepFunc(sleep_mode);/*Éî˯Ãß*/

+            break;

+        }

+        case PSM_SHALLOW_SLEEP:

+        {

+            sleep_flag=TRUE;

+            gPSM_ShallowSleepFunc(sleep_mode);/*dz˯Ãß*/

+            break;

+        }

+        default:

+            break;

+    }

+

+    if (gPSM_Hook.WakeupHook)

+    {

+        gPSM_Hook.WakeupHook();/*ϵͳ¼¤»îºóhook*/

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_InstallSleep

+* ¹¦ÄÜÃèÊö£º °²×°Ë¯Ãß´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷£º

+                             shallowSleep:dz˯Ãß´¦Àíº¯Êý

+                             deepSleep:Éî˯Ãß´¦Àíº¯Êý

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_InstallSleep(PSM_SleepFunc shallowSleep,PSM_SleepFunc deepSleep,PSM_SleepFunc kernelSleep)

+{

+    gPSM_KenelSleepFunc     = kernelSleep;

+    gPSM_ShallowSleepFunc   = shallowSleep;

+    gPSM_DeepSleepFunc      = deepSleep;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_InstallPsmHook

+* ¹¦ÄÜÃèÊö£º °²×°Ë¯ÃßHOOK´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷£º

+                           (IN)

+                              hook:hook½á¹¹Ö¸Õë

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_InstallPsmHook(T_ZOSS_PSM_HOOK *hook)

+{

+    gPSM_Hook.SleepHook     = hook->SleepHook;

+    gPSM_Hook.WakeupHook    = hook->WakeupHook;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetLcdPsmFlag

+* ¹¦ÄÜÃèÊö£º ÉèÖÃÆÁÄ»ÐÝÃß±ê־λ

+* ²ÎÊý˵Ã÷£º

+                           (IN)

+                              flag:TRUE±íʾÆÁÄ»ÐÝÃߣ¬FALSE±íʾÆÁÄ»¼¤»î

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_SetLcdPsmFlag(BOOL flag)

+{

+    gPSM_LCDPSMFlag = flag;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetSysInitFinish

+* ¹¦ÄÜÃèÊö£º ÉèÖÃϵͳ³õʼ»¯Íê³É±ê־λ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+void zOss_SetBootStage(T_Psm_BootStage stage)

+{

+    gPSM_BootStageFlag = stage;

+}

+

+T_Psm_BootStage zOss_GetBootStage(void)

+{

+    return gPSM_BootStageFlag;

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_PoweroffChargerSleep

+* ¹¦ÄÜÃèÊö£º ¹Ø»ú³äµçÊ¡µç´¦Àí

+* ²ÎÊý˵Ã÷£º

+             ÎÞ

+                        

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static void PSM_PoweroffChargerSleep(void)

+{

+    UINT32 lefttime = 0;

+    T_ZDrvChg_Info_Data state = 0;

+

+    gPsm_SleepTime = gPsmCfg->chargeringSleepTime;

+    if(gPsm_SleepTime>0)

+    {

+        /*¹Ø»úºó³äµç¿ª»ú*/

+        halChg_status_get(&state);

+        if(CHG_STATE_CHARGING==state)

+        {

+            zDrvTimer_StartTimerPSM(2,gPsm_SleepTime,FALSE);

+

+            psm_sleep_handle(PSM_CHARGERING_SLEEP);

+

+            lefttime                = zDrvTimer_ReadTimerPSM(2);

+            gPsm_SleepTime          = gPsm_SleepTime - lefttime;

+            gPsm_SleepTimeForGui    += gPsm_SleepTime;

+            gRTCTimeToOSTimeFlag    = 1;

+            gTimer_CurTime          += gPsm_SleepTime;

+            gPsm_SleepTicks         += gPsm_SleepTime;

+            PSM_WakeUp_Init();

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_BootSleep

+* ¹¦ÄÜÃèÊö£º ¿ª»úÍê³Éǰʡµç´¦Àí

+* ²ÎÊý˵Ã÷£º

+             ÎÞ

+                        

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static void PSM_BootSleep(void)

+{

+    SINT32 i = 0, poweron_state  = 0;

+

+    ZOSS_INTR old_intr;

+

+    T_Psm_SleepMode sleep_mode = PSM_NO_SLEEP;

+

+    poweron_state = zOss_GetPoweronState();

+    pow_SetTdL1SleepFlag(1);

+

+    while(gPSM_BootStageFlag != PSM_BOOT_FINISH)

+    {

+        if(PSM_BOOT_DEFAULT == gPSM_BootStageFlag)

+        {

+            continue;

+        }

+

+        gSleep_CampOn_flag=PSM_SleepCampOnCheck();

+        if (gSleep_CampOn_flag)

+        {

+#ifdef _USE_CPU_DFM

+            PSM_SetIgnoreThread();

+

+            ZOSS_SAVE_IRQ(old_intr);

+

+            PSM_ClearThreadCpu();

+            gPSMIgnoreFlags = TRUE;

+

+            ZOSS_RESTORE_IRQ(old_intr);

+

+#endif

+            gPSM_BootStageFlag = PSM_BOOT_FINISH;

+            break;

+        }

+

+        sleep_mode      = PSM_NO_SLEEP;

+        gPSM_ZspFlag    = zOss_GetZspIsidle();

+        if((gPSM_ZspFlag==1 || gPSM_ZspFlag==2) && (gPSM_BootStageFlag==PSM_SYSINIT_FINISH))

+        {

+            gPSM_L1gIdleFlag = POW_L1g_OsIdleLoopHandler(SYS_TD);

+

+            ZOSS_SAVE_IRQ(old_intr);

+

+            if(gPSM_L1gIdleFlag)

+            {

+                if(gPSM_LCDPSMFlag && (gPSM_DrvIdleFlag==0) && (POW_l1g_force_wake_flag==FALSE))

+                {

+

+#ifndef _USE_DATACARD

+                    g_psmsleeprtctime = Rtc_PsmGetTime(); /****************CQNJ00216067******/

+#endif

+                    if(poweron_state==SYSM_POWER_ON_CHARGING)

+                    {

+                        PSM_PoweroffChargerSleep();

+                    }

+                    else

+                    {

+                        /*¿ª»úÍ£ÁôÊäÈëPINÂë¡¢ÊÖ»úÃÜÂë½çÃæÊ¡µç*/

+                        sleep_mode = PSM_BOOTING_SLEEP;

+                        psm_sleep_handle(sleep_mode);

+                        PSM_WakeUp_Init();

+                    }

+#ifndef _USE_DATACARD

+                    g_psmwakeuprtctime = Rtc_PsmGetTime();/***CQNJ00216067***/

+                    Rtc_PsmMinInt();/***************CQNJ00216067*************/

+#endif

+                }

+                POW_l1g_wakeup_by_td_only();

+            }

+

+            ZOSS_RESTORE_IRQ(old_intr);

+

+#ifdef _USE_CPU_DFM

+            if(sleep_mode==PSM_BOOTING_SLEEP)

+            {

+                Hal_SetArmCoreFreq(gPsmCfg->sysClk[gPsmCfg->sysClkNum-1]);/*Ìá¸ßµ½×î¸ßÖ÷Ƶ,²»È»¿ª»úÑÓ³Ù*/

+                gPSMCurrentPow = gPsmCfg->sysClk[gPsmCfg->sysClkNum-1];

+            }

+#endif

+        }

+#ifndef _OS_TOS

+        i++;

+        if ((gRTCTimeToOSTimeFlag == 1)||(!(i%3000000)))

+        {

+            SYSTIME_Init();

+            gRTCTimeToOSTimeFlag = 0;

+            i = 0;

+        }

+#endif

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_LossCoverageSleep

+* ¹¦ÄÜÃèÊö£º ¶ªÊ§¸²¸Ç˯Ãß

+* ²ÎÊý˵Ã÷£º

+             ÎÞ

+                        

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static void PSM_LossCoverageSleep(void)

+{

+    UINT32 leftTime     = 0;

+    BYTE lossflag       = 0;

+

+    ZOSS_INTR old_intr;

+

+    if ((!gPSM_AppIdleFlag) && (!gPSM_DrvIdleFlag)&&(gPsm_SleepTime==0))

+    {

+        pow_SetTdL1SleepFlag(1);

+        gPSM_L1gIdleFlag = POW_L1g_OsIdleLoopHandler(SYS_TD);

+

+

+        ZOSS_SAVE_IRQ(old_intr);

+

+        if(gPSM_L1gIdleFlag)

+        {

+            if ((!gPSM_AppIdleFlag) && (!gPSM_DrvIdleFlag)&&(gPsm_SleepTime==0))

+            {

+                lossflag = zPS_umm_IsLossOfCoverage();

+                gPsm_SleepTime = zOss_GetPs_SleepTimer();

+                gPSM_ZspFlag = zOss_GetZspIsidle();

+                if(lossflag && (gPSM_ZspFlag==1 || gPSM_ZspFlag==2) && (POW_l1g_force_wake_flag==FALSE) &&(gPsm_SleepTime>gPsmCfg->deepSleepTimeLen))

+                {

+                    gSleep_CampOn_flag = FALSE;

+                    zDrvTimer_StartTimerPSM(2,gPsm_SleepTime,FALSE);

+

+                    psm_sleep_handle(PSM_LOSSCOVERAGE_SLEEP);

+

+                    leftTime                = zDrvTimer_ReadTimerPSM(2);

+                    gPsm_SleepTime          = gPsm_SleepTime - leftTime; 

+                    gPsm_SleepTimeForGui    += gPsm_SleepTime;

+                    gRTCTimeToOSTimeFlag    = 1;

+                    gTimer_CurTime          += gPsm_SleepTime;

+                    gPsm_SleepTicks         +=gPsm_SleepTime;

+                    PSM_WakeUp_Init();

+                }

+            }

+            POW_l1g_wakeup_by_td_only();

+        }

+        ZOSS_RESTORE_IRQ(old_intr);

+

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_AirplaneSleep

+* ¹¦ÄÜÃèÊö£º·ÉÐÐģʽ˯Ãß

+* ²ÎÊý˵Ã÷£º

+             ÎÞ

+                        

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _USE_SMARTPHONE

+UINT32 g_testairplane=0;

+static void PSM_AirplaneSleep(void)

+{

+    UINT32 leftTime1    = 0;

+    UINT32 leftTime2    = 0;

+    BYTE Airplaneflag   = 0;

+    ZOSS_INTR old_intr;

+

+    if ((!gPSM_AppIdleFlag) && (!gPSM_DrvIdleFlag)&&(gPsm_SleepTime==0))

+    {

+        gPSM_L1gIdleFlag = POW_L1g_OsIdleLoopHandler(SYS_TD);

+        ZOSS_SAVE_IRQ(old_intr);

+        if(gPSM_L1gIdleFlag)

+        {

+            if ((!gPSM_AppIdleFlag) && (!gPSM_DrvIdleFlag)&&(gPsm_SleepTime==0))

+            {

+                Airplaneflag = zAti2_PsIsInFlyMode();   

+                gPSM_ZspFlag = zOss_GetZspIsidle();

+                if(Airplaneflag && (gPSM_ZspFlag==1 || gPSM_ZspFlag==2) && (POW_l1g_force_wake_flag==FALSE) )

+                { 

+                    leftTime1 = zDrvTimer_ReadTimerPSM(3);

+                    g_testairplane = 1;

+        

+                    psm_sleep_handle(PSM_AIRPLANE_SLEEP);

+

+                    leftTime2 = zDrvTimer_ReadTimerPSM(3);

+

+                    gPsm_SleepTime = leftTime1 - leftTime2;

+                    zDrvRamlog_PRINTF(RAMLOG_MOD_AP2CP, "timer(%d)\n",gPsm_SleepTime);

+

+                    gPsm_SleepTimeForGui    += gPsm_SleepTime;

+                    gRTCTimeToOSTimeFlag    = 1;

+                    gTimer_CurTime          += gPsm_SleepTime;

+                    gPsm_SleepTicks         += gPsm_SleepTime;

+                    PSM_WakeUp_Init();

+                    POW_l1g_wakeup_by_td_only(); 

+                }

+            }            

+        }

+        ZOSS_RESTORE_IRQ(old_intr);

+    }

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_IdleThreadEntry

+* ¹¦ÄÜÃèÊö£º ¿ÕÏйÜÀí¿ÕÏÐÏß³ÌÈë¿Ú

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID PSM_IdleThreadEntry(SINT32 ignore)

+{

+    BOOL  sleep_Enable=FALSE;

+   // T_Psm_SysType sys_type=SYS_MAX_TYPE;

+    T_Psm_SleepMode sleep_mode = PSM_MAX_SLEEP;

+    UINT32 tdSleep_frame = 0, tdSleep_chip = 0;

+    SINT32 i = 0,  iCount = 0;

+

+    ZOSS_INTR old_intr;

+

+#ifdef _OS_TOS

+    zOss_SuspendThread(cyg_thread_idle_thread());

+#endif

+#ifdef _OS_OSE

+    zOss_Sleep(5000);/*±ÜÃâÕý³£¿ª»ú˯Ãß*/

+#endif

+    PSM_BootSleep(); /*U207ÐèÇó*/

+

+    for(;;)

+    {

+        if (!gSleep_CampOn_flag)

+        {

+            gSleep_CampOn_flag=PSM_SleepCampOnCheck();

+            sleep_Enable =FALSE;

+            

+#ifdef _USE_CPU_DFM

+            if (gSleep_CampOn_flag)

+            {

+                PSM_SetIgnoreThread();

+                

+                ZOSS_SAVE_IRQ(old_intr);

+                

+                PSM_ClearThreadCpu();

+                gPSMIgnoreFlags = TRUE;

+                

+                ZOSS_RESTORE_IRQ(old_intr);                

+            }

+#endif

+        }

+        else

+        {

+            sys_type        = zPS_umm_GetPossibleAct();

+            sleep_Enable    = PSM_SleepCheck(sys_type);

+        }

+        if (sleep_Enable)

+        {

+            ZOSS_SAVE_IRQ(old_intr);

+            

+#ifndef _USE_DATACARD

+            g_psmsleeprtctime = Rtc_PsmGetTime(); /****************CQNJ00216067******/

+#endif

+            /**************·ÀÖ¹l1g״̬Ïß³ÌÇл»****************************/

+            if (POW_l1g_force_wake_flag)

+            {                

+                ZOSS_RESTORE_IRQ(old_intr);

+                

+                continue;

+            } 

+            /**********************************************/

+            

+            if (sys_type==SYS_GSM)

+            {

+                sleep_mode=psm_GSMSleepMode();

+                if (PSM_NO_SLEEP!=sleep_mode)

+                {

+                    sleep_Enable=PSM_SleepCheckWait();

+                    if (!sleep_Enable)

+                    {

+#ifndef _USE_DATACARD

+                        g_psmwakeuprtctime = Rtc_PsmGetTime();/*****CQNJ00216067*****/

+#endif

+                    

+                        ZOSS_RESTORE_IRQ(old_intr);

+                      

+                        continue;

+                    }

+#if USE_PSM_TEST

+                    *(volatile U32 *)(0x60004008) = *(volatile U32 *)(0x60004008) & (~(1<<13));

+                    *(volatile U32 *)(0x60000028) = *(volatile U32 *)(0x60000028) | (1<<13);

+                    *(volatile U32 *)(0x60000008) =  *(volatile U32 *)(0x60000008)| (1<<13);

+#endif

+                    psm_sleep_handle(sleep_mode);

+#if USE_PSM_TEST

+                    *(volatile U32 *)(0x60000008) = *(volatile U32 *)(0x60000008) & (~(1<<13));

+#endif

+

+                    if (sleep_flag)

+                    {

+                        gPsm_SleepTime          += (SPCU_get_l1g_sleep_time()-gPsm_Gsmtime)*PSM_GSM_FRAME_MS;

+                        gPsm_SleepTimeForGui    += gPsm_SleepTime;

+                        gRTCTimeToOSTimeFlag    =  1;

+                        gTimer_CurTime          += gPsm_SleepTime;

+                        gPsm_SleepTicks         += gPsm_SleepTime;

+                    }

+                }

+            }

+            else if (sys_type==SYS_TD)

+            {

+                sleep_mode=psm_TdSleepMode();

+                if (PSM_NO_SLEEP!=sleep_mode)

+                {

+                    sleep_Enable=PSM_SleepEnableCheck();

+                    iCount=0;

+                    while (!sleep_Enable)

+                    {

+                        if ((!PSM_SleepTdCheckWait())||(PSM_SleepTdFlagCheck()))

+                        {

+#ifndef _USE_DATACARD

+                            g_psmwakeuprtctime = Rtc_PsmGetTime();/***CQNJ00216067***/

+#endif

+

+                            ZOSS_RESTORE_IRQ(old_intr);

+

+                            break;

+                        }

+                        for (i=0; i<1500; i++)                //240Mhz   ¸ÃforÑ­»·´óÔ¼ÐèÒª950us×óÓÒ

+                        {

+                            sleep_Enable=PSM_SleepEnableCheck();

+                            if (sleep_Enable == TRUE)

+                            {

+                                break;

+                            }

+                        }

+                        iCount++;

+                        if (iCount>1000)                     //µÈ´ýÒ»¶Îʱ¼ä°ÑIRQ´ò¿ª,±ÜÃâËÀµÈ¡£

+                        {

+

+                            ZOSS_RESTORE_IRQ(old_intr);

+                    break;

+                        }

+

+                    }

+                    if (sleep_Enable)

+                    {

+#if USE_PSM_TEST

+                        *(volatile U32 *)(0x60004008) = *(volatile U32 *)(0x60004008) & (~(1<<14));

+                        *(volatile U32 *)(0x60000028) = *(volatile U32 *)(0x60000028) | (1<<14);

+                        *(volatile U32 *)(0x60000008) = *(volatile U32 *)(0x60000008)| (1<<14);

+#endif

+                        zOss_GetZspTime(&g_psm_sleepagofc,&g_psm_sleepagocc);/*»ñȡ˯Ãßǰʱ¼ä*/

+                        psm_sleep_handle(sleep_mode);

+#if USE_PSM_TEST

+                        *(volatile U32 *)(0x60000008) = *(volatile U32 *)(0x60000008) & (~(1<<14));

+#endif

+                        if (sleep_flag)

+                        {

+                            zOss_GetZspTime(&tdSleep_frame,&tdSleep_chip);

+                            gPsm_SleepTime +=Psm_ZspFramToMs(g_psm_sleepagofc,g_psm_sleepagocc,tdSleep_frame,tdSleep_chip);

+#ifdef   _USE_PSM_HANDSET

+                            g_psm_deepsleeplen = g_psm_deepsleeplen1 - gPsm_SleepTime;

+                            if (g_psm_deepsleeplen>=gPsmCfg->secondSleepTimeLen)

+                            {

+                                g_psm_deepsleepwakeupfc =tdSleep_frame;

+                                g_psm_deepsleepwakeupcc =tdSleep_chip;

+                            }

+#endif

+                            PSM_OffsetUpperTimer(); /*²¹³¥Éϲ㶨ʱÆ÷*/                    

+                        }

+                    }

+                }

+            }

+

+#ifdef   _USE_PSM_2BNEW

+            Hal_GetArmCoreFreq(&gPSMCurrentPow);

+#endif

+

+#ifndef _USE_DATACARD

+            g_psmwakeuprtctime = Rtc_PsmGetTime();/***CQNJ00216067***/

+#endif

+#ifdef _USE_CPU_DFM

+            PSM_WakeUp_Init();

+#endif

+

+            ZOSS_RESTORE_IRQ(old_intr);

+

+#ifndef _USE_DATACARD

+            Rtc_PsmMinInt();/***************CQNJ00216067*************/

+#endif

+

+        }

+        else if(zPS_umm_IsLossOfCoverage())

+        {

+            PSM_LossCoverageSleep();

+        }

+

+#ifdef _USE_SMARTPHONE

+        else if(zAti2_PsIsInFlyMode())    /**/

+        {

+            PSM_AirplaneSleep();

+        }

+#endif

+#ifndef _OS_TOS

+        i++;

+        if ((gRTCTimeToOSTimeFlag == 1)||(!(i%3000000)))

+        {

+            SYSTIME_Init();

+            gRTCTimeToOSTimeFlag = 0;

+            i = 0;

+        }

+#endif

+

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetAppIdle

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨µÄÁ¢¼´µ÷ƵӦÓÃΪ¿ÕÏÐ״̬£¬

+*                             ×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦ÓÃ

+* ²ÎÊý˵Ã÷£ºappId:Ó¦ÓÃÉèÖÃÔÊÐí¿ÕÏеÄÓ¦ÓÃid

+* ·µ »Ø Öµ£º ZOSS_SUCCESS³É¹¦

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetAppIdle(UINT32 appId)

+{

+#ifdef   _USE_PSM_2BNEW

+#ifdef   _USE_APPFLAG_DFM

+    T_ZDrv_ErrCode retCode      = DRV_SUCCESS;

+    UINT32 ignore               = ZOSS_ERROR;

+    UINT32 i                    = 0;

+    UINT32 tmpPSM_AppPow        = 0;

+    BOOL PSM_AppPowFlagIsFind   = FALSE;

+    UINT32  psmAppPowNum        = 0;

+    UINT32 tmpAppFlag           = 0;

+    T_ZOss_PSM_AppPow   *pPSM_AppPow;

+    

+    ignore = zOss_GetMutex(gPSMAppPowMutexID,ZOSS_WAIT_FOREVER);

+    if (ignore == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+    g_AppIdleFlag= g_AppIdleFlag & (~ (1<< appId));

+

+    if (pow_PsmGetUsbStatus())

+    {

+        pPSM_AppPow   = gPsmCfg->appUsbDfm;

+        psmAppPowNum  = gPsmCfg->appUsbDfmNum;

+        tmpPSM_AppPow = gPsmCfg->usbSysClk[0];

+#ifdef  _USE_FWP

+        if (gPSMCurrentPow !=  pPSM_AppPow[psmAppPowNum-1])

+        {

+            retCode  = Hal_SetArmCoreFreq(pPSM_AppPow[psmAppPowNum-1]);

+            if (retCode != DRV_SUCCESS)

+            {

+                ignore  = zOss_PutMutex(gPSMAppPowMutexID);

+                if (ignore == ZOSS_ERROR)

+                {

+                    return ZOSS_ERROR;

+                }

+                return retCode;

+            }

+            gPSMCurrentPow = pPSM_AppPow[psmAppPowNum-1];

+        }

+        ignore = zOss_PutMutex(gPSMAppPowMutexID);

+        if (ignore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+        return ZOSS_SUCCESS;

+#endif

+    }

+    else

+    {

+        pPSM_AppPow     = gPsmCfg->appDfm;

+        psmAppPowNum    = gPsmCfg->appDfmNum;

+        tmpPSM_AppPow   = gPsmCfg->sysClk[0];

+    }

+

+    for (i = 0; i < psmAppPowNum ; i++)

+    {

+        if (g_AppIdleFlag == pPSM_AppPow[i].PSM_AppPowFlag)

+        {

+            tmpPSM_AppPow = pPSM_AppPow[i].PSM_AppPow;

+            PSM_AppPowFlagIsFind = TRUE;

+            break;

+        }

+    }

+    if (!PSM_AppPowFlagIsFind)

+    {

+        for (i = 0; i<psmAppPowNum; i++)

+        {

+            if (pPSM_AppPow[i].PSM_AppPowFlag&g_AppIdleFlag)//ËÑË÷ÅäÖÃ±í£¬¿´ÓÐÄÇЩӦÓã»

+            {

+                tmpPSM_AppPow = pPSM_AppPow[i].PSM_AppPow > tmpPSM_AppPow ? pPSM_AppPow[i].PSM_AppPow : tmpPSM_AppPow;

+            }

+        }

+    }

+

+    if (tmpPSM_AppPow != gPSMCurrentPow )

+    {

+        retCode  = Hal_SetArmCoreFreq(tmpPSM_AppPow);

+        if (retCode != DRV_SUCCESS)

+        {

+            ignore  = zOss_PutMutex(gPSMAppPowMutexID);

+            if (ignore == ZOSS_ERROR)

+            {

+                return ZOSS_ERROR;

+            }

+            return retCode;

+        }

+        gPSMCurrentPow = tmpPSM_AppPow;

+    }

+    ignore = zOss_PutMutex(gPSMAppPowMutexID);

+    if (ignore == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+#else

+    g_AppIdleFlag= g_AppIdleFlag & (~(1<< appId));

+#endif

+#else

+    g_AppIdleFlag= g_AppIdleFlag & (~(1<< appId));

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetAppActive

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Á¢¼´µ÷ƵµÄÓ¦ÓÃΪ·±Ã¦×´Ì¬£¬

+*                            ×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦ÓÃ

+* ²ÎÊý˵Ã÷£ºappId:Ó¦ÓÃÉèÖÃÔÊÐí·±Ã¦µÄÓ¦ÓÃid

+* ·µ »Ø Öµ£º ZOSS_SUCCESS³É¹¦

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetAppActive(UINT32 appId)

+{

+#ifdef   _USE_PSM_2BNEW

+#ifdef   _USE_APPFLAG_DFM

+    T_ZDrv_ErrCode  retCode         = DRV_SUCCESS;

+    UINT32 ignore                   = ZOSS_ERROR;

+    UINT32  i                       = 0;

+    UINT32  tmpPsm_AppPow           = 0;

+    BOOL PSM_AppPowFlagIsFind       = FALSE;

+    T_ZOss_PSM_AppPow *pPSM_AppPow  = NULL;

+    UINT32  psmAppPowNum            = 0;

+

+    ignore = zOss_GetMutex(gPSMAppPowMutexID,ZOSS_WAIT_FOREVER);

+    if (ignore == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+    g_AppIdleFlag= g_AppIdleFlag | (1<< appId);

+    if (pow_PsmGetUsbStatus())

+    {

+        pPSM_AppPow = gPsmCfg->appUsbDfm;

+        psmAppPowNum = gPsmCfg->appUsbDfmNum;

+        tmpPsm_AppPow = gPsmCfg->usbSysClk[0];

+#ifdef  _USE_FWP

+        if (gPSMCurrentPow !=  pPSM_AppPow[psmAppPowNum-1])

+        {

+            retCode  = Hal_SetArmCoreFreq(pPSM_AppPow[psmAppPowNum-1]);

+            if (retCode != DRV_SUCCESS)

+            {

+                ignore  = zOss_PutMutex(gPSMAppPowMutexID);

+                if (ignore == ZOSS_ERROR)

+                {

+                    return ZOSS_ERROR;

+                }

+                return retCode;

+            }

+            gPSMCurrentPow = pPSM_AppPow[psmAppPowNum-1];

+        }

+        ignore = zOss_PutMutex(gPSMAppPowMutexID);

+        if (ignore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+        return ZOSS_SUCCESS;

+#endif

+    }

+    else

+    {

+        pPSM_AppPow   = gPsmCfg->appDfm;

+        psmAppPowNum  = gPsmCfg->appDfmNum;

+        tmpPsm_AppPow = gPsmCfg->sysClk[0];

+    }

+

+    for (i  = 0; i< psmAppPowNum ;i++)

+    {

+        if (g_AppIdleFlag == pPSM_AppPow[i].PSM_AppPowFlag)

+        {

+            tmpPsm_AppPow           = pPSM_AppPow[i].PSM_AppPow;

+            PSM_AppPowFlagIsFind    = TRUE;

+            break;

+        }

+    }

+    if (!PSM_AppPowFlagIsFind)

+    {

+        for (i = 0; i<psmAppPowNum; i++)

+        {

+            if (pPSM_AppPow[i].PSM_AppPowFlag&g_AppIdleFlag)//ËÑË÷ÅäÖÃ±í£¬¿´ÓÐÄÇЩӦÓã»

+            {

+                tmpPsm_AppPow = pPSM_AppPow[i].PSM_AppPow > tmpPsm_AppPow ? pPSM_AppPow[i].PSM_AppPow : tmpPsm_AppPow;

+            }

+        }

+    }

+

+    if (gPSMCurrentPow !=  tmpPsm_AppPow)

+    {

+        retCode  = Hal_SetArmCoreFreq(tmpPsm_AppPow);

+        if (retCode != DRV_SUCCESS)

+        {

+            ignore  = zOss_PutMutex(gPSMAppPowMutexID);

+            if (ignore == ZOSS_ERROR)

+            {

+                return ZOSS_ERROR;

+            }

+            return retCode;

+        }

+        gPSMCurrentPow = tmpPsm_AppPow;

+    }

+    ignore  = zOss_PutMutex(gPSMAppPowMutexID);

+    if (ignore == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+#else

+    g_AppIdleFlag= g_AppIdleFlag | (1<< appId);

+#endif

+#else

+    g_AppIdleFlag= g_AppIdleFlag | (1<< appId);

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetDevIdle

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨É豸Ϊ¿ÕÏÐ״̬£¬×î´ó¿ÉÒÔ¿ØÖÆ32¸öÉ豸¡£¾ßÌåÄÄһλ´ú±íʲôÉ豸ÓÉµ×²ã¹æ¶¨

+* ²ÎÊý˵Ã÷£ºdevId:É豸ÉèÖÃÔÊÐí¿ÕÏеÄÉ豸id

+* ·µ »Ø Öµ£º ZOSS_SUCCESS³É¹¦

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetDevIdle(UINT32 devId)

+{

+    gPSM_DrvIdleFlag = gPSM_DrvIdleFlag & (~(1<< devId));

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetDevActive

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨É豸Ϊ·±Ã¦×´Ì¬£¬×î´ó¿ÉÒÔ¿ØÖÆ32¸öÉ豸

+* ²ÎÊý˵Ã÷£ºdevId:É豸ÉèÖÃÔÊÐí·±Ã¦µÄÉ豸id

+* ·µ »Ø Öµ£º ZOSS_SUCCESS³É¹¦

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetDevActive(UINT32 devId)

+{

+    gPSM_DrvIdleFlag = gPSM_DrvIdleFlag | (1<< devId);

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetPSMAppIdle

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Ë¯ÃßÁ÷³ÌÓ¦ÓÃΪ¿ÕÏÐ״̬£¬

+*                            ×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦ÓÃ

+* ²ÎÊý˵Ã÷£ºappId:Ó¦ÓÃÉèÖÃÔÊÐí¿ÕÏеÄÓ¦ÓÃid

+* ·µ »Ø Öµ£º ZOSS_SUCCESS³É¹¦

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetPSMAppIdle(UINT32 appId)

+{

+    gPSM_AppIdleFlag = gPSM_AppIdleFlag & (~(1<< appId));

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetPSMAppActive

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Ë¯ÃßÁ÷³ÌÓ¦ÓÃΪ·±Ã¦×´Ì¬£¬

+*                            ×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦ÓÃ

+* ²ÎÊý˵Ã÷£ºappId:Ó¦ÓÃÉèÖÃÔÊÐí·±Ã¦µÄÓ¦ÓÃid

+* ·µ »Ø Öµ£º    ZOSS_SUCCESS³É¹¦

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetPSMAppActive(UINT32 appId)

+{

+    gPSM_AppIdleFlag = gPSM_AppIdleFlag | (1<< appId);

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetDevFlag

+* ¹¦ÄÜÃèÊö£º·µ»ØÉ豸µÄ״̬

+* ²ÎÊý˵Ã÷£ºnone

+* ·µ »Ø Öµ£º É豸µÄ״̬

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_GetDevFlag(VOID)

+{

+    return gPSM_DrvIdleFlag;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_GetL1g_AllowSleepTime

+ * ¹¦ÄÜÃèÊö£º»ñÈ¡L1gÔÊÐíÐÝÃßµÄʱ¼ä

+ * ²ÎÊý˵Ã÷£ºframe:L1gÔÊÐíÐÝÃßµÄÖ¡Êý

+ * ·µ »Ø Öµ£º ÎÞ

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+VOID zOss_GetL1g_AllowSleepTime(UINT32 frame)

+{

+    gL1gSleepTime= frame*PSM_GSM_FRAME_MS;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º UINT32   zOss_PSMSleepTimeForGui(VOID)

+ * ¹¦ÄÜÃèÊö£º ¹©GUI»ñȡϵͳ²¹³¥Ê±¼ä

+ * ²ÎÊý˵Ã÷£º ÎÞ

+ * ·µ »Ø Öµ£º    ·µ»ØÐèÒª²¹³¥µÄϵͳʱ¼ä

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+UINT32  zOss_GetSleepTimeForGui(VOID)

+{

+    UINT32 tmpPsmSleepTime = gPsm_SleepTimeForGui;

+    

+    gPsm_SleepTimeForGui = 0;

+    

+    return tmpPsmSleepTime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º UINT32   zOss_GetSleepTimeForTicks(VOID)

+ * ¹¦ÄÜÃèÊö£º ¹©²Ù×÷ϵͳticks²¹³¥£»

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º    ·µ»ØÐèÒª²¹³¥µÄϵͳʱ¼ä

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32  zOss_GetSleepTimeForTicks(VOID)

+{

+    return gPsm_SleepTicks/ZOSS_MS_PER_TICK;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_ApplyCpuFreq(UINT32  appId ,BOOL isUsed)

+ * ¹¦ÄÜÃèÊö£º Á¢¼´µ÷Ƶº¯Êý

+ * ²ÎÊý˵Ã÷£º

+             appid:Á¢¼´µ÷ƵID,×î´óÖ§³Ö32¸öÁ¢¼´µ÷Ƶ;

+             isUsed:TRUEʱ½øÐÐÉýƵ£¬FALSEʱ½øÐнµÆµ²Ù×÷;

+

+ * ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR;

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+UINT32  zOss_ApplyCpuFreq(UINT32  appId, BOOL isUsed)

+{

+    UINT32 retCode = ZOSS_ERROR;

+#if defined (_USE_APPFLAG_DFM)

+    if (isUsed)

+    {

+        retCode = zOss_SetAppActive(appId);

+        if (retCode!=ZOSS_SUCCESS)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    else

+    {

+        retCode = zOss_SetAppIdle(appId);

+        if (retCode!=ZOSS_SUCCESS)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+#elif   defined(_USE_CPU_DFM)

+    zOss_ApplyCpuPerf(appId,isUsed);

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_ClearArm1SleepTime

+* ¹¦ÄÜÃèÊö£º Çå³þÔÚARM1˯ÃßʱARM0˯Ãßʱ¼ä×ܺÍ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+************************************************************************/

+UINT32  zOss_PsmClearArm1SleepTime(VOID)

+{

+    gPsmSleepTimeSum = 0;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_PsmAdjustFreq312M

+* ¹¦ÄÜÃèÊö£º ½â¾öϵͳÔÚ¶¯Ì¬´´½¨Ï̲߳¢Í˳öÏß³Ìʱ£¬ARMÖ÷ƵΪ78MÇé¿öÏ£¬·¢ÉúµÄose_heapdÏß³ÌËøÖжϴóÓÚ400usµ¼ÖµÄGP0¶ÏÑÔÎÊÌ⣬

+             ÔÚ·¢ÉúÕâÖÖÇé¿öµÄʱºò£¬°ÑÖ÷Ƶµ÷Õûµ½312M¡£È»ºóÓɶ¯Ì¬µ÷Ƶģ¿é¸ºÔð°ÑÖ÷Ƶµ÷Õû»ØÈ¥¡£

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ZOSS_SUCCESS

+* ÆäËü˵Ã÷£º ¸Ãº¯Êý½ö½öÔÚzOss_ExitThreadº¯ÊýÖÐʹÓÃ

+************************************************************************/

+UINT32 zOss_PsmAdjustFreq312M(VOID)

+{

+#ifdef _OS_OSE

+    UINT32 freq = 0;

+    Hal_GetArmCoreFreq(&freq);

+    if(freq == CLK78M)

+    {

+        Hal_SetArmCoreFreq(CLK312M);

+#ifdef _USE_CPU_DFM

+    PSM_WakeUp_Init();

+#endif

+        gPSMCurrentPow = CLK312M;

+    }

+#endif

+    return ZOSS_SUCCESS;

+}

+

+#endif

+

diff --git a/cp/ps/plat/src/oss/psm/src/psm_297502.c b/cp/ps/plat/src/oss/psm/src/psm_297502.c
new file mode 100644
index 0000000..c39bc5a
--- /dev/null
+++ b/cp/ps/plat/src/oss/psm/src/psm_297502.c
@@ -0,0 +1,2363 @@
+/************************************************************************

+* °æÈ¨ËùÓÐ (C)2008,ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£

+*

+* ÎļþÃû³Æ£º psm.c

+* Îļþ±êʶ£º

+* ÄÚÈÝÕªÒª£º Ê¡µç¹ÜÀí(power save manager)

+*

+* ÐÞ¸ÄÈÕÆÚ     °æ±¾ºÅ     Ð޸ıê¼Ç     ÐÞ¸ÄÈË      ÐÞ¸ÄÄÚÈÝ

+* ---------------------------------------------------------------------

+* 2009/06/01    v0.1              ÍõÊÀÓ        ´´½¨

+************************************************************************/

+/***************************************************************************

+*                           Í·Îļþ°üº¬                                    *

+***************************************************************************/

+#ifdef _USE_PSM

+#ifdef _OS_OSE

+#include "ose_typedef.h"

+#endif

+#include "oss_api.h"

+#include "osa.h"

+#include "Drvs_pow.h"

+#include "drvs_spcu.h"

+#include "oss_cfg.h"

+#include "drvs_int.h"

+

+#define USE_PSM_TEST                    0          /*EVB °æ±¾²âÊÔ*/

+#define PSM_TD_FRAME_MS                 5

+#define PSM_TD_CHIP_MS                  0.00078

+#define PSM_TD_MAX_FRAMENUM             8192

+#define PSM_TD_MAX_CHIPNUM              6400

+#define PSM_GSM_FRAME_MS                4.615

+#define PSM_TD_MAX_SLEEP_FRAMENUM       2048

+

+extern UINT64 gTimer_CurTime;                       /*µ±Ç°Ê±¼ä¼ÆÊý                  */

+extern BOOL l1g_camp_on_cell_flag ;

+extern BOOL POW_l1g_force_wake_flag;

+

+UINT32 gPsm_SleepTime                   = 0;        /*ϵͳÐÝÃßʱ¼ä                  */

+static UINT32 gPsm_SleepTimeForGui      = 0;        /*ϵͳÐÝÃßʱ¼ä                  */

+static UINT32 gPsm_SleepTicks           = 0;        /*ϵͳÐÝÃßtick Êý               */

+static UINT16 gPsm_Gsmtime              = 0;

+//static UINT32 gPSM_TdstartFram          = 0;

+//static UINT32 gPSM_TdstartChip          = 0;

+static UINT32 gL1gSleepTime             = 0;        /*L1g ÔÊÐíÐÝÃßʱ¼ä              */

+static UINT32 g_AppIdleFlag             = 0;        /*Ó¦ÓÿÕÏбêÖ¾·û,¿ØÖÆÁ¢¼´µ÷Ƶ   */

+static UINT32 gPSM_AppIdleFlag          = 0;        /*Ó¦ÓÿÕÏбêÖ¾·û£¬¿ØÖÆË¯ÃßÁ÷³ÌµÄ*/

+static UINT32 gPSM_L1gIdleFlag          = 1;        /*L1g¿ÕÏбêÖ¾·û                 */

+static UINT32 gPSM_DrvIdleFlag          = 0;        /*ϲãÇý¶¯¿ÕÏбêÖ¾·û            */

+static UINT16 gPSM_ZspFlag              = 1;

+

+/*±ê×¢ÐÝÃߺ¯Êý±äÁ¿*/

+static PSM_SleepFunc gPSM_KenelSleepFunc    = NULL;

+static PSM_SleepFunc gPSM_ShallowSleepFunc  = NULL;

+static PSM_SleepFunc gPSM_DeepSleepFunc     = NULL;

+static PSM_SleepFunc gPSM_BootSleepFunc     = NULL;

+

+/*˯ÃßµÄhookº¯Êý±äÁ¿*/

+static T_ZOSS_PSM_HOOK gPSM_Hook    = {NULL,NULL};

+static BOOL sleep_flag              = FALSE;        /*ÐÝÃß±êÖ¾£¬ÓÃÓÚÅжÏÊÇ·ñ½øÐÐʱ¼ä²¹³¥*/

+BOOL gSleep_CampOn_flag             = FALSE;

+ZOSS_THREAD_ID gPSMThreadID         = NULL;

+UINT32 gPSMCurrentPow               = 0;            /*µ±Ç°Ö÷Ƶ                           */

+static T_PSM_PARAM * gPsmCfg        = NULL;

+#ifdef _USE_PSM_2BNEW

+#ifdef _USE_APPFLAG_DFM

+static ZOSS_MUTEX_ID gPSMAppPowMutexID = NULL;

+#endif

+#endif

+static UINT32 gRTCTimeToOSTimeFlag     = 1;

+#ifdef _USE_CPU_DFM

+extern  T_ZOsa_ThreadUserArea ** gp_OsaThreadUserArea ;  /*±£´æÏß³ÌÓû§¿Õ¼äµØÖ·*/

+static UINT32  psmAdjust            = 0;

+static UINT32  psmIITCount          = 0;

+static SINT32  *psmIITIdle;

+static UINT32  psmCPUCountNum       = 0;

+UINT32  gPsm_CpuSumtime             = 0;

+ZOSS_THREAD_ID currentPSMThread     = NULL;

+BOOL gPSMIgnoreFlags                = FALSE;

+static  UINT32  gPsm_SumIIT         = 0;

+static  UINT32  gPsm_AIT            = 0;                /*¿ÉÒÔÓþֲ¿±äÁ¿*/

+UINT32 gPsm_SwapLastTime            = 0;

+#endif

+#ifdef _OS_TOS

+BOOL gPSMInitFlag                   = FALSE;

+#endif

+/* LTE ¶àÄ£ben */

+//static  UINT32  g_TdDeepSleepLen    = 0;

+UINT32 gPSM_ARM1Flag                = 0;

+//static UINT32 gPsm_TimerBegin     = 0;

+UINT32 gPSMArm0SleepTime            =0;

+

+/* LTE¶àÄ£ end*/

+/*U118BÐèÇó*/

+#ifdef   _USE_PSM_HANDSET

+static UINT32 g_psm_deepsleeplen1       = 0;

+static UINT32 g_psm_deepsleeplen        = 0;

+static UINT32 g_psm_deepsleepwakeupfc   = 0;

+static UINT32 g_psm_deepsleepwakeupcc   = 0;

+static BOOL g_psm_zsp2sleeptimeflag     = FALSE;

+/***************psm20111026*********************/

+extern VOID pow_PsmT1PichSleep(VOID);

+extern UINT16 pow_PsmT1IsrFlag(VOID);

+extern UINT16 pow_PsmPichFlag(VOID);

+extern  void POW_l1g_wakeup_by_td_only(void);

+extern UINT32 g_tdt1wakeup_psm ;

+UINT32 g_testt1pichsleep                = 0;

+extern WORD   zPS_urrc_rbc_get_drx_for_PSM(VOID);

+extern UINT32 zDrvTimer_ReadTimer4(VOID);

+BOOL  PSM_SleepT1toMeasure(VOID);

+

+/*******************************************/

+#endif

+/***end***/

+

+extern BOOL zL1e_TaskIsIdle(VOID);      /*LTEÖ÷ģϠps ÈÎÎñ¿ÕÏÐ,·µ»Øtrue±íʾ¿ÕÏУ¬false±íʾæ*/

+extern BOOL zL1t_TaskIsIdle(VOID);      /*TDÖ÷ģϠ ps ÈÎÎñ¿ÕÏÐ,·µ»Øtrue±íʾ¿ÕÏУ¬false±íʾæ*/

+static BOOL gPSM_LCDPSMFlag = TRUE;     /*zcoreÆÁÄ»ÐÝÃß±ê־λ*/

+static T_Psm_BootStage gPSM_BootStageFlag = PSM_BOOT_DEFAULT; /*ϵͳÆô¶¯½×¶Î±ê־λ*/

+

+/**************************************************************************

+ *                       ×Ô¶¨ÒåÀàÐÍ                                     *

+**************************************************************************/

+typedef enum

+{

+    SYS_TD=0x1,

+    SYS_GSM=0x4,

+    SYS_LTE= 0x10,  

+    SYS_MAX_TYPE

+}T_Psm_SysType;

+

+/****************CQNJ00216067*******************************/

+#ifndef _USE_DATACARD

+extern UINT8 g_psmsleeprtctime;

+extern UINT8 g_psmwakeuprtctime;

+extern UINT8 Rtc_PsmGetTime(VOID);

+extern VOID Rtc_PsmMinInt(VOID);

+#endif

+#ifdef _USE_CPU_DFM

+#define PSM_UP_ARMCLK               (UINT8)1        /*ÉýƵһ¼¶  */

+#define PSM_DOWN_ARMCLK             (UINT8)2        /*½µÆµ      */

+#define PSM_PULL_ARMCLK             (UINT8)3        /*ÉýƵÁ½¼¶  */

+static  UINT32  gMinCpuPerf         = 0;

+static  UINT32  gMinCpuPerfOld      = 0;

+

+typedef  struct _tagpsmThreadTCB

+{

+    ZOSS_THREAD_ID thread_id;

+} T_ZOSS_PSMThread;

+

+T_ZOSS_PSMThread   *gPsmThreadTCB   = NULL;

+#endif

+

+static UINT32 gPsmSleepTimeSum      = 0;

+UINT16 Mfcampon_flag[100];

+T_Psm_SysType g_dwMftype            = SYS_MAX_TYPE;

+BOOL g_bMfSleepen1                  = FALSE;

+BOOL g_bMfSleepen2                  = FALSE;

+T_Psm_SleepMode g_mfsleep_mode      = PSM_MAX_SLEEP;

+UINT32 g_dwMfSleepCount             = 0;

+UINT32 g_dwMfKenerlSleepCount       = 0;

+UINT32 g_dwMfNonSleepCount          = 0;

+UINT32 g_dwCytCount                 = 0;

+UINT32 g_dwCytCount2                = 0;

+UINT32 g_dwCytCount3                = 0;

+T_Psm_SysType SYSTYPEMAOFENG        = SYS_MAX_TYPE;

+/**************************************************************************

+ *                       ÍⲿÒýÓú¯Êý                                     *

+ **************************************************************************/

+#ifdef _OS_OSE

+extern UINT32 SYSTIME_Init(VOID);

+#endif

+extern UINT16 zOss_GetZspIsidle(VOID);

+extern VOID zOss_GetZsp_AllowSleepTime(UINT32 *frame_num,UINT32 *chip_num,UINT32 *len);

+extern VOID zOss_SetZspSleepTime(UINT32 frame_num,UINT32 chip_num);

+extern VOID zOss_GetZspTime(UINT32 *frame_num,UINT32 *chip_num);

+extern UINT16 pow_PsmGetCamon(VOID);

+extern UINT16 pow_PsmGetCamonLte(VOID);  //added by maofeng

+extern UINT16 SPCU_get_l1g_sleep_time(VOID);  /*get real sleep time*/

+extern UINT32 zOss_GetPs_SleepTimer(VOID);

+extern BOOL POW_L1g_OsIdleLoopHandler(UINT32 sys_mode);

+extern BYTE zPS_umm_GetPossibleAct(VOID);

+extern void POW_l1g_wakeup_psm(void);

+extern  SINT32  Hal_GetArmCoreFreq(UINT32*feq);

+extern  SINT32  Hal_SetArmCoreFreq(UINT32 freq);

+extern UINT32 Osa_HwTimeRead(VOID);

+extern SINT32 zOss_PsmStartTimer(VOID);

+extern SINT32 zOss_PsmStopTimer(VOID);

+#ifdef _USE_PSM_PROVIDE_SLEEP_TIME

+extern SINT32 zOss_PsmSetTimer(UINT32 sleep_time);

+#else

+extern VOID POW_l1g_wakeup_spcu_cgu_for_ufi(VOID);

+#endif

+extern SINT32 zOss_PsmGetSleepFlag(VOID);

+extern SINT32 zOss_PsmGetSleepTime(VOID);

+extern SINT32  zOss_PsmSetSleepFlag(UINT32 sleepFlag);

+extern SINT32  zOss_PsmReadTime(VOID);

+extern UINT32  zOss_PsmGetArm1SleepTimeStart(VOID);

+#ifdef _USE_UFI

+extern BOOL zAti2_PsIsInFlyMode(VOID);

+#endif

+extern  BOOL  pow_PsmGetUsbStatus(VOID);

+extern T_ZOsa_ThreadUserArea *zOss_GetThreadUserArea(ZOSS_THREAD_ID thread_id);

+

+/**************************************************************************

+ *                     ¾Ö²¿º¯ÊýǰÖÃÉùÃ÷                                      *

+**************************************************************************/

+VOID PSM_IdleThreadEntry(SINT32 ignore);

+static VOID psm_sleep_handle(T_Psm_SleepMode sleep_mode);

+VOID  Psm_ZspMsToFram(UINT32 framestart,UINT32 chipstart,UINT32 *frameend,UINT32 *chipend,UINT32 len);

+UINT32  Psm_ZspFramToMs(UINT32 framestart,UINT32 chipstart,UINT32 frameend,UINT32 chipend);

+BOOL  PSM_SleepCampOnCheck(VOID);

+BOOL  PSM_SleepTdFlagCheck(VOID);

+BOOL  PSM_SleepEnableCheck(VOID);

+

+/*----------------------------------------------------------------------------*

+**                         º¯ÊýʵÏÖ                                           *

+**---------------------------------------------------------------------------*/

+#ifdef _USE_CPU_DFM

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_GetIgnoreTime

+* ¹¦ÄÜÃèÊö£º»ñÈ¡ºöÂÔÏ̵߳Äʱ¼ä

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£º   ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static  UINT32   PSM_GetIgnoreThreadTime(VOID)

+{

+    UINT32 psmIgnoreTime = 0;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    SINT32 j            = 0;

+    for (j = 0 ;j<gPsmCfg->psmThrdNameNum; j++)

+    {

+        if (gPsmThreadTCB[j].thread_id != NULL)

+        {

+            pPsmThreadUa = zOss_GetThreadUserArea(gPsmThreadTCB[j].thread_id);

+            if (pPsmThreadUa != NULL)

+            {

+                psmIgnoreTime  +=  pPsmThreadUa->psmCpuTime;

+            }

+        }

+        else

+        {

+            break;

+        }

+    }

+    

+    return psmIgnoreTime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_GetCpuLoad

+* ¹¦ÄÜÃèÊö£º

+* ²ÎÊý˵Ã÷£º

+            (OUT)

+                idlecpuLoad:cpu¿ÕÏÐÂÊ

+

+* ·µ »Ø Öµ£º   ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static  VOID   PSM_GetCpuLoad(UINT32 *idlecpuLoad)

+{

+    SINT32   psmIgnoreTime = 0,totaltime = 0,tmpidlecpu  =0,tmpIIT= 0;

+    SINT32  tmpPsmTime = Osa_HwTimeRead() -gPsm_SwapLastTime;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    if (currentPSMThread !=NULL)

+    {

+        pPsmThreadUa =  zOss_GetThreadUserArea(currentPSMThread);

+        if (pPsmThreadUa!=NULL)

+        {

+            pPsmThreadUa->psmCpuTime += tmpPsmTime ;

+        }

+    }

+    totaltime  =gPsm_CpuSumtime+ tmpPsmTime;

+

+    if (totaltime < 3000)

+    {

+        *idlecpuLoad = 70;

+        return ;

+    }

+    else

+    {

+        pPsmThreadUa= zOss_GetThreadUserArea(gPSMThreadID);

+        tmpidlecpu = pPsmThreadUa->psmCpuTime;

+        if (gPSM_LCDPSMFlag)

+        {

+            psmIgnoreTime = PSM_GetIgnoreThreadTime();

+        }

+        if ((psmIgnoreTime>1000)||(tmpidlecpu < psmIgnoreTime)||(totaltime-psmIgnoreTime == 0))

+        {

+            tmpIIT =(tmpidlecpu+psmIgnoreTime*0.6);

+            tmpIIT =(tmpIIT*100)/totaltime;

+        }

+        else

+        {

+            tmpIIT = (tmpidlecpu -psmIgnoreTime);

+            tmpIIT =(tmpIIT*100)/(totaltime-psmIgnoreTime);

+        }

+        *idlecpuLoad = tmpIIT;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_ClearThreadCpu

+* ¹¦ÄÜÃèÊö£ºÇå³ýÏ̵߳ÄcpuµÄ¼ÆÊ±Ê±¼ä

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID PSM_ClearThreadCpu(VOID)

+{

+    UINT32  i = 0;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+

+    pPsmThreadUa                = zOss_GetThreadUserArea(gPSMThreadID);

+    pPsmThreadUa->psmCpuTime    = 0;

+    for (i= 0 ;i<gPsmCfg->psmThrdNameNum; i++)

+    {

+        if (gPsmThreadTCB[i].thread_id != NULL)

+        {

+            pPsmThreadUa = zOss_GetThreadUserArea(gPsmThreadTCB[i].thread_id);

+            if (pPsmThreadUa!= NULL)

+            {

+                pPsmThreadUa->psmCpuTime = 0;

+            }

+        }

+        else

+        {

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_ClearIITTime

+* ¹¦ÄÜÃèÊö£ºÇå³ýÏ̵߳ÄcpuµÄ¼ÆÊ±Ê±¼ä

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static  VOID   PSM_ClearIITTime(VOID)

+{

+    UINT32 i =0;

+    

+    psmCPUCountNum  = 0;   //ÖØÐ²ɼ¯£»

+    gPsm_SumIIT     = 0;

+    psmAdjust       = 0;

+    for ( i = 0; i<gPsmCfg->cpuAdjustNum;i++)

+    {

+        psmIITIdle[i]= 0;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_FindDesCpuClkPara

+* ¹¦ÄÜÃèÊö£º

+* ²ÎÊý˵Ã÷£º

+            (out)

+                pDesCpuClkConfig:»ñÈ¡CPU ¶¯Ì¬µ÷ƵµÄÅäÖÃ

+                pConfigCount:»ñÈ¡CPU¶¯Ì¬µ÷ƵÅäÖõĸöÊý

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 PSM_SearchDesCpuClk(T_ZPSM_ARMClockSet *pDesCpuClkConfig, UINT32 ConfigCount,UINT32 curArmCoreFreq,UINT32 DFMFlag)

+{

+    UINT32  i  = 0;

+    for (i= 0; i <ConfigCount; i++)

+    {

+        if (pDesCpuClkConfig[i].currentARMClock==curArmCoreFreq)

+        {

+            switch (DFMFlag)

+            {

+            case PSM_UP_ARMCLK:

+            {

+                return pDesCpuClkConfig[i].upARMClock;

+            }

+            case PSM_DOWN_ARMCLK:

+            {

+                return pDesCpuClkConfig[i].downARMCLock;

+            }

+            case PSM_PULL_ARMCLK:

+            {

+                return  pDesCpuClkConfig[i].pushARMClock;

+            }

+            default:

+                break;

+            }

+        }

+    }

+    

+    return  curArmCoreFreq;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_FindDesCpuClk

+* ¹¦ÄÜÃèÊö£º

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                cpuload:cpuʹÓÃÂÊ

+                curArmCoreFreq:µ±Ç°Ö÷Ƶ

+

+* ·µ »Ø Öµ£º·µ»ØÐèÒªµÄcpu¶¯Ì¬µ÷ÕûµÄÖ÷Ƶ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static   UINT32  PSM_FindDesCpuClk(UINT32  cpuload ,UINT32 curArmCoreFreq)

+{

+    UINT32 desArmCoreFeq = 0;

+    UINT32 ConfigCount =0;

+    T_ZPSM_ARMClockSet  *DesCpuClkConfig = NULL;

+    if (pow_PsmGetUsbStatus())

+    {

+        DesCpuClkConfig = gPsmCfg->usbDesClock;

+        ConfigCount     = gPsmCfg->usbDesClockNum;

+    }

+    else

+    {

+        DesCpuClkConfig = gPsmCfg->desClock;

+        ConfigCount     = gPsmCfg->desClockNum;

+    }

+    if ( ( cpuload >=gPsmCfg->scaleCpuPcnt.downCpuPercent)&&(cpuload<gPsmCfg->scaleCpuPcnt.upCpuPercent))

+    {

+        desArmCoreFeq = curArmCoreFreq;

+    }

+    else if (cpuload >=gPsmCfg->scaleCpuPcnt.pullCpuPercent)

+    {

+        desArmCoreFeq = PSM_SearchDesCpuClk(DesCpuClkConfig,ConfigCount,curArmCoreFreq,PSM_PULL_ARMCLK);

+    }

+    else if (cpuload >=gPsmCfg->scaleCpuPcnt.upCpuPercent)

+    {

+        desArmCoreFeq = PSM_SearchDesCpuClk(DesCpuClkConfig,ConfigCount,curArmCoreFreq,PSM_UP_ARMCLK);

+    }

+    else

+    {

+        desArmCoreFeq = PSM_SearchDesCpuClk(DesCpuClkConfig,ConfigCount,curArmCoreFreq,PSM_DOWN_ARMCLK);

+    }

+    

+    return desArmCoreFeq ;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_FindMinCpuClk

+* ¹¦ÄÜÃèÊö£º ÅжÏCPUµ÷ÕûµÄÖ÷ƵÊÇ·ñÂú×ãÁ¢¼´µ÷Ƶ

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                ÎÞ

+* ·µ »Ø Öµ£º·µ»ØÐèÒªµÄÁ¢¼´Ö÷Ƶ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static  UINT32  PSM_FindMinCpuClk(VOID)

+{

+    SINT32  i = 0;

+

+    if (pow_PsmGetUsbStatus())

+    {

+        for (i=0;i<gPsmCfg->usbSysClkNum;i++)

+        {

+            if (gMinCpuPerf>gPsmCfg->usbSysClk[i])

+            {

+                continue;

+            }

+            return gPsmCfg->usbSysClk[i];

+        }

+        return  gPsmCfg->usbSysClk[gPsmCfg->usbSysClkNum-1];

+    }

+    else

+    {

+        for (i=0;i<gPsmCfg->sysClkNum;i++)

+        {

+            if (gMinCpuPerf>gPsmCfg->sysClk[i])

+            {

+                continue;

+            }

+            return gPsmCfg->sysClk[i];

+        }

+        return  gPsmCfg->sysClk[gPsmCfg->sysClkNum-1];

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ApplyCpuPerf

+* ¹¦ÄÜÃèÊö£ºÓ¦ÓûòÉ豸ÉêÇëµÄÖ÷ƵµÄ

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                appID:Ó¦ÓûòÉ豸µÄ±ê־λ

+* ·µ »Ø Öµ£º·µ»ØÐèÒªµÄÁ¢¼´Ö÷Ƶ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID  zOss_ApplyCpuPerf(UINT32 appID,BOOL isUsed)

+{

+    UINT32 index = appID, MinCpuClk =0,retCode = ZOSS_ERROR;

+

+    ZOSS_INTR old_intr;

+

+    ZOSS_SAVE_IRQ(old_intr);

+

+    if (isUsed)

+    {

+        if (!gPsmCfg->minClock[index].isUsed)

+        {

+            gMinCpuPerf = gMinCpuPerf + gPsmCfg->minClock[index].CPUCLK;

+            gPsmCfg->minClock[index].isUsed = TRUE;

+        }

+    }

+    else

+    {

+        if (gPsmCfg->minClock[index].isUsed)

+        {

+            gMinCpuPerf = gMinCpuPerf - gPsmCfg->minClock[index].CPUCLK;

+            gPsmCfg->minClock[index].isUsed = FALSE;

+        }

+    }

+    MinCpuClk = gMinCpuPerf;

+    if (MinCpuClk >gPSMCurrentPow)

+    {

+        MinCpuClk = PSM_FindMinCpuClk();

+        retCode = Hal_SetArmCoreFreq(MinCpuClk);

+        if (retCode !=DRV_SUCCESS)

+        {

+            zOss_ASSERT(0);

+        }

+        PSM_ClearIITTime();

+        gPSMCurrentPow = MinCpuClk;

+    }

+

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SetMonitoredThread

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                thread_id:Ïß³ÌID

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 psm_SetMonitoredThread(ZOSS_THREAD_ID thread_id)

+{

+    UINT32 i = 0;

+    ZOSS_INTR old_intr;

+

+    if (NULL == thread_id)

+    {

+        return ZOSS_ERROR;

+    }

+

+    ZOSS_SAVE_IRQ(old_intr);

+

+    for (i = 0 ; i < gPsmCfg->psmThrdNameNum;i++)

+    {

+        if (gPsmThreadTCB[i].thread_id != NULL)

+        {

+            continue;

+        }

+        gPsmThreadTCB[i].thread_id  = thread_id;

+        break;

+    }

+    if  (i == gPsmCfg->psmThrdNameNum)

+    {

+        ZOSS_RESTORE_IRQ(old_intr);

+        return ZOSS_ERROR;

+    }

+    ZOSS_RESTORE_IRQ(old_intr);

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SetMonitoredThread

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                thread_id:Ïß³ÌID

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32  PSM_GetARM_CPU_CLK(UINT32  psm_AIT)

+{

+    UINT32 Des_CPU_CLK= 0,ARM_CPU_CLK=0,ARM_MIN_CLK= 0;

+    SINT32 tmpDiffCpu =0;

+    if (psmAdjust)

+    {

+#ifndef _OS_TOS    

+        tmpDiffCpu =  gMinCpuPerf -gMinCpuPerfOld;

+        if (tmpDiffCpu>0)

+        {

+            tmpDiffCpu = tmpDiffCpu/(gPSMCurrentPow/100);

+        }

+        else

+        {

+            tmpDiffCpu = 0;

+        }

+#endif

+        Des_CPU_CLK= PSM_FindDesCpuClk((100-psm_AIT+tmpDiffCpu),gPSMCurrentPow);

+    }

+    else

+    {

+        Des_CPU_CLK= gPSMCurrentPow;

+    }

+    ARM_MIN_CLK = PSM_FindMinCpuClk();

+    ARM_CPU_CLK = Des_CPU_CLK> ARM_MIN_CLK ? Des_CPU_CLK:ARM_MIN_CLK;

+    return ARM_CPU_CLK;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetAIT

+* ¹¦ÄÜÃèÊö£º»ñÈ¡AIT

+* ²ÎÊý˵Ã÷£º

+            (IN)

+                VOID

+* ·µ »Ø Öµ£º·µ»ØAIT

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 psm_GetAIT(UINT32  idlecpuLoad)

+{

+    gPsm_SumIIT+=  idlecpuLoad -psmIITIdle[psmIITCount];

+    gPsm_AIT = gPsm_SumIIT/psmCPUCountNum;

+    psmIITIdle[psmIITCount] = idlecpuLoad;

+    psmIITCount++;

+    psmIITCount = psmIITCount%gPsmCfg->cpuAdjustNum;

+

+    return gPsm_AIT ;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPSM_InterruptRoutine

+* ¹¦ÄÜÃèÊö£ºTI ÖжϷþÎñ³ÌÐò

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID  PSM_InterruptRoutine(SINT32 args)

+{

+    UINT32 idlecpuLoad = 0,psm_AIT= 0,ARM_CPU_CLK =0;

+

+    if (gPSMIgnoreFlags)

+    {

+        if ( psmCPUCountNum >= gPsmCfg->cpuAdjustNum)

+        {

+            psmAdjust = 1;

+        }

+        else

+        {

+            psmCPUCountNum++;

+        }

+        PSM_GetCpuLoad(&idlecpuLoad);

+        psm_AIT = psm_GetAIT(idlecpuLoad);

+        ARM_CPU_CLK =  PSM_GetARM_CPU_CLK(psm_AIT);

+        if (ARM_CPU_CLK!= gPSMCurrentPow)

+        {

+            UINT32 retCode = Hal_SetArmCoreFreq(ARM_CPU_CLK);

+            if (retCode !=DRV_SUCCESS)

+            {

+                zOss_ASSERT(0);

+            }

+            PSM_ClearIITTime();

+            gPSMCurrentPow =ARM_CPU_CLK;

+        }

+        gMinCpuPerfOld = gMinCpuPerf;

+    }

+    PSM_ClearThreadCpu();

+    gPsm_CpuSumtime = 0;

+    gPsm_SwapLastTime = Osa_HwTimeRead();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPSM_WakeUp_Init

+* ¹¦ÄÜÃèÊö£ºË¯ÃßÐÑÀ´ºóÒªÐèÒªÖØÐ¼ÆËãgPsm_AITµÈ

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static  VOID PSM_WakeUp_Init(VOID)

+{

+    if (pow_PsmGetUsbStatus())

+    {

+        gPSMCurrentPow  =CLK156M;

+    }

+    else

+    {

+        gPSMCurrentPow  =CLK78M;

+    }

+    PSM_ClearThreadCpu();

+    PSM_ClearIITTime();

+    gPsm_CpuSumtime = 0;

+    psmAdjust = 0;

+    gPsm_SwapLastTime = Osa_HwTimeRead();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPSM_SetIgnoreThread

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static  VOID PSM_SetIgnoreThread(VOID)

+{

+    UINT32 i =0 ;

+    ZOSS_THREAD_ID  threadID = NULL;

+

+    for (i = 0;i<gPsmCfg->psmThrdNameNum;i++)

+    {

+        if (gPsmCfg->psmThreadName[i].threadname != NULL)

+        {

+            threadID = zOss_GetThreadIDByName(gPsmCfg->psmThreadName[i].threadname);

+            psm_SetMonitoredThread(threadID);

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_CpuIntRoutine

+* ¹¦ÄÜÃèÊö£º ´¥·¢cpu¶¯Ì¬µ÷Ƶ²É¼¯Ïß³Ì

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º    ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _OS_TOS

+VOID PSM_CpuIntRoutine(VOID)

+{

+   static UINT32 cpuCount = 0;

+   if(gPSMInitFlag)

+   {

+       cpuCount++;

+       cpuCount = cpuCount%gPsmCfg->minTimeLen;

+       

+       if(!cpuCount)

+       {

+          PSM_InterruptRoutine(1);

+       }

+   }

+}

+#endif

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_Init

+* ¹¦ÄÜÃèÊö£º Ê¡µç¹ÜÀí³õʼ»¯

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 PSM_Init(VOID)

+{

+    T_OSS_PARAM *pOssParam  = NULL;

+

+    gPSMThreadID = zOss_CreateThread("zOss_ThreadPsm",PSM_IdleThreadEntry, 0, 1024, 31,1,1);

+    if (NULL == gPSMThreadID)

+    {

+        return ZOSS_ERROR;

+    }

+#ifdef   _USE_PSM_2BNEW

+#ifdef   _USE_APPFLAG_DFM

+    gPSMAppPowMutexID = zOss_CreateMutex(" PSMappPowMutex", ZOSS_INHERIT);

+    if (NULL == gPSMAppPowMutexID)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+#endif

+     pOssParam = zOss_GetOssCfg(); /*»ñȡϵͳPSMÅäÖÃ*/

+    gPsmCfg = &(pOssParam->PsmCfg);

+#ifdef _USE_CPU_DFM

+    Hal_GetArmCoreFreq(&gPSMCurrentPow);

+    psmIITIdle = zOss_Malloc(sizeof(SINT32)*gPsmCfg->cpuAdjustNum);

+

+    if ( NULL == psmIITIdle)

+    {

+        zOss_ASSERT(0);

+    }

+    zOss_Memset(psmIITIdle, 0, (sizeof(SINT32)*gPsmCfg->cpuAdjustNum));

+    gPsmThreadTCB = zOss_Malloc(gPsmCfg->psmThrdNameNum*sizeof(PSM_IgnoreThread));

+    if (gPsmThreadTCB == NULL)

+    {

+        zOss_ASSERT(0);

+    }

+    zOss_Memset(gPsmThreadTCB, 0, gPsmCfg->psmThrdNameNum*sizeof(PSM_IgnoreThread));

+#ifdef _OS_OSE

+    start(create_process(OS_TI_PROC, "PSM_TIMER_ISR", (OSENTRYPOINT *)PSM_InterruptRoutine, (OSADDRESS)1024*20,

+                         (OSPRIORITY)gPsmCfg->cpuThreadPrior, (OSTIME)gPsmCfg->minTimeLen, (PROCESS) 0, (struct OS_redir_entry *) NULL,  (OSVECTOR) 0, (OSUSER) 0));

+#else

+    gPSMInitFlag = TRUE;

+#endif

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPSM_SleepCheckWait

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃߵȴý£¬ÓÃÓÚGSMÐÝÃߵȴý

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߵȴý£»FALSE:²»ÄܽøÈëÐÝÃߵȴý

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+BOOL  PSM_SleepCheckWait(VOID)

+{

+    gPSM_ZspFlag=zOss_GetZspIsidle();

+    if ((!POW_l1g_force_wake_flag)&&(!gPSM_AppIdleFlag)&& (!gPSM_DrvIdleFlag)&&(gPSM_ZspFlag==1))

+    {

+        gPSM_ARM1Flag=zOss_PsmGetSleepFlag();

+        if ((gPSM_ARM1Flag ==PSM_SHALLOW_SLEEP)||(gPSM_ARM1Flag ==PSM_DEEP_SLEEP))

+        {

+            return TRUE;

+        }

+        else

+        {

+            return FALSE;

+        }

+    }

+    else

+    {

+        return FALSE;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPSM_SleepTdCheckWait

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃߵȴý£¬ÓÃÓÚTDÎïÀí²ãÐÝÃߵȴý

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߵȴý£»FALSE:²»ÄܽøÈëÐÝÃߵȴý

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+BOOL  PSM_SleepTdCheckWait(VOID)

+{

+

+    if ((!POW_l1g_force_wake_flag)&&(!gPSM_AppIdleFlag)&& (!gPSM_DrvIdleFlag))

+    {

+        gPSM_ARM1Flag=zOss_PsmGetSleepFlag();

+        if ((gPSM_ARM1Flag ==PSM_SHALLOW_SLEEP)||(gPSM_ARM1Flag ==PSM_DEEP_SLEEP))

+        {

+            return TRUE;

+        }

+        else

+        {

+            return FALSE;

+        }

+    }

+    else

+    {

+        return FALSE;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPSM_SleepT1toMeasure

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëtdd½øÈët1--measureÄÚºËÊ¡µç

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef   _USE_PSM_HANDSET

+BOOL  PSM_SleepT1toMeasure(VOID)

+{

+    UINT16 gdpram_pich= 0;

+    UINT16 armt1_pich = 0;

+    UINT32 gPSM_TdstartFram_t1=0;

+    UINT32 gPSM_TdstartChip_t1=0;

+    gdpram_pich =pow_PsmPichFlag();

+    zOss_GetZspTime(&gPSM_TdstartFram_t1,&gPSM_TdstartChip_t1); /*read cunrrent fc ,cc*/

+    if (gdpram_pich ==2)

+    {

+        return FALSE;

+    }

+    /**************·ÀÖ¹l1g״̬Ïß³ÌÇл»****************************/

+    if(POW_l1g_force_wake_flag)

+    {

+      return FALSE;

+    }

+    /**********************************************/

+    if(!zL1t_TaskIsIdle())  /*Èç¹ûtddÏÂpsÈÎÎñΪæ*/

+    {

+        return FALSE;

+    }

+    g_testt1pichsleep =zDrvTimer_ReadTimer4();

+    if (g_testt1pichsleep <g_tdt1wakeup_psm)

+    {

+        return FALSE;

+    }

+    if ((g_testt1pichsleep -g_tdt1wakeup_psm)<gPsmCfg->tddT1PichSleepTimeLen )

+    {

+        return FALSE;

+    }

+    gPSM_ZspFlag=zOss_GetZspIsidle();

+    if ((gPSM_ZspFlag==1)||(gPSM_ZspFlag ==0))

+    {

+        return FALSE;

+    }

+    armt1_pich = pow_PsmT1IsrFlag();

+    if (armt1_pich != 1)

+    {

+        return FALSE;

+    }

+    return TRUE;

+

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPSM_SleepCheck

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+BOOL  PSM_SleepCheck(T_Psm_SysType sys_mode)

+{

+    UINT32 td_sleeptime=0,td_sleepfram=0,td_sleepChip=0;

+#ifdef  _USE_PSM_HANDSET

+    ZOSS_INTR old_intr;

+    T_Psm_SleepMode sleepmode;

+    UINT32 td_zsp2sleepfc =0;

+    UINT32 td_zsp2sleepcc =0;

+    UINT32 td_zsp2sleeplen =0;

+    WORD   current_drx=0;

+    UINT16 armt1_pich = 0;

+#endif

+    gPSM_ZspFlag=zOss_GetZspIsidle();

+#ifdef   _USE_PSM_HANDSET

+    armt1_pich = pow_PsmT1IsrFlag();

+#endif

+    if (gPSM_ZspFlag==1)

+    {

+        zOss_GetZsp_AllowSleepTime(&td_sleepfram,&td_sleepChip,&td_sleeptime);

+        if ((sys_mode==SYS_TD)&&(td_sleeptime>PSM_TD_MAX_SLEEP_FRAMENUM*PSM_TD_FRAME_MS))

+        {

+            return FALSE;

+        }

+        /**********ÅжÏЭÒéÕ»ÈÎÎñÊÇ·ñ¿ÕÏУ¬Èç¹ûΪæ£¬·µ»ØFLASE,Í˳öÊ¡µçÁ÷³Ì*************/

+        if(!zL1t_TaskIsIdle())

+        {

+             return FALSE;

+        }

+#ifdef _USE_PSM_PROVIDE_SLEEP_TIME

+        gPSM_L1gIdleFlag=POW_L1g_OsIdleLoopHandler((UINT32)sys_mode);

+        if ((gPSM_L1gIdleFlag)&& (!gPSM_AppIdleFlag)&& (!gPSM_DrvIdleFlag)&&(gPsm_SleepTime==0))  //ÌáÈ¡³ö¼¸¸ö¹«ÓõÄ?

+        {

+            gPSM_ARM1Flag=zOss_PsmGetSleepFlag();

+            if ((gPSM_ARM1Flag ==PSM_SHALLOW_SLEEP)||(gPSM_ARM1Flag ==PSM_DEEP_SLEEP))

+            {

+                return TRUE;

+            }

+            else

+            {

+                return FALSE;

+            }

+        }

+#else

+        if ((!gPSM_AppIdleFlag) && (!gPSM_DrvIdleFlag)&&(gPsm_SleepTime==0))  //ÌáÈ¡³ö¼¸¸ö¹«ÓõÄ?

+        {

+            gPSM_ARM1Flag = zOss_PsmGetSleepFlag();

+            if ((gPSM_ARM1Flag ==PSM_SHALLOW_SLEEP)||(gPSM_ARM1Flag ==PSM_DEEP_SLEEP))

+            {

+                gPSM_L1gIdleFlag=POW_L1g_OsIdleLoopHandler((UINT32)sys_mode);

+                if (gPSM_L1gIdleFlag)

+                {  

+                    return TRUE;

+                }

+                else

+                {

+                    return FALSE;

+                }

+            }

+            else

+            {

+                return FALSE;

+            }

+        }

+#endif

+    }

+#ifdef  _USE_PSM_HANDSET

+    else if (gPSM_ZspFlag ==2 )

+    {

+        gPSM_ARM1Flag=zOss_PsmGetSleepFlag();

+        if (!((gPSM_ARM1Flag ==PSM_SHALLOW_SLEEP)||(gPSM_ARM1Flag ==PSM_DEEP_SLEEP)))

+        {

+            return FALSE;

+        }

+        if ((gPSM_L1gIdleFlag)&& (!gPSM_AppIdleFlag)&& (!gPSM_DrvIdleFlag)&&(POW_l1g_force_wake_flag==FALSE))

+        {

+            ZOSS_SAVE_IRQ(old_intr);

+            /**********ÅжÏЭÒéÕ»ÈÎÎñÊÇ·ñ¿ÕÏУ¬Èç¹ûΪæ£¬·µ»ØFLASE,Í˳öÊ¡µçÁ÷³Ì*************/

+            if(!zL1t_TaskIsIdle())

+            {

+                ZOSS_RESTORE_IRQ(old_intr);

+                return PSM_NO_SLEEP;

+            }

+            /****************************************************************/

+

+            if (g_psm_deepsleeplen>=gPsmCfg->secondSleepTimeLen)

+            {

+

+                zOss_GetZspTime(&td_zsp2sleepfc,&td_zsp2sleepcc);

+                td_zsp2sleeplen =Psm_ZspFramToMs(g_psm_deepsleepwakeupfc,g_psm_deepsleepwakeupcc,td_zsp2sleepfc,td_zsp2sleepcc);

+                if (td_zsp2sleeplen>=gPsmCfg->secondSleepTimeLen)

+                {

+                    g_psm_zsp2sleeptimeflag =TRUE;

+                }

+            }

+            gPSM_ZspFlag=zOss_GetZspIsidle();

+            if ((gPSM_L1gIdleFlag)&&(!gPSM_AppIdleFlag)&&(!gPSM_DrvIdleFlag)&&(POW_l1g_force_wake_flag==FALSE)&&(gPSM_ZspFlag ==2)&&(g_psm_zsp2sleeptimeflag))

+            {

+                g_psm_zsp2sleeptimeflag =FALSE;

+                sleepmode = PSM_DEEP_SLEEP;

+                psm_sleep_handle(sleepmode);

+            }

+            ZOSS_RESTORE_IRQ(old_intr);

+            return FALSE;

+        }

+    }

+    else if ( ((gPSM_ZspFlag==2)&&(armt1_pich ==1)&&(sys_mode==SYS_TD)&&(!pow_PsmGetUsbStatus()))||(((gPSM_ZspFlag==3)&&(armt1_pich ==1)&&(sys_mode==SYS_TD)&&(!pow_PsmGetUsbStatus()))))

+    {

+        gPSM_ARM1Flag=zOss_PsmGetSleepFlag();

+        if (!((gPSM_ARM1Flag ==PSM_SHALLOW_SLEEP)||(gPSM_ARM1Flag ==PSM_DEEP_SLEEP)))

+        {

+            return FALSE;

+        }

+        current_drx =zPS_urrc_rbc_get_drx_for_PSM();

+        if ((current_drx == 640)||(current_drx ==1280)) /*Ö»ÓÐdrx=640ms,1280ms²ÅʹÓø÷½°¸*/

+        {

+

+            if ((!gPSM_AppIdleFlag)&&(!gPSM_DrvIdleFlag))

+            {

+                ZOSS_SAVE_IRQ(old_intr);

+

+                if (!PSM_SleepT1toMeasure())

+                {

+                    POW_l1g_wakeup_by_td_only();

+                    ZOSS_RESTORE_IRQ(old_intr);

+                    return FALSE;

+                }

+                pow_PsmT1PichSleep();

+                POW_l1g_wakeup_by_td_only();/*t1---±¨²âÁ¿ÆÚ¼äarmÄÚºËÊ¡µç£¬td±¨²âÁ¿·¢icp¸øarm²Å»½ÐÑl1g*/

+                ZOSS_RESTORE_IRQ(old_intr);

+

+            }

+        }

+

+    }

+    else

+    {

+        psm_sleep_handle(PSM_KENEL_SLEEP);

+

+    }

+#endif

+

+    return FALSE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPSM_SleepEnableCheck

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+BOOL  PSM_SleepEnableCheck(VOID)

+{

+    gPSM_ZspFlag=zOss_GetZspIsidle();

+    if ((!POW_l1g_force_wake_flag)&&(!gPSM_AppIdleFlag)&& (!gPSM_DrvIdleFlag)&&(gPSM_ZspFlag==1)) //maofeng TD˯Ãß²»½»»¥

+    {

+        gPSM_ARM1Flag=zOss_PsmGetSleepFlag();

+        if ((gPSM_ARM1Flag ==PSM_SHALLOW_SLEEP)||(gPSM_ARM1Flag ==PSM_DEEP_SLEEP))

+        {

+            return TRUE;

+        }

+        else

+        {

+            return FALSE;

+        }

+    }

+    else

+    {

+        return FALSE;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPSM_SleepTdFlagCheck

+* ¹¦ÄÜÃèÊö£ºÅжÏTDÎïÀí²ã±êÖ¾ÊÇ·ñµ±Ç°µÄ

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+BOOL  PSM_SleepTdFlagCheck(VOID)

+{

+

+    gPSM_ZspFlag=zOss_GetZspIsidle();

+    if ((gPSM_ZspFlag==1)||(gPSM_ZspFlag==3))

+    {

+        return TRUE;

+    }

+    else

+    {

+        return FALSE;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_SleepCAmpOnCheck

+* ¹¦ÄÜÃèÊö£º ÅжÏÊÇ·ñפÁôÍøÂç³É¹¦

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+BOOL  PSM_SleepCampOnCheck(VOID)

+{

+    UINT16 TD_campon_falg=FALSE;

+    UINT16 LTE_campon_flag =FALSE;

+    UINT16 i=0;

+    TD_campon_falg=pow_PsmGetCamon();

+    LTE_campon_flag=pow_PsmGetCamonLte();

+    Mfcampon_flag[i]=LTE_campon_flag;

+    i++;

+    if(i==100)i=0;

+    if ((l1g_camp_on_cell_flag)||(TD_campon_falg==1)||(LTE_campon_flag==1))

+    {

+        return TRUE;

+    }

+    else

+    {

+        return FALSE;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_ZspFramToMs

+* ¹¦ÄÜÃèÊö£º °ÑÖ¡Êýת»¯Îªms

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32  Psm_ZspFramToMs(UINT32 framestart,UINT32 chipstart,UINT32 frameend,UINT32 chipend)

+{

+    UINT32 frame_num=0,chip_num=0,ms=0;

+

+    if (frameend>=framestart)

+    {

+        frame_num=frameend-framestart;

+    }

+    else

+    {

+        frame_num=frameend+PSM_TD_MAX_FRAMENUM-framestart;

+    }

+

+    if (chipend>=chipstart)

+    {

+        chip_num=chipend-chipstart;

+    }

+    else if (chipend<chipstart)

+    {

+        chip_num=chipend+PSM_TD_MAX_CHIPNUM-chipstart;

+        if (frame_num>0)

+        {

+            frame_num--;

+        }

+    }

+    ms=frame_num*PSM_TD_FRAME_MS+(chip_num*PSM_TD_CHIP_MS);

+    return ms;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Psm_ZspMsToFram

+* ¹¦ÄÜÃèÊö£º °Ñmsת»¯Îªframe

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID  Psm_ZspMsToFram(UINT32 framestart,UINT32 chipstart,UINT32 *frameend,UINT32 *chipend,UINT32 len)

+{

+    UINT32 frame_num=0,chip_num=0;

+

+    chip_num=(len%PSM_TD_FRAME_MS)/PSM_TD_CHIP_MS;

+    frame_num=len/PSM_TD_FRAME_MS;

+

+    if (chipstart+chip_num>=PSM_TD_MAX_CHIPNUM)

+    {

+        chip_num=chipstart+chip_num-PSM_TD_MAX_CHIPNUM;

+        frame_num=framestart+frame_num+1;

+    }

+    else

+    {

+        chip_num=chipstart+chip_num;

+        frame_num=framestart+frame_num;

+    }

+    if (frame_num>=PSM_TD_MAX_FRAMENUM)

+    {

+        frame_num=frame_num-PSM_TD_MAX_FRAMENUM;

+    }

+    *frameend=frame_num;

+    *chipend=chip_num;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º psm_GSMSleepMode

+* ¹¦ÄÜÃèÊö£º ÅжÏÔÚGSMģʽÏÂÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽÒÔ¼°¿ÉÒÔ½øÈëµÄÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºPSM_DEEP_SLEEP:¿ÉÒÔ½øÈëÉî˯Ãߣ»PSM_SHALLOW_SLEEP:¿ÉÒÔ½øÈëdz˯Ãß;PSM_NO_SLEEP:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static T_Psm_SleepMode psm_GSMSleepMode(VOID)

+{

+    T_Psm_SleepMode sleep_mode=PSM_NO_SLEEP;

+    UINT32 gsm_sleeptime=0;

+    gsm_sleeptime=gL1gSleepTime;

+    gPsm_Gsmtime=SPCU_get_l1g_sleep_time();

+

+    if (gPsm_Gsmtime*PSM_GSM_FRAME_MS>=gsm_sleeptime)

+    {

+        sleep_mode=PSM_NO_SLEEP;

+    }

+    else if ((gsm_sleeptime-gPsm_Gsmtime*PSM_GSM_FRAME_MS)>gPsmCfg->deepSleepTimeLen)

+    {

+        sleep_mode=PSM_DEEP_SLEEP;

+    }

+    /*else if((gsm_sleeptime-gPsm_Gsmtime*PSM_GSM_FRAME_MS)>PSM_ENABLE_SHALLOWSLEEPTIME)

+         sleep_mode=PSM_SHALLOW_SLEEP;*/

+    else

+    {

+        sleep_mode=PSM_NO_SLEEP;

+    }

+    return sleep_mode;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º psm_TdSleepMode

+* ¹¦ÄÜÃèÊö£º ÅжÏÔÚTDģʽÏÂÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽÒÔ¼°¿ÉÒÔ½øÈëµÄÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºPSM_DEEP_SLEEP:¿ÉÒÔ½øÈëÉî˯Ãߣ»PSM_SHALLOW_SLEEP:¿ÉÒÔ½øÈëdz˯Ãß;PSM_NO_SLEEP:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static T_Psm_SleepMode psm_TdSleepMode(VOID)

+{

+    T_Psm_SleepMode tdsleep_mode=PSM_NO_SLEEP;

+    UINT32 td_sleeptime=0,ps_timer=0;

+/**********ÅжÏЭÒéÕ»ÈÎÎñÊÇ·ñ¿ÕÏУ¬Èç¹ûΪæ£¬·µ»ØFLASE,Í˳öÊ¡µçÁ÷³Ì*************/

+    if(!zL1t_TaskIsIdle())

+    {

+        return PSM_NO_SLEEP;

+    }

+    

+    ps_timer=zOss_GetPs_SleepTimer();   

+    td_sleeptime=ps_timer;

+    gPSM_ZspFlag=zOss_GetZspIsidle();

+    if (gPSM_ZspFlag!=1)

+    {

+        return PSM_NO_SLEEP;

+    }

+    if (td_sleeptime>gPsmCfg->deepSleepTimeLen)

+    {

+        tdsleep_mode=PSM_DEEP_SLEEP;   

+#ifdef  _USE_PSM_HANDSET

+        g_psm_deepsleeplen1 =td_sleeptime;

+#endif

+       // g_TdDeepSleepLen  = td_sleeptime;

+#ifdef _USE_PSM_PROVIDE_SLEEP_TIME

+        zOss_PsmSetTimer(td_sleeptime);

+#endif

+    }

+    else

+        tdsleep_mode=PSM_NO_SLEEP;

+    return tdsleep_mode;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_SleepEnableCheck

+* ¹¦ÄÜÃèÊö£º ÅжÏÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+BOOL  PSM_CheckLTESleepEnable(VOID)

+{

+    gPSM_ARM1Flag=zOss_PsmGetSleepFlag();

+/**********ÅжÏЭÒéÕ»ÈÎÎñÊÇ·ñ¿ÕÏУ¬Èç¹ûΪæ£¬·µ»ØFLASE,Í˳öÊ¡µçÁ÷³Ì*************/

+    if(!zL1e_TaskIsIdle())  /*Èç¹ûLTEÏÂpsÈÎÎñΪæ*/

+    {

+        return FALSE;

+    }

+

+    #if 0

+    if (!((gPSM_ARM1Flag ==PSM_SHALLOW_SLEEP)||(gPSM_ARM1Flag ==PSM_DEEP_SLEEP)))

+    {

+        return FALSE;

+    }

+    if ((!POW_l1g_force_wake_flag)&&(!gPSM_AppIdleFlag)&& (!gPSM_DrvIdleFlag)&&(gPSM_ZspFlag==1))

+    {

+        return TRUE;

+    }

+    else

+    {

+        return FALSE;

+    }

+    #endif

+

+    if (((gPSM_ARM1Flag ==PSM_SHALLOW_SLEEP)||(gPSM_ARM1Flag ==PSM_DEEP_SLEEP))&&(!gPSM_AppIdleFlag)&& (!gPSM_DrvIdleFlag)&&((gPsm_SleepTime==0)))

+    {

+        return TRUE;

+    }

+    else

+    {

+        return FALSE;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º psm_TdSleepMode

+* ¹¦ÄÜÃèÊö£º »ñÈ¡arm1ÒѾ­Ë¯ÃßµÄʱ¼ä

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#if 0

+static UINT32  PSM_GetArm1EclpsTime(VOID)

+{

+    UINT32 arm0TmpTime1 = 0,arm0TmpTime0 =0,arm1EclpsdTime = 0;

+

+    arm0TmpTime0 = zOss_GetTickCount();

+    arm0TmpTime1 = zOss_PsmGetArm1SleepTimeStart();

+    arm1EclpsdTime = (arm0TmpTime0 >= arm0TmpTime1) ? (arm0TmpTime0 - arm0TmpTime1 ):(arm0TmpTime0 + ~arm0TmpTime1);

+    arm1EclpsdTime += gPsmSleepTimeSum;

+    return arm1EclpsdTime;

+}

+#endif

+/**************************************************************************

+* º¯ÊýÃû³Æ£º psm_TdSleepMode

+* ¹¦ÄÜÃèÊö£º

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32  PSM_GetLTESleepTime(VOID)

+{

+    UINT32 arm0SleepTime = 0,psTime = 0;

+    psTime=zOss_GetPs_SleepTimer();

+    arm0SleepTime = psTime ;

+    return arm0SleepTime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º psm_LTESleepMode

+* ¹¦ÄÜÃèÊö£º ÅжÏÔÚLTEģʽÏÂÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽÒÔ¼°¿ÉÒÔ½øÈëµÄÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£ºPSM_DEEP_SLEEP:¿ÉÒÔ½øÈëÉî˯Ãߣ»PSM_SHALLOW_SLEEP:¿ÉÒÔ½øÈëdz˯Ãß;PSM_NO_SLEEP:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static T_Psm_SleepMode psm_LTESleepMode(VOID)

+{

+    T_Psm_SleepMode lteSleepmode=PSM_NO_SLEEP;

+

+    gPSMArm0SleepTime =  PSM_GetLTESleepTime();

+    if (gPSMArm0SleepTime >= gPsmCfg->deepSleepTimeLen)

+  

+    {

+#ifdef _USE_PSM_PROVIDE_SLEEP_TIME

+        zOss_PsmSetTimer(gPSMArm0SleepTime);

+#endif

+        lteSleepmode = PSM_DEEP_SLEEP;

+    }

+    else

+    {

+        lteSleepmode=PSM_KENEL_SLEEP;

+    }

+    return lteSleepmode;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º psm_sleep_handle

+* ¹¦ÄÜÃèÊö£º Ê¡µç´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷£ºsleep_mode:ÐÝÃßģʽ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_sleep_handle(T_Psm_SleepMode sleep_mode)

+{

+    if (gPSM_Hook.SleepHook)

+    {

+        gPSM_Hook.SleepHook();/*˯Ãßǰhook*/

+    }

+

+    if (PSM_SHALLOW_SLEEP==sleep_mode)

+    {

+        if (gPSM_ShallowSleepFunc)

+        {

+            sleep_flag=TRUE;

+            gPSM_ShallowSleepFunc(sleep_mode);/*dz˯Ãß*/

+        }

+    }

+    else if (PSM_DEEP_SLEEP==sleep_mode)

+    {

+        if (gPSM_DeepSleepFunc)

+        {

+            sleep_flag=TRUE;

+            gPSM_DeepSleepFunc(sleep_mode);/*Éî˯Ãß*/

+        }

+    }

+    else if (PSM_BOOTING_SLEEP==sleep_mode)

+    {

+        if (gPSM_BootSleepFunc)

+        {

+            sleep_flag=TRUE;

+            gPSM_BootSleepFunc(sleep_mode);/*Éî˯Ãß*/

+        }

+    }

+    else

+    {

+        if (gPSM_KenelSleepFunc)

+        {

+            sleep_flag=FALSE;

+            gPSM_KenelSleepFunc(sleep_mode); /*ÄÚºËÊ¡µç*/

+        }

+    }

+    if (gPSM_Hook.WakeupHook)

+    {

+        gPSM_Hook.WakeupHook();/*ϵͳ¼¤»îºóhook*/

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_InstallSleep

+* ¹¦ÄÜÃèÊö£º °²×°Ë¯Ãß´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷£º

+                             shallowSleep:dz˯Ãß´¦Àíº¯Êý

+                             deepSleep:Éî˯Ãß´¦Àíº¯Êý

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_InstallSleep(PSM_SleepFunc shallowSleep,PSM_SleepFunc deepSleep,PSM_SleepFunc kernelSleep)

+{

+    gPSM_KenelSleepFunc=kernelSleep;

+    gPSM_ShallowSleepFunc = shallowSleep;

+    gPSM_DeepSleepFunc = deepSleep;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_InstallSleepForUfi

+* ¹¦ÄÜÃèÊö£º 

+* ²ÎÊý˵Ã÷£º

+                            

+                             

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_InstallSleepForUfi(PSM_SleepFunc bootSleep)

+{

+    gPSM_BootSleepFunc = bootSleep;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_InstallPsmHook

+* ¹¦ÄÜÃèÊö£º °²×°Ë¯ÃßHOOK´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷£º

+                           (IN)

+                              hook:hook½á¹¹Ö¸Õë

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_InstallPsmHook(T_ZOSS_PSM_HOOK *hook)

+{

+    gPSM_Hook.SleepHook = hook->SleepHook;

+    gPSM_Hook.WakeupHook = hook->WakeupHook;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetLcdPsmFlag

+* ¹¦ÄÜÃèÊö£º ÉèÖÃÆÁÄ»ÐÝÃß±ê־λ

+* ²ÎÊý˵Ã÷£º

+                           (IN)

+                              flag:TRUE±íʾÆÁÄ»ÐÝÃߣ¬FALSE±íʾÆÁÄ»¼¤»î

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_SetLcdPsmFlag(BOOL flag)

+{

+    gPSM_LCDPSMFlag = flag;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetSysInitFinish

+* ¹¦ÄÜÃèÊö£º ÉèÖÃϵͳ³õʼ»¯Íê³É±ê־λ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+void zOss_SetBootStage(T_Psm_BootStage stage)

+{

+    gPSM_BootStageFlag = stage;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_PoweroffChargerSleep

+* ¹¦ÄÜÃèÊö£º ¹Ø»ú³äµçÊ¡µç´¦Àí

+* ²ÎÊý˵Ã÷£º

+             ÎÞ

+

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static void PSM_PoweroffChargerSleep(void)

+{

+#if 0

+    UINT32 lefttime = 0;

+    T_ZDrvChg_Info_Data state = 0;

+

+    /*¹Ø»úºó³äµç¿ª»ú*/

+    halChg_status_get(&state);

+    if (CHG_STATE_CHARGING==state)

+    {

+        gPsm_SleepTime = 100;

+        zDrvTimer_StartTimer4(gPsm_SleepTime);

+        //POW_L1g_sleep_for_flymode();

+        psm_sleep_handle(PSM_DEEP_SLEEP);

+        //POW_L1g_wakeup_for_flymode();

+        lefttime = zDrvTimer_ReadTimer4();

+        gPsm_SleepTime = gPsm_SleepTime - lefttime;

+        gPsm_SleepTimeForGui = gPsm_SleepTime;

+        gRTCTimeToOSTimeFlag = 1;

+        gTimer_CurTime += gPsm_SleepTime;

+    }

+#endif

+

+#if 1

+    //UINT32 lefttime = 0;

+    //T_ZDrvChg_Info_Data state = 0;

+

+    /*¹Ø»úºó³äµç¿ª»ú*/

+   // halChg_status_get(&state);

+    if (1)//(CHG_STATE_CHARGING==state)

+    {

+       // gPsm_SleepTime = 0xFFFFFFFF;

+        #if 0

+        zDrvTimer_StartTimer4(gPsm_SleepTime);

+        //POW_L1g_sleep_for_flymode();

+        psm_sleep_handle(PSM_DEEP_SLEEP);

+        //POW_L1g_wakeup_for_flymode();

+        //lefttime = zDrvTimer_ReadTimer4();

+        #endif

+        #if 1

+        //pow_PsmSetTimer(gPsm_SleepTime);

+        //zOss_PsmSetTimer(gPsm_SleepTime);

+        psm_sleep_handle(PSM_BOOTING_SLEEP);//PSM_BOOTING_SLEEP);

+        //lefttime = zOss_PsmReadTime();

+        //lefttime = pow_PsmReadTimer();

+        #endif

+        gPsm_SleepTime = 0;

+        gPsm_SleepTimeForGui += gPsm_SleepTime;		//ûÓÐËøÖжϣ¬tick»¹ÔÚ¼ÆÊ±£¬²»ÐèҪʱ¼ä²¹³¥

+        gRTCTimeToOSTimeFlag = 1;

+        gTimer_CurTime += gPsm_SleepTime;

+        gPsm_SleepTicks += gPsm_SleepTime;

+    }

+#endif

+

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_BootSleep

+* ¹¦ÄÜÃèÊö£º ¿ª»úÍê³Éǰʡµç´¦Àí

+* ²ÎÊý˵Ã÷£º

+             ÎÞ

+

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static void PSM_BootSleep(void)

+{

+#ifndef _OS_TOS

+    SINT32 i        = 0;

+#endif

+    SINT32 state    = 0;

+    ZOSS_INTR  old_intr;

+

+    while (gPSM_BootStageFlag >= PSM_BOOT_DEFAULT)

+    {

+        if (PSM_BOOT_FINISH == gPSM_BootStageFlag)

+        {

+            break;

+        }

+

+        if (PSM_BOOT_DEFAULT == gPSM_BootStageFlag)

+        {

+            continue;

+        }

+

+        gSleep_CampOn_flag=PSM_SleepCampOnCheck();

+

+        if (gSleep_CampOn_flag && gPSM_BootStageFlag == PSM_SYSINIT_FINISH)

+        {

+#ifdef _USE_CPU_DFM

+            PSM_SetIgnoreThread();

+            ZOSS_SAVE_IRQ(old_intr);

+            PSM_ClearThreadCpu();

+            gPSMIgnoreFlags = TRUE;

+            ZOSS_RESTORE_IRQ(old_intr);

+#endif

+            gPSM_BootStageFlag = PSM_BOOT_FINISH;

+            break;

+        }

+

+        if (gPSM_LCDPSMFlag && (gPSM_DrvIdleFlag==0) && (gPSM_BootStageFlag == PSM_SYSINIT_FINISH))

+        {

+

+            ZOSS_SAVE_IRQ(old_intr);

+            state = zOss_GetPoweronState();

+            if (state==SYSM_POWER_ON_CHARGING)

+            {

+                PSM_PoweroffChargerSleep();

+            }

+            else

+            {

+                /*¿ª»úÍ£ÁôÊäÈëPINÂë¡¢ÊÖ»úÃÜÂë½çÃæÊ¡µç*/

+                psm_sleep_handle(PSM_DEEP_SLEEP);

+            

+                Hal_SetArmCoreFreq(CLK312M);/*Ìá¸ßµ½Ô­À´Õý³£¿ª»úÖ÷Ƶ,²»È»¿ª»úÑÓ³ÙÀ÷º¦*/

+            }

+            ZOSS_RESTORE_IRQ(old_intr);

+

+#ifndef _USE_DATACARD

+            Rtc_PsmMinInt();/***************CQNJ00216067*************/

+#endif

+        }

+#ifndef _OS_TOS

+        i++;

+        if ((gRTCTimeToOSTimeFlag == 1)||(!(i%3000000)))

+        {

+            SYSTIME_Init();

+            gRTCTimeToOSTimeFlag = 0;

+            i = 0;

+        }

+#endif

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_AirplaneSleep

+* ¹¦ÄÜÃèÊö£º UFI·ÉÐÐģʽ˯Ãß

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _USE_UFI

+static void PSM_AirplaneSleep(void)

+{

+    UINT32 psmStartSleepFrame = 0;

+    UINT32 psmStartSleepChip  = 0;

+    UINT32 psmEndSleepFrame   = 0;

+    UINT32 psmEndSleepChip    = 0;

+    ZOSS_INTR old_intr;

+

+

+    if ((!gPSM_AppIdleFlag) && (!gPSM_DrvIdleFlag)&&(gPsm_SleepTime==0))

+    {

+        gPSM_L1gIdleFlag = POW_L1g_OsIdleLoopHandler(SYS_TD);

+        gPSM_ZspFlag=zOss_GetZspIsidle();

+        gPSM_ARM1Flag=zOss_PsmGetSleepFlag();

+

+        if((gPSM_L1gIdleFlag)&&(gPSM_ZspFlag==1)&&((gPSM_ARM1Flag == 2)||(gPSM_ARM1Flag == 3)))

+        {

+            zDrv_IntMaskSave();/*Save all interrupt mask register */

+            zDrv_DisableAllInt_ExceptEdge();

+            ZOSS_SAVE_IRQ(old_intr);

+

+            zOss_GetZspTime(&psmStartSleepFrame,&psmStartSleepChip);/*»ñȡ˯Ãßǰʱ¼ä*/

+            psm_sleep_handle(PSM_SHALLOW_SLEEP);

+            zOss_GetZspTime(&psmEndSleepFrame,&psmEndSleepChip);	 /*»ñȡ˯Ãߺóʱ¼ä*/ 

+            gPsm_SleepTime = Psm_ZspFramToMs(psmStartSleepFrame,psmStartSleepChip,psmEndSleepFrame,psmEndSleepChip);

+

+            gPsm_SleepTimeForGui = gPsm_SleepTime;

+            gRTCTimeToOSTimeFlag = 1;

+            gTimer_CurTime += gPsm_SleepTime;

+            gPsm_SleepTicks += gPsm_SleepTime;

+

+            ZOSS_RESTORE_IRQ(old_intr);

+            zDrv_IntMaskRestore();

+        }

+

+    }

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_IdleThreadEntry

+* ¹¦ÄÜÃèÊö£º ¿ÕÏйÜÀí¿ÕÏÐÏß³ÌÈë¿Ú

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID PSM_IdleThreadEntry(SINT32 ignore)

+{

+    BOOL  sleep_Enable          = FALSE;

+    T_Psm_SysType sys_type      = SYS_MAX_TYPE;

+    T_Psm_SleepMode sleep_mode  = PSM_MAX_SLEEP;

+    UINT32 psmStartSleepFrame   = 0;

+    UINT32 psmStartSleepChip    = 0;

+    UINT32 psmEndSleepFrame     = 0;

+    UINT32 psmEndSleepChip      = 0;

+#ifndef _OS_TOS

+    SINT32 i                    = 0;

+#endif

+    ZOSS_INTR  old_intr;

+

+#ifdef _OS_TOS

+    zOss_SuspendThread((ZOSS_THREAD_ID)cyg_thread_idle_thread());

+#endif

+    PSM_BootSleep(); /*U207ÐèÇó*/  

+

+    while (1)

+    {

+        if (!gSleep_CampOn_flag)

+        {

+            gSleep_CampOn_flag=PSM_SleepCampOnCheck();

+            sleep_Enable =FALSE;

+#ifdef _USE_CPU_DFM

+            if (gSleep_CampOn_flag)

+            {

+                PSM_SetIgnoreThread();

+                ZOSS_SAVE_IRQ(old_intr);

+                PSM_ClearThreadCpu();

+                gPSMIgnoreFlags = TRUE;

+                ZOSS_RESTORE_IRQ(old_intr);

+            }

+#endif

+        }

+        else

+        { 

+            

+            sys_type=zPS_umm_GetPossibleAct();

+            SYSTYPEMAOFENG=sys_type;

+            sleep_Enable=PSM_SleepCheck(sys_type);

+            g_dwMftype = sys_type;

+            g_bMfSleepen1  = sleep_Enable;

+        }

+        if (sleep_Enable)

+        {

+            zDrv_IntMaskSave();/*Save all interrupt mask register */

+            zDrv_DisableAllInt_ExceptEdge();

+            ZOSS_SAVE_IRQ(old_intr);

+#ifndef _USE_DATACARD

+            g_psmsleeprtctime = Rtc_PsmGetTime(); /****************CQNJ00216067******/

+#endif

+        /**************·ÀÖ¹l1g״̬Ïß³ÌÇл»****************************/

+        if(POW_l1g_force_wake_flag)

+        {

+            zDrv_IntMaskRestore();

+            ZOSS_RESTORE_IRQ(old_intr);

+            continue;

+        } 

+        /**********************************************/

+        if (sys_type==SYS_GSM)

+        {

+            sleep_mode=psm_GSMSleepMode();

+            g_mfsleep_mode=sleep_mode;

+            if (PSM_NO_SLEEP!=sleep_mode)

+            {

+                sleep_Enable=PSM_SleepCheckWait();

+                if (sleep_Enable)

+                {

+#if USE_PSM_TEST

+                    *(volatile U32 *)(0x60004008) = *(volatile U32 *)(0x60004008) & (~(1<<13));

+                    *(volatile U32 *)(0x60000028) = *(volatile U32 *)(0x60000028) | (1<<13);

+                    *(volatile U32 *)(0x60000008) =  *(volatile U32 *)(0x60000008)| (1<<13);

+#endif

+                    psm_sleep_handle(sleep_mode);

+#if USE_PSM_TEST

+                    *(volatile U32 *)(0x60000008) = *(volatile U32 *)(0x60000008) & (~(1<<13));

+#endif

+

+                    if (sleep_flag)

+                    {

+                        gPsm_SleepTime=(SPCU_get_l1g_sleep_time()-gPsm_Gsmtime)*PSM_GSM_FRAME_MS;

+                        gPsm_SleepTimeForGui = gPsm_SleepTime;

+                        gRTCTimeToOSTimeFlag = 1;

+                        gTimer_CurTime += gPsm_SleepTime;

+                        gPsm_SleepTicks += gPsm_SleepTime;

+          

+                    }

+                }

+                else

+                {

+                    psm_sleep_handle(PSM_KENEL_SLEEP) ;

+#ifndef _USE_DATACARD

+                    g_psmwakeuprtctime = Rtc_PsmGetTime();/*****CQNJ00216067*****/

+#endif

+                }

+            }

+        }

+        else if (sys_type==SYS_TD)

+        {

+            sleep_mode=psm_TdSleepMode();

+            if (PSM_NO_SLEEP!=sleep_mode)

+            {

+                sleep_Enable=PSM_SleepEnableCheck();

+                if (sleep_Enable)

+                {

+                    zOss_GetZspTime(&psmStartSleepFrame,&psmStartSleepChip);/*»ñȡ˯Ãßǰʱ¼ä*/

+                    psm_sleep_handle(sleep_mode);

+#if USE_PSM_TEST

+                    *(volatile U32 *)(0x60000008) = *(volatile U32 *)(0x60000008) & (~(1<<14));

+#endif

+                    if (sleep_flag)

+                    {

+                        zOss_GetZspTime(&psmEndSleepFrame,&psmEndSleepChip);     /*»ñȡ˯Ãߺóʱ¼ä*/ 

+                        gPsm_SleepTime = Psm_ZspFramToMs(psmStartSleepFrame,psmStartSleepChip,psmEndSleepFrame,psmEndSleepChip);

+                        //gPsm_SleepTime  = g_TdDeepSleepLen-zOss_PsmReadTime();

+#ifdef   _USE_PSM_HANDSET

+                        g_psm_deepsleeplen = g_psm_deepsleeplen1 - gPsm_SleepTime;

+                        if (g_psm_deepsleeplen>=gPsmCfg->secondSleepTimeLen)

+                        {

+                            g_psm_deepsleepwakeupfc = tdSleep_frame;

+                            g_psm_deepsleepwakeupcc = tdSleep_chip;

+                        }

+#endif

+                        gPsm_SleepTimeForGui = gPsm_SleepTime;

+                        gRTCTimeToOSTimeFlag = 1;

+                        gTimer_CurTime += gPsm_SleepTime;

+                        gPsm_SleepTicks += gPsm_SleepTime;

+      

+                    }

+

+                }

+                else

+                {

+                    psm_sleep_handle(PSM_KENEL_SLEEP) ;

+                }

+            }

+        }

+        else if ((sys_type==SYS_LTE))

+        {

+            sleep_Enable = PSM_CheckLTESleepEnable();

+            g_bMfSleepen2 = sleep_Enable;

+            if (sleep_Enable )

+            {

+                sleep_mode = psm_LTESleepMode();

+                zOss_PsmSetSleepFlag(sleep_mode);

+                zOss_GetZspTime(&psmStartSleepFrame,&psmStartSleepChip);/*»ñȡ˯Ãßǰʱ¼ä*/

+                psm_sleep_handle(sleep_mode);

+

+                if (sleep_flag)

+                {

+                    zOss_GetZspTime(&psmEndSleepFrame,&psmEndSleepChip);     /*»ñȡ˯Ãߺóʱ¼ä*/ 

+                    gPsm_SleepTime = Psm_ZspFramToMs(psmStartSleepFrame,psmStartSleepChip,psmEndSleepFrame,psmEndSleepChip);

+                    //gPsm_SleepTime =gPSMArm0SleepTime -zOss_PsmReadTime();

+                    gPsm_SleepTimeForGui = gPsm_SleepTime;

+                    gRTCTimeToOSTimeFlag = 1;

+                    gTimer_CurTime += gPsm_SleepTime;

+                    gPsmSleepTimeSum += gPsm_SleepTime;

+                    gPsm_SleepTicks += gPsm_SleepTime;

+                }

+            }

+            else

+            {

+                g_dwMfKenerlSleepCount ++;//maofeng

+                zOss_PsmSetSleepFlag(PSM_KENEL_SLEEP);

+                psm_sleep_handle(PSM_KENEL_SLEEP) ;

+            }

+        } //maofeng

+#ifdef   _USE_PSM_2BNEW

+        Hal_GetArmCoreFreq(&gPSMCurrentPow);

+#endif

+#ifndef _USE_DATACARD

+        g_psmwakeuprtctime = Rtc_PsmGetTime();/***CQNJ00216067***/  //maofeng

+#endif

+#ifdef _USE_CPU_DFM

+        PSM_WakeUp_Init();

+#endif

+#ifndef _USE_PSM_PROVIDE_SLEEP_TIME

+        if (!sleep_flag)

+        {

+            POW_l1g_wakeup_spcu_cgu_for_ufi();

+        }

+#endif

+        zDrv_IntMaskRestore();

+        ZOSS_RESTORE_IRQ(old_intr);

+                

+#ifndef _USE_DATACARD

+        Rtc_PsmMinInt();/***************CQNJ00216067*************/

+#endif

+        }

+#ifdef _USE_UFI

+        else if(zAti2_PsIsInFlyMode())    /**/

+        {

+            PSM_AirplaneSleep();

+        }

+#endif

+        else

+        {

+            g_dwMfNonSleepCount ++;//maofeng

+        }

+#ifndef _OS_TOS

+        i++;

+

+        if ((gRTCTimeToOSTimeFlag == 1)||(!(i%3000000)))

+        {

+            SYSTIME_Init();

+            gRTCTimeToOSTimeFlag = 0;

+            i = 0;

+        }

+#endif

+    }

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetAppIdle

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨µÄÁ¢¼´µ÷ƵӦÓÃΪ¿ÕÏÐ״̬£¬

+*                             ×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦ÓÃ

+* ²ÎÊý˵Ã÷£ºappId:Ó¦ÓÃÉèÖÃÔÊÐí¿ÕÏеÄÓ¦ÓÃid

+* ·µ »Ø Öµ£º ZOSS_SUCCESS³É¹¦

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetAppIdle(UINT32 appId)

+{

+#ifdef _USE_PSM_2BNEW

+#ifdef _USE_APPFLAG_DFM

+    T_ZDrv_ErrCode  retCode     = DRV_SUCCESS;

+    UINT32 ignore               = ZOSS_ERROR;

+    UINT32  i                   = 0;

+    UINT32 tmpPSM_AppPow        = 0;

+    BOOL PSM_AppPowFlagIsFind   = FALSE;

+    UINT32  psmAppPowNum        = 0;

+    UINT32 tmpAppFlag           = 0;

+    T_ZOss_PSM_AppPow   *pPSM_AppPow;

+    

+    ignore = zOss_GetMutex(gPSMAppPowMutexID,ZOSS_WAIT_FOREVER);

+    if (ignore == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+    g_AppIdleFlag= g_AppIdleFlag & (~ (1<< appId));

+

+    if (pow_PsmGetUsbStatus())

+    {

+        pPSM_AppPow   = gPsmCfg->appUsbDfm;

+        psmAppPowNum  = gPsmCfg->appUsbDfmNum;

+        tmpPSM_AppPow = gPsmCfg->usbSysClk[0];

+#ifdef  _USE_FWP

+        if (gPSMCurrentPow !=  pPSM_AppPow[psmAppPowNum-1])

+        {

+            retCode  = Hal_SetArmCoreFreq(pPSM_AppPow[psmAppPowNum-1]);

+            if (retCode != DRV_SUCCESS)

+            {

+                ignore  = zOss_PutMutex(gPSMAppPowMutexID);

+                if (ignore == ZOSS_ERROR)

+                {

+                    return ZOSS_ERROR;

+                }

+                return retCode;

+            }

+            gPSMCurrentPow = pPSM_AppPow[psmAppPowNum-1];

+        }

+        ignore = zOss_PutMutex(gPSMAppPowMutexID);

+        if (ignore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+        return ZOSS_SUCCESS;

+#endif

+    }

+    else

+    {

+        pPSM_AppPow = gPsmCfg->appDfm;

+        psmAppPowNum = gPsmCfg->appDfmNum;

+        tmpPSM_AppPow = gPsmCfg->sysClk[0];

+    }

+

+    for (i = 0; i < psmAppPowNum ; i++)

+    {

+        if (g_AppIdleFlag == pPSM_AppPow[i].PSM_AppPowFlag)

+        {

+            tmpPSM_AppPow = pPSM_AppPow[i].PSM_AppPow;

+            PSM_AppPowFlagIsFind = TRUE;

+            break;

+        }

+    }

+    if (!PSM_AppPowFlagIsFind)

+    {

+        for (i = 0; i<psmAppPowNum; i++)

+        {

+            if (pPSM_AppPow[i].PSM_AppPowFlag&g_AppIdleFlag)//ËÑË÷ÅäÖÃ±í£¬¿´ÓÐÄÇЩӦÓã»

+            {

+                tmpPSM_AppPow = pPSM_AppPow[i].PSM_AppPow > tmpPSM_AppPow ? pPSM_AppPow[i].PSM_AppPow : tmpPSM_AppPow;

+            }

+        }

+    }

+

+    if (tmpPSM_AppPow != gPSMCurrentPow )

+    {

+        retCode  = Hal_SetArmCoreFreq(tmpPSM_AppPow);

+        if (retCode != DRV_SUCCESS)

+        {

+            ignore  = zOss_PutMutex(gPSMAppPowMutexID);

+            if (ignore == ZOSS_ERROR)

+            {

+                return ZOSS_ERROR;

+            }

+            return retCode;

+        }

+        gPSMCurrentPow = tmpPSM_AppPow;

+    }

+    ignore = zOss_PutMutex(gPSMAppPowMutexID);

+    if (ignore == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+#else

+    g_AppIdleFlag= g_AppIdleFlag & (~(1<< appId));

+#endif

+#else

+    g_AppIdleFlag= g_AppIdleFlag & (~(1<< appId));

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetAppActive

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Á¢¼´µ÷ƵµÄÓ¦ÓÃΪ·±Ã¦×´Ì¬£¬

+*                            ×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦ÓÃ

+* ²ÎÊý˵Ã÷£ºappId:Ó¦ÓÃÉèÖÃÔÊÐí·±Ã¦µÄÓ¦ÓÃid

+* ·µ »Ø Öµ£º ZOSS_SUCCESS³É¹¦

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetAppActive(UINT32 appId)

+{

+#ifdef _USE_PSM_2BNEW

+#ifdef _USE_APPFLAG_DFM

+    T_ZDrv_ErrCode  retCode         = DRV_SUCCESS;

+    UINT32 ignore                   = ZOSS_ERROR;

+    UINT32  i                       = 0;

+    UINT32  tmpPsm_AppPow           = 0;

+    BOOL PSM_AppPowFlagIsFind       = FALSE;

+    T_ZOss_PSM_AppPow *pPSM_AppPow  = NULL;

+    UINT32  psmAppPowNum            = 0;

+

+    ignore = zOss_GetMutex(gPSMAppPowMutexID,ZOSS_WAIT_FOREVER);

+    if (ignore == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+    g_AppIdleFlag= g_AppIdleFlag | (1<< appId);

+    if (pow_PsmGetUsbStatus())

+    {

+        pPSM_AppPow = gPsmCfg->appUsbDfm;

+        psmAppPowNum = gPsmCfg->appUsbDfmNum;

+        tmpPsm_AppPow = gPsmCfg->usbSysClk[0];

+#ifdef  _USE_FWP

+        if (gPSMCurrentPow !=  pPSM_AppPow[psmAppPowNum-1])

+        {

+            retCode  = Hal_SetArmCoreFreq(pPSM_AppPow[psmAppPowNum-1]);

+            if (retCode != DRV_SUCCESS)

+            {

+                ignore  = zOss_PutMutex(gPSMAppPowMutexID);

+                if (ignore == ZOSS_ERROR)

+                {

+                    return ZOSS_ERROR;

+                }

+                return retCode;

+            }

+            gPSMCurrentPow = pPSM_AppPow[psmAppPowNum-1];

+        }

+        ignore = zOss_PutMutex(gPSMAppPowMutexID);

+        if (ignore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+        return ZOSS_SUCCESS;

+#endif

+    }

+    else

+    {

+        pPSM_AppPow   = gPsmCfg->appDfm;

+        psmAppPowNum  = gPsmCfg->appDfmNum;

+        tmpPsm_AppPow = gPsmCfg->sysClk[0];

+    }

+

+    for (i  = 0; i< psmAppPowNum ;i++)

+    {

+        if (g_AppIdleFlag == pPSM_AppPow[i].PSM_AppPowFlag)

+        {

+            tmpPsm_AppPow = pPSM_AppPow[i].PSM_AppPow;

+            PSM_AppPowFlagIsFind = TRUE;

+            break;

+        }

+    }

+    if (!PSM_AppPowFlagIsFind)

+    {

+        for (i = 0; i<psmAppPowNum; i++)

+        {

+            if (pPSM_AppPow[i].PSM_AppPowFlag&g_AppIdleFlag)//ËÑË÷ÅäÖÃ±í£¬¿´ÓÐÄÇЩӦÓã»

+            {

+                tmpPsm_AppPow = pPSM_AppPow[i].PSM_AppPow > tmpPsm_AppPow ? pPSM_AppPow[i].PSM_AppPow : tmpPsm_AppPow;

+            }

+        }

+    }

+

+    if (gPSMCurrentPow !=  tmpPsm_AppPow)

+    {

+        retCode  = Hal_SetArmCoreFreq(tmpPsm_AppPow);

+        if (retCode != DRV_SUCCESS)

+        {

+            ignore  = zOss_PutMutex(gPSMAppPowMutexID);

+            if (ignore == ZOSS_ERROR)

+            {

+                return ZOSS_ERROR;

+            }

+            return retCode;

+        }

+        gPSMCurrentPow = tmpPsm_AppPow;

+    }

+    ignore  = zOss_PutMutex(gPSMAppPowMutexID);

+    if (ignore == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+#else

+    g_AppIdleFlag= g_AppIdleFlag | (1<< appId);

+#endif

+#else

+    g_AppIdleFlag= g_AppIdleFlag | (1<< appId);

+#endif

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetDevIdle

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨É豸Ϊ¿ÕÏÐ״̬£¬×î´ó¿ÉÒÔ¿ØÖÆ32¸öÉ豸¡£¾ßÌåÄÄһλ´ú±íʲôÉ豸ÓÉµ×²ã¹æ¶¨

+* ²ÎÊý˵Ã÷£ºdevId:É豸ÉèÖÃÔÊÐí¿ÕÏеÄÉ豸id

+* ·µ »Ø Öµ£º ZOSS_SUCCESS³É¹¦

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetDevIdle(UINT32 devId)

+{

+    gPSM_DrvIdleFlag= gPSM_DrvIdleFlag & (~(1<< devId));

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetDevActive

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨É豸Ϊ·±Ã¦×´Ì¬£¬×î´ó¿ÉÒÔ¿ØÖÆ32¸öÉ豸

+* ²ÎÊý˵Ã÷£ºdevId:É豸ÉèÖÃÔÊÐí·±Ã¦µÄÉ豸id

+* ·µ »Ø Öµ£º ZOSS_SUCCESS³É¹¦

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetDevActive(UINT32 devId)

+{

+    gPSM_DrvIdleFlag= gPSM_DrvIdleFlag | (1<< devId);

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetPSMAppIdle

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Ë¯ÃßÁ÷³ÌÓ¦ÓÃΪ¿ÕÏÐ״̬£¬

+*                            ×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦ÓÃ

+* ²ÎÊý˵Ã÷£ºappId:Ó¦ÓÃÉèÖÃÔÊÐí¿ÕÏеÄÓ¦ÓÃid

+* ·µ »Ø Öµ£º ZOSS_SUCCESS³É¹¦

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetPSMAppIdle(UINT32 appId)

+{

+    gPSM_AppIdleFlag= gPSM_AppIdleFlag & (~(1<< appId));

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_SetPSMAppActive

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Ë¯ÃßÁ÷³ÌÓ¦ÓÃΪ·±Ã¦×´Ì¬£¬

+*                            ×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦ÓÃ

+* ²ÎÊý˵Ã÷£ºappId:Ó¦ÓÃÉèÖÃÔÊÐí·±Ã¦µÄÓ¦ÓÃid

+* ·µ »Ø Öµ£º    ZOSS_SUCCESS³É¹¦

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetPSMAppActive(UINT32 appId)

+{

+    gPSM_AppIdleFlag= gPSM_AppIdleFlag | (1<< appId);

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetDevFlag

+* ¹¦ÄÜÃèÊö£º·µ»ØÉ豸µÄ״̬

+* ²ÎÊý˵Ã÷£ºnone

+* ·µ »Ø Öµ£º É豸µÄ״̬

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_GetDevFlag(VOID)

+{

+    return gPSM_DrvIdleFlag;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_GetL1g_AllowSleepTime

+ * ¹¦ÄÜÃèÊö£º»ñÈ¡L1gÔÊÐíÐÝÃßµÄʱ¼ä

+ * ²ÎÊý˵Ã÷£ºframe:L1gÔÊÐíÐÝÃßµÄÖ¡Êý

+ * ·µ »Ø Öµ£º ÎÞ

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+VOID zOss_GetL1g_AllowSleepTime(UINT32 frame)

+{

+    gL1gSleepTime= frame*PSM_GSM_FRAME_MS;

+

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º UINT32   zOss_PSMSleepTimeForGui(VOID)

+ * ¹¦ÄÜÃèÊö£º ¹©GUI»ñȡϵͳ²¹³¥Ê±¼ä

+ * ²ÎÊý˵Ã÷£º ÎÞ

+ * ·µ »Ø Öµ£º    ·µ»ØÐèÒª²¹³¥µÄϵͳʱ¼ä

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+UINT32  zOss_GetSleepTimeForGui(VOID)

+{

+    UINT32 tmpPsmSleepTime = 0;

+

+    tmpPsmSleepTime = gPsm_SleepTimeForGui;

+    gPsm_SleepTimeForGui = 0;

+    return tmpPsmSleepTime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º UINT32   zOss_GetSleepTimeForTicks(VOID)

+ * ¹¦ÄÜÃèÊö£º ¹©²Ù×÷ϵͳticks²¹³¥£»

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º    ·µ»ØÐèÒª²¹³¥µÄϵͳʱ¼ä

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32  zOss_GetSleepTimeForTicks(VOID)

+{

+    UINT32 tmpPsmSleepTime = 0;

+ 

+    tmpPsmSleepTime = gPsm_SleepTicks/ZOSS_MS_PER_TICK;

+    return tmpPsmSleepTime; 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_ApplyCpuFreq(UINT32  appId ,BOOL isUsed)

+* ¹¦ÄÜÃèÊö£º Á¢¼´µ÷Ƶº¯Êý

+* ²ÎÊý˵Ã÷£º

+                 appid:Á¢¼´µ÷ƵID,×î´óÖ§³Ö32¸öÁ¢¼´µ÷Ƶ;

+                 isUsed:TRUEʱ½øÐÐÉýƵ£¬FALSEʱ½øÐнµÆµ²Ù×÷;

+

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR;

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32  zOss_ApplyCpuFreq(UINT32  appId ,BOOL isUsed)

+{

+#if defined (_USE_APPFLAG_DFM)

+    UINT32 retCode =ZOSS_ERROR;

+    if (isUsed)

+    {

+        retCode = zOss_SetAppActive(appId);

+        if (retCode!=ZOSS_SUCCESS)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    else

+    {

+        retCode = zOss_SetAppIdle(appId);

+        if (retCode!=ZOSS_SUCCESS)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+#elif   defined(_USE_CPU_DFM)

+    zOss_ApplyCpuPerf(appId,isUsed);

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+#ifdef _USE_CPU_DFM

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: zOss_ThreadSwapInPsmHook

+* ²ÎÊý˵Ã÷: Ïß³ÌÇÐÈëʱµÄÊ¡µç¹³×Ó    

+*          (IN)  

+*               user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*          (OUT)  

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_ThreadSwapInPsmHook(T_ZOsa_ThreadUserArea *user_area)

+{

+    ZOSS_INTR   old_intr        = 0;

+    UINT32      past_time       = 0;

+    UINT32      current_time    = 0;

+    

+    zOss_AssertExN(user_area != NULL);

+    ZOSS_SAVE_IRQ(old_intr);

+    current_time            = Osa_HwTimeRead();

+    past_time               = current_time - gPsm_SwapLastTime;

+    gPsm_CpuSumtime         += past_time;

+    user_area->psmCpuTime   += past_time;

+    currentPSMThread        = user_area->threadid;

+    gPsm_SwapLastTime       = current_time;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: zOss_ThreadSwapOutPsmHook

+* ²ÎÊý˵Ã÷: Ïß³ÌÇгöʱµÄÊ¡µç¹³×Ó  

+*           (IN)  

+*                user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*           (OUT)  

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_ThreadSwapOutPsmHook(T_ZOsa_ThreadUserArea *user_area)

+{

+    ZOSS_INTR   old_intr        = 0;

+    UINT32      past_time       = 0;

+    UINT32      current_time    = 0;

+

+    zOss_AssertExN(user_area != NULL);

+    ZOSS_SAVE_IRQ(old_intr);

+    current_time            = Osa_HwTimeRead();

+    past_time               = current_time - gPsm_SwapLastTime;

+    gPsm_CpuSumtime         += past_time;

+    user_area->psmCpuTime   += past_time;

+    currentPSMThread        = NULL;

+    gPsm_SwapLastTime     = current_time;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: zOss_RecordPsmLastSwapTime

+* ²ÎÊý˵Ã÷:     

+*           (IN)  

+*               ¼Ç¼ʡµç×îºóÒ»´ÎÏß³ÌÇл»µÄʱ¼ä£»

+*           (OUT)  

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_RecordPsmLastSwapTime(VOID)

+{

+    gPsm_SwapLastTime   = Osa_HwTimeRead();

+}

+#endif

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_ClearArm1SleepTime

+ * ¹¦ÄÜÃèÊö£º Çå³þÔÚARM1˯ÃßʱARM0˯Ãßʱ¼ä×ܺÍ

+ * ²ÎÊý˵Ã÷£º ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+************************************************************************/

+UINT32  zOss_PsmClearArm1SleepTime(VOID)

+{

+    gPsmSleepTimeSum = 0;

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_PsmAdjustFreq312M

+* ¹¦ÄÜÃèÊö£º ½â¾öϵͳÔÚ¶¯Ì¬´´½¨Ï̲߳¢Í˳öÏß³Ìʱ£¬ARMÖ÷ƵΪ78MÇé¿öÏ£¬·¢ÉúµÄose_heapdÏß³ÌËøÖжϴóÓÚ400usµ¼ÖµÄGP0¶ÏÑÔÎÊÌ⣬

+             ÔÚ·¢ÉúÕâÖÖÇé¿öµÄʱºò£¬°ÑÖ÷Ƶµ÷Õûµ½312M¡£È»ºóÓɶ¯Ì¬µ÷Ƶģ¿é¸ºÔð°ÑÖ÷Ƶµ÷Õû»ØÈ¥¡£

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ZOSS_SUCCESS

+* ÆäËü˵Ã÷£º ¸Ãº¯Êý½ö½öÔÚzOss_ExitThreadº¯ÊýÖÐʹÓÃ

+************************************************************************/

+UINT32 zOss_PsmAdjustFreq312M(VOID)

+{

+    return 0;

+}

+#endif

+

+

+

diff --git a/cp/ps/plat/src/oss/psm/src/psm_297510.c b/cp/ps/plat/src/oss/psm/src/psm_297510.c
new file mode 100644
index 0000000..772013c
--- /dev/null
+++ b/cp/ps/plat/src/oss/psm/src/psm_297510.c
@@ -0,0 +1,1474 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2013 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : psm_297510.c

+* ÎÄ ¼þ Ãû : psm_297510.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Ê¡µç¹ÜÀí(power save manager)

+* ×÷    Õß : ¸ß»ª·å

+* °æ    ±¾ : V0.1

+* Íê³ÉÈÕÆÚ : 2013.11.15

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+#ifdef _USE_PSM

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "drvs_pow.h"

+#include "drvs_pwr.h"

+#include "drvs_ret.h"

+#include "sup.h"

+#include "osa.h"

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_PSM_THREAD_TOTAL_TIME_MIN          3000

+#define ZOSS_PSM_IGNORE_THREAD_TOTAL_TIME_MIN   1000

+#define ZOSS_PSM_IDLE_CPU_LOAD                  70

+

+/**************************************************************************

+* Íⲿº¯ÊýºÍ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+//gsml1 ÌṩµÄº¯Êý£»

+extern BOOL   zGsml1_AttemptSleep(UINT32 mode);

+extern UINT32 zGsml1_PsmGetSleepTime(VOID);

+extern BOOL   zGsml1_PsmIdleFlag(VOID);

+extern BOOL   zGsml1_PsmGetCampon(VOID);

+

+//ЭÒéÕ»ÌṩµÄº¯Êý£»

+extern BYTE   zPs_IsGsmMasterMode(VOID);

+extern BOOL   zPs_PsmIdleFlag(VOID);

+extern BOOL   zAti2_PsIsInFlyMode(VOID);

+extern BYTE   zPS_umm_IsLossOfCoverage(VOID);

+

+//Çý¶¯ÌṩµÄº¯Êý£»

+extern BOOL   zDrvPow_PsmGetCampon(VOID);

+extern BOOL   zDrvPow_PsmIdleFlag(VOID);

+

+extern UINT64 gTimer_CurTime;

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/*ʱ¼ä²¹³¥½á¹¹Ìå*/

+typedef struct

+{

+    T_ZOss_Node         node;

+    psm_CompensateHook  psm_CompensateHook;

+} T_zPsm_CompensateNode;

+

+#ifdef _USE_CPU_DFM

+typedef enum

+{

+    PSM_PULL_CPUFREQ,   /* ÉýƵÁ½¼¶ */

+    PSM_UP_CPUFREQ,     /* ÉýƵһ¼¶ */

+    PSM_DOWN_CPUFREQ    /* ½µÆµ     */

+} T_zPsm_FmScope;

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID   psm_IdleThreadEntry(SINT32 ignore);

+static BOOL   psm_CampOnSleepCheck(VOID);

+static VOID   psm_CampOnSleep(VOID);

+static VOID   psm_LossCoverageSleep(VOID);

+static VOID   psm_AirplaneSleep(VOID);

+static BOOL   psm_CampOnCheck(VOID);

+static VOID   psm_SleepTimeCompensate(UINT32 sleepTime);

+static VOID   psm_PowerOnSleep(VOID);

+static VOID   psm_BootSleep(VOID);

+static BOOL   psm_CheckSleepTime(BOOL modeHaveGsm);

+static BOOL   psm_CheckSleepFlag(VOID);              

+static BOOL   psm_SleepCheck(VOID);

+static VOID   psm_CompensateTicks(UINT32 sleepTime);

+static VOID   psm_CompensateTimer(UINT32 sleepTime);

+static BOOL   psm_AppIdleFlag(VOID);

+static UINT32 psm_GetPreSleepTime(VOID);

+static BOOL   Psm_PlatIdleFlag(VOID);

+

+#ifdef _USE_CPU_DFM

+static UINT32 psm_GetIgnoreThreadTime(VOID);

+static VOID   psm_GetIdleCpuLoad(UINT32 *pIdleCpuLoad);

+static VOID   psm_ClearIIT(VOID);

+static UINT32 psm_GetDesCpuFreq(T_zPsm_CpuFm *pDesCpuFreqCfg, UINT32 cfgCnt, UINT32 curCpuFreq, UINT32 dfmFlag);

+static UINT32 psm_FindDesCpuFreq(UINT32 cpuload, UINT32 curCpuFreq);

+static UINT32 psm_FindMinCpuFreq(VOID);

+static VOID   psm_InterruptRoutine(SINT32 args);

+static VOID   psm_SetIgnoreThread(VOID);

+static UINT32 psm_GetCpuFreq(UINT32 ait);

+static UINT32 psm_GetAIT(UINT32 idleThreadCpu);

+static VOID   psm_ClearThreadCpu(VOID);

+static VOID   psm_DfmWakeUpReset(VOID);

+#endif

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+T_zPsm_Param    *g_zPsmCfg               = NULL;

+UINT32          g_zPsm_SleepTime         = 0;   /* ϵͳÐÝÃßʱ¼ä                 */

+UINT32          g_zPsm_CurCpuFreq        = 0;   /* µ±Ç°Ö÷Ƶ                     */

+

+#ifdef _USE_CPU_DFM

+static  UINT32  g_zPsm_SwapLastTime      = 0;

+UINT32          g_zPsm_SumCpuTime        = 0;        

+ZOSS_THREAD_ID  g_zPsm_CurThread         = NULL;

+ZOSS_THREAD_ID  *g_zPsm_IgnoreThreadId   = NULL;

+#endif

+

+static UINT32   g_zPsm_AppIdleFlag       = 0;   /* Ó¦ÓÿÕÏбêÖ¾·û£¬¿ØÖÆË¯ÃßÁ÷³Ì */

+static UINT32   g_zPsm_PreSleeptime      = 0;   /* ¼ÆËãÔ¤ÆÚµÄ˯Ãßʱ¼ä           */

+static BOOL     g_zPsm_SysModeHaveGsm    = 0;

+static ZOSS_THREAD_ID g_zPsm_PsmThreadId = NULL;

+static UINT32   g_zPsm_SleepTicksTime    = 0;   /* ÓÃÓÚ²¹³¥ticksÖµµÄ˯Ãßʱ¼ä    */

+static T_ZOss_List g_zPsm_CmpnstFuncList = {0}; /* ¸÷Ä£¿é²¹³¥º¯ÊýµÄÁ´±í         */

+static psm_SleepInitHook   g_zPsm_SleepInitHook         = NULL;

+static psm_SleepFinishHook g_zPsm_SleepFinishHook       = NULL;

+static psm_SleepBeforeHook g_zPsm_SleepBeforeHook       = NULL;

+static psm_SleepAfterHook  g_zPsm_SleepAfterHook        = NULL;

+static volatile T_zPsm_BootStage g_zPsm_BootStateFlag   = PSM_BOOT_DEFAULT; /* ϵͳÆô¶¯½×¶Î±ê־λ */

+

+#ifdef _USE_CPU_DFM

+static BOOL     g_zPsm_DfmFlag              = FALSE;

+static UINT32   g_zPsm_IITCnt               = 0;

+static UINT32   g_zPsm_DfmCnt               = 0;

+static UINT32   g_zPsm_SumIIT               = 0;

+static UINT32   g_zPsm_MinCpuFreq           = 0;

+static BOOL     g_zPsm_DfmFinishFlag        = FALSE;

+static SINT32   *g_zPsm_IIT                 = NULL;

+static FLOAT    g_zPsm_IgnoreThreadTimeRate = 0.6;

+static UINT32   g_zPsm_IgnoreThreadIndex    = 0;

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_IdleThreadEntry

+* ¹¦ÄÜÃèÊö£ºÊ¡µçÏß³ÌÈë¿Ú

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_IdleThreadEntry(SINT32 ignore)

+{

+    if (g_zPsm_SleepInitHook != NULL)

+        g_zPsm_SleepInitHook();

+    

+    psm_BootSleep();   

+    

+    for( ; ; )

+    {

+        if (psm_CampOnSleepCheck())               // ÓÐÍøË¯ÃßÁ÷³Ì£»

+        {

+            psm_CampOnSleep();

+        }

+        else if(zPS_umm_IsLossOfCoverage())       // ¶ªÊ§¸²¸Ç˯ÃßÁ÷³Ì£»

+        {

+            psm_LossCoverageSleep();

+        }

+        else                                      // ·ÉÐÐģʽ˯ÃßÁ÷³Ì£»                

+        {

+            if(zAti2_PsIsInFlyMode()) 

+                psm_AirplaneSleep();

+        }

+        

+        zDrvPow_Sleep_Func(KERNEL_SLEEP_MODE, 0); //ÆäËüģʽ¶¼²»Âú×ã½øÈëµ½ÄÚºËÊ¡µç£»

+        

+        if (g_zPsm_SleepFinishHook != NULL)

+            g_zPsm_SleepFinishHook();

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetPreSleepTime

+* ¹¦ÄÜÃèÊö£º¼ÆËãÔ¤ÆÚµÄ˯Ãßʱ¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£ºÔÚËø¶ÏÉÏÏÂÎÄʹÓÃÎÞÐèËøÖжϣ»

+************************************************************************/

+static UINT32 psm_GetPreSleepTime(VOID)   

+{

+    return g_zPsm_PreSleeptime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_BootSleep

+* ¹¦ÄÜÃèÊö£º¿ª»úÍê³Éǰʡµç´¦Àí

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚidleÏ̵߳÷Óã¬g_zPsmBootStateFlagʹÓó¡¾°¼òµ¥ÎÞÐè±£»¤£»

+**************************************************************************/

+static VOID psm_BootSleep(VOID) 

+{   

+    while (g_zPsm_BootStateFlag == PSM_BOOT_DEFAULT)

+        ;

+

+    while (!psm_CampOnCheck() && g_zPsm_BootStateFlag != PSM_BOOT_FINISH)

+    {

+        psm_PowerOnSleep();

+    }

+

+    g_zPsm_BootStateFlag = PSM_BOOT_FINISH;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CampOnSleepCheck

+* ¹¦ÄÜÃèÊö£ºÐ¡Çø×¤ÁôºóÕý³£Ë¯ÃßÁ÷³ÌÅжϺ¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ         

+* ·µ »Ø Öµ£º·µ»ØTRUE±íʾ¿ÉÒÔ½øÈë¸Ã˯Ãß,·µ»ØFALSE±íʾ²»ÄܽøÈë¸Ã˯ÃßÁ÷³Ì;

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_CampOnSleepCheck(VOID)

+{   

+    if (psm_CampOnCheck())

+    {

+        /*·µ»ØÖµÎªTUREʱ±íʾµ±Ç°ÖÆÊ½º¬ÓÐGSM,·µ»ØFALSEʱ±íʾûÓÐGSM*/

+        g_zPsm_SysModeHaveGsm  = zPs_IsGsmMasterMode();     

+        return psm_SleepCheck();

+    }

+

+    return FALSE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CampOnCheck

+* ¹¦ÄÜÃèÊö£ºÅжÏÊÇ·ñפÁôÍøÂç³É¹¦

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static BOOL psm_CampOnCheck(VOID)   

+{

+    return (zDrvPow_PsmGetCampon() || zGsml1_PsmGetCampon());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SleepCheck

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_SleepCheck(VOID)

+{

+    if (zPs_PsmIdleFlag() && zDrvPow_PsmIdleFlag() && Psm_PlatIdleFlag() && psm_AppIdleFlag())

+    {

+        return (zGsml1_AttemptSleep(g_zPsm_SysModeHaveGsm));

+    }

+    

+    return FALSE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CheckSleepTime

+* ¹¦ÄÜÃèÊö£ºÅжÏ˯Ãßʱ¼äÊÇ·ñÔÊÐíÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               modeHaveGsm : µ±Ç°ÏµÍ³Ä£Ê½ÊÇ·ñº¬ÓÐGSM,TRUE±íʾº¬ÓУ¬FALSE

+*                             ±íʾûÓУ»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º TRUE:Éî˯Ãߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º ÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static BOOL psm_CheckSleepTime(BOOL modeHaveGsm)

+{

+    g_zPsm_PreSleeptime = modeHaveGsm ? min(zGsml1_PsmGetSleepTime(), zOss_GetPs_SleepTimer()) :

+                                            zOss_GetPs_SleepTimer();

+    return (g_zPsm_PreSleeptime > g_zPsmCfg->deepSleepTimeThreshold);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SleepMode

+* ¹¦ÄÜÃèÊö£º»ñȡʡµç˯Ãßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ         

+* ·µ »Ø Öµ£ºTURE:¿ÉÒÔ˯ÃßÁË£¬FALSE:²»ÄÜ˯Ãߣ»

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static BOOL psm_SleepMode(VOID)

+{

+    /* g_zPsm_SysModeHaveGsm µÈÓÚTUREʱ±íʾµ±Ç°ÖÆÊ½º¬ÓÐGSM, µÈÓÚFALSEʱ±íʾûÓÐGSMÖÆÊ½ */

+    return (psm_CheckSleepTime(g_zPsm_SysModeHaveGsm) && psm_CheckSleepFlag());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CheckSleepFlag

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃߵȴý

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߵȴý£»FALSE:²»ÄܽøÈëÐÝÃߵȴý

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_CheckSleepFlag(VOID)

+{

+    return (!zGsml1_PsmIdleFlag() && zDrvPow_PsmIdleFlag() && Psm_PlatIdleFlag() && psm_AppIdleFlag() && zPs_PsmIdleFlag());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SleepTimeCompensate

+* ¹¦ÄÜÃèÊö£ºË¯Ãßʱ¼ä²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime : ²¹³¥Ê±¼ä

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºº¯ÊýÔËÐÐÔÚËøÖжÏËùÖжÏÉÏÏÂÎÄÖУ¬¹Ê²»½øÐÐËøÖжϱ£»¤£»

+**************************************************************************/

+static VOID psm_SleepTimeCompensate(UINT32 sleepTime)

+{

+    T_zPsm_CompensateNode *pCmpnstNode = (T_zPsm_CompensateNode *)zOss_ListFirst(&g_zPsm_CmpnstFuncList);

+

+    while(pCmpnstNode != NULL)

+    {

+        pCmpnstNode->psm_CompensateHook(sleepTime);

+        pCmpnstNode = (T_zPsm_CompensateNode *)zOss_ListNext(&(pCmpnstNode->node));

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_PowerOnSleep

+* ¹¦ÄÜÃèÊö£º¿ª»úÍê³ÉǰµÄÊ¡µç´¦Àí

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_PowerOnSleep(VOID)

+{ 

+    ZOSS_INTR old_intr;

+  

+    g_zPsm_SysModeHaveGsm  = zPs_IsGsmMasterMode();

+    

+    if (!zGsml1_AttemptSleep(g_zPsm_SysModeHaveGsm))

+        return;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if ((g_zPsm_BootStateFlag == PSM_SYSINIT_FINISH) && psm_CheckSleepFlag())

+    {

+        g_zPsm_SleepTime = zDrvPow_Sleep_Func(BOOT_SLEEP_MODE, g_zPsmCfg->chargeringSleepTime);

+        psm_SleepTimeCompensate(g_zPsm_SleepTime);

+#ifdef _USE_CPU_DFM

+        psm_DfmWakeUpReset();

+#endif            

+    }    

+

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);  

+    

+    if ((g_zPsmCfg->bootOverClk!= 0) && (g_zPsmCfg->bootOverClk != g_zPsm_CurCpuFreq))

+    {

+        zDrvPow_SetArmPsCoreFreq(g_zPsmCfg->bootOverClk);

+    }

+

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_AirplaneSleep 

+* ¹¦ÄÜÃèÊö£º·ÉÐÐģʽ˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ                      

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_AirplaneSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+

+    g_zPsm_SysModeHaveGsm  = zPs_IsGsmMasterMode(); 

+    if(!zGsml1_AttemptSleep(g_zPsm_SysModeHaveGsm))

+        return;

+       

+    ZOSS_SAVE_IRQ(old_intr); 

+    

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if(psm_CheckSleepFlag() && zAti2_PsIsInFlyMode())

+    {

+        g_zPsm_SleepTime = zDrvPow_Sleep_Func(AIRPLANE_SLEEP_MODE,g_zPsmCfg->airPlaneSleepTime);

+        psm_SleepTimeCompensate(g_zPsm_SleepTime);

+#ifdef _USE_CPU_DFM                    

+        psm_DfmWakeUpReset();

+#endif

+    }

+    

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CampOnSleep

+* ¹¦ÄÜÃèÊö£º×¤ÁôºóµÄÕý³£Ë¯ÃßÁ÷³Ì

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_CampOnSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if (psm_SleepMode())  

+    {

+        g_zPsm_SleepTime = zDrvPow_Sleep_Func(DEEP_SLEEP_MODE, psm_GetPreSleepTime());

+        psm_SleepTimeCompensate(g_zPsm_SleepTime);                  

+#ifdef _USE_CPU_DFM

+        psm_DfmWakeUpReset();

+#endif

+    }

+    

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);      

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_LossCoverageSleep

+* ¹¦ÄÜÃèÊö£º¶ªÊ§¸²¸Ç˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_LossCoverageSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+

+    g_zPsm_SysModeHaveGsm  = zPs_IsGsmMasterMode(); 

+    if(!zGsml1_AttemptSleep(g_zPsm_SysModeHaveGsm))

+        return;

+   

+    ZOSS_SAVE_IRQ(old_intr); 

+

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if(psm_CheckSleepFlag())

+    {

+        UINT32 sleepTime   = zOss_GetPs_SleepTimer();    

+

+        if (zPS_umm_IsLossOfCoverage() && (sleepTime > g_zPsmCfg->deepSleepTimeThreshold))

+        {

+            g_zPsm_SleepTime = zDrvPow_Sleep_Func(LOSSCOVERAGE_SLEEP_MODE, sleepTime);

+            psm_SleepTimeCompensate(g_zPsm_SleepTime);

+#ifdef _USE_CPU_DFM                      

+            psm_DfmWakeUpReset();

+#endif

+        }

+    }

+    

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CompensateOssSleepTime 

+* ¹¦ÄÜÃèÊö£ºÆ½Ì¨Ö§³ÅticksÖµ²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime: ²¹³¥Ê±¼ä,µ¥Î»:ms£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_CompensateTicks(UINT32 sleepTime)

+{

+    g_zPsm_SleepTicksTime += sleepTime;    

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CompensateOssSleepTime 

+* ¹¦ÄÜÃèÊö£ºÆ½Ì¨Ö§³Å¶¨Ê±Æ÷²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime: ²¹³¥Ê±¼ä,µ¥Î»:ms£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_CompensateTimer(UINT32 sleepTime)

+{

+    gTimer_CurTime += sleepTime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_AppIdleFlag 

+* ¹¦ÄÜÃèÊö£ºÅжÏÓ¦ÓÃÊÇ·ñ¿ÕÏУ»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÓ¦Óñê־λ£»

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static BOOL psm_AppIdleFlag(VOID)

+{

+    return (g_zPsm_AppIdleFlag == 0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPsm_PlatIdleFlag 

+* ¹¦ÄÜÃèÊö£ºÅÐ¶ÏÆ½Ì¨ÊÇ·ñÔÊÐí˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÓ¦Óñê־λ£»

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£» 

+**************************************************************************/

+static BOOL Psm_PlatIdleFlag(VOID)

+{

+    return (g_zPsm_SleepTime == 0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPsm_CompensateInit 

+* ¹¦ÄÜÃèÊö£ºÊ¡µç²¹³¥³õʼ»¯£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID Psm_CompensateInit(VOID)

+{

+    zOss_ListInit(&g_zPsm_CmpnstFuncList);

+    zOss_RegSleepCompensateFunc(psm_CompensateTicks);

+    zOss_RegSleepCompensateFunc(psm_CompensateTimer);

+}

+

+#ifdef _USE_CPU_DFM

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPsm_DfmInit 

+* ¹¦ÄÜÃèÊö£º¶¯Ì¬µ÷Ƶ³õʼ»¯£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID Psm_DfmInit(VOID)

+{

+    g_zPsm_CurCpuFreq = zDrvPow_GetPsCoreFreq();

+    g_zPsm_IIT = (SINT32 *)zOss_Malloc(sizeof(SINT32) * g_zPsmCfg->dfmCnt);

+    zOss_AssertExN(g_zPsm_IIT != NULL);

+    zOss_Memset(g_zPsm_IIT, 0, (sizeof(SINT32) * g_zPsmCfg->dfmCnt));

+    g_zPsm_IgnoreThreadId = (ZOSS_THREAD_ID *)zOss_Malloc(g_zPsmCfg->ignoreThreadCnt * sizeof(ZOSS_THREAD_ID));

+    zOss_AssertExN(g_zPsm_IgnoreThreadId != NULL);

+    zOss_Memset(g_zPsm_IgnoreThreadId, 0, g_zPsmCfg->ignoreThreadCnt * sizeof(ZOSS_THREAD_ID));   

+#ifdef _OS_OSE

+    start(create_process(OS_TI_PROC, "PSM_TIMER_ISR", (OSENTRYPOINT *)psm_InterruptRoutine, (OSADDRESS)1024 * 20,

+          (OSPRIORITY)g_zPsmCfg->dfmThrdPri, (OSTIME)g_zPsmCfg->dfmPeriod, (PROCESS)0, (struct OS_redir_entry *)NULL, (OSVECTOR)0, (OSUSER)0));

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_DfmWakeUpReset

+* ¹¦ÄÜÃèÊö£ºË¯ÃßÐÑÀ´ºóÒªÐèÒªÖØÐ¼ÆËãgPsm_AITµÈ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_DfmWakeUpReset(VOID) 

+{

+    g_zPsm_CurCpuFreq = zDrvPow_GetPsCoreFreq();

+    psm_ClearThreadCpu();

+    psm_ClearIIT();

+    g_zPsm_SumCpuTime   = 0;

+    g_zPsm_DfmFlag      = FALSE;

+    g_zPsm_SwapLastTime = Osa_HwTimeRead();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetIgnoreThreadTime

+* ¹¦ÄÜÃèÊö£º»ñÈ¡ºöÂÔÏ̵߳Äʱ¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 psm_GetIgnoreThreadTime(VOID)

+{

+    UINT32 psmIgnoreTime                = 0;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    SINT32              i               = 0;

+    

+    for (i = 0; i < g_zPsm_IgnoreThreadIndex; i++)

+    {

+        pPsmThreadUa = zOss_GetThreadUserArea(g_zPsm_IgnoreThreadId[i]);

+        if (pPsmThreadUa != NULL)

+        {

+            psmIgnoreTime += pPsmThreadUa->psmCpuTime;

+        }

+    }

+    

+    return psmIgnoreTime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetIdleCpuLoad

+* ¹¦ÄÜÃèÊö£º»ñȡϵͳ¿ÕÏиºÔØ£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               idlecpuLoad: cpu¿ÕÏÐÂÊ£»

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_GetIdleCpuLoad(UINT32 *pIdleCpuLoad)

+{

+    SINT32 psmIgnoreTime                = 0; 

+    SINT32 totaltime                    = 0; 

+    SINT32 psmIdleTime                  = 0; 

+    SINT32 tmpIIT                       = 0; 

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    SINT32 tmpPsmTime                   = Osa_HwTimeRead() - g_zPsm_SwapLastTime;

+    

+    totaltime = g_zPsm_SumCpuTime + tmpPsmTime;

+    

+    if (totaltime < ZOSS_PSM_THREAD_TOTAL_TIME_MIN)

+    {

+        *pIdleCpuLoad = ZOSS_PSM_IDLE_CPU_LOAD;

+    }

+    else

+    {

+        if (g_zPsm_CurThread != NULL)

+        {

+            pPsmThreadUa =  zOss_GetThreadUserArea(g_zPsm_CurThread);

+            if (pPsmThreadUa != NULL)

+            {

+                pPsmThreadUa->psmCpuTime += tmpPsmTime ;

+            }

+        }

+        

+        pPsmThreadUa  = zOss_GetThreadUserArea(g_zPsm_PsmThreadId);

+        psmIdleTime   = pPsmThreadUa->psmCpuTime;

+        psmIgnoreTime = psm_GetIgnoreThreadTime();

+        if ((psmIgnoreTime > ZOSS_PSM_IGNORE_THREAD_TOTAL_TIME_MIN) || (psmIdleTime < psmIgnoreTime) || (totaltime - psmIgnoreTime == 0))

+        {

+            tmpIIT = (psmIdleTime + psmIgnoreTime * g_zPsm_IgnoreThreadTimeRate);

+            tmpIIT = (tmpIIT * 100) / totaltime;

+        }

+        else

+        {

+            tmpIIT = (psmIdleTime - psmIgnoreTime);

+            tmpIIT = (tmpIIT * 100) / (totaltime - psmIgnoreTime);

+        }

+        *pIdleCpuLoad = tmpIIT;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_ClearThreadCpu

+* ¹¦ÄÜÃèÊö£ºÇå³ýÏ̵߳ÄcpuµÄ¼ÆÊ±Ê±¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_ClearThreadCpu(VOID)

+{

+    UINT32                i             = 0;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    

+    pPsmThreadUa             = zOss_GetThreadUserArea(g_zPsm_PsmThreadId);

+    pPsmThreadUa->psmCpuTime = 0;

+    for (i= 0; i < g_zPsm_IgnoreThreadIndex; i++)

+    {

+        pPsmThreadUa = zOss_GetThreadUserArea(g_zPsm_IgnoreThreadId[i]);

+        if (pPsmThreadUa != NULL)

+        {

+            pPsmThreadUa->psmCpuTime = 0;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_ClearIITTime

+* ¹¦ÄÜÃèÊö£ºÇå³ýÏ̵߳ÄcpuµÄ¼ÆÊ±Ê±¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_ClearIIT(VOID)

+{

+    g_zPsm_DfmCnt   = 0;

+    g_zPsm_SumIIT   = 0;

+    g_zPsm_DfmFlag  = FALSE;

+    zOss_Memset(g_zPsm_IIT, 0, (sizeof(SINT32) * g_zPsmCfg->dfmCnt));

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetDesCpuFreq

+* ¹¦ÄÜÃèÊö£º

+* ²ÎÊý˵Ã÷£º(IN)

+*               pDesCpuFreqCfg: »ñÈ¡CPU ¶¯Ì¬µ÷ƵµÄÅäÖÃ

+*               cfgCnt:         »ñÈ¡CPU¶¯Ì¬µ÷ƵÅäÖõĸöÊý

+*               curCpuFreq:     µ±Ç°ÏµÍ³Ö÷Ƶ

+*               dfmFlag:        µ÷ƵµÈ¼¶

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»ØcpuÄ¿±êÖ÷Ƶ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 psm_GetDesCpuFreq(T_zPsm_CpuFm *pDesCpuFreqCfg, UINT32 cfgCnt, UINT32 curCpuFreq, UINT32 dfmFlag)

+{

+    UINT32 i = 0;

+    

+    for (i= 0; i < cfgCnt; i++)

+    {

+        if (pDesCpuFreqCfg[i].curCpuFreq == curCpuFreq)

+        {

+            switch (dfmFlag)

+            {

+            case PSM_UP_CPUFREQ:

+                {

+                    return pDesCpuFreqCfg[i].upCpuFreq;

+                }

+            case PSM_DOWN_CPUFREQ:

+                {

+                    return pDesCpuFreqCfg[i].downCpuFreq;

+                }

+            case PSM_PULL_CPUFREQ:

+                {

+                    return  pDesCpuFreqCfg[i].pullCpuFreq;

+                }

+            default:

+                break;

+            }

+            

+        }

+    }

+    return  curCpuFreq;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_FindDesCpuFreq

+* ¹¦ÄÜÃèÊö£º»ñȡĿ±êµÄCPUÖ÷Ƶ£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               cpuload:    cpuʹÓÃÂÊ

+*               curCpuFreq: µ±Ç°Ö÷Ƶ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»Øcpu¶¯Ì¬µ÷ÕûµÄÖ÷Ƶ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_FindDesCpuFreq(UINT32 cpuload, UINT32 curCpuFreq)

+{

+    UINT32       desCpuFreq      = 0;

+    UINT32       cfgCnt          = 0;

+    T_zPsm_CpuFm *pDesCpuFreqCfg = NULL;

+    BOOL         usbStatus       = zDrvPow_PsmGetUsbStatus();     

+

+    pDesCpuFreqCfg = usbStatus ? g_zPsmCfg->usbDesClk : g_zPsmCfg->desClk;

+    cfgCnt         = usbStatus ? g_zPsmCfg->usbDesClkNum : g_zPsmCfg->desClkNum;

+    

+    if ((cpuload >= g_zPsmCfg->scaleCpuPcnt.downCpuPercent) && (cpuload < g_zPsmCfg->scaleCpuPcnt.upCpuPercent))

+    {

+        desCpuFreq = curCpuFreq;

+    }

+    else if (cpuload >= g_zPsmCfg->scaleCpuPcnt.pullCpuPercent)

+    {

+        desCpuFreq = psm_GetDesCpuFreq(pDesCpuFreqCfg, cfgCnt, curCpuFreq, PSM_PULL_CPUFREQ);

+    }

+    else if (cpuload >= g_zPsmCfg->scaleCpuPcnt.upCpuPercent)

+    {

+        desCpuFreq = psm_GetDesCpuFreq(pDesCpuFreqCfg, cfgCnt, curCpuFreq, PSM_UP_CPUFREQ);

+    }

+    else

+    {

+        desCpuFreq = psm_GetDesCpuFreq(pDesCpuFreqCfg, cfgCnt, curCpuFreq, PSM_DOWN_CPUFREQ);

+    }

+    

+    return desCpuFreq;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPSM_FindMinCpuClk

+* ¹¦ÄÜÃèÊö£ºÅжÏCPUµ÷ÕûµÄÖ÷ƵÊÇ·ñÂú×ãÁ¢¼´µ÷Ƶ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»ØÐèÒªµÄÁ¢¼´Ö÷Ƶ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_FindMinCpuFreq(VOID)

+{

+    SINT32 i = 0;

+    

+    if (zDrvPow_PsmGetUsbStatus())

+    {

+        for (i = 0; i < g_zPsmCfg->usbSysClkNum; i++)

+        {

+            if (g_zPsm_MinCpuFreq > g_zPsmCfg->usbSysClk[i])

+            {

+                continue;

+            }

+            return g_zPsmCfg->usbSysClk[i];

+        }

+        return g_zPsmCfg->usbSysClk[g_zPsmCfg->usbSysClkNum - 1];

+    }

+    else

+    {

+        for (i = 0; i < g_zPsmCfg->sysClkNum; i++)

+        {

+            if (g_zPsm_MinCpuFreq > g_zPsmCfg->sysClk[i])

+            {

+                continue;

+            }

+            return g_zPsmCfg->sysClk[i];

+        }

+        return g_zPsmCfg->sysClk[g_zPsmCfg->sysClkNum - 1];

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetCpuFreq

+* ¹¦ÄÜÃèÊö£º»ñȡϵͳÖ÷Ƶ

+* ²ÎÊý˵Ã÷£º(IN)  

+*               ait: ƽ¾ù¿ÕÏÐÂÊ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º ·µ»ØÏµÍ³Ö÷Ƶ£»

+* ÆäËü˵Ã÷£º ÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_GetCpuFreq(UINT32 ait)

+{

+    UINT32 desCpuFreq  = 0;

+    UINT32 minCpuFreq  = 0;

+    

+    if (g_zPsm_DfmFlag)

+    {

+        desCpuFreq = psm_FindDesCpuFreq((100 - ait), g_zPsm_CurCpuFreq);

+    }

+    else

+    {

+        desCpuFreq = g_zPsm_CurCpuFreq;

+    }

+    minCpuFreq = psm_FindMinCpuFreq();

+    return max(desCpuFreq,minCpuFreq);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetAIT

+* ¹¦ÄÜÃèÊö£º»ñÈ¡AIT(ƽ¾ù¿ÕÏÐÂÊ)

+* ²ÎÊý˵Ã÷£º(IN)

+*               idleThreadCpu: cpu¿ÕÏÐÂÊ£»

+*           (OUT)

+*               ÎÞ£»

+* ·µ »Ø Öµ£º·µ»ØAIT

+* ÆäËü˵Ã÷£ºÔÚµ¥Ò»Ïß³ÌÖУ¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_GetAIT(UINT32 idleThreadCpu)

+{

+    g_zPsm_SumIIT               += idleThreadCpu - g_zPsm_IIT[g_zPsm_IITCnt];

+    g_zPsm_IIT[g_zPsm_IITCnt++] = idleThreadCpu;

+

+    if(g_zPsm_IITCnt >= g_zPsmCfg->dfmCnt)

+    {

+        g_zPsm_IITCnt = 0;

+    }

+    

+    return g_zPsm_SumIIT/g_zPsm_DfmCnt;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_InterruptRoutine

+* ¹¦ÄÜÃèÊö£ºÖжϷþÎñ³ÌÐò

+* ²ÎÊý˵Ã÷£º(IN)

+*               args: Ïß³ÌÈë¿Úº¯ÊýµÄ²ÎÊý£»

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔڸú¯ÊýÖв»ÒªÊ¹ÓÃ×èÈûÐÔº¯Êý£»

+**************************************************************************/

+static VOID psm_InterruptRoutine(SINT32 args)

+{

+    UINT32 idleCpuLoad  = 0;

+    UINT32 ait          = 0;

+    UINT32 cpuFreq      = 0;

+    

+    if (g_zPsm_DfmFinishFlag)

+    {

+        if ( g_zPsm_DfmCnt >= g_zPsmCfg->dfmCnt)

+        {

+            g_zPsm_DfmFlag = TRUE;          

+        }

+        else

+        {

+            g_zPsm_DfmCnt++;

+        }

+        psm_GetIdleCpuLoad(&idleCpuLoad);

+        ait     = psm_GetAIT(idleCpuLoad);

+        cpuFreq = psm_GetCpuFreq(ait);

+        if (cpuFreq != g_zPsm_CurCpuFreq)

+        {

+            SINT32 retCode = zDrvPow_SetArmPsCoreFreq(cpuFreq);

+            zOss_AssertExN(retCode == DRV_SUCCESS);

+            psm_ClearIIT();

+            g_zPsm_CurCpuFreq = cpuFreq;

+        }

+        psm_ClearThreadCpu();  

+        g_zPsm_SumCpuTime   = 0;

+        g_zPsm_SwapLastTime = Osa_HwTimeRead();

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SetIgnoreThread

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_SetIgnoreThread(VOID)

+{

+    UINT32  i  = 0;

+    

+    g_zPsm_IgnoreThreadIndex = 0;    

+    for (i = 0; i < g_zPsmCfg->ignoreThreadCnt; i++)

+    {

+        zOss_SetIgnoreThread(zOss_GetThreadIDByName(g_zPsmCfg->pIgnoreThreadNameArry[i]));

+    }

+}

+

+#endif //_USE_CPU_DFM

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmInit

+* ¹¦ÄÜÃèÊö£ºÊ¡µç¹ÜÀí³õʼ»¯

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_PsmInit(VOID)

+{

+    g_zPsmCfg          = &(zOss_GetOssCfg()->PsmCfg);

+    g_zPsm_PsmThreadId = zOss_CreateThread("zOss_ThreadPsm", psm_IdleThreadEntry, 0, 1024, 31, 1, 1);

+    zOss_AssertEx(g_zPsm_PsmThreadId != NULL, ZOSS_ERROR);

+    

+#ifdef _OS_TOS

+    zOss_SuspendThread((ZOSS_THREAD_ID)cyg_thread_idle_thread());

+#endif

+

+    Psm_CompensateInit();

+

+#ifdef _USE_CPU_DFM  

+    Psm_DfmInit();

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetBootStage

+* ¹¦ÄÜÃèÊö£ºÉèÖÃϵͳ³õʼ»¯Íê³É±ê־λ

+* ²ÎÊý˵Ã÷£º(IN)

+*               stage:Íê³É±êÖ¾£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_SetBootStage(T_zPsm_BootStage stage)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_BootStateFlag = stage;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetBootStage

+* ¹¦ÄÜÃèÊö£º»ñȡϵͳ³õʼ»¯Íê³É±ê־λ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÏµÍ³³õʼ»¯Íê³É±ê־λ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+T_zPsm_BootStage zOss_GetBootStage(void)

+{

+    ZOSS_INTR old_intr;

+    T_zPsm_BootStage stage;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    stage = g_zPsm_BootStateFlag;

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return stage;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetPSMAppIdle

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Ë¯ÃßÁ÷³ÌÓ¦ÓÃΪ¿ÕÏÐ״̬£¬×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦Óã»

+* ²ÎÊý˵Ã÷£º(IN)

+*               appId:Ó¦ÓÃÉèÖÃÔÊÐí¿ÕÏеÄÓ¦ÓÃid

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetPSMAppIdle(UINT32 appId)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_AppIdleFlag = g_zPsm_AppIdleFlag & (~ (1 << appId));

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetPSMAppActive

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Ë¯ÃßÁ÷³ÌÓ¦ÓÃΪ·±Ã¦×´Ì¬£¬×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦ÓÃ

+* ²ÎÊý˵Ã÷£º(IN)

+*               appId:Ó¦ÓÃÉèÖÃÔÊÐí·±Ã¦µÄÓ¦ÓÃid

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetPSMAppActive(UINT32 appId)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_AppIdleFlag = g_zPsm_AppIdleFlag | (1 << appId);

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetSleepFuncOpt 

+* ¹¦ÄÜÃèÊö£ºË¯Ãß¹³×Óº¯Êý£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               beforeHook: ˯Ãßǰ¹³×Óº¯Êý£»

+*               afterHook:  ˯Ãߺó¹³×Óº¯Êý£»

+*           (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÃ»ÓÐʹÓõĹ³×Óº¯Êý×¢²áΪNULL¡£ 

+**************************************************************************/

+VOID zOss_SetSleepHookOpt(psm_SleepInitHook  initHook, psm_SleepFinishHook  finishHook, psm_SleepBeforeHook  beforeHook, psm_SleepAfterHook afterHook)

+{

+    if (initHook != NULL)

+        g_zPsm_SleepInitHook    = initHook;

+

+    if (finishHook != NULL)

+        g_zPsm_SleepFinishHook  = finishHook;   

+    

+    if (beforeHook != NULL)

+        g_zPsm_SleepBeforeHook  = beforeHook;

+

+    if (afterHook != NULL)

+        g_zPsm_SleepAfterHook   = afterHook;    

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RegSleepCompensateFunc 

+* ¹¦ÄÜÃèÊö£ºË¯Ãßʱ¼ä²¹³¥×¢²áº¯Êý£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               funcOpt: ×¢²á²¹³¥º¯Êý£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»ØÊ¡µç²¹³¥ID;

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+ZOSS_COMPENSATE_ID zOss_RegSleepCompensateFunc(psm_CompensateHook funcOpt)

+{

+    ZOSS_INTR old_intr;

+    T_zPsm_CompensateNode *pCmpnstNode = (T_zPsm_CompensateNode *)zOss_Malloc(sizeof(T_zPsm_CompensateNode));

+

+    zOss_AssertEx(pCmpnstNode != NULL, NULL);

+    zOss_Memset(pCmpnstNode, 0, sizeof(T_zPsm_CompensateNode));

+    ZOSS_SAVE_IRQ(old_intr);  

+    pCmpnstNode->psm_CompensateHook = funcOpt;

+    zOss_ListAdd(&g_zPsm_CmpnstFuncList, &(pCmpnstNode->node));

+    ZOSS_RESTORE_IRQ(old_intr); 

+

+    return (ZOSS_COMPENSATE_ID )pCmpnstNode;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_DeregSleepCompensateFunc 

+* ¹¦ÄÜÃèÊö£ºË¯Ãßʱ¼ä²¹³¥×¢Ïúº¯Êý£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               pPsmCmpnstID: Ê¡µç²¹³¥ID;

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_DeregSleepCompensateFunc(ZOSS_COMPENSATE_ID psmCmpnstId)

+{

+    ZOSS_INTR old_intr;

+    T_zPsm_CompensateNode *pCmpnstNode = (T_zPsm_CompensateNode *)psmCmpnstId;

+

+    ZOSS_SAVE_IRQ(old_intr); 

+    zOss_ListDelete(&g_zPsm_CmpnstFuncList, &(pCmpnstNode->node));

+    ZOSS_RESTORE_IRQ(old_intr); 

+    zOss_Free(psmCmpnstId);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_CompensateTicks

+* ¹¦ÄÜÃèÊö£º²¹³¥²Ù×÷ϵͳticksÖµ£»µ¥Î»:tick£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»Ø²¹³¥µÄticksÖµ£»

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_CompensateTicks(VOID)

+{

+    ZOSS_INTR old_intr;

+    UINT32 ticks = 0;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    ticks = g_zPsm_SleepTicksTime/ZOSS_MS_PER_TICK;

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ticks;     

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ClearSleepTime

+* ¹¦ÄÜÃèÊö£ºÇå³ý˯Ãßʱ¼ä£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_ClearSleepTime(VOID)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_SleepTime = 0;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmAdjustFreq312M

+* ¹¦ÄÜÃèÊö£º½â¾öϵͳÔÚ¶¯Ì¬´´½¨Ï̲߳¢Í˳öÏß³Ìʱ£¬ARMÖ÷ƵΪ78MÇé¿öÏ£¬·¢ÉúµÄose_heapdÏß³Ì

+*           ËøÖжϴóÓÚ400usµ¼ÖµÄGP0¶ÏÑÔÎÊÌ⣬ÔÚ·¢ÉúÕâÖÖÇé¿öµÄʱºò£¬°ÑÖ÷Ƶµ÷Õûµ½312M,

+*           È»ºóÓɶ¯Ì¬µ÷Ƶģ¿é¸ºÔð°ÑÖ÷Ƶµ÷Õû»ØÈ¥¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º ZOSS_SUCCESS

+* ÆäËü˵Ã÷£º ¸Ãº¯Êý½ö½öÔÚzOss_ExitThreadº¯ÊýÖÐʹÓÃ

+************************************************************************/

+#ifdef _OS_OSE

+UINT32 zOss_PsmAdjustFreq312M(VOID)

+{

+    if (zDrvPow_GetPsCoreFreq() < CLK312M)

+    {

+        zDrvPow_SetArmPsCoreFreq(CLK312M);

+        

+#ifdef _USE_CPU_DFM

+        psm_DfmWakeUpReset();

+#endif

+        g_zPsm_CurCpuFreq = CLK312M;

+    }

+

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef _USE_CPU_DFM

+

+/******************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ApplyCpuFreq

+* ¹¦ÄÜÃèÊö£ºÁ¢¼´µ÷Ƶº¯Êý

+* ²ÎÊý˵Ã÷£º(IN)         

+*               appid:Á¢¼´µ÷ƵID;

+*               isUsed:TRUEʱ½øÐÐÉýƵ£¬FALSEʱ½øÐнµÆµ²Ù×÷;

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£¬Ê§°Ü·µ»ØZOSS_ERROR£»

+* ÆäËü˵Ã÷£ºÔÚÏß³ÌÉÏÏÂÎÄÖÐʹÓã»

+**************************************************************************/

+UINT32 zOss_ApplyCpuFreq(UINT32 appId, BOOL isUsed)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    if (isUsed)

+    {

+        if (!g_zPsmCfg->minClk[appId].isUsed)

+        {

+            g_zPsm_MinCpuFreq += g_zPsmCfg->minClk[appId].cpuClk;

+        }

+    }

+    else

+    {

+        if (g_zPsmCfg->minClk[appId].isUsed)

+        {

+            g_zPsm_MinCpuFreq -= g_zPsmCfg->minClk[appId].cpuClk;

+        }

+    }

+    

+    g_zPsmCfg->minClk[appId].isUsed = isUsed;

+    if (g_zPsm_MinCpuFreq > g_zPsm_CurCpuFreq)

+    {

+        SINT32 retCode    = DRV_SUCCESS; 

+

+        g_zPsm_CurCpuFreq = psm_FindMinCpuFreq();

+        retCode           = zDrvPow_SetArmPsCoreFreq(g_zPsm_CurCpuFreq);

+        zOss_AssertEx(retCode == DRV_SUCCESS, ZOSS_ERROR);

+        psm_ClearIIT();

+    } 

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetIgnoreThreadTimeRate 

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ìʱ¼ä±ÈÀý(ºöÂÔÏ̵߳ÄÖ´ÐÐʱ¼ä¶à´ó±ÈÀý×÷ΪidleÏ̵߳Äʱ¼ä)

+* ²ÎÊý˵Ã÷£º(IN)

+*               timeRate: ʱ¼ä±ÈÀý

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_SetIgnoreThreadTimeRate(FLOAT timeRate)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_IgnoreThreadTimeRate = timeRate;

+    ZOSS_RESTORE_IRQ(old_intr); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ThreadSwapInPsmHook 

+* ¹¦ÄÜÃèÊö: Ïß³ÌÇÐÈëʱµÄÊ¡µç¹³×Ó 

+* ²ÎÊý˵Ã÷: (IN)  

+*               user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_ThreadSwapInPsmHook(T_ZOsa_ThreadUserArea *user_area)

+{

+    ZOSS_INTR   old_intr;

+    UINT32      past_time       = 0;

+    UINT32      current_time    = 0;

+    

+    zOss_AssertExN(user_area != NULL);

+    ZOSS_SAVE_IRQ(old_intr);

+    current_time          = Osa_HwTimeRead();

+    past_time             = current_time - g_zPsm_SwapLastTime;

+    g_zPsm_SumCpuTime     += past_time;

+    user_area->psmCpuTime += past_time;

+    g_zPsm_CurThread      = user_area->threadid;

+    g_zPsm_SwapLastTime   = current_time;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_THreadSwapOutPsmHook 

+* ¹¦ÄÜÃèÊö: Ïß³ÌÇгöʱµÄÊ¡µç¹³×Ó

+* ²ÎÊý˵Ã÷: (IN)  

+*               user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*           (OUT)  

+*               ÎÞ

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_ThreadSwapOutPsmHook(T_ZOsa_ThreadUserArea *user_area)

+{

+    ZOSS_INTR   old_intr;

+    UINT32      past_time       = 0;

+    UINT32      current_time    = 0;

+

+    zOss_AssertExN(user_area != NULL);

+    ZOSS_SAVE_IRQ(old_intr);

+    current_time          = Osa_HwTimeRead();

+    past_time             = current_time - g_zPsm_SwapLastTime;

+    g_zPsm_SumCpuTime     += past_time;

+    user_area->psmCpuTime += past_time;

+    g_zPsm_CurThread      = NULL;

+    g_zPsm_SwapLastTime   = current_time;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RecordPsmLastSwapTime 

+* ¹¦ÄÜÃèÊö: ¼Ç¼ʡµç×îºóÒ»´ÎÏß³ÌÇл»µÄʱ¼ä£»

+* ²ÎÊý˵Ã÷: (IN)  

+*               ÎÞ    

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_RecordPsmLastSwapTime(VOID)

+{

+    ZOSS_INTR old_intr  = 0;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_SwapLastTime = Osa_HwTimeRead();

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_DfmSettingInit

+* ¹¦ÄÜÃèÊö: ¶¯Ì¬µ÷Ƶ»·¾³³õʼ»¯£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ 

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: 

+**************************************************************************/

+VOID zOss_DfmSettingInit(VOID)

+{   

+    ZOSS_INTR old_intr;

+                    

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_DfmFinishFlag = FALSE; 

+    ZOSS_RESTORE_IRQ(old_intr); 

+    

+    psm_SetIgnoreThread();

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    psm_ClearThreadCpu();

+    g_zPsm_SumCpuTime    = 0;

+    g_zPsm_DfmFinishFlag = TRUE; 

+    g_zPsm_SwapLastTime  = Osa_HwTimeRead();

+    ZOSS_RESTORE_IRQ(old_intr); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetIgnoreThread

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£º(IN)

+                thread : Ïß³ÌID;

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_SetIgnoreThread(ZOSS_THREAD_ID threadId)

+{

+    ZOSS_INTR old_intr;  

+

+    if (threadId == NULL)

+        return;

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_IgnoreThreadId[g_zPsm_IgnoreThreadIndex++] = threadId;

+    ZOSS_RESTORE_IRQ(old_intr); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_CpuIntRoutine

+* ¹¦ÄÜÃèÊö£º ´¥·¢cpu¶¯Ì¬µ÷Ƶ²É¼¯º¯Êý

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _OS_TOS

+VOID zOss_DfmIntRoutine(VOID)

+{

+    static UINT32 psmCpuCount = 0;

+    

+    if(g_zPsm_DfmFinishFlag)

+    {

+        if(++psmCpuCount >= g_zPsmCfg->dfmPeriod)

+        {

+           psmCpuCount = 0;

+           psm_InterruptRoutine(1);

+        }

+    }

+}

+#endif

+

+#endif  // #ifdef _USE_CPU_DFM

+

+#endif  // #ifdef _USE_PSM

+

diff --git a/cp/ps/plat/src/oss/psm/src/psm_297520.c b/cp/ps/plat/src/oss/psm/src/psm_297520.c
new file mode 100644
index 0000000..77bca39
--- /dev/null
+++ b/cp/ps/plat/src/oss/psm/src/psm_297520.c
@@ -0,0 +1,1690 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2013 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : psm_297510.c

+* ÎÄ ¼þ Ãû : psm_297510.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Ê¡µç¹ÜÀí(power save manager)

+* ×÷    Õß : ¸ß»ª·å

+* °æ    ±¾ : V0.1

+* Íê³ÉÈÕÆÚ : 2013.11.15

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+#ifdef _USE_PSM

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "drvs_pow.h"

+#include "drvs_pwr.h"

+#include "drvs_ret.h"

+#include "sup.h"

+#include "osa.h"

+#ifdef _USE_PSM_TEST

+#include "sys_func_atcfg.h"

+#endif

+#ifdef _OS_LINUX

+#include <linux/time.h>

+#include <linux/sched.h>

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_PSM_THREAD_TOTAL_TIME_MIN          3000

+#define ZOSS_PSM_IGNORE_THREAD_TOTAL_TIME_MIN   1000

+#define ZOSS_PSM_IDLE_CPU_LOAD                  70

+

+/**************************************************************************

+* Íⲿº¯ÊýºÍ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+//gsml1 ÌṩµÄº¯Êý£»

+extern BOOL   zGsml1_AttemptSleep(UINT32 mode);

+extern UINT32 zGsml1_PsmGetSleepTime(VOID);

+extern BOOL   zGsml1_PsmIdleFlag(VOID);

+extern BOOL   zGsml1_PsmGetCampon(VOID);

+

+//ЭÒéÕ»ÌṩµÄº¯Êý£»

+extern BYTE   zPs_IsGsmMasterMode(VOID);

+extern BOOL   zPs_PsmIdleFlag(VOID);

+extern BOOL   zAti2_PsIsInFlyMode(VOID);

+extern BYTE   zPS_umm_IsLossOfCoverage(VOID);

+

+//Çý¶¯ÌṩµÄº¯Êý£»

+extern BOOL   zDrvPow_PsmGetCampon(VOID);

+extern BOOL   zDrvPow_PsmIdleFlag(VOID);

+

+extern UINT64 gTimer_CurTime;

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/*ʱ¼ä²¹³¥½á¹¹Ìå*/

+typedef struct

+{

+    T_ZOss_Node         node;

+    psm_CompensateHook  psm_CompensateHook;

+} T_zPsm_CompensateNode;

+

+#ifdef _USE_CPU_DFM

+typedef enum

+{

+    PSM_PULL_CPUFREQ,   /* ÉýƵÁ½¼¶ */

+    PSM_UP_CPUFREQ,     /* ÉýƵһ¼¶ */

+    PSM_DOWN_CPUFREQ    /* ½µÆµ     */

+} T_zPsm_FmScope;

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID   psm_IdleThreadEntry(SINT32 ignore);

+static BOOL   psm_CampOnSleepCheck(VOID);

+static VOID   psm_CampOnSleep(VOID);

+static VOID   psm_LossCoverageSleep(VOID);

+static VOID   psm_AirplaneSleep(VOID);

+static BOOL   psm_CampOnCheck(VOID);

+static VOID   psm_SleepTimeCompensate(UINT32 sleepTime);

+static VOID   psm_PowerOnSleep(VOID);

+static VOID   psm_BootSleep(VOID);

+static BOOL   psm_CheckSleepTime(BOOL modeHaveGsm);

+static BOOL   psm_CheckSleepFlag(VOID);              

+static BOOL   psm_SleepCheck(VOID);

+static VOID   psm_CompensateTicks(UINT32 sleepTime);

+static VOID   psm_CompensateTimer(UINT32 sleepTime);

+#ifdef _OS_LINUX

+static VOID   psm_CompensateTimeKeeper(UINT32 sleepTime);

+#endif

+static BOOL   psm_AppIdleFlag(VOID);

+static UINT32 psm_GetPreSleepTime(VOID);

+static BOOL   Psm_PlatIdleFlag(VOID);

+

+#ifdef _USE_CPU_DFM

+static UINT32 psm_GetIgnoreThreadTime(VOID);

+static VOID   psm_GetIdleCpuLoad(UINT32 *pIdleCpuLoad);

+static VOID   psm_ClearIIT(VOID);

+static UINT32 psm_GetDesCpuFreq(T_zPsm_CpuFm *pDesCpuFreqCfg, UINT32 cfgCnt, UINT32 curCpuFreq, UINT32 dfmFlag);

+static UINT32 psm_FindDesCpuFreq(UINT32 cpuload, UINT32 curCpuFreq);

+static UINT32 psm_FindMinCpuFreq(VOID);

+static VOID   psm_InterruptRoutine(SINT32 args);

+static VOID   psm_SetIgnoreThread(VOID);

+static UINT32 psm_GetCpuFreq(UINT32 ait);

+static UINT32 psm_GetAIT(UINT32 idleThreadCpu);

+static VOID   psm_ClearThreadCpu(VOID);

+static VOID   psm_DfmWakeUpReset(VOID);

+#endif

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+T_zPsm_Param    *g_zPsmCfg               = NULL;

+UINT32          g_zPsm_SleepTime         = 0;   /* ϵͳÐÝÃßʱ¼ä                 */

+UINT32          g_zPsm_CurCpuFreq        = 0;   /* µ±Ç°Ö÷Ƶ                     */

+

+#ifdef _USE_CPU_DFM

+static  UINT32  g_zPsm_SwapLastTime      = 0;

+UINT32          g_zPsm_SumCpuTime        = 0;        

+ZOSS_THREAD_ID  g_zPsm_CurThread         = NULL;

+ZOSS_THREAD_ID  *g_zPsm_IgnoreThreadId   = NULL;

+#endif

+

+static UINT32   g_zPsm_AppIdleFlag       = 0;   /* Ó¦ÓÿÕÏбêÖ¾·û£¬¿ØÖÆË¯ÃßÁ÷³Ì */

+static UINT32   g_zPsm_PreSleeptime      = 0;   /* ¼ÆËãÔ¤ÆÚµÄ˯Ãßʱ¼ä           */

+static ZOSS_THREAD_ID g_zPsm_PsmThreadId = NULL;

+static UINT32   g_zPsm_SleepTicksTime    = 0;   /* ÓÃÓÚ²¹³¥ticksÖµµÄ˯Ãßʱ¼ä    */

+static T_ZOss_List g_zPsm_CmpnstFuncList = {0}; /* ¸÷Ä£¿é²¹³¥º¯ÊýµÄÁ´±í         */

+static psm_SleepInitHook   g_zPsm_SleepInitHook         = NULL;

+static psm_SleepFinishHook g_zPsm_SleepFinishHook       = NULL;

+static psm_SleepBeforeHook g_zPsm_SleepBeforeHook       = NULL;

+static psm_SleepAfterHook  g_zPsm_SleepAfterHook        = NULL;

+static volatile T_zPsm_BootStage g_zPsm_BootStateFlag   = PSM_BOOT_DEFAULT; /* ϵͳÆô¶¯½×¶Î±ê־λ */

+

+#ifdef _USE_CPU_DFM

+static BOOL     g_zPsm_DfmFlag              = FALSE;

+static UINT32   g_zPsm_IITCnt               = 0;

+static UINT32   g_zPsm_DfmCnt               = 0;

+static UINT32   g_zPsm_SumIIT               = 0;

+static UINT32   g_zPsm_MinCpuFreq           = 0;

+static BOOL     g_zPsm_DfmFinishFlag        = FALSE;

+static SINT32   *g_zPsm_IIT                 = NULL;

+static FLOAT    g_zPsm_IgnoreThreadTimeRate = 0.6;

+static UINT32   g_zPsm_IgnoreThreadIndex    = 0;

+#endif

+

+#ifdef _OS_LINUX

+static BOOL     g_zPsm_BooTSleepFlag = FALSE;

+#endif

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_IdleThreadEntry

+* ¹¦ÄÜÃèÊö£ºÊ¡µçÏß³ÌÈë¿Ú

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_IdleThreadEntry(SINT32 ignore)

+{

+    if (g_zPsm_SleepInitHook != NULL)

+        g_zPsm_SleepInitHook();

+    

+    psm_BootSleep();   

+    

+    for( ; ; )

+    {

+#ifdef _USE_PSM_TEST

+        if(!zSys_SetR7SleepType(R7_PLAT_NO_SLEEP))

+#endif

+        {

+            if (psm_CampOnSleepCheck())               // ÓÐÍøË¯ÃßÁ÷³Ì£»

+            {

+                psm_CampOnSleep();

+            }

+            else if(zPS_umm_IsLossOfCoverage())       // ¶ªÊ§¸²¸Ç˯ÃßÁ÷³Ì£»

+            {

+                psm_LossCoverageSleep();

+            }

+            else                                      // ·ÉÐÐģʽ˯ÃßÁ÷³Ì£»                

+            {

+                if(zAti2_PsIsInFlyMode()) 

+                    psm_AirplaneSleep();

+            }

+        }

+        zDrvPow_Sleep_Func(KERNEL_SLEEP_MODE, 0); //ÆäËüģʽ¶¼²»Âú×ã½øÈëµ½ÄÚºËÊ¡µç£»

+        

+        if (g_zPsm_SleepFinishHook != NULL)

+            g_zPsm_SleepFinishHook();

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetPreSleepTime

+* ¹¦ÄÜÃèÊö£º¼ÆËãÔ¤ÆÚµÄ˯Ãßʱ¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£ºÔÚËø¶ÏÉÏÏÂÎÄʹÓÃÎÞÐèËøÖжϣ»

+************************************************************************/

+static UINT32 psm_GetPreSleepTime(VOID)   

+{

+    return g_zPsm_PreSleeptime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_BootSleep

+* ¹¦ÄÜÃèÊö£º¿ª»úÍê³Éǰʡµç´¦Àí

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚidleÏ̵߳÷Óã¬g_zPsmBootStateFlagʹÓó¡¾°¼òµ¥ÎÞÐè±£»¤£»

+**************************************************************************/

+static VOID psm_BootSleep(VOID) 

+{   

+    while (g_zPsm_BootStateFlag == PSM_BOOT_DEFAULT)

+        ;

+

+    while (!psm_CampOnCheck() && g_zPsm_BootStateFlag != PSM_BOOT_FINISH)

+    {

+        psm_PowerOnSleep();

+    }

+

+    g_zPsm_BootStateFlag = PSM_BOOT_FINISH;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CampOnSleepCheck

+* ¹¦ÄÜÃèÊö£ºÐ¡Çø×¤ÁôºóÕý³£Ë¯ÃßÁ÷³ÌÅжϺ¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ         

+* ·µ »Ø Öµ£º·µ»ØTRUE±íʾ¿ÉÒÔ½øÈë¸Ã˯Ãß,·µ»ØFALSE±íʾ²»ÄܽøÈë¸Ã˯ÃßÁ÷³Ì;

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_CampOnSleepCheck(VOID)

+{   

+    if (psm_CampOnCheck())

+    {

+        return psm_SleepCheck();

+    }

+

+    return FALSE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CampOnCheck

+* ¹¦ÄÜÃèÊö£ºÅжÏÊÇ·ñפÁôÍøÂç³É¹¦

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static BOOL psm_CampOnCheck(VOID)   

+{

+    return (zDrvPow_PsmGetCampon() || zGsml1_PsmGetCampon());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SleepCheck

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_SleepCheck(VOID)

+{

+    if (zGsml1_AttemptSleep(FALSE) && zPs_PsmIdleFlag() && Psm_PlatIdleFlag() && psm_AppIdleFlag() && zDrvPow_PsmIdleFlag())

+    {

+        return TRUE;

+    }

+    return FALSE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CheckSleepTime

+* ¹¦ÄÜÃèÊö£ºÅжÏ˯Ãßʱ¼äÊÇ·ñÔÊÐíÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               modeHaveGsm : µ±Ç°ÏµÍ³Ä£Ê½ÊÇ·ñº¬ÓÐGSM,TRUE±íʾº¬ÓУ¬FALSE

+*                             ±íʾûÓУ»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º TRUE:Éî˯Ãߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º ÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static BOOL psm_CheckSleepTime(BOOL modeHaveGsm)

+{

+    g_zPsm_PreSleeptime = min(zGsml1_PsmGetSleepTime(), zOss_GetPs_SleepTimer());

+    return (g_zPsm_PreSleeptime > g_zPsmCfg->deepSleepTimeThreshold);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SleepMode

+* ¹¦ÄÜÃèÊö£º»ñȡʡµç˯Ãßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ         

+* ·µ »Ø Öµ£ºTURE:¿ÉÒÔ˯ÃßÁË£¬FALSE:²»ÄÜ˯Ãߣ»

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static BOOL psm_SleepMode(VOID)

+{

+    return (psm_CheckSleepTime(FALSE) && psm_CheckSleepFlag());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CheckSleepFlag

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃߵȴý

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߵȴý£»FALSE:²»ÄܽøÈëÐÝÃߵȴý

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_CheckSleepFlag(VOID)

+{

+    return (!zGsml1_PsmIdleFlag() && zDrvPow_PsmIdleFlag() && Psm_PlatIdleFlag() && psm_AppIdleFlag() && zPs_PsmIdleFlag());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_BootCheckSleepFlag

+* ¹¦ÄÜÃèÊö£ºÔÚBOOT sleep˯Ãß·½Ê½ÖÐÅжÏÄÜ·ñ½øÈëÐÝÃߵȴý

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߵȴý£»FALSE:²»ÄܽøÈëÐÝÃߵȴý

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_BootCheckSleepFlag(VOID)

+{

+    return (!zGsml1_PsmIdleFlag() && zDrvPow_PsmIdleFlag() && Psm_PlatIdleFlag() && psm_AppIdleFlag());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SleepTimeCompensate

+* ¹¦ÄÜÃèÊö£ºË¯Ãßʱ¼ä²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime : ²¹³¥Ê±¼ä

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºº¯ÊýÔËÐÐÔÚËøÖжÏËùÖжÏÉÏÏÂÎÄÖУ¬¹Ê²»½øÐÐËøÖжϱ£»¤£»

+**************************************************************************/

+static VOID psm_SleepTimeCompensate(UINT32 sleepTime)

+{

+    T_zPsm_CompensateNode *pCmpnstNode = (T_zPsm_CompensateNode *)zOss_ListFirst(&g_zPsm_CmpnstFuncList);

+

+    while(pCmpnstNode != NULL)

+    {

+        pCmpnstNode->psm_CompensateHook(sleepTime);

+        pCmpnstNode = (T_zPsm_CompensateNode *)zOss_ListNext(&(pCmpnstNode->node));

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_PowerOnSleep

+* ¹¦ÄÜÃèÊö£º¿ª»úÍê³ÉǰµÄÊ¡µç´¦Àí

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_PowerOnSleep(VOID)

+{ 

+    ZOSS_INTR old_intr;

+  

+    if (!psm_SleepCheck())

+        return;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+        

+#ifdef _OS_LINUX

+    if (need_resched())

+    {

+        ZOSS_RESTORE_IRQ(old_intr);  

+        return;

+    }        

+#endif

+

+

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if ((g_zPsm_BootStateFlag == PSM_SYSINIT_FINISH) && psm_BootCheckSleepFlag())

+    {

+        UINT32 sleepTime   = zOss_GetPs_SleepTimer();  

+        if(sleepTime > g_zPsmCfg->deepSleepTimeThreshold)

+        {

+            g_zPsm_SleepTime = zDrvPow_Sleep_Func(BOOT_SLEEP_MODE, sleepTime);

+            psm_SleepTimeCompensate(g_zPsm_SleepTime);

+#ifdef _USE_CPU_DFM

+            psm_DfmWakeUpReset();

+#endif            

+        }

+    }

+

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);  

+    

+    if ((g_zPsmCfg->bootOverClk!= 0) && (g_zPsmCfg->bootOverClk != g_zPsm_CurCpuFreq))

+    {

+        zDrvPow_SetArmPsCoreFreq(g_zPsmCfg->bootOverClk);

+    }

+

+    zDrvPow_Sleep_Func(KERNEL_SLEEP_MODE, 0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_AirplaneSleep 

+* ¹¦ÄÜÃèÊö£º·ÉÐÐģʽ˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ                      

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_AirplaneSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+

+    if(!psm_SleepCheck())

+        return;

+       

+    ZOSS_SAVE_IRQ(old_intr); 

+        

+#ifdef _OS_LINUX

+    if (need_resched())

+    {

+        ZOSS_RESTORE_IRQ(old_intr);  

+        return;

+    }        

+#endif

+

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if(psm_CheckSleepFlag() && zAti2_PsIsInFlyMode())

+    {

+        UINT32 timeLen   = min(g_zPsmCfg->airPlaneSleepTime, zOss_GetPs_SleepTimer());

+        g_zPsm_SleepTime = zDrvPow_Sleep_Func(AIRPLANE_SLEEP_MODE, timeLen);

+        psm_SleepTimeCompensate(g_zPsm_SleepTime);

+#ifdef _USE_CPU_DFM                    

+        psm_DfmWakeUpReset();

+#endif

+    }

+    

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CampOnSleep

+* ¹¦ÄÜÃèÊö£º×¤ÁôºóµÄÕý³£Ë¯ÃßÁ÷³Ì

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_CampOnSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    

+#ifdef _OS_LINUX

+    if (need_resched())

+    {

+        ZOSS_RESTORE_IRQ(old_intr);  

+        return;

+    }        

+#endif

+

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if (psm_SleepMode())  

+    {

+        g_zPsm_SleepTime = zDrvPow_Sleep_Func(DEEP_SLEEP_MODE, psm_GetPreSleepTime());

+        psm_SleepTimeCompensate(g_zPsm_SleepTime);                  

+#ifdef _USE_CPU_DFM

+        psm_DfmWakeUpReset();

+#endif

+    }

+    

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);      

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_LossCoverageSleep

+* ¹¦ÄÜÃèÊö£º¶ªÊ§¸²¸Ç˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_LossCoverageSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+

+    if(!psm_SleepCheck())

+        return;

+   

+    ZOSS_SAVE_IRQ(old_intr); 

+        

+#ifdef _OS_LINUX

+    if (need_resched())

+    {

+        ZOSS_RESTORE_IRQ(old_intr);  

+        return;

+    }        

+#endif

+

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if(psm_CheckSleepFlag())

+    {

+        UINT32 sleepTime   = zOss_GetPs_SleepTimer();    

+

+        if (zPS_umm_IsLossOfCoverage() && (sleepTime > g_zPsmCfg->deepSleepTimeThreshold))

+        {

+            g_zPsm_SleepTime = zDrvPow_Sleep_Func(LOSSCOVERAGE_SLEEP_MODE, sleepTime);

+            psm_SleepTimeCompensate(g_zPsm_SleepTime);

+#ifdef _USE_CPU_DFM                      

+            psm_DfmWakeUpReset();

+#endif

+        }

+    }

+    

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CompensateOssSleepTime 

+* ¹¦ÄÜÃèÊö£ºÆ½Ì¨Ö§³ÅticksÖµ²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime: ²¹³¥Ê±¼ä,µ¥Î»:ms£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_CompensateTicks(UINT32 sleepTime)

+{

+    #ifdef _OS_TOS

+    cyg_add_current_time(sleepTime/ZOSS_MS_PER_TICK);

+    #else

+    g_zPsm_SleepTicksTime += sleepTime;    

+    #endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CompensateOssSleepTime 

+* ¹¦ÄÜÃèÊö£ºÆ½Ì¨Ö§³Å¶¨Ê±Æ÷²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime: ²¹³¥Ê±¼ä,µ¥Î»:ms£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_CompensateTimer(UINT32 sleepTime)

+{

+    gTimer_CurTime += sleepTime;

+}

+

+#ifdef _OS_LINUX

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CompensateTimeKeeper 

+* ¹¦ÄÜÃèÊö£ºTimeKeeper²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime: ²¹³¥Ê±¼ä,µ¥Î»:ms£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+

+static VOID psm_CompensateTimeKeeper(UINT32 sleepTime)

+{

+    struct timespec timesleep = {0};

+

+    timesleep.tv_sec = sleepTime/1000;

+    timesleep.tv_nsec = 1000000 *(sleepTime%1000);

+    timekeeping_inject_sleeptime(&timesleep);  

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_AppIdleFlag 

+* ¹¦ÄÜÃèÊö£ºÅжÏÓ¦ÓÃÊÇ·ñ¿ÕÏУ»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÓ¦Óñê־λ£»

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static BOOL psm_AppIdleFlag(VOID)

+{

+    return (g_zPsm_AppIdleFlag == 0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPsm_PlatIdleFlag 

+* ¹¦ÄÜÃèÊö£ºÅÐ¶ÏÆ½Ì¨ÊÇ·ñÔÊÐí˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÓ¦Óñê־λ£»

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£» 

+**************************************************************************/

+static BOOL Psm_PlatIdleFlag(VOID)

+{

+    return (g_zPsm_SleepTime == 0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPsm_CompensateInit 

+* ¹¦ÄÜÃèÊö£ºÊ¡µç²¹³¥³õʼ»¯£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID Psm_CompensateInit(VOID)

+{

+    zOss_ListInit(&g_zPsm_CmpnstFuncList);

+    zOss_RegSleepCompensateFunc(psm_CompensateTicks);

+    zOss_RegSleepCompensateFunc(psm_CompensateTimer);

+#ifdef _OS_LINUX

+    zOss_RegSleepCompensateFunc(psm_CompensateTimeKeeper);

+#endif

+}

+

+#ifdef _USE_CPU_DFM

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPsm_DfmInit 

+* ¹¦ÄÜÃèÊö£º¶¯Ì¬µ÷Ƶ³õʼ»¯£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID Psm_DfmInit(VOID)

+{

+    g_zPsm_CurCpuFreq = zDrvPow_GetPsCoreFreq();

+    g_zPsm_IIT = (SINT32 *)zOss_Malloc(sizeof(SINT32) * g_zPsmCfg->dfmCnt);

+    zOss_AssertExN(g_zPsm_IIT != NULL);

+    zOss_Memset(g_zPsm_IIT, 0, (sizeof(SINT32) * g_zPsmCfg->dfmCnt));

+    g_zPsm_IgnoreThreadId = (ZOSS_THREAD_ID *)zOss_Malloc(g_zPsmCfg->ignoreThreadCnt * sizeof(ZOSS_THREAD_ID));

+    zOss_AssertExN(g_zPsm_IgnoreThreadId != NULL);

+    zOss_Memset(g_zPsm_IgnoreThreadId, 0, g_zPsmCfg->ignoreThreadCnt * sizeof(ZOSS_THREAD_ID));   

+#ifdef _OS_OSE

+    start(create_process(OS_TI_PROC, "PSM_TIMER_ISR", (OSENTRYPOINT *)psm_InterruptRoutine, (OSADDRESS)1024 * 20,

+          (OSPRIORITY)g_zPsmCfg->dfmThrdPri, (OSTIME)g_zPsmCfg->dfmPeriod, (PROCESS)0, (struct OS_redir_entry *)NULL, (OSVECTOR)0, (OSUSER)0));

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_DfmWakeUpReset

+* ¹¦ÄÜÃèÊö£ºË¯ÃßÐÑÀ´ºóÒªÐèÒªÖØÐ¼ÆËãgPsm_AITµÈ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_DfmWakeUpReset(VOID) 

+{

+    g_zPsm_CurCpuFreq = zDrvPow_GetPsCoreFreq();

+    psm_ClearThreadCpu();

+    psm_ClearIIT();

+    g_zPsm_SumCpuTime   = 0;

+    g_zPsm_DfmFlag      = FALSE;

+    g_zPsm_SwapLastTime = Osa_HwTimeRead();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetIgnoreThreadTime

+* ¹¦ÄÜÃèÊö£º»ñÈ¡ºöÂÔÏ̵߳Äʱ¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 psm_GetIgnoreThreadTime(VOID)

+{

+    UINT32 psmIgnoreTime                = 0;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    SINT32              i               = 0;

+    

+    for (i = 0; i < g_zPsm_IgnoreThreadIndex; i++)

+    {

+        pPsmThreadUa = zOss_GetThreadUserArea(g_zPsm_IgnoreThreadId[i]);

+        if (pPsmThreadUa != NULL)

+        {

+            psmIgnoreTime += pPsmThreadUa->psmCpuTime;

+        }

+    }

+    

+    return psmIgnoreTime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetIdleCpuLoad

+* ¹¦ÄÜÃèÊö£º»ñȡϵͳ¿ÕÏиºÔØ£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               idlecpuLoad: cpu¿ÕÏÐÂÊ£»

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_GetIdleCpuLoad(UINT32 *pIdleCpuLoad)

+{

+    SINT32 psmIgnoreTime                = 0; 

+    SINT32 totaltime                    = 0; 

+    SINT32 psmIdleTime                  = 0; 

+    SINT32 tmpIIT                       = 0; 

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    SINT32 tmpPsmTime                   = Osa_HwTimeRead() - g_zPsm_SwapLastTime;

+    

+    totaltime = g_zPsm_SumCpuTime + tmpPsmTime;

+    

+    if (totaltime < ZOSS_PSM_THREAD_TOTAL_TIME_MIN)

+    {

+        *pIdleCpuLoad = ZOSS_PSM_IDLE_CPU_LOAD;

+    }

+    else

+    {

+        if (g_zPsm_CurThread != NULL)

+        {

+            pPsmThreadUa =  zOss_GetThreadUserArea(g_zPsm_CurThread);

+            if (pPsmThreadUa != NULL)

+            {

+                pPsmThreadUa->psmCpuTime += tmpPsmTime ;

+            }

+        }

+        

+        pPsmThreadUa  = zOss_GetThreadUserArea(g_zPsm_PsmThreadId);

+        psmIdleTime   = pPsmThreadUa->psmCpuTime;

+        psmIgnoreTime = psm_GetIgnoreThreadTime();

+        if ((psmIgnoreTime > ZOSS_PSM_IGNORE_THREAD_TOTAL_TIME_MIN) || (psmIdleTime < psmIgnoreTime) || (totaltime - psmIgnoreTime == 0))

+        {

+            tmpIIT = (psmIdleTime + psmIgnoreTime * g_zPsm_IgnoreThreadTimeRate);

+            tmpIIT = (tmpIIT * 100) / totaltime;

+        }

+        else

+        {

+            tmpIIT = (psmIdleTime - psmIgnoreTime);

+            tmpIIT = (tmpIIT * 100) / (totaltime - psmIgnoreTime);

+        }

+        *pIdleCpuLoad = tmpIIT;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_ClearThreadCpu

+* ¹¦ÄÜÃèÊö£ºÇå³ýÏ̵߳ÄcpuµÄ¼ÆÊ±Ê±¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_ClearThreadCpu(VOID)

+{

+    UINT32                i             = 0;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    

+    pPsmThreadUa             = zOss_GetThreadUserArea(g_zPsm_PsmThreadId);

+    pPsmThreadUa->psmCpuTime = 0;

+    for (i= 0; i < g_zPsm_IgnoreThreadIndex; i++)

+    {

+        pPsmThreadUa = zOss_GetThreadUserArea(g_zPsm_IgnoreThreadId[i]);

+        if (pPsmThreadUa != NULL)

+        {

+            pPsmThreadUa->psmCpuTime = 0;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_ClearIITTime

+* ¹¦ÄÜÃèÊö£ºÇå³ýÏ̵߳ÄcpuµÄ¼ÆÊ±Ê±¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_ClearIIT(VOID)

+{

+    g_zPsm_DfmCnt   = 0;

+    g_zPsm_SumIIT   = 0;

+    g_zPsm_DfmFlag  = FALSE;

+    zOss_Memset(g_zPsm_IIT, 0, (sizeof(SINT32) * g_zPsmCfg->dfmCnt));

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetDesCpuFreq

+* ¹¦ÄÜÃèÊö£º

+* ²ÎÊý˵Ã÷£º(IN)

+*               pDesCpuFreqCfg: »ñÈ¡CPU ¶¯Ì¬µ÷ƵµÄÅäÖÃ

+*               cfgCnt:         »ñÈ¡CPU¶¯Ì¬µ÷ƵÅäÖõĸöÊý

+*               curCpuFreq:     µ±Ç°ÏµÍ³Ö÷Ƶ

+*               dfmFlag:        µ÷ƵµÈ¼¶

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»ØcpuÄ¿±êÖ÷Ƶ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 psm_GetDesCpuFreq(T_zPsm_CpuFm *pDesCpuFreqCfg, UINT32 cfgCnt, UINT32 curCpuFreq, UINT32 dfmFlag)

+{

+    UINT32 i = 0;

+    

+    for (i= 0; i < cfgCnt; i++)

+    {

+        if (pDesCpuFreqCfg[i].curCpuFreq == curCpuFreq)

+        {

+            switch (dfmFlag)

+            {

+            case PSM_UP_CPUFREQ:

+                {

+                    return pDesCpuFreqCfg[i].upCpuFreq;

+                }

+            case PSM_DOWN_CPUFREQ:

+                {

+                    return pDesCpuFreqCfg[i].downCpuFreq;

+                }

+            case PSM_PULL_CPUFREQ:

+                {

+                    return  pDesCpuFreqCfg[i].pullCpuFreq;

+                }

+            default:

+                break;

+            }

+            

+        }

+    }

+    return  curCpuFreq;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_FindDesCpuFreq

+* ¹¦ÄÜÃèÊö£º»ñȡĿ±êµÄCPUÖ÷Ƶ£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               cpuload:    cpuʹÓÃÂÊ

+*               curCpuFreq: µ±Ç°Ö÷Ƶ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»Øcpu¶¯Ì¬µ÷ÕûµÄÖ÷Ƶ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_FindDesCpuFreq(UINT32 cpuload, UINT32 curCpuFreq)

+{

+    UINT32       desCpuFreq      = 0;

+    UINT32       cfgCnt          = 0;

+    T_zPsm_CpuFm *pDesCpuFreqCfg = NULL;

+    BOOL         usbStatus       = zDrvPow_PsmGetUsbStatus();     

+

+    pDesCpuFreqCfg = usbStatus ? g_zPsmCfg->usbDesClk : g_zPsmCfg->desClk;

+    cfgCnt         = usbStatus ? g_zPsmCfg->usbDesClkNum : g_zPsmCfg->desClkNum;

+    

+    if ((cpuload >= g_zPsmCfg->scaleCpuPcnt.downCpuPercent) && (cpuload < g_zPsmCfg->scaleCpuPcnt.upCpuPercent))

+    {

+        desCpuFreq = curCpuFreq;

+    }

+    else if (cpuload >= g_zPsmCfg->scaleCpuPcnt.pullCpuPercent)

+    {

+        desCpuFreq = psm_GetDesCpuFreq(pDesCpuFreqCfg, cfgCnt, curCpuFreq, PSM_PULL_CPUFREQ);

+    }

+    else if (cpuload >= g_zPsmCfg->scaleCpuPcnt.upCpuPercent)

+    {

+        desCpuFreq = psm_GetDesCpuFreq(pDesCpuFreqCfg, cfgCnt, curCpuFreq, PSM_UP_CPUFREQ);

+    }

+    else

+    {

+        desCpuFreq = psm_GetDesCpuFreq(pDesCpuFreqCfg, cfgCnt, curCpuFreq, PSM_DOWN_CPUFREQ);

+    }

+    

+    return desCpuFreq;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPSM_FindMinCpuClk

+* ¹¦ÄÜÃèÊö£ºÅжÏCPUµ÷ÕûµÄÖ÷ƵÊÇ·ñÂú×ãÁ¢¼´µ÷Ƶ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»ØÐèÒªµÄÁ¢¼´Ö÷Ƶ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_FindMinCpuFreq(VOID)

+{

+    SINT32 i = 0;

+    

+    if (zDrvPow_PsmGetUsbStatus())

+    {

+        for (i = 0; i < g_zPsmCfg->usbSysClkNum; i++)

+        {

+            if (g_zPsm_MinCpuFreq > g_zPsmCfg->usbSysClk[i])

+            {

+                continue;

+            }

+            return g_zPsmCfg->usbSysClk[i];

+        }

+        return g_zPsmCfg->usbSysClk[g_zPsmCfg->usbSysClkNum - 1];

+    }

+    else

+    {

+        for (i = 0; i < g_zPsmCfg->sysClkNum; i++)

+        {

+            if (g_zPsm_MinCpuFreq > g_zPsmCfg->sysClk[i])

+            {

+                continue;

+            }

+            return g_zPsmCfg->sysClk[i];

+        }

+        return g_zPsmCfg->sysClk[g_zPsmCfg->sysClkNum - 1];

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetCpuFreq

+* ¹¦ÄÜÃèÊö£º»ñȡϵͳÖ÷Ƶ

+* ²ÎÊý˵Ã÷£º(IN)  

+*               ait: ƽ¾ù¿ÕÏÐÂÊ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º ·µ»ØÏµÍ³Ö÷Ƶ£»

+* ÆäËü˵Ã÷£º ÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_GetCpuFreq(UINT32 ait)

+{

+    UINT32 desCpuFreq  = 0;

+    UINT32 minCpuFreq  = 0;

+    

+    if (g_zPsm_DfmFlag)

+    {

+        desCpuFreq = psm_FindDesCpuFreq((100 - ait), g_zPsm_CurCpuFreq);

+    }

+    else

+    {

+        desCpuFreq = g_zPsm_CurCpuFreq;

+    }

+    minCpuFreq = psm_FindMinCpuFreq();

+    return max(desCpuFreq,minCpuFreq);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetAIT

+* ¹¦ÄÜÃèÊö£º»ñÈ¡AIT(ƽ¾ù¿ÕÏÐÂÊ)

+* ²ÎÊý˵Ã÷£º(IN)

+*               idleThreadCpu: cpu¿ÕÏÐÂÊ£»

+*           (OUT)

+*               ÎÞ£»

+* ·µ »Ø Öµ£º·µ»ØAIT

+* ÆäËü˵Ã÷£ºÔÚµ¥Ò»Ïß³ÌÖУ¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_GetAIT(UINT32 idleThreadCpu)

+{

+    g_zPsm_SumIIT               += idleThreadCpu - g_zPsm_IIT[g_zPsm_IITCnt];

+    g_zPsm_IIT[g_zPsm_IITCnt++] = idleThreadCpu;

+

+    if(g_zPsm_IITCnt >= g_zPsmCfg->dfmCnt)

+    {

+        g_zPsm_IITCnt = 0;

+    }

+    

+    return g_zPsm_SumIIT/g_zPsm_DfmCnt;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_InterruptRoutine

+* ¹¦ÄÜÃèÊö£ºÖжϷþÎñ³ÌÐò

+* ²ÎÊý˵Ã÷£º(IN)

+*               args: Ïß³ÌÈë¿Úº¯ÊýµÄ²ÎÊý£»

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔڸú¯ÊýÖв»ÒªÊ¹ÓÃ×èÈûÐÔº¯Êý£»

+**************************************************************************/

+static VOID psm_InterruptRoutine(SINT32 args)

+{

+    UINT32 idleCpuLoad  = 0;

+    UINT32 ait          = 0;

+    UINT32 cpuFreq      = 0;

+    

+    if (g_zPsm_DfmFinishFlag)

+    {

+        if ( g_zPsm_DfmCnt >= g_zPsmCfg->dfmCnt)

+        {

+            g_zPsm_DfmFlag = TRUE;          

+        }

+        else

+        {

+            g_zPsm_DfmCnt++;

+        }

+        psm_GetIdleCpuLoad(&idleCpuLoad);

+        ait     = psm_GetAIT(idleCpuLoad);

+        cpuFreq = psm_GetCpuFreq(ait);

+        if (cpuFreq != g_zPsm_CurCpuFreq)

+        {

+            SINT32 retCode = zDrvPow_SetArmPsCoreFreq(cpuFreq);

+            zOss_AssertExN(retCode == DRV_SUCCESS);

+            psm_ClearIIT();

+            g_zPsm_CurCpuFreq = cpuFreq;

+        }

+        psm_ClearThreadCpu();  

+        g_zPsm_SumCpuTime   = 0;

+        g_zPsm_SwapLastTime = Osa_HwTimeRead();

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SetIgnoreThread

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_SetIgnoreThread(VOID)

+{

+    UINT32  i  = 0;

+    

+    g_zPsm_IgnoreThreadIndex = 0;    

+    for (i = 0; i < g_zPsmCfg->ignoreThreadCnt; i++)

+    {

+        zOss_SetIgnoreThread(zOss_GetThreadIDByName(g_zPsmCfg->pIgnoreThreadNameArry[i]));

+    }

+}

+

+#endif //_USE_CPU_DFM

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmInit

+* ¹¦ÄÜÃèÊö£ºÊ¡µç¹ÜÀí³õʼ»¯

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_PsmInit(VOID)

+{

+    g_zPsmCfg          = &(zOss_GetOssCfg()->PsmCfg);

+

+#ifndef _OS_LINUX

+    g_zPsm_PsmThreadId = zOss_CreateThread("zOss_ThreadPsm", psm_IdleThreadEntry, 0, 1024, 31, 1, 1);

+    zOss_AssertEx(g_zPsm_PsmThreadId != NULL, ZOSS_ERROR);

+    

+#ifdef _OS_TOS

+    zOss_SuspendThread((ZOSS_THREAD_ID)cyg_thread_idle_thread());

+#endif

+

+#endif /* _OS_LINUX */

+

+    Psm_CompensateInit();

+

+#ifdef _USE_CPU_DFM  

+    Psm_DfmInit();

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetBootStage

+* ¹¦ÄÜÃèÊö£ºÉèÖÃϵͳ³õʼ»¯Íê³É±ê־λ

+* ²ÎÊý˵Ã÷£º(IN)

+*               stage:Íê³É±êÖ¾£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_SetBootStage(T_zPsm_BootStage stage)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_BootStateFlag = stage;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetBootStage

+* ¹¦ÄÜÃèÊö£º»ñȡϵͳ³õʼ»¯Íê³É±ê־λ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÏµÍ³³õʼ»¯Íê³É±ê־λ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+T_zPsm_BootStage zOss_GetBootStage(void)

+{

+    ZOSS_INTR old_intr;

+    T_zPsm_BootStage stage;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    stage = g_zPsm_BootStateFlag;

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return stage;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetPSMAppIdle

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Ë¯ÃßÁ÷³ÌÓ¦ÓÃΪ¿ÕÏÐ״̬£¬×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦Óã»

+* ²ÎÊý˵Ã÷£º(IN)

+*               appId:Ó¦ÓÃÉèÖÃÔÊÐí¿ÕÏеÄÓ¦ÓÃid

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetPSMAppIdle(UINT32 appId)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_AppIdleFlag = g_zPsm_AppIdleFlag & (~ (1 << appId));

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetPSMAppActive

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Ë¯ÃßÁ÷³ÌÓ¦ÓÃΪ·±Ã¦×´Ì¬£¬×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦ÓÃ

+* ²ÎÊý˵Ã÷£º(IN)

+*               appId:Ó¦ÓÃÉèÖÃÔÊÐí·±Ã¦µÄÓ¦ÓÃid

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetPSMAppActive(UINT32 appId)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_AppIdleFlag = g_zPsm_AppIdleFlag | (1 << appId);

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetSleepFuncOpt 

+* ¹¦ÄÜÃèÊö£ºË¯Ãß¹³×Óº¯Êý£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               beforeHook: ˯Ãßǰ¹³×Óº¯Êý£»

+*               afterHook:  ˯Ãߺó¹³×Óº¯Êý£»

+*           (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÃ»ÓÐʹÓõĹ³×Óº¯Êý×¢²áΪNULL¡£ 

+**************************************************************************/

+VOID zOss_SetSleepHookOpt(psm_SleepInitHook  initHook, psm_SleepFinishHook  finishHook, psm_SleepBeforeHook  beforeHook, psm_SleepAfterHook afterHook)

+{

+    if (initHook != NULL)

+        g_zPsm_SleepInitHook    = initHook;

+

+    if (finishHook != NULL)

+        g_zPsm_SleepFinishHook  = finishHook;   

+    

+    if (beforeHook != NULL)

+        g_zPsm_SleepBeforeHook  = beforeHook;

+

+    if (afterHook != NULL)

+        g_zPsm_SleepAfterHook   = afterHook;    

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RegSleepCompensateFunc 

+* ¹¦ÄÜÃèÊö£ºË¯Ãßʱ¼ä²¹³¥×¢²áº¯Êý£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               funcOpt: ×¢²á²¹³¥º¯Êý£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»ØÊ¡µç²¹³¥ID;

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+ZOSS_COMPENSATE_ID zOss_RegSleepCompensateFunc(psm_CompensateHook funcOpt)

+{

+    ZOSS_INTR old_intr;

+    T_zPsm_CompensateNode *pCmpnstNode = (T_zPsm_CompensateNode *)zOss_Malloc(sizeof(T_zPsm_CompensateNode));

+

+    zOss_AssertEx(pCmpnstNode != NULL, NULL);

+    zOss_Memset(pCmpnstNode, 0, sizeof(T_zPsm_CompensateNode));

+    ZOSS_SAVE_IRQ(old_intr);  

+    pCmpnstNode->psm_CompensateHook = funcOpt;

+    zOss_ListAdd(&g_zPsm_CmpnstFuncList, &(pCmpnstNode->node));

+    ZOSS_RESTORE_IRQ(old_intr); 

+

+    return (ZOSS_COMPENSATE_ID )pCmpnstNode;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_DeregSleepCompensateFunc 

+* ¹¦ÄÜÃèÊö£ºË¯Ãßʱ¼ä²¹³¥×¢Ïúº¯Êý£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               pPsmCmpnstID: Ê¡µç²¹³¥ID;

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_DeregSleepCompensateFunc(ZOSS_COMPENSATE_ID psmCmpnstId)

+{

+    ZOSS_INTR old_intr;

+    T_zPsm_CompensateNode *pCmpnstNode = (T_zPsm_CompensateNode *)psmCmpnstId;

+

+    ZOSS_SAVE_IRQ(old_intr); 

+    zOss_ListDelete(&g_zPsm_CmpnstFuncList, &(pCmpnstNode->node));

+    ZOSS_RESTORE_IRQ(old_intr); 

+    zOss_Free(psmCmpnstId);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_CompensateTicks

+* ¹¦ÄÜÃèÊö£º²¹³¥²Ù×÷ϵͳticksÖµ£»µ¥Î»:tick£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»Ø²¹³¥µÄticksÖµ£»

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_CompensateTicks(VOID)

+{

+    ZOSS_INTR old_intr;

+    UINT32 ticks = 0;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    ticks = g_zPsm_SleepTicksTime/ZOSS_MS_PER_TICK;

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ticks;     

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ClearSleepTime

+* ¹¦ÄÜÃèÊö£ºÇå³ý˯Ãßʱ¼ä£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_ClearSleepTime(VOID)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_SleepTime = 0;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmAdjustFreq312M

+* ¹¦ÄÜÃèÊö£º½â¾öϵͳÔÚ¶¯Ì¬´´½¨Ï̲߳¢Í˳öÏß³Ìʱ£¬ARMÖ÷ƵΪ78MÇé¿öÏ£¬·¢ÉúµÄose_heapdÏß³Ì

+*           ËøÖжϴóÓÚ400usµ¼ÖµÄGP0¶ÏÑÔÎÊÌ⣬ÔÚ·¢ÉúÕâÖÖÇé¿öµÄʱºò£¬°ÑÖ÷Ƶµ÷Õûµ½312M,

+*           È»ºóÓɶ¯Ì¬µ÷Ƶģ¿é¸ºÔð°ÑÖ÷Ƶµ÷Õû»ØÈ¥¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º ZOSS_SUCCESS

+* ÆäËü˵Ã÷£º ¸Ãº¯Êý½ö½öÔÚzOss_ExitThreadº¯ÊýÖÐʹÓÃ

+************************************************************************/

+#ifdef _OS_OSE

+UINT32 zOss_PsmAdjustFreq312M(VOID)

+{

+    if (zDrvPow_GetPsCoreFreq() < CLK312M)

+    {

+        zDrvPow_SetArmPsCoreFreq(CLK312M);

+        

+#ifdef _USE_CPU_DFM

+        psm_DfmWakeUpReset();

+#endif

+        g_zPsm_CurCpuFreq = CLK312M;

+    }

+

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef _OS_LINUX

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmInitHook

+* ¹¦ÄÜÃèÊö£ºË¯Ãß³õʼ»¯¹³×Óº¯Êý¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_PsmInitHook(VOID)

+{ 

+    if (g_zPsm_SleepInitHook != NULL)

+        g_zPsm_SleepInitHook();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmFinshHook

+* ¹¦ÄÜÃèÊö£ºË¯Ãß½áÊø¹³×Óº¯Êý¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_PsmFinshHook(VOID)

+{ 

+    if (g_zPsm_SleepFinishHook != NULL)

+        g_zPsm_SleepFinishHook();

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmBootSleep

+* ¹¦ÄÜÃèÊö£ºboot˯ÃßÈë¿Úº¯Êý¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_PsmBootSleep(VOID)

+{

+    if(!g_zPsm_BooTSleepFlag)

+    {

+        if (g_zPsm_SleepInitHook != NULL)

+            g_zPsm_SleepInitHook();

+    

+         psm_BootSleep();  

+        

+        g_zPsm_BooTSleepFlag = TRUE;

+        printk("psm_BootSleep");

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_IdleEnter

+* ¹¦ÄÜÃèÊö£ºË¯Ãß´¦ÀíÈë¿Úº¯Êý¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_PsmEnter(VOID)

+{ 

+#ifdef _USE_PSM_TEST

+    if(zSys_SetR7SleepType(R7_PLAT_NO_SLEEP))

+		return;

+#endif

+

+    if (psm_CampOnSleepCheck())                   // ÓÐÍøË¯ÃßÁ÷³Ì£»

+    {

+        psm_CampOnSleep();

+    }

+    else if(zPS_umm_IsLossOfCoverage())           // ¶ªÊ§¸²¸Ç˯ÃßÁ÷³Ì£»

+    {

+        psm_LossCoverageSleep();

+    }

+    else if(zAti2_PsIsInFlyMode())                // ·ÉÐÐģʽ˯ÃßÁ÷³Ì£»                

+    {

+        psm_AirplaneSleep();

+    }

+	else

+	    zDrvPow_Sleep_Func(KERNEL_SLEEP_MODE, 0); //ÆäËüģʽ¶¼²»Âú×ã½øÈëµ½ÄÚºËÊ¡µç£»	

+}

+

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_PsmTraceInfo

+* ¹¦ÄÜÃèÊö£º Êä³öpsmµÄµ÷ÊÔÐÅÏ¢

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_PsmTraceInfo(VOID)

+{

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "GsmAttemptFlag = %d, GsmFlag = %d, PsFlag = %d, PlatFlag = %d, AppFlag = %d, DrvFlag = %d",

+                zGsml1_AttemptSleep(FALSE), !zGsml1_PsmIdleFlag(), zPs_PsmIdleFlag(), Psm_PlatIdleFlag(), psm_AppIdleFlag(), zDrvPow_PsmIdleFlag());

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "GsmSleepTime = %d, PsSleepTime = %d", zGsml1_PsmGetSleepTime(), zOss_GetPs_SleepTimer());

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "SleepTicks = %d", g_zPsm_SleepTicksTime);

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "CampON = %d, LossOfCoverage = %d, FlyMode = %d", psm_CampOnCheck(), zPS_umm_IsLossOfCoverage(),

+                zAti2_PsIsInFlyMode());

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "TickCnt = %d", zOss_GetTickCount());

+}

+#ifdef _USE_CPU_DFM

+

+/******************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ApplyCpuFreq

+* ¹¦ÄÜÃèÊö£ºÁ¢¼´µ÷Ƶº¯Êý

+* ²ÎÊý˵Ã÷£º(IN)         

+*               appid:Á¢¼´µ÷ƵID;

+*               isUsed:TRUEʱ½øÐÐÉýƵ£¬FALSEʱ½øÐнµÆµ²Ù×÷;

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£¬Ê§°Ü·µ»ØZOSS_ERROR£»

+* ÆäËü˵Ã÷£ºÔÚÏß³ÌÉÏÏÂÎÄÖÐʹÓã»

+**************************************************************************/

+UINT32 zOss_ApplyCpuFreq(UINT32 appId, BOOL isUsed)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    if (isUsed)

+    {

+        if (!g_zPsmCfg->minClk[appId].isUsed)

+        {

+            g_zPsm_MinCpuFreq += g_zPsmCfg->minClk[appId].cpuClk;

+        }

+    }

+    else

+    {

+        if (g_zPsmCfg->minClk[appId].isUsed)

+        {

+            g_zPsm_MinCpuFreq -= g_zPsmCfg->minClk[appId].cpuClk;

+        }

+    }

+    

+    g_zPsmCfg->minClk[appId].isUsed = isUsed;

+    if (g_zPsm_MinCpuFreq > g_zPsm_CurCpuFreq)

+    {

+        SINT32 retCode    = DRV_SUCCESS; 

+

+        g_zPsm_CurCpuFreq = psm_FindMinCpuFreq();

+        retCode           = zDrvPow_SetArmPsCoreFreq(g_zPsm_CurCpuFreq);

+        zOss_AssertEx(retCode == DRV_SUCCESS, ZOSS_ERROR);

+        psm_ClearIIT();

+    } 

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetIgnoreThreadTimeRate 

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ìʱ¼ä±ÈÀý(ºöÂÔÏ̵߳ÄÖ´ÐÐʱ¼ä¶à´ó±ÈÀý×÷ΪidleÏ̵߳Äʱ¼ä)

+* ²ÎÊý˵Ã÷£º(IN)

+*               timeRate: ʱ¼ä±ÈÀý

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_SetIgnoreThreadTimeRate(FLOAT timeRate)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_IgnoreThreadTimeRate = timeRate;

+    ZOSS_RESTORE_IRQ(old_intr); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ThreadSwapInPsmHook 

+* ¹¦ÄÜÃèÊö: Ïß³ÌÇÐÈëʱµÄÊ¡µç¹³×Ó 

+* ²ÎÊý˵Ã÷: (IN)  

+*               user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_ThreadSwapInPsmHook(T_ZOsa_ThreadUserArea *user_area)

+{

+    ZOSS_INTR   old_intr;

+    UINT32      past_time       = 0;

+    UINT32      current_time    = 0;

+    

+    zOss_AssertExN(user_area != NULL);

+    ZOSS_SAVE_IRQ(old_intr);

+    current_time          = Osa_HwTimeRead();

+    past_time             = current_time - g_zPsm_SwapLastTime;

+    g_zPsm_SumCpuTime     += past_time;

+    user_area->psmCpuTime += past_time;

+    g_zPsm_CurThread      = user_area->threadid;

+    g_zPsm_SwapLastTime   = current_time;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_THreadSwapOutPsmHook 

+* ¹¦ÄÜÃèÊö: Ïß³ÌÇгöʱµÄÊ¡µç¹³×Ó

+* ²ÎÊý˵Ã÷: (IN)  

+*               user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*           (OUT)  

+*               ÎÞ

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_ThreadSwapOutPsmHook(T_ZOsa_ThreadUserArea *user_area)

+{

+    ZOSS_INTR   old_intr;

+    UINT32      past_time       = 0;

+    UINT32      current_time    = 0;

+

+    zOss_AssertExN(user_area != NULL);

+    ZOSS_SAVE_IRQ(old_intr);

+    current_time          = Osa_HwTimeRead();

+    past_time             = current_time - g_zPsm_SwapLastTime;

+    g_zPsm_SumCpuTime     += past_time;

+    user_area->psmCpuTime += past_time;

+    g_zPsm_CurThread      = NULL;

+    g_zPsm_SwapLastTime   = current_time;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RecordPsmLastSwapTime 

+* ¹¦ÄÜÃèÊö: ¼Ç¼ʡµç×îºóÒ»´ÎÏß³ÌÇл»µÄʱ¼ä£»

+* ²ÎÊý˵Ã÷: (IN)  

+*               ÎÞ    

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_RecordPsmLastSwapTime(VOID)

+{

+    ZOSS_INTR old_intr  = 0;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_SwapLastTime = Osa_HwTimeRead();

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_DfmSettingInit

+* ¹¦ÄÜÃèÊö: ¶¯Ì¬µ÷Ƶ»·¾³³õʼ»¯£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ 

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: 

+**************************************************************************/

+VOID zOss_DfmSettingInit(VOID)

+{   

+    ZOSS_INTR old_intr;

+                    

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_DfmFinishFlag = FALSE; 

+    ZOSS_RESTORE_IRQ(old_intr); 

+    

+    psm_SetIgnoreThread();

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    psm_ClearThreadCpu();

+    g_zPsm_SumCpuTime    = 0;

+    g_zPsm_DfmFinishFlag = TRUE; 

+    g_zPsm_SwapLastTime  = Osa_HwTimeRead();

+    ZOSS_RESTORE_IRQ(old_intr); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetIgnoreThread

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£º(IN)

+                thread : Ïß³ÌID;

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_SetIgnoreThread(ZOSS_THREAD_ID threadId)

+{

+    ZOSS_INTR old_intr;  

+

+    if (threadId == NULL)

+        return;

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_IgnoreThreadId[g_zPsm_IgnoreThreadIndex++] = threadId;

+    ZOSS_RESTORE_IRQ(old_intr); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_CpuIntRoutine

+* ¹¦ÄÜÃèÊö£º ´¥·¢cpu¶¯Ì¬µ÷Ƶ²É¼¯º¯Êý

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _OS_TOS

+VOID zOss_DfmIntRoutine(VOID)

+{

+    static UINT32 psmCpuCount = 0;

+    

+    if(g_zPsm_DfmFinishFlag)

+    {

+        if(++psmCpuCount >= g_zPsmCfg->dfmPeriod)

+        {

+           psmCpuCount = 0;

+           psm_InterruptRoutine(1);

+        }

+    }

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_Dfm_TraceInfo

+* ¹¦ÄÜÃèÊö£º Êä³ödfmµÄµ÷ÊÔÐÅÏ¢

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_DfmTraceInfo(VOID)

+{

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "CurFreq = %d, DfmCnt = %d, ait = %d", g_zPsm_CurCpuFreq, g_zPsm_DfmCnt, g_zPsm_SumIIT/g_zPsm_DfmCnt);

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "DesFreq = %d, MinFreq = %d", psm_FindDesCpuFreq((100 - g_zPsm_SumIIT/g_zPsm_DfmCnt), g_zPsm_CurCpuFreq),

+                psm_FindMinCpuFreq());

+}

+

+#endif  // #ifdef _USE_CPU_DFM

+

+#endif  // #ifdef _USE_PSM

+

diff --git a/cp/ps/plat/src/oss/psm/src/psm_297520v2.c b/cp/ps/plat/src/oss/psm/src/psm_297520v2.c
new file mode 100644
index 0000000..6d776b6
--- /dev/null
+++ b/cp/ps/plat/src/oss/psm/src/psm_297520v2.c
@@ -0,0 +1,1750 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2013 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : psm_297520V2.c

+* ÎÄ ¼þ Ãû : psm_2975V2.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Ê¡µç¹ÜÀí(power save manager)

+* ×÷    Õß : ¸ß»ª·å

+* °æ    ±¾ : V0.1

+* Íê³ÉÈÕÆÚ : 2013.11.15

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+#ifdef _USE_PSM

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "drvs_pow.h"

+#include "drvs_pwr.h"

+#include "drvs_ret.h"

+#include "sup.h"

+#include "osa.h"

+#ifdef _USE_PSM_TEST

+#include "sys_func_atcfg.h"

+#endif

+#ifdef _OS_LINUX

+#include <linux/time.h>

+#include <linux/sched.h>

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_PSM_THREAD_TOTAL_TIME_MIN          3000

+#define ZOSS_PSM_IGNORE_THREAD_TOTAL_TIME_MIN   1000

+#define ZOSS_PSM_IDLE_CPU_LOAD                  70

+

+/**************************************************************************

+* Íⲿº¯ÊýºÍ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+//gsml1 ÌṩµÄº¯Êý£»

+extern BOOL   zGsml1_AttemptSleep(UINT32 mode);

+extern UINT32 zGsml1_PsmGetSleepTime(VOID);

+extern BOOL   zGsml1_PsmIdleFlag(VOID);

+extern BOOL   zGsml1_PsmGetCampon(VOID);

+

+//ЭÒéÕ»ÌṩµÄº¯Êý£»

+extern BYTE   zPs_IsGsmMasterMode(VOID);

+extern BOOL   zPs_PsmIdleFlag(VOID);

+extern BOOL   zAti2_PsIsInFlyMode(VOID);

+extern BOOL   zAti2_PsRfNotOpen(VOID);

+extern BYTE   zPS_umm_IsLossOfCoverage(VOID);

+

+//Çý¶¯ÌṩµÄº¯Êý£»

+extern BOOL   zDrvPow_PsmGetCampon(VOID);

+extern BOOL   zDrvPow_PsmIdleFlag(VOID);

+

+extern UINT64 gTimer_CurTime;

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/*ʱ¼ä²¹³¥½á¹¹Ìå*/

+typedef struct

+{

+    T_ZOss_Node         node;

+    psm_CompensateHook  psm_CompensateHook;

+} T_zPsm_CompensateNode;

+

+#ifdef _USE_CPU_DFM

+typedef enum

+{

+    PSM_PULL_CPUFREQ,   /* ÉýƵÁ½¼¶ */

+    PSM_UP_CPUFREQ,     /* ÉýƵһ¼¶ */

+    PSM_DOWN_CPUFREQ    /* ½µÆµ     */

+} T_zPsm_FmScope;

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID   psm_IdleThreadEntry(SINT32 ignore);

+static BOOL   psm_CampOnSleepCheck(VOID);

+static VOID   psm_CampOnSleep(VOID);

+static VOID   psm_LossCoverageSleep(VOID);

+static VOID   psm_AirplaneSleep(VOID);

+static VOID   psm_NoCfunSleep(VOID);

+static BOOL   psm_CampOnCheck(VOID);

+static VOID   psm_SleepTimeCompensate(UINT32 sleepTime);

+static VOID   psm_PowerOnSleep(VOID);

+static VOID   psm_BootSleep(VOID);

+static BOOL   psm_CheckSleepTime(BOOL modeHaveGsm);

+static BOOL   psm_CheckSleepFlag(VOID);              

+static BOOL   psm_SleepCheck(VOID);

+static VOID   psm_CompensateTicks(UINT32 sleepTime);

+static VOID   psm_CompensateTimer(UINT32 sleepTime);

+#ifdef _OS_LINUX

+static VOID   psm_CompensateTimeKeeper(UINT32 sleepTime);

+#endif

+static BOOL   psm_AppIdleFlag(VOID);

+static UINT32 psm_GetPreSleepTime(VOID);

+static BOOL   Psm_PlatIdleFlag(VOID);

+

+#ifdef _USE_CPU_DFM

+static UINT32 psm_GetIgnoreThreadTime(VOID);

+static VOID   psm_GetIdleCpuLoad(UINT32 *pIdleCpuLoad);

+static VOID   psm_ClearIIT(VOID);

+static UINT32 psm_GetDesCpuFreq(UINT32 curCpuFreq, UINT32 dfmFlag);

+static UINT32 psm_FindDesCpuFreq(UINT32 cpuload, UINT32 curCpuFreq);

+static UINT32 psm_FindMinCpuFreq(VOID);

+static VOID   psm_InterruptRoutine(SINT32 args);

+static VOID   psm_SetIgnoreThread(VOID);

+static UINT32 psm_GetCpuFreq(UINT32 ait);

+static UINT32 psm_GetAIT(UINT32 idleThreadCpu);

+static VOID   psm_ClearThreadCpu(VOID);

+static VOID   psm_DfmWakeUpReset(VOID);

+#endif

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+T_zPsm_Param    *g_zPsmCfg               = NULL;

+UINT32          g_zPsm_SleepTime         = 0;   /* ϵͳÐÝÃßʱ¼ä                 */

+UINT32          g_zPsm_CurCpuFreq        = 0;   /* µ±Ç°Ö÷Ƶ                     */

+

+#ifdef _USE_CPU_DFM

+static  UINT32  g_zPsm_SwapLastTime      = 0;

+UINT32          g_zPsm_SumCpuTime        = 0;        

+ZOSS_THREAD_ID  g_zPsm_CurThread         = NULL;

+ZOSS_THREAD_ID  *g_zPsm_IgnoreThreadId   = NULL;

+#endif

+

+static UINT32   g_zPsm_AppIdleFlag       = 0;   /* Ó¦ÓÿÕÏбêÖ¾·û£¬¿ØÖÆË¯ÃßÁ÷³Ì */

+static UINT32   g_zPsm_PreSleeptime      = 0;   /* ¼ÆËãÔ¤ÆÚµÄ˯Ãßʱ¼ä           */

+static ZOSS_THREAD_ID g_zPsm_PsmThreadId = NULL;

+static UINT32   g_zPsm_SleepTicksTime    = 0;   /* ÓÃÓÚ²¹³¥ticksÖµµÄ˯Ãßʱ¼ä    */

+static T_ZOss_List g_zPsm_CmpnstFuncList = {0}; /* ¸÷Ä£¿é²¹³¥º¯ÊýµÄÁ´±í         */

+static psm_SleepInitHook   g_zPsm_SleepInitHook         = NULL;

+static psm_SleepFinishHook g_zPsm_SleepFinishHook       = NULL;

+static psm_SleepBeforeHook g_zPsm_SleepBeforeHook       = NULL;

+static psm_SleepAfterHook  g_zPsm_SleepAfterHook        = NULL;

+static volatile T_zPsm_BootStage g_zPsm_BootStateFlag   = PSM_BOOT_DEFAULT; /* ϵͳÆô¶¯½×¶Î±ê־λ */

+

+#ifdef _USE_CPU_DFM

+static BOOL     g_zPsm_DfmFlag              = FALSE;

+static UINT32   g_zPsm_IITCnt               = 0;

+static UINT32   g_zPsm_DfmCnt               = 0;

+static UINT32   g_zPsm_SumIIT               = 0;

+static UINT32   g_zPsm_MinCpuFreq           = 0;

+static BOOL     g_zPsm_DfmFinishFlag        = FALSE;

+static SINT32   *g_zPsm_IIT                 = NULL;

+static FLOAT    g_zPsm_IgnoreThreadTimeRate = 0.6;

+static UINT32   g_zPsm_IgnoreThreadIndex    = 0;

+#endif

+

+#ifdef _OS_LINUX

+static BOOL     g_zPsm_BooTSleepFlag = FALSE;

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_IdleThreadEntry

+* ¹¦ÄÜÃèÊö£ºÊ¡µçÏß³ÌÈë¿Ú

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_IdleThreadEntry(SINT32 ignore)

+{

+    if (g_zPsm_SleepInitHook != NULL)

+        g_zPsm_SleepInitHook();

+    

+    psm_BootSleep();

+    

+    for( ; ; )

+    {

+#ifdef _USE_PSM_TEST

+        if(!zSys_SetR7SleepType(R7_PLAT_NO_SLEEP))

+#endif

+        {

+            if (psm_CampOnSleepCheck())               // ÓÐÍøË¯ÃßÁ÷³Ì;

+            {

+                psm_CampOnSleep();

+            }

+            else if(zPS_umm_IsLossOfCoverage())       // ¶ªÊ§¸²¸Ç˯ÃßÁ÷³Ì;

+            {

+                psm_LossCoverageSleep();

+            }

+            else if(zAti2_PsIsInFlyMode())            // ·ÉÐÐģʽ˯ÃßÁ÷³Ì£»                

+            {

+                psm_AirplaneSleep();

+            }

+            else if(zAti2_PsRfNotOpen())             // Éϵ粻¿ª»ú˯ÃßÁ÷³Ì

+            {

+                psm_NoCfunSleep();

+            }

+        

+            zDrvPow_Sleep_Func(KERNEL_SLEEP_MODE, 0); // ÆäËüģʽ¶¼²»Âú×ã½øÈëµ½ÄÚºËÊ¡µç;

+        }

+

+        if (g_zPsm_SleepFinishHook != NULL)

+            g_zPsm_SleepFinishHook();

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetPreSleepTime

+* ¹¦ÄÜÃèÊö£º¼ÆËãÔ¤ÆÚµÄ˯Ãßʱ¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£ºÔÚËø¶ÏÉÏÏÂÎÄʹÓÃÎÞÐèËøÖжϣ»

+************************************************************************/

+static UINT32 psm_GetPreSleepTime(VOID)   

+{

+    return g_zPsm_PreSleeptime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_BootSleep

+* ¹¦ÄÜÃèÊö£º¿ª»úÍê³Éǰʡµç´¦Àí

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚidleÏ̵߳÷Óã¬g_zPsmBootStateFlagʹÓó¡¾°¼òµ¥ÎÞÐè±£»¤£»

+**************************************************************************/

+static VOID psm_BootSleep(VOID) 

+{   

+    while (g_zPsm_BootStateFlag == PSM_BOOT_DEFAULT)

+        ;

+

+    while (!psm_CampOnCheck() && g_zPsm_BootStateFlag != PSM_BOOT_FINISH)

+    {

+        psm_PowerOnSleep();

+    }

+

+    g_zPsm_BootStateFlag = PSM_BOOT_FINISH;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CampOnSleepCheck

+* ¹¦ÄÜÃèÊö£ºÐ¡Çø×¤ÁôºóÕý³£Ë¯ÃßÁ÷³ÌÅжϺ¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ         

+* ·µ »Ø Öµ£º·µ»ØTRUE±íʾ¿ÉÒÔ½øÈë¸Ã˯Ãß,·µ»ØFALSE±íʾ²»ÄܽøÈë¸Ã˯ÃßÁ÷³Ì;

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_CampOnSleepCheck(VOID)

+{   

+    if (psm_CampOnCheck())

+    {

+        return psm_SleepCheck();

+    }

+

+    return FALSE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CampOnCheck

+* ¹¦ÄÜÃèÊö£ºÅжÏÊÇ·ñפÁôÍøÂç³É¹¦

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static BOOL psm_CampOnCheck(VOID)   

+{

+    return (zDrvPow_PsmGetCampon() || zGsml1_PsmGetCampon());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SleepCheck

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_SleepCheck(VOID)

+{

+    if (zGsml1_AttemptSleep(FALSE) && zPs_PsmIdleFlag() && Psm_PlatIdleFlag() && psm_AppIdleFlag() && zDrvPow_PsmIdleFlag())

+    {

+        return TRUE;

+    }

+    return FALSE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_BootSleepCheck

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_BootSleepCheck(VOID)

+{

+    if (Psm_PlatIdleFlag() && psm_AppIdleFlag() && zDrvPow_PsmIdleFlag())

+    {

+        return TRUE;

+    }

+    return FALSE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CheckSleepTime

+* ¹¦ÄÜÃèÊö£ºÅжÏ˯Ãßʱ¼äÊÇ·ñÔÊÐíÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               modeHaveGsm : µ±Ç°ÏµÍ³Ä£Ê½ÊÇ·ñº¬ÓÐGSM,TRUE±íʾº¬ÓУ¬FALSE

+*                             ±íʾûÓУ»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º TRUE:Éî˯Ãߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º ÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static BOOL psm_CheckSleepTime(BOOL modeHaveGsm)

+{

+    g_zPsm_PreSleeptime = min(zGsml1_PsmGetSleepTime(), zOss_GetPs_SleepTimer());

+    return (g_zPsm_PreSleeptime > g_zPsmCfg->deepSleepTimeThreshold);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SleepMode

+* ¹¦ÄÜÃèÊö£º»ñȡʡµç˯Ãßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ         

+* ·µ »Ø Öµ£ºTURE:¿ÉÒÔ˯ÃßÁË£¬FALSE:²»ÄÜ˯Ãߣ»

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static BOOL psm_SleepMode(VOID)

+{

+    return (psm_CheckSleepTime(FALSE) && psm_CheckSleepFlag());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CheckSleepFlag

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃߵȴý

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߵȴý£»FALSE:²»ÄܽøÈëÐÝÃߵȴý

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_CheckSleepFlag(VOID)

+{

+    return (!zGsml1_PsmIdleFlag() && zDrvPow_PsmIdleFlag() && Psm_PlatIdleFlag() && psm_AppIdleFlag() && zPs_PsmIdleFlag());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_BootCheckSleepFlag

+* ¹¦ÄÜÃèÊö£ºÔÚBOOT sleep˯Ãß·½Ê½ÖÐÅжÏÄÜ·ñ½øÈëÐÝÃߵȴý

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߵȴý£»FALSE:²»ÄܽøÈëÐÝÃߵȴý

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_BootCheckSleepFlag(VOID)

+{

+    return (!zGsml1_PsmIdleFlag() && zDrvPow_PsmIdleFlag() && Psm_PlatIdleFlag() && psm_AppIdleFlag());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SleepTimeCompensate

+* ¹¦ÄÜÃèÊö£ºË¯Ãßʱ¼ä²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime : ²¹³¥Ê±¼ä

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºº¯ÊýÔËÐÐÔÚËøÖжÏËùÖжÏÉÏÏÂÎÄÖУ¬¹Ê²»½øÐÐËøÖжϱ£»¤£»

+**************************************************************************/

+static VOID psm_SleepTimeCompensate(UINT32 sleepTime)

+{

+    T_zPsm_CompensateNode *pCmpnstNode = (T_zPsm_CompensateNode *)zOss_ListFirst(&g_zPsm_CmpnstFuncList);

+

+    while(pCmpnstNode != NULL)

+    {

+        pCmpnstNode->psm_CompensateHook(sleepTime);

+        pCmpnstNode = (T_zPsm_CompensateNode *)zOss_ListNext(&(pCmpnstNode->node));

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_PowerOnSleep

+* ¹¦ÄÜÃèÊö£º¿ª»úÍê³ÉǰµÄÊ¡µç´¦Àí

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_PowerOnSleep(VOID)

+{ 

+    ZOSS_INTR old_intr;

+  

+    if (!psm_BootSleepCheck())

+        return;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+        

+#ifdef _OS_LINUX

+    if (need_resched())

+    {

+        ZOSS_RESTORE_IRQ(old_intr);  

+        return;

+    }        

+#endif

+

+

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if ((g_zPsm_BootStateFlag == PSM_SYSINIT_FINISH) && psm_BootCheckSleepFlag())

+    {

+        UINT32 sleepTime   = zOss_GetPs_SleepTimer();  

+        if(sleepTime > g_zPsmCfg->deepSleepTimeThreshold)

+        {

+            g_zPsm_SleepTime = zDrvPow_Sleep_Func(BOOT_SLEEP_MODE, sleepTime);

+            psm_SleepTimeCompensate(g_zPsm_SleepTime);

+#ifdef _USE_CPU_DFM

+            psm_DfmWakeUpReset();

+#endif            

+        }

+    }

+

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);  

+    

+    if ((g_zPsmCfg->bootOverClk!= 0) && (g_zPsmCfg->bootOverClk != g_zPsm_CurCpuFreq))

+    {

+        zDrvPow_SetArmPsCoreFreq(g_zPsmCfg->bootOverClk);

+    }

+

+    zDrvPow_Sleep_Func(KERNEL_SLEEP_MODE, 0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_AirplaneSleep 

+* ¹¦ÄÜÃèÊö£º·ÉÐÐģʽ˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ                      

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_AirplaneSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+

+    if(!psm_SleepCheck())

+        return;

+

+    ZOSS_SAVE_IRQ(old_intr); 

+        

+#ifdef _OS_LINUX

+    if (need_resched())

+    {

+        ZOSS_RESTORE_IRQ(old_intr);  

+        return;

+    }        

+#endif

+

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if(psm_CheckSleepFlag() && zAti2_PsIsInFlyMode())

+    {

+        UINT32 timeLen   = min(g_zPsmCfg->airPlaneSleepTime, zOss_GetPs_SleepTimer());

+        g_zPsm_SleepTime = zDrvPow_Sleep_Func(AIRPLANE_SLEEP_MODE, timeLen);

+        psm_SleepTimeCompensate(g_zPsm_SleepTime);

+#ifdef _USE_CPU_DFM                    

+        psm_DfmWakeUpReset();

+#endif

+    }

+    

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_NoCfunSleep 

+* ¹¦ÄÜÃèÊö£ºÉϵ粻¿ª»ú״̬˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ                      

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_NoCfunSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+    UINT32 timeLen   = 0;

+    

+    if(zOss_GetTickCount() >= 5000)    //Éϵ粻¿ª»ú£¬5sºó¿É˯Ãß

+    {

+        if(!psm_SleepCheck())

+            return;

+

+        ZOSS_SAVE_IRQ(old_intr); 

+            

+        #ifdef _OS_LINUX

+        if (need_resched())

+        {

+            ZOSS_RESTORE_IRQ(old_intr);  

+            return;

+        }        

+        #endif

+

+        if (g_zPsm_SleepBeforeHook != NULL)

+            g_zPsm_SleepBeforeHook();

+        

+        if(psm_CheckSleepFlag()&& zAti2_PsRfNotOpen()) 

+        {

+            timeLen = zOss_GetPs_SleepTimer();

+            g_zPsm_SleepTime = zDrvPow_Sleep_Func(DEEP_SLEEP_MODE, timeLen);

+            psm_SleepTimeCompensate(g_zPsm_SleepTime);

+            #ifdef _USE_CPU_DFM                    

+            psm_DfmWakeUpReset();

+            #endif

+        }

+        

+        if (g_zPsm_SleepAfterHook != NULL)

+            g_zPsm_SleepAfterHook();

+        

+        ZOSS_RESTORE_IRQ(old_intr);

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CampOnSleep

+* ¹¦ÄÜÃèÊö£º×¤ÁôºóµÄÕý³£Ë¯ÃßÁ÷³Ì

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_CampOnSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    

+#ifdef _OS_LINUX

+    if (need_resched())

+    {

+        ZOSS_RESTORE_IRQ(old_intr);  

+        return;

+    }        

+#endif

+

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if (psm_SleepMode())  

+    {

+        g_zPsm_SleepTime = zDrvPow_Sleep_Func(DEEP_SLEEP_MODE, psm_GetPreSleepTime());

+        psm_SleepTimeCompensate(g_zPsm_SleepTime);                  

+#ifdef _USE_CPU_DFM

+        psm_DfmWakeUpReset();

+#endif

+    }

+    

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);      

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_LossCoverageSleep

+* ¹¦ÄÜÃèÊö£º¶ªÊ§¸²¸Ç˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_LossCoverageSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+

+    if(!psm_SleepCheck())

+        return;

+   

+    ZOSS_SAVE_IRQ(old_intr); 

+        

+#ifdef _OS_LINUX

+    if (need_resched())

+    {

+        ZOSS_RESTORE_IRQ(old_intr);  

+        return;

+    }        

+#endif

+

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if(psm_CheckSleepFlag())

+    {

+        UINT32 sleepTime   = zOss_GetPs_SleepTimer();    

+

+        if (zPS_umm_IsLossOfCoverage() && (sleepTime > g_zPsmCfg->deepSleepTimeThreshold))

+        {

+            g_zPsm_SleepTime = zDrvPow_Sleep_Func(LOSSCOVERAGE_SLEEP_MODE, sleepTime);

+            psm_SleepTimeCompensate(g_zPsm_SleepTime);

+#ifdef _USE_CPU_DFM                      

+            psm_DfmWakeUpReset();

+#endif

+        }

+    }

+    

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CompensateOssSleepTime 

+* ¹¦ÄÜÃèÊö£ºÆ½Ì¨Ö§³ÅticksÖµ²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime: ²¹³¥Ê±¼ä,µ¥Î»:ms£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_CompensateTicks(UINT32 sleepTime)

+{

+#ifdef _OS_TOS

+    cyg_add_current_time(sleepTime/ZOSS_MS_PER_TICK);

+#else

+    g_zPsm_SleepTicksTime += sleepTime;    

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CompensateOssSleepTime 

+* ¹¦ÄÜÃèÊö£ºÆ½Ì¨Ö§³Å¶¨Ê±Æ÷²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime: ²¹³¥Ê±¼ä,µ¥Î»:ms£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_CompensateTimer(UINT32 sleepTime)

+{

+    gTimer_CurTime += sleepTime;

+}

+

+#ifdef _OS_LINUX

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CompensateTimeKeeper 

+* ¹¦ÄÜÃèÊö£ºTimeKeeper²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime: ²¹³¥Ê±¼ä,µ¥Î»:ms£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+

+static VOID psm_CompensateTimeKeeper(UINT32 sleepTime)

+{

+    struct timespec timesleep = {0};

+    

+    timesleep.tv_sec = sleepTime/1000;

+    timesleep.tv_nsec = 1000000 *(sleepTime%1000);

+    timekeeping_inject_sleeptime(&timesleep);  

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_AppIdleFlag 

+* ¹¦ÄÜÃèÊö£ºÅжÏÓ¦ÓÃÊÇ·ñ¿ÕÏУ»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÓ¦Óñê־λ£»

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static BOOL psm_AppIdleFlag(VOID)

+{

+    return (g_zPsm_AppIdleFlag == 0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPsm_PlatIdleFlag 

+* ¹¦ÄÜÃèÊö£ºÅÐ¶ÏÆ½Ì¨ÊÇ·ñÔÊÐí˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÓ¦Óñê־λ£»

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£» 

+**************************************************************************/

+static BOOL Psm_PlatIdleFlag(VOID)

+{

+    return (g_zPsm_SleepTime == 0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPsm_CompensateInit 

+* ¹¦ÄÜÃèÊö£ºÊ¡µç²¹³¥³õʼ»¯£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID Psm_CompensateInit(VOID)

+{

+    zOss_ListInit(&g_zPsm_CmpnstFuncList);

+    zOss_RegSleepCompensateFunc(psm_CompensateTicks);

+    zOss_RegSleepCompensateFunc(psm_CompensateTimer);

+#ifdef _OS_LINUX

+    zOss_RegSleepCompensateFunc(psm_CompensateTimeKeeper);

+#endif

+}

+

+#ifdef _USE_CPU_DFM

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPsm_DfmInit 

+* ¹¦ÄÜÃèÊö£º¶¯Ì¬µ÷Ƶ³õʼ»¯£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID Psm_DfmInit(VOID)

+{

+    g_zPsm_CurCpuFreq = zDrvPow_GetPsCoreFreq();

+    g_zPsm_IIT = (SINT32 *)zOss_Malloc(sizeof(SINT32) * g_zPsmCfg->dfmCnt);

+    zOss_AssertExN(g_zPsm_IIT != NULL);

+    zOss_Memset(g_zPsm_IIT, 0, (sizeof(SINT32) * g_zPsmCfg->dfmCnt));

+    g_zPsm_IgnoreThreadId = (ZOSS_THREAD_ID *)zOss_Malloc(g_zPsmCfg->ignoreThreadCnt * sizeof(ZOSS_THREAD_ID));

+    zOss_AssertExN(g_zPsm_IgnoreThreadId != NULL);

+    zOss_Memset(g_zPsm_IgnoreThreadId, 0, g_zPsmCfg->ignoreThreadCnt * sizeof(ZOSS_THREAD_ID));   

+#ifdef _OS_OSE

+    start(create_process(OS_TI_PROC, "PSM_TIMER_ISR", (OSENTRYPOINT *)psm_InterruptRoutine, (OSADDRESS)1024 * 20,

+          (OSPRIORITY)g_zPsmCfg->dfmThrdPri, (OSTIME)g_zPsmCfg->dfmPeriod, (PROCESS)0, (struct OS_redir_entry *)NULL, (OSVECTOR)0, (OSUSER)0));

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_DfmWakeUpReset

+* ¹¦ÄÜÃèÊö£ºË¯ÃßÐÑÀ´ºóÒªÐèÒªÖØÐ¼ÆËãgPsm_AITµÈ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_DfmWakeUpReset(VOID) 

+{

+    g_zPsm_CurCpuFreq = zDrvPow_GetPsCoreFreq();

+    psm_ClearThreadCpu();

+    psm_ClearIIT();

+    g_zPsm_SumCpuTime   = 0;

+    g_zPsm_DfmFlag      = FALSE;

+    g_zPsm_SwapLastTime = Osa_HwTimeRead();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetIgnoreThreadTime

+* ¹¦ÄÜÃèÊö£º»ñÈ¡ºöÂÔÏ̵߳Äʱ¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 psm_GetIgnoreThreadTime(VOID)

+{

+    UINT32 psmIgnoreTime                = 0;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    SINT32              i               = 0;

+    

+    for (i = 0; i < g_zPsm_IgnoreThreadIndex; i++)

+    {

+        pPsmThreadUa = zOss_GetThreadUserArea(g_zPsm_IgnoreThreadId[i]);

+        if (pPsmThreadUa != NULL)

+        {

+            psmIgnoreTime += pPsmThreadUa->psmCpuTime;

+        }

+    }

+    

+    return psmIgnoreTime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetIdleCpuLoad

+* ¹¦ÄÜÃèÊö£º»ñȡϵͳ¿ÕÏиºÔØ£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               idlecpuLoad: cpu¿ÕÏÐÂÊ£»

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_GetIdleCpuLoad(UINT32 *pIdleCpuLoad)

+{

+    SINT32 psmIgnoreTime                = 0; 

+    SINT32 totaltime                    = 0; 

+    SINT32 psmIdleTime                  = 0; 

+    SINT32 tmpIIT                       = 0; 

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    SINT32 tmpPsmTime                   = Osa_HwTimeRead() - g_zPsm_SwapLastTime;

+    

+    totaltime = g_zPsm_SumCpuTime + tmpPsmTime;

+    

+    if (totaltime < ZOSS_PSM_THREAD_TOTAL_TIME_MIN)

+    {

+        *pIdleCpuLoad = ZOSS_PSM_IDLE_CPU_LOAD;

+    }

+    else

+    {

+        if (g_zPsm_CurThread != NULL)

+        {

+            pPsmThreadUa =  zOss_GetThreadUserArea(g_zPsm_CurThread);

+            if (pPsmThreadUa != NULL)

+            {

+                pPsmThreadUa->psmCpuTime += tmpPsmTime ;

+            }

+        }

+        

+        pPsmThreadUa  = zOss_GetThreadUserArea(g_zPsm_PsmThreadId);

+        psmIdleTime   = pPsmThreadUa->psmCpuTime;

+        psmIgnoreTime = psm_GetIgnoreThreadTime();

+        if ((psmIgnoreTime > ZOSS_PSM_IGNORE_THREAD_TOTAL_TIME_MIN) || (psmIdleTime < psmIgnoreTime) || (totaltime - psmIgnoreTime == 0))

+        {

+            tmpIIT = (psmIdleTime + psmIgnoreTime * g_zPsm_IgnoreThreadTimeRate);

+            tmpIIT = (tmpIIT * 100) / totaltime;

+        }

+        else

+        {

+            tmpIIT = (psmIdleTime - psmIgnoreTime);

+            tmpIIT = (tmpIIT * 100) / (totaltime - psmIgnoreTime);

+        }

+        *pIdleCpuLoad = tmpIIT;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_ClearThreadCpu

+* ¹¦ÄÜÃèÊö£ºÇå³ýÏ̵߳ÄcpuµÄ¼ÆÊ±Ê±¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_ClearThreadCpu(VOID)

+{

+    UINT32                i             = 0;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    

+    pPsmThreadUa             = zOss_GetThreadUserArea(g_zPsm_PsmThreadId);

+    pPsmThreadUa->psmCpuTime = 0;

+    for (i= 0; i < g_zPsm_IgnoreThreadIndex; i++)

+    {

+        pPsmThreadUa = zOss_GetThreadUserArea(g_zPsm_IgnoreThreadId[i]);

+        if (pPsmThreadUa != NULL)

+        {

+            pPsmThreadUa->psmCpuTime = 0;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_ClearIITTime

+* ¹¦ÄÜÃèÊö£ºÇå³ýÏ̵߳ÄcpuµÄ¼ÆÊ±Ê±¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_ClearIIT(VOID)

+{

+    g_zPsm_DfmCnt   = 0;

+    g_zPsm_SumIIT   = 0;

+    g_zPsm_DfmFlag  = FALSE;

+    zOss_Memset(g_zPsm_IIT, 0, (sizeof(SINT32) * g_zPsmCfg->dfmCnt));

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetDesCpuFreq

+* ¹¦ÄÜÃèÊö£º

+* ²ÎÊý˵Ã÷£º(IN)

+*               curCpuFreq:     µ±Ç°ÏµÍ³Ö÷Ƶ

+*               dfmFlag:        µ÷ƵµÈ¼¶

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»ØcpuÄ¿±êÖ÷Ƶ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 psm_GetDesCpuFreq(UINT32 curCpuFreq, UINT32 dfmFlag)

+{

+    UINT32 i = 0;

+    

+    for (i= 0; i < g_zPsmCfg->desClkNum; i++)

+    {

+        if (g_zPsmCfg->desClk[i].curCpuFreq == curCpuFreq)

+        {

+            switch (dfmFlag)

+            {

+            case PSM_UP_CPUFREQ:

+                {

+                    return g_zPsmCfg->desClk[i].upCpuFreq;

+                }

+            case PSM_DOWN_CPUFREQ:

+                {

+                    return g_zPsmCfg->desClk[i].downCpuFreq;

+                }

+            case PSM_PULL_CPUFREQ:

+                {

+                    return  g_zPsmCfg->desClk[i].pullCpuFreq;

+                }

+            default:

+                break;

+            }

+        }

+    }

+    

+    return  curCpuFreq;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_FindDesCpuFreq

+* ¹¦ÄÜÃèÊö£º»ñȡĿ±êµÄCPUÖ÷Ƶ£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               cpuload:    cpuʹÓÃÂÊ

+*               curCpuFreq: µ±Ç°Ö÷Ƶ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»Øcpu¶¯Ì¬µ÷ÕûµÄÖ÷Ƶ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_FindDesCpuFreq(UINT32 cpuload, UINT32 curCpuFreq)

+{

+    UINT32 desCpuFreq = 0;

+

+    if ((cpuload >= g_zPsmCfg->scaleCpuPcnt.downCpuPercent) && (cpuload < g_zPsmCfg->scaleCpuPcnt.upCpuPercent))

+    {

+        desCpuFreq = curCpuFreq;

+    }

+    else if (cpuload >= g_zPsmCfg->scaleCpuPcnt.pullCpuPercent)

+    {

+        desCpuFreq = psm_GetDesCpuFreq(curCpuFreq, PSM_PULL_CPUFREQ);

+    }

+    else if (cpuload >= g_zPsmCfg->scaleCpuPcnt.upCpuPercent)

+    {

+        desCpuFreq = psm_GetDesCpuFreq(curCpuFreq, PSM_UP_CPUFREQ);

+    }

+    else

+    {

+        desCpuFreq = psm_GetDesCpuFreq(curCpuFreq, PSM_DOWN_CPUFREQ);

+    }

+    

+    return desCpuFreq;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPSM_FindMinCpuClk

+* ¹¦ÄÜÃèÊö£ºÅжÏCPUµ÷ÕûµÄÖ÷ƵÊÇ·ñÂú×ãÁ¢¼´µ÷Ƶ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»ØÐèÒªµÄÁ¢¼´Ö÷Ƶ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_FindMinCpuFreq(VOID)

+{

+    SINT32 i = 0;

+    

+    for (i = 0; i < g_zPsmCfg->sysClkNum; i++)

+    {

+        if (g_zPsm_MinCpuFreq > g_zPsmCfg->sysClk[i])

+        {

+            continue;

+        }

+        

+        return g_zPsmCfg->sysClk[i];

+    }

+    

+    return g_zPsmCfg->sysClk[g_zPsmCfg->sysClkNum - 1];

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetCpuFreq

+* ¹¦ÄÜÃèÊö£º»ñȡϵͳÖ÷Ƶ

+* ²ÎÊý˵Ã÷£º(IN)  

+*               ait: ƽ¾ù¿ÕÏÐÂÊ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º ·µ»ØÏµÍ³Ö÷Ƶ£»

+* ÆäËü˵Ã÷£º ÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_GetCpuFreq(UINT32 ait)

+{

+    UINT32 desCpuFreq  = 0;

+    UINT32 minCpuFreq  = 0;

+    

+    if (g_zPsm_DfmFlag)

+    {

+        desCpuFreq = psm_FindDesCpuFreq((100 - ait), g_zPsm_CurCpuFreq);

+    }

+    else

+    {

+        desCpuFreq = g_zPsm_CurCpuFreq;

+    }

+    

+    minCpuFreq = psm_FindMinCpuFreq();

+    

+    return max(desCpuFreq,minCpuFreq);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetAIT

+* ¹¦ÄÜÃèÊö£º»ñÈ¡AIT(ƽ¾ù¿ÕÏÐÂÊ)

+* ²ÎÊý˵Ã÷£º(IN)

+*               idleThreadCpu: cpu¿ÕÏÐÂÊ£»

+*           (OUT)

+*               ÎÞ£»

+* ·µ »Ø Öµ£º·µ»ØAIT

+* ÆäËü˵Ã÷£ºÔÚµ¥Ò»Ïß³ÌÖУ¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_GetAIT(UINT32 idleThreadCpu)

+{

+    g_zPsm_SumIIT               += idleThreadCpu - g_zPsm_IIT[g_zPsm_IITCnt];

+    g_zPsm_IIT[g_zPsm_IITCnt++] = idleThreadCpu;

+

+    if(g_zPsm_IITCnt >= g_zPsmCfg->dfmCnt)

+    {

+        g_zPsm_IITCnt = 0;

+    }

+    

+    return g_zPsm_SumIIT/g_zPsm_DfmCnt;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_InterruptRoutine

+* ¹¦ÄÜÃèÊö£ºÖжϷþÎñ³ÌÐò

+* ²ÎÊý˵Ã÷£º(IN)

+*               args: Ïß³ÌÈë¿Úº¯ÊýµÄ²ÎÊý£»

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔڸú¯ÊýÖв»ÒªÊ¹ÓÃ×èÈûÐÔº¯Êý£»

+**************************************************************************/

+static VOID psm_InterruptRoutine(SINT32 args)

+{

+    UINT32 idleCpuLoad  = 0;

+    UINT32 ait          = 0;

+    UINT32 cpuFreq      = 0;

+    

+    if (g_zPsm_DfmFinishFlag)

+    {

+        if ( g_zPsm_DfmCnt >= g_zPsmCfg->dfmCnt)

+        {

+            g_zPsm_DfmFlag = TRUE;          

+        }

+        else

+        {

+            g_zPsm_DfmCnt++;

+        }

+        psm_GetIdleCpuLoad(&idleCpuLoad);

+        ait     = psm_GetAIT(idleCpuLoad);

+        cpuFreq = psm_GetCpuFreq(ait);

+        if (cpuFreq != g_zPsm_CurCpuFreq)

+        {

+            SINT32 retCode = zDrvPow_SetArmPsCoreFreq(cpuFreq);

+            zOss_AssertExN(retCode == DRV_SUCCESS);

+            psm_ClearIIT();

+            g_zPsm_CurCpuFreq = cpuFreq;

+        }

+        psm_ClearThreadCpu();  

+        g_zPsm_SumCpuTime   = 0;

+        g_zPsm_SwapLastTime = Osa_HwTimeRead();

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SetIgnoreThread

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_SetIgnoreThread(VOID)

+{

+    UINT32  i  = 0;

+    

+    g_zPsm_IgnoreThreadIndex = 0;    

+    for (i = 0; i < g_zPsmCfg->ignoreThreadCnt; i++)

+    {

+        zOss_SetIgnoreThread(zOss_GetThreadIDByName(g_zPsmCfg->pIgnoreThreadNameArry[i]));

+    }

+}

+

+#endif //_USE_CPU_DFM

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmInit

+* ¹¦ÄÜÃèÊö£ºÊ¡µç¹ÜÀí³õʼ»¯

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_PsmInit(VOID)

+{

+    g_zPsmCfg          = &(zOss_GetOssCfg()->PsmCfg);

+

+#ifndef _OS_LINUX

+    g_zPsm_PsmThreadId = zOss_CreateThread("zOss_ThreadPsm", psm_IdleThreadEntry, 0, 2 * 1024, 31, 1, 1);

+    zOss_AssertEx(g_zPsm_PsmThreadId != NULL, ZOSS_ERROR);

+    

+#ifdef _OS_TOS

+    zOss_SuspendThread((ZOSS_THREAD_ID)cyg_thread_idle_thread());

+#endif

+

+#endif /* _OS_LINUX */

+

+    Psm_CompensateInit();

+

+#ifdef _USE_CPU_DFM  

+    Psm_DfmInit();

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetBootStage

+* ¹¦ÄÜÃèÊö£ºÉèÖÃϵͳ³õʼ»¯Íê³É±ê־λ

+* ²ÎÊý˵Ã÷£º(IN)

+*               stage:Íê³É±êÖ¾£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_SetBootStage(T_zPsm_BootStage stage)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_BootStateFlag = stage;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetBootStage

+* ¹¦ÄÜÃèÊö£º»ñȡϵͳ³õʼ»¯Íê³É±ê־λ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÏµÍ³³õʼ»¯Íê³É±ê־λ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+T_zPsm_BootStage zOss_GetBootStage(void)

+{

+    ZOSS_INTR old_intr;

+    T_zPsm_BootStage stage;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    stage = g_zPsm_BootStateFlag;

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return stage;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetPSMAppIdle

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Ë¯ÃßÁ÷³ÌÓ¦ÓÃΪ¿ÕÏÐ״̬£¬×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦Óã»

+* ²ÎÊý˵Ã÷£º(IN)

+*               appId:Ó¦ÓÃÉèÖÃÔÊÐí¿ÕÏеÄÓ¦ÓÃid

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetPSMAppIdle(UINT32 appId)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_AppIdleFlag = g_zPsm_AppIdleFlag & (~ (1 << appId));

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetPSMAppActive

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Ë¯ÃßÁ÷³ÌÓ¦ÓÃΪ·±Ã¦×´Ì¬£¬×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦ÓÃ

+* ²ÎÊý˵Ã÷£º(IN)

+*               appId:Ó¦ÓÃÉèÖÃÔÊÐí·±Ã¦µÄÓ¦ÓÃid

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetPSMAppActive(UINT32 appId)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_AppIdleFlag = g_zPsm_AppIdleFlag | (1 << appId);

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetSleepFuncOpt 

+* ¹¦ÄÜÃèÊö£ºË¯Ãß¹³×Óº¯Êý£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               beforeHook: ˯Ãßǰ¹³×Óº¯Êý£»

+*               afterHook:  ˯Ãߺó¹³×Óº¯Êý£»

+*           (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÃ»ÓÐʹÓõĹ³×Óº¯Êý×¢²áΪNULL¡£ 

+**************************************************************************/

+VOID zOss_SetSleepHookOpt(psm_SleepInitHook  initHook, psm_SleepFinishHook  finishHook, psm_SleepBeforeHook  beforeHook, psm_SleepAfterHook afterHook)

+{

+    if (initHook != NULL)

+        g_zPsm_SleepInitHook    = initHook;

+

+    if (finishHook != NULL)

+        g_zPsm_SleepFinishHook  = finishHook;   

+    

+    if (beforeHook != NULL)

+        g_zPsm_SleepBeforeHook  = beforeHook;

+

+    if (afterHook != NULL)

+        g_zPsm_SleepAfterHook   = afterHook;    

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RegSleepCompensateFunc 

+* ¹¦ÄÜÃèÊö£ºË¯Ãßʱ¼ä²¹³¥×¢²áº¯Êý£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               funcOpt: ×¢²á²¹³¥º¯Êý£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»ØÊ¡µç²¹³¥ID;

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+ZOSS_COMPENSATE_ID zOss_RegSleepCompensateFunc(psm_CompensateHook funcOpt)

+{

+    ZOSS_INTR old_intr;

+    T_zPsm_CompensateNode *pCmpnstNode = (T_zPsm_CompensateNode *)zOss_Malloc(sizeof(T_zPsm_CompensateNode));

+

+    zOss_AssertEx(pCmpnstNode != NULL, NULL);

+    zOss_Memset(pCmpnstNode, 0, sizeof(T_zPsm_CompensateNode));

+    ZOSS_SAVE_IRQ(old_intr);  

+    pCmpnstNode->psm_CompensateHook = funcOpt;

+    zOss_ListAdd(&g_zPsm_CmpnstFuncList, &(pCmpnstNode->node));

+    ZOSS_RESTORE_IRQ(old_intr); 

+

+    return (ZOSS_COMPENSATE_ID )pCmpnstNode;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_DeregSleepCompensateFunc 

+* ¹¦ÄÜÃèÊö£ºË¯Ãßʱ¼ä²¹³¥×¢Ïúº¯Êý£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               pPsmCmpnstID: Ê¡µç²¹³¥ID;

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_DeregSleepCompensateFunc(ZOSS_COMPENSATE_ID psmCmpnstId)

+{

+    ZOSS_INTR old_intr;

+    T_zPsm_CompensateNode *pCmpnstNode = (T_zPsm_CompensateNode *)psmCmpnstId;

+

+    ZOSS_SAVE_IRQ(old_intr); 

+    zOss_ListDelete(&g_zPsm_CmpnstFuncList, &(pCmpnstNode->node));

+    ZOSS_RESTORE_IRQ(old_intr); 

+    zOss_Free(psmCmpnstId);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_CompensateTicks

+* ¹¦ÄÜÃèÊö£º²¹³¥²Ù×÷ϵͳticksÖµ£»µ¥Î»:tick£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»Ø²¹³¥µÄticksÖµ£»

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_CompensateTicks(VOID)

+{

+    ZOSS_INTR old_intr;

+    UINT32 ticks = 0;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    ticks = g_zPsm_SleepTicksTime/ZOSS_MS_PER_TICK;

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ticks;     

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ClearSleepTime

+* ¹¦ÄÜÃèÊö£ºÇå³ý˯Ãßʱ¼ä£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_ClearSleepTime(VOID)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_SleepTime = 0;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmAdjustFreq312M

+* ¹¦ÄÜÃèÊö£º½â¾öϵͳÔÚ¶¯Ì¬´´½¨Ï̲߳¢Í˳öÏß³Ìʱ£¬ARMÖ÷ƵΪ78MÇé¿öÏ£¬·¢ÉúµÄose_heapdÏß³Ì

+*           ËøÖжϴóÓÚ400usµ¼ÖµÄGP0¶ÏÑÔÎÊÌ⣬ÔÚ·¢ÉúÕâÖÖÇé¿öµÄʱºò£¬°ÑÖ÷Ƶµ÷Õûµ½312M,

+*           È»ºóÓɶ¯Ì¬µ÷Ƶģ¿é¸ºÔð°ÑÖ÷Ƶµ÷Õû»ØÈ¥¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º ZOSS_SUCCESS

+* ÆäËü˵Ã÷£º ¸Ãº¯Êý½ö½öÔÚzOss_ExitThreadº¯ÊýÖÐʹÓÃ

+************************************************************************/

+#ifdef _OS_OSE

+UINT32 zOss_PsmAdjustFreq312M(VOID)

+{

+    if (zDrvPow_GetPsCoreFreq() < CLK312M)

+    {

+        zDrvPow_SetArmPsCoreFreq(CLK312M);

+        

+#ifdef _USE_CPU_DFM

+        psm_DfmWakeUpReset();

+#endif

+        g_zPsm_CurCpuFreq = CLK312M;

+    }

+

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef _OS_LINUX

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmInitHook

+* ¹¦ÄÜÃèÊö£ºË¯Ãß³õʼ»¯¹³×Óº¯Êý¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_PsmInitHook(VOID)

+{ 

+    if (g_zPsm_SleepInitHook != NULL)

+        g_zPsm_SleepInitHook();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmFinshHook

+* ¹¦ÄÜÃèÊö£ºË¯Ãß½áÊø¹³×Óº¯Êý¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_PsmFinshHook(VOID)

+{ 

+    if (g_zPsm_SleepFinishHook != NULL)

+        g_zPsm_SleepFinishHook();

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmBootSleep

+* ¹¦ÄÜÃèÊö£ºboot˯ÃßÈë¿Úº¯Êý¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_PsmBootSleep(VOID)

+{

+    if(!g_zPsm_BooTSleepFlag)

+    {

+        if (g_zPsm_SleepInitHook != NULL)

+            g_zPsm_SleepInitHook();

+    

+         psm_BootSleep();  

+        

+        g_zPsm_BooTSleepFlag = TRUE;

+        printk("psm_BootSleep");

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_IdleEnter

+* ¹¦ÄÜÃèÊö£ºË¯Ãß´¦ÀíÈë¿Úº¯Êý¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_PsmEnter(VOID)

+{ 

+#ifdef _USE_PSM_TEST

+    if(zSys_SetR7SleepType(R7_PLAT_NO_SLEEP))

+		return;

+#endif

+

+    if (psm_CampOnSleepCheck())                   // ÓÐÍøË¯ÃßÁ÷³Ì;

+    {

+        psm_CampOnSleep();

+    }

+    else if(zPS_umm_IsLossOfCoverage())           // ¶ªÊ§¸²¸Ç˯ÃßÁ÷³Ì;

+    {

+        psm_LossCoverageSleep();

+    }

+    else if(zAti2_PsIsInFlyMode())                // ·ÉÐÐģʽ˯ÃßÁ÷³Ì;                

+    {

+        psm_AirplaneSleep();

+    }

+	else

+	    zDrvPow_Sleep_Func(KERNEL_SLEEP_MODE, 0); //ÆäËüģʽ¶¼²»Âú×ã½øÈëµ½ÄÚºËÊ¡µç

+}

+

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_PsmTraceInfo

+* ¹¦ÄÜÃèÊö£º Êä³öpsmµÄµ÷ÊÔÐÅÏ¢

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_PsmTraceInfo(VOID)

+{

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL,"GsmAttemptFlag = %d, GsmFlag = %d, PsFlag = %d, PlatFlag = %d, AppFlag = %d, DrvFlag = %d",

+                zGsml1_AttemptSleep(FALSE), !zGsml1_PsmIdleFlag(), zPs_PsmIdleFlag(), Psm_PlatIdleFlag(), psm_AppIdleFlag(), zDrvPow_PsmIdleFlag());

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL,"GsmSleepTime = %d, PsSleepTime = %d", zGsml1_PsmGetSleepTime(), zOss_GetPs_SleepTimer());

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL,"SleepTicks = %d", g_zPsm_SleepTicksTime);

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL,"CampON = %d, LossOfCoverage = %d, FlyMode = %d", psm_CampOnCheck(), zPS_umm_IsLossOfCoverage(),

+                zAti2_PsIsInFlyMode());

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL,"TickCnt = %d", zOss_GetTickCount());

+}

+#ifdef _USE_CPU_DFM

+

+/******************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ApplyCpuFreq

+* ¹¦ÄÜÃèÊö£ºÁ¢¼´µ÷Ƶº¯Êý

+* ²ÎÊý˵Ã÷£º(IN)         

+*               appid:Á¢¼´µ÷ƵID;

+*               isUsed:TRUEʱ½øÐÐÉýƵ£¬FALSEʱ½øÐнµÆµ²Ù×÷;

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£¬Ê§°Ü·µ»ØZOSS_ERROR£»

+* ÆäËü˵Ã÷£ºÔÚÏß³ÌÉÏÏÂÎÄÖÐʹÓã»

+**************************************************************************/

+UINT32 zOss_ApplyCpuFreq(UINT32 appId, BOOL isUsed)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    if (isUsed)

+    {

+        if (!g_zPsmCfg->minClk[appId].isUsed)

+        {

+            g_zPsm_MinCpuFreq += g_zPsmCfg->minClk[appId].cpuClk;

+        }

+    }

+    else

+    {

+        if (g_zPsmCfg->minClk[appId].isUsed)

+        {

+            g_zPsm_MinCpuFreq -= g_zPsmCfg->minClk[appId].cpuClk;

+        }

+    }

+    

+    g_zPsmCfg->minClk[appId].isUsed = isUsed;

+    if (g_zPsm_MinCpuFreq > g_zPsm_CurCpuFreq)

+    {

+        SINT32 retCode    = DRV_SUCCESS; 

+

+        g_zPsm_CurCpuFreq = psm_FindMinCpuFreq();

+        retCode           = zDrvPow_SetArmPsCoreFreq(g_zPsm_CurCpuFreq);

+        zOss_AssertEx(retCode == DRV_SUCCESS, ZOSS_ERROR);

+        psm_ClearIIT();

+    } 

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetIgnoreThreadTimeRate 

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ìʱ¼ä±ÈÀý(ºöÂÔÏ̵߳ÄÖ´ÐÐʱ¼ä¶à´ó±ÈÀý×÷ΪidleÏ̵߳Äʱ¼ä)

+* ²ÎÊý˵Ã÷£º(IN)

+*               timeRate: ʱ¼ä±ÈÀý

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_SetIgnoreThreadTimeRate(FLOAT timeRate)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_IgnoreThreadTimeRate = timeRate;

+    ZOSS_RESTORE_IRQ(old_intr); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ThreadSwapInPsmHook 

+* ¹¦ÄÜÃèÊö: Ïß³ÌÇÐÈëʱµÄÊ¡µç¹³×Ó 

+* ²ÎÊý˵Ã÷: (IN)  

+*               user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_ThreadSwapInPsmHook(T_ZOsa_ThreadUserArea *user_area)

+{

+    ZOSS_INTR   old_intr;

+    UINT32      past_time       = 0;

+    UINT32      current_time    = 0;

+    

+    zOss_AssertExN(user_area != NULL);

+    ZOSS_SAVE_IRQ(old_intr);

+    current_time          = Osa_HwTimeRead();

+    past_time             = current_time - g_zPsm_SwapLastTime;

+    g_zPsm_SumCpuTime     += past_time;

+    user_area->psmCpuTime += past_time;

+    g_zPsm_CurThread      = user_area->threadid;

+    g_zPsm_SwapLastTime   = current_time;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_THreadSwapOutPsmHook 

+* ¹¦ÄÜÃèÊö: Ïß³ÌÇгöʱµÄÊ¡µç¹³×Ó

+* ²ÎÊý˵Ã÷: (IN)  

+*               user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*           (OUT)  

+*               ÎÞ

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_ThreadSwapOutPsmHook(T_ZOsa_ThreadUserArea *user_area)

+{

+    ZOSS_INTR   old_intr;

+    UINT32      past_time       = 0;

+    UINT32      current_time    = 0;

+

+    zOss_AssertExN(user_area != NULL);

+    ZOSS_SAVE_IRQ(old_intr);

+    current_time          = Osa_HwTimeRead();

+    past_time             = current_time - g_zPsm_SwapLastTime;

+    g_zPsm_SumCpuTime     += past_time;

+    user_area->psmCpuTime += past_time;

+    g_zPsm_CurThread      = NULL;

+    g_zPsm_SwapLastTime   = current_time;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RecordPsmLastSwapTime 

+* ¹¦ÄÜÃèÊö: ¼Ç¼ʡµç×îºóÒ»´ÎÏß³ÌÇл»µÄʱ¼ä£»

+* ²ÎÊý˵Ã÷: (IN)  

+*               ÎÞ    

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_RecordPsmLastSwapTime(VOID)

+{

+    ZOSS_INTR old_intr  = 0;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_SwapLastTime = Osa_HwTimeRead();

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_DfmSettingInit

+* ¹¦ÄÜÃèÊö: ¶¯Ì¬µ÷Ƶ»·¾³³õʼ»¯£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ 

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: 

+**************************************************************************/

+VOID zOss_DfmSettingInit(VOID)

+{   

+    ZOSS_INTR old_intr;

+                    

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_DfmFinishFlag = FALSE; 

+    ZOSS_RESTORE_IRQ(old_intr); 

+    

+    psm_SetIgnoreThread();

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    psm_ClearThreadCpu();

+    g_zPsm_SumCpuTime    = 0;

+    g_zPsm_DfmFinishFlag = TRUE; 

+    g_zPsm_SwapLastTime  = Osa_HwTimeRead();

+    ZOSS_RESTORE_IRQ(old_intr); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetIgnoreThread

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£º(IN)

+                thread : Ïß³ÌID;

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_SetIgnoreThread(ZOSS_THREAD_ID threadId)

+{

+    ZOSS_INTR old_intr;  

+

+    if (threadId == NULL)

+        return;

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_IgnoreThreadId[g_zPsm_IgnoreThreadIndex++] = threadId;

+    ZOSS_RESTORE_IRQ(old_intr); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_CpuIntRoutine

+* ¹¦ÄÜÃèÊö£º ´¥·¢cpu¶¯Ì¬µ÷Ƶ²É¼¯º¯Êý

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _OS_TOS

+VOID zOss_DfmIntRoutine(VOID)

+{

+    static UINT32 psmCpuCount = 0;

+    

+    if(g_zPsm_DfmFinishFlag)

+    {

+        if(++psmCpuCount >= g_zPsmCfg->dfmPeriod)

+        {

+           psmCpuCount = 0;

+           psm_InterruptRoutine(1);

+        }

+    }

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_Dfm_TraceInfo

+* ¹¦ÄÜÃèÊö£º Êä³ödfmµÄµ÷ÊÔÐÅÏ¢

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_DfmTraceInfo(VOID)

+{

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "CurFreq = %d, DfmCnt = %d", g_zPsm_CurCpuFreq, g_zPsm_DfmCnt);

+    if (g_zPsm_DfmCnt > 0)

+    {

+        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "ait = %d, DesFreq = %d, MinFreq = %d", g_zPsm_SumIIT/g_zPsm_DfmCnt, psm_FindDesCpuFreq((100 - g_zPsm_SumIIT/g_zPsm_DfmCnt), g_zPsm_CurCpuFreq),

+                    psm_FindMinCpuFreq());

+    }

+}

+

+#endif  // #ifdef _USE_CPU_DFM

+

+#endif  // #ifdef _USE_PSM

+

diff --git a/cp/ps/plat/src/oss/psm/src/psm_297520v3.c b/cp/ps/plat/src/oss/psm/src/psm_297520v3.c
new file mode 100644
index 0000000..d450dcf
--- /dev/null
+++ b/cp/ps/plat/src/oss/psm/src/psm_297520v3.c
@@ -0,0 +1,1980 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2013 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : psm_297520V2.c

+* ÎÄ ¼þ Ãû : psm_2975V2.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Ê¡µç¹ÜÀí(power save manager)

+* ×÷    Õß : ¸ß»ª·å

+* °æ    ±¾ : V0.1

+* Íê³ÉÈÕÆÚ : 2013.11.15

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+#ifdef _USE_PSM

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "drvs_pow.h"

+#include "drvs_pwr.h"

+#include "drvs_ret.h"

+#include "sup.h"

+#include "osa.h"

+#ifdef _USE_PSM_TEST

+#include "sys_func_atcfg.h"

+#endif

+#ifdef _OS_LINUX

+#include <linux/time.h>

+#include <linux/sched.h>

+#endif

+#include "oss_pub.h"

+#include "ram_config.h"

+

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_PSM_THREAD_TOTAL_TIME_MIN          3000

+#define ZOSS_PSM_IGNORE_THREAD_TOTAL_TIME_MIN   1000

+#define ZOSS_PSM_IDLE_CPU_LOAD                  70

+#define ZOSS_PSM_IDLE_FLAG_NR                  7

+/**************************************************************************

+* Íⲿº¯ÊýºÍ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+//gsml1 ÌṩµÄº¯Êý£»

+#ifdef _USE_L1G

+extern BOOL   zGsml1_AttemptSleep(VOID);

+extern UINT32 zGsml1_PsmGetSleepTime(VOID);

+extern BOOL   zGsml1_PsmIdleFlag(VOID);

+extern BOOL   zGsml1_PsmGetCampon(VOID);

+#else

+static inline BOOL   zGsml1_AttemptSleep(VOID)

+{

+    return TRUE;

+}

+static inline UINT32 zGsml1_PsmGetSleepTime(VOID)

+{

+    return 0xFFFFFFFF;

+}

+static inline BOOL   zGsml1_PsmIdleFlag(VOID)

+{

+    return FALSE;

+}

+static inline BOOL   zGsml1_PsmGetCampon(VOID)

+{

+    return TRUE;

+}

+#endif

+

+//ЭÒéÕ»ÌṩµÄº¯Êý£»

+extern BYTE   zPs_IsGsmMasterMode(VOID);

+extern BOOL   zPs_PsmIdleFlag(VOID);

+extern BOOL   zAti2_PsIsInFlyMode(VOID);

+extern BOOL   zAti2_PsRfNotOpen(VOID);

+extern BYTE   zPS_umm_IsLossOfCoverage(VOID);

+extern UINT32 zL1e_TaskIsIdlePrint(VOID);

+extern UINT32 zL1w_TaskIsIdlePrint(VOID);

+extern UINT32 zL1t_TaskIsIdlePrint(VOID);

+

+//Çý¶¯ÌṩµÄº¯Êý£»

+extern BOOL   zDrvPow_PsmGetCampon(VOID);

+extern BOOL   zDrvPow_PsmIdleFlag(VOID);

+extern UINT32 zDrvPow_PsmIdleFlagGet(VOID);

+extern UINT32 zDrvPow_PsmDeepSleepCnt(VOID);

+

+extern UINT32 psm_AppIdleFlagGet(VOID);

+extern VOID zOss_TimerCompensate(UINT32 sleepTime);

+extern UINT64 gTimer_CurTime;

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/*ʱ¼ä²¹³¥½á¹¹Ìå*/

+typedef struct

+{

+    T_ZOss_Node         node;

+    psm_CompensateHook  psm_CompensateHook;

+} T_zPsm_CompensateNode;

+

+#ifdef _USE_CPU_DFM

+typedef enum

+{

+    PSM_PULL_CPUFREQ,   /* ÉýƵÁ½¼¶ */

+    PSM_UP_CPUFREQ,     /* ÉýƵһ¼¶ */

+    PSM_DOWN_CPUFREQ    /* ½µÆµ     */

+} T_zPsm_FmScope;

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID   psm_IdleThreadEntry(SINT32 ignore);

+static BOOL   psm_CampOnSleepCheck(VOID);

+static VOID   psm_CampOnSleep(VOID);

+static VOID   psm_LossCoverageSleep(VOID);

+static VOID   psm_AirplaneSleep(VOID);

+static VOID   psm_NoCfunSleep(VOID);

+static BOOL   psm_CampOnCheck(VOID);

+static VOID   psm_SleepTimeCompensate(UINT32 sleepTime);

+static VOID   psm_PowerOnSleep(VOID);

+static VOID   psm_BootSleep(VOID);

+static BOOL   psm_CheckSleepTime(BOOL modeHaveGsm);

+static BOOL   psm_CheckSleepFlag(VOID);              

+static BOOL   psm_SleepCheck(VOID);

+static VOID   psm_CompensateTicks(UINT32 sleepTime);

+static VOID   psm_CompensateTimer(UINT32 sleepTime);

+#ifdef _OS_LINUX

+static VOID   psm_CompensateTimeKeeper(UINT32 sleepTime);

+#endif

+static BOOL   psm_AppIdleFlag(VOID);

+static UINT32 psm_GetPreSleepTime(VOID);

+static BOOL   Psm_PlatIdleFlag(VOID);

+

+#ifdef _USE_CPU_DFM

+static UINT32 psm_GetIgnoreThreadTime(VOID);

+static VOID   psm_GetIdleCpuLoad(UINT32 *pIdleCpuLoad);

+static VOID   psm_ClearIIT(VOID);

+static UINT32 psm_GetDesCpuFreq(UINT32 curCpuFreq, UINT32 dfmFlag);

+static UINT32 psm_FindDesCpuFreq(UINT32 cpuload, UINT32 curCpuFreq);

+static UINT32 psm_FindMinCpuFreq(VOID);

+static VOID   psm_InterruptRoutine(SINT32 args);

+static VOID   psm_SetIgnoreThread(VOID);

+static UINT32 psm_GetCpuFreq(UINT32 ait);

+static UINT32 psm_GetAIT(UINT32 idleThreadCpu);

+static VOID   psm_ClearThreadCpu(VOID);

+static VOID   psm_DfmWakeUpReset(VOID);

+#endif

+extern VOID zDrvPow_PwrDownModem(VOID);

+extern VOID zDrvPow_DisPcuWakeInt(VOID);

+extern void pm_set_pcu_poweroff(UINT32 sleep_time);

+extern void gadget_disable(void);

+typedef int suspend_state_t;

+extern int pm_suspend(suspend_state_t state);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+T_zPsm_Param    *g_zPsmCfg               = NULL;

+UINT32          g_zPsm_SleepTime         = 0;   /* ϵͳÐÝÃßʱ¼ä                 */

+UINT32          g_zPsm_CurCpuFreq        = 0;   /* µ±Ç°Ö÷Ƶ                     */

+

+#ifdef _USE_CPU_DFM

+static  UINT32  g_zPsm_SwapLastTime      = 0;

+UINT32          g_zPsm_SumCpuTime        = 0;        

+ZOSS_THREAD_ID  g_zPsm_CurThread         = NULL;

+ZOSS_THREAD_ID  *g_zPsm_IgnoreThreadId   = NULL;

+#endif

+

+static UINT32   g_zPsm_AppIdleFlag       = 0;   /* Ó¦ÓÿÕÏбêÖ¾·û£¬¿ØÖÆË¯ÃßÁ÷³Ì */

+static UINT32   g_zPsm_PreSleeptime      = 0;   /* ¼ÆËãÔ¤ÆÚµÄ˯Ãßʱ¼ä           */

+static ZOSS_THREAD_ID g_zPsm_PsmThreadId = NULL;

+static UINT32   g_zPsm_SleepTicksTime    = 0;   /* ÓÃÓÚ²¹³¥ticksÖµµÄ˯Ãßʱ¼ä    */

+static T_ZOss_List g_zPsm_CmpnstFuncList = {0}; /* ¸÷Ä£¿é²¹³¥º¯ÊýµÄÁ´±í         */

+static psm_SleepInitHook   g_zPsm_SleepInitHook         = NULL;

+static psm_SleepFinishHook g_zPsm_SleepFinishHook       = NULL;

+static psm_SleepBeforeHook g_zPsm_SleepBeforeHook       = NULL;

+static psm_SleepAfterHook  g_zPsm_SleepAfterHook        = NULL;

+static volatile T_zPsm_BootStage g_zPsm_BootStateFlag   = PSM_BOOT_DEFAULT; /* ϵͳÆô¶¯½×¶Î±ê־λ */

+

+#ifdef _USE_CPU_DFM

+static BOOL     g_zPsm_DfmFlag              = FALSE;

+static UINT32   g_zPsm_IITCnt               = 0;

+static UINT32   g_zPsm_DfmCnt               = 0;

+static UINT32   g_zPsm_SumIIT               = 0;

+static UINT32   g_zPsm_MinCpuFreq           = 0;

+static BOOL     g_zPsm_DfmFinishFlag        = FALSE;

+static SINT32   *g_zPsm_IIT                 = NULL;

+static FLOAT    g_zPsm_IgnoreThreadTimeRate = 0.6;

+static UINT32   g_zPsm_IgnoreThreadIndex    = 0;

+#endif

+

+#ifdef _OS_LINUX

+static BOOL     g_zPsm_BooTSleepFlag = FALSE;

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_IdleThreadEntry

+* ¹¦ÄÜÃèÊö£ºÊ¡µçÏß³ÌÈë¿Ú

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_IdleThreadEntry(SINT32 ignore)

+{

+    if (g_zPsm_SleepInitHook != NULL)

+        g_zPsm_SleepInitHook();

+    

+    psm_BootSleep();

+    

+    for( ; ; )

+    {

+#ifdef _USE_PSM_TEST

+        if(!zSys_SetR7SleepType(R7_PLAT_NO_SLEEP))

+#endif

+        {

+        	/*1¡¢ÏÈcheck psÒÔ¼°l1gÊÇ·ñפÁô*/

+			/*2¡¢µ÷ÓÃl1g˯Ãߺ¯Êý£¬ÅжÏPS/PLAT/APP/DRVÊÇ·ñÂú×ã˯Ãß*/

+			/*3¡¢»ñÈ¡l1gºÍpsÔÊÐíÐÝÃßʱ¼ä*/

+			/*4¡¢ÅжÏL1G/PS/PLAT/APP/DRVÊÇ·ñÂú×ã˯Ãß*/

+            if (psm_CampOnSleepCheck())                   // ÓÐÍøË¯ÃßÁ÷³Ì;

+            {

+                psm_CampOnSleep();

+            }

+			/*1¡¢ÏÈcheckÊÇ·ñ¶ªÊ§¸²¸Ç*/

+			/*2¡¢µ÷ÓÃl1g˯Ãߺ¯Êý£¬ÅжÏPS/PLAT/APP/DRVÊÇ·ñÂú×ã˯Ãß*/

+			/*3¡¢ÅжÏL1G/PS/PLAT/APP/DRVÊÇ·ñÂú×ã˯Ãß*/

+			/*4¡¢»ñÈ¡psÔÊÐíÐÝÃßʱ¼ä*/

+            else if(zPS_umm_IsLossOfCoverage())           // ¶ªÊ§¸²¸Ç˯ÃßÁ÷³Ì;

+            {

+                psm_LossCoverageSleep();

+            }

+			/*1¡¢ÏÈcheckÊÇ·ñ·ÉÐÐģʽ*/

+			/*2¡¢µ÷ÓÃl1g˯Ãߺ¯Êý£¬ÅжÏPS/PLAT/APP/DRVÊÇ·ñÂú×ã˯Ãß*/

+			/*3¡¢ÅжÏL1G/PS/PLAT/APP/DRVÊÇ·ñÂú×ã˯Ãß*/

+			/*4¡¢»ñÈ¡psÔÊÐíÐÝÃßʱ¼ä*/

+            else if(zAti2_PsIsInFlyMode())            // ·ÉÐÐģʽ˯ÃßÁ÷³Ì£»                

+            {

+                psm_AirplaneSleep();

+            }

+			/*1¡¢ÏÈcheckÉ䯵ÊÇ·ñ´ò¿ª*/

+			/*2¡¢µ÷ÓÃl1g˯Ãߺ¯Êý£¬ÅжÏPS/PLAT/APP/DRVÊÇ·ñÂú×ã˯Ãß*/

+			/*3¡¢ÅжÏL1G/PS/PLAT/APP/DRVÊÇ·ñÂú×ã˯Ãß*/

+			/*4¡¢»ñÈ¡psÔÊÐíÐÝÃßʱ¼ä*/

+			/*5¡¢Æô¶¯5Ã붨ʱÆ÷£¬5ÃëºóÔÊÐíÐÝÃß*/

+            else if(zAti2_PsRfNotOpen())             // Éϵ粻¿ª»ú˯ÃßÁ÷³Ì

+            {

+                psm_NoCfunSleep();

+            }

+        

+            zDrvPow_Sleep_Func(KERNEL_SLEEP_MODE, 0);     // ÆäËüģʽ¶¼²»Âú×ã½øÈëµ½ÄÚºËÊ¡µç;

+        }

+        

+        if (g_zPsm_SleepFinishHook != NULL)

+            g_zPsm_SleepFinishHook();

+    }

+}

+

+/*Ê×Ïȵ÷Óøú¯Êý£¬ÔÚ¿ªÖжϻ·¾³Öе÷ÓÃ*/

+VOID psm_ModemDevSleep(VOID)

+{

+	zGsml1_AttemptSleep();

+}

+

+/*Æä´Îµ÷Óøú¯Êý£¬ÔÚ¹ØÖжϻ·¾³Öе÷ÓÃ*/

+BOOL psm_ModemSleepCheck(VOID)

+{

+	return psm_CheckSleepFlag();

+}

+

+/*×îºóµ÷Óøú¯Êý£¬ÔÚ¹ØÖжϻ·¾³Öе÷ÓÃ*/

+UINT32 psm_ModemSleepTimeGet(VOID)

+{

+	return min(zGsml1_PsmGetSleepTime(), zOss_GetPs_SleepTimer());

+}

+

+/*******************************************************************************

+ * Function: psm_AllSleep

+ * Description: the stub sleep function, only used for amt test

+ * Parameters:

+ *   Input: N/A

+ *

+ *   Output: N/A

+ * Returns: 

+ * Others:  //not use

+ ********************************************************************************/

+void psm_AllSleep(void)

+{

+    ZOSS_INTR old_intr;

+

+    //ÉèÖÃ3G 4G modem ¸÷µçÔ´·ÖÇø¶Ïµç

+    zDrvPow_PwrDownModem();

+    

+    // ÉèÖÃZSP bypass

+    pow_ZspBypassClosePwrDomain();

+#ifdef _USE_L1G    

+    //ÉèÖÃGSM˯Ãß¡¢ÉäÆµÊ¡µç

+    l1g_allSleep();

+#endif

+

+#ifdef _OS_LINUX

+    //ÔÚ½øÈësuspend֮ǰ£¬¹Ø±ÕUSB

+    gadget_disable();

+#endif

+

+    //¹Ø±ÕÏà¹ØµçÔ´·ÖÇø¶Ïµç

+    zDrvpow_SetPwrGate(EDCP_PWR, POW_DISABLE);

+    zDrvpow_SetPwrGate(USB_HSIC_PWR, POW_DISABLE);

+    zDrvpow_SetPwrGate(USB_CTRL_PWR, POW_DISABLE);

+

+    //PS cpu deepsleep˯Ãß

+    ZOSS_SAVE_IRQ(old_intr); 

+

+    #ifdef _OS_LINUX

+    if (need_resched())

+    {

+        ZOSS_RESTORE_IRQ(old_intr);  

+        return;

+    }		 

+    #endif

+    //zDrvInt_MaskIrq(TIMER0_INT);

+    zDrvPow_DisPcuWakeInt();

+#if defined(_OS_LINUX) && (defined CONFIG_PM)

+    pm_set_pcu_poweroff(0xffffffff);

+    pm_suspend((suspend_state_t)3);

+#endif    

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+

+#if defined(_OS_LINUX) && (defined CONFIG_PM)

+extern void pm_psm_flag_print(UINT32 *sleepflag);

+#endif

+VOID psm_GetModemSleepFlagStatus(VOID)

+{

+	UINT32 sleepFlagStatus[ZOSS_PSM_IDLE_FLAG_NR] = {0};	

+        sleepFlagStatus[0]  = zL1e_TaskIsIdlePrint();   // 1: bitλ¶ÔÓ¦Ìõ¼þÔÊÐí˯Ãß

+#ifdef PS_RAT_FDD

+        sleepFlagStatus[1]  = zL1w_TaskIsIdlePrint();  // 1: bitλ¶ÔÓ¦Ìõ¼þÔÊÐí˯Ãß

+#else

+        sleepFlagStatus[1] = 1;

+#endif

+#ifdef PS_RAT_TDD        

+        sleepFlagStatus[2]  = zL1t_TaskIsIdlePrint();    // 1: bitλ¶ÔÓ¦Ìõ¼þÔÊÐí˯Ãß

+#else

+        sleepFlagStatus[2] = 1;

+#endif        

+        sleepFlagStatus[3]  = zDrvPow_PsmIdleFlagGet();  //0: bitλ¶ÔÓ¦Ìõ¼þÔÊÐí˯Ãß

+        sleepFlagStatus[4]  = psm_AppIdleFlagGet();         //0: bitλ¶ÔÓ¦Ìõ¼þÔÊÐí˯Ãß

+        sleepFlagStatus[5]  = Psm_PlatIdleFlag();             //  1:ÔÊÐí˯Ãß

+        sleepFlagStatus[6]  = !zGsml1_PsmIdleFlag() ;    //  dwGsmFlg 1:ÔÊÐí˯Ãß

+#if defined(_OS_LINUX) && (defined CONFIG_PM)

+	 pm_psm_flag_print(sleepFlagStatus);  

+#endif

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_TimeCompensate

+* ¹¦ÄÜÃèÊö£ºË¯Ãßʱ¼ä²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime : ²¹³¥Ê±¼ä

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºº¯ÊýÔËÐÐÔÚËøÖжÏËùÖжÏÉÏÏÂÎÄÖУ¬¹Ê²»½øÐÐËøÖжϱ£»¤£»

+**************************************************************************/

+

+VOID psm_TimeCompensate(UINT32 sleepTime)

+{

+	psm_SleepTimeCompensate(sleepTime);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetPreSleepTime

+* ¹¦ÄÜÃèÊö£º¼ÆËãÔ¤ÆÚµÄ˯Ãßʱ¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£ºÔÚËø¶ÏÉÏÏÂÎÄʹÓÃÎÞÐèËøÖжϣ»

+************************************************************************/

+static UINT32 psm_GetPreSleepTime(VOID)   

+{

+    return g_zPsm_PreSleeptime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_BootSleep

+* ¹¦ÄÜÃèÊö£º¿ª»úÍê³Éǰʡµç´¦Àí

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚidleÏ̵߳÷Óã¬g_zPsmBootStateFlagʹÓó¡¾°¼òµ¥ÎÞÐè±£»¤£»

+**************************************************************************/

+static VOID psm_BootSleep(VOID) 

+{   

+    while (g_zPsm_BootStateFlag == PSM_BOOT_DEFAULT)

+        ;

+

+    while (!psm_CampOnCheck() && g_zPsm_BootStateFlag != PSM_BOOT_FINISH)

+    {

+        psm_PowerOnSleep();

+    }

+

+    g_zPsm_BootStateFlag = PSM_BOOT_FINISH;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CampOnSleepCheck

+* ¹¦ÄÜÃèÊö£ºÐ¡Çø×¤ÁôºóÕý³£Ë¯ÃßÁ÷³ÌÅжϺ¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ         

+* ·µ »Ø Öµ£º·µ»ØTRUE±íʾ¿ÉÒÔ½øÈë¸Ã˯Ãß,·µ»ØFALSE±íʾ²»ÄܽøÈë¸Ã˯ÃßÁ÷³Ì;

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_CampOnSleepCheck(VOID)

+{   

+    if (psm_CampOnCheck())

+    {

+        return psm_SleepCheck();

+    }

+

+    return FALSE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CampOnCheck

+* ¹¦ÄÜÃèÊö£ºÅжÏÊÇ·ñפÁôÍøÂç³É¹¦

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static BOOL psm_CampOnCheck(VOID)   

+{

+    return (zDrvPow_PsmGetCampon() || zGsml1_PsmGetCampon());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SleepCheck

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_SleepCheck(VOID)

+{

+    if (zGsml1_AttemptSleep() && zPs_PsmIdleFlag() && Psm_PlatIdleFlag() && psm_AppIdleFlag() && zDrvPow_PsmIdleFlag())

+    {

+        return TRUE;

+    }

+    return FALSE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_BootSleepCheck

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃß ÒÔ¼°½øÈëÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_BootSleepCheck(VOID)

+{

+    if (Psm_PlatIdleFlag() && psm_AppIdleFlag() && zDrvPow_PsmIdleFlag())

+    {

+        return TRUE;

+    }

+    return FALSE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CheckSleepTime

+* ¹¦ÄÜÃèÊö£ºÅжÏ˯Ãßʱ¼äÊÇ·ñÔÊÐíÐÝÃßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               modeHaveGsm : µ±Ç°ÏµÍ³Ä£Ê½ÊÇ·ñº¬ÓÐGSM,TRUE±íʾº¬ÓУ¬FALSE

+*                             ±íʾûÓУ»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º TRUE:Éî˯Ãߣ»FALSE:²»ÄܽøÈëÐÝÃß

+* ÆäËü˵Ã÷£º ÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static BOOL psm_CheckSleepTime(BOOL modeHaveGsm)

+{

+    g_zPsm_PreSleeptime = min(zGsml1_PsmGetSleepTime(), zOss_GetPs_SleepTimer());

+    return (g_zPsm_PreSleeptime > g_zPsmCfg->deepSleepTimeThreshold);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SleepMode

+* ¹¦ÄÜÃèÊö£º»ñȡʡµç˯Ãßģʽ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ         

+* ·µ »Ø Öµ£ºTURE:¿ÉÒÔ˯ÃßÁË£¬FALSE:²»ÄÜ˯Ãߣ»

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static BOOL psm_SleepMode(VOID)

+{

+    return (psm_CheckSleepTime(FALSE) && psm_CheckSleepFlag());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CheckSleepFlag

+* ¹¦ÄÜÃèÊö£ºÅжÏÄÜ·ñ½øÈëÐÝÃߵȴý

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߵȴý£»FALSE:²»ÄܽøÈëÐÝÃߵȴý

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_CheckSleepFlag(VOID)

+{

+    return (!zGsml1_PsmIdleFlag() && zDrvPow_PsmIdleFlag() && Psm_PlatIdleFlag() && psm_AppIdleFlag() && zPs_PsmIdleFlag());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_BootCheckSleepFlag

+* ¹¦ÄÜÃèÊö£ºÔÚBOOT sleep˯Ãß·½Ê½ÖÐÅжÏÄÜ·ñ½øÈëÐÝÃߵȴý

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºTRUE:¿ÉÒÔ½øÈëÐÝÃߵȴý£»FALSE:²»ÄܽøÈëÐÝÃߵȴý

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL psm_BootCheckSleepFlag(VOID)

+{

+    return (!zGsml1_PsmIdleFlag() && zDrvPow_PsmIdleFlag() && Psm_PlatIdleFlag() && psm_AppIdleFlag());

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SleepTimeCompensate

+* ¹¦ÄÜÃèÊö£ºË¯Ãßʱ¼ä²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime : ²¹³¥Ê±¼ä

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºº¯ÊýÔËÐÐÔÚËøÖжÏËùÖжÏÉÏÏÂÎÄÖУ¬¹Ê²»½øÐÐËøÖжϱ£»¤£»

+**************************************************************************/

+static VOID psm_SleepTimeCompensate(UINT32 sleepTime)

+{

+    T_zPsm_CompensateNode *pCmpnstNode = (T_zPsm_CompensateNode *)zOss_ListFirst(&g_zPsm_CmpnstFuncList);

+

+    while(pCmpnstNode != NULL)

+    {

+        pCmpnstNode->psm_CompensateHook(sleepTime);

+        pCmpnstNode = (T_zPsm_CompensateNode *)zOss_ListNext(&(pCmpnstNode->node));

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_PowerOnSleep

+* ¹¦ÄÜÃèÊö£º¿ª»úÍê³ÉǰµÄÊ¡µç´¦Àí

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_PowerOnSleep(VOID)

+{ 

+    ZOSS_INTR old_intr;

+  

+    if (!psm_BootSleepCheck())

+        return;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+        

+#ifdef _OS_LINUX

+    if (need_resched())

+    {

+        ZOSS_RESTORE_IRQ(old_intr);  

+        return;

+    }        

+#endif

+

+

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if ((g_zPsm_BootStateFlag == PSM_SYSINIT_FINISH) && psm_BootCheckSleepFlag())

+    {

+        UINT32 sleepTime   = zOss_GetPs_SleepTimer();  

+        if(sleepTime > g_zPsmCfg->deepSleepTimeThreshold)

+        {

+            g_zPsm_SleepTime = zDrvPow_Sleep_Func(BOOT_SLEEP_MODE, sleepTime);

+            psm_SleepTimeCompensate(g_zPsm_SleepTime);

+#ifdef _USE_CPU_DFM

+            psm_DfmWakeUpReset();

+#endif            

+        }

+    }

+

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);  

+    

+    if ((g_zPsmCfg->bootOverClk!= 0) && (g_zPsmCfg->bootOverClk != g_zPsm_CurCpuFreq))

+    {

+        zDrvPow_SetArmPsCoreFreq(g_zPsmCfg->bootOverClk);

+    }

+

+    zDrvPow_Sleep_Func(KERNEL_SLEEP_MODE, 0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_AirplaneSleep 

+* ¹¦ÄÜÃèÊö£º·ÉÐÐģʽ˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ                      

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_AirplaneSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+

+    if(!psm_SleepCheck())

+        return;

+

+    ZOSS_SAVE_IRQ(old_intr); 

+        

+#ifdef _OS_LINUX

+    if (need_resched())

+    {

+        ZOSS_RESTORE_IRQ(old_intr);  

+        return;

+    }        

+#endif

+

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if(psm_CheckSleepFlag() && zAti2_PsIsInFlyMode())

+    {

+        UINT32 timeLen   = min(g_zPsmCfg->airPlaneSleepTime, zOss_GetPs_SleepTimer());

+        g_zPsm_SleepTime = zDrvPow_Sleep_Func(AIRPLANE_SLEEP_MODE, timeLen);

+        psm_SleepTimeCompensate(g_zPsm_SleepTime);

+#ifdef _USE_CPU_DFM                    

+        psm_DfmWakeUpReset();

+#endif

+    }

+    

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_NoCfunSleep 

+* ¹¦ÄÜÃèÊö£ºÉϵ粻¿ª»ú״̬˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ                      

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_NoCfunSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+    UINT32 timeLen   = 0;

+

+    if(zOss_GetTickCount() >= 5000)    //Éϵ粻¿ª»ú£¬5sºó¿É˯Ãß

+    {

+        if(!psm_SleepCheck())

+            return;

+

+        ZOSS_SAVE_IRQ(old_intr); 

+            

+#ifdef _OS_LINUX

+        if (need_resched())

+        {

+            ZOSS_RESTORE_IRQ(old_intr);  

+            return;

+        }        

+#endif

+

+        if (g_zPsm_SleepBeforeHook != NULL)

+            g_zPsm_SleepBeforeHook();

+        

+        if(psm_CheckSleepFlag()&& zAti2_PsRfNotOpen()) 

+        {

+            timeLen = zOss_GetPs_SleepTimer();

+            g_zPsm_SleepTime = zDrvPow_Sleep_Func(DEEP_SLEEP_MODE, timeLen);

+            psm_SleepTimeCompensate(g_zPsm_SleepTime);

+            #ifdef _USE_CPU_DFM                    

+            psm_DfmWakeUpReset();

+            #endif

+        }

+        

+        if (g_zPsm_SleepAfterHook != NULL)

+            g_zPsm_SleepAfterHook();

+        

+        ZOSS_RESTORE_IRQ(old_intr);

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CampOnSleep

+* ¹¦ÄÜÃèÊö£º×¤ÁôºóµÄÕý³£Ë¯ÃßÁ÷³Ì

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_CampOnSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    

+#ifdef _OS_LINUX

+    if (need_resched())

+    {

+        ZOSS_RESTORE_IRQ(old_intr);  

+        return;

+    }        

+#endif

+

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if (psm_SleepMode())  

+    {

+        g_zPsm_SleepTime = zDrvPow_Sleep_Func(DEEP_SLEEP_MODE, psm_GetPreSleepTime());

+        psm_SleepTimeCompensate(g_zPsm_SleepTime);                  

+#ifdef _USE_CPU_DFM

+        psm_DfmWakeUpReset();

+#endif

+    }

+    

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);      

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_LossCoverageSleep

+* ¹¦ÄÜÃèÊö£º¶ªÊ§¸²¸Ç˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_LossCoverageSleep(VOID)

+{

+    ZOSS_INTR old_intr;

+

+    if(!psm_SleepCheck())

+        return;

+   

+    ZOSS_SAVE_IRQ(old_intr); 

+        

+#ifdef _OS_LINUX

+    if (need_resched())

+    {

+        ZOSS_RESTORE_IRQ(old_intr);  

+        return;

+    }        

+#endif

+

+    if (g_zPsm_SleepBeforeHook != NULL)

+        g_zPsm_SleepBeforeHook();

+    

+    if(psm_CheckSleepFlag())

+    {

+        UINT32 sleepTime   = zOss_GetPs_SleepTimer();    

+

+        if (zPS_umm_IsLossOfCoverage() && (sleepTime > g_zPsmCfg->deepSleepTimeThreshold))

+        {

+            g_zPsm_SleepTime = zDrvPow_Sleep_Func(LOSSCOVERAGE_SLEEP_MODE, sleepTime);

+            psm_SleepTimeCompensate(g_zPsm_SleepTime);

+#ifdef _USE_CPU_DFM                      

+            psm_DfmWakeUpReset();

+#endif

+        }

+    }

+    

+    if (g_zPsm_SleepAfterHook != NULL)

+        g_zPsm_SleepAfterHook();

+    

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CompensateOssSleepTime 

+* ¹¦ÄÜÃèÊö£ºÆ½Ì¨Ö§³ÅticksÖµ²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime: ²¹³¥Ê±¼ä,µ¥Î»:ms£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_CompensateTicks(UINT32 sleepTime)

+{

+#ifdef _OS_TOS

+    cyg_add_current_time(sleepTime/ZOSS_MS_PER_TICK);

+#else

+    g_zPsm_SleepTicksTime += sleepTime;    

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CompensateOssSleepTime 

+* ¹¦ÄÜÃèÊö£ºÆ½Ì¨Ö§³Å¶¨Ê±Æ÷²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime: ²¹³¥Ê±¼ä,µ¥Î»:ms£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_CompensateTimer(UINT32 sleepTime)

+{

+   zOss_TimerCompensate(sleepTime);

+}

+

+#ifdef _OS_LINUX

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_CompensateTimeKeeper 

+* ¹¦ÄÜÃèÊö£ºTimeKeeper²¹³¥£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               sleepTime: ²¹³¥Ê±¼ä,µ¥Î»:ms£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+

+static VOID psm_CompensateTimeKeeper(UINT32 sleepTime)

+{

+    struct timespec timesleep = {0};

+    

+    timesleep.tv_sec = sleepTime/1000;

+    timesleep.tv_nsec = 1000000 *(sleepTime%1000);

+    timekeeping_inject_sleeptime(&timesleep);  

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_AppIdleFlag 

+* ¹¦ÄÜÃèÊö£ºÅжÏÓ¦ÓÃÊÇ·ñ¿ÕÏУ»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÓ¦Óñê־λ£»

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static BOOL psm_AppIdleFlag(VOID)

+{

+    return (g_zPsm_AppIdleFlag == 0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_AppIdleFlag 

+* ¹¦ÄÜÃèÊö£ºÅжÏÓ¦ÓÃÊÇ·ñ¿ÕÏУ»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÓ¦Óñê־λ£»

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+UINT32 psm_AppIdleFlagGet(VOID)

+{

+    return g_zPsm_AppIdleFlag;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPsm_PlatIdleFlag 

+* ¹¦ÄÜÃèÊö£ºÅÐ¶ÏÆ½Ì¨ÊÇ·ñÔÊÐí˯Ãß

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÓ¦Óñê־λ£»

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£» 

+**************************************************************************/

+static BOOL Psm_PlatIdleFlag(VOID)

+{

+    return (g_zPsm_SleepTime == 0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPsm_CompensateInit 

+* ¹¦ÄÜÃèÊö£ºÊ¡µç²¹³¥³õʼ»¯£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID Psm_CompensateInit(VOID)

+{

+    zOss_ListInit(&g_zPsm_CmpnstFuncList);

+   // zOss_RegSleepCompensateFunc(psm_CompensateTicks);

+    zOss_RegSleepCompensateFunc(psm_CompensateTimer);

+#ifdef _OS_LINUX

+   // zOss_RegSleepCompensateFunc(psm_CompensateTimeKeeper);

+#endif

+}

+

+#ifdef _USE_CPU_DFM

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPsm_DfmInit 

+* ¹¦ÄÜÃèÊö£º¶¯Ì¬µ÷Ƶ³õʼ»¯£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID Psm_DfmInit(VOID)

+{

+    g_zPsm_CurCpuFreq = zDrvPow_GetPsCoreFreq();

+    g_zPsm_IIT = (SINT32 *)zOss_Malloc(sizeof(SINT32) * g_zPsmCfg->dfmCnt);

+    zOss_AssertExN(g_zPsm_IIT != NULL);

+    zOss_Memset(g_zPsm_IIT, 0, (sizeof(SINT32) * g_zPsmCfg->dfmCnt));

+    g_zPsm_IgnoreThreadId = (ZOSS_THREAD_ID *)zOss_Malloc(g_zPsmCfg->ignoreThreadCnt * sizeof(ZOSS_THREAD_ID));

+    zOss_AssertExN(g_zPsm_IgnoreThreadId != NULL);

+    zOss_Memset(g_zPsm_IgnoreThreadId, 0, g_zPsmCfg->ignoreThreadCnt * sizeof(ZOSS_THREAD_ID));   

+#ifdef _OS_OSE

+    start(create_process(OS_TI_PROC, "PSM_TIMER_ISR", (OSENTRYPOINT *)psm_InterruptRoutine, (OSADDRESS)1024 * 20,

+          (OSPRIORITY)g_zPsmCfg->dfmThrdPri, (OSTIME)g_zPsmCfg->dfmPeriod, (PROCESS)0, (struct OS_redir_entry *)NULL, (OSVECTOR)0, (OSUSER)0));

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_DfmWakeUpReset

+* ¹¦ÄÜÃèÊö£ºË¯ÃßÐÑÀ´ºóÒªÐèÒªÖØÐ¼ÆËãgPsm_AITµÈ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_DfmWakeUpReset(VOID) 

+{

+    g_zPsm_CurCpuFreq = zDrvPow_GetPsCoreFreq();

+    psm_ClearThreadCpu();

+    psm_ClearIIT();

+    g_zPsm_SumCpuTime   = 0;

+    g_zPsm_DfmFlag      = FALSE;

+    g_zPsm_SwapLastTime = Osa_HwTimeRead();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetIgnoreThreadTime

+* ¹¦ÄÜÃèÊö£º»ñÈ¡ºöÂÔÏ̵߳Äʱ¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 psm_GetIgnoreThreadTime(VOID)

+{

+    UINT32 psmIgnoreTime                = 0;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    SINT32              i               = 0;

+    

+    for (i = 0; i < g_zPsm_IgnoreThreadIndex; i++)

+    {

+        pPsmThreadUa = zOss_GetThreadUserArea(g_zPsm_IgnoreThreadId[i]);

+        if (pPsmThreadUa != NULL)

+        {

+            psmIgnoreTime += pPsmThreadUa->psmCpuTime;

+        }

+    }

+    

+    return psmIgnoreTime;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetIdleCpuLoad

+* ¹¦ÄÜÃèÊö£º»ñȡϵͳ¿ÕÏиºÔØ£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               idlecpuLoad: cpu¿ÕÏÐÂÊ£»

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_GetIdleCpuLoad(UINT32 *pIdleCpuLoad)

+{

+    SINT32 psmIgnoreTime                = 0; 

+    SINT32 totaltime                    = 0; 

+    SINT32 psmIdleTime                  = 0; 

+    SINT32 tmpIIT                       = 0; 

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    SINT32 tmpPsmTime                   = Osa_HwTimeRead() - g_zPsm_SwapLastTime;

+    

+    totaltime = g_zPsm_SumCpuTime + tmpPsmTime;

+    

+    if (totaltime < ZOSS_PSM_THREAD_TOTAL_TIME_MIN)

+    {

+        *pIdleCpuLoad = ZOSS_PSM_IDLE_CPU_LOAD;

+    }

+    else

+    {

+        if (g_zPsm_CurThread != NULL)

+        {

+            pPsmThreadUa =  zOss_GetThreadUserArea(g_zPsm_CurThread);

+            if (pPsmThreadUa != NULL)

+            {

+                pPsmThreadUa->psmCpuTime += tmpPsmTime ;

+            }

+        }

+        

+        pPsmThreadUa  = zOss_GetThreadUserArea(g_zPsm_PsmThreadId);

+        psmIdleTime   = pPsmThreadUa->psmCpuTime;

+        psmIgnoreTime = psm_GetIgnoreThreadTime();

+        if ((psmIgnoreTime > ZOSS_PSM_IGNORE_THREAD_TOTAL_TIME_MIN) || (psmIdleTime < psmIgnoreTime) || (totaltime - psmIgnoreTime == 0))

+        {

+            tmpIIT = (psmIdleTime + psmIgnoreTime * g_zPsm_IgnoreThreadTimeRate);

+            tmpIIT = (tmpIIT * 100) / totaltime;

+        }

+        else

+        {

+            tmpIIT = (psmIdleTime - psmIgnoreTime);

+            tmpIIT = (tmpIIT * 100) / (totaltime - psmIgnoreTime);

+        }

+        *pIdleCpuLoad = tmpIIT;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_ClearThreadCpu

+* ¹¦ÄÜÃèÊö£ºÇå³ýÏ̵߳ÄcpuµÄ¼ÆÊ±Ê±¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_ClearThreadCpu(VOID)

+{

+    UINT32                i             = 0;

+    T_ZOsa_ThreadUserArea *pPsmThreadUa = NULL;

+    

+    pPsmThreadUa             = zOss_GetThreadUserArea(g_zPsm_PsmThreadId);

+    pPsmThreadUa->psmCpuTime = 0;

+    for (i= 0; i < g_zPsm_IgnoreThreadIndex; i++)

+    {

+        pPsmThreadUa = zOss_GetThreadUserArea(g_zPsm_IgnoreThreadId[i]);

+        if (pPsmThreadUa != NULL)

+        {

+            pPsmThreadUa->psmCpuTime = 0;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_ClearIITTime

+* ¹¦ÄÜÃèÊö£ºÇå³ýÏ̵߳ÄcpuµÄ¼ÆÊ±Ê±¼ä

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static VOID psm_ClearIIT(VOID)

+{

+    g_zPsm_DfmCnt   = 0;

+    g_zPsm_SumIIT   = 0;

+    g_zPsm_DfmFlag  = FALSE;

+    zOss_Memset(g_zPsm_IIT, 0, (sizeof(SINT32) * g_zPsmCfg->dfmCnt));

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetDesCpuFreq

+* ¹¦ÄÜÃèÊö£º

+* ²ÎÊý˵Ã÷£º(IN)

+*               curCpuFreq:     µ±Ç°ÏµÍ³Ö÷Ƶ

+*               dfmFlag:        µ÷ƵµÈ¼¶

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»ØcpuÄ¿±êÖ÷Ƶ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 psm_GetDesCpuFreq(UINT32 curCpuFreq, UINT32 dfmFlag)

+{

+    UINT32 i = 0;

+    

+    for (i= 0; i < g_zPsmCfg->desClkNum; i++)

+    {

+        if (g_zPsmCfg->desClk[i].curCpuFreq == curCpuFreq)

+        {

+            switch (dfmFlag)

+            {

+            case PSM_UP_CPUFREQ:

+                {

+                    return g_zPsmCfg->desClk[i].upCpuFreq;

+                }

+            case PSM_DOWN_CPUFREQ:

+                {

+                    return g_zPsmCfg->desClk[i].downCpuFreq;

+                }

+            case PSM_PULL_CPUFREQ:

+                {

+                    return  g_zPsmCfg->desClk[i].pullCpuFreq;

+                }

+            default:

+                break;

+            }

+        }

+    }

+    

+    return  curCpuFreq;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_FindDesCpuFreq

+* ¹¦ÄÜÃèÊö£º»ñȡĿ±êµÄCPUÖ÷Ƶ£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               cpuload:    cpuʹÓÃÂÊ

+*               curCpuFreq: µ±Ç°Ö÷Ƶ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»Øcpu¶¯Ì¬µ÷ÕûµÄÖ÷Ƶ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_FindDesCpuFreq(UINT32 cpuload, UINT32 curCpuFreq)

+{

+    UINT32 desCpuFreq = 0;

+

+    if ((cpuload >= g_zPsmCfg->scaleCpuPcnt.downCpuPercent) && (cpuload < g_zPsmCfg->scaleCpuPcnt.upCpuPercent))

+    {

+        desCpuFreq = curCpuFreq;

+    }

+    else if (cpuload >= g_zPsmCfg->scaleCpuPcnt.pullCpuPercent)

+    {

+        desCpuFreq = psm_GetDesCpuFreq(curCpuFreq, PSM_PULL_CPUFREQ);

+    }

+    else if (cpuload >= g_zPsmCfg->scaleCpuPcnt.upCpuPercent)

+    {

+        desCpuFreq = psm_GetDesCpuFreq(curCpuFreq, PSM_UP_CPUFREQ);

+    }

+    else

+    {

+        desCpuFreq = psm_GetDesCpuFreq(curCpuFreq, PSM_DOWN_CPUFREQ);

+    }

+    

+    return desCpuFreq;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºPSM_FindMinCpuClk

+* ¹¦ÄÜÃèÊö£ºÅжÏCPUµ÷ÕûµÄÖ÷ƵÊÇ·ñÂú×ãÁ¢¼´µ÷Ƶ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»ØÐèÒªµÄÁ¢¼´Ö÷Ƶ

+* ÆäËü˵Ã÷£ºÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_FindMinCpuFreq(VOID)

+{

+    SINT32 i = 0;

+    

+    for (i = 0; i < g_zPsmCfg->sysClkNum; i++)

+    {

+        if (g_zPsm_MinCpuFreq > g_zPsmCfg->sysClk[i])

+        {

+            continue;

+        }

+        

+        return g_zPsmCfg->sysClk[i];

+    }

+    

+    return g_zPsmCfg->sysClk[g_zPsmCfg->sysClkNum - 1];

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetCpuFreq

+* ¹¦ÄÜÃèÊö£º»ñȡϵͳÖ÷Ƶ

+* ²ÎÊý˵Ã÷£º(IN)  

+*               ait: ƽ¾ù¿ÕÏÐÂÊ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º ·µ»ØÏµÍ³Ö÷Ƶ£»

+* ÆäËü˵Ã÷£º ÔÚËøÖжÏÉÏÏÂÎÄÖÐʹÓã¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_GetCpuFreq(UINT32 ait)

+{

+    UINT32 desCpuFreq  = 0;

+    UINT32 minCpuFreq  = 0;

+    

+    if (g_zPsm_DfmFlag)

+    {

+        desCpuFreq = psm_FindDesCpuFreq((100 - ait), g_zPsm_CurCpuFreq);

+    }

+    else

+    {

+        desCpuFreq = g_zPsm_CurCpuFreq;

+    }

+    

+    minCpuFreq = psm_FindMinCpuFreq();

+    

+    return max(desCpuFreq,minCpuFreq);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_GetAIT

+* ¹¦ÄÜÃèÊö£º»ñÈ¡AIT(ƽ¾ù¿ÕÏÐÂÊ)

+* ²ÎÊý˵Ã÷£º(IN)

+*               idleThreadCpu: cpu¿ÕÏÐÂÊ£»

+*           (OUT)

+*               ÎÞ£»

+* ·µ »Ø Öµ£º·µ»ØAIT

+* ÆäËü˵Ã÷£ºÔÚµ¥Ò»Ïß³ÌÖУ¬ÎÞÐèÒª±£»¤£»

+**************************************************************************/

+static UINT32 psm_GetAIT(UINT32 idleThreadCpu)

+{

+    g_zPsm_SumIIT               += idleThreadCpu - g_zPsm_IIT[g_zPsm_IITCnt];

+    g_zPsm_IIT[g_zPsm_IITCnt++] = idleThreadCpu;

+

+    if(g_zPsm_IITCnt >= g_zPsmCfg->dfmCnt)

+    {

+        g_zPsm_IITCnt = 0;

+    }

+    

+    return g_zPsm_SumIIT/g_zPsm_DfmCnt;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_InterruptRoutine

+* ¹¦ÄÜÃèÊö£ºÖжϷþÎñ³ÌÐò

+* ²ÎÊý˵Ã÷£º(IN)

+*               args: Ïß³ÌÈë¿Úº¯ÊýµÄ²ÎÊý£»

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔڸú¯ÊýÖв»ÒªÊ¹ÓÃ×èÈûÐÔº¯Êý£»

+**************************************************************************/

+static VOID psm_InterruptRoutine(SINT32 args)

+{

+    UINT32 idleCpuLoad  = 0;

+    UINT32 ait          = 0;

+    UINT32 cpuFreq      = 0;

+    

+    if (g_zPsm_DfmFinishFlag)

+    {

+        if ( g_zPsm_DfmCnt >= g_zPsmCfg->dfmCnt)

+        {

+            g_zPsm_DfmFlag = TRUE;          

+        }

+        else

+        {

+            g_zPsm_DfmCnt++;

+        }

+        psm_GetIdleCpuLoad(&idleCpuLoad);

+        ait     = psm_GetAIT(idleCpuLoad);

+        cpuFreq = psm_GetCpuFreq(ait);

+        if (cpuFreq != g_zPsm_CurCpuFreq)

+        {

+            SINT32 retCode = zDrvPow_SetArmPsCoreFreq(cpuFreq);

+            zOss_AssertExN(retCode == DRV_SUCCESS);

+            psm_ClearIIT();

+            g_zPsm_CurCpuFreq = cpuFreq;

+        }

+        psm_ClearThreadCpu();  

+        g_zPsm_SumCpuTime   = 0;

+        g_zPsm_SwapLastTime = Osa_HwTimeRead();

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºpsm_SetIgnoreThread

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£ºÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID psm_SetIgnoreThread(VOID)

+{

+    UINT32  i  = 0;

+    

+    g_zPsm_IgnoreThreadIndex = 0;    

+    for (i = 0; i < g_zPsmCfg->ignoreThreadCnt; i++)

+    {

+        zOss_SetIgnoreThread(zOss_GetThreadIDByName(g_zPsmCfg->pIgnoreThreadNameArry[i]));

+    }

+}

+

+#endif //_USE_CPU_DFM

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmInit

+* ¹¦ÄÜÃèÊö£ºÊ¡µç¹ÜÀí³õʼ»¯

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_PsmInit(VOID)

+{

+    g_zPsmCfg          = &(zOss_GetOssCfg()->PsmCfg);

+

+#ifndef _OS_LINUX

+    g_zPsm_PsmThreadId = zOss_CreateThread("zOss_ThreadPsm", psm_IdleThreadEntry, 0, 2 * 1024, 31, 1, 1);

+    zOss_AssertEx(g_zPsm_PsmThreadId != NULL, ZOSS_ERROR);

+    

+#ifdef _OS_TOS

+    zOss_SuspendThread((ZOSS_THREAD_ID)cyg_thread_idle_thread());

+#endif

+

+#endif /* _OS_LINUX */

+

+    Psm_CompensateInit();

+

+#ifdef _USE_CPU_DFM  

+    Psm_DfmInit();

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetBootStage

+* ¹¦ÄÜÃèÊö£ºÉèÖÃϵͳ³õʼ»¯Íê³É±ê־λ

+* ²ÎÊý˵Ã÷£º(IN)

+*               stage:Íê³É±êÖ¾£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_SetBootStage(T_zPsm_BootStage stage)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_BootStateFlag = stage;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetBootStage

+* ¹¦ÄÜÃèÊö£º»ñȡϵͳ³õʼ»¯Íê³É±ê־λ

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÏµÍ³³õʼ»¯Íê³É±ê־λ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+T_zPsm_BootStage zOss_GetBootStage(void)

+{

+    ZOSS_INTR old_intr;

+    T_zPsm_BootStage stage;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    stage = g_zPsm_BootStateFlag;

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return stage;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetPSMAppIdle

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Ë¯ÃßÁ÷³ÌÓ¦ÓÃΪ¿ÕÏÐ״̬£¬×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦Óã»

+* ²ÎÊý˵Ã÷£º(IN)

+*               appId:Ó¦ÓÃÉèÖÃÔÊÐí¿ÕÏеÄÓ¦ÓÃid

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetPSMAppIdle(UINT32 appId)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_AppIdleFlag = g_zPsm_AppIdleFlag & (~ (1 << appId));

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetPSMAppActive

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖ¸¶¨Ë¯ÃßÁ÷³ÌÓ¦ÓÃΪ·±Ã¦×´Ì¬£¬×î´ó¿ÉÒÔ¿ØÖÆ32¸öÓ¦ÓÃ

+* ²ÎÊý˵Ã÷£º(IN)

+*               appId:Ó¦ÓÃÉèÖÃÔÊÐí·±Ã¦µÄÓ¦ÓÃid

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetPSMAppActive(UINT32 appId)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_AppIdleFlag = g_zPsm_AppIdleFlag | (1 << appId);

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetSleepFuncOpt 

+* ¹¦ÄÜÃèÊö£ºË¯Ãß¹³×Óº¯Êý£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               beforeHook: ˯Ãßǰ¹³×Óº¯Êý£»

+*               afterHook:  ˯Ãߺó¹³×Óº¯Êý£»

+*           (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÃ»ÓÐʹÓõĹ³×Óº¯Êý×¢²áΪNULL¡£ 

+**************************************************************************/

+VOID zOss_SetSleepHookOpt(psm_SleepInitHook  initHook, psm_SleepFinishHook  finishHook, psm_SleepBeforeHook  beforeHook, psm_SleepAfterHook afterHook)

+{

+    if (initHook != NULL)

+        g_zPsm_SleepInitHook    = initHook;

+

+    if (finishHook != NULL)

+        g_zPsm_SleepFinishHook  = finishHook;   

+    

+    if (beforeHook != NULL)

+        g_zPsm_SleepBeforeHook  = beforeHook;

+

+    if (afterHook != NULL)

+        g_zPsm_SleepAfterHook   = afterHook;    

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RegSleepCompensateFunc 

+* ¹¦ÄÜÃèÊö£ºË¯Ãßʱ¼ä²¹³¥×¢²áº¯Êý£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               funcOpt: ×¢²á²¹³¥º¯Êý£»

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»ØÊ¡µç²¹³¥ID;

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+ZOSS_COMPENSATE_ID zOss_RegSleepCompensateFunc(psm_CompensateHook funcOpt)

+{

+    ZOSS_INTR old_intr;

+    T_zPsm_CompensateNode *pCmpnstNode = (T_zPsm_CompensateNode *)zOss_Malloc(sizeof(T_zPsm_CompensateNode));

+

+    zOss_AssertEx(pCmpnstNode != NULL, NULL);

+    zOss_Memset(pCmpnstNode, 0, sizeof(T_zPsm_CompensateNode));

+    ZOSS_SAVE_IRQ(old_intr);  

+    pCmpnstNode->psm_CompensateHook = funcOpt;

+    zOss_ListAdd(&g_zPsm_CmpnstFuncList, &(pCmpnstNode->node));

+    ZOSS_RESTORE_IRQ(old_intr); 

+

+    return (ZOSS_COMPENSATE_ID )pCmpnstNode;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_DeregSleepCompensateFunc 

+* ¹¦ÄÜÃèÊö£ºË¯Ãßʱ¼ä²¹³¥×¢Ïúº¯Êý£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               pPsmCmpnstID: Ê¡µç²¹³¥ID;

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_DeregSleepCompensateFunc(ZOSS_COMPENSATE_ID psmCmpnstId)

+{

+    ZOSS_INTR old_intr;

+    T_zPsm_CompensateNode *pCmpnstNode = (T_zPsm_CompensateNode *)psmCmpnstId;

+

+    ZOSS_SAVE_IRQ(old_intr); 

+    zOss_ListDelete(&g_zPsm_CmpnstFuncList, &(pCmpnstNode->node));

+    ZOSS_RESTORE_IRQ(old_intr); 

+    zOss_Free(psmCmpnstId);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_CompensateTicks

+* ¹¦ÄÜÃèÊö£º²¹³¥²Ù×÷ϵͳticksÖµ£»µ¥Î»:tick£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º·µ»Ø²¹³¥µÄticksÖµ£»

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_CompensateTicks(VOID)

+{

+    ZOSS_INTR old_intr;

+    UINT32 ticks = 0;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    ticks = g_zPsm_SleepTicksTime/ZOSS_MS_PER_TICK;

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ticks;     

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ClearSleepTime

+* ¹¦ÄÜÃèÊö£ºÇå³ý˯Ãßʱ¼ä£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_ClearSleepTime(VOID)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_SleepTime = 0;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmAdjustFreq312M

+* ¹¦ÄÜÃèÊö£º½â¾öϵͳÔÚ¶¯Ì¬´´½¨Ï̲߳¢Í˳öÏß³Ìʱ£¬ARMÖ÷ƵΪ78MÇé¿öÏ£¬·¢ÉúµÄose_heapdÏß³Ì

+*           ËøÖжϴóÓÚ400usµ¼ÖµÄGP0¶ÏÑÔÎÊÌ⣬ÔÚ·¢ÉúÕâÖÖÇé¿öµÄʱºò£¬°ÑÖ÷Ƶµ÷Õûµ½312M,

+*           È»ºóÓɶ¯Ì¬µ÷Ƶģ¿é¸ºÔð°ÑÖ÷Ƶµ÷Õû»ØÈ¥¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º ZOSS_SUCCESS

+* ÆäËü˵Ã÷£º ¸Ãº¯Êý½ö½öÔÚzOss_ExitThreadº¯ÊýÖÐʹÓÃ

+************************************************************************/

+#ifdef _OS_OSE

+UINT32 zOss_PsmAdjustFreq312M(VOID)

+{

+    if (zDrvPow_GetPsCoreFreq() < CLK312M)

+    {

+        zDrvPow_SetArmPsCoreFreq(CLK312M);

+        

+#ifdef _USE_CPU_DFM

+        psm_DfmWakeUpReset();

+#endif

+        g_zPsm_CurCpuFreq = CLK312M;

+    }

+

+    return ZOSS_SUCCESS;

+}

+#endif

+

+#ifdef _OS_LINUX

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmInitHook

+* ¹¦ÄÜÃèÊö£ºË¯Ãß³õʼ»¯¹³×Óº¯Êý¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_PsmInitHook(VOID)

+{ 

+    if (g_zPsm_SleepInitHook != NULL)

+        g_zPsm_SleepInitHook();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmFinshHook

+* ¹¦ÄÜÃèÊö£ºË¯Ãß½áÊø¹³×Óº¯Êý¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_PsmFinshHook(VOID)

+{ 

+    if (g_zPsm_SleepFinishHook != NULL)

+        g_zPsm_SleepFinishHook();

+}

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_PsmBootSleep

+* ¹¦ÄÜÃèÊö£ºboot˯ÃßÈë¿Úº¯Êý¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_PsmBootSleep(VOID)

+{

+    if(!g_zPsm_BooTSleepFlag)

+    {

+        if (g_zPsm_SleepInitHook != NULL)

+            g_zPsm_SleepInitHook();

+    

+         psm_BootSleep();  

+        

+        g_zPsm_BooTSleepFlag = TRUE;

+        printk("psm_BootSleep");

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_IdleEnter

+* ¹¦ÄÜÃèÊö£ºË¯Ãß´¦ÀíÈë¿Úº¯Êý¡£

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_PsmEnter(VOID)

+{ 

+#ifdef _USE_PSM_TEST

+    if(zSys_SetR7SleepType(R7_PLAT_NO_SLEEP))

+		return;

+#endif

+

+    if (psm_CampOnSleepCheck())                   // ÓÐÍøË¯ÃßÁ÷³Ì;

+    {

+        psm_CampOnSleep();

+    }

+    else if(zPS_umm_IsLossOfCoverage())           // ¶ªÊ§¸²¸Ç˯ÃßÁ÷³Ì;

+    {

+        psm_LossCoverageSleep();

+    }

+    else if(zAti2_PsIsInFlyMode())                // ·ÉÐÐģʽ˯ÃßÁ÷³Ì;                

+    {

+        psm_AirplaneSleep();

+    }

+	else

+	    zDrvPow_Sleep_Func(KERNEL_SLEEP_MODE, 0); //ÆäËüģʽ¶¼²»Âú×ã½øÈëµ½ÄÚºËÊ¡µç

+}

+

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_PsmTraceInfo

+* ¹¦ÄÜÃèÊö£º Êä³öpsmµÄµ÷ÊÔÐÅÏ¢

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_PsmTraceInfo(VOID)

+{

+    UINT32 dwPsL1eFlg = 0;

+    UINT32 dwPsL1wFlg = 0;

+    UINT32 dwPsL1tFlg = 1;

+    UINT32 dwDrvFlg = 0;

+    UINT32 dwAppFlg = 0;

+    UINT32 dwGsmFlg = 0;

+    UINT32 dwPlatFlg = 0;

+    

+    dwPsL1eFlg = zL1e_TaskIsIdlePrint();   // 1: bitλ¶ÔÓ¦Ìõ¼þÔÊÐí˯Ãß

+#ifdef PS_RAT_FDD    

+    dwPsL1wFlg = zL1w_TaskIsIdlePrint();  // 1: bitλ¶ÔÓ¦Ìõ¼þÔÊÐí˯Ãß

+#endif

+#ifdef PS_RAT_TDD    

+    dwPsL1tFlg = zL1t_TaskIsIdlePrint();    // 1: bitλ¶ÔÓ¦Ìõ¼þÔÊÐí˯Ãß

+#endif    

+    

+    dwDrvFlg = zDrvPow_PsmIdleFlagGet();  //0: bitλ¶ÔÓ¦Ìõ¼þÔÊÐí˯Ãß

+    dwAppFlg = psm_AppIdleFlagGet();         //0: bitλ¶ÔÓ¦Ìõ¼þÔÊÐí˯Ãß

+    

+    dwPlatFlg = Psm_PlatIdleFlag();             //  1:ÔÊÐí˯Ãß

+    

+    dwGsmFlg = !zGsml1_PsmIdleFlag() ;    //  1:ÔÊÐí˯Ãß

+

+    IRAM_PSPSM_DEBUG_INFO_L1E = dwPsL1eFlg;

+    IRAM_PSPSM_DEBUG_INFO_L1W = dwPsL1wFlg;

+    IRAM_PSPSM_DEBUG_INFO_L1T = dwPsL1wFlg;

+    IRAM_PSPSM_DEBUG_INFO_L1G = dwGsmFlg;

+    IRAM_PSPSM_DEBUG_INFO_DRV = dwDrvFlg;

+    IRAM_PSPSM_DEBUG_INFO_PLAT = dwPlatFlg;

+    IRAM_PSPSM_DEBUG_INFO_APP = dwAppFlg;

+    IRAM_PSPSM_DEBUG_INFO_L1W = dwPsL1wFlg;

+    

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "SleepInfo PsL1e=%8x L1w=%8x L1t=%8x Gsm=%d,DrvFlg=%8x AppFlg=%8x PlatFlg=%d SleepCnt=%8d", 

+                    dwPsL1eFlg,dwPsL1wFlg,dwPsL1tFlg,dwGsmFlg,dwDrvFlg,dwAppFlg,dwPlatFlg,zDrvPow_PsmDeepSleepCnt());

+

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL,"SleepTicks = %d  CurrentTick = %d", g_zPsm_SleepTicksTime, zOss_GetTickCount());

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL,"CampON = %d LossOfCoverage = %d FlyMode = %d GsmSleepTime = %d, PsSleepTime = %d", 

+                                                                                                            psm_CampOnCheck(), zPS_umm_IsLossOfCoverage(), zAti2_PsIsInFlyMode(),

+                                                                                                            zGsml1_PsmGetSleepTime(), zOss_GetPs_SleepTimer());

+

+}

+

+#ifdef _USE_CPU_DFM

+/******************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ApplyCpuFreq

+* ¹¦ÄÜÃèÊö£ºÁ¢¼´µ÷Ƶº¯Êý

+* ²ÎÊý˵Ã÷£º(IN)         

+*               appid:Á¢¼´µ÷ƵID;

+*               isUsed:TRUEʱ½øÐÐÉýƵ£¬FALSEʱ½øÐнµÆµ²Ù×÷;

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£¬Ê§°Ü·µ»ØZOSS_ERROR£»

+* ÆäËü˵Ã÷£ºÔÚÏß³ÌÉÏÏÂÎÄÖÐʹÓã»

+**************************************************************************/

+UINT32 zOss_ApplyCpuFreq(UINT32 appId, BOOL isUsed)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    if (isUsed)

+    {

+        if (!g_zPsmCfg->minClk[appId].isUsed)

+        {

+            g_zPsm_MinCpuFreq += g_zPsmCfg->minClk[appId].cpuClk;

+        }

+    }

+    else

+    {

+        if (g_zPsmCfg->minClk[appId].isUsed)

+        {

+            g_zPsm_MinCpuFreq -= g_zPsmCfg->minClk[appId].cpuClk;

+        }

+    }

+    

+    g_zPsmCfg->minClk[appId].isUsed = isUsed;

+    if (g_zPsm_MinCpuFreq > g_zPsm_CurCpuFreq)

+    {

+        SINT32 retCode    = DRV_SUCCESS; 

+

+        g_zPsm_CurCpuFreq = psm_FindMinCpuFreq();

+        retCode           = zDrvPow_SetArmPsCoreFreq(g_zPsm_CurCpuFreq);

+        zOss_AssertEx(retCode == DRV_SUCCESS, ZOSS_ERROR);

+        psm_ClearIIT();

+    } 

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetIgnoreThreadTimeRate 

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ìʱ¼ä±ÈÀý(ºöÂÔÏ̵߳ÄÖ´ÐÐʱ¼ä¶à´ó±ÈÀý×÷ΪidleÏ̵߳Äʱ¼ä)

+* ²ÎÊý˵Ã÷£º(IN)

+*               timeRate: ʱ¼ä±ÈÀý

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_SetIgnoreThreadTimeRate(FLOAT timeRate)

+{

+    ZOSS_INTR old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    g_zPsm_IgnoreThreadTimeRate = timeRate;

+    ZOSS_RESTORE_IRQ(old_intr); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ThreadSwapInPsmHook 

+* ¹¦ÄÜÃèÊö: Ïß³ÌÇÐÈëʱµÄÊ¡µç¹³×Ó 

+* ²ÎÊý˵Ã÷: (IN)  

+*               user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_ThreadSwapInPsmHook(T_ZOsa_ThreadUserArea *user_area)

+{

+    ZOSS_INTR   old_intr;

+    UINT32      past_time       = 0;

+    UINT32      current_time    = 0;

+    

+    zOss_AssertExN(user_area != NULL);

+    ZOSS_SAVE_IRQ(old_intr);

+    current_time          = Osa_HwTimeRead();

+    past_time             = current_time - g_zPsm_SwapLastTime;

+    g_zPsm_SumCpuTime     += past_time;

+    user_area->psmCpuTime += past_time;

+    g_zPsm_CurThread      = user_area->threadid;

+    g_zPsm_SwapLastTime   = current_time;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_THreadSwapOutPsmHook 

+* ¹¦ÄÜÃèÊö: Ïß³ÌÇгöʱµÄÊ¡µç¹³×Ó

+* ²ÎÊý˵Ã÷: (IN)  

+*               user_area:  Ï̵߳ÄÓû§Êý¾ÝÇøÖ¸Õë

+*           (OUT)  

+*               ÎÞ

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_ThreadSwapOutPsmHook(T_ZOsa_ThreadUserArea *user_area)

+{

+    ZOSS_INTR   old_intr;

+    UINT32      past_time       = 0;

+    UINT32      current_time    = 0;

+

+    zOss_AssertExN(user_area != NULL);

+    ZOSS_SAVE_IRQ(old_intr);

+    current_time          = Osa_HwTimeRead();

+    past_time             = current_time - g_zPsm_SwapLastTime;

+    g_zPsm_SumCpuTime     += past_time;

+    user_area->psmCpuTime += past_time;

+    g_zPsm_CurThread      = NULL;

+    g_zPsm_SwapLastTime   = current_time;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RecordPsmLastSwapTime 

+* ¹¦ÄÜÃèÊö: ¼Ç¼ʡµç×îºóÒ»´ÎÏß³ÌÇл»µÄʱ¼ä£»

+* ²ÎÊý˵Ã÷: (IN)  

+*               ÎÞ    

+*           (OUT)

+*               ÎÞ

+* ·µ »Ø Öµ:     

+* ÆäËü˵Ã÷:     

+**************************************************************************/

+VOID zOss_RecordPsmLastSwapTime(VOID)

+{

+    ZOSS_INTR old_intr  = 0;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_SwapLastTime = Osa_HwTimeRead();

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_DfmSettingInit

+* ¹¦ÄÜÃèÊö: ¶¯Ì¬µ÷Ƶ»·¾³³õʼ»¯£»

+* ²ÎÊý˵Ã÷£º(IN)

+*               ÎÞ

+*           (OUT)

+*               ÎÞ 

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: 

+**************************************************************************/

+VOID zOss_DfmSettingInit(VOID)

+{   

+    ZOSS_INTR old_intr;

+                    

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_DfmFinishFlag = FALSE; 

+    ZOSS_RESTORE_IRQ(old_intr); 

+    

+    psm_SetIgnoreThread();

+    

+    ZOSS_SAVE_IRQ(old_intr); 

+    psm_ClearThreadCpu();

+    g_zPsm_SumCpuTime    = 0;

+    g_zPsm_DfmFinishFlag = TRUE; 

+    g_zPsm_SwapLastTime  = Osa_HwTimeRead();

+    ZOSS_RESTORE_IRQ(old_intr); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetIgnoreThread

+* ¹¦ÄÜÃèÊö£ºÉèÖúöÂÔÏß³Ì

+* ²ÎÊý˵Ã÷£º(IN)

+                thread : Ïß³ÌID;

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_SetIgnoreThread(ZOSS_THREAD_ID threadId)

+{

+    ZOSS_INTR old_intr;  

+

+    if (threadId == NULL)

+        return;

+    ZOSS_SAVE_IRQ(old_intr);

+    g_zPsm_IgnoreThreadId[g_zPsm_IgnoreThreadIndex++] = threadId;

+    ZOSS_RESTORE_IRQ(old_intr); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º PSM_CpuIntRoutine

+* ¹¦ÄÜÃèÊö£º ´¥·¢cpu¶¯Ì¬µ÷Ƶ²É¼¯º¯Êý

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+#ifdef _OS_TOS

+VOID zOss_DfmIntRoutine(VOID)

+{

+    static UINT32 psmCpuCount = 0;

+    

+    if(g_zPsm_DfmFinishFlag)

+    {

+        if(++psmCpuCount >= g_zPsmCfg->dfmPeriod)

+        {

+           psmCpuCount = 0;

+           psm_InterruptRoutine(1);

+        }

+    }

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_Dfm_TraceInfo

+* ¹¦ÄÜÃèÊö£º Êä³ödfmµÄµ÷ÊÔÐÅÏ¢

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_DfmTraceInfo(VOID)

+{

+    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "CurFreq = %d, DfmCnt = %d", g_zPsm_CurCpuFreq, g_zPsm_DfmCnt);

+    if (g_zPsm_DfmCnt > 0)

+    {

+        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "ait = %d, DesFreq = %d, MinFreq = %d", g_zPsm_SumIIT/g_zPsm_DfmCnt, psm_FindDesCpuFreq((100 - g_zPsm_SumIIT/g_zPsm_DfmCnt), g_zPsm_CurCpuFreq),

+                    psm_FindMinCpuFreq());

+    }

+}

+

+#endif  // #ifdef _USE_CPU_DFM

+

+#ifdef _OS_LINUX

+#ifdef CONFIG_CPU_FREQ

+extern UINT32 zx_set_frequency(UINT32 freq);

+#endif

+extern UINT32 zDrvTsCtrl_DfsEn(VOID);

+

+SINT32 zOss_PsmSetCpuFreq(UINT32 freq)

+{

+	SINT32 ret = ZOSS_SUCCESS;

+#ifdef CONFIG_CPU_FREQ

+	if(!zDrvTsCtrl_DfsEn())		

+		ret = zx_set_frequency(freq);

+#endif

+	return  ret;

+}

+#endif

+

+#endif  // #ifdef _USE_PSM

+

diff --git a/cp/ps/plat/src/oss/psm/ws/makefile b/cp/ps/plat/src/oss/psm/ws/makefile
new file mode 100644
index 0000000..0485357
--- /dev/null
+++ b/cp/ps/plat/src/oss/psm/ws/makefile
@@ -0,0 +1,44 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: Makefile

+#* ÄÚÈÝÕªÒª: ±àÒë×Óϵͳsup

+#* ʹÓ÷½·¨:     

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2013/01/01      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+include $(PRJ_PATH)/config/project.mk

+

+#===============================================================================

+#·¾¶ÉèÖÃ

+#===============================================================================

+_SUBSYS_NAME = plat_psm

+

+_SUBSYS_LIB_PATH = $(PLAT_LIB_INTERNAL_PATH)

+

+_ALL_MDLS = 

+_ALL_OBJECTS = 

+

+MDL_PATH = $(PLAT_PATH)/src/oss/psm/src

+

+#===============================================================================

+# psm

+#===============================================================================

+psm:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(MDL_PATH)

+psmclean:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(MDL_PATH) clean

+

+_ALL_MDLS += psm 

+_ALL_OBJECTS += $(wildcard $(OBJ_PATH)/plat/oss/psm/*.o)

+

+#===============================================================================

+# ±àÒë¹æÔò

+#===============================================================================

+include $(FRAME_PATH)/rules/lib_rules.mk

+

diff --git a/cp/ps/plat/src/oss/sup/inc/ramdump_arch.h b/cp/ps/plat/src/oss/sup/inc/ramdump_arch.h
new file mode 100644
index 0000000..fe5fca7
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/ramdump_arch.h
@@ -0,0 +1,48 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_arch.h
+* Îļþ±êʶ:     ramdump_arch.h
+* ÄÚÈÝÕªÒª:     ramdump´¦ÀíÆ÷Ïà¹Ø½Ó¿Ú/Êý¾Ý½á¹¹¶¨ÒåÍ·Îļþ
+* ʹÓ÷½·¨:     
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/3/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+#ifndef _RAMDUMP_ARCH_H
+#define _RAMDUMP_ARCH_H
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+extern void ramdump_arch_clean_caches(void);
+extern void ramdump_arch_clean_and_invalid_caches(void);
+extern char *ramdump_arch_store_modes_regs(char *mem);
+extern char *ramdump_arch_store_mm_regs(char *mem);
+extern void ramdump_arch_save_all_regs(void);
+
+#endif  //#ifndef _RAMDUMP_ARCH_H
+
diff --git a/cp/ps/plat/src/oss/sup/inc/ramdump_collect_server.h b/cp/ps/plat/src/oss/sup/inc/ramdump_collect_server.h
new file mode 100644
index 0000000..2fea030
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/ramdump_collect_server.h
@@ -0,0 +1,51 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_collect_server.h
+* Îļþ±êʶ:     ramdump_collect_server.h
+* ÄÚÈÝÕªÒª:     ramdump collect server¶ÔÍâ½Ó¿ÚÍ·Îļþ
+* ʹÓ÷½·¨:     
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/3/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+#ifndef _RAMDUMP_COLLECT_SERVER_H
+#define _RAMDUMP_COLLECT_SERVER_H
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+/* first except cpu id */
+extern unsigned long ramdump_except_cpu_id;
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+extern int ramdump_collect_server_icp_init(void);
+extern void ramdump_collect_server_notify_clients_dump(void);
+extern void ramdump_get_collect_server_ram_conf(
+                ramdump_ram_config_sync_msg_t *msg);
+extern unsigned long * ramdump_get_first_dump_cpu_id(void);
+extern unsigned long * ramdump_get_client_init_rsp(void);
+
+#endif  //#ifndef _RAMDUMP_COLLECT_SERVER_H
+
diff --git a/cp/ps/plat/src/oss/sup/inc/ramdump_oss.h b/cp/ps/plat/src/oss/sup/inc/ramdump_oss.h
new file mode 100644
index 0000000..a208fd9
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/ramdump_oss.h
@@ -0,0 +1,149 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_oss.h
+* Îļþ±êʶ:     ramdump_oss.h
+* ÄÚÈÝÕªÒª:     ramdump²Ù×÷ϵͳÒÀÀµ½Ó¿Ú/Êý¾Ý½á¹¹¶¨ÒåÍ·Îļþ
+* ʹÓ÷½·¨:     
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/3/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+#ifndef _RAMDUMP_OSS_H
+#define _RAMDUMP_OSS_H
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+
+#ifdef _OS_LINUX 
+#include <linux/soc/zte/rpm/rpmsg.h>
+#include <asm/io.h>
+#include <asm/current.h>
+#include <linux/string.h>
+#include <linux/sched.h>
+#include <asm/memory.h>
+#include <linux/irqflags.h>
+#include <asm/setup.h>
+#include <linux/kthread.h>
+#include <linux/bug.h>
+#include <linux/kernel.h>
+#include <asm/barrier.h>
+#include <asm/outercache.h>
+#elif defined (_OS_TOS)
+#include "oss_api.h"
+#include "drvs_rpmsg.h"
+#include "drvs_usbPoll.h"
+#include "drvs_icp.h"
+#include "ps_ephy_interface.h"
+#include "drv_api.h"
+#include <cyg/hal/tos_arm_mmu.h>
+#include <cyg/hal/tos_cache.h>
+#include "rpmsg_channel.h"
+#endif
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+#define OSS_MMAP(addr,size) ramdump_oss_mmap(addr,size)
+
+#ifdef _OS_LINUX
+
+#define OSS_PANIC(val)      panic(val)
+#define OSS_LOCK(flag)      local_irq_disable()
+#define OSS_UNLOCK(flag)    local_irq_enable()
+#define OSS_SLEEP(val)      msleep(val)
+
+#define OSS_PHY_TO_VIRT(addr) phys_to_virt(addr)
+#define OSS_VIRT_TO_PHY(addr) virt_to_phys(addr)
+#define OSS_PHY_TO_PFN(addr)  __phys_to_pfn(addr)
+#define OSS_PFN_VALID(pfn)    pfn_valid(pfn)
+
+/*
+ * to make sure ramdump init after icp device init
+ */
+#define OSS_INIT(fn) late_initcall(fn)
+#define OSS_PRINTF printk
+
+#elif defined (_OS_TOS)
+
+#define OSS_PANIC(val)                  zOss_ASSERT(0)
+#define OSS_LOCK(flag)                  ZOSS_SAVE_IRQ(flag)
+#define OSS_UNLOCK(flag)                ZOSS_RESTORE_IRQ(flag)
+#define OSS_SLEEP(val)                  zOss_Sleep(val)
+#define OSS_CREATE_THREAD(name,entry)   ramdump_oss_create_thread(name,entry)
+#define OSS_PHY_TO_VIRT(addr)           (addr)
+
+#define OSS_INIT(fn)
+#define OSS_PRINTF(fmt...) zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, fmt)
+
+#endif //#ifdef _OS_LINUX 
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+typedef ramdump_msg_t ramdump_oss_msg_t;
+
+#ifdef _OS_LINUX 
+
+typedef T_ZDrvRpMsg_ActorID ramdump_oss_icp_actorid;
+typedef T_ZDrvRpMsg_ChID ramdump_oss_icp_channelid;
+typedef T_ZDrvRpMsg_CallbackFunction ramdump_oss_icp_callback;
+typedef T_ZDrvRpMsg_Msg ramdump_oss_icp_msg;
+typedef void (*ramdump_oss_thread_entry_t)(unsigned long arg);
+
+#elif defined (_OS_TOS) //#ifdef _OS_LINUX 
+
+typedef T_ZDrvRpMsg_MsgActor ramdump_oss_icp_actorid;
+typedef T_ZDrvRpMsg_ChID ramdump_oss_icp_channelid;
+typedef T_ZDrvRpMsg_CallbackFunction ramdump_oss_icp_callback;
+typedef T_ZDrvRpMsg_Msg ramdump_oss_icp_msg;
+typedef void (*ramdump_oss_thread_entry_t)(SINT32 arg);
+
+#endif //#ifdef _OS_LINUX 
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+extern int ramdump_oss_icp_create_channel(
+            ramdump_oss_icp_actorid actorID, 
+            ramdump_oss_icp_channelid chID, 
+            unsigned int size);
+extern int ramdump_oss_icp_regcallback(
+            ramdump_oss_icp_actorid actorID, 
+            unsigned int chID, 
+            ramdump_oss_icp_callback callback);
+extern int ramdump_oss_icp_write(const ramdump_oss_icp_msg *pMsg);
+extern void ramdump_oss_data_trans_init(void);
+extern void ramdump_oss_data_trans_read (
+                unsigned char *buffer, 
+                unsigned int size);
+extern void ramdump_oss_data_trans_write(
+                unsigned char *buffer, 
+                unsigned int size);
+extern void ramdump_oss_data_trans_done(void);
+extern void ramdump_oss_error_log_creat(char *buf);
+extern int ramdump_oss_icp_send(
+            ramdump_oss_msg_t *icp_msg, 
+            unsigned int client_id,
+            unsigned int ch_id);
+extern void ramdump_oss_create_thread(
+                char *name, 
+                ramdump_oss_thread_entry_t entry);
+extern unsigned long ramdump_oss_mmap(
+                        unsigned long addr, 
+                        unsigned long size);
+
+#endif  //#ifndef _RAMDUMP_OSS_H
+
diff --git a/cp/ps/plat/src/oss/sup/inc/ramdump_pub.h b/cp/ps/plat/src/oss/sup/inc/ramdump_pub.h
new file mode 100644
index 0000000..9e9d769
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/ramdump_pub.h
@@ -0,0 +1,178 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_pub.h
+* Îļþ±êʶ:     ramdump_pub.h
+* ÄÚÈÝÕªÒª:     ramdump¹«¹²Í·Îļþ
+* ʹÓ÷½·¨:     #include "ramdump_pub.h"
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/3/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+#ifndef _RAMDUMP_PUB_H
+#define _RAMDUMP_PUB_H
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump.h"
+#include "ramdump_arch.h"
+#include "ramdump_soc.h"
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+#define RAMDUMP_SUCCESS (0)
+#define RAMDUMP_FAILED  (-1)
+
+#define RAMDUMP_ICP_SUCCESS (RAMDUMP_SUCCESS)
+#define RAMDUMP_ICP_FAILED  (RAMDUMP_FAILED)
+
+#define RAMDUMP_TRUE    (1)
+#define RAMDUMP_FALSE   (0)
+
+#define RAMDUMP_SYNC_RESET              (0x73787384) /* 73:I 78:N 73:I 84:T */
+#define RAMDUMP_SYNC_RAM_CONFIG_DONE    (0x68696576) /* 68:D 69:E 65:A 76:L */
+#define RAMDUMP_SYNC_RAM_CONTENT_DONE   (0x68797869) /* 68:D 79:O 78:N 69:E */
+
+#define RAMDUMP_ICP_MSG_DATA_RAMCONF_SIZE    (40)  //sizeof(ramdump_ram_conf_table_entry)
+#define RAMDUMP_RAMCONF_TABLE_MAX_ENTRYS  (RAMDUMP_RAMCONF_TABLE_MAXSIZE/RAMDUMP_ICP_MSG_DATA_RAMCONF_SIZE)
+
+/* adapt diff printf fun*/
+#define RAMDUMP_PRINTF OSS_PRINTF
+
+#define RAMDUMP_ARRAY_NR(arr) (sizeof(arr) / sizeof((arr)[0]))
+
+#define RAMDUMP_WAIT_TIMELEN (200) /* like before,just a value roughly */
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+typedef unsigned long ramdump_msg_id_t;
+typedef unsigned long ramdump_cpu_id_t;
+typedef unsigned long *ramdump_client_done_flag_t;
+
+/*
+ * ICP MSG struct collect server with 
+ * clients and trans server.
+ */
+enum
+{
+    RAMDUMP_MSG_INIT_REQ,
+    RAMDUMP_MSG_INIT_RSP,
+    RAMDUMP_MSG_SYNC,
+    RAMDUMP_MSG_EXCEPT,
+};
+
+/* 
+ * ramdump client id 
+ * collect server : RAMDUMP_CPU_0
+ * trans server : RAMDUMP_CPU_1
+ * client1 : RAMDUMP_CPU_2
+ * client2 : RAMDUMP_CPU_3
+ */
+enum
+{
+/* 
+ * collect server/client0 : RAMDUMP_CPU_0
+ * trans server : RAMDUMP_CPU_1
+ * client1 : RAMDUMP_CPU_2
+ */
+    RAMDUMP_CPU_0,
+    RAMDUMP_CPU_1,
+    RAMDUMP_CPU_2,
+    RAMDUMP_CPU_MAX
+};
+
+/* client and server icp ram conf data */
+typedef struct
+{
+    char            name[RAMDUMP_RAMCONF_FILENAME_MAXLEN];
+    unsigned long   phy;
+    unsigned long   vir;
+    unsigned long   size;
+
+    unsigned long       flag;       /* RAMDUMP_FLAG_XXX         */
+    unsigned long       copy;       /* Copy destination address */
+    unsigned long       exter;      /* External address         */
+    ramdump_callback_t  callback;   /* Callback funtion         */
+} ramdump_ram_config_t;
+
+/* client and server icp init msg */
+typedef struct
+{
+    ramdump_ram_config_t        *array;
+    unsigned long               nr;
+    ramdump_client_done_flag_t  done_flag;
+} ramdump_ram_config_msg_t;
+
+/* collect to trans server icp msginfo */
+typedef struct
+{
+    ramdump_ram_config_msg_t    *array;
+    unsigned long               nr;
+} ramdump_ram_config_sync_msg_t;
+
+/* client and server message define */
+typedef struct
+{
+    ramdump_cpu_id_t    cpu_id;
+    ramdump_msg_id_t    msg_id;
+
+    union
+    {
+        ramdump_ram_config_msg_t        ram_config;
+        ramdump_ram_config_sync_msg_t   ram_config_sync;
+    } msg_data_t;
+} ramdump_msg_t;
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+/* 
+ * ramdump assign id array, records the true cpu id value.
+ */
+extern unsigned long ramdump_cpu_id[RAMDUMP_CPU_MAX];
+extern unsigned long ramdump_cpu_ch[RAMDUMP_CPU_MAX];
+extern char *ramdump_cpu_name[RAMDUMP_CPU_MAX];
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ÄÚÁªº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_wait_client_dump_delay
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  ms:   µÈ´ýMSÊý
+                addr: µØÖ·
+                flag: µÈ´ý±êÖ¾
+*   (´«³ö²ÎÊý)  
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     This function is used to delay certain seconds
+*******************************************************************************/
+static inline void ramdump_wait_done_delay(
+                        unsigned long           ms, 
+                        volatile unsigned long *addr, 
+                        unsigned long           flag)
+{
+    int j = 0;
+    int i = 0;
+    for (j = 0; j < RAMDUMP_DELAY_MS_COUNT; j++)
+        for (i = 0; i < ms; i++)
+            if (*addr == flag)
+                return;
+}
+
+#endif  //#ifndef _RAMDUMP_PUB_H
+
diff --git a/cp/ps/plat/src/oss/sup/inc/ramdump_soc.h b/cp/ps/plat/src/oss/sup/inc/ramdump_soc.h
new file mode 100644
index 0000000..dc4db7b
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/ramdump_soc.h
@@ -0,0 +1,79 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_soc.h
+* Îļþ±êʶ:     ramdump_soc.h
+* ÄÚÈÝÕªÒª:     ramdump´¦ÀíÆ÷¾ßÌåÓ²¼þSOCƽ̨Ïà¹ØÍ·Îļþ£¬Æ½Ì¨¸ü»»ºóÐèÊÊÅä
+* ʹÓ÷½·¨:     
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/3/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+#ifndef _RAMDUMP_SOC_H
+#define _RAMDUMP_SOC_H
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+/* ramdump max file len, estimated */
+#define RAMDUMP_RAMCONF_FILENAME_MAXLEN (32)
+/* cpu name max len (string) */
+#define RAMDUMP_CPU_NAME_MAXLEN (RAMDUMP_RAMCONF_FILENAME_MAXLEN)
+/* 
+ * dump file table contens at least 60 item, 
+ * refer to all the ddr + iram + tcm sections in zx297520v2 chip menual,
+ * these sections are just what we can dump.
+ */
+#define RAMDUMP_RAMCONF_TABLE_MAXSIZE    (2400) /* 2k about, estimated */
+
+/* ramdump cmm scripts size, estimated */
+#define RAMDUMP_CMM_SIZE     (0x2000) /* 4K */
+
+/* ramdump cmm scripts size, estimated */
+#define RAMDUMP_ERROR_LOG_SIZE     (1024) 
+
+/* statics 2500 per ms, estimated */
+#define RAMDUMP_DELAY_MS_COUNT  (2500) 
+
+#ifdef __USE_RAMDUMP_TRANS_SERVER__
+/* ramdump channel number & size, estimated */
+#define RAMDUMP_CHANNEL_SIZE    (0x100) /* 4K */   //0x2000
+#define RAMDUMP_CHANNEL         (ICP_CHANNEL_RAMDUMP)
+
+/* zx297520V2 AP ram config */
+#define RAMDUMP_SERVER_DDR_BASE  (PLAT_PHYS_OFFSET) //(0x22000000) //TODO! ramconf.h
+#define RAMDUMP_SERVER_DDR_SIZE  (PLAT_PHYS_SIZE)
+
+#elif defined (__USE_RAMDUMP_CLIENT__)
+/* ramdump channel number & size, estimated */
+#define RAMDUMP_CHANNEL_SIZE    (0x100) /* 4K */ //0x2000
+#define RAMDUMP_CHANNEL         (RAMDUMP)
+
+#endif
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+#endif  //#ifndef _RAMDUMP_SOC_H
+
diff --git a/cp/ps/plat/src/oss/sup/inc/sup.h b/cp/ps/plat/src/oss/sup/inc/sup.h
new file mode 100644
index 0000000..da4dc33
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup.h
@@ -0,0 +1,114 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : supÄÚ²¿Í·Îļþ,¶¨ÒåÄÚ²¿¸÷Ä£¿é¹«¹²Êý¾Ý½á¹¹µÈ

+* ×÷    Õß : hongkun

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007-10-25

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/ 

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+

+#ifndef _SUP_H

+#define _SUP_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define CHANNEL_CFG_NUM                 30

+

+#define SUP_THREAD_LIVE_BIT             1

+#define SUP_THREAD_LAZY_BIT             2

+#define SUP_THREAD_STATISTIC_INFO_BIT   4

+

+#ifdef _OS_TOS

+#define TOS_STATISTIC_TIMESLICE

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/* ÄÚ´æ¹ÜÀíÄ£¿é */

+typedef struct 

+{

+    T_ZOss_Node     node;               /* Á´±í¿ØÖƽṹ     */

+    VOID            *mem;               /* ÄÚ´æÖ¸Õë         */

+    UINT32          mem_size;           /* ÄÚ´æ´óС         */

+    CHAR            name[12];           /* ÉêÇëλÖÃÎļþ     */

+    UINT32          line;               /* ÉêÇëλÖÃÐкŠ    */

+    ZOSS_THREAD_ID  thread_id;          /* ÉêÇëÏ̺߳Š      */

+    ZOSS_TASK_ID    task_id;            /* ÉêÇëÈÎÎñºÅ       */

+    UINT32          apply_time_tick;    /* ÉêÇëʱ¼ä(TICK)   */

+}T_Mem_MemNodeInfo;                     /* ϵͳÄÚ´æÐÅÏ¢     */

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+UINT32 TIMER_Init(VOID);

+UINT32 TEST_Init(VOID);

+UINT32 PSM_Init(VOID);

+UINT32 NV_Init(VOID);

+#ifdef TOS_STATISTIC_TIMESLICE

+void zOss_StatisticTimesliceStart(UINT32 time_len, UINT32 type);

+#endif

+/*ÈÎÎñ¹ÜÀíÄ£¿é */

+UINT32 SCHE_Init(VOID);

+UINT32 zOss_TaskSendDataEx(T_ZOss_TaskMsgHead *buf);

+UINT32 Sche_TaskSend(UINT32 msg_id, VOID *buf, UINT16 msg_len, ZOSS_TASK_ID s_task_id, ZOSS_TASK_ID t_task_id);

+UINT32 Sche_TaskSendData(UINT32 msg_id, VOID *buf, UINT16 msg_len, ZOSS_TASK_ID s_task_id, ZOSS_TASK_ID t_task_id);

+UINT32 Sche_InterruptTaskSend(UINT32 msg_id, T_ZOss_TaskMsgHead *pMsg, UINT16 msg_len, ZOSS_TASK_ID task_id);

+VOID *Sche_getBufPoint(T_ZOss_TaskMsgHead *phead);

+UINT32 Sche_getBufLength(T_ZOss_TaskMsgHead *phead);

+UINT32 Sche_DeadLoop(ZOSS_TASK_ID *task_id_arr);

+

+/* ÄÚ´æ¹ÜÀíÄ£¿é */

+UINT32 MEM_Init(VOID);

+VOID FS_Init(VOID);

+UINT32 Mem_GetSysMemDebugInfo(T_ZOss_List *mem_debug_info_lst);

+UINT32 Mem_GetUBUseInfo(T_Mem_UBPoolGrpInfo *ub_pool_grp_info, UINT8 num);

+UINT32 Mem_CheckUBLeak(T_Mem_UBLeakInfo *ub_leak_info, UINT32 ub_leak_time, UINT8 poolNum, UINT32 size);

+UINT32 Mem_ThreadUBInfo(ZOSS_THREAD_ID threadId, T_Mem_UBBlockInfo *threadUbInfo, UINT32 num, UINT8 poolNum);

+UINT32 Mem_TaskUBInfo(ZOSS_TASK_ID taskId, T_Mem_UBBlockInfo *taskUbInfo, UINT32 num, UINT8 poolNum);

+

+/* Òì³£¹ÜÀíÄ£¿é */

+UINT32 EXCEP_Init(VOID);

+VOID Excep_DaemonTask(UINT8 state, UINT32 msg_id, UINT8 *buf, UINT16 msg_len, UINT8 *private_data);

+

+/* Ê¡µç¹³×Óº¯Êý*/

+VOID zOss_ThreadSwapInPsmHook(T_ZOsa_ThreadUserArea *user_area);

+VOID zOss_ThreadSwapOutPsmHook(T_ZOsa_ThreadUserArea *user_area);

+VOID zOss_RecordPsmLastSwapTime(VOID);

+VOID zOss_ClearSleepTime(VOID);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _SUP_H */

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_agent.h b/cp/ps/plat/src/oss/sup/inc/sup_agent.h
new file mode 100644
index 0000000..58e737e
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_agent.h
@@ -0,0 +1,77 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifndef OSAGT_H

+#define OSAGT_H

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+//¹¤¾ß×Ô¶¨ÒåµÄʼþºÅ

+#define PC_AGT_ACK                      100

+#define PC_AGT_SET_VARIABLE             101

+#define PC_AGT_GET_VARIABLE             102

+#define PC_AGT_SNAPSHOT                 103

+#define PC_AGT_STOP                     104

+#define PC_AGT_START                    105

+

+#define AGT_PC_ACK                      50

+#define AGT_PC_WINDOW_INFO_THREAD       0

+#define AGT_PC_WINDOW_INFO_EVENT        1

+#define AGT_PC_WINDOW_INFO_TIMER        2

+#define AGT_PC_WINDOW_INFO_TASK         3

+#define AGT_PC_WINDOW_INFO_RAMLOG       4

+#define AGT_PC_WINDOW_INFO_POOL         5

+#define AGT_PC_WINDOW_INFO_MMU          6

+#define AGT_PC_WINDOW_INFO_MSG          7

+#define AGT_PC_WINDOW_INFO_POOLLEAK     8

+#define AGT_PC_WINDOW_INFO_VARIABLE     9

+#define AGT_PC_WINDOW_INFO_MEM          10

+#define AGT_PC_WINDOW_INFO_CPU          11

+#define PC_WINDOW_NUM                   12

+

+#define WINDOW_OS_MAP_MAX_NUM           3

+

+//PC²à´°¿Ú±àºÅ

+#define PC_TOOL_WINDOW_THREAD           AGT_PC_WINDOW_INFO_THREAD

+#define PC_TOOL_WINDOW_EVENT            AGT_PC_WINDOW_INFO_EVENT

+#define PC_TOOL_WINDOW_TIMER            AGT_PC_WINDOW_INFO_TIMER

+#define PC_TOOL_WINDOW_TASK             AGT_PC_WINDOW_INFO_TASK

+#define PC_TOOL_WINDOW_RAMLOG           AGT_PC_WINDOW_INFO_RAMLOG

+#define PC_TOOL_WINDOW_POOL             AGT_PC_WINDOW_INFO_POOL

+#define PC_TOOL_WINDOW_MMU              AGT_PC_WINDOW_INFO_MMU

+#define PC_TOOL_WINDOW_MSG              AGT_PC_WINDOW_INFO_MSG

+#define PC_TOOL_WINDOW_POOLLEAK         AGT_PC_WINDOW_INFO_POOLLEAK

+#define PC_TOOL_WINDOW_VARIABLE         AGT_PC_WINDOW_INFO_VARIABLE

+#define PC_TOOL_WINDOW_MEM              AGT_PC_WINDOW_INFO_MEM

+#define PC_TOOL_WINDOW_CPU              AGT_PC_WINDOW_INFO_CPU

+

+//Ä¿±êÄ£¿éÃû

+#define OS_TASK_NAME               "OssMonitor"

+#endif

+#endif

+

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_agent_osinfopack.h b/cp/ps/plat/src/oss/sup/inc/sup_agent_osinfopack.h
new file mode 100644
index 0000000..cf61e49
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_agent_osinfopack.h
@@ -0,0 +1,181 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifndef OSINFOPACK_H

+#define OSINFOPACK_H

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "oss_api.h"

+#include "oss_monitor.h"

+

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+#define NUMERIC_LEN                    4

+#define VERSION_LEN                    32

+#define FILE_LEN                       128

+#define THREAD_NAME_LEN                64

+#define TASK_NAME_LEN                  64

+#define EVENT_NAME_LEN                 64

+#define TICKSTAMP_LEN                  8

+#define MMU_NAME_LEN                   64

+#define OWNER_NAME_LEN                 64

+#define SENDER_NAME_LEN                64

+#define RECEIVER_NAME_LEN              64

+#define TIMER_EXPIRY_NUM               2

+#define TIMER_EXPIRY_LEN               4

+#define EVENT_NUM                      4

+#define EVENT_LEN                      16

+#define TASK_STATUS_NUM                4

+#define TASK_STATUS_LEN                8

+#define MMU_PERMISSION_NUM             6

+#define MMU_PERMISSION_LEN             16

+#define THREAD_STATUS_NUM              3

+#define THREAD_STATUS_LEN              8

+

+/**************************************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+***************************************************************************************************/

+typedef struct

+{

+	char version[VERSION_LEN];

+}T_Version;

+

+typedef struct

+{

+	BYTE feq[NUMERIC_LEN];

+}T_Frequency;

+

+typedef struct

+{

+	BYTE load[NUMERIC_LEN];

+}T_CpuLoad;

+

+typedef struct

+{

+	BYTE size[NUMERIC_LEN];

+	BYTE total[NUMERIC_LEN];

+	BYTE used[NUMERIC_LEN];

+	BYTE maxUsed[NUMERIC_LEN];

+}T_Pool_Ele;

+

+typedef struct

+{

+	BYTE address[NUMERIC_LEN];

+	BYTE owner[NUMERIC_LEN];

+	BYTE timeStamp[NUMERIC_LEN];

+	char file[FILE_LEN];

+	BYTE line[NUMERIC_LEN];

+}T_Pool_Alloc_Ele, T_Pool_Leak_Ele;

+

+typedef struct

+{

+    BYTE base[NUMERIC_LEN];

+    BYTE size[NUMERIC_LEN];

+    BYTE used[NUMERIC_LEN];

+}T_Heap;

+

+typedef struct//modified by zyn

+{

+    char name[THREAD_NAME_LEN];

+    BYTE handle[NUMERIC_LEN];

+    BYTE msg_no[NUMERIC_LEN];

+    char status[THREAD_STATUS_LEN];

+    BYTE priority[NUMERIC_LEN];

+    BYTE stack_used[NUMERIC_LEN];

+    BYTE stack_max_used[NUMERIC_LEN];

+    BYTE cpu_load[NUMERIC_LEN];

+	

+}T_Thread_Ele;

+

+typedef struct //modified by zyn

+{

+    char name[TASK_NAME_LEN];

+    BYTE handle[NUMERIC_LEN];

+    BYTE thread_handle[NUMERIC_LEN];

+    char status[TASK_STATUS_LEN];

+	

+}T_Task_Ele;

+

+typedef struct //modified by zyn

+{

+    char name[EVENT_NAME_LEN];

+    char event[EVENT_LEN];

+    BYTE handle[NUMERIC_LEN];

+    BYTE tickstamp[TICKSTAMP_LEN];

+	

+}T_Event_Ele;

+

+typedef struct

+{

+	BYTE msgId[NUMERIC_LEN];

+    BYTE address[NUMERIC_LEN]; //ÆðʼµØÖ·

+	BYTE size[NUMERIC_LEN];    //³¤¶È

+    char sender[SENDER_NAME_LEN];

+    char receiver[RECEIVER_NAME_LEN];

+    BYTE timestamp[NUMERIC_LEN];

+}T_Msg_Ele;

+

+typedef struct //modified by zyn

+{

+    BYTE handle[NUMERIC_LEN];

+    BYTE start_time[NUMERIC_LEN];

+    BYTE expire_time[NUMERIC_LEN];

+    BYTE callback_func[NUMERIC_LEN];

+    char is_period[TIMER_EXPIRY_LEN];

+}T_Timer_Ele;

+

+typedef struct

+{

+	char name[MMU_NAME_LEN];

+    BYTE vir_addr[NUMERIC_LEN];

+    BYTE phy_addr[NUMERIC_LEN];

+    BYTE size[NUMERIC_LEN];

+    char attr[MMU_PERMISSION_LEN]; /* permission and access */

+}T_Mmu_Ele;

+

+/**************************************************************************************************

+* º¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+VOID zOss_MonitorAgt_PackVersion(UINT8* code, T_ZOss_Mon_Version* version); 

+VOID zOss_MonitorAgt_PackFrequency(UINT8* code, T_ZOss_Mon_Cpu_Frequency* frequency); 

+VOID zOss_MonitorAgt_PackCpuLoad(UINT8* code, T_ZOss_Mon_Cpu_Load* cpuLoad); 

+VOID zOss_MonitorAgt_PackPoolEle(UINT8* code, T_ZOss_Mon_Pool_Ele* pool_ele);

+VOID zOss_MonitorAgt_PackPoolAllocEle(UINT8* code, T_ZOss_Mon_Pool_Alloc_Ele* pool_alloc_ele);

+VOID zOss_MonitorAgt_PackPoolLeakEle(UINT8* code, T_ZOss_Mon_Pool_Leak_Ele* pool_leak_ele);

+VOID zOss_MonitorAgt_PackHeap(UINT8* code, T_ZOss_Mon_Heap* heap);

+VOID zOss_MonitorAgt_PackThreadEle(UINT8* code, T_ZOss_Mon_Thread_Ele* thread_ele);

+VOID zOss_MonitorAgt_PackTaskEle(UINT8* code, T_ZOss_Mon_Task_Ele* task_ele);

+VOID zOss_MonitorAgt_PackEventEle(UINT8* code, T_ZOss_Mon_Event_Ele* event_ele);

+VOID zOss_MonitorAgt_PackMsgEle(UINT8* code, T_ZOss_Mon_Msg_Ele* msg_ele);

+VOID zOss_MonitorAgt_PackTimerEle(UINT8* code, T_ZOss_Mon_Timer_Ele* timer_ele);

+VOID zOss_MonitorAgt_PackMmuEle(UINT8* code, T_ZOss_Mon_Mmu_Ele* mmu_ele);

+

+#endif

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_agent_pcmessage.h b/cp/ps/plat/src/oss/sup/inc/sup_agent_pcmessage.h
new file mode 100644
index 0000000..6562d2f
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_agent_pcmessage.h
@@ -0,0 +1,47 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifndef OSAGT_PCMESSAGE_H

+#define OSAGT_PCMESSAGE_H

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* º¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+VOID zOss_MonitorAgt_PcAckReq(VOID);

+#ifdef _USE_WINCOMM_SERVER

+VOID zOss_MonitorAgt_PcSetValueReq(UINT32 len, BYTE* buf);

+VOID zOss_MonitorAgt_PcGetValueReq(UINT32 len, BYTE* buf);

+#else

+VOID zOss_MonitorAgt_PcSetValueReq(UINT16 len, BYTE* buf);

+VOID zOss_MonitorAgt_PcGetValueReq(UINT16 len, BYTE* buf);

+#endif

+VOID zOss_MonitorAgt_PcSnapshotReq(UINT8 msgId);

+VOID zOss_MonitorAgt_PcStop(VOID);

+VOID zOss_MonitorAgt_PcStart(VOID);

+

+#endif

+#endif

+

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_agent_status.h b/cp/ps/plat/src/oss/sup/inc/sup_agent_status.h
new file mode 100644
index 0000000..bbdb884
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_agent_status.h
@@ -0,0 +1,52 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+#ifndef OSAGT_STATUS_H

+#define OSAGT_STATUS_H

+#ifdef _USE_MONITOR

+

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "oss_api.h"

+

+/**************************************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+***************************************************************************************************/

+typedef enum

+{

+	OsAgt_Status_Error = 0,

+    OsAgt_Status_Ok

+

+}OsAgt_Status;

+

+/**************************************************************************************************

+* º¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+OsAgt_Status zOss_MonitorAgt_CheckReceiveMessage(UINT32 msgId);

+OsAgt_Status zOss_MonitorAgt_CheckReplyMessage(UINT32 msgId);

+

+#endif

+#endif/*__OS_AGENT_STATUS_H__*/

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_agent_toolkit.h b/cp/ps/plat/src/oss/sup/inc/sup_agent_toolkit.h
new file mode 100644
index 0000000..b21a23f
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_agent_toolkit.h
@@ -0,0 +1,45 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+#ifndef OSAGT_TOOLKIT_H

+#define OSAGT_TOOLKIT_H

+#ifdef _USE_MONITOR

+

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "oss_api.h"

+

+/**************************************************************************************************

+* º¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+VOID zOss_MonitorAgt_SendMsgToOs(UINT32 id, UINT16 len, UINT8* buf);

+VOID zOss_MonitorAgt_SendDataToPcTool(UINT8* buf, UINT32 len);

+VOID zOss_MonitorAgt_CharToByteArray(char* array, const char* charStr, DWORD maxLen);

+VOID zOss_MonitorAgt_FileNameToByteArray(char* array, const char* charStr, DWORD maxLen);

+VOID zOss_MonitorAgt_SetOsTaskId(ZOSS_TASK_ID taskId);

+

+#endif

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_agent_uemessage.h b/cp/ps/plat/src/oss/sup/inc/sup_agent_uemessage.h
new file mode 100644
index 0000000..ec09226
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_agent_uemessage.h
@@ -0,0 +1,45 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifndef OSAGT_UEMESSAGE_H

+#define OSAGT_UEMESSAGE_H

+#ifdef _USE_MONITOR

+

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "oss_api.h"

+#include "oss_monitor.h"

+

+/**************************************************************************************************

+* º¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+VOID zOss_MonitorAgt_InitUeMessage(VOID);

+//handle all message

+VOID zOss_MonitorAgt_UeMessageHandler(UINT32 msgId, UINT8 *buf);

+

+#endif

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_except.h b/cp/ps/plat/src/oss/sup/inc/sup_except.h
new file mode 100644
index 0000000..2530330
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_except.h
@@ -0,0 +1,92 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_except.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : P96AÒì³£¹ÜÀíÄ£¿éÍ·Îļþ

+* ×÷    Õß : ÖܹúÆÂ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007/09/04

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+#ifndef _SUP_EXCEP_H

+#define _SUP_EXCEP_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef  _OS_WIN

+#define snprintf                _snprintf       /* vcÊÇ_snprintf        */

+#endif

+

+#define EXCEP_DAEMONTASKNAME    "zOss_ExcepDaemonTask"

+

+#ifdef _OS_LINUX

+#       define EXCEP_IDLETHREADNAME  "swapper"

+#else

+# ifdef _USE_PSM

+#       define EXCEP_IDLETHREADNAME  "zOss_ThreadPsm"

+# else

+#   ifdef _OS_TOS

+#       define EXCEP_IDLETHREADNAME  "tos_idle_thread"

+#   else

+#       define EXCEP_IDLETHREADNAME  "zOss_ExcepIdleThread"

+#   endif

+# endif

+#endif

+

+/* ÏûÏ¢ */

+#define EV_ZOSS_EXCEP_WDT_SET       (EV_ZOSS_EXCEP_BASE + 0x10) /* ÉèÖÿ´ÃŹ·               */

+#define EV_ZOSS_EXCEP_DEADLOOPCHECK (EV_ZOSS_EXCEP_BASE + 0x13) /* ËÀÑ­»·¼ì²â               */

+#define EV_ZOSS_EXCEP_UPDATECPUTIME (EV_ZOSS_EXCEP_BASE + 0x15) /* ÉèÖøüÐÂCPUʹÓÃÂÊʱ¼ä    */

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+UINT32 Excep_ErrlogWrite(const CHAR *buf, UINT32 buf_len);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _SUP_EXCEP_H */

+

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_nvm.h b/cp/ps/plat/src/oss/sup/inc/sup_nvm.h
new file mode 100644
index 0000000..2a7cafb
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_nvm.h
@@ -0,0 +1,81 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_NV

+* ÎÄ ¼þ Ãû : sup_nvm.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : NVÊý¾Ý¹ÜÀíÄ£¿é

+* ×÷    Õß : ¬л¼ª

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012-09-10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é  EC:617001781798

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é   EC:617001781846 

+**************************************************************************/

+#ifndef _SUP_NVM_H

+#define _SUP_NVM_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/* NVÁ´±í½Úµã½á¹¹Ìå */

+typedef struct 

+{

+    T_ZOss_Node Node;          /* ͨÓÃÁ´±í½Úµã  */

+    T_ZOss_List Child_List;    /* ×ÓÁ´±í        */

+    UINT32      Block_Addr;    /* ¿éµØÖ·        */

+}T_NV_MAIN_NODE;               /* NVÁ´±íÖ÷½Úµã  */

+

+

+typedef struct 

+{

+    T_ZOss_Node Node;          /* ͨÓÃÁ´±í½Úµã  */

+    UINT32      Addr;          /* µØÖ·          */

+    UINT32      Len;           /* ³¤¶È          */

+}T_NV_CHILD_NODE;              /* NVÁ´±í×Ó½Úµã  */

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+UINT32 Nvram_Finish(VOID);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _SUP_NVM_H */

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_ramdump.h b/cp/ps/plat/src/oss/sup/inc/sup_ramdump.h
new file mode 100644
index 0000000..60ba364
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_ramdump.h
@@ -0,0 +1,276 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ÌṩramdumpÏûÏ¢½á¹¹Ìå

+* ×÷    Õß : gaohuafeng

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2013/10/29

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+

+#ifndef _SUP_RAMDUMP_H

+#define _SUP_RAMDUMP_H

+

+#ifdef _USE_MULTI_CORE_RAMDUMP

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "drvs_icp.h"

+#include "ram_config.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* Ö¸ÁÒå */

+#define ZOSS_RAMDUMP_FILE_LINK_REQ              1   /*ͬ²½ÇëÇó*/

+#define ZOSS_RAMDUMP_FILE_LINK_RSP              2   /*ͬ²½ÇëÇóÓ¦´ð,´«ÊäramdumpµÄÎļþÊýÄ¿*/

+#define ZOSS_RAMDUMP_FILE_FILE_REQ              3   /*ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅµÄÎļþÐÅÏ¢*/

+#define ZOSS_RAMDUMP_FILE_FILE_RSP              4   /*ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅµÄÎļþÐÅÏ¢µÄÓ¦´ð£¬´«ÊäÎļþÃû¼°´óС*/

+#define ZOSS_RAMDUMP_FILE_READ_REQ              5   /*ÇëÇó¶Áȡָ¶¨Îļþ±àºÅµÄÎļþÄÚÈÝ*/

+#define ZOSS_RAMDUMP_FILE_READ_RSP              6   /*ÇëÇó¶Áȡָ¶¨Îļþ±àºÅµÄÎļþÄÚÈݵÄÓ¦´ð£¬´«ÊäÎļþÄÚÈÝ*/

+#define ZOSS_RAMDUMP_FILE_END_REQ               7   /*´«Êä½áÊø*/

+#define ZOSS_RAMDUMP_FILE_END_RSP               8   /*´«Êä½áÊøÓ¦´ð*/  

+

+/* ramdump×î´óÎļþÃû³¤¶È */

+#define ZOSS_RAMDUMP_FILENAME_LEN               32  

+

+/* RamdumpÎļþµÄÃû×Ö */

+#define ZOSS_RAMDUMP_DIR_NAME                   "ramdump_dir"

+

+/* ´íÎóÀàÐÍ */        

+#define ZOSS_RAMDUMP_FILE_CMD_FAIL              9   /*Ö¸Áî´íÎó*/

+#define ZOSS_RAMDUMP_FILE_NO_FAIL               10  /*ÇëÇó´«µÝÖ¸¶¨Îļþ±àºÅ´í*/

+#define ZOSS_RAMDUMP_FILE_LEN_FAIL              11  /*ÇëÇó´«µÝÖ¸¶¨ÎļþλÖôóС´í*/

+#define ZOSS_RAMDUMP_CMD_BUFFER_LEN             16  /*Ö¸ÁîÖ¡³¤¶È */

+

+/* ramdumpÄÚ´æ¿é´óСÅäÖÃ,ÐÞ¸ÄÅäÖÃʱעÒâÐÞ¸ÄserverºÍclientµÄ×ܹ²±ÈÀý´óС*/

+#define ZOSS_RAMDUMP_CMM_INFO_RATE               4

+#define ZOSS_RAMDUMP_CONFIGURED_REGION_RATE      4

+#define ZOSS_RAMDUMP_PARSED_REGION_RATE          4

+#define ZOSS_RAMDUMP_FILE_INFO_RATE              4

+#define ZOSS_RAMDUMP_AGENT_FILE_INFO_RATE        4

+#define ZOSS_RAMDUMP_ERR_INFO_RATE               1

+#define ZOSS_RAMDUMP_IO_READBUF_RATE             1

+#define ZOSS_RAMDUMP_IO_WRITEBUF_RATE            1

+#define ZOSS_RAMDUMP_SERVER_TOTAL_RATE          23

+#define ZOSS_RAMDUMP_CLIENT_TOTAL_RATE          17                                    

+

+#define ZOSS_RAMDUMP_FLAG_SIZE                  4

+#define ZOSS_RAMDUMP_FLAG_FIRST_VALUE           0x11111111

+#define ZOSS_RAMDUMP_FLAG_SECOND_VALUE          0x22222222

+#define ZOSS_RAMDUMP_FLAG_THIRD_VALUE           0x33333333

+#define ZOSS_RAMDUMP_FLAG_FOUR_VALUE            0x44444444

+

+/* ÏûÏ¢½»»¥ÀàÐÍ */

+#define ZOSS_RAMDUMP_INIT_TYPE                  0

+#define ZOSS_RAMDUMP_EXCPT_TYPE                 1

+#define ZOSS_RAMDUMP_DATA_READY_TYPE            2

+#define ZOSS_RAMDUMP_TEST_EXCPT_TYPE            3

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    UINT32 cmmFileSize;

+    UINT32 cmmFileMaxSize;

+    CHAR   cmmFileBuffer[0];    /* cmmÎļþ»º³å£¬ºóÃæ»¹Óпռä */

+} T_zOss_RamdumpCmmFileInfo;

+

+typedef struct

+{

+    UINT32          srcModId;

+    UINT32          desModId;

+    T_HalIcp_Dword  intInfo;

+} T_zOss_RamdumpIcpInfo;

+

+typedef struct

+{

+    UINT32  clientId; 

+    CHAR    *pRamdumpStartAddr;

+    UINT32  ramdumpSize;  

+} T_zOss_RamdumpClientConInfo;

+

+typedef struct

+{

+    CHAR    fileName[ZOSS_RAMDUMP_FILENAME_LEN];    /* ÎļþÃû                 */

+    UINT32  baseforServer;                          /* server¶Ë¿ÉÒÔ·ÃÎʵĵØÖ· */

+    UINT32  size;                                   /* ´óС                   */

+} T_zOss_RamdumpFile;

+

+typedef struct

+{

+    UINT32              fileNum;        /* Îļþ¸öÊý         */

+    UINT32              fileMaxNum;     /* ÎļþµÄ×î´ó¸öÊý   */

+    T_zOss_RamdumpFile  fileInfo[0];    /* ºóÐø¿ÉÄÜ»¹ÓÐÊý¾Ý */

+} T_zOss_RamdumpFileInfo;

+

+typedef struct

+{

+    UINT32              buffLen;        /* buffµÄ´óС  */

+    CHAR                *pBuff;         /* buff µÄÖ¸Õë */

+} T_zOss_RamdumpBuffInfo;

+

+typedef struct

+{

+    UINT32  serverId; 

+    CHAR    *pRamdumpStartAddr;

+    UINT32  ramdumpSize;

+} T_zOss_RamdumpServerConInfo;

+

+/* ramdumpÏûÏ¢½á¹¹Ìå */

+typedef struct

+{

+   UINT32               regionNum;

+   UINT32               regionMaxNum;

+   T_zOss_RamdumpRegion regions[0];     /* ºóÐø¿ÉÄÜ»¹ÓÐÊý¾Ý */

+} T_zOss_RamdumpRegionInfo;

+

+typedef struct

+{

+    UINT32  msgType;

+    UINT32  Identifier;

+} T_zOss_RamdumpAgentMsgInfo;

+

+/* ͬ²½ÇëÇóÓ¦´ð             */

+typedef struct

+{

+    UINT32  fileNum;                    /* Òª´«ÊäµÄÎļþ¸öÊý */

+} T_zOss_RamumpFileLinkRsp;

+

+/* ¿ªÊ¼Îļþ´«ÊäÇëÇóÏûÏ¢Ìå   */

+typedef struct

+{

+    UINT32  fileNo;                     /* Îļþ±àºÅ,0¿ªÊ¼ */

+} T_zOss_RamdumpFileFileReq;

+

+/* ¿ªÊ¼Îļþ´«Ê仨ӦÏûÏ¢Ìå   */

+typedef struct

+{

+    CHAR   fileName[ZOSS_RAMDUMP_FILENAME_LEN]; /* ÎļþÃû   */

+    UINT32 size;                                /* Îļþ´óС */

+} T_zOss_RamdumpFileFileRsp;

+

+/* ¶ÁÊý¾ÝÇëÇóÏûÏ¢Ìå         */

+typedef struct

+{

+    UINT32 fileNo;      /* Îļþ±àºÅ         */

+    UINT32 offset;      /* offsetΪÊý¾ÝÆ«ÒÆ */

+    UINT32 length;      /* lengthΪÊý¾Ý³¤¶È */

+} T_zOss_RamdumpFileReadReq;

+

+typedef struct

+{

+    UINT32  msgType;

+    UINT32  srcModId;

+    CHAR    *pRamdumpStartAddr;

+    UINT32  ramdumpSize;

+} T_zOss_RamdumpClientMsgInfo;   /* ·¢ËÍÏûÏ¢ÀàÐÍ */

+

+typedef struct

+{

+    UINT32  msgType;

+    VOID    *pServerConInfo;

+} T_zOss_RamdumpServerMsgInfo;

+

+typedef struct

+{

+    UINT32                      clientId; 

+    T_zOss_RamdumpCmmFileInfo   *pCmmInfo;

+    T_zOss_RamdumpRegionInfo    *pConfigureInfo;

+    T_zOss_RamdumpRegionInfo    *pParsedInfo;

+    T_zOss_RamdumpBuffInfo      *pErrInfo;

+    volatile UINT32             clientFlagBase;                    

+} T_zOss_RamdumpClientInfo;

+

+typedef struct

+{

+    UINT32                      clientId; 

+    T_zOss_RamdumpCmmFileInfo   *pCmmInfo;

+    T_zOss_RamdumpRegionInfo    *pConfigureInfo;

+    T_zOss_RamdumpRegionInfo    *pParsedInfo;

+    T_zOss_RamdumpFileInfo      *pFileInfo;

+    T_zOss_RamdumpFileInfo      *pAgentFileInfo;

+    T_zOss_RamdumpBuffInfo      *pErrInfo;

+    T_zOss_RamdumpBuffInfo      *pIoReadbuf;

+    T_zOss_RamdumpBuffInfo      *pIoWritebuf;

+    BOOL                        *pWaitMsgFlag;

+} T_zOss_RamdumpServerInfo;

+

+typedef struct

+{

+    BOOL    exceptFlag;           /* ÊÇ·ñ·¢Éú¹ýÒì³£ */

+    UINT32  exceptCore;           /* ·¢ÉúÒì³£µÄºË   */    

+} T_zOss_RamdumpExceptInfo;       /* Òì³£ÐÅÏ¢½á¹¹Ìå */

+

+#ifdef _USE_ARM1_RAMDUMP

+typedef struct

+{

+   UINT32   startAddr;

+   UINT32   endAddr;

+   UINT32   mapAddr;

+   UINT32   copyAddr;

+} T_zOss_RamdumpArm1Region;

+

+typedef struct

+{

+  UINT32                   regionNum;

+  T_zOss_RamdumpArm1Region regions[0];

+} T_zOss_RadmumpArm1RegionInfo;

+#endif

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+VOID    zOss_RamdumpEncodeError(CHAR *pBuff, UINT16 user_called, UINT16 ecode, UINT16 extra);

+VOID    zOss_RamdumpCreateCmmFile(T_zOss_RamdumpCmmFileInfo  *pCmmFileInfo);

+CHAR    *zOss_RamdumpCreateRegionsCmmFile(CHAR *address);

+VOID    zOss_RamdumpSaveRegisters(VOID);

+UINT32  zOss_CleanCache(VOID);

+VOID    zOss_RamdumpInit(VOID);

+UINT32  zOss_RamdumpForceClientException(UINT32 coreId);

+VOID    zOss_RamdumpHandle(UINT16 user_called, UINT16 ecode, UINT16 extra);

+VOID    zOss_RamdumpSaveRegisters(VOID);

+UINT32  zOss_Cp15ReadControlRegister(VOID);

+UINT32  zOss_ReadCpsr(VOID);

+VOID    zOss_RamdumpSetUsbOpt(VOID);

+VOID    zOss_RamdumpSetIcpOpt(VOID);

+VOID    zOss_RamdumpUsbInit(VOID);

+VOID    zOss_RamdumpUsbReadData(UINT8 *buffer, UINT32 size);

+VOID    zOss_RamdumpUsbWriteData(UINT8 *buffer, UINT32 size);

+VOID    zOss_RamdumpUsbFinish(VOID);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+extern T_zOss_RamdumpOpt g_zRamdump_Optfunc;

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _USE_MULTI_CORE_RAMDUMP */

+#endif  /* _SUP_RAMDUMP_H */

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_shell.h b/cp/ps/plat/src/oss/sup/inc/sup_shell.h
new file mode 100644
index 0000000..7c5f054
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_shell.h
@@ -0,0 +1,76 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : shell¿ò¼ÜÍ·Îļþ

+* ×÷    Õß : ÖܹúÆÂ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2008-04-21 

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+#ifndef _SUP_SHELL_H

+#define _SUP_SHELL_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "sup.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef _OS_WIN

+#define __FUNCTION__  "FUNCTION"

+#endif

+    

+#define SHELL_THREAD_NAME      "zOss_ShellThread"     /* ²âÊÔÏß³ÌÃû³Æ */

+#define T_Test_CommandMessage  T_Shell_CommandMessage

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct 

+{

+    CHAR        *cmd;

+    Shell_Func  func;

+    CHAR        *desc;

+}T_Shell_Cmd;       /* ÃüÁî½á¹¹ */

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+SINT32 Shell_StrisNumber(const CHAR *pStr);

+SINT32 Shell_isIdentifier(const CHAR *pStr);

+UINT32 Shell_GetWintracePrintFlag(VOID);

+UINT32 Shell_SetPrintFlag(UINT32 WintraceFlag);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _SUP_SHELL_H */

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_shell_cmd.h b/cp/ps/plat/src/oss/sup/inc/sup_shell_cmd.h
new file mode 100644
index 0000000..9591a61
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_shell_cmd.h
@@ -0,0 +1,118 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell_cmd.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÖܹúÆÂ

+* °æ    ±¾ : v1.0

+* Íê³ÉÈÕÆÚ : 2008-04-21

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+#ifndef _SUP_SHELL_CMD_H

+#define _SUP_SHELL_CMD_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_shell.h"

+#ifdef _OS_LINUX

+#include <linux/ctype.h>

+#else

+#include <ctype.h>

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ³£Á¿¶¨ÒåÇø

+**************************************************************************/

+#define CHAR_PRT(c)     (isgraph(c) ? (c) : '.')

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+/* »ù±¾ÃüÁî */

+extern VOID OSS_DbgShowBootInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgSetWintracePrintFlag(T_Shell_CommandMessage *CmdMsg);

+

+/* ÄÚ´æ¹Û²ì */

+extern VOID OSS_DbgShowMemInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgShowUbInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgShowThreadUbInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgShowTaskUbInfo(T_Shell_CommandMessage *CmdMsg);

+

+/* NV */

+extern VOID OSS_DbgShowNvInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgReadNv(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgWriteNv(T_Shell_CommandMessage *CmdMsg);

+

+/* µ÷¶ÈͨѶ */

+extern VOID OSS_DbgShowThreadInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgSuspendThread(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgResumeThread(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgSetThreadPri(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgShowTaskInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgShowMsg(T_Shell_CommandMessage *CmdMsg);

+

+/* Òì³£ */

+extern VOID OSS_DbgDisplayThreadExecInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgDisplayThreadsExecInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgSetUpdateCPUTime(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgThreadSetFlag(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgGetSysCPU(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgShowRegInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgRamdumpConfigRegionInfo(T_Shell_CommandMessage *CmdMsg);

+

+/* µ×²ãµ÷ÊÔÖ¸Áî */

+extern VOID OSS_DbgGetMem(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgSetMem(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgReboot(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_SetUBDbgSwitch(T_Shell_CommandMessage *CmdMsg);

+extern  VOID OSA_DbgMem(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_ForceRamdump(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_DbgMemTimeLeakInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_DbgMemInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_DbgUbInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_SetMemDbgSwitch(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSA_DbgTrace(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DbgProfile(T_Shell_CommandMessage * CmdMsg);

+extern VOID OSS_OpenTraceSwitch(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_SetAssertLevel(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_StartDaemonTask(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_PsmTraceInfo(T_Shell_CommandMessage *CmdMsg);

+extern VOID OSS_DfmTraceInfo(T_Shell_CommandMessage *CmdMsg);

+VOID Shell_ShowPoolInfo(T_Shell_CommandMessage *CmdMsg);

+VOID Shell_ShowProcSig(T_Shell_CommandMessage *CmdMsg);

+

+/**************************************************************************

+* È«¾Ö±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _SUP_SHELL_CMD_H */

+

+

diff --git a/cp/ps/plat/src/oss/sup/inc/sup_task.h b/cp/ps/plat/src/oss/sup/inc/sup_task.h
new file mode 100644
index 0000000..37d3ed8
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/inc/sup_task.h
@@ -0,0 +1,116 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_task.h

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ¹¨Òí

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007-09-12

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+#ifndef _SUP_TASK_H

+#define _SUP_TASK_H

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ³£Á¿¶¨ÒåÇø

+**************************************************************************/

+#define SCHE_MSG_MONI_ON        (UINT8)1            /* ÈÎÎñÏûÏ¢¼à¿Ø     */

+#define SCHE_MSG_MONI_OFF       (UINT8)0            /* ÈÎÎñÏûÏ¢²»¼à¿Ø   */ 

+#define SCHE_MAX_TICK           (UINT32)0xffffffff  /* ϵͳ×î´óTickÊý   */

+

+/* ÈÎÎñÀàÐÍ */

+#define SCHE_OSS_TASK           1                   /* ƽ̨ÈÎÎñ         */

+#define SCHE_SDL_TASK           2                   /* SDLÈÎÎñ          */

+

+#ifdef _OS_WIN

+#define SCHE_printf             printf

+#else

+#define _SUBMDL_                SUBMDL_SCHE

+#define _PRINT_LEVEL_           PRINT_LEVEL_NORMAL

+#define SCHE_printf(...)        zOss_Printf(_SUBMDL_, _PRINT_LEVEL_, ##__VA_ARGS__)

+#endif

+

+#define ZOSS_CAPT_MSG       0

+#define ZOSS_SELF_MIMO      0

+

+/* ÏûÏ¢³¤¶È */

+#define SCHE_M_TASKMSGHEAD_LEN  sizeof(T_ZOss_TaskMsgHead)  /* ÏûϢͷ³¤¶È   */

+#define SCHE_M_TASKMSGEX_LEN    sizeof(T_ZOss_TaskMsg)      /* ÏûÏ¢Ì峤¶È   */

+

+/* µ÷¶ÈÏ̵߳ǼDZí */

+#define SCHE_THREAD_TAB                                                                     \

+/*          Ïß³ÌÃû              Ïß³ÌID      Ïß³ÌÓÅÏȼ¶   ¶ÀÕ¼±êÖ¾ */                        \

+  {{0},    "zOss_ScheThread1",    NULL,       10,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread2",    NULL,       11,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread3",    NULL,       12,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread4",    NULL,       13,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread5",    NULL,       14,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread6",    NULL,       15,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread7",    NULL,       16,         1,      {0},     {0},     {0}},   \

+  {{0},    "zOss_ScheThread8",    NULL,       17,         1,      {0},     {0},     {0}}

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/* SDLÏà¹Ø»Øµ÷º¯ÊýÀàÐÍ */

+typedef UINT32 (*Task_SEND_HOOK)(UINT32 msg_id, const VOID *buf, UINT16 msg_len, ZOSS_TASK_ID task_id, ZOSS_TASK_ID s_task_id);

+typedef UINT32 (*Task_SEND_DATA_HOOK)(UINT32 msg_id, VOID *buf, UINT16 msg_len, ZOSS_TASK_ID task_id, ZOSS_TASK_ID s_task_id);

+typedef UINT32 (*Task_GET_ALL_ID_HOOK)(ZOSS_TASK_ID *task_id_arr);

+typedef ZOSS_TASK_ID (*Task_GET_ID_HOOK)(const CHAR *task_name);

+typedef CHAR *(*Task_GET_THAKNAME_HOOK)(ZOSS_TASK_ID task_id);

+

+typedef struct 

+{

+    T_ZOss_Node     node;                                   /* Ë«ÏòÁ´±í½áµã         */

+    CHAR            thread_name[ZOSS_MAX_TASKNAME_LEN + 1]; /* Ïß³ÌÃû£¬×64×Ö½Ú   */

+    ZOSS_THREAD_ID  thread_id;                              /* Ïß³ÌID               */

+    UINT32          priority;                               /* Ïß³ÌÓÅÏȼ¶           */

+    UINT8           pno;                                    /* ¶ÀÕ¼Ï̱߳ê־λ       */

+    T_ZOss_List     TCBReady;                               /* ¾ÍÐ÷ÈÎÎñÁ´±íÍ·       */

+    T_ZOss_List     TCBStopped;                             /* ×èÈûÈÎÎñÁ´±íÍ·       */

+    T_ZOss_List     TCBIdle;                                /* ¿ÕÏÐÈÎÎñÁ´±íÍ·       */

+}T_ZOss_TRF;                                                /* µ÷¶ÈÏß³ÌµÇ¼Ç±í       */

+

+/**************************************************************************

+* º¯ÊýÉùÃ÷Çø

+**************************************************************************/

+UINT32 Sche_SetTaskID(ZOSS_THREAD_ID threadId, VOID *taskId);

+VOID *Sche_GetTaskID(ZOSS_THREAD_ID threadId);

+

+/**************************************************************************

+* È«¾Ö±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+extern ZOSS_SEMAPHORE_ID gSche_SaticTaskInitSema;

+extern UINT32 gTask_TaskNum;

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif  /* _SUP_TASK_H */

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/makefile b/cp/ps/plat/src/oss/sup/src/makefile
new file mode 100644
index 0000000..6186f80
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/makefile
@@ -0,0 +1,216 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: Makefile

+#* ÄÚÈÝÕªÒª: ±àÒëtraceÄ£¿é

+#* ʹÓ÷½·¨:     

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2013/01/01      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+include $(PRJ_PATH)/config/project.mk

+

+#===============================================================================

+#·¾¶ÉèÖÃ

+#===============================================================================

+_MDL_NAME = sup

+

+_MDL_SRC_PATH = $(PLAT_PATH)/src/oss/sup/src

+_MDL_INC_PATH = $(PLAT_PATH)/src/oss/sup/inc

+_MDL_OBJ_PATH = $(OBJ_PATH)/plat/oss/$(_MDL_NAME)

+

+#===============================================================================

+#¸÷Ä£¿éÒÀÀµ¹«¹²Í·ÎļþÉèÖÃ

+#===============================================================================

+INCLUDE += -I$(PLAT_PATH)/inc                                               \

+           -I$(PLAT_PATH)/inc/oss                                           \

+           -I$(PLAT_PATH)/inc/drv                                           \

+           -I$(PLAT_PATH)/src/oss/osa/inc                                   \

+           -I$(DRV_PATH)/include                                            \

+           -I$(COMMOM_PATH)/inc/config                                      \

+           -I$(COMMOM_PATH)/inc/config/private                              \

+           -I$(COMMOM_PATH)/inc/config/public                               \

+           -I$(COMMOM_PATH)/inc/config/atcfg                                \

+           -I$(_MDL_INC_PATH)

+

+ifeq ($(OSTYPE),tos)

+INCLUDE += -I$(PLAT_PATH)/src/oss/osa/tos/inc                               \

+		   -I$(PRJ_PATH)/config/os/tos

+endif

+

+ifeq ($(OSTYPE),linux)

+INCLUDE += -I$(PLAT_PATH)/src/oss/osa/linux/inc                             \

+		   -I$(PRJ_PATH)/config/os/linux                            \

+		   -I$(DRV_PATH)/inc/misc

+endif

+

+#===============================================================================

+#×ÓϵͳÀ©Õ¹¶¨Òå

+#===============================================================================

+DEFINE += 

+

+#===============================================================================

+#Ä£¿éÎļþÐÅÏ¢ 

+#===============================================================================

+ifeq ($(USE_MULTI_CORE_RAMDUMP), yes)

+

+ifeq ($(USE_SERVER_RAMDUMP), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_server.c)	

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_comm.c) 

+endif

+

+ifeq ($(USE_CLIENT_RAMDUMP), yes)

+#_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_client.c)	

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_v7.c)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_client.c)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_oss.c)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_soc.c)

+ifeq ($(OSTYPE), tos)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_client_tos_adapt.c)

+endif

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_collect_server.c)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/ramdump_v7_asm.S)

+endif

+			 

+ifeq ($(CPU_ARCH), armv5)

+

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_arm.c)

+

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm_rvct.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+endif

+			

+ifeq ($(CPU_ARCH), armv6)

+

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_arm.c)

+

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm_rvct.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+endif

+

+ifeq ($(CPU_ARCH), armv7-r)

+

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_arm.c)

+

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm_rvct.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+endif

+

+ifeq ($(CPU_ARCH), armv7-a)

+

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_arm.c)

+

+ifeq ($(CMPL_TYPE), rvct)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm_rvct.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+ifeq ($(CMPL_TYPE), gcc_arm_linux)

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_arm_asm.S)

+endif

+

+endif

+

+ifeq ($(CPU_ARCH), armv6-m)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_cortexm.c) 

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_cortexm_asm.S)

+endif

+

+ifeq ($(CPU_ARCH), ck610)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_csky.c)		

+_S_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_except_csky_asm.S)			

+endif

+

+endif

+

+ifeq ($(USE_OSS_MIN), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_assert.c)                      \

+             $(wildcard $(_MDL_SRC_PATH)/sup_ramdump_client_lib.c)

+else

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_agent_entry.c)                 \

+             $(wildcard $(_MDL_SRC_PATH)/sup_agent_osinfopack.c)            \

+             $(wildcard $(_MDL_SRC_PATH)/sup_agent_pcmessage.c)             \

+             $(wildcard $(_MDL_SRC_PATH)/sup_agent_status.c)                \

+             $(wildcard $(_MDL_SRC_PATH)/sup_agent_toolkit.c)               \

+             $(wildcard $(_MDL_SRC_PATH)/sup_agent_uemessage.c)             \

+             $(wildcard $(_MDL_SRC_PATH)/sup_crc.c)                         \

+             $(wildcard $(_MDL_SRC_PATH)/sup_except.c)                      \

+             $(wildcard $(_MDL_SRC_PATH)/sup_monitor.c)                     \

+             $(wildcard $(_MDL_SRC_PATH)/sup_nvm.c)                         \

+             $(wildcard $(_MDL_SRC_PATH)/sup_printf.c)                      \

+             $(wildcard $(_MDL_SRC_PATH)/sup_ramlog.c)                      \

+             $(wildcard $(_MDL_SRC_PATH)/sup_shell.c)                       \

+             $(wildcard $(_MDL_SRC_PATH)/sup_sys.c)                         \

+             $(wildcard $(_MDL_SRC_PATH)/sup_assert.c)                      \

+             $(wildcard $(_MDL_SRC_PATH)/sup_task.c)

+

+ifeq ($(USE_OSS_SHELL_THREAD), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_shell_thread.c)

+endif

+

+ifeq ($(USE_OSS_SHELL_MEM), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_shell_mem.c)

+endif

+

+ifeq ($(USE_OSS_SHELL_PSM), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_shell_psm.c)

+endif

+

+ifeq ($(USE_OSS_SHELL_MISC), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_shell_misc.c)

+endif

+

+ifeq ($(USE_VSIM), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_vsim.c)

+endif

+ 

+ifeq ($(USE_VSIM_AGT), yes)

+_C_SOURCE += $(wildcard $(_MDL_SRC_PATH)/sup_vsim_agt.c)

+endif

+

+endif

+

+_s_SOURCE =

+

+#===============================================================================

+# ±àÒë¹æÔò

+#===============================================================================

+include $(FRAME_PATH)/rules/mdl_rules.mk

+

diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_client.c b/cp/ps/plat/src/oss/sup/src/ramdump_client.c
new file mode 100644
index 0000000..399c9ce
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_client.c
@@ -0,0 +1,420 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_client.c
+* Îļþ±êʶ:     ramdump_client.c
+* ÄÚÈÝÕªÒª:     ramdump¿Í»§¶ËÒì³£ËÀ»úÏÖ³¡Êý¾Ýµ¼³öʵÏÖ
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/6/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+#include "ramdump_oss.h"
+#ifdef __USE_CLIENT_WITH_COLLECT__
+#include "ramdump_collect_server.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+*                                Íⲿ±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+#ifdef _OS_TOS
+extern void ramdump_open_tcm_clock(void);
+#else 
+void ramdump_open_tcm_clock(void){}
+#endif
+
+/*******************************************************************************
+*                                  ³£Á¿¶¨Òå                                    *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+#define RAMDUMP_ON_DEFAULT_VAL  (1)
+
+#define RAMDUMP_CLIENT_SUCCESS (RAMDUMP_SUCCESS)
+#define RAMDUMP_CLIENT_FAILED  (RAMDUMP_FAILED)
+
+#define RAMDUMP_CLIENT_CMM_SCRNAME  "client_cmm.cmm"
+#define RAMDUMP_CLIENT_ERR_LOG      "client_error_log.txt"
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *
+*******************************************************************************/
+
+static int ramdump_client_init_flag = RAMDUMP_FALSE;
+static int ramdump_count;
+
+/* client ram conf table */
+static ramdump_ram_config_t ramdump_client_ram_conf[RAMDUMP_RAMCONF_TABLE_MAX_ENTRYS];
+/* client ram conf data done flag*/
+static unsigned long ramdump_client_ram_conf_done_flag = RAMDUMP_SYNC_RESET;
+
+/* Cmm file content */
+static char ramdump_client_cmm_buf[RAMDUMP_CMM_SIZE];
+/* */
+static char ramdump_client_errno_log[RAMDUMP_ERROR_LOG_SIZE];
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_client_copy_data
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) void
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    This function is used to copy some data to the addr
+*******************************************************************************/
+static void ramdump_client_copy_data(void)
+{
+    unsigned long i_ram_conf = 0;
+
+    while (ramdump_client_ram_conf[i_ram_conf].phy != 0 && 
+           ramdump_client_ram_conf[i_ram_conf].size != 0)
+    {
+        if (ramdump_client_ram_conf[i_ram_conf].flag == RAMDUMP_FLAG_NEED_COPY &&
+            ramdump_client_ram_conf[i_ram_conf].copy != 0 &&
+           (ramdump_client_ram_conf[i_ram_conf].phy != ramdump_client_ram_conf[i_ram_conf].copy))
+            {
+            memcpy(
+                (int *)ramdump_client_ram_conf[i_ram_conf].copy,
+                (int *)ramdump_client_ram_conf[i_ram_conf].phy,
+                ramdump_client_ram_conf[i_ram_conf].size);
+            }
+        i_ram_conf++;
+    }
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_client_cmm_and_log_recalc
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) void
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    This function is used to create err log file
+*******************************************************************************/
+static void ramdump_client_cmm_and_log_recalc(void)
+{
+    unsigned long i_ram_conf = 0;
+
+    while (ramdump_client_ram_conf[i_ram_conf].phy != 0 && 
+           ramdump_client_ram_conf[i_ram_conf].size != 0)
+    {
+        if (ramdump_client_ram_conf[i_ram_conf].phy == (unsigned long)ramdump_client_cmm_buf)
+            ramdump_client_ram_conf[i_ram_conf].size = strlen(ramdump_client_cmm_buf);
+        else if (ramdump_client_ram_conf[i_ram_conf].phy == (unsigned long)ramdump_client_errno_log)
+            ramdump_client_ram_conf[i_ram_conf].size = strlen(ramdump_client_errno_log);
+
+        i_ram_conf++;
+    }
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_client_error_log_create
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) void
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    This function is used to create err log file
+*******************************************************************************/
+static void ramdump_client_error_log_create(void)
+{
+    int offset = 0;
+    unsigned long *first_dump_cpu_id = ramdump_get_first_dump_cpu_id();
+
+#ifdef __USE_CLIENT_WITH_COLLECT__
+
+    offset = sprintf(
+                ramdump_client_errno_log, 
+                "core [%s]  exact error!\n", 
+                ramdump_cpu_name[*first_dump_cpu_id]);
+
+#endif
+
+    ramdump_oss_error_log_creat(ramdump_client_errno_log + offset);
+
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_client_store_ram_conf
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) mem: addr
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    unsigend char*: changed addr
+* ÆäËü˵Ã÷:    This function is used to store ram conf
+*******************************************************************************/
+static char *ramdump_client_store_ram_conf(char *mem)
+{
+    unsigned long i_ram_conf = 0;
+
+    while ((ramdump_client_ram_conf[i_ram_conf].vir != 0) && 
+           (ramdump_client_ram_conf[i_ram_conf].size != 0))
+    {
+        ramdump_ram_config_t *config_entry = &ramdump_client_ram_conf[i_ram_conf];
+        if ((config_entry->phy == (unsigned long)ramdump_client_cmm_buf) ||
+            (config_entry->phy == (unsigned long)ramdump_client_errno_log))
+        {
+            i_ram_conf++;
+            continue;
+        }
+        if(config_entry->callback == NULL ||
+           (config_entry->callback != NULL &&
+           (*(config_entry->callback))() == RAMDUMP_TRUE))
+            mem += sprintf(
+                    mem,
+                    "data.load.binary &ramdump_dir\\%s 0x%lx--0x%lx /noclear\n",
+                    config_entry->name,
+                    config_entry->phy, 
+                    (config_entry->phy + config_entry->size));
+        i_ram_conf++;
+    }
+
+    return mem;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_client_cmm_create
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) void
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    This function is used for client to generate cmm scripts
+*******************************************************************************/
+static void ramdump_client_cmm_create(void)
+{
+    char *pcmm_buf = ramdump_client_cmm_buf;
+
+    // store the cmm BEGIN
+    pcmm_buf += sprintf(pcmm_buf, "ENTRY &ramdump_dir\n");
+    // store procmodes regs
+    pcmm_buf = ramdump_arch_store_modes_regs(pcmm_buf);
+    // store ram config 
+    pcmm_buf = ramdump_client_store_ram_conf(pcmm_buf);
+    // store memory map control regs
+    pcmm_buf = ramdump_arch_store_mm_regs(pcmm_buf);
+    // store end symbol
+    pcmm_buf += sprintf(pcmm_buf, "ENDDO\n");
+}
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_ram_conf_table_add
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) ram_name:    dump ram name
+               ram_start:   dump ram start(virtual addr)
+               ram_size:    dump ram size
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    void 
+* ÆäËü˵Ã÷:    This function is used to add dump ram conf into public table
+*******************************************************************************/
+void ramdump_ram_conf_table_add(
+        char *ram_name, 
+        unsigned long ram_phy, 
+        unsigned long ram_size, 
+        unsigned long ram_virt,
+        unsigned long ram_flag,
+        unsigned long ram_extra)
+{
+    static int i_entry = 0;
+
+    if ((ram_phy == 0) && (ram_size == 0))
+        return;
+
+    strncpy(ramdump_client_ram_conf[i_entry].name, 
+            ram_name, 
+            RAMDUMP_RAMCONF_FILENAME_MAXLEN);
+    ramdump_client_ram_conf[i_entry].phy   = ram_phy;
+    ramdump_client_ram_conf[i_entry].size  = ram_size;
+    ramdump_client_ram_conf[i_entry].vir   = ram_virt;
+    ramdump_client_ram_conf[i_entry].flag  = ram_flag;
+
+    switch (ram_flag)
+    {
+        case RAMDUMP_FLAG_NEED_COPY:
+            ramdump_client_ram_conf[i_entry].copy  = ram_extra;
+            break;
+        case RAMDUMP_FLAG_HAS_EXTERNAL:
+            ramdump_client_ram_conf[i_entry].exter  = ram_extra;
+            break;
+        case RAMDUMP_FLAG_HAS_CALLBACK:
+            ramdump_client_ram_conf[i_entry].callback  = (ramdump_callback_t)ram_extra;
+            break;
+        default:
+            break;
+    }
+    
+    if (i_entry < RAMDUMP_RAMCONF_TABLE_MAX_ENTRYS - 1)
+        i_entry++;
+    else
+        i_entry = 0;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     RAMDUMP_SUCCESS
+* ÆäËü˵Ã÷:     This function is used for ramdump init
+*******************************************************************************/
+int ramdump_init(void)
+{
+    int ret = 0;
+    unsigned long *first_dump_cpu_id = 0;
+    ramdump_ram_config_sync_msg_t msg = {0};
+    char bin_name[RAMDUMP_RAMCONF_FILENAME_MAXLEN] = {0};
+
+    if (ramdump_client_init_flag == RAMDUMP_TRUE)
+        return RAMDUMP_SUCCESS;
+
+#ifdef __USE_CLIENT_WITH_COLLECT__
+
+    ret = ramdump_collect_server_icp_init();
+    if (ret != RAMDUMP_ICP_SUCCESS)
+        return ret;
+    ramdump_get_collect_server_ram_conf(&msg);
+    msg.array[RAMDUMP_CPU_0].array     = ramdump_client_ram_conf;
+    msg.array[RAMDUMP_CPU_0].nr        = RAMDUMP_RAMCONF_TABLE_MAX_ENTRYS;
+    msg.array[RAMDUMP_CPU_0].done_flag = &ramdump_client_ram_conf_done_flag;
+    /* default except core (the core with collect server)*/
+    first_dump_cpu_id = ramdump_get_first_dump_cpu_id();
+    *first_dump_cpu_id = RAMDUMP_CPU_0;
+
+    /* set client ram data done flag */
+    ramdump_client_ram_conf_done_flag = RAMDUMP_SYNC_RAM_CONFIG_DONE;
+
+    /*
+     * clean all the caches to make sure all data in ddr 
+     */
+    ramdump_arch_clean_caches();
+    
+#endif //#ifdef __USE_CLIENT_WITH_COLLECT__
+
+    /* generate dump name prefix */
+    sprintf(
+        bin_name, 
+        "%s-%s", 
+        ramdump_cpu_name[RAMDUMP_CPU_0], 
+        RAMDUMP_CLIENT_ERR_LOG);
+    ramdump_ram_conf_table_add(
+        bin_name, 
+        (unsigned long)ramdump_client_errno_log, 
+        RAMDUMP_ERROR_LOG_SIZE,
+        0,
+        0,
+        0);
+    /* generate dump name prefix */
+    memset(bin_name, 0, sizeof(bin_name));
+    sprintf(
+            bin_name, 
+            "%s-%s", 
+            ramdump_cpu_name[RAMDUMP_CPU_0], 
+            RAMDUMP_CLIENT_CMM_SCRNAME);
+    ramdump_ram_conf_table_add(
+        bin_name, 
+        (unsigned long)ramdump_client_cmm_buf, 
+        RAMDUMP_CMM_SIZE,
+        0,
+        0,
+        0);
+
+    OSS_PRINTF("Ramdump client init success!\n");
+    ramdump_client_init_flag = RAMDUMP_TRUE;
+
+    return RAMDUMP_SUCCESS;
+}
+OSS_INIT(ramdump_init);
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_client_entry
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for client ramdump entry
+*******************************************************************************/
+void ramdump_client_entry (void)
+{
+    unsigned long flags;
+
+    if (!ramdump_client_init_flag)
+        return;
+
+    if (++ramdump_count > 1)
+        while(TRUE); /* endless circle */
+
+    /*
+     * we need lock the irq, this can`t be interrupt.
+     */
+    OSS_LOCK(flags);
+
+    /*
+     * save all regs first.
+     */
+    ramdump_arch_save_all_regs();
+
+    /* open tcm clock */
+    ramdump_open_tcm_clock();
+
+    /* t32 cmm scripts */
+    ramdump_client_cmm_create();
+    /* err info file */
+    ramdump_client_error_log_create();
+
+    /* special data copy to the copy addr
+     * then other core read from the copy addr
+     */
+    ramdump_client_copy_data();
+    /* recalc client cmm and err_log size */
+    ramdump_client_cmm_and_log_recalc();
+    /* set client ram data done flag */
+    ramdump_client_ram_conf_done_flag = RAMDUMP_SYNC_RAM_CONTENT_DONE;
+
+    /* clean all the caches to make sure all data in ddr */
+    ramdump_arch_clean_caches();
+
+#ifdef __USE_CLIENT_WITH_COLLECT__
+    ramdump_collect_server_notify_clients_dump();
+#endif
+
+    /*
+     * TODO! 
+     * now endless circle, e.g., config restart or not is more better.
+     */
+    while (TRUE);
+
+    OSS_UNLOCK(flags);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_client_tos_adapt.c b/cp/ps/plat/src/oss/sup/src/ramdump_client_tos_adapt.c
new file mode 100644
index 0000000..ecb44c5
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_client_tos_adapt.c
@@ -0,0 +1,250 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_client_tos_adapt.c
+* Îļþ±êʶ:     ramdump_client_tos_adapt.c
+* ÄÚÈÝÕªÒª:     ramdump¿Í»§¶ËÒÀÀµÌض¨²Ù×÷ϵͳTOSµÄÊÊÅä´úÂë
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/6/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+#include "ramdump_oss.h"
+#include "ramdump_collect_server.h"
+
+#include "sys_func_atcfg.h"
+#include "drvs_sys.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+*                                 Íⲿº¯ÊýÉùÃ÷                                 *
+*******************************************************************************/
+extern void ramdump_client_entry (void);
+extern VOID zDrvWdt_Stop(VOID);
+extern int ramdump_init(void);
+extern SINT32 zSys_ExceptReboot(UINT32 except_cpu);
+
+/*******************************************************************************
+*                                  ³£Á¿¶¨Òå                                    *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+#define RAMDUMP_CLIENT_BIN_DEFNAME      "client_"
+#define RAMDUMP_CLIENT_INIT_RSP_DONE    (0x68797869) /* 68:D 79:O 78:N 69:E */
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/* just adapt code for tos. 
+ * TODO!
+ * will be delete in the future.
+ */
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     zOss_RamdumpInit
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for ramdump init
+*******************************************************************************/
+void zOss_RamdumpInit(void)
+{
+    T_ZDrvSys_PowerOn_Type powOnType;
+    unsigned long *client_done_flag;
+    ramdump_init();
+
+    //powOnType = zDrvComm_GetPowerOnState();
+    //if(POWER_ON_FOTA == powOnType || POWER_ON_CHARGING == powOnType)
+    //    return;   
+
+    /* set phy done flag*/
+    client_done_flag = ramdump_get_client_init_rsp();
+    client_done_flag[RAMDUMP_CPU_2] = RAMDUMP_CLIENT_INIT_RSP_DONE;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     zOss_RamdumpConfigureMem
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  regionInfo: dump ram config 
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for ramdump config dump ram
+*******************************************************************************/
+VOID zOss_RamdumpConfigureMem(T_zOss_RamdumpRegion *regionInfo)
+{
+    char ram_name[RAMDUMP_RAMCONF_FILENAME_MAXLEN] = {0};
+    /* generate dump name prefix */
+    sprintf(ram_name, 
+            "%s-%s0x%lx.bin", 
+            ramdump_cpu_name[RAMDUMP_CPU_0], 
+            RAMDUMP_CLIENT_BIN_DEFNAME, 
+            regionInfo->baseForSelf);
+    if (regionInfo->baseForCopy != 0 &&
+        regionInfo->baseForCopy != regionInfo->baseForSelf)
+        ramdump_ram_conf_table_add(
+            ram_name,
+            regionInfo->baseForSelf, 
+            regionInfo->size,
+            0,
+            RAMDUMP_FLAG_NEED_COPY,
+            regionInfo->baseForCopy);
+    else if (regionInfo->baseForServer != 0 &&
+             regionInfo->baseForServer != regionInfo->baseForSelf)
+        ramdump_ram_conf_table_add(
+            ram_name,
+            regionInfo->baseForSelf, 
+            regionInfo->size,
+            0,
+            RAMDUMP_FLAG_HAS_EXTERNAL,
+            regionInfo->baseForServer);
+    else
+        ramdump_ram_conf_table_add(
+            ram_name,
+            regionInfo->baseForSelf, 
+            regionInfo->size,
+            0,
+            RAMDUMP_FLAG_NONE,
+            0);
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    zOss_RamdumpHandle
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) user_called: not used 
+               ecode: not used 
+               extra: not used 
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    void 
+* ÆäËü˵Ã÷:    This function is used for enter ramdump
+*******************************************************************************/
+VOID zOss_RamdumpHandle(UINT16 user_called, UINT16 ecode, UINT16 extra)
+{
+    static UINT32  excepNum = 0;
+    ZOSS_INTR      old_intr;
+
+    ZOSS_SAVE_IRQ(old_intr); 
+    if(++excepNum > 1)          /* Ö»±£´æµÚÒ»´Î³ö´íÏÖ³¡ */
+    {
+        for ( ; ; ) ;
+    }
+
+    if (zOss_GetExceptResetFlag() != EXCEPT_RESET_ENABLE)
+    {
+#ifdef _WDT_RST
+        zDrvWdt_Stop();
+#endif
+        /* Ö´ÐÐramdumpÒì³£´¦Àíº¯Êý */
+        ramdump_client_entry();
+        for ( ; ; ) ;
+    }
+    else
+    {
+        //except_RecordExceptInfo(s_zRamdump_ServerCfgInfo.serverId);
+        zSys_ExceptReboot((*ramdump_get_first_dump_cpu_id()));
+    }
+    
+    ZOSS_RESTORE_IRQ(old_intr);
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     zOss_RamdumpForceClientException
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  coreId: core id
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     SUCCESS
+* ÆäËü˵Ã÷:     This function is used for forced ramdump 
+*******************************************************************************/
+UINT32 zOss_RamdumpForceClientException(UINT32 coreId)
+{
+    OSS_PANIC(RAMDUMP_TRUE);
+    return RAMDUMP_SUCCESS;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     Osa_SysErrHndInit
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  VOID
+*   (´«³ö²ÎÊý)  VOID
+* ·µ »Ø Öµ:     VOID
+* ÆäËü˵Ã÷:     This function is used for Osa_SysErrHndInit
+*******************************************************************************/
+VOID Osa_SysErrHndInit(VOID)
+{
+
+}
+
+/**************************************************************************
+ * º¯ÊýÃû³Æ£º   ramdump_ProcessMsgFromZsp
+ * ¹¦ÄÜÃèÊö£º   server ´¦ÀízspµÄICPÏûÏ¢º¯Êý
+ * ²ÎÊý˵Ã÷£º
+*   (´«Èë²ÎÊý)  pMsg: ic msg buf
+*   (´«³ö²ÎÊý)  void
+ * ·µ »Ø Öµ£º   void   
+ * ÆäËü˵Ã÷£º   void
+**************************************************************************/
+VOID zOss_Ramdump_ProcessMsgFromZsp(VOID *buf, UINT32 len)
+{
+    UINT32 *first_dump_cpu_id = ramdump_get_first_dump_cpu_id();
+
+    OSS_PRINTF("Ramdump client ps recevived forced dump request from zsp!\n");
+
+    *first_dump_cpu_id = RAMDUMP_CPU_2;
+    zOss_RamdumpHandle(1, 1, 1);
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_open_tcm_clock
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  VOID
+*   (´«³ö²ÎÊý)  VOID
+* ·µ »Ø Öµ:     VOID
+* ÆäËü˵Ã÷:     This function is used for open tcm clock
+*******************************************************************************/
+void ramdump_open_tcm_clock(void)
+{
+#ifdef _USE_TCM
+    if (!zDrvSysClk_IsEnable(CLK_FROMMATIRX_ACLK))
+        zDrvSysClk_SetGate(CLK_FROMMATIRX_ACLK, SYSCLK_ENABLE);
+    if (!zDrvSysClk_IsEnable(CLK_AXI2AXI_APB_AS_FOR_TCM))
+        zDrvSysClk_SetGate(CLK_AXI2AXI_APB_AS_FOR_TCM, SYSCLK_ENABLE);  
+#endif
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_collect_server.c b/cp/ps/plat/src/oss/sup/src/ramdump_collect_server.c
new file mode 100644
index 0000000..e9a5809
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_collect_server.c
@@ -0,0 +1,405 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_collect_server.c
+* Îļþ±êʶ:     ramdump_collect_server.c
+* ÄÚÈÝÕªÒª:     ramdump collect·þÎñ¶ËÊý¾ÝÊÕ¼¯´«µÝʵÏÖ
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/6/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+#include "ramdump_oss.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+#ifdef _OS_TOS
+extern VOID zOss_Ramdump_ProcessMsgFromZsp(const T_HalIcp_Msg *pMsg);
+#endif
+
+/*******************************************************************************
+*                                  ³£Á¿¶¨Òå                                    *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+#define RAMDUMP_ARRAY_BEG(arr) &(arr[0])
+#define RAMDUMP_ARRAY_END(arr) &(arr[RAMDUMP_ARRAY_NR(arr)])
+
+#define RAMDUMP_WAIT_CLIENT_TIMELEN (200) /* like before,just a value roughly */
+#define RAMDUMP_SLEEP_TIME (5) /* 5 ms */
+
+#define RAMDUMP_CLIENT_INIT_RSP_DONE    (0x68797869) /* 68:D 79:O 78:N 69:E */
+#define RAMDUMP_CALLBACK_INIT_DONE      1
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+typedef int (*ramdump_initcall_t)(void);
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+static int ramdump_cpu1_icp_init(void);
+static int ramdump_cpu2_icp_init(void);
+
+/*******************************************************************************
+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *
+*******************************************************************************/
+
+/* store collect ram config */
+static ramdump_ram_config_msg_t ramdump_collected_ram_conf_tables[RAMDUMP_CPU_MAX];
+
+/* store client icp init fun, expandable */
+static ramdump_initcall_t ramdump_client_icp_initcalls[RAMDUMP_CPU_MAX] = 
+{NULL, ramdump_cpu1_icp_init,ramdump_cpu2_icp_init};
+
+/* first except cpu id */
+static unsigned long ramdump_except_cpu_id;
+
+/* init rsp done flag for all clients */
+static volatile unsigned long ramdump_client_init_rsp[RAMDUMP_CPU_MAX];
+
+static volatile long ramdump_callback_init_rsp[RAMDUMP_CPU_MAX];
+
+static volatile int ramdumpCfgFinished;
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_icp_to_collect_server_handle
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  buf: icp msg point
+*               len: icp msg length
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for ramdump client icp msg handle, common entry
+*******************************************************************************/
+static void ramdump_icp_to_collect_server_handle(
+                void *buf, 
+                unsigned int len)
+{
+    ramdump_msg_t *icp_msg;
+
+	icp_msg = buf;
+
+    switch(icp_msg->msg_id)
+    {
+        case RAMDUMP_MSG_INIT_RSP:
+        {
+            ramdump_ram_config_msg_t *table_entry = &(ramdump_collected_ram_conf_tables[icp_msg->cpu_id]);
+
+            /* invalid cpu id */
+            if ((icp_msg->cpu_id < RAMDUMP_CPU_0) || 
+                (icp_msg->cpu_id >= RAMDUMP_CPU_MAX))
+                while (RAMDUMP_TRUE);
+
+            /* client ram conf collect */
+            table_entry->array     = icp_msg->msg_data_t.ram_config.array;
+            table_entry->nr        = icp_msg->msg_data_t.ram_config.nr;
+            table_entry->done_flag = icp_msg->msg_data_t.ram_config.done_flag;
+
+            ramdump_client_init_rsp[icp_msg->cpu_id] = RAMDUMP_CLIENT_INIT_RSP_DONE;
+
+            break;
+        }
+
+        case RAMDUMP_MSG_EXCEPT:
+        {
+#ifndef __USE_TRANS_WITH_COLLECT__
+
+            if (ramdump_except_cpu_id == 0)
+                ramdump_except_cpu_id = icp_msg->cpu_id;
+
+#endif
+
+            OSS_PANIC("collect server received forced dump request from client!\n");
+            break;
+        }
+
+        default:
+            break;
+    }
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_cpu1_icp_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     SUCCESS or FAILED
+* ÆäËü˵Ã÷:     This function is used for ramdump client1 icp init (now is cp)
+*******************************************************************************/
+static int ramdump_cpu1_icp_init(void)
+{
+    int ret = 0;
+
+    ret = ramdump_oss_icp_create_channel(
+            ramdump_cpu_id[RAMDUMP_CPU_1], 
+            ramdump_cpu_ch[RAMDUMP_CPU_1], 
+            RAMDUMP_CHANNEL_SIZE);
+    if (ret != RAMDUMP_SUCCESS) 
+        return ret;
+
+    ret = ramdump_oss_icp_regcallback(
+            ramdump_cpu_id[RAMDUMP_CPU_1], 
+            ramdump_cpu_ch[RAMDUMP_CPU_1], 
+            (ramdump_oss_icp_callback)ramdump_icp_to_collect_server_handle);
+    if (ret != RAMDUMP_SUCCESS) 
+        return ret;
+
+    return RAMDUMP_SUCCESS;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_cpu2_icp_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     SUCCESS or FAILED
+* ÆäËü˵Ã÷:     This function is used for ramdump client2 icp init (now is zsp)
+*******************************************************************************/
+static int ramdump_cpu2_icp_init(void)
+{
+    int ret = 0;
+
+    ret = ramdump_oss_icp_create_channel(
+            ramdump_cpu_id[RAMDUMP_CPU_2], 
+            ramdump_cpu_ch[RAMDUMP_CPU_2], 
+            0x40);
+    if (ret != RAMDUMP_SUCCESS) 
+        return ret;
+
+#ifdef _OS_TOS
+
+    ret = ramdump_oss_icp_regcallback(
+            ramdump_cpu_id[RAMDUMP_CPU_2],
+            ramdump_cpu_ch[RAMDUMP_CPU_2], 
+            (ramdump_oss_icp_callback)zOss_Ramdump_ProcessMsgFromZsp);
+
+#else
+
+    ret = ramdump_oss_icp_regcallback(
+            ramdump_cpu_id[RAMDUMP_CPU_2], 
+            ramdump_cpu_ch[RAMDUMP_CPU_2], 
+            (ramdump_oss_icp_callback)ramdump_icp_to_collect_server_handle);
+
+#endif
+
+    if (ret != RAMDUMP_SUCCESS) 
+        return ret;
+
+    return RAMDUMP_SUCCESS;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_cpu_id_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for collect server to init cpu_id
+*******************************************************************************/
+static void ramdump_cpu_id_init(void)
+{
+    /* init interactive cpu id */
+#ifdef __USE_CLIENT_WITH_COLLECT__
+    ramdump_cpu_id[RAMDUMP_CPU_1] = ICP_MSG_ACTOR_A9;
+    ramdump_cpu_id[RAMDUMP_CPU_2] = ICP_MSG_ACTOR_ZSP;
+	ramdump_cpu_ch[RAMDUMP_CPU_1] = RAMDUMP;
+	ramdump_cpu_ch[RAMDUMP_CPU_2] = RP_MSG_PS_PHY_RAMDUMP;
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_icp_callback_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for collect server to init callback
+*******************************************************************************/
+static void ramdump_icp_callback_init(void)
+{
+    int index;
+    for (index = 0; index < RAMDUMP_CPU_MAX; index++)
+    {
+        if (ramdump_client_icp_initcalls[index] != NULL)
+        {
+            if (ramdump_client_icp_initcalls[index]() == RAMDUMP_ICP_SUCCESS)
+                ramdump_callback_init_rsp[index] = RAMDUMP_CALLBACK_INIT_DONE;        
+        }
+    }
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_collect_server_thread_entry
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  arg: thread entry arguments
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for ramdump collect server icp init entry
+*******************************************************************************/
+static void ramdump_collect_server_thread_entry(int arg)
+{
+    int index = 0;
+    ramdump_msg_t icp_msg = {0};
+    ramdump_msg_t icp_msg_sync = {0};
+
+    for (index = 0; index < RAMDUMP_CPU_MAX; index++)
+    {
+        if (ramdump_callback_init_rsp[index] == RAMDUMP_CALLBACK_INIT_DONE)
+        {
+            /* init request */
+            icp_msg.msg_id = RAMDUMP_MSG_INIT_REQ;
+            icp_msg.cpu_id = ramdump_cpu_id[RAMDUMP_CPU_0]; /* collect server cpu_id */
+            /* send init req until success */
+            while (ramdump_oss_icp_send(&icp_msg, ramdump_cpu_id[index], ramdump_cpu_ch[index]) != RAMDUMP_ICP_SUCCESS)
+                OSS_SLEEP(RAMDUMP_SLEEP_TIME);//sleep 1 ms
+                /* wait init rsp until done */
+            while (ramdump_client_init_rsp[index] != RAMDUMP_CLIENT_INIT_RSP_DONE) 
+                OSS_SLEEP(RAMDUMP_SLEEP_TIME);//sleep 1 ms
+        }
+    }
+
+#ifndef __USE_TRANS_WITH_COLLECT__
+
+    /* sync with trans server */
+    icp_msg_sync.msg_id = RAMDUMP_MSG_SYNC;
+    icp_msg_sync.cpu_id = ramdump_cpu_id[RAMDUMP_CPU_0]; /* collect server cpu_id */
+
+    icp_msg_sync.msg_data_t.ram_config_sync.array = ramdump_collected_ram_conf_tables;
+    icp_msg_sync.msg_data_t.ram_config_sync.nr    = RAMDUMP_CPU_MAX;
+
+    while (!ramdumpCfgFinished || ramdump_oss_icp_send(&icp_msg_sync, ramdump_cpu_id[RAMDUMP_CPU_1], ramdump_cpu_ch[RAMDUMP_CPU_1]) != RAMDUMP_ICP_SUCCESS)
+        OSS_SLEEP(RAMDUMP_SLEEP_TIME);//sleep 1 ms
+
+    /* resolve trans server modify will be covered by caches */
+    ramdump_arch_clean_and_invalid_caches();
+#endif
+}
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_config_finished
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is called for ramdump config finished
+*******************************************************************************/
+void ramdump_config_finished(void)
+{
+    ramdumpCfgFinished = 1;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_collect_server_icp_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     SUCCESS
+* ÆäËü˵Ã÷:     This function is used for ramdump client icp init
+*******************************************************************************/
+int ramdump_collect_server_icp_init(void)
+{
+    ramdump_cpu_id_init();
+    
+    ramdump_icp_callback_init();
+
+    /* create thread sync cpu init */
+    OSS_CREATE_THREAD("collect_server_sync_thread",(ramdump_oss_thread_entry_t)ramdump_collect_server_thread_entry);
+ 
+    return RAMDUMP_ICP_SUCCESS;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_collect_server_notify_clients_dump
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for ramdump client icp init
+*******************************************************************************/
+void ramdump_collect_server_notify_clients_dump(void)
+{
+    int cpu_id = 1;
+    ramdump_msg_t icp_msg = {0};
+    
+    while (cpu_id < RAMDUMP_CPU_MAX)
+    {
+        /* init request */
+        icp_msg.msg_id = RAMDUMP_MSG_EXCEPT;
+        icp_msg.cpu_id = ramdump_cpu_id[RAMDUMP_CPU_0]; /* collect server cpu_id */
+        ramdump_oss_icp_send(&icp_msg, ramdump_cpu_id[cpu_id], ramdump_cpu_ch[cpu_id]);
+        cpu_id++;
+    }
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_get_collect_server_ram_conf
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  msg: ram_conf
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     This function is used for ramdump client icp init
+*******************************************************************************/
+void ramdump_get_collect_server_ram_conf(ramdump_ram_config_sync_msg_t *msg)
+{
+    msg->array = ramdump_collected_ram_conf_tables;
+    msg->nr = RAMDUMP_CPU_MAX;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_get_first_dump_cpu_id
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long*: cpu id address
+* ÆäËü˵Ã÷:     This function is used for ramdump client icp init
+*******************************************************************************/
+unsigned long * ramdump_get_first_dump_cpu_id(void)
+{
+    return &ramdump_except_cpu_id;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_get_client_init_rsp
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long*: cpu id address
+* ÆäËü˵Ã÷:     
+*******************************************************************************/
+volatile unsigned long * ramdump_get_client_init_rsp(void)
+{
+    return ramdump_client_init_rsp;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_oss.c b/cp/ps/plat/src/oss/sup/src/ramdump_oss.c
new file mode 100644
index 0000000..0739af0
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_oss.c
@@ -0,0 +1,363 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_oss.c
+* Îļþ±êʶ:     ramdump_oss.c
+* ÄÚÈÝÕªÒª:     ramdump²Ù×÷ϵͳÒÀÀµ½Ó¿Ú/Êý¾Ý½á¹¹¶¨ÒåÍ·Îļþ
+* ʹÓ÷½·¨:     Èç¹û¸ü»»²Ù×÷ϵͳ£¬¸ÄÍ·ÎļþÄÚ½Ó¿Ú»òÕßÊý¾Ý¶¨ÒåÐèÒªÖØÐÂÊÊÅä
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/6/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+#include "ramdump_oss.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+#ifdef _OS_LINUX 
+/* icp api */  
+extern int zDrvRpMsg_CreateChannel(
+              T_ZDrvRpMsg_ActorID actorID, 
+              T_ZDrvRpMsg_ChID chID, 
+              unsigned int size);
+extern int zDrvRpMsg_RegCallBack(
+              T_ZDrvRpMsg_ActorID actorID, 
+              unsigned int chID, 
+              T_ZDrvRpMsg_CallbackFunction callback);
+extern int zDrvRpMsg_WriteLockIrq(const T_ZDrvRpMsg_Msg *pMsg);
+extern void panic(const char *fmt, ...);
+
+extern int zDrvUsbPoll_Init(void);
+extern int zDrvUsbPoll_Isr(void);
+extern bool zDrvUsbPoll_isConnect(void);
+extern int zDrvUsbPoll_Read(unsigned char* pBuf,unsigned long length);
+extern int zDrvUsbPoll_Write(unsigned char* pBuf,unsigned long length);
+#elif defined (_OS_TOS)
+
+extern char *ramdump_error_log_exp(char *mem);
+#endif //#ifdef _OS_LINUX 
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_create_thread
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+void ramdump_oss_create_thread (
+        char *name, 
+        ramdump_oss_thread_entry_t entry)
+{
+#ifdef _OS_TOS
+#define RAMDUMP_THREAD_STACK_DEF_SIZE 2048
+#define RAMDUMP_THREAD_DEF_PRIO 20
+#define RAMDUMP_THREAD_DEF_ARG 0
+#define RAMDUMP_THREAD_AUTORUN 1
+#define RAMDUMP_THREAD_PREEMPT 1
+
+    zOss_CreateThread(
+        name,entry, 
+        RAMDUMP_THREAD_DEF_ARG,
+        RAMDUMP_THREAD_STACK_DEF_SIZE,
+        RAMDUMP_THREAD_DEF_PRIO,
+        RAMDUMP_THREAD_PREEMPT,
+        RAMDUMP_THREAD_AUTORUN);
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_mmap
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+unsigned long ramdump_oss_mmap (unsigned long addr, unsigned long size)
+{
+#ifdef _OS_LINUX
+    return ioremap(addr,size);
+#elif defined (_OS_TOS)
+
+#ifdef __USE_MMU__
+    T_zTos_MmuRamdumpTable mmuTable = {0};
+    zTos_MmuGetMappingRegion(addr, size, &mmuTable);
+    /* 
+     * TODO!
+     * current tos mmap one to one
+     * need new API like ioremap realize
+     */
+    return addr;
+#endif
+
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_oss_icp_send
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) icp_msg: msg info
+               client_id: client id
+               ch_id: channel id
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    int: if msg send success 
+* ÆäËü˵Ã÷:    This function is used for server to send msg to client
+*******************************************************************************/
+int ramdump_oss_icp_send(ramdump_oss_msg_t *icp_msg, unsigned int client_id, unsigned int ch_id)
+{
+    int ret;
+    ramdump_oss_icp_msg rpmsg = {0};
+
+    rpmsg.actorID = client_id;
+    rpmsg.chID = ch_id;
+    rpmsg.flag = 1;
+    rpmsg.buf = icp_msg;
+    rpmsg.len = sizeof(*icp_msg);
+
+    /*
+     * clean all the caches to make sure all data in ddr 
+     */
+    ramdump_arch_clean_caches();
+
+    ret = ramdump_oss_icp_write(&rpmsg);
+
+    if (ret != rpmsg.len)
+    {
+#ifdef _OS_LINUX
+        OSS_PRINTF(
+            "[ramdump] icpmsg send fail, ret != rpmsg.len[ret:%d], [client_id:%d]\n", 
+            ret, 
+            client_id);
+#elif defined (_OS_TOS)
+        OSS_PRINTF(
+            "[ramdump] icpmsg send fail, ret != rpmsg.len[ret:%d], [client_id:%d]\n", 
+            ret,
+            client_id);
+#endif
+        return ret;
+    }
+
+    return RAMDUMP_ICP_SUCCESS;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_error_log_creat
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  buf : addr point
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+void ramdump_oss_error_log_creat(char *buf)
+{
+#ifdef _OS_LINUX
+    if (current->mm != NULL)
+        sprintf(
+            buf, 
+            " dump at user, app name is: %s, load addr is: %lu \n", 
+            current->comm, 
+            current->mm->start_code);
+    else
+        sprintf(
+            buf,
+            " dump at kernel, app name is: %s \n", 
+            current->comm);
+#elif defined (_OS_TOS)
+	ramdump_error_log_exp(buf);
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_oss_icp_create_channel
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) actorID: icp send core id
+               chID:    icp channel id
+               size:    icp channel size
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    int: if msg send success 
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+int ramdump_oss_icp_create_channel(
+        ramdump_oss_icp_actorid actorID, 
+        ramdump_oss_icp_channelid chID, 
+        unsigned int size)
+{
+    return zDrvRpMsg_CreateChannel(actorID, chID, size);
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_oss_icp_regcallback
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) actorID: icp send core id
+               chID:    icp channel id
+               callback:icp callback fun
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    int: if msg send success 
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+int ramdump_oss_icp_regcallback (
+        ramdump_oss_icp_actorid actorID, 
+        unsigned int chID, 
+        ramdump_oss_icp_callback callback)
+{
+    return zDrvRpMsg_RegCallBack(actorID,chID,callback);
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_oss_icp_write
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) pMsg: icp send msg
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    int: if msg send success 
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+int ramdump_oss_icp_write(const ramdump_oss_icp_msg *pMsg)
+{
+#ifdef _OS_LINUX
+    return zDrvRpMsg_Write(pMsg);
+#elif defined (_OS_TOS)
+    if (pMsg->actorID == ramdump_cpu_id[RAMDUMP_CPU_2])
+    {
+        switch (((ramdump_msg_t *)(pMsg->buf))->msg_id)
+        {
+            case RAMDUMP_MSG_EXCEPT:
+            {
+                return zDrvRpMsg_WriteLockIrq(pMsg);
+            }
+            case RAMDUMP_MSG_SYNC:
+            default:
+                return pMsg->len;
+        }
+    }
+    else
+        return zDrvRpMsg_WriteLockIrq(pMsg);
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_data_trans_init
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+void ramdump_oss_data_trans_init(void)
+{
+#ifdef _OS_LINUX 
+    zDrvUsbPoll_Init();                 /* ³õʼ»¯USB        */
+    while (!zDrvUsbPoll_isConnect()) ;  /* ²éѯUSBÊÇ·ñÁ¬½Ó  */
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_data_trans_read
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) buffer: data buff
+               size:   data size
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+void ramdump_oss_data_trans_read(unsigned char *buffer, unsigned int size)
+{
+#ifdef _OS_LINUX 
+    unsigned int count = 0;
+
+    do
+    {
+        zDrvUsbPoll_Isr();
+        count = (unsigned int)zDrvUsbPoll_Read(buffer, size);
+        if ( size <= count)
+        {
+            break;
+        }        
+        buffer += count;
+        size -=count;
+    }
+    while (size > 0);
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_data_trans_write
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) buffer: data buff
+               size:   data size
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+void ramdump_oss_data_trans_write(unsigned char *buffer, unsigned int size)
+{
+#ifdef _OS_LINUX 
+    unsigned int count = 0;
+
+    while (size > 0)
+    {
+        zDrvUsbPoll_Isr();
+        count = (unsigned int)zDrvUsbPoll_Write(buffer, size);
+        if ( size <= count)
+        {
+            break;
+        }
+        
+        buffer += count;
+        size -=count;
+    }
+#endif
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_oss_data_trans_done
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+void ramdump_oss_data_trans_done(void)
+{
+#ifdef _OS_LINUX     
+    /* µÈ´ýÊý¾Ý·¢ËÍÍêºó£¬ÔÙÖØÆô */
+    zDrvUsbPoll_Isr();
+#endif
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_soc.c b/cp/ps/plat/src/oss/sup/src/ramdump_soc.c
new file mode 100644
index 0000000..3eeb1bf
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_soc.c
@@ -0,0 +1,66 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_soc_7520v2.c
+* Îļþ±êʶ:     ramdump_soc_7520v2.c
+* ÄÚÈÝÕªÒª:     ramdump´¦ÀíÆ÷Ïà¹Ø½Ó¿Ú/Êý¾Ý¶¨ÒåʵÏÖ
+* ʹÓ÷½·¨:     Èç¹û¸ü»»´¦ÀíÆ÷£¬¸ÄÍ·ÎļþÄÚ½Ó¿Ú»òÕßÊý¾Ý¶¨ÒåÐèÒªÖØÐÂÊÊÅä
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/3/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿ÉùÃ÷                                  *
+*******************************************************************************/
+/* 
+ * collect server/client* : RAMDUMP_CPU_0
+ * trans server : RAMDUMP_CPU_1
+ * client1 : RAMDUMP_CPU_2
+ */
+unsigned long ramdump_cpu_id[RAMDUMP_CPU_MAX] = {RAMDUMP_CPU_0, RAMDUMP_CPU_1, RAMDUMP_CPU_2};
+unsigned long ramdump_cpu_ch[RAMDUMP_CPU_MAX] = {RAMDUMP_CPU_0, RAMDUMP_CPU_1, RAMDUMP_CPU_2};
+
+/* 
+ * CP collect server : RAMDUMP_CPU_0
+ * AP trans server : RAMDUMP_CPU_1
+ * ZSP client0: RAMDUMP_CPU_2
+ */
+char *ramdump_cpu_name[RAMDUMP_CPU_MAX] = {"CP", "AP", "ZSP"};
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_v7.c b/cp/ps/plat/src/oss/sup/src/ramdump_v7.c
new file mode 100644
index 0000000..e89e88c
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_v7.c
@@ -0,0 +1,579 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2016, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_v7.c
+* Îļþ±êʶ:     ramdump_v7.c
+* ÄÚÈÝÕªÒª:     ramdump armv7´¦ÀíÆ÷ʵÏÖ
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/6/10      V1.0        Create           ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+#include "ramdump_pub.h"
+#include "ramdump_oss.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+*                                Íⲿº¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+#ifdef _OS_LINUX
+extern void armv7_clean_dcache_all(void);
+#endif
+
+/*******************************************************************************
+*                                  ³£Á¿¶¨Òå                                    *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+#define RAMDUMP_REG_NR              (15)    /* R0-R14 */
+#define RAMDUMP_FIQ_REG_START       (8)     /* R8     */
+#define RAMDUMP_FIQ_REG_END         (13)    /* R12    */
+
+#define RAMDUMP_ARM_USR_MOD         (0xd0)
+#define RAMDUMP_ARM_SVC_MOD         (0xd3)
+
+/* code & data done instr */
+#define ramdump_dsb()   asm volatile("dsb" : : : "memory")
+
+#ifndef __stringify
+#define __stringify_1(x...) #x
+#define __stringify(x...)   __stringify_1(x)
+#endif
+
+/* CP15 */
+#ifndef __ACCESS_CP15
+#define __ACCESS_CP15(CRn, Op1, CRm, Op2)   p15, Op1, %0, CRn, CRm, Op2
+#endif
+
+#ifdef __USE_MMU__
+/* mmu control regs */
+#define MMU_SCTLR   __ACCESS_CP15(c1, 0, c0, 0)
+#define MMU_TTBCR   __ACCESS_CP15(c2, 0, c0, 2)
+#define MMU_DACR    __ACCESS_CP15(c3, 0, c0, 0)
+#define MMU_TTBR0   __ACCESS_CP15(c2, 0, c0, 0)
+#define MMU_TTBR1   __ACCESS_CP15(c2, 0, c0, 1) 
+#elif defined (__USE_MPU__) //#ifdef __USE_MMU__
+/* mpu control regs */
+#define MPU_TYPE_REGISTER_DREGION_POS (8)
+
+#define MPU_REGION_NUM      __ACCESS_CP15(c6, 0, c2, 0)
+#define MPU_REGION_BASE     __ACCESS_CP15(c6, 0, c1, 0)
+#define MPU_REGION_ATTR     __ACCESS_CP15(c6, 0, c1, 4)
+#define MPU_REGION_SIZE     __ACCESS_CP15(c6, 0, c1, 2)
+#define MPU_REGION_MAXNUM   __ACCESS_CP15(c0, 0, c0, 4)
+#define MPU_DFSR            __ACCESS_CP15(c5, 0, c0, 0)
+#define MPU_DFAR            __ACCESS_CP15(c6, 0, c0, 0)
+#define MPU_IFSR            __ACCESS_CP15(c5, 0, c0, 1)
+#define MPU_IFAR            __ACCESS_CP15(c6, 0, c0, 2)
+#endif //#ifdef __USE_MMU__
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+/*
+ * arm cpu mode pub regs
+ */
+typedef struct 
+{
+    unsigned long   sp;
+    unsigned long   lr;
+    unsigned long   spsr;
+} ramdump_arm_com_regs; 
+/*
+ * arm fiq mode regs
+ */
+typedef struct
+{
+    unsigned long           fiq_r8;
+    unsigned long           fiq_r9;
+    unsigned long           fiq_r10;
+    unsigned long           fiq_r11;
+    unsigned long           fiq_r12;
+    ramdump_arm_com_regs    fiq_com;
+} ramdump_arm_fiq_regs;
+/*
+ * arm cpu modes info record
+ */
+typedef struct 
+{
+    unsigned long regs[13]; /* r0-r12*/
+
+    ramdump_arm_com_regs    sys;
+    ramdump_arm_com_regs    svc;
+    ramdump_arm_com_regs    abt;
+    ramdump_arm_com_regs    udf;
+    ramdump_arm_com_regs    irq;
+    ramdump_arm_fiq_regs    fiq;
+} ramdump_arm_regs;
+
+/*******************************************************************************
+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *
+*******************************************************************************/
+/*
+ * arm cpu sys mod, except usr, we have special handle
+ */
+static const unsigned long arm_sys_modes[] = 
+{
+    0xdf,   /* SYS */
+    0xd3,   /* SVC */
+    0xd7,   /* ABT */
+    0xdb,   /* UND */
+    0xd2,   /* IRQ */
+    0xd1,   /* FIQ */
+};
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+ramdump_arm_regs arm_all_modes_regs;
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+#ifdef __USE_MMU__
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armv7_get_SCTLR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     void
+* ÆäËü˵Ã÷:     armv7 mmu SCTLR registers recover
+*******************************************************************************/
+static unsigned long armv7_get_SCTLR(void)
+{
+    unsigned long scrtlr_reg;
+
+    asm volatile("mrc " __stringify(MMU_SCTLR) : "=r" (scrtlr_reg));
+
+    return scrtlr_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armv7_get_TTBCR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: ttbcr value
+* ÆäËü˵Ã÷:     armv7 mmu Control registers recover
+*******************************************************************************/
+static unsigned long armv7_get_TTBCR(void)
+{
+    unsigned long ttbcr_reg;
+
+    asm volatile("mrc " __stringify(MMU_TTBCR) : "=r" (ttbcr_reg));
+
+    return ttbcr_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armv7_get_DACR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: dacr value
+* ÆäËü˵Ã÷:     armv7 mmu Domain registers recover
+*******************************************************************************/
+static unsigned long armv7_get_DACR(void)
+{
+    unsigned long dacr_reg;
+
+    asm volatile("mrc " __stringify(MMU_DACR) : "=r" (dacr_reg));
+
+    return dacr_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armv7_get_TTBR0
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: ttbr0 value
+* ÆäËü˵Ã÷:     armv7 mmu TTBR0 registers recover
+*******************************************************************************/
+static unsigned long armv7_get_TTBR0(void)
+{
+    unsigned long ttbr0_reg;
+
+    asm volatile("mrc " __stringify(MMU_TTBR0) : "=r" (ttbr0_reg));
+
+    return ttbr0_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armv7_get_TTBR1
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: ttbr1 value
+* ÆäËü˵Ã÷:     armv7 mmu TTBR1 registers recover
+*******************************************************************************/
+static unsigned long armv7_get_TTBR1(void)
+{
+    unsigned long ttbr1_reg;
+
+    asm volatile("mrc " __stringify(MMU_TTBR1) : "=r" (ttbr1_reg));
+
+    return ttbr1_reg;
+}
+
+#elif defined (__USE_MPU__)     // #ifdef __USE_MMU__
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_set_RegionNum
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  nr: number
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: region set nr
+* ÆäËü˵Ã÷:     armv7 mpu set region number, select region
+*******************************************************************************/
+static  void armr7_mpu_region_set_nr(unsigned long nr)
+{
+    unsigned long region_num;
+
+    asm volatile("mrc " __stringify(MPU_REGION_NUM) : "=r" (region_num));
+
+    return region_num;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_RegionBase
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: region base
+* ÆäËü˵Ã÷:     armv7 mpu get region base address
+*******************************************************************************/
+static  unsigned long armr7_mpu_region_get_base(void)
+{
+    unsigned long region_base;
+
+    asm volatile("mrc " __stringify(MPU_REGION_BASE) : "=r" (region_base));
+
+    return region_base;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_RegionAttr
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: region attr
+* ÆäËü˵Ã÷:     armv7 mpu get region attribution 
+*******************************************************************************/
+static  unsigned long armr7_mpu_region_get_attr(void)
+{
+    unsigned long region_attr;
+
+    asm volatile("mrc " __stringify(MPU_REGION_ATTR) : "=r" (region_attr));
+
+    return region_attr;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_RegionSize
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: region size
+* ÆäËü˵Ã÷:     armv7 mpu get region size and enable reg
+*******************************************************************************/
+static  unsigned long armr7_mpu_region_get_size(void)
+{
+    unsigned long region_size;
+
+    asm volatile("mrc " __stringify(MPU_REGION_SIZE) : "=r" (region_size));
+
+    return region_size;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_RegionMaxNum
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: region max number
+* ÆäËü˵Ã÷:     armv7 mpu get region max num
+*******************************************************************************/
+static  unsigned long armr7_mpu_region_get_max_nr(void)
+{
+    unsigned long region_max_num;
+
+    asm volatile("mrc " __stringify(MPU_REGION_MAXNUM) : "=r" (region_max_num));
+
+    return (region_max_num >> 8);
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_DFSR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: dfsr value
+* ÆäËü˵Ã÷:     armv7 mpu get DFSR
+*******************************************************************************/
+static  unsigned long armr7_mpu_get_DFSR(void)
+{
+    unsigned long dfsr_reg;
+
+    asm volatile("mrc " __stringify(MPU_DFSR) : "=r" (dfsr_reg));
+
+    return dfsr_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_DFAR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: dfar value
+* ÆäËü˵Ã÷:     armv7 mpu get DFAR
+*******************************************************************************/
+static  unsigned long armr7_mpu_get_DFAR(void)
+{
+    unsigned long dfar_reg;
+
+    asm volatile("mrc " __stringify(MPU_DFAR) : "=r" (dfar_reg));
+
+    return dfar_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_IFSR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: ifsr value
+* ÆäËü˵Ã÷:     armv7 mpu get IFSR
+*******************************************************************************/
+static unsigned long armr7_mpu_get_IFSR(void)
+{
+    unsigned long ifsr_reg;
+
+    asm volatile("mrc " __stringify(MPU_IFSR) : "=r" (ifsr_reg));
+
+    return ifsr_reg;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     armr7_mpu_get_IFAR
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  void
+*   (´«³ö²ÎÊý)  void
+* ·µ »Ø Öµ:     unsigned long: ifar value
+* ÆäËü˵Ã÷:     armv7 mpu get IFAR
+*******************************************************************************/
+static unsigned long armr7_mpu_get_IFAR(void)
+{
+    unsigned long ifar_reg;
+
+    asm volatile("mrc " __stringify(MPU_IFAR) : "=r" (ifar_reg));
+
+    return ifar_reg;
+}
+
+#endif  // #ifdef __USE_MMU__
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    arm_store_sys_regs
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) mem: addr points to buf start
+*   (´«³ö²ÎÊý) void 
+* ·µ »Ø Öµ:    addr: changed addr 
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+static char *arm_store_sys_regs(char *mem)
+{
+    unsigned long           *fiq_regs       = NULL;
+    ramdump_arm_com_regs	*ptr_mode_regs  = NULL;
+    unsigned long            fiq_regs_nr     = RAMDUMP_FIQ_REG_START;
+    unsigned long            arm_sys_mode_nr = 0;
+
+    //SYS/SVC/ABT/UND/IRQ
+    ptr_mode_regs = (ramdump_arm_com_regs*)(&arm_all_modes_regs.sys);
+    do {
+        mem += sprintf(mem, "r.s cpsr 0x%lx\n", (unsigned long)arm_sys_modes[arm_sys_mode_nr]);
+        mem += sprintf(mem, "r.s r13 0x%lx\n", (unsigned long)(ptr_mode_regs->sp));
+        mem += sprintf(mem, "r.s r14 0x%lx\n", (unsigned long)(ptr_mode_regs->lr));
+        mem += sprintf(mem, "r.s spsr 0x%lx\n", (unsigned long)(ptr_mode_regs->spsr));
+        ptr_mode_regs++;
+        arm_sys_mode_nr++;
+    } while (arm_sys_mode_nr < (RAMDUMP_ARRAY_NR(arm_sys_modes) - 1));
+
+    //FIQ r8-r12
+    mem += sprintf(mem, "r.s cpsr 0x%lx\n", (unsigned long)arm_sys_modes[arm_sys_mode_nr]);
+    fiq_regs = ((unsigned long*)&arm_all_modes_regs.fiq.fiq_r8);
+    do {
+        mem += sprintf(mem, "r.s r%lu 0x%lx\n", fiq_regs_nr, *(fiq_regs));
+        fiq_regs++;
+        fiq_regs_nr++;
+    } while (fiq_regs_nr < RAMDUMP_FIQ_REG_END);
+
+    //FIQ r13-r14/cpsr
+    ptr_mode_regs = &arm_all_modes_regs.fiq.fiq_com;
+    mem += sprintf(mem, "r.s r13 0x%lx\n", (unsigned long)(ptr_mode_regs->sp));
+    mem += sprintf(mem, "r.s r14 0x%lx\n", (unsigned long)(ptr_mode_regs->lr));
+    mem += sprintf(mem, "r.s spsr 0x%lx\n", (unsigned long)(ptr_mode_regs->spsr));
+
+    return mem;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    arm_store_cur_regs
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) mem: addr points to buf start
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    addr: changed addr 
+* ÆäËü˵Ã÷:    
+*******************************************************************************/
+static char *arm_store_cur_regs(char *mem)
+{
+    unsigned long  cnt;
+    unsigned long *svc_regs = (unsigned long *)arm_all_modes_regs.regs;
+
+    mem += sprintf(mem, "r.s cpsr 0x%lx\n", (unsigned long)RAMDUMP_ARM_SVC_MOD);
+    for (cnt = 0x00; cnt < RAMDUMP_ARRAY_NR(arm_all_modes_regs.regs); cnt++)
+        mem += sprintf(mem, "r.s r%lu 0x%lx\n", cnt, *svc_regs++);
+    mem += sprintf(mem, "r.s r13 0x%lx\n", arm_all_modes_regs.svc.sp);
+    mem += sprintf(mem, "r.s r14 0x%lx\n", arm_all_modes_regs.svc.lr);
+    mem += sprintf(mem, "r.s pc 0x%lx\n", arm_all_modes_regs.svc.lr);
+    mem += sprintf(mem, "r.s spsr 0x%lx\n", arm_all_modes_regs.svc.spsr);
+
+    return mem;
+}
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_arch_clean_and_invalid_caches
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) void
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    This function is used for arm clean and invalid caches
+*******************************************************************************/
+void ramdump_arch_clean_and_invalid_caches(void)
+{
+#ifdef _OS_TOS
+    tos_cache_clean_invalidate_all();
+#endif 
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_arch_clean_caches
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) void
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    void
+* ÆäËü˵Ã÷:    This function is used for arm clean caches
+*******************************************************************************/
+void ramdump_arch_clean_caches(void)
+{
+#ifdef _OS_LINUX
+    armv7_clean_dcache_all();
+#elif defined (_OS_TOS)
+    tos_cache_clean_all();
+#endif   
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_arch_store_modes_regs
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) mem: addr points to buf start
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    addr: changed addr   
+* ÆäËü˵Ã÷:    This function is used for linux clean caches
+*******************************************************************************/
+char *ramdump_arch_store_modes_regs(char *mem)
+{
+    // store privileged regs
+    mem = arm_store_sys_regs(mem);
+
+    // store usr regs, user app is running in svc mod
+    mem = arm_store_cur_regs(mem);
+
+    return mem;
+}
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:    ramdump_arch_store_mm_regs
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý) mem: addr points to buf start
+*   (´«³ö²ÎÊý) void
+* ·µ »Ø Öµ:    addr: changed addr  
+* ÆäËü˵Ã÷:    This function is used for linux clean caches
+*******************************************************************************/
+char *ramdump_arch_store_mm_regs(char *mem)
+{
+#ifdef __USE_MMU__
+
+    mem += sprintf(mem, "per.s c15:0x1 %%long %#lx\r\n", armv7_get_SCTLR());
+    mem += sprintf(mem, "per.s c15:0x2 %%long %#lx\r\n", armv7_get_TTBR0());
+    mem += sprintf(mem, "per.s c15:0x102 %%long %#lx\r\n", armv7_get_TTBR1());
+    mem += sprintf(mem, "per.s c15:0x202 %%long %#lx\r\n", armv7_get_TTBCR());
+    mem += sprintf(mem, "per.s c15:0x3 %%long %#lx\r\n", armv7_get_DACR());
+    
+#elif defined (__USE_MPU__) //#ifdef __USE_MMU__
+
+    unsigned long i = 0;
+
+    mem += sprintf(mem, "per.s c15:0x4 %%long %#lx\r\n", (unsigned long)((armr7_mpu_region_get_max_nr() << MPU_TYPE_REGISTER_DREGION_POS))); 
+    for(i = 0; i < armr7_mpu_region_get_max_nr(); i++)
+    {
+        mem += sprintf(mem, "per.s c15:0x26 %%long %#lx\r\n",  (unsigned long)i); 
+        armr7_mpu_region_set_nr(i);
+        mem += sprintf(mem, "per.s c15:0x16 %%long %#lx\r\n",  (unsigned long)(armr7_mpu_region_get_base())); 
+        mem += sprintf(mem, "per.s c15:0x216 %%long %#lx\r\n", (unsigned long)(armr7_mpu_region_get_size())); 
+        mem += sprintf(mem, "per.s c15:0x416 %%long %#lx\r\n", (unsigned long)(armr7_mpu_region_get_attr())); 
+    }
+
+    /* DFSR/DFAR IFSR/IFAR */
+    mem += sprintf(mem, "per.s c15:0x5 %%long %#lx\r\n",   (unsigned long)(armr7_mpu_get_DFSR())); 
+    mem += sprintf(mem, "per.s c15:0x6 %%long %#lx\r\n",   (unsigned long)(armr7_mpu_get_DFAR())); 
+    mem += sprintf(mem, "per.s c15:0x105 %%long %#lx\r\n", (unsigned long)(armr7_mpu_get_IFSR())); 
+    mem += sprintf(mem, "per.s c15:0x206 %%long %#lx\r\n", (unsigned long)(armr7_mpu_get_IFAR())); 
+
+#endif //#ifdef __USE_MMU__
+
+    return mem;
+}
+
+unsigned long ramdump_arch_get_pc(unsigned int mode)
+{
+	unsigned long pc;
+#ifdef _OS_TOS 
+
+	switch (mode){
+	case CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION:
+		pc = arm_all_modes_regs.udf.lr;
+		break;
+	case CYGNUM_HAL_VECTOR_ABORT_PREFETCH:
+		pc = arm_all_modes_regs.abt.lr;
+		break;
+	case CYGNUM_HAL_VECTOR_ABORT_DATA:
+		pc = arm_all_modes_regs.abt.lr;
+		break;
+	default:
+		pc = arm_all_modes_regs.svc.lr;
+		break;
+	}
+#endif	
+	return pc;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/cp/ps/plat/src/oss/sup/src/ramdump_v7_asm.S b/cp/ps/plat/src/oss/sup/src/ramdump_v7_asm.S
new file mode 100644
index 0000000..7125967
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/ramdump_v7_asm.S
@@ -0,0 +1,102 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2015, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+* 
+* ÎļþÃû³Æ:     ramdump_v7_asm.S
+* Îļþ±êʶ:     ramdump_v7_asm.S
+* ÄÚÈÝÕªÒª:     
+* 
+* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+* ------------------------------------------------------------------------------
+* 2016/06/20      V1.0        Create          ÕÔ¾ü¿ü          ´´½¨
+* 
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   Í·Îļþ                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                  ³£Á¿¶¨Òå                                    *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                   ºê¶¨Òå                                     *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýÉùÃ÷                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                              ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå                                *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Ö±äÁ¿¶¨Òå                                  *
+*******************************************************************************/
+.extern arm_all_modes_regs
+
+.global ramdump_arch_save_all_regs
+.global armv7_clean_dcache_l1
+
+/*******************************************************************************
+*                                ¾Ö²¿º¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+*                                È«¾Öº¯ÊýʵÏÖ                                  *
+*******************************************************************************/
+
+/*******************************************************************************
+* ¹¦ÄÜÃèÊö:     ramdump_arch_save_all_regs
+* ²ÎÊý˵Ã÷:     
+*   (´«Èë²ÎÊý)  
+*   (´«³ö²ÎÊý)  
+* ·µ »Ø Öµ:     
+* ÆäËü˵Ã÷:     This function is used for linux ramdump registers recover
+*               usr mode doesn`t need to store,we have special handle
+*******************************************************************************/
+.text
+.balign 4
+.type ramdump_arch_save_all_regs, %function
+ramdump_arch_save_all_regs:    
+    push     {r14}
+    ldr      r14, =arm_all_modes_regs
+    stm      r14!, {r0-r12}             /* ±£´ær0-r12   */
+    mov      r0, r14                    /* ±£´ær14ÖÁr0£¬ºóÐøÒÔr0Ϊ»ùµØÖ·Ñ¹Õ» */
+    ldr      r14, [r13], #4             /* »¹Ô­r13,r14  */
+    mrs      r1, CPSR                   /* ±£´æcpsrÖÁr1 */
+    msr      CPSR_c, #0xdf              /* SYS mode		*/
+    stm      r0!, {r13, r14}            /* ½«{r13,r14}ÈëÕ»  */
+//mrs      r2, SPSR
+    str      r2, [r0], #4               /* ½«SPSRÈëÕ»   */
+    msr      CPSR_c, #0xd3              /* svc mode     */
+    stm      r0!, {r13, r14}            /* ½«{r13,r14}  */
+    mrs      r2, SPSR
+    str      r2,  [r0], #4              /* ½«SPSRÈëÕ»   */
+    msr      CPSR_c, #0xd7              /* ABT mode     */
+    mrs      r2,  SPSR
+    stm      r0!, {r13, r14}
+    str      r2, [r0], #4
+    msr      CPSR_c, #0xdb              /* UND mode     */
+    mrs      r2, SPSR
+    stm      r0!, {r13, r14}
+    str      r2, [r0], #4
+    msr      CPSR_c, #0xd2              /* IRQ mode     */
+    mrs      r2, SPSR
+    stm      r0!, {r13, r14}
+    str      r2, [r0], #4
+    msr      CPSR_c, #0xd1              /* FIQ mode     */
+    mrs      r2, SPSR
+    stm      r0!, {r8-r14}
+    str      r2, [r0], #4
+    msr      CPSR_c, r1                 /* »¹Ô­CPRS     */
+    ldr      r14, =arm_all_modes_regs    /* »¹Ô­¼Ä´æÆ÷   */      
+    ldm      r14!, {r0-r12}             /* »¹Ô­r0-r12£¬r13µÄֵ֮ǰÒÑ»¹Ô­    */
+    ldmdb    r13, {R14}                 /* »¹Ô­r14      */
+    bx       r14                        /* ·µ»Ø         */
+
diff --git a/cp/ps/plat/src/oss/sup/src/sup_agent_entry.c b/cp/ps/plat/src/oss/sup/src/sup_agent_entry.c
new file mode 100644
index 0000000..5224c10
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_agent_entry.c
@@ -0,0 +1,222 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "oss_api.h"

+#include "sup_agent.h"

+#include "sup_agent_toolkit.h"

+#include "sup_agent_uemessage.h"

+#include "sup_agent_pcmessage.h"

+#include "commgt_api.h"

+#include "drv_api.h"

+

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+

+/**************************************************************************************************

+* staticº¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+#ifdef _USE_WINCOMM_SERVER

+static VOID zOss_MonitorAgt_CommCallBack( UINT32 msgID, const UINT8 * msg, UINT32 msgLen );

+#else

+static VOID zOss_MonitorAgt_CommCallBack( UINT32 msgID, const UINT8 * msg, UINT16 msgLen );

+#endif

+

+/**************************************************************************************************

+* º¯ÊýʵÏÖÇø

+***************************************************************************************************/

+

+/**************************************************************************************************

+ º¯ÊýÃû      £ºOsAgt_MessageRelease

+ ¹¦ÄÜ        £ºÓÃÓÚÊÍ·ÅÊÕµ½µÄÏûÏ¢ÖÐÉêÇëµÄÄÚ´æ

+ ÊäÈë²ÎÊý    £ºmsg_id             Ä£¿éÊÕµ½µÄÏûÏ¢µÄID

+               buf                Ö¸ÏòÄ£¿éÊÕµ½µÄÏûÏ¢µÄÄÚÈݵÄÖ¸Õë

+ Êä³ö²ÎÊý    £ºÎÞ

+ ·µ»ØÖµËµÃ÷  £ºVOID

+ ÆäËû˵Ã÷    £º

+ --------------------------------------------------------------------------------------------------

+ ÐÞ¸ÄÈÕÆÚ        °æ±¾        ÐÞ¸ÄÈË        ÐÞ¸ÄÔ­Òò¼°ÄÚÈÝ

+ **************************************************************************************************/

+VOID zOss_MonitorAgt_MessageRelease(UINT32 msg_id, UINT8 *buf)

+{

+    switch(msg_id)

+    {

+    case OSS_MON_THREAD:

+        {

+            zOss_RetUB(((T_ZOss_Mon_Thread*)buf)->ele);

+        }

+        break;

+        

+    case OSS_MON_TIMER:

+        {

+            zOss_RetUB(((T_ZOss_Mon_Timer*)buf)->ele);

+        }

+        break;

+        

+    case OSS_MON_TASK:

+        {

+            zOss_RetUB(((T_ZOss_Mon_Task*)buf)->ele);

+        }

+        break;

+        

+    case OSS_MON_POOL_ALLOC:

+        {

+            zOss_Free(((T_ZOss_Mon_Pool_Alloc*)buf)->ele);

+        }

+        break;

+        

+    case OSS_MON_POOL_LEAK:

+        {

+            zOss_Free(((T_ZOss_Mon_Pool_Leak*)buf)->ele);

+        }

+        break;

+        

+    case OSS_MON_GET_VAR_ACK:

+        {

+            zOss_RetUB(((T_ZOss_Mon_Get_Var_Ack*)buf)->value);

+        }

+        break;

+        

+    default:

+        break;

+    }

+}

+

+/**************************************************************************************************

+ º¯ÊýÃû      £ºzOsAgt_Task

+ ¹¦ÄÜ        £ºOsAgtÄ£¿éÈë¿Úº¯Êý

+ ÊäÈë²ÎÊý    £ºstate              Ä£¿é״̬

+               msg_id             Ä£¿éÊÕµ½µÄÏûÏ¢µÄID

+               buf                Ö¸ÏòÄ£¿éÊÕµ½µÄÏûÏ¢µÄÄÚÈݵÄÖ¸Õë

+               msg_len            Ä£¿éÊÕµ½µÄÏûÏ¢µÄ³¤¶È

+               private_data       Ä£¿é˽ÓÐÊý¾ÝÇø

+ Êä³ö²ÎÊý    £ºÎÞ

+ ·µ»ØÖµËµÃ÷  £ºVOID

+ ÆäËû˵Ã÷    £º

+ --------------------------------------------------------------------------------------------------

+ ÐÞ¸ÄÈÕÆÚ        °æ±¾        ÐÞ¸ÄÈË        ÐÞ¸ÄÔ­Òò¼°ÄÚÈÝ

+ **************************************************************************************************/

+VOID zOss_MonitorAgt_Task(UINT8 state, UINT32 msg_id, UINT8 *buf, UINT16 msg_len, UINT8 *private_data)

+{

+    switch(state)

+    {

+    case ZOSS_STATUS_INIT:

+        {

+            switch(msg_id)

+            {

+            case EV_INIT:

+                break;

+                

+            case EV_POWERON:

+                {

+                    #ifdef _USE_WINCOMM_SERVER

+                    if (0 == zTools_CommReg(SUBMDL_MONAGENT, ZDRV_DEV_UART_0, zOss_MonitorAgt_CommCallBack))

+                    #else

+                    if (0 == zOss_CommReg(SUBMDL_MONAGENT, ZDRV_DEV_UART_0, zOss_MonitorAgt_CommCallBack))

+                    #endif

+                    {

+                        zOss_SetState(ZOSS_STATUS_WORK); /*½«ÈÎÎñÉèΪ¹¤×÷̬*/  

+                        zOss_MonitorAgt_SetOsTaskId(zOss_GetTaskID(OS_TASK_NAME));

+                        zOss_MonitorAgt_InitUeMessage();

+                    }

+                }

+                break;

+                

+            default:

+                break;                                  

+            }

+        }

+        break;

+        

+    case ZOSS_STATUS_WORK:   

+        {

+            zOss_MonitorAgt_UeMessageHandler(msg_id, buf);

+            zOss_MonitorAgt_MessageRelease(msg_id, buf);

+        }

+        break;

+        

+    default:

+        break;         

+    }	

+}

+

+/**************************************************************************************************

+ º¯ÊýÃû      £ºzOsAgt_CommCallBack

+ ¹¦ÄÜ        £ºOsAgtÄ£¿éÌṩ¸øCOMMÄ£¿éµÄ»Øµ÷º¯Êý£¬ÓÃÀ´½ÓÊÕÀ´×ÔPC²àµÄÏûÏ¢

+ ÊäÈë²ÎÊý    £ºmsgID              ½ÓÊÕµ½µÄÏûÏ¢ID£¬¼´COMMÏûϢͷ²¿ÖеÄÏûÏ¢ÀàÐÍ

+               ms                 Ö¸ÏòÄ£¿éÊÕµ½µÄÏûÏ¢µÄÄÚÈݵÄÖ¸Õë

+               msgLen             Ä£¿éÊÕµ½µÄÏûÏ¢µÄ³¤¶È

+ Êä³ö²ÎÊý    £ºÎÞ

+ ·µ»ØÖµËµÃ÷  £ºVOID

+ ÆäËû˵Ã÷    £º

+ --------------------------------------------------------------------------------------------------

+ ÐÞ¸ÄÈÕÆÚ        °æ±¾        ÐÞ¸ÄÈË        ÐÞ¸ÄÔ­Òò¼°ÄÚÈÝ

+ **************************************************************************************************/

+#ifdef _USE_WINCOMM_SERVER

+static VOID zOss_MonitorAgt_CommCallBack( UINT32 msgID, const UINT8 * msg, UINT32 msgLen )

+#else

+static VOID zOss_MonitorAgt_CommCallBack( UINT32 msgID, const UINT8 * msg, UINT16 msgLen )

+#endif

+{

+    BYTE toolMsg = *msg;

+    

+    switch (toolMsg)

+    {

+    case PC_AGT_ACK:

+        zOss_MonitorAgt_PcAckReq();

+        break;

+    case PC_AGT_SET_VARIABLE: //set variable

+        zOss_MonitorAgt_PcSetValueReq(msgLen, (UINT8 *)msg);

+        break;

+        

+    case PC_AGT_GET_VARIABLE:

+        zOss_MonitorAgt_PcGetValueReq(msgLen, (UINT8 *)msg);

+        break;

+        

+    case PC_AGT_SNAPSHOT://snapshot

+        zOss_MonitorAgt_PcSnapshotReq(*(msg + 1));

+        break;

+        

+    case PC_AGT_STOP:

+        zOss_MonitorAgt_PcStop();

+        break;

+        

+    case PC_AGT_START:

+        zOss_MonitorAgt_PcStart();

+        break;

+        

+    default:

+        break;

+    }    

+}

+

+#endif

+

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_agent_osinfopack.c b/cp/ps/plat/src/oss/sup/src/sup_agent_osinfopack.c
new file mode 100644
index 0000000..b672fac
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_agent_osinfopack.c
@@ -0,0 +1,216 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "sup_agent_osinfopack.h"

+#include "sup_agent_toolkit.h"

+

+/**************************************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+***************************************************************************************************/

+typedef struct

+{

+    UINT8 vistPermission;

+    const CHAR* description;

+}T_Mmu_VistPermission;

+

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+#define NumericToByteArray(array, numeric) zOss_Memcpy(array, &numeric, sizeof(numeric))

+

+static char s_timerExpiryTable[TIMER_EXPIRY_NUM][TIMER_EXPIRY_LEN] = {"no", "yes"};

+static char s_eventTable[EVENT_NUM][EVENT_LEN] = {"thread swapin", 

+                                                  "thread swapout", 

+                                                  "dsr swapin",

+                                                  "dsr swapout"};

+static char s_taskStatusTable[TASK_STATUS_NUM][TASK_STATUS_LEN] = {"stop", 

+                                                                   "idle", 

+                                                                   "ready",

+                                                                   "run"};

+

+static T_Mmu_VistPermission s_mmuVistPermissionTable[] = { {1, "rw, nocache"}, 

+                                                           {2, "ro, nocache"},

+                                                           {9, "rw, writethrough"},

+                                                           {10, "ro, writethrough"},

+                                                           {13, "rw, writeback"},

+                                                           {14, "ro, writeback"}};

+

+static char s_threadStatusTable[THREAD_STATUS_NUM][THREAD_STATUS_LEN] = {"running", "ready", "waiting"};

+

+/**************************************************************************************************

+

+* º¯ÊýʵÏÖÇø

+

+***************************************************************************************************/

+static char* zOss_MonitorAgt_GetMmuPermissonDescription(UINT8 permission)

+{

+    int i = 0;

+    for (i=0; i < MMU_PERMISSION_NUM; i++)

+    {

+        if (s_mmuVistPermissionTable[i].vistPermission == permission)

+            return (char *)s_mmuVistPermissionTable[i].description;

+    }

+

+    return (char *)"";

+}

+

+VOID zOss_MonitorAgt_PackVersion(UINT8* code, T_ZOss_Mon_Version* version)

+{

+    T_Version packVersion = {0};

+    zOss_MonitorAgt_CharToByteArray(packVersion.version, version->version, VERSION_LEN);

+    NumericToByteArray(code, packVersion);

+}

+

+VOID zOss_MonitorAgt_PackFrequency(UINT8* code, T_ZOss_Mon_Cpu_Frequency* frequency)

+{

+    T_Frequency packFreq = {0};

+    //memcpy(packFreq.feq, &frequency->frequency, sizeof(frequency->frequency));

+    NumericToByteArray(packFreq.feq, frequency->frequency);

+    NumericToByteArray(code, packFreq);

+}

+

+VOID zOss_MonitorAgt_PackCpuLoad(UINT8* code, T_ZOss_Mon_Cpu_Load* cpuLoad)

+{

+    T_CpuLoad packCpuLoad = {0};

+    NumericToByteArray(packCpuLoad.load, cpuLoad->load);

+    NumericToByteArray(code, packCpuLoad);

+}

+

+VOID zOss_MonitorAgt_PackPoolEle(UINT8* code, T_ZOss_Mon_Pool_Ele* pool_ele)

+{

+    T_Pool_Ele packPoolEle = {0};

+    NumericToByteArray(packPoolEle.size, pool_ele->size);

+    NumericToByteArray(packPoolEle.total, pool_ele->total);

+    NumericToByteArray(packPoolEle.used, pool_ele->used);

+    NumericToByteArray(packPoolEle.maxUsed, pool_ele->max_used);

+    NumericToByteArray(code, packPoolEle);

+}

+

+VOID zOss_MonitorAgt_PackPoolAllocEle(UINT8* code, T_ZOss_Mon_Pool_Alloc_Ele* pool_alloc_ele)

+{

+    T_Pool_Alloc_Ele packPoolAllocEle = {0};

+    NumericToByteArray(packPoolAllocEle.address, pool_alloc_ele->addr);

+    NumericToByteArray(packPoolAllocEle.owner, pool_alloc_ele->owner);

+    NumericToByteArray(packPoolAllocEle.timeStamp, pool_alloc_ele->timestamp);

+    zOss_MonitorAgt_FileNameToByteArray(packPoolAllocEle.file, pool_alloc_ele->file, FILE_LEN);

+    NumericToByteArray(packPoolAllocEle.line, pool_alloc_ele->line);

+    NumericToByteArray(code, packPoolAllocEle);

+}

+

+VOID zOss_MonitorAgt_PackPoolLeakEle(UINT8* code, T_ZOss_Mon_Pool_Leak_Ele* pool_leak_ele)

+{

+    T_Pool_Leak_Ele packPoolLeakEle = {0};

+    NumericToByteArray(packPoolLeakEle.address, pool_leak_ele->addr);

+    NumericToByteArray(packPoolLeakEle.owner, pool_leak_ele->owner);

+    NumericToByteArray(packPoolLeakEle.timeStamp, pool_leak_ele->timestamp);

+    zOss_MonitorAgt_FileNameToByteArray(packPoolLeakEle.file, pool_leak_ele->file, FILE_LEN);

+    NumericToByteArray(packPoolLeakEle.line, pool_leak_ele->line);

+    NumericToByteArray(code, packPoolLeakEle);

+}

+

+VOID zOss_MonitorAgt_PackHeap(UINT8* code, T_ZOss_Mon_Heap* heap)

+{

+    T_Heap packHeap = {0};

+    NumericToByteArray(packHeap.base, heap->base);

+    NumericToByteArray(packHeap.size, heap->size);

+    NumericToByteArray(packHeap.used, heap->used);

+    NumericToByteArray(code, packHeap);

+}

+

+VOID zOss_MonitorAgt_PackThreadEle(UINT8* code, T_ZOss_Mon_Thread_Ele* thread_ele)

+{

+    T_Thread_Ele packThreadEle = {0};

+    NumericToByteArray(packThreadEle.handle, thread_ele->handle);

+    NumericToByteArray(packThreadEle.msg_no, thread_ele->msg_num);

+    zOss_MonitorAgt_CharToByteArray(packThreadEle.status, s_threadStatusTable[thread_ele->status/2], THREAD_STATUS_LEN);

+    NumericToByteArray(packThreadEle.priority, thread_ele->priority);

+    NumericToByteArray(packThreadEle.stack_used, thread_ele->stack_used);

+    NumericToByteArray(packThreadEle.stack_max_used, thread_ele->stack_max_used);

+    NumericToByteArray(packThreadEle.cpu_load, thread_ele->cpu_load);

+    zOss_MonitorAgt_CharToByteArray(packThreadEle.name, thread_ele->name, THREAD_NAME_LEN);

+    NumericToByteArray(code, packThreadEle);

+}

+

+VOID zOss_MonitorAgt_PackTaskEle(UINT8* code, T_ZOss_Mon_Task_Ele* task_ele)

+{

+    T_Task_Ele packTaskEle = {0};

+    NumericToByteArray(packTaskEle.handle, task_ele->handle);

+    NumericToByteArray(packTaskEle.thread_handle, task_ele->thread_handle);

+    zOss_MonitorAgt_CharToByteArray(packTaskEle.status, s_taskStatusTable[task_ele->status - 1], TASK_STATUS_LEN);

+    zOss_MonitorAgt_CharToByteArray(packTaskEle.name, task_ele->name, TASK_NAME_LEN);

+    NumericToByteArray(code, packTaskEle);

+}

+

+VOID zOss_MonitorAgt_PackEventEle(UINT8* code, T_ZOss_Mon_Event_Ele* event_ele)

+{

+    T_Event_Ele packEventEle = {0};

+    zOss_MonitorAgt_CharToByteArray(packEventEle.event, s_eventTable[event_ele->event], EVENT_LEN);

+    NumericToByteArray(packEventEle.handle, event_ele->handle);

+    NumericToByteArray(packEventEle.tickstamp, event_ele->tickstamp);

+    zOss_MonitorAgt_CharToByteArray(packEventEle.name, event_ele->name, EVENT_NAME_LEN);

+    NumericToByteArray(code, packEventEle);

+}

+

+VOID zOss_MonitorAgt_PackMsgEle(UINT8* code, T_ZOss_Mon_Msg_Ele* msg_ele)

+{

+    T_Msg_Ele packMsgEle = {0};

+    NumericToByteArray(packMsgEle.msgId, msg_ele->msgId);

+    NumericToByteArray(packMsgEle.address, msg_ele->ptr);

+    NumericToByteArray(packMsgEle.size, msg_ele->size);

+    zOss_MonitorAgt_CharToByteArray(packMsgEle.sender, msg_ele->sender, SENDER_NAME_LEN);

+    zOss_MonitorAgt_CharToByteArray(packMsgEle.receiver, msg_ele->receiver, RECEIVER_NAME_LEN);

+    NumericToByteArray(packMsgEle.timestamp, msg_ele->timestamp);

+    NumericToByteArray(code, packMsgEle);

+}

+

+VOID zOss_MonitorAgt_PackTimerEle(UINT8* code, T_ZOss_Mon_Timer_Ele* timer_ele)

+{

+    T_Timer_Ele packTimerEle = {0};

+    NumericToByteArray(packTimerEle.start_time, timer_ele->start_time);

+    NumericToByteArray(packTimerEle.expire_time, timer_ele->expire_time);

+    NumericToByteArray(packTimerEle.callback_func, timer_ele->callback_func);

+    zOss_MonitorAgt_CharToByteArray(packTimerEle.is_period, s_timerExpiryTable[timer_ele->is_period], TIMER_EXPIRY_LEN);

+    NumericToByteArray(packTimerEle.handle, timer_ele->handle);

+    NumericToByteArray(code, packTimerEle);

+}

+

+VOID zOss_MonitorAgt_PackMmuEle(UINT8* code, T_ZOss_Mon_Mmu_Ele* mmu_ele)

+{

+    T_Mmu_Ele packMmuEle = {0};

+    NumericToByteArray(packMmuEle.vir_addr, mmu_ele->vir_addr);

+    NumericToByteArray(packMmuEle.phy_addr, mmu_ele->phy_addr);

+    NumericToByteArray(packMmuEle.size, mmu_ele->size);

+    zOss_MonitorAgt_CharToByteArray(packMmuEle.attr, zOss_MonitorAgt_GetMmuPermissonDescription(mmu_ele->attr), MMU_PERMISSION_LEN);

+    zOss_MonitorAgt_CharToByteArray(packMmuEle.name, mmu_ele->name, MMU_NAME_LEN);

+    NumericToByteArray(code, packMmuEle);

+}

+

+#endif

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_agent_pcmessage.c b/cp/ps/plat/src/oss/sup/src/sup_agent_pcmessage.c
new file mode 100644
index 0000000..497bc6a
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_agent_pcmessage.c
@@ -0,0 +1,177 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "oss_api.h"

+#include "sup_agent.h"

+#include "sup_agent_pcmessage.h"

+#include "sup_agent_toolkit.h"

+#include "sup_agent_status.h"

+#ifdef _USE_WINCOMM_SERVER

+#include "commgt_api.h"

+#endif

+

+/**************************************************************************************************

+* È«¾Ö±äÁ¿¶¨ÒåÇø

+***************************************************************************************************/

+static unsigned int s_openFlg = OSS_MON_FLAG_OFF;

+

+/**************************************************************************************************

+* º¯ÊýʵÏÖÇø

+***************************************************************************************************/

+VOID zOss_MonitorAgt_PcAckReq(VOID)

+{

+    UINT8 cnf[2] = {0};

+    #ifdef _USE_WINCOMM_SERVER

+    VOID  *buffer = NULL;

+    #endif

+    

+    cnf[0] = AGT_PC_ACK;

+    cnf[1] = (BYTE)s_openFlg;

+    #ifdef _USE_WINCOMM_SERVER

+    buffer = zOss_Malloc(sizeof(cnf));

+    if(buffer != NULL)

+    {

+        zOss_Memcpy(buffer, cnf, sizeof(cnf));

+        zOss_MonitorAgt_SendDataToPcTool(buffer, 2);

+    }

+    #else    

+    zOss_MonitorAgt_SendDataToPcTool((UINT8*)cnf, 2);

+    #endif

+}

+

+#ifdef _USE_WINCOMM_SERVER

+VOID zOss_MonitorAgt_PcSetValueReq(UINT32 len, BYTE* buf)

+#else

+VOID zOss_MonitorAgt_PcSetValueReq(UINT16 len, BYTE* buf)

+#endif

+{

+    T_ZOss_Mon_Set_Var* Msg = (T_ZOss_Mon_Set_Var*)zOss_GetUB(sizeof(*Msg));

+    zOss_Memcpy(&Msg->base, &buf[1], sizeof(Msg->base));

+    zOss_Memcpy(&Msg->size, &buf[5], sizeof(Msg->size));

+    Msg->value = (BYTE*)zOss_GetUB(Msg->size);

+    zOss_Memcpy(Msg->value, &buf[9], Msg->size);

+    zOss_MonitorAgt_SendMsgToOs(OSS_MON_SET_VAR, sizeof(T_ZOss_Mon_Set_Var), (BYTE*)(Msg));

+}

+

+#ifdef _USE_WINCOMM_SERVER

+VOID zOss_MonitorAgt_PcGetValueReq(UINT32 len, BYTE* buf)

+#else

+VOID zOss_MonitorAgt_PcGetValueReq(UINT16 len, BYTE* buf)

+#endif

+{

+    T_ZOss_Mon_Get_Var_Req* Msg = ZOSS_NULL;

+

+    if (zOss_MonitorAgt_CheckReceiveMessage(PC_TOOL_WINDOW_VARIABLE) == OsAgt_Status_Ok)

+    {

+        Msg = (T_ZOss_Mon_Get_Var_Req*)zOss_GetUB(sizeof(*Msg));

+        zOss_Memcpy(&Msg->base, &buf[1], sizeof(Msg->base));

+        zOss_Memcpy(&Msg->size, &buf[5], sizeof(Msg->size));

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_GET_VAR_REQ, sizeof(T_ZOss_Mon_Get_Var_Req), (BYTE*)(Msg));

+    }

+}

+

+static VOID zOss_MonitorAgt_SendOsReq(UINT8 msgId)

+{

+    switch (msgId)

+    {

+    case AGT_PC_WINDOW_INFO_THREAD: 

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_THREAD, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_EVENT:

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_EVENT, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_TIMER:   

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_TIMER, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_TASK:   

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_TASK, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_RAMLOG:

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_RAMLOG, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_POOL:  

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_POOL_ALLOC, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_MMU: 

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_MMU, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_MSG:   

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_MSG, 0, ZOSS_NULL);

+        break;

+    case AGT_PC_WINDOW_INFO_POOLLEAK:  

+        zOss_MonitorAgt_SendMsgToOs(OSS_MON_POOL_LEAK, 0, ZOSS_NULL);

+        break; 

+    case AGT_PC_WINDOW_INFO_MEM: 

+        {

+            zOss_MonitorAgt_SendMsgToOs(OSS_MON_HEAP, 0, ZOSS_NULL);

+            zOss_MonitorAgt_SendMsgToOs(OSS_MON_POOL, 0, ZOSS_NULL);

+        }

+        break; 

+    case AGT_PC_WINDOW_INFO_CPU:  

+        {

+            zOss_MonitorAgt_SendMsgToOs(OSS_MON_CPU_FREQUENCY, 0, ZOSS_NULL);

+            zOss_MonitorAgt_SendMsgToOs(OSS_MON_CPU_LOAD, 0, ZOSS_NULL);

+            zOss_MonitorAgt_SendMsgToOs(OSS_MON_VERSION, 0, ZOSS_NULL);

+        }

+        break; 

+    default:

+        break;

+    }

+}

+

+VOID zOss_MonitorAgt_PcSnapshotReq(UINT8 msgId)

+{

+    if (s_openFlg == OSS_MON_FLAG_OFF)

+	{

+        return;

+	}

+    if (zOss_MonitorAgt_CheckReceiveMessage(msgId) == OsAgt_Status_Ok)

+    {

+        zOss_MonitorAgt_SendOsReq(msgId);

+    }

+}

+

+VOID zOss_MonitorAgt_PcStop(VOID)

+{

+    T_ZOss_Mon_Set_Flag* Msg = (T_ZOss_Mon_Set_Flag*)zOss_GetUB(sizeof(*Msg));

+    s_openFlg = OSS_MON_FLAG_OFF;

+    Msg->flag = s_openFlg;

+    zOss_MonitorAgt_SendMsgToOs(OSS_MON_SET_FLAG, sizeof(T_ZOss_Mon_Set_Flag), (BYTE*)(Msg));

+}

+

+VOID zOss_MonitorAgt_PcStart(VOID)

+{

+    T_ZOss_Mon_Set_Flag* Msg = (T_ZOss_Mon_Set_Flag*)zOss_GetUB(sizeof(*Msg));

+    s_openFlg = OSS_MON_FLAG_ON;

+    Msg->flag = s_openFlg;

+    zOss_MonitorAgt_SendMsgToOs(OSS_MON_SET_FLAG, sizeof(T_ZOss_Mon_Set_Flag), (BYTE*)(Msg));

+}

+

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_agent_status.c b/cp/ps/plat/src/oss/sup/src/sup_agent_status.c
new file mode 100644
index 0000000..da244f2
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_agent_status.c
@@ -0,0 +1,212 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "sup_agent_status.h"

+#include "sup_agent.h"

+

+/**************************************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+***************************************************************************************************/

+typedef struct

+{

+    UINT32 msgId;

+    UINT32 count;

+

+}T_OsAgt_Status;

+

+typedef struct

+{

+    UINT32 pcMsgId;

+    UINT32 ueMsgId;

+

+}T_OsAgt_MsgIdMap;

+

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+#define INVLID_STATUS_VALUE  0xFFFFFFFF

+#define INVLID_MESSAGE_ID    0xFFFFFFFF

+

+static T_OsAgt_MsgIdMap g_MsgIdMap[] = 

+{

+    { PC_TOOL_WINDOW_CPU,       OSS_MON_VERSION}, 

+

+    { PC_TOOL_WINDOW_THREAD,    OSS_MON_THREAD},     

+    { PC_TOOL_WINDOW_EVENT,     OSS_MON_EVENT},

+    { PC_TOOL_WINDOW_TIMER,     OSS_MON_TIMER},      

+    { PC_TOOL_WINDOW_TASK,      OSS_MON_TASK},       

+    { PC_TOOL_WINDOW_RAMLOG,    OSS_MON_RAMLOG},          

+    { PC_TOOL_WINDOW_POOL,      OSS_MON_POOL_ALLOC},            

+    { PC_TOOL_WINDOW_MMU,       OSS_MON_MMU},        

+    { PC_TOOL_WINDOW_MSG,       OSS_MON_MSG},        

+    { PC_TOOL_WINDOW_POOLLEAK,  OSS_MON_POOL_LEAK},

+    { PC_TOOL_WINDOW_VARIABLE,  OSS_MON_GET_VAR_ACK},  

+

+    { PC_TOOL_WINDOW_MEM,       OSS_MON_HEAP},   

+    { PC_TOOL_WINDOW_MEM,       OSS_MON_POOL}, 

+

+    { PC_TOOL_WINDOW_CPU,       OSS_MON_CPU_LOAD},        

+    { PC_TOOL_WINDOW_CPU,       OSS_MON_CPU_FREQUENCY}

+};

+

+#define UE_MSG_NUM (sizeof(g_MsgIdMap)/sizeof(T_OsAgt_MsgIdMap))

+

+/**************************************************************************************************

+* staticº¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+static UINT32 zOss_MonitorAgt_GetStatusCount(UINT32 msgId);

+static VOID zOss_MonitorAgt_SetStatusCount(UINT32 msgId);

+

+/**************************************************************************************************

+* È«¾Ö±äÁ¿¶¨ÒåÇø

+***************************************************************************************************/

+static T_OsAgt_Status g_Status[PC_WINDOW_NUM] = 

+{

+    { PC_TOOL_WINDOW_THREAD,   0}, //1     

+    { PC_TOOL_WINDOW_EVENT,    0}, //1

+    { PC_TOOL_WINDOW_TIMER,    0}, //1      

+    { PC_TOOL_WINDOW_TASK,     0}, //1       

+    { PC_TOOL_WINDOW_RAMLOG,   0}, //1          

+    { PC_TOOL_WINDOW_POOL,     0}, //1            

+    { PC_TOOL_WINDOW_MMU,      0}, //1       

+    { PC_TOOL_WINDOW_MSG,      0}, //1       

+    { PC_TOOL_WINDOW_POOLLEAK, 0}, //1

+    { PC_TOOL_WINDOW_VARIABLE, 0}, //1  

+    { PC_TOOL_WINDOW_MEM,      0}, //2    

+    { PC_TOOL_WINDOW_CPU,      0}, //2      

+};

+

+/**************************************************************************************************

+* º¯ÊýʵÏÖÇø

+***************************************************************************************************/

+static UINT32 zOss_MonitorAgt_GetUeMessageNum(UINT32 msgId)

+{

+    UINT32 i = 0;

+    UINT32 count = 0;

+    for(i = 0; i < UE_MSG_NUM; i++)

+    {

+        if(g_MsgIdMap[i].pcMsgId == msgId)

+        {

+            count++;

+        }

+    }

+

+    return count;

+}

+

+static UINT32 zOss_MonitorAgt_GetPcMessageId(UINT32 ueMsgId)

+{

+    UINT32 pcMsgId = INVLID_MESSAGE_ID; 

+    UINT32 i = 0;

+    for(i = 0; i < UE_MSG_NUM; i++)

+    {

+        if(g_MsgIdMap[i].ueMsgId == ueMsgId)

+        {  

+            pcMsgId = g_MsgIdMap[i].pcMsgId; 

+            break;

+        }

+    }

+

+return pcMsgId;

+}

+

+static VOID zOss_MonitorAgt_ReduceStatusCount(UINT32 msgId)

+{

+    int i = 0;

+    for(i = 0; i < PC_WINDOW_NUM; i++)

+    {

+        if(g_Status[i].msgId == msgId)

+        {

+            g_Status[i].count--;

+            break;

+        }

+    }

+}

+

+static VOID zOss_MonitorAgt_SetStatusCount(UINT32 msgId)

+{

+    int i = 0;

+    UINT32 count = zOss_MonitorAgt_GetUeMessageNum(msgId);

+

+    for(i = 0; i < PC_WINDOW_NUM; i++)

+    {

+        if(g_Status[i].msgId == msgId)

+        {

+            g_Status[i].count = count;

+            break;

+        }

+    }

+}

+

+static UINT32 zOss_MonitorAgt_GetStatusCount(UINT32 msgId)

+{

+    int i = 0;

+

+    for(i = 0; i < PC_WINDOW_NUM; i++)

+    {

+        if(g_Status[i].msgId == msgId)

+        {

+            return g_Status[i].count;

+        }

+    }

+ 

+    return INVLID_STATUS_VALUE;

+}

+

+OsAgt_Status zOss_MonitorAgt_CheckReceiveMessage(UINT32 msgId)

+{

+    if(zOss_MonitorAgt_GetStatusCount(msgId) == 0)

+    {

+        zOss_MonitorAgt_SetStatusCount(msgId);

+        return OsAgt_Status_Ok;

+    }

+    else

+    {

+        //discard received pc message

+        return OsAgt_Status_Error;

+    }

+}

+

+OsAgt_Status zOss_MonitorAgt_CheckReplyMessage(UINT32 ueMsgId)

+{

+    UINT32 pcMsgId = zOss_MonitorAgt_GetPcMessageId(ueMsgId);

+

+    zOss_MonitorAgt_ReduceStatusCount(pcMsgId);

+    if(zOss_MonitorAgt_GetStatusCount(pcMsgId) == 0)

+    {

+        //send message to pc

+        return OsAgt_Status_Ok;

+    }

+    else

+    {

+        return OsAgt_Status_Error;

+    }

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_agent_toolkit.c b/cp/ps/plat/src/oss/sup/src/sup_agent_toolkit.c
new file mode 100644
index 0000000..8103c11
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_agent_toolkit.c
@@ -0,0 +1,154 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+

+#ifdef _USE_MONITOR

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "sup_agent_toolkit.h"

+#include "commgt_api.h"

+#ifdef _USE_WINCOMM_SERVER

+#include "tools.h"

+#endif

+

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+//wincommÍ·²¿ÏûÏ¢ÖеÄMsgType¶¨Òå

+#define WINCOMM_MSG_HEAD_TYPE_DATA 1

+

+//Ä£¿éºÅ¶¨Òå

+#define PC_TOOL_MODULE_ID          155

+#define PC_TOOL_SUB_MODULE_ID      1

+#define AGT_SUB_MODULE_ID          SUBMDL_MONAGENT

+

+//Êý¾Ý·Ö¶ÎÍ·²¿³¤¶È

+#define DATA_SEG_HEAD_LEN          3

+

+//×î´ó·¢ËÍÊý¾Ý³¤¶È£¬wincommÖ§³Ö64kº¬wincomm×Ô¼º·â×°µÄÍ·²¿£¬ÕâÀïÁôÒ»µãÔ¤Áô¸øwincommÍ·²¿

+#define DATA_MAX_LEN               0xf000

+static ZOSS_TASK_ID s_osTaskId = NULL;

+

+#define SEND_DATA_OK                0

+#define SEND_DATA_ERR               1

+

+static int zOss_MonitorAgt_SendDataSeg(BYTE msgId, BYTE curSeg, BYTE maxSeg,  UINT8* curDataPtr, UINT16 dataLen);

+

+/**************************************************************************************************

+* º¯ÊýʵÏÖÇø

+***************************************************************************************************/

+VOID zOss_MonitorAgt_SetOsTaskId(ZOSS_TASK_ID taskId)

+{

+    s_osTaskId = taskId;

+}

+

+VOID zOss_MonitorAgt_SendMsgToOs(UINT32 id, UINT16 len, UINT8* buf)

+{

+    zOss_TaskSendData(id, buf, len, s_osTaskId);

+}

+

+VOID zOss_MonitorAgt_CharToByteArray(char* array, const char* charStr, DWORD maxLen)

+{

+    DWORD strenLen = strlen(charStr);

+

+    if (strenLen > maxLen)

+    {

+        strenLen = maxLen;

+    }

+    zOss_Memcpy(array, charStr, strenLen);

+}

+

+VOID zOss_MonitorAgt_FileNameToByteArray(char* array, const char* charStr, DWORD maxLen)

+{

+    UINT32 pos = 0;

+    DWORD strenLen = strlen(charStr);

+

+    if (strenLen > maxLen)

+    {

+        pos = strenLen - maxLen;

+        strenLen = maxLen;

+    }

+    

+    zOss_Memcpy(array, charStr + pos, strenLen);

+}

+

+VOID zOss_MonitorAgt_SendDataToPcTool(UINT8* buf, UINT32 len)

+{

+    #ifdef _USE_WINCOMM_SERVER

+    UINT8* curPtr = buf + 1;

+    UINT16 maxDataLen = DATA_MAX_LEN - DATA_SEG_HEAD_LEN;

+    UINT32 dataLen = len - 1;

+    UINT16 dataLenTemp;

+    UINT32 segNum = (dataLen % maxDataLen) >0 ? dataLen / maxDataLen + 1 : dataLen / maxDataLen;

+    int i;

+    if (buf == NULL)

+    {

+        return;

+    }

+    for (i=1;i<=segNum;i++)

+    {

+        dataLenTemp = dataLen > maxDataLen? maxDataLen : dataLen;

+        if (SEND_DATA_ERR == zOss_MonitorAgt_SendDataSeg(buf[0], i, segNum,  curPtr, dataLenTemp))

+        {

+            break;

+        }

+        dataLen = dataLen - dataLenTemp;

+        curPtr = curPtr + dataLenTemp;

+    }    

+    zOss_Free(buf);

+    #else

+    zOss_SendToPC(WINCOMM_MSG_HEAD_TYPE_DATA, buf, len, PC_TOOL_MODULE_ID, PC_TOOL_SUB_MODULE_ID, AGT_SUB_MODULE_ID);

+    #endif

+}

+

+

+int zOss_MonitorAgt_SendDataSeg(BYTE msgId, BYTE curSeg, BYTE maxSeg,  UINT8* curDataPtr, UINT16 dataLen)

+{

+    UINT32 uRet = ZOSS_ERROR;

+    UINT8* sendBuf = Comm_Malloc(DATA_SEG_HEAD_LEN + dataLen);

+    if (sendBuf == NULL)

+    {

+        return SEND_DATA_ERR;

+    }

+    sendBuf[0] = msgId;

+    sendBuf[1] = curSeg;

+    sendBuf[2] = maxSeg;

+    if (dataLen != 0)

+    {

+        zOss_Memcpy(sendBuf + DATA_SEG_HEAD_LEN, curDataPtr, dataLen);

+    }

+    uRet = zTools_SendData(sendBuf, DATA_SEG_HEAD_LEN + dataLen, PC_TOOL_MODULE_ID, PC_TOOL_SUB_MODULE_ID, AGT_SUB_MODULE_ID);

+    if(uRet != ZOSS_SUCCESS)

+    {

+        Comm_Free(sendBuf);

+        return SEND_DATA_ERR;

+    }

+    return SEND_DATA_OK;

+}

+#endif

+

+

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_agent_uemessage.c b/cp/ps/plat/src/oss/sup/src/sup_agent_uemessage.c
new file mode 100644
index 0000000..8a0a652
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_agent_uemessage.c
@@ -0,0 +1,912 @@
+/**************************************************************************************************

+*

+*                       Copyright(c) 2012 ZTE Corporation 

+*

+***************************************************************************************************

+* °æ±¾ËùÓÐ: ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾ ÊÖ»úÊÂÒµ²¿ Èí¼þ¿ª·¢Áù²¿

+* Ä£ ¿é Ãû: OS¸ú×Ù¹¤¾ßUE²à´úÀí

+* ÎÄ ¼þ Ãû:

+* Îļþ±êʶ:

+* Ïà¹ØÎļþ:

+* ʵÏÖ¹¦ÄÜ:

+* ×÷    Õß:

+* °æ    ±¾:

+* Íê³ÉÈÕÆÚ:

+* ÆäËû˵Ã÷:

+***************************************************************************************************/

+

+/**************************************************************************************************

+* Ð޸ļǼ:

+* ÈÕ    ÆÚ:

+* ÐÞ ¸Ä ºÅ:

+* ÐÞ ¸Ä ÈË:

+* ÄÚ    ÈÝ:

+***************************************************************************************************/

+#ifdef _USE_MONITOR

+

+/**************************************************************************************************

+* includeÇø

+***************************************************************************************************/

+#include "sup_agent_uemessage.h"

+#include "sup_agent.h"

+#include "sup_agent_osinfopack.h"

+#include "sup_agent_status.h"

+#include "sup_agent_toolkit.h"

+#ifdef _USE_WINCOMM_SERVER

+#include "commgt_api.h"

+#endif

+

+/**************************************************************************************************

+* ³£Á¿¶¨ÒåÇø

+***************************************************************************************************/

+#define HEADER_LEN (1)

+

+/**************************************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+***************************************************************************************************/

+typedef VOID (*UeMessageCallBack)(PBYTE buf, UINT32 len);

+

+typedef struct

+{

+    UINT32 length;

+    UINT8* buffer;

+}T_BufferInfo;

+

+typedef VOID(*ConstructWindow)(VOID);

+

+typedef struct 

+{

+    T_BufferInfo heap;

+    T_BufferInfo pool;

+    T_BufferInfo cpuLoad;

+    T_BufferInfo cpuFrequency;

+    T_BufferInfo version;

+    UeMessageCallBack send;

+

+}T_UeMessage;

+

+/**************************************************************************************************

+* staticº¯ÊýÉùÃ÷Çø

+***************************************************************************************************/

+static T_UeMessage s_ueMessage;

+

+static VOID ConstructTwoMessageWindow(int windowId, T_BufferInfo* info1, T_BufferInfo* info2);

+static VOID ConstructThreeMessageWindow(int windowId, T_BufferInfo* info1, T_BufferInfo* info2, T_BufferInfo* info3);

+

+static VOID SendReplyMessage(UINT32 msgId, ConstructWindow func);

+

+static T_BufferInfo* GetHeap(VOID);

+static T_BufferInfo* GetPool(VOID);

+static T_BufferInfo* GetCpuLoad(VOID);

+static T_BufferInfo* GetCpuFrequency(VOID);

+static T_BufferInfo* GetUeVersion(VOID);

+

+static VOID ConstructMemWindowInfo(VOID);

+static VOID ConstructCpuWindowInfo(VOID);

+

+

+//thread window

+static OsAgt_Status ReceiveThreadInfo(UINT32 msgId, T_ZOss_Mon_Thread* message);

+

+//event window

+static OsAgt_Status ReceiveEventInfo(UINT32 msgId, T_ZOss_Mon_Event* message);

+

+//timer window

+static OsAgt_Status ReceiveTimerInfo(UINT32 msgId, T_ZOss_Mon_Timer* message);

+

+//task window

+static OsAgt_Status ReceiveTaskInfo(UINT32 msgId, T_ZOss_Mon_Task* message);

+

+//Ram log window

+static OsAgt_Status ReceiveRamLog(UINT32 msgId, T_ZOss_Mon_Ramlog* message);

+

+//pool alloc window

+static OsAgt_Status ReceivePoolAllocInfo(UINT32 msgId, T_ZOss_Mon_Pool_Alloc* message);

+

+//mmu window

+static OsAgt_Status ReceiveMmuInfo(UINT32 msgId, T_ZOss_Mon_Mmu* message);

+

+//message window 

+static OsAgt_Status ReceiveMsgInfo(UINT32 msgId, T_ZOss_Mon_Msg* message);

+

+//Pool Leak window

+static OsAgt_Status ReceivePoolLeakInfo(UINT32 msgId, T_ZOss_Mon_Pool_Leak* message);

+

+//Variable window

+static OsAgt_Status ReceiveVariable(UINT32 msgId, T_ZOss_Mon_Get_Var_Ack* message);

+

+//Mem window 

+static OsAgt_Status ReceiveHeap(T_ZOss_Mon_Heap* message);

+static OsAgt_Status ReceivePool(T_ZOss_Mon_Pool* message);

+static VOID SendMemWindowInfo(UINT32 msgId);

+

+//cpu window

+static OsAgt_Status ReceiveVersion(UINT32 msgId, T_ZOss_Mon_Version* message);

+static OsAgt_Status ReceiveCpuLoad(T_ZOss_Mon_Cpu_Load* message);

+static OsAgt_Status ReceiveCpuFrequency(T_ZOss_Mon_Cpu_Frequency* message);

+static VOID SendCpuWindowInfo(UINT32 msgId);

+

+

+/**************************************************************************************************

+* º¯ÊýʵÏÖÇø

+***************************************************************************************************/

+static T_BufferInfo* GetHeap(VOID)

+{

+    return &(s_ueMessage.heap);

+}

+

+static T_BufferInfo* GetPool(VOID)

+{

+    return &(s_ueMessage.pool);

+}

+

+static T_BufferInfo* GetCpuLoad(VOID)

+{

+    return &(s_ueMessage.cpuLoad);

+}

+

+static T_BufferInfo* GetCpuFrequency(VOID)

+{

+    return &(s_ueMessage.cpuFrequency);

+}

+

+static T_BufferInfo* GetUeVersion(VOID)

+{

+    return  &(s_ueMessage.version);

+}

+

+static VOID ConstructTwoMessageWindow(int windowId, T_BufferInfo* info1, T_BufferInfo* info2)

+{

+    UINT8* temp = NULL;

+    T_BufferInfo window = {0};

+    window.length =info1->length + info2->length + HEADER_LEN;

+    #ifdef _USE_WINCOMM_SERVER

+    window.buffer = zOss_Malloc(window.length);

+    #else

+    window.buffer = zOss_Malloc(window.length);

+    #endif

+    if(window.buffer != NULL)

+    {

+        temp = window.buffer;

+        *temp = (UINT8)windowId; 

+

+        temp += HEADER_LEN; 

+        zOss_Memcpy(temp, info1->buffer, info1->length);

+

+        temp += info1->length; 

+        zOss_Memcpy(temp, info2->buffer, info2->length);

+    }

+

+    s_ueMessage.send((BYTE*)window.buffer, (WORD)window.length);

+

+    zOss_Free(info1->buffer);

+    zOss_Free(info2->buffer);

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(window.buffer);

+    #endif

+}

+

+static VOID ConstructThreeMessageWindow(int windowId, T_BufferInfo* info1, T_BufferInfo* info2, T_BufferInfo* info3)

+{

+    UINT8* temp = NULL;

+    T_BufferInfo window = {0};

+    window.length =info1->length + info2->length + info3->length + HEADER_LEN;

+    #ifdef _USE_WINCOMM_SERVER

+    window.buffer = zOss_Malloc(window.length);

+    #else

+    window.buffer = zOss_Malloc(window.length);

+    #endif

+    if(window.buffer != NULL)

+    {

+        temp = window.buffer;

+        *temp = (UINT8)windowId; 

+

+        temp += HEADER_LEN; 

+        zOss_Memcpy(temp, info1->buffer, info1->length);

+

+        temp += info1->length; 

+        zOss_Memcpy(temp, info2->buffer, info2->length);

+

+        temp += info2->length;

+        zOss_Memcpy(temp, info3->buffer, info3->length);

+    }

+

+    s_ueMessage.send((BYTE*)window.buffer, (WORD)window.length);

+

+    zOss_Free(info1->buffer);

+    zOss_Free(info2->buffer);

+    zOss_Free(info3->buffer);

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(window.buffer);

+    #endif

+}

+

+static VOID SendReplyMessage(UINT32 msgId, ConstructWindow func)

+{

+    if(zOss_MonitorAgt_CheckReplyMessage(msgId) == OsAgt_Status_Ok)

+    {

+        func();

+    }

+}

+

+static VOID ConstructMemWindowInfo(VOID)

+{

+    ConstructTwoMessageWindow(AGT_PC_WINDOW_INFO_MEM, GetHeap(), GetPool());

+}

+

+static VOID ConstructCpuWindowInfo(VOID)

+{

+    ConstructThreeMessageWindow(AGT_PC_WINDOW_INFO_CPU, GetCpuLoad(), GetCpuFrequency(), GetUeVersion());

+}

+

+//version

+static OsAgt_Status ReceiveVersion(UINT32 msgId, T_ZOss_Mon_Version* message)

+{

+    T_BufferInfo* bufferInfo = &(s_ueMessage.version);

+

+    if(message == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo->length = sizeof(T_Version);

+    bufferInfo->buffer = zOss_Malloc(bufferInfo->length);

+

+    if(bufferInfo->buffer != NULL)

+    {

+        zOss_MonitorAgt_PackVersion(bufferInfo->buffer, message);

+    }

+

+    return OsAgt_Status_Ok;

+}

+

+

+//thread

+static OsAgt_Status ReceiveThreadInfo(UINT32 msgId, T_ZOss_Mon_Thread* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Thread_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_THREAD;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackThreadEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//event

+static OsAgt_Status ReceiveEventInfo(UINT32 msgId, T_ZOss_Mon_Event* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Event_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_EVENT;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackEventEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//timer

+static OsAgt_Status ReceiveTimerInfo(UINT32 msgId, T_ZOss_Mon_Timer* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Timer_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_TIMER;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackTimerEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER    

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//task

+static OsAgt_Status ReceiveTaskInfo(UINT32 msgId, T_ZOss_Mon_Task* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Task_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_TASK;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackTaskEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+

+//Ram log

+static OsAgt_Status ReceiveRamLog(UINT32 msgId, T_ZOss_Mon_Ramlog* message)

+{

+    T_BufferInfo bufferInfo = {0};

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->ramlog == NULL || message->size == 0)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(message->size + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_RAMLOG;

+        zOss_Memcpy(bufferInfo.buffer + HEADER_LEN, message->ramlog, message->size);

+    }

+        

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//pool alloc

+static OsAgt_Status ReceivePoolAllocInfo(UINT32 msgId, T_ZOss_Mon_Pool_Alloc* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Pool_Alloc_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_POOL;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackPoolAllocEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//mmu

+static OsAgt_Status ReceiveMmuInfo(UINT32 msgId, T_ZOss_Mon_Mmu* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Mmu_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_MMU;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackMmuEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//message 

+static OsAgt_Status ReceiveMsgInfo(UINT32 msgId, T_ZOss_Mon_Msg* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Msg_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_MSG;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackMsgEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+//Pool Leak

+static OsAgt_Status ReceivePoolLeakInfo(UINT32 msgId, T_ZOss_Mon_Pool_Leak* message)

+{

+    T_BufferInfo bufferInfo = {0};

+    UINT8* temp = NULL;

+    UINT32 index = 0;

+    UINT32 length = sizeof(T_Pool_Leak_Ele); 

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(length * message->num + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_POOLLEAK;

+        temp = bufferInfo.buffer + HEADER_LEN; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackPoolLeakEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+

+//Variable

+static OsAgt_Status ReceiveVariable(UINT32 msgId, T_ZOss_Mon_Get_Var_Ack* message)

+{

+    T_BufferInfo bufferInfo = {0};

+

+    if (zOss_MonitorAgt_CheckReplyMessage(msgId) != OsAgt_Status_Ok)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    if(message == NULL || message->value == NULL || message->size == 0)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    bufferInfo.length = (UINT32)(message->size + HEADER_LEN);

+    #ifdef _USE_WINCOMM_SERVER

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #else

+    bufferInfo.buffer = zOss_Malloc(bufferInfo.length);

+    #endif

+

+    if(bufferInfo.buffer != NULL)

+    {

+        *(bufferInfo.buffer) = AGT_PC_WINDOW_INFO_VARIABLE;

+        zOss_Memcpy(bufferInfo.buffer + HEADER_LEN, message->value, message->size);

+    }

+

+    s_ueMessage.send(bufferInfo.buffer, bufferInfo.length);

+

+    #ifndef _USE_WINCOMM_SERVER

+    zOss_Free(bufferInfo.buffer);

+    #endif

+

+    return OsAgt_Status_Ok;

+}

+

+

+//Mem 

+static OsAgt_Status ReceiveHeap(T_ZOss_Mon_Heap* message)

+{

+    T_BufferInfo* heap = &(s_ueMessage.heap);

+

+    if(message == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    heap->length = sizeof(T_Heap);

+    heap->buffer = zOss_Malloc(heap->length);

+    if(heap->buffer != NULL)

+    {

+        zOss_MonitorAgt_PackHeap(heap->buffer, message);

+    }

+

+    return OsAgt_Status_Ok;

+}

+

+static OsAgt_Status ReceivePool(T_ZOss_Mon_Pool* message)

+{

+    BYTE* temp = NULL;

+    unsigned int index = 0;

+    UINT32 length = sizeof(T_Pool_Ele); 

+    T_BufferInfo* pool = &(s_ueMessage.pool);

+    

+    if(message == NULL || message->num == 0 || message->ele == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    pool->length = (UINT32)(message->num*length); 

+    pool->buffer = zOss_Malloc(pool->length); 

+    if(pool->buffer != NULL)

+    {

+        temp = pool->buffer; 

+        for(index = 0; index < message->num; index++)

+        {

+            zOss_MonitorAgt_PackPoolEle(temp, &(message->ele[index]));

+            temp += length;

+        }

+    }

+

+    return OsAgt_Status_Ok;

+}

+

+

+

+static VOID SendMemWindowInfo(UINT32 msgId)

+{

+    SendReplyMessage(msgId, ConstructMemWindowInfo);

+}

+

+//cpu

+static OsAgt_Status ReceiveCpuLoad(T_ZOss_Mon_Cpu_Load* message)

+{

+    T_BufferInfo* cpuLoad = &(s_ueMessage.cpuLoad);

+

+    if(message == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    cpuLoad->length = sizeof(T_CpuLoad);

+    cpuLoad->buffer = zOss_Malloc(cpuLoad->length);

+    if(cpuLoad->buffer != NULL)

+    {

+        zOss_MonitorAgt_PackCpuLoad(cpuLoad->buffer, message);

+    }

+

+    return OsAgt_Status_Ok;

+}

+

+static OsAgt_Status ReceiveCpuFrequency(T_ZOss_Mon_Cpu_Frequency* message)

+{

+    T_BufferInfo* cpuFrequency = &(s_ueMessage.cpuFrequency);

+

+    if(message == NULL)

+    {

+        return OsAgt_Status_Error;

+    }

+

+    cpuFrequency->length = sizeof(T_Frequency);

+    cpuFrequency->buffer = zOss_Malloc(cpuFrequency->length);

+    if(cpuFrequency->buffer != NULL)

+    {

+        zOss_MonitorAgt_PackFrequency(cpuFrequency->buffer, message);

+    }

+

+    return OsAgt_Status_Ok;

+}

+

+

+static VOID SendCpuWindowInfo(UINT32 msgId)

+{

+    SendReplyMessage(msgId, ConstructCpuWindowInfo);

+}

+

+

+VOID zOss_MonitorAgt_InitUeMessage()

+{

+    zOss_Memset(&s_ueMessage, 0, sizeof(s_ueMessage));

+    s_ueMessage.send = zOss_MonitorAgt_SendDataToPcTool;

+}

+

+

+VOID zOss_MonitorAgt_UeMessageHandler(UINT32 msgId, UINT8 *buf)

+{

+    OsAgt_Status status = OsAgt_Status_Ok;

+

+    switch(msgId)

+    {

+        case OSS_MON_VERSION:

+            if((status = ReceiveVersion(msgId, (T_ZOss_Mon_Version*)buf)) == OsAgt_Status_Ok)

+            {

+                SendCpuWindowInfo(msgId);

+            }

+            break;

+

+        case OSS_MON_THREAD:

+            ReceiveThreadInfo(msgId, (T_ZOss_Mon_Thread*)buf);

+            break;

+

+        case OSS_MON_EVENT:

+            ReceiveEventInfo(msgId, (T_ZOss_Mon_Event*)buf);

+            break;

+

+        case OSS_MON_TIMER:

+            ReceiveTimerInfo(msgId, (T_ZOss_Mon_Timer*)buf);

+            break;

+

+        case OSS_MON_TASK:

+            ReceiveTaskInfo(msgId, (T_ZOss_Mon_Task*)buf);

+            break;

+

+        case OSS_MON_RAMLOG:

+            ReceiveRamLog(msgId, (T_ZOss_Mon_Ramlog*)buf);

+            break;

+

+        case OSS_MON_POOL_ALLOC:

+            ReceivePoolAllocInfo(msgId, (T_ZOss_Mon_Pool_Alloc*)buf);

+            break;

+

+        case OSS_MON_MMU:

+            ReceiveMmuInfo(msgId, (T_ZOss_Mon_Mmu*)buf);

+            break;

+

+        case OSS_MON_MSG:

+            ReceiveMsgInfo(msgId, (T_ZOss_Mon_Msg*)buf);

+            break;

+

+        case OSS_MON_POOL_LEAK:

+            ReceivePoolLeakInfo(msgId, (T_ZOss_Mon_Pool_Leak*)buf);

+            break;

+

+        case OSS_MON_GET_VAR_ACK:

+            ReceiveVariable(msgId, (T_ZOss_Mon_Get_Var_Ack*)buf);

+            break;

+

+        case OSS_MON_HEAP:

+            {

+                if((status = ReceiveHeap((T_ZOss_Mon_Heap*)buf)) == OsAgt_Status_Ok)

+                {

+                    SendMemWindowInfo(msgId);

+                }

+            }

+            break;

+

+        case OSS_MON_POOL:

+            {

+                if((status = ReceivePool((T_ZOss_Mon_Pool*)buf)) == OsAgt_Status_Ok)

+                {

+                    SendMemWindowInfo(msgId);

+                }

+            }

+            break;

+

+        case OSS_MON_CPU_LOAD:

+            {

+                if((status = ReceiveCpuLoad((T_ZOss_Mon_Cpu_Load*)buf)) == OsAgt_Status_Ok)

+                {

+                    SendCpuWindowInfo(msgId);

+                }

+            }

+            break;

+

+        case OSS_MON_CPU_FREQUENCY:

+            {

+                if((status = ReceiveCpuFrequency((T_ZOss_Mon_Cpu_Frequency*)buf)) == OsAgt_Status_Ok)

+                {

+                    SendCpuWindowInfo(msgId);

+                }

+            }

+            break;

+

+        default:

+            break;

+    }

+

+    if(status == OsAgt_Status_Error)

+    {

+        zOss_MonitorAgt_CheckReplyMessage(msgId);

+    }

+

+    return;

+}

+

+#endif

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_assert.c b/cp/ps/plat/src/oss/sup/src/sup_assert.c
new file mode 100644
index 0000000..1861b16
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_assert.c
@@ -0,0 +1,83 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_assert.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ¶ÏÑÔ½Ó¿Ú

+* ×÷    Õß : 

+* °æ    ±¾ : 

+* Íê³ÉÈÕÆÚ : 

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+#ifdef _OS_TOS

+extern void tos_assert_failed(const char *exp, const char *file, const char *func, int line);

+#elif defined (_OS_LINUX)

+extern void linux_assert_failed(const char *exp, const char *file, const char *func, int line);

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£º EXP_Handler

+* ¹¦ÄÜÃèÊö£º zOss_ASSERT´¦Àí

+* ²ÎÊý˵Ã÷£º pExp:zOss_ASSERTµÄ±í´ïʽ

+      pcFileName£º³ö´íµÄÎļþÃû

+      pcFuncName£º³ö´íµÄº¯ÊýÃû

+      dwLineNum£º ³ö´íËùÔÚµÄÐÐ

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID EXP_Handler(const CHAR *pExp, const CHAR *pcFileName, const CHAR *pcFuncName, SINT32 dwLineNum)

+{

+#ifdef _OS_WIN

+    _assert(pExp, (char *)pcFileName, (unsigned int)dwLineNum);

+#elif defined (_OS_OSE)

+    ZOSS_INTR old_intr;

+  

+    ZOSS_SAVE_IRQ(old_intr);

+    ose_assertion_failed((char *)pExp, (char *)pcFileName, (unsigned int)dwLineNum);

+    old_intr = old_intr != 0 ? old_intr : 0;

+#elif defined (_OS_TOS)

+    tos_assert_failed((const char *)pExp, pcFileName, pcFuncName, dwLineNum);

+#elif defined (_OS_LINUX)

+    linux_assert_failed((const char *)pExp, pcFileName, pcFuncName, dwLineNum);

+#endif

+}

+

+#ifdef __cplusplus

+}

+#endif

diff --git a/cp/ps/plat/src/oss/sup/src/sup_crc.c b/cp/ps/plat/src/oss/sup/src/sup_crc.c
new file mode 100644
index 0000000..7ebbf1a
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_crc.c
@@ -0,0 +1,166 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : CrcCheck.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : CRCУÑéµÄʵÏÖÎļþ

+* ×÷    Õß : ÐíÐË¿ü 

+* °æ    ±¾ : 

+* Íê³ÉÈÕÆÚ : 2007-08-31

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC:617001782003

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* CRC */

+const UINT8 crctable[256] = /* reversed, 8-bit, poly=0x07 */

+{

+    0x00, 0x91, 0xe3, 0x72, 0x07, 0x96, 0xe4, 0x75,

+    0x0e, 0x9f, 0xed, 0x7c, 0x09, 0x98, 0xea, 0x7b,

+    0x1c, 0x8d, 0xff, 0x6e, 0x1b, 0x8a, 0xf8, 0x69,

+    0x12, 0x83, 0xf1, 0x60, 0x15, 0x84, 0xf6, 0x67,

+

+    0x38, 0xa9, 0xdb, 0x4a, 0x3f, 0xae, 0xdc, 0x4d,

+    0x36, 0xa7, 0xd5, 0x44, 0x31, 0xa0, 0xd2, 0x43,

+    0x24, 0xb5, 0xc7, 0x56, 0x23, 0xb2, 0xc0, 0x51,

+    0x2a, 0xbb, 0xc9, 0x58, 0x2d, 0xbc, 0xce, 0x5f,

+

+    0x70, 0xe1, 0x93, 0x02, 0x77, 0xe6, 0x94, 0x05,

+    0x7e, 0xef, 0x9d, 0x0c, 0x79, 0xe8, 0x9a, 0x0b,

+    0x6c, 0xfd, 0x8f, 0x1e, 0x6b, 0xfa, 0x88, 0x19,

+    0x62, 0xf3, 0x81, 0x10, 0x65, 0xf4, 0x86, 0x17,

+

+    0x48, 0xd9, 0xab, 0x3a, 0x4f, 0xde, 0xac, 0x3d,

+    0x46, 0xd7, 0xa5, 0x34, 0x41, 0xd0, 0xa2, 0x33,

+    0x54, 0xc5, 0xb7, 0x26, 0x53, 0xc2, 0xb0, 0x21,

+    0x5a, 0xcb, 0xb9, 0x28, 0x5d, 0xcc, 0xbe, 0x2f,

+

+    0xe0, 0x71, 0x03, 0x92, 0xe7, 0x76, 0x04, 0x95,

+    0xee, 0x7f, 0x0d, 0x9c, 0xe9, 0x78, 0x0a, 0x9b,

+    0xfc, 0x6d, 0x1f, 0x8e, 0xfb, 0x6a, 0x18, 0x89,

+    0xf2, 0x63, 0x11, 0x80, 0xf5, 0x64, 0x16, 0x87,

+

+    0xd8, 0x49, 0x3b, 0xaa, 0xdf, 0x4e, 0x3c, 0xad,

+    0xd6, 0x47, 0x35, 0xa4, 0xd1, 0x40, 0x32, 0xa3,

+    0xc4, 0x55, 0x27, 0xb6, 0xc3, 0x52, 0x20, 0xb1,

+    0xca, 0x5b, 0x29, 0xb8, 0xcd, 0x5c, 0x2e, 0xbf,

+

+    0x90, 0x01, 0x73, 0xe2, 0x97, 0x06, 0x74, 0xe5,

+    0x9e, 0x0f, 0x7d, 0xec, 0x99, 0x08, 0x7a, 0xeb,

+    0x8c, 0x1d, 0x6f, 0xfe, 0x8b, 0x1a, 0x68, 0xf9,

+    0x82, 0x13, 0x61, 0xf0, 0x85, 0x14, 0x66, 0xf7,

+

+    0xa8, 0x39, 0x4b, 0xda, 0xaf, 0x3e, 0x4c, 0xdd,

+    0xa6, 0x37, 0x45, 0xd4, 0xa1, 0x30, 0x42, 0xd3,

+    0xb4, 0x25, 0x57, 0xc6, 0xb3, 0x22, 0x50, 0xc1,

+    0xba, 0x2b, 0x59, 0xc8, 0xbd, 0x2c, 0x5e, 0xcf

+};

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºComm_CrcCalc

+* ¹¦ÄÜÃèÊö£º¸ù¾Ý¸ø¶¨µÄÊý¾Ý¼ÆËãCRCУÑéÂë

+* ²ÎÊý˵Ã÷£º(IN)

+            buf:ÊäÈ뻺³åÇø

+            len:ÊäÈ뻺³åÇøµÄ³¤¶È

+            (OUT)

+* ·µ »Ø Öµ£º¼ÆËã³öµÄУÑéÂë

+* ÆäËû˵Ã÷£ºÎÞ

+**************************************************************************/

+UINT8 Comm_CrcCalc(const UINT8 *buf, UINT8 len)

+{

+    UINT8 fcs = 0xff;

+    

+    if (buf != NULL)

+    {

+        while (len--)

+        {

+            fcs = crctable[fcs ^ *buf++];

+        }

+        

+        return (UINT8)(0xff - fcs);

+    }

+    else

+    {

+        return 0;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºComm_CrcCheck

+* ¹¦ÄÜÃèÊö£ºCRCУÑ麯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+            buf:Êý¾Ý»º³åÇø

+            len:»º³åÇøÊý¾Ý³¤¶È

+            crc:УÑéÂë

+            (OUT)   

+* ·µ »Ø Öµ£º³É¹¦·µ»Ø0£¬·ñÔò·µ»Ø-1.

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+SINT32 Comm_CrcCheck(UINT8 *buf, UINT8 len, UINT8 crc)

+{

+    UINT8 fcs = 0xff;

+

+    zOss_AssertEx(buf != NULL, -1);

+

+    while (len--)

+    {

+        fcs = crctable[fcs ^ *buf++];

+    }

+    fcs = crctable[fcs ^ crc];

+    

+    return (fcs == 0xcf ? 0 : -1);

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_except.c b/cp/ps/plat/src/oss/sup/src/sup_except.c
new file mode 100644
index 0000000..43520fe
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_except.c
@@ -0,0 +1,369 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_except.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Òì³£¹ÜÀíÄ£¿é

+* ×÷    Õß : ÏÄйú

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007/08/01

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ÖܹúÆÂ

+* °æ ±¾ ºÅ : V1.1

+* ÐÞ¸ÄÈÕÆÚ : 2007/09/03

+* ÐÞ¸ÄÄÚÈÝ : Ôö¼Ó½Ó¿Úº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/9/27

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT¼ì²é  EC:617001782169

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : dengningkun

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é               EC:617001782205

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+#include "oss_api.h"

+#include "osa.h"

+#include "sup.h"

+#include "sup_except.h"

+#include "ThreadPriority.h"

+#ifdef _USE_WDT_RST

+#include "drvs_wdt.h"

+#include "sys_func_atcfg.h"

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+#ifdef _OS_TOS

+extern FLOAT Osa_GetProcessCPU(ZOSS_THREAD_ID thread_id);

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef _USE_WDT_RST

+#define TRACE_WATCHDOG_FEED_PERIOD          1000

+#define TRACE_WATCHDOG_FEED_VALUE           5000

+#endif

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+#ifndef _USE_PSM

+#if defined (_OS_WIN) || defined (_OS_OSE)

+static VOID Excep_IdleThread(SINT32 ingore);

+#endif

+#endif

+#ifdef _USE_WDT_RST

+static VOID Excep_WatchDogCallBack(SINT32 args);

+#endif

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+ZOSS_TASK_ID gExcep_DaemonTask = ZOSS_INVALID_TASK_ID;

+

+static T_EXCEP_PARAM                *gExcep_Param   = NULL;

+

+#ifdef _USE_WDT_RST

+static ZOSS_TIMER_ID                gTrace_WatchDogTimerID      = NULL;

+#endif

+/* ÒÆÖ² */

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/* ÒÆ Ö² */

+#ifndef _USE_PSM

+#if defined (_OS_WIN) || defined (_OS_OSE)

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Excep_IdleThread

+* ¹¦ÄÜÃèÊö£º 

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º 

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID Excep_IdleThread(SINT32 ingore)

+{

+#ifdef _OS_OSE

+    UINT32 dwZero=0;

+    SINT32 i = 0;

+

+    for(;;)

+    {

+        i++;

+        if (!(i%3000000))

+        {

+            SYSTIME_Init();

+        }

+    }

+#elif defined (_OS_TOS)

+     for(;;)

+        ;

+#elif defined (_OS_LINUX)

+     for(;;)

+        ;

+#endif

+}

+#endif

+#endif

+#ifdef _USE_WDT_RST

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Excep_WatchDogCallBack

+* ¹¦ÄÜÃèÊö£º ¶¨Ê±Æ÷ι¹·»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷£º args:  ¶¨Ê±Æ÷²ÎÊý

+* ·µ »Ø Öµ£º VOID

+* ÆäËü˵Ã÷£º VOID

+**************************************************************************/

+static VOID Excep_WatchDogCallBack(SINT32 args)

+{

+    zDrvWdt_FeedDog(TRACE_WATCHDOG_FEED_VALUE);

+}

+#endif

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Excep_Init

+* ¹¦ÄÜÃèÊö£º Ò쳣ģ¿é³õʼ»¯

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS£¬Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 EXCEP_Init(VOID)

+{

+#if defined(_USE_WDT_RST)

+    UINT32          nRet    = ZOSS_ERROR;

+    UINT32          flag    = 0;

+

+    flag = zOss_GetExceptResetFlag();

+    if (flag == EXCEPT_RESET_ENABLE)

+    {

+        gTrace_WatchDogTimerID = zOss_CreateTimer("WatchDogTimer",

+                                                  (ZOSS_TIMER_FUN)Excep_WatchDogCallBack,

+                                                  (SINT32)0,

+                                                  TRUE);

+        zOss_AssertEx(NULL != gTrace_WatchDogTimerID, ZOSS_ERROR);

+

+        nRet = zOss_StartTimer(gTrace_WatchDogTimerID,

+                               TRACE_WATCHDOG_FEED_PERIOD,

+                               Excep_WatchDogCallBack,

+                               0);

+        zOss_AssertEx(ZOSS_ERROR != nRet, ZOSS_ERROR);

+    }

+    else

+    {

+        zDrvWdt_Stop();

+    }

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º EXCEP_StartDaemonTask

+* ¹¦ÄÜÃèÊö£º Æô¶¯ÈÎÎñËÀÑ­»·¼à²â

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS£¬Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 EXCEP_StartDaemonTask(VOID)

+{

+    T_OSS_PARAM     *osscfg = NULL;

+

+    if(THR1_PRI < 1)

+    {

+        return ZOSS_ERROR;

+    }

+

+    osscfg = zOss_GetOssCfg();

+    gExcep_Param = &(osscfg->ExcepCfg);

+    gExcep_DaemonTask = zOss_CreateTask(EXCEP_DAEMONTASKNAME, Excep_DaemonTask, 4 * 1024, THR1_PRI - 1, 2048, 0);

+    if (ZOSS_INVALID_TASK_ID == gExcep_DaemonTask)

+    {

+        return ZOSS_ERROR;

+    }

+    if (ZOSS_ERROR == zOss_TaskSend(EV_POWERON, NULL, 0, gExcep_DaemonTask))

+    {

+        return ZOSS_ERROR;

+    }

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Excep_DaemonTask

+* ¹¦ÄÜÃèÊö£º Ò쳣ģ¿éÊØ»¤ÈÎÎñ

+* ²ÎÊý˵Ã÷£º state:ÈÎÎñ״̬

+      msg_id:ÏûÏ¢ID

+      buf:ÏûÏ¢ÌåÖ¸Õë

+      msg_len:ÏûÏ¢³¤¶È

+      private_data:˽ÓÐÊý¾Ý

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID Excep_DaemonTask(UINT8 state, UINT32 msg_id, UINT8 *buf, UINT16 msg_len, UINT8 *private_data)

+{

+    ZOSS_TIMER_ID   tid         = ZOSS_INVALID_TIMER_ID;

+    ZOSS_TASK_ID    *task_ids   = (ZOSS_TASK_ID *)private_data;

+    

+    switch (state)

+    {

+    case ZOSS_STATUS_INIT:

+        {

+            switch (msg_id)

+            {

+            case EV_INIT:

+                {

+                    break;

+                }

+            case EV_POWERON:

+                {

+                    tid = zOss_SetRelativeTimer(gExcep_Param->DeamonStartTime, EV_ZOSS_EXCEP_WDT_SET, 0);

+                    if (ZOSS_INVALID_TIMER_ID == tid)

+                    {

+                        zOss_ASSERT(0);

+                    }

+                    if (ZOSS_ERROR == zOss_SetState(ZOSS_STATUS_WORK))

+                    {

+                        zOss_ASSERT(0);

+                    }

+                    break;

+                }

+            default:

+                {

+                    break;

+                }

+            }

+            break;

+        }

+    case ZOSS_STATUS_WORK:

+        {

+            switch (msg_id)

+            {

+            case EV_ZOSS_EXCEP_WDT_SET:

+                {

+                    /* ÉèÖÃËÀÑ­»·¼ì²â¶¨Ê±Æ÷ */

+                    tid = zOss_SetLoopTimer(gExcep_Param->DeadLoopCheckTime, EV_ZOSS_EXCEP_DEADLOOPCHECK, 0);

+                    if (ZOSS_INVALID_TIMER_ID == tid)

+                    {

+                        zOss_ASSERT(0);

+                    }

+#ifndef _USE_PSM

+#if defined (_OS_WIN) || defined (_OS_OSE)

+                    if (ZOSS_INVALID_THREAD_ID == zOss_CreateThread(EXCEP_IDLETHREADNAME, Excep_IdleThread, 0, 1024, 31, 1, 1))

+                    {

+                        zOss_ASSERT(0);

+                    }

+#endif

+#endif

+                    break;

+                }

+            case EV_ZOSS_EXCEP_DEADLOOPCHECK:

+                {

+                    UINT32 num = 0;

+                    UINT32 i = 0;

+                    T_ZOss_TCB *tinfo = NULL;

+                    

+                    num = Sche_DeadLoop(task_ids);

+                    while (ZOSS_INVALID_TASK_ID != task_ids[i] && i < num)

+                    {

+                        /* OSS_DeleteTask(task_ids[i]); */

+                        if (NULL == tinfo)

+                        {

+                            tinfo = (T_ZOss_TCB *)zOss_Malloc(sizeof(T_ZOss_TCB));

+                            if (NULL == tinfo)

+                            {

+                                zOss_AssertExN(NULL != tinfo);

+                            }

+                        }

+                        if (ZOSS_ERROR == zOss_GetTaskInfo(task_ids[i], tinfo))

+                        {

+                            tinfo->task_name[0] = '\0';

+                        }

+                        zOss_Printf(SUBMDL_EXCEP, PRINT_LEVEL_ABNORMAL, "dead task found:%p,name:%s\r\n", task_ids[i], tinfo->task_name);

+                        

+                        i++;

+                    }

+                    if (NULL != tinfo)

+                    {

+                        zOss_Free(tinfo);

+                    }

+                    break;

+                }

+            default:

+                {

+                    break;

+                }

+            }   /* end switch(msg_id) */

+            break;

+        }

+    default:

+        {  

+            break;

+        }

+    }   /* end switch(state) */

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_GetCPU

+* ¹¦ÄÜÃèÊö£º µÃµ½CPUµÄʹÓÃÂÊ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º CPUµÄʹÓÃÂÊ(0-100)

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT8 zOss_GetCPU(VOID)

+{

+#ifdef _OS_OSE

+    UINT8                   rate = 0;

+    ZOSS_THREAD_ID          t_id = ZOSS_INVALID_THREAD_ID;

+    T_ZOsa_ThreadUserArea   *pUa = NULL;

+

+    t_id    = zOss_GetThreadIDByName(EXCEP_IDLETHREADNAME);

+    pUa     = Osa_GetThreadUserArea(t_id, FALSE);

+    rate    = (UINT8)pUa->cpupercent;

+    if (rate > 100)

+    {

+        rate = 0;

+    }

+

+    return (100 - rate);

+#elif defined (_OS_TOS)

+    return (UINT8)(100 - Osa_GetProcessCPU(zOss_GetThreadIDByName(EXCEP_IDLETHREADNAME)));

+#else

+    return 0;

+#endif

+}

+

+#ifdef __cplusplus

+}

+#endif

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_except_arm_asm.S b/cp/ps/plat/src/oss/sup/src/sup_except_arm_asm.S
new file mode 100644
index 0000000..ab17053
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_except_arm_asm.S
@@ -0,0 +1,133 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_except_arm_asm.S

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : arm´¦ÀíÆ÷

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/12/16

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýÉùÃ÷

+**************************************************************************/

+.global zOss_RamdumpSaveRegisters

+.global zOss_Cp15ReadControlRegister

+.global zOss_ReadCpsr

+.global zOss_CleanCache

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+.extern Osa_CoreRegisters

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_SaveRegisters 

+ ¹¦ÄÜÃèÊö£º ±£´æÒì³£·¢ÉúʱËùÓеļĴæÖµÖÁ½á¹¹Ìå±äÁ¿(Osa_CoreRegisters),

+ ÔÚµ÷Óú¯Êý֮ǰÐè½ûÖ¹ËùÓÐÖжÏ

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.text

+.balign 4

+.type zOss_RamdumpSaveRegisters, %function

+zOss_RamdumpSaveRegisters:    

+    PUSH     {r14}

+    LDR      r14, =Osa_CoreRegisters

+    STM      r14!, {r0-r12}             /* ±£´ær0-r12   */

+    MOV      r0, r14                    /* ±£´ær14ÖÁr0£¬ºóÐøÒÔr0Ϊ»ùµØÖ·Ñ¹Õ» */

+    LDR      r14, [r13], #4             /* »¹Ô­r13,r14  */

+    MRS      r1, CPSR                   /* ±£´æcpsrÖÁr1 */

+    MSR      CPSR_c, #0xdf              /* SYS modeµÈ¼Ûusr mode */

+    STM      r0!, {r13, r14}            /* ½«{r13,r14}ÈëÕ»  */

+    MRS      r2, SPSR

+    STR      r2, [r0], #4               /* ½«SPSRÈëÕ»   */

+    MSR      CPSR_c, #0xd3              /* svc mode     */

+    STM      r0!, {r13, r14}            /* ½«{r13,r14}  */

+    MRS      r2, SPSR

+    STR      r2,  [r0], #4              /* ½«SPSRÈëÕ»   */

+    MSR      CPSR_c, #0xd7              /* ABT mode     */

+    MRS      r2,  SPSR

+    STM      r0!, {r13, r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, #0xdb              /* UND mode     */

+    MRS      r2, SPSR

+    STM      r0!, {r13, r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, #0xd2              /* IRQ mode     */

+    MRS      r2, SPSR

+    STM      r0!, {r13, r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, #0xd1              /* FIQ mode     */

+    MRS      r2, SPSR

+    STM      r0!, {r8-r14}

+    STR      r2, [r0], #4

+    MSR      CPSR_c, r1                 /* »¹Ô­CPRS     */

+    LDR      r14, =Osa_CoreRegisters    /* »¹Ô­¼Ä´æÆ÷   */      

+    LDM      r14!, {r0-r12}             /* »¹Ô­r0-r12£¬r13µÄֵ֮ǰÒÑ»¹Ô­    */

+    LDMDB    r13, {R14}                 /* »¹Ô­r14      */

+    BX       r14                        /* ·µ»Ø         */

+	

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_Cp15ReadControlRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.type zOss_Cp15ReadControlRegister, %function

+zOss_Cp15ReadControlRegister:

+    MRC     p15, 0, r0, c1, c0, 0

+    BX      LR

+    

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_ReadCpsr

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.type zOss_ReadCpsr, %function

+zOss_ReadCpsr:    

+    MRS     r0, CPSR

+    BX      LR

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcleanCache

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.type zOss_CleanCache, %function

+zOss_CleanCache: 

+    mov     r0, #0;

+    mcr     p15, 0, r0, c7, c14, 0

+    mcr     p15, 0, r0, c7, c5,  0

+    mcr     p15, 0, r0, c7, c15, 0

+    mcr     p15, 0, r0, c7, c10, 4

+    BX      LR

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_except_arm_asm_rvct.S b/cp/ps/plat/src/oss/sup/src/sup_except_arm_asm_rvct.S
new file mode 100644
index 0000000..3cd70f0
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_except_arm_asm_rvct.S
@@ -0,0 +1,126 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2013 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_arm_asm_rvct.S

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : arm´¦ÀíÆ÷

+* ×÷    Õß : µËÄþˆÒ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2013/10/12

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+

+

+/**************************************************************************

+* È«¾Öº¯ÊýÉùÃ÷

+**************************************************************************/

+    EXPORT zOss_RamdumpSaveRegisters

+    EXPORT cp15_readControlRegister

+    EXPORT cp15_readDomainRegister

+    EXPORT cp15_readTTB

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+    IMPORT Osa_CoreRegisters

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_SaveRegisters 

+ ¹¦ÄÜÃèÊö£º ±£´æÒì³£·¢ÉúʱËùÓеļĴæÖµÖÁ½á¹¹Ìå±äÁ¿(Osa_CoreRegisters),

+ ÔÚµ÷Óú¯Êý֮ǰÐè½ûÖ¹ËùÓÐÖжÏ

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+    AREA ||.text||, CODE, ALIGN = 2

+zOss_RamdumpSaveRegisters    

+    PUSH     {r14}

+    LDR      r14,=Osa_CoreRegisters

+    STM      r14!,{r0-r12}          /* ±£´ær0-r12                           */

+    MOV      r0,r14                 /* ±£´ær14ÖÁr0£¬ºóÐøÒÔr0Ϊ»ùµØÖ·Ñ¹Õ»    */

+    LDR      r14,[r13],#4           /* »¹Ô­r13,r14                          */

+    MRS      r1,CPSR                /* ±£´æcpsrÖÁr1                         */

+    MSR      CPSR_c,#0xdf           /*SYS modeµÈ¼Ûusr mode                  */

+    STM      r0!,{r13,r14}          /* ½«{r13,r14}ÈëÕ»                      */

+    MRS      r2,SPSR

+    STR      r2,[r0],#4             /* ½«SPSRÈëÕ»                           */

+    MSR      CPSR_c,#0xd3           /*svc mode                              */

+    STM      r0!,{r13,r14}          /* ½«{r13,r14}                          */

+    MRS      r2,SPSR

+    STR      r2,[r0],#4             /* ½«SPSRÈëÕ»                           */

+    MSR      CPSR_c,#0xd7           /* ABT mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xdb           /* UND mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xd2           /* IRQ mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r13,r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,#0xd1           /* FIQ mode                             */

+    MRS      r2,SPSR

+    STM      r0!,{r8-r14}

+    STR      r2,[r0],#4

+    MSR      CPSR_c,r1              /* »¹Ô­CPRS                             */

+    LDR      r14,=Osa_CoreRegisters /* »¹Ô­¼Ä´æÆ÷                           */      

+    LDM      r14!,{r0-r12}          /* »¹Ô­r0-r12£¬r13µÄֵ֮ǰÒÑ»¹Ô­        */

+    LDMDB    r13,{R14}              /* »¹Ô­r14                              */

+    BX       r14                    /* ·µ»Ø                                 */

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readControlRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+cp15_readControlRegister

+    MRC     p15, 0, r0, c1, c0, 0

+    BX      LR

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readDomainRegister 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+cp15_readDomainRegister

+    MRC     p15, 0, r0, c3, c0, 0

+    BX      LR

+

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºcp15_readTTB 

+ ¹¦ÄÜÃèÊö£º

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+cp15_readTTB

+    MRC     p15, 0, r0, c2, c0, 0   

+    BX      LR

+

+    END

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_except_cortexm_asm.S b/cp/ps/plat/src/oss/sup/src/sup_except_cortexm_asm.S
new file mode 100644
index 0000000..d216c15
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_except_cortexm_asm.S
@@ -0,0 +1,112 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_except_cortex_asm.s

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : cortex´¦ÀíÆ÷

+* ×÷    Õß : ÁõÑÇÄÏ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2011/12/16

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+.syntax unified
+.thumb
+.text
+

+/**************************************************************************

+* È«¾Öº¯ÊýÉùÃ÷

+**************************************************************************/

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+.extern g_zRamdumpRegisters

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_SaveRegisters 

+ ¹¦ÄÜÃèÊö£º ±£´æÒì³£·¢ÉúʱËùÓеļĴæÖµÖÁ½á¹¹Ìå±äÁ¿(Osa_CoreRegisters),

+ ÔÚµ÷Óú¯Êý֮ǰÐè½ûÖ¹ËùÓÐÖжÏ

+ ²ÎÊý˵Ã÷£º (IN):ÎÞ

+             (OUT):ÎÞ

+ ·µ »Ø Öµ£º    ÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/

+.align  2

+.global zOss_RamdumpSaveRegisters

+.thumb
+.thumb_func
+.type   zOss_RamdumpSaveRegisters, %function

+zOss_RamdumpSaveRegisters:

+    push     {r1}

+    ldr      r1, =g_zRamdumpRegisters

+    stm      r1!, {r0}                       

+    mov      r0, r1                         

+    ldr      r1, [r13]

+    stm      r0!, {r1-r6}

+    mov      r1, r7

+    mov      r2, r8

+    mov      r3, r9

+    mov      r4, r10

+    mov      r5, r11

+    mov      r6, r12

+    stm      r0!,{r1-r6}                /*r0 - r12*/

+    

+    mov      r1, r13

+    adds     r1, r1, #0x4

+    mov      r2, r14

+    mrs      r3, psr

+    mrs      r4, primask

+    mrs      r5, control

+    stm      r0!, {r1-r5}               /* r13,r14,xPSR,primask,control */

+

+    ldr      r0, =g_zRamdumpRegisters              

+    adds     r0, r0, #0x20

+    ldm      r0!, {r1-r5}    

+    mov      r8, r1

+    mov      r9, r2

+    mov      r10, r3

+    mov      r11, r4

+    mov      r12, r5                    /*r8 - r12*/

+    

+    ldm      r0!, {r1-r5}   

+    mov      r13, r1

+    mov      r14, r2                    /* r13,r14 */

+    msr      apsr_nzcvq, r3

+    msr      primask, r4

+    msr      control, r5

+

+    ldr      r0, =g_zRamdumpRegisters

+    adds     r0, r0, #0x4

+    ldm      r0!, {r1-r7}               /* r1 - r7 */

+    ldr      r0, =g_zRamdumpRegisters   /* r0 */

+    ldr      r0, [r0]    

+    bx       r14

+    

+/**************************************************************************

+ º¯ÊýÃû³Æ£ºzOss_CleanCache 

+ ¹¦ÄÜÃèÊö£ºÇåcacheÊý¾Ý

+ ²ÎÊý˵Ã÷£º(IN):  ÎÞ

+           (OUT): ÎÞ

+ ·µ »Ø Öµ£ºÎÞ

+ ÆäËü˵Ã÷£º 

+ **************************************************************************/ 

+.align  2

+.global zOss_CleanCache

+.thumb
+.thumb_func
+.type   zOss_CleanCache, %function

+zOss_CleanCache:

+    bx       r14

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_except_csky_asm.S b/cp/ps/plat/src/oss/sup/src/sup_except_csky_asm.S
new file mode 100644
index 0000000..fc24642
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_except_csky_asm.S
@@ -0,0 +1,211 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_except_csky_asm.s

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : 

+* °æ    ±¾ : 

+* Íê³ÉÈÕÆÚ : 

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include <pkgconf/hal.h>

+#include <pkgconf/system.h>

+#include <cyg/hal/board.h>

+#ifdef CYGPKG_KERNEL

+#include <pkgconf/kernel.h>

+#endif

+#include <pkgconf/hal_cskycpu.h>

+#include <cyg/hal/arch.inc>

+#include <pkgconf/kernel.h>

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö±äÁ¿ÉùÃ÷

+**************************************************************************/

+.globl  zOss_RamdumpSaveRegisters

+//.globl  zOss_LoadRegisters

+

+/**************************************************************************

+* Íⲿ±äÁ¿ÉùÃ÷

+**************************************************************************/

+.extern gRamdumpAdrress

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ * ±£´æ¼Ä´æÆ÷ÐÅÏ¢ 

+ * º¯ÊýÔ­ÐÍ VOID  zOss_RamdumpSaveRegisters(VOID)

+ **************************************************************************/

+.text

+.balign 4

+zOss_RamdumpSaveRegisters:

+    subi    r0, 4

+    stw     r10, (r0, 0)  //°Ñr15ѹջ£¬ÒÔ±ãºóÐøÊ¹Ó㻽èÓÃr10£»

+    lrw     r10, gRamdumpAdrress

+/* ±£´ær0-r15 */

+    stw     r1, (r10, 4)

+    stw     r2, (r10, 8)

+    stw     r3, (r10, 12)

+    stw     r4, (r10, 16)

+    stw     r5, (r10, 20)

+    stw     r6, (r10, 24)

+    stw     r7, (r10, 28)

+    stw     r8, (r10, 32)

+    stw     r9, (r10, 36)

+    ldw     r1,  (r0,  0)    

+    stw     r1, (r10, 40)

+    addi    r0,  4           

+    stw     r0, (r10, 0)

+    stw     r11, (r10, 44)

+    stw     r12, (r10, 48)

+    stw     r13, (r10, 52)

+    stw     r14, (r10, 56)

+    stw     r15, (r10, 60)

+/* ±£´æ¿ØÖƼĴæÆ÷ */

+    addi    r10, 32

+    addi    r10, 32

+    mfcr    r1,  psr

+    stw     r1, (r10, 0)

+    mfcr    r1,  VBR

+    stw     r1, (r10, 4)

+    mfcr    r1,  epsr

+    stw     r1, (r10, 8)

+    mfcr    r1,  fpsr

+    stw     r1, (r10, 12)

+    mfcr    r1,  epc

+    stw     r1, (r10, 16)

+    mfcr    r1,  fpc

+    stw     r1, (r10, 20)

+    mfcr    r1,  ss0

+    stw     r1, (r10, 24)

+    mfcr    r1,  ss1

+    stw     r1, (r10, 28)

+    mfcr    r1,  ss2

+    stw     r1, (r10, 32)

+    mfcr    r1,  ss3

+    stw     r1, (r10, 36)

+    mfcr    r1,  ss4

+    stw     r1, (r10, 40)

+    mfcr    r1,  gcr

+    stw     r1, (r10, 44)

+    mfcr    r1,  gsr

+    stw     r1, (r10, 48)

+    mfcr    r1,  cr13    //²úÆ·ÐòºÅ¼Ä´æÆ÷cr13

+    stw     r1, (r10, 52)

+    mfcr    r1,  cr14    //dsp¿ØÖÆ×´Ì¬¼Ä´æÆ÷£»

+    stw     r1, (r10, 56)

+    mfcr    r1,  cr15    //½ö´æÔÚÓÚ´øÐ­´¦ÀíÆ÷½Ó¿ÚµÄck_core´¦ÀíÆ÷ÖÐ(Èçck610M¡¢ck610sµÈ)

+    stw     r1, (r10, 60)

+    addi    r10, 32

+    addi    r10, 32

+    mfcr    r1,  cr17    //¸ßËÙ»º´æ¼Ä´æÆ÷£»

+    stw     r1, (r10, 0)

+    mfcr    r1,  cr18    //¸ßËÙ»º´æÅäÖüĴæÆ÷£»

+    stw     r1, (r10, 4)

+    mfcr    r1,  cr19    //¿É¸ßËٺͷÃÎÊȨÏÞÅäÖüĴæÆ÷£»

+    stw     r1, (r10, 8)

+    mfcr    r1,  cr20    //±£»¤Çø¿ØÖƼĴæÆ÷£»

+    stw     r1, (r10, 12)

+    mfcr    r1,  cr21    //±£»¤Çø Ñ¡Ôñ¼Ä´æÆ÷£»

+    stw     r1, (r10, 16)

+    jmp     r15

+    

+#if 0

+/**************************************************************************

+ * ±£´æ¼Ä´æÆ÷ÐÅÏ¢ 

+ * º¯ÊýÔ­ÐÍ VOID  zOss_LoadRegisters(VOID)

+ *¸Ãº¯ÊýµÄʹÓÃÐèҪעÒâzOss_SaveRegistersº¯Êý

+ **************************************************************************/

+.text

+.balign 4

+zOss_LoadRegisters:

+    lrw     r10, gRamdumpAdrress

+    addi    r10, 32

+    addi    r10, 32

+//¼ÓÔØ¿ØÖƼĴæÆ÷

+    ldw    r1, (r10, 0)

+    mtcr   r1,  psr

+    ldw    r1, (r10, 4)

+    mtcr   r1,  VBR

+    ldw    r1, (r10, 8)

+    mtcr   r1,  epsr

+    ldw    r1, (r10, 12)

+    mtcr   r1,  fpsr

+    ldw    r1, (r10, 16)

+    mtcr   r1,  epc

+    ldw    r1, (r10, 20)

+    mtcr   r1,  fpc

+    ldw    r1, (r10, 24)

+    mtcr   r1,  ss0

+    ldw    r1, (r10, 28)

+    mtcr   r1,  ss1

+    ldw    r1, (r10, 32)

+    mtcr   r1,  ss2

+    ldw    r1, (r10, 36)

+    mtcr   r1,  ss3

+    ldw    r1, (r10, 40)

+    mtcr   r1,  ss4

+    ldw    r1, (r10, 44)

+    mtcr   r1,  gcr

+    ldw    r1, (r10, 48)

+    mtcr   r1,  gsr

+    ldw    r1, (r10, 52)

+    mtcr   r1,  cr13

+    ldw    r1, (r10, 56)

+    mtcr   r1,  cr14

+    ldw    r1, (r10, 60)

+    mtcr   r1, cr15

+    addi    r10, 32

+    addi    r10, 32

+    ldw     r1, (r10, 0)

+    mtcr   r1, cr17

+    ldw    r1, (r10, 4)

+    mtcr  r1, cr18

+    ldw    r1, (r10, 8)

+    mtcr  r1, cr19

+    ldw   r1, (r10, 12)

+    mtcr  r1, cr20

+    ldw    r1, (r10, 16)

+    mtcr  r1, cr21

+

+    subi  r10, 32

+    subi  r10, 32

+    subi  r10, 32

+    subi  r10, 32

+//¼ÓÔØr0-r15

+    ldw     r0, (r10, 0)

+    ldw     r1, (r10, 4)

+    ldw     r2, (r10, 8)

+    ldw     r3, (r10, 12)

+    ldw     r4, (r10, 16)

+    ldw     r5, (r10, 20)

+    ldw     r6, (r10, 24)

+    ldw     r7, (r10, 28)

+    ldw     r8, (r10, 32)

+    ldw     r9, (r10, 36)

+    ldw     r11, (r10, 44)

+    ldw     r12, (r10, 48)

+    ldw      r13, (r10, 52)

+    ldw      r14, (r10, 56)

+    ldw      r15, (r10, 60)

+    ldw     r10, (r10, 40)

+    jmp    r15

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_monitor.c b/cp/ps/plat/src/oss/sup/src/sup_monitor.c
new file mode 100644
index 0000000..c828c8c
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_monitor.c
@@ -0,0 +1,636 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : Ö§³Å²ã¼à¿ØÄ£¿é

+* ÎÄ ¼þ Ãû : oss_monitor.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Ö§³Å²ãÊý¾ÝµÄÊÕ¼¯£¬Óë¸ú×Ù¹¤¾ß´úÀíÈÎÎñ½øÐн»»¥

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2012/12/12

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 

+* ÐÞ ¸Ä ÈË : 

+* ÐÞ¸ÄÈÕÆÚ : 

+* ÐÞ¸ÄÄÚÈÝ : 

+**************************************************************************/

+

+#ifdef _USE_MONITOR

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "osa.h"

+#include "sup_except.h"

+#include "oss_irq.h"

+#include "oss_trace.h"

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#if (defined _USE_ZX297550_HARDWARE)

+# define OSS_MON_VERSION_TYPE   "7550"

+#elif (defined _USE_ZX297520_HARDWARE)

+# define OSS_MON_VERSION_TYPE   "7520"

+#elif (defined _USE_ZX297510_HARDWARE)

+# define OSS_MON_VERSION_TYPE   "7510"

+#elif (defined _USE_ZX297502_HARDWARE)

+# define OSS_MON_VERSION_TYPE   "7502"

+#else

+# define OSS_MON_VERSION_TYPE   "unkown"

+#endif

+

+#define OSS_MON_AGT_NAME        "OsAgt"

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    UINT32  msgId;

+    UINT32  (*func)(UINT8 *ptr);

+} oss_mon_func_t;

+

+typedef struct

+{

+    T_ZOss_Mon_Version        monVersionInfo;

+    T_ZOss_Mon_Cpu_Frequency  monCpuFrequency;

+    T_ZOss_Mon_Cpu_Load       monCpuLoad;

+    T_ZOss_Mon_Pool           monPoolInfo;

+    T_ZOss_Mon_Pool_Alloc     monPoolAlloc;

+    T_ZOss_Mon_Pool_Leak      monPoolLeak;

+    T_ZOss_Mon_Heap           monHeapInfo;

+    T_ZOss_Mon_Thread         monThreadInfo;

+    T_ZOss_Mon_Task           monTaskInfo;

+    T_ZOss_Mon_Event          monEventInfo;

+    T_ZOss_Mon_Msg            monMsgInfo;

+    T_ZOss_Mon_Ramlog         monRamlogInfo;

+    T_ZOss_Mon_Get_Var_Ack    monGetVarInfo;

+    T_ZOss_Mon_Timer          monTimerInfo;

+    T_ZOss_Mon_Mmu            monMmuInfo;

+} oss_mon_ele_ptr_t;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static UINT32 monitor_MessageDisposeHandler(UINT32 msg_id, UINT8 *buf);

+static UINT32 monitor_VersionInfo(UINT8 *buf);

+static UINT32 monitor_CpuFrequencyInfo(UINT8 *buf);

+static UINT32 monitor_CpuLoadInfo(UINT8 *buf);

+static UINT32 monitor_PoolInfo(UINT8 *buf);

+static UINT32 monitor_PoolAllocInfo(UINT8 *buf);

+static UINT32 monitor_PoolLeakInfo(UINT8 *buf);

+static UINT32 monitor_HeapInfo(UINT8 *buf);

+static UINT32 monitor_ThreadInfo(UINT8 *buf);

+static UINT32 monitor_TaskInfo(UINT8 *buf);

+static UINT32 monitor_EventInfo(UINT8 *buf);

+static UINT32 monitor_MsgInfo(UINT8 *buf);

+static UINT32 monitor_RamlogInfo(UINT8 *buf);

+static UINT32 monitor_TimerInfo(UINT8 *buf);

+static UINT32 monitor_MmuInfo(UINT8 *buf);

+static UINT32 monitor_GetVarInfo(UINT8 *buf);

+static UINT32 monitor_SetVarInfo(UINT8 *buf);

+static UINT32 monitor_SetMonFlag(UINT8 *buf);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+UINT32                      gOsa_MonitorFlag        = FALSE;

+static ZOSS_TASK_ID         gMon_OsAgtID            = NULL;       

+static oss_mon_ele_ptr_t    oss_mon_ele_ptr         = {0};

+static oss_mon_func_t       oss_mon_id_to_func[]    =

+{

+    {OSS_MON_VERSION,       monitor_VersionInfo     },

+    {OSS_MON_CPU_FREQUENCY, monitor_CpuFrequencyInfo},

+    {OSS_MON_CPU_LOAD,      monitor_CpuLoadInfo     },

+    {OSS_MON_POOL,          monitor_PoolInfo        },

+    {OSS_MON_POOL_ALLOC,    monitor_PoolAllocInfo   },

+    {OSS_MON_POOL_LEAK,     monitor_PoolLeakInfo    },

+    {OSS_MON_HEAP,          monitor_HeapInfo        },

+    {OSS_MON_THREAD,        monitor_ThreadInfo      },

+    {OSS_MON_TASK,          monitor_TaskInfo        },

+    {OSS_MON_EVENT,         monitor_EventInfo       },

+    {OSS_MON_MSG,           monitor_MsgInfo         },

+    {OSS_MON_RAMLOG,        monitor_RamlogInfo      },

+    {OSS_MON_GET_VAR_REQ,   monitor_GetVarInfo      },  

+    {OSS_MON_SET_VAR,       monitor_SetVarInfo      },

+    {OSS_MON_TIMER,         monitor_TimerInfo       },

+    {OSS_MON_MMU,           monitor_MmuInfo         },

+};

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºMonitor_TaskEntry

+* ¹¦ÄÜÃèÊö£º³õʼ»¯¼à¿Ø¹ÜÀíÄ£¿éÈë¿Úº¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+*           state:   ÈÎÎñ״̬

+*           msg_id:  ÏûÏ¢ID

+*           buf:     ÏûÏ¢buf  

+*           msg_len: ÏûÏ¢³¤¶È

+*           private: ˽ÓÐÊý¾Ý

+*           (OUT)

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID Monitor_TaskEntry(UINT8 state, UINT32 msg_id, UINT8 *buf, UINT16 msg_len, UINT8 *private_data)

+{

+    UINT32 status = ZOSS_ERROR;

+

+    switch(state)

+    {

+    case ZOSS_STATUS_INIT:

+        {

+            switch(msg_id)

+            {

+            case EV_INIT:

+                {

+                    break;

+                }

+                

+            case EV_POWERON:

+                {

+                    gMon_OsAgtID = zOss_GetTaskID(OSS_MON_AGT_NAME);

+                    #ifdef CYGOPT_HAL_ARM_MMU

+                    zTos_GetMmuConfigTable(&oss_mon_ele_ptr.monMmuInfo);

+                    #endif

+                    status = zOss_SetState(ZOSS_STATUS_WORK);

+                    if (status != ZOSS_SUCCESS)

+                    {

+                        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "OSS_MONITOR_POWERON:Fail to set state!");

+                    }

+                    break;

+                }

+                

+            default:

+                {

+                    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "OSS_MONITOR:Receive a invalid message!");

+                    break;

+                }

+            }

+            break;

+        }

+        

+    case ZOSS_STATUS_WORK:  

+        {

+            switch(msg_id)

+            {

+            case OSS_MON_SET_FLAG:

+                {

+                    status = monitor_SetMonFlag(buf);

+                    if (status != ZOSS_SUCCESS)

+                    {

+                        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "OSS_MONITOR:Fail to set Monitor flag!");

+                    }

+                    break;

+                }

+                

+            default:

+                {           

+                    status = monitor_MessageDisposeHandler(msg_id, buf);

+                    if (status != ZOSS_SUCCESS)

+                    {

+                        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "OSS_MONITOR:Fail to dispose message!");

+                    }

+                    break;

+                }

+            }

+            break;

+        }

+        

+    default:

+        {

+            break;

+        }

+    }	

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_MessageDisposeHandler

+* ¹¦ÄÜÃèÊö£º¼à¿Ø¹ÜÀíÄ£ÏûÏ¢´¦Àíº¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+*           msg_id: ÏûÏ¢ID 

+*           buf:    ÏûÏ¢buf           

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_MessageDisposeHandler(UINT32 msg_id, UINT8 *buf)

+{

+    UINT32 cnt = 0;

+

+    if (!gOsa_MonitorFlag)

+    {

+        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "OSS_MONITOR: Monitor flag is off!");

+        return ZOSS_ERROR;

+    }

+

+    for (cnt = 0; cnt < ARRAY_SIZE(oss_mon_id_to_func); cnt++)

+    {

+        if (msg_id == oss_mon_id_to_func[cnt].msgId)

+        {

+            return (oss_mon_id_to_func[cnt].func(buf));

+        }

+    }

+

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_VersionInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÏà¹ØµÄ°æ±¾ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_VersionInfo(UINT8 *buf)

+{

+    oss_mon_ele_ptr.monVersionInfo.version = (char *)OSS_MON_VERSION_TYPE;

+

+    return zOss_TaskSendData(OSS_MON_VERSION,

+                             &oss_mon_ele_ptr.monVersionInfo,

+                             sizeof(T_ZOss_Mon_Version),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_CpuFrequencyInfo

+* ¹¦ÄÜÃèÊö£ºÌṩCPUÖ÷ƵÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_CpuFrequencyInfo(UINT8 *buf)

+{

+    oss_mon_ele_ptr.monCpuFrequency.frequency = 128;//zDrvSysClk_GetArmCoreFreq();

+    

+    return zOss_TaskSendData(OSS_MON_CPU_FREQUENCY,

+                             &oss_mon_ele_ptr.monCpuFrequency,

+                             sizeof(T_ZOss_Mon_Cpu_Frequency),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_CpuLoadInfo

+* ¹¦ÄÜÃèÊö£ºÌṩCPU¸ºÔØÂÊ

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_CpuLoadInfo(UINT8 *buf)

+{

+    oss_mon_ele_ptr.monCpuLoad.load = 

+        (unsigned short)( (OSS_MON_PERCENT_RADIO - Osa_GetProcessCPU(zOss_GetThreadIDByName(EXCEP_IDLETHREADNAME)))

+        * OSS_MON_PERCENT_RADIO);

+

+    return zOss_TaskSendData(OSS_MON_CPU_LOAD,

+                             &oss_mon_ele_ptr.monCpuLoad,

+                             sizeof(T_ZOss_Mon_Cpu_Load),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_PoolInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÄÚ´æ³ØµÄʹÓÃÇé¿ö

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÄÚ´æ³Øµ±Ç°µÄͳ¼ÆÐÅϢΪ¸÷sizeµÄʹÓøöÊý

+**************************************************************************/

+static UINT32 monitor_PoolInfo(UINT8 *buf)

+{

+    pool_used_info(&oss_mon_ele_ptr.monPoolInfo);

+    

+#ifdef POOL_DEBUG

+    return zOss_TaskSendData(OSS_MON_POOL,

+                             &oss_mon_ele_ptr.monPoolInfo,

+                             sizeof(T_ZOss_Mon_Pool),

+                             gMon_OsAgtID);

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+  

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_PoolAllocInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÄÚ´æ³ØµÄÉêÇëʹÓÃÇé¿ö

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å

+**************************************************************************/

+static UINT32 monitor_PoolAllocInfo(UINT8 *buf)

+{

+    pool_alloc_info(&oss_mon_ele_ptr.monPoolAlloc);

+

+#ifdef POOL_DEBUG

+    return zOss_TaskSendData(OSS_MON_POOL_ALLOC,

+                             &oss_mon_ele_ptr.monPoolAlloc,

+                             sizeof(T_ZOss_Mon_Pool_Alloc),

+                             gMon_OsAgtID);

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_PoolLeakInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÄÚ´æ³ØµÄÉêÇëʹÓÃй¶Çé¿ö

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å

+**************************************************************************/

+static UINT32 monitor_PoolLeakInfo(UINT8 *buf)

+{

+    pool_leak_info(&oss_mon_ele_ptr.monPoolLeak);

+    

+#ifdef POOL_DEBUG

+    return zOss_TaskSendData(OSS_MON_POOL_LEAK,

+                             &oss_mon_ele_ptr.monPoolLeak,

+                             sizeof(T_ZOss_Mon_Pool_Leak),

+                             gMon_OsAgtID);

+#else

+    return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_HeapInfo

+* ¹¦ÄÜÃèÊö£ºÌṩ¶ÑÄÚ´æµÄʹÓÃÇé¿ö

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_HeapInfo(UINT8 *buf)

+{

+    z0ss_GetHeapInfo(&oss_mon_ele_ptr.monHeapInfo);

+    

+    return zOss_TaskSendData(OSS_MON_HEAP, 

+                             &oss_mon_ele_ptr.monHeapInfo, 

+                             sizeof(T_ZOss_Mon_Heap), 

+                             gMon_OsAgtID); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_ThreadInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÏ̵߳ÄÏà¹Ø×´Ì¬ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å

+**************************************************************************/

+static UINT32 monitor_ThreadInfo(UINT8 *buf)

+{

+    z0ss_GetAllThreadInfo(&oss_mon_ele_ptr.monThreadInfo);

+    

+    return zOss_TaskSendData(OSS_MON_THREAD,

+                             &oss_mon_ele_ptr.monThreadInfo,

+                             sizeof(T_ZOss_Mon_Thread),

+                             gMon_OsAgtID); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_TaskInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÈÎÎñµÄÏà¹Ø×´Ì¬ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å

+**************************************************************************/

+static UINT32 monitor_TaskInfo(UINT8 *buf)

+{       

+    zOss_GetAllTaskInfo(&oss_mon_ele_ptr.monTaskInfo);

+

+    return zOss_TaskSendData(OSS_MON_TASK, 

+                             &oss_mon_ele_ptr.monTaskInfo, 

+                             sizeof(T_ZOss_Mon_Task), 

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_EventInfo

+* ¹¦ÄÜÃèÊö£ºÌṩϵͳµ÷¶ÈʼþÏà¹ØÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_EventInfo(UINT8 *buf)

+{

+    z0ss_GetEventInfo(&oss_mon_ele_ptr.monEventInfo);

+    

+    return zOss_TaskSendData(OSS_MON_EVENT,

+                             &oss_mon_ele_ptr.monEventInfo,

+                             sizeof(T_ZOss_Mon_Event),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_MsgInfo

+* ¹¦ÄÜÃèÊö£ºÌṩÏûÏ¢µÄÊÕ·¢ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_MsgInfo(UINT8 *buf)

+{

+    z0ss_GetMsgInfo(&oss_mon_ele_ptr.monMsgInfo);

+    

+    return zOss_TaskSendData(OSS_MON_MSG,

+                             &oss_mon_ele_ptr.monMsgInfo,

+                             sizeof(T_ZOss_Mon_Msg),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_RamlogInfo

+* ¹¦ÄÜÃèÊö£ºÌṩRamlogÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_RamlogInfo(UINT8 *buf)

+{    

+    z0ss_GetRamlogInfo(&oss_mon_ele_ptr.monRamlogInfo);

+

+    return zOss_TaskSendData(OSS_MON_RAMLOG,

+                             &oss_mon_ele_ptr.monRamlogInfo,

+                             sizeof(T_ZOss_Mon_Ramlog),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_PrivodeVarInfo

+* ¹¦ÄÜÃèÊö£ºÌṩָ¶¨±äÁ¿µÄÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å

+**************************************************************************/

+static UINT32 monitor_GetVarInfo(UINT8 *buf)

+{

+    T_ZOss_Mon_Get_Var_Req *varInfo = NULL;

+

+    if (buf == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+

+    varInfo = (T_ZOss_Mon_Get_Var_Req *)buf;

+    if (varInfo->base == 0 || varInfo->size == 0)

+    {

+        return ZOSS_ERROR;

+    }

+

+    oss_mon_ele_ptr.monGetVarInfo.size  = varInfo->size;

+    oss_mon_ele_ptr.monGetVarInfo.value = (unsigned char *)zOss_GetUB(oss_mon_ele_ptr.monGetVarInfo.size);

+    zOss_AssertEx(oss_mon_ele_ptr.monGetVarInfo.value != NULL, ZOSS_ERROR);

+        

+    zOss_Memcpy((VOID *)oss_mon_ele_ptr.monGetVarInfo.value, (const VOID *)varInfo->base, varInfo->size); 

+    zOss_RetUB((VOID *)varInfo);

+    varInfo = NULL;

+    return zOss_TaskSendData(OSS_MON_GET_VAR_ACK,

+                             &oss_mon_ele_ptr.monGetVarInfo,

+                             sizeof(T_ZOss_Mon_Get_Var_Ack),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_SetVarInfo

+* ¹¦ÄÜÃèÊö£ºÐÞ¸ÄÖ¸¶¨ÄÚ´æ¶ÎµÄÖµ

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_SetVarInfo(UINT8 *buf)

+{    

+    T_ZOss_Mon_Set_Var   *varInfo   = NULL;

+    ZOSS_INTR           old_intr    = 0;

+

+    if (buf == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+    varInfo = (T_ZOss_Mon_Set_Var *)buf;

+    if (varInfo->base == 0 || varInfo->size == 0)

+    {

+        return ZOSS_ERROR;

+    } 

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    zOss_Memcpy((VOID *)varInfo->base, (const VOID *)varInfo->value, varInfo->size);

+    ZOSS_RESTORE_IRQ(old_intr);

+    

+    zOss_RetUB((VOID *)varInfo->value);

+    zOss_RetUB((VOID *)varInfo);

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_TimerInfo

+* ¹¦ÄÜÃèÊö£ºÌṩTimerµÄʹÓÃÇé¿ö

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉêÇëµÄÄÚ´æÐèÒª¸ú×Ù¹¤¾ß´úÀíÈÎÎñ(ÏûÏ¢½ÓÊÕ·½)ÊÍ·Å

+**************************************************************************/

+static UINT32 monitor_TimerInfo(UINT8 *buf)

+{  

+    zOss_GetTimerInfo(&oss_mon_ele_ptr.monTimerInfo);

+    

+    return zOss_TaskSendData(OSS_MON_TIMER,

+                             &oss_mon_ele_ptr.monTimerInfo,

+                             sizeof(T_ZOss_Mon_Timer),

+                             gMon_OsAgtID); 

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_MmuInfo

+* ¹¦ÄÜÃèÊö£ºÌṩMMUÄÚ´æÅäÖÃÓ³Éä±íÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_MmuInfo(UINT8 *buf)

+{

+    return zOss_TaskSendData(OSS_MON_MMU,

+                             &oss_mon_ele_ptr.monMmuInfo,

+                             sizeof(T_ZOss_Mon_Mmu),

+                             gMon_OsAgtID);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºmonitor_MonFlagInfo

+* ¹¦ÄÜÃèÊö£ºÐÞ¸Ä¼à¿ØÄ£¿é±ê־λ

+* ²ÎÊý˵Ã÷£º(IN) buf: ÏûÏ¢buf

+*           (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS£»Ê§°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 monitor_SetMonFlag(UINT8 *buf)

+{

+    T_ZOss_Mon_Set_Flag *flagInfo = NULL;

+

+    if (buf)

+    {

+        flagInfo = (T_ZOss_Mon_Set_Flag *)buf;

+        if (flagInfo->flag)

+        {

+#ifdef OSS_TRACE_THREAD

+            oss_trace_thread_open();

+#endif

+

+#ifdef TOS_STATISTIC_IRQ

+            tos_statistic_irq_open();

+#endif

+

+#ifdef TOS_TRACE_IRQ

+            tos_trace_irq_open();

+#endif

+        }

+        else

+        {

+#ifdef TOS_TRACE_IRQ        

+            tos_trace_irq_close();

+#endif

+

+#ifdef TOS_STATISTIC_IRQ

+            tos_statistic_irq_close();

+#endif

+

+#ifdef OSS_TRACE_THREAD

+            oss_trace_thread_close();

+#endif

+        }

+        gOsa_MonitorFlag = flagInfo->flag;

+        zOss_RetUB((VOID *)flagInfo);

+        return ZOSS_SUCCESS;

+    } 

+    return ZOSS_ERROR;

+}

+

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_nvm.c b/cp/ps/plat/src/oss/sup/src/sup_nvm.c
new file mode 100755
index 0000000..d5f927d
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_nvm.c
@@ -0,0 +1,1041 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98_NVM

+* ÎÄ ¼þ Ãû : nvm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : nvÊý¾Ý¹ÜÀí½Ó¿Ú

+* ×÷    Õß : ¬л¼ª

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2009-08-06

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é  EC:617001781798

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : wuzhengjun

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é   EC:617001781846 

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : wangqing

+* ÐÞ¸ÄÈÕÆÚ : 2018-08-27

+* ÐÞ¸ÄÄÚÈÝ : ¸ÄΪÎļþϵͳʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_nvm.h"

+#include "drv_api.h"

+#include "oss_cfg.h"

+#include "RWNvConfig.h"

+#ifdef _OS_LINUX

+#include <linux/unistd.h>

+#include <linux/ctype.h>

+#include <linux/syscalls.h>

+#include <linux/statfs.h>

+#include <linux/fs.h>

+#include <linux/uaccess.h>

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+#ifdef USE_CPPS_KO

+#define CPPS_KO_FUNC(func) kernel_##func

+#else

+#define CPPS_KO_FUNC(func) func

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýºÍ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+extern void msleep(unsigned int msecs);

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define NV_SYMBOL_DOWN   	0xA2        /* unused */

+#define NV_SYMBOL_NORMAL    0xB3        /* Õý³£Çé¿öϱê־λµÄÖµ */

+#define NV_SYMBOL_WRITE     0xC4        /* дNVÇé¿öϱê־λµÄÖµ */

+#define NV_SYMBOL_FACTORY   0xD5        /* ³ö³§»Ö¸´±ê־λµÄÖµ   */

+

+#define NV_WORK_AREA        0x01        /* ¹¤×÷Çø±êʶ           */

+#define NV_BACKUP_AREA      0x02        /* ±¸·ÝÇø±êʶ           */

+

+#define NVM_FS_RO_FAC_PATH         	"/mnt/nvrofs/nvroall.bin"

+#define NVM_FS_ROW_FAC_PATH         "/mnt/nvrofs/nvrowall.bin"

+#define NVM_FS_ROW_C0_FAC_PATH      "/mnt/nvrofs/nvroc0wall.bin"

+#define NVM_FS_RWO_FAC_PATH         "/mnt/imagefs/nvrwoall.bin"

+#define NVM_FS_RW_FAC_PATH         	"/mnt/imagefs/nvrwall.bin"

+#define NVM_FS_RW_HASH_FAC_PATH     "/mnt/imagefs/nvrwall.hash"

+

+#define NVM_FS_RW_DIR        		"/etc_rw/psnv"

+#define NVM_FS_RW_MAIN_PATH         "/etc_rw/psnv/rw_work"

+#define NVM_FS_RW_BACKUP_PATH       "/etc_rw/psnv/rw_backup"

+

+#define NVM_FS_FAC_SYMBOL_PATH    		"/etc_rw/psnv/fac_flag"

+#define NVM_FS_RW_MAIN_SYMBOL_PATH    	"/etc_rw/psnv/work_flag"

+#define NVM_FS_RW_BACKUP_SYMBOL_PATH    "/etc_rw/psnv/backup_flag"

+#define NVM_FS_RW_HASH_WORK_PATH        "/etc_rw/psnv/nvrwall.hash"

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static BOOL   Nvram_Check_Data(VOID);

+static UINT32 Nvram_WriteWithFlag(UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen, UINT8 iNvm);

+static UINT32 Nvram_WriteRO(const CHAR *part_name, UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen);

+static UINT32 Nvram_FsRead(const CHAR *part_name, UINT32 dwStart, UINT32 dwLen, UINT8 *to);

+static UINT32 Nvram_FsWrite(const CHAR *part_name, UINT32 dwStart, UINT32 dwLen, UINT8 *from);

+static UINT32 Nvram_Remount(CHAR *DevName, CHAR *DirName, CHAR *Type, UINT32 Flag);

+static UINT32 Nvram_CopyFile(const CHAR *pDstFile, const CHAR *pSrcFile);

+static UINT32 Nvram_CmpFile(const CHAR *pDstFile, const CHAR *pSrcFile);

+static UINT32 Nvram_DirInit(VOID);

+static UINT32 Nvram_RoInit(VOID);

+static UINT32 Nvram_RwInit(VOID);

+static SINT32 Nvram_WriteFile(const CHAR *pFile, UINT8 *pBuf, UINT32 len);

+static UINT8  *Nvram_ReadFile(const CHAR *pFile, UINT32 *len);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static ZOSS_MUTEX_ID	gNV_Mutex	= NULL;   	   /* Flash²Ù×÷»¥³âÌå   */

+static BOOL             gNV_Inited 	= FALSE;       /* NV¶ÁдʹÄÜ        */

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£º NV_Init

+* ¹¦ÄÜÃèÊö£º NV³õʼ»¯

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 NV_Init(VOID)

+{

+    T_OSS_PARAM *pOssParam = NULL;

+

+    if (gNV_Inited)

+        return ZOSS_SUCCESS;

+

+    /* ´´½¨NV»¥³âÁ¿ */

+    gNV_Mutex = zOss_CreateMutex("NV_Mutex", ZOSS_INHERIT);

+    if (gNV_Mutex == NULL)

+        return ZOSS_ERROR;

+

+	/* ²é¿´¹¤×÷ÇøºÍ±¸·ÝÇøÊý¾ÝÊÇ·ñÓÐЧ£¬ÈçÎÞЧÔò»Ö¸´ */

+    Nvram_Check_Data();

+

+	gNV_Inited = TRUE;

+	

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvItemRead

+* ¹¦ÄÜÃèÊö£º ¶ÁÒ»ÏîNVÊý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            NvItemID:     ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            NvItemData:   ¶Á³öµÄÊý¾Ý

+*            NvItemLen:    Êý¾Ý³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_NvItemRead(UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen)

+{

+    SINT32 status = -1;

+	SINT8 *pNvFile = NULL;

+

+    if (gNV_Inited == FALSE || NvItemLen == 0 || NvItemData == NULL)

+        return ZOSS_ERROR;

+

+	if(NvItemID >= OS_FLASH_RO_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_RO_OFFSET_FROM_NV + OS_FLASH_RO_NVRAM_SIZE))

+	{

+		pNvFile = NVM_FS_RO_FAC_PATH;

+		NvItemID -= OS_FLASH_RO_OFFSET_FROM_NV;

+	}

+	else if(NvItemID >= OS_FLASH_LOCKNET_ROW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_LOCKNET_ROW_OFFSET_FROM_NV + OS_FLASH_LOCKNET_ROW_SIZE))

+	{

+		pNvFile = NVM_FS_ROW_FAC_PATH;

+		NvItemID -= OS_FLASH_LOCKNET_ROW_OFFSET_FROM_NV;

+	}

+	else if(NvItemID >= OS_FLASH_C0CALIINFO_ROW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_C0CALIINFO_ROW_OFFSET_FROM_NV + OS_FLASH_C0CALIINFO_ROW_SIZE))

+	{

+		pNvFile = NVM_FS_ROW_C0_FAC_PATH;

+		NvItemID -= OS_FLASH_C0CALIINFO_ROW_OFFSET_FROM_NV;

+	}

+	else if(NvItemID >= OS_FLASH_RWO_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_RWO_OFFSET_FROM_NV + OS_FLASH_RWO_NVRAM_SIZE))

+	{

+		pNvFile = NVM_FS_RWO_FAC_PATH;

+		NvItemID -= OS_FLASH_RWO_OFFSET_FROM_NV;

+	}

+	else if(NvItemID >= OS_FLASH_RW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_RW_OFFSET_FROM_NV + OS_FLASH_RW_NVRAM_SIZE))

+	{

+		pNvFile = NVM_FS_RW_MAIN_PATH;

+		NvItemID -= OS_FLASH_RW_OFFSET_FROM_NV;

+	}

+	else

+		return ZOSS_ERROR;

+

+    /* »ñÈ¡NV²Ù×÷»¥³âÁ¿ */

+    zOss_GetMutex(gNV_Mutex, ZOSS_WAIT_FOREVER);

+	status = Nvram_FsRead(pNvFile, NvItemID, NvItemLen, NvItemData);

+    zOss_PutMutex(gNV_Mutex);

+

+    return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvItemWrite

+* ¹¦ÄÜÃèÊö£º дһÏîNVÊý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            NvItemID:    ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            NvItemData:  дÈëµÄÊý¾Ý

+*            NvItemLen:   Êý¾Ý³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_NvItemWrite(UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen)

+{

+    UINT32 status = ZOSS_ERROR;

+

+    if (gNV_Inited == FALSE || NvItemLen == 0 || NvItemData == NULL)

+        return ZOSS_ERROR;

+

+	zOss_GetMutex(gNV_Mutex, ZOSS_WAIT_FOREVER);  

+

+	if(NvItemID >= OS_FLASH_RW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_RW_OFFSET_FROM_NV + OS_FLASH_RW_NVRAM_SIZE))

+	{//rw

+		NvItemID -= OS_FLASH_RW_OFFSET_FROM_NV;

+	    status = Nvram_WriteWithFlag(NvItemID, NvItemData, NvItemLen, NV_WORK_AREA);/* ½«Êý¾ÝдÈ빤×÷Çø */

+	    if (status == ZOSS_SUCCESS)

+	        status = Nvram_WriteWithFlag(NvItemID, NvItemData, NvItemLen, NV_BACKUP_AREA);/* ½«Êý¾ÝдÈ뱸·ÝÇø */

+	}

+	else if(NvItemID >= OS_FLASH_RO_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_RO_OFFSET_FROM_NV + OS_FLASH_RO_NVRAM_SIZE))

+	{// ro

+		NvItemID -= OS_FLASH_RO_OFFSET_FROM_NV;

+		status = Nvram_FsWrite(NVM_FS_RO_FAC_PATH, NvItemID, NvItemLen, NvItemData);

+	}

+	else if(NvItemID >= OS_FLASH_LOCKNET_ROW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_LOCKNET_ROW_OFFSET_FROM_NV + OS_FLASH_LOCKNET_ROW_SIZE))

+	{// row_locknet

+		NvItemID -= OS_FLASH_LOCKNET_ROW_OFFSET_FROM_NV;

+		status = Nvram_FsWrite(NVM_FS_ROW_FAC_PATH, NvItemID, NvItemLen, NvItemData);

+	}

+	else if(NvItemID >= OS_FLASH_C0CALIINFO_ROW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_C0CALIINFO_ROW_OFFSET_FROM_NV + OS_FLASH_C0CALIINFO_ROW_SIZE))

+	{// ro_c0cail

+		NvItemID -= OS_FLASH_C0CALIINFO_ROW_OFFSET_FROM_NV;

+		status = Nvram_FsWrite(NVM_FS_ROW_C0_FAC_PATH, NvItemID, NvItemLen, NvItemData);

+	}

+ 

+    zOss_PutMutex(gNV_Mutex);

+

+    return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_ResetNVFactory

+* ¹¦ÄÜÃèÊö£º »Ö¸´³ö³§ÉèÖÃ(ÖØÆôºóÉúЧ)

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_ResetNVFactory(VOID)

+{

+    UINT8   Symbol = NV_SYMBOL_FACTORY;

+    UINT32  status = ZOSS_ERROR;

+

+	status = Nvram_FsWrite(NVM_FS_FAC_SYMBOL_PATH, 0, 1, &Symbol);

+

+    return (status == 0) ? ZOSS_SUCCESS : ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvInResume

+* ¹¦ÄÜÃèÊö£º ÊÇ·ñ´¦ÓÚNV»Ö¸´Á÷³ÌÖÐ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º TRUE:´¦ÓÚ»Ö¸´Á÷³Ì£»FLASE:²»´¦ÓÚ»Ö¸´Á÷³Ì

+* ÆäËü˵Ã÷£º Çý¶¯Ê¹ÓÃ

+**************************************************************************/

+BOOL zOss_NvInResume(VOID)

+{

+    return 0;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvramFlush

+* ¹¦ÄÜÃèÊö£º ½«»º´æÊý¾Ýдµ½NVÖÐ

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_NvramFlush(VOID)

+{

+    return Nvram_Flush();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvCheck

+* ¹¦ÄÜÃèÊö£º ¼ì²âNV±êÖ¾£¬²¢½øÐлָ´

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º Çý¶¯Ê¹ÓÃ

+**************************************************************************/

+VOID zOss_NvCheck(VOID)

+{   

+    return;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvItemWriteFactory

+* ¹¦ÄÜÃèÊö£º дһÏîNV ³ö³¡ÇøÊý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            NvItemID:    ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            NvItemData:  дÈëµÄÊý¾Ý

+*            NvItemLen:   Êý¾Ý³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ×èÈûº¯Êý£¬²»ÔÊÐíÖжϼäÖ´ÐÐ

+**************************************************************************/

+UINT32 zOss_NvItemWriteFactory(UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen)

+{

+    UINT32  status = ZOSS_ERROR;

+	mm_segment_t old_fs = get_fs();

+	

+    if (gNV_Inited == FALSE || NvItemLen == 0 || NvItemData == NULL)

+		return ZOSS_ERROR;

+

+	if(NvItemID >= OS_FLASH_RW_OFFSET_FROM_NV && (NvItemID + NvItemLen) <= (OS_FLASH_RW_OFFSET_FROM_NV + OS_FLASH_RW_NVRAM_SIZE))

+		NvItemID -= OS_FLASH_RW_OFFSET_FROM_NV;

+	else

+		return ZOSS_ERROR;

+

+	zOss_GetMutex(gNV_Mutex, ZOSS_WAIT_FOREVER); 

+	

+	//status = Nvram_Remount("mtd:imagefs", "/mnt/imagefs", "jffs2", MS_REMOUNT |MS_VERBOSE);

+	//if(ZOSS_SUCCESS != status)

+	//{

+	//	zOss_PutMutex(gNV_Mutex);

+	//	return ZOSS_ERROR;

+	//}

+	

+	status = Nvram_FsWrite(NVM_FS_RW_FAC_PATH, NvItemID, NvItemLen, NvItemData);

+	//status |= Nvram_Remount("mtd:imagefs", "/mnt/imagefs", "jffs2", MS_REMOUNT |MS_VERBOSE | MS_RDONLY);

+

+	zOss_PutMutex(gNV_Mutex);

+	return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_NvGetEccLogInfo

+* ¹¦ÄÜÃèÊö£º »ñÈ¡ECC LogÐÅÏ¢

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_NvGetEccLogInfo(T_ZOss_NvEccLog *logInfo)

+{

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_ChangeNvroAttr

+* ¹¦ÄÜÃèÊö£º ¸Ä±äNVRO·ÖÇøµÄÊôÐÔ

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_ChangeNvroAttr(int writable)

+{

+	if (cpnv_ChangeNvroAttr(writable) < 0)

+		return ZOSS_ERROR;

+

+	return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_Finish

+* ¹¦ÄÜÃèÊö£º ½áÊøNV²Ù×÷£¬½«Êý¾Ýдµ½NVÖÐ

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 Nvram_Finish(VOID)

+{

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_Flush

+* ¹¦ÄÜÃèÊö£º ½«»º´æÊý¾Ýдµ½NVÖÐ

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 Nvram_Flush(VOID)

+{

+	return ZOSS_SUCCESS;

+}

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_DirInit

+* ¹¦ÄÜÃèÊö£º ³õʼ»¯nvmĿ¼

+* ²ÎÊý˵Ã÷£º (IN)

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Nvram_DirInit(VOID)

+{

+	if(CPPS_KO_FUNC(sys_access)(NVM_FS_RW_DIR, 0) != 0)

+	{

+		if(CPPS_KO_FUNC(sys_mkdir)(NVM_FS_RW_DIR, 0755) != 0)

+		{

+			printk("cpnv mkdir %s fali\n", NVM_FS_RW_DIR);

+			return ZOSS_ERROR;

+		}

+	}

+

+	return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_RoInit

+* ¹¦ÄÜÃèÊö£º ³õʼ»¯Ro nv

+* ²ÎÊý˵Ã÷£º (IN)

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Nvram_RoInit(VOID)

+{

+	UINT8 *pNvdata;

+	UINT32  status = ZOSS_ERROR;

+	

+	if(CPPS_KO_FUNC(sys_open)(NVM_FS_RO_FAC_PATH, O_RDONLY, 0) == -ENOENT)

+	{

+		pNvdata = zOss_GetUB(OS_FLASH_RO_NVRAM_SIZE);

+		if (pNvdata == NULL)

+		{

+			printk("cpnv malloc rodata fail\n");

+			return ZOSS_ERROR;

+		}

+

+		memset(pNvdata, 0xff, OS_FLASH_RO_NVRAM_SIZE);

+		

+		status = Nvram_WriteRO(NVM_FS_RO_FAC_PATH, 0, pNvdata, OS_FLASH_RO_NVRAM_SIZE);

+		zOss_RetUB(pNvdata);

+		if(status != ZOSS_SUCCESS)

+			return ZOSS_ERROR;

+		else

+			printk("cpnv clean ro fs success!\n");

+	}

+

+	if(CPPS_KO_FUNC(sys_open)(NVM_FS_ROW_FAC_PATH, O_RDONLY, 0) == -ENOENT)

+	{

+		pNvdata = zOss_Malloc(OS_FLASH_LOCKNET_ROW_SIZE);

+		if (pNvdata == NULL)

+		{

+			printk("cpnv malloc rowdata fail\n");

+			return ZOSS_ERROR;

+		}

+

+		memset(pNvdata, 0xff, OS_FLASH_LOCKNET_ROW_SIZE);

+		status = Nvram_WriteRO(NVM_FS_ROW_FAC_PATH, 0, pNvdata, OS_FLASH_LOCKNET_ROW_SIZE);

+		zOss_Free(pNvdata);

+		if(status != ZOSS_SUCCESS)

+			return ZOSS_ERROR;

+		else

+			printk("cpnv clean row_locknet fs success!\n");

+	}

+

+	if(CPPS_KO_FUNC(sys_open)(NVM_FS_ROW_C0_FAC_PATH, O_RDONLY, 0) == -ENOENT)

+	{

+		pNvdata = zOss_Malloc(OS_FLASH_C0CALIINFO_ROW_SIZE);

+		if (pNvdata == NULL)

+		{

+			printk("cpnv malloc rowdata fail\n");

+			return ZOSS_ERROR;

+		}

+

+		memset(pNvdata, 0xff, OS_FLASH_C0CALIINFO_ROW_SIZE);

+		status = Nvram_WriteRO(NVM_FS_ROW_C0_FAC_PATH, 0, pNvdata, OS_FLASH_C0CALIINFO_ROW_SIZE);

+		zOss_Free(pNvdata);

+		if(status != ZOSS_SUCCESS)

+			return ZOSS_ERROR;

+		else

+			printk("cpnv clean row_cocail fs success!\n");

+	}

+

+	return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_RwInit

+* ¹¦ÄÜÃèÊö£º ³õʼ»¯Ro nv

+* ²ÎÊý˵Ã÷£º (IN)

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Nvram_RwInit(VOID)

+{

+    UINT8   WorkArea_Symbol = 0;

+    UINT8   BackUp_Symbol   = 0;

+    UINT8   Factory_Symbol  = 0;

+    SINT32  WorkArea_Status = -1;

+    SINT32  BackUp_Status   = -1;

+    UINT32  status          = ZOSS_ERROR;

+

+factory_check:

+

+    /* °æ±¾ÏÂÔØ */ /* »Ö¸´³ö³§ */ /* FotaÉý¼¶ */

+    status = Nvram_FsRead(NVM_FS_FAC_SYMBOL_PATH, 0, 1, &Factory_Symbol);

+    if(status || Factory_Symbol == NV_SYMBOL_FACTORY || Nvram_CmpFile(NVM_FS_RW_HASH_FAC_PATH, NVM_FS_RW_HASH_WORK_PATH))

+    {

+        status = Nvram_CopyFile(NVM_FS_RW_MAIN_PATH, NVM_FS_RW_FAC_PATH);

+        zOss_ASSERT(status == ZOSS_SUCCESS);

+        status = Nvram_CopyFile(NVM_FS_RW_BACKUP_PATH, NVM_FS_RW_FAC_PATH);

+        zOss_ASSERT(status == ZOSS_SUCCESS);

+        status = Nvram_CopyFile(NVM_FS_RW_HASH_WORK_PATH, NVM_FS_RW_HASH_FAC_PATH);

+        zOss_ASSERT(status == ZOSS_SUCCESS);

+

+        WorkArea_Symbol = NV_SYMBOL_NORMAL;

+        status = Nvram_FsWrite(NVM_FS_RW_MAIN_SYMBOL_PATH, 0, 1, &WorkArea_Symbol);

+        zOss_ASSERT(status == ZOSS_SUCCESS);

+        BackUp_Symbol = NV_SYMBOL_NORMAL;

+        status = Nvram_FsWrite(NVM_FS_RW_BACKUP_SYMBOL_PATH, 0, 1, &BackUp_Symbol);

+        zOss_ASSERT(status == ZOSS_SUCCESS);

+

+        Factory_Symbol = NV_SYMBOL_NORMAL;

+        status = Nvram_FsWrite(NVM_FS_FAC_SYMBOL_PATH, 0, 1, &Factory_Symbol);

+        zOss_ASSERT(status == ZOSS_SUCCESS);

+

+        printk("cpnv version download or restore fac or fota update!\n");

+        return ZOSS_SUCCESS;

+    }

+

+    /* ¶ÁÈ¡¹¤×÷ÇøºÍ±¸·ÝÇøÖеıê־λ */

+    WorkArea_Status = Nvram_FsRead(NVM_FS_RW_MAIN_SYMBOL_PATH, 0, 1, &WorkArea_Symbol);

+    BackUp_Status   = Nvram_FsRead(NVM_FS_RW_BACKUP_SYMBOL_PATH, 0, 1, &BackUp_Symbol);

+    if(WorkArea_Status != 0 || WorkArea_Symbol != NV_SYMBOL_NORMAL) 

+    {

+        /* work area check fail */

+        if(BackUp_Status == 0 && BackUp_Symbol == NV_SYMBOL_NORMAL)

+        {

+            /* backup area check ok */

+            WorkArea_Symbol = NV_SYMBOL_WRITE;

+            status = Nvram_FsWrite(NVM_FS_RW_MAIN_SYMBOL_PATH, 0, 1, &WorkArea_Symbol);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            status = Nvram_CopyFile(NVM_FS_RW_MAIN_PATH, NVM_FS_RW_BACKUP_PATH);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            WorkArea_Symbol = NV_SYMBOL_NORMAL;

+            status = Nvram_FsWrite(NVM_FS_RW_MAIN_SYMBOL_PATH, 0, 1, &WorkArea_Symbol);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            printk("cpnv restore backup to main!\n");

+        }

+        else

+        {

+            /* backup and work area check both fail */

+            Factory_Symbol = NV_SYMBOL_FACTORY;

+            status = Nvram_FsWrite(NVM_FS_FAC_SYMBOL_PATH, 0, 1, &Factory_Symbol);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            printk("cpnv work and backup both fail restore fac!\n");

+            goto factory_check;

+        }

+    }

+    else

+    {

+        /* WorkArea ok*/

+        if(BackUp_Status != 0 || BackUp_Symbol != NV_SYMBOL_NORMAL)

+        {

+            /* backup area check fail */

+            BackUp_Symbol = NV_SYMBOL_WRITE;

+            status = Nvram_FsWrite(NVM_FS_RW_BACKUP_SYMBOL_PATH, 0, 1, &BackUp_Symbol);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            status = Nvram_CopyFile(NVM_FS_RW_BACKUP_PATH, NVM_FS_RW_MAIN_PATH);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            BackUp_Symbol = NV_SYMBOL_NORMAL;

+            status = Nvram_FsWrite(NVM_FS_RW_BACKUP_SYMBOL_PATH, 0, 1, &BackUp_Symbol);

+            zOss_ASSERT(status == ZOSS_SUCCESS);

+

+            printk("cpnv restore main to backup!\n");

+        }

+        else

+        {

+            /* WorkArea and Backup Area both ok */

+            if(ZOSS_ERROR == Nvram_CmpFile(NVM_FS_RW_BACKUP_PATH, NVM_FS_RW_MAIN_PATH))

+            {

+                Factory_Symbol = NV_SYMBOL_FACTORY;

+                status = Nvram_FsWrite(NVM_FS_FAC_SYMBOL_PATH, 0, 1, &Factory_Symbol);

+                zOss_ASSERT(status == ZOSS_SUCCESS);

+

+                printk("cpnv cmp wrong!, restore fac!\n");

+

+                goto factory_check;

+            }

+        }

+    }

+

+	return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_WriteRO

+* ¹¦ÄÜÃèÊö£º дһÏîNV ROÊý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            part_name:   ÎļþÃû³Æ

+*            NvItemID:    ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            NvItemData:  дÈëµÄÊý¾Ý

+*            NvItemLen:   Êý¾Ý³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ÁÙʱ·½°¸ÊÊÓ㬺óÐøÉ¾³ý

+**************************************************************************/

+static UINT32 Nvram_WriteRO(const CHAR *part_name, UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen)

+{

+    UINT32  status = ZOSS_ERROR;

+

+	status = Nvram_Remount("mtd:nvrofs", "/mnt/nvrofs", "jffs2", MS_REMOUNT |MS_VERBOSE);

+	if(ZOSS_SUCCESS != status)

+		return ZOSS_ERROR;

+	

+	status = Nvram_FsWrite(part_name, NvItemID, NvItemLen, NvItemData);

+	status |= Nvram_Remount("mtd:nvrofs", "/mnt/nvrofs", "jffs2", MS_REMOUNT |MS_VERBOSE|MS_RDONLY);

+		

+	return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_Check_Data

+* ¹¦ÄÜÃèÊö£º ²é¿´¹¤×÷ÇøºÍ±¸·ÝÇøÊý¾ÝÊÇ·ñÓÐЧ£¬ÈçÎÞЧÔò»Ö¸´

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØTRUE, ·ñÔò·µ»ØFALSE

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL Nvram_Check_Data(VOID)

+{

+	if(Nvram_DirInit() != ZOSS_SUCCESS)

+	{

+		printk("cpnv Nvram_DirInit fail!\n");

+		zOss_ASSERT(0);

+	}

+

+	 if(Nvram_RoInit() != ZOSS_SUCCESS)

+	 {

+		 printk("cpnv Nvram_RoInit fail!\n");

+		 zOss_ASSERT(0);

+	 }

+

+	 if(Nvram_RwInit() != ZOSS_SUCCESS)

+	 {

+		 printk("cpnv Nvram_RwInit fail!\n");

+		 zOss_ASSERT(0);

+	 }

+

+    return TRUE;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_WriteWithFlag

+* ¹¦ÄÜÃèÊö£º дһÏîNV RW´ø±êÖ¾

+* ²ÎÊý˵Ã÷£º (IN)

+*            NvItemID:    ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            NvItemData:  дÈëµÄÊý¾Ý

+*            NvItemLen:   Êý¾Ý³¤¶È

+*            iNvm:   	  Ö÷»¹ÊDZ¸·Ý

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º 

+**************************************************************************/

+static UINT32 Nvram_WriteWithFlag(UINT32 NvItemID, UINT8 *NvItemData, UINT32 NvItemLen, UINT8 iNvm)

+{

+    CHAR          	*pSymbol_File   = NULL;

+	CHAR          	*pWrite_File   	= NULL;

+    UINT32          Start_Addr      = 0;

+    UINT8           NV_Symbol       = 0;

+    UINT32          status          = ZOSS_ERROR;

+

+    if (iNvm == NV_WORK_AREA)

+    {

+        pSymbol_File = NVM_FS_RW_MAIN_SYMBOL_PATH;

+		pWrite_File = NVM_FS_RW_MAIN_PATH;

+    }

+    else if (iNvm == NV_BACKUP_AREA)

+    {

+        pSymbol_File = NVM_FS_RW_BACKUP_SYMBOL_PATH;

+		pWrite_File = NVM_FS_RW_BACKUP_PATH;

+    }

+    else

+        return ZOSS_ERROR;

+

+    NV_Symbol   = NV_SYMBOL_WRITE;

+	status 		= Nvram_FsWrite(pSymbol_File, 0, 1, &NV_Symbol);

+    if (status != ZOSS_SUCCESS)

+        return ZOSS_ERROR;

+   

+	status = Nvram_FsWrite(pWrite_File, NvItemID, NvItemLen, NvItemData);

+    if (status != ZOSS_SUCCESS)

+        return ZOSS_ERROR;

+

+    NV_Symbol   = NV_SYMBOL_NORMAL;

+	

+    return Nvram_FsWrite(pSymbol_File, 0, 1, &NV_Symbol);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_FsRead

+* ¹¦ÄÜÃèÊö£º ´ÓÎļþ

+* ²ÎÊý˵Ã÷£º (IN)¶ÁÈ¡nv

+*            part_name: ÎļþÃû

+*            dwStart:   ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            from:  	дÈëµÄÊý¾Ý

+*            dwLen:   	Êý¾Ý³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ÁÙʱ·½°¸ÊÊÓ㬺óÐøÉ¾³ý

+**************************************************************************/

+static UINT32 Nvram_FsRead(const CHAR *part_name, UINT32 dwStart, UINT32 dwLen, UINT8 *to)

+{

+	SINT32 ret = 0;

+	SINT32 fd = 0;

+	mm_segment_t old_fs = get_fs();

+

+	if((part_name == NULL) || (to == NULL))

+		return ZOSS_ERROR;

+

+	set_fs(KERNEL_DS);

+	fd = CPPS_KO_FUNC(sys_open)(part_name, O_RDONLY, 0);

+	if(fd < 0) 

+	{

+		printk("cpnv open %s fail,errno = %d\n", part_name, fd);

+		set_fs(old_fs);

+		return ZOSS_ERROR;

+	}

+	

+	ret = CPPS_KO_FUNC(sys_lseek)(fd, dwStart, 0);

+	if(ret < 0) 

+	{

+		printk("cpnv lseek %s fail,errno = %d\n", part_name, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+		set_fs(old_fs);

+		return ZOSS_ERROR;

+	}

+	

+	ret = CPPS_KO_FUNC(sys_read)(fd, to, dwLen);

+	if(ret != dwLen) 

+	{

+		printk("cpnv read %s fail, len = %d, errno = %d\n", part_name, dwLen, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+		set_fs(old_fs);

+		return ZOSS_ERROR;

+	}

+	

+	CPPS_KO_FUNC(sys_close)(fd);

+	set_fs(old_fs);

+	return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_FsWrite

+* ¹¦ÄÜÃèÊö£º дNVÊý¾Ýµ½Îļþ

+* ²ÎÊý˵Ã÷£º (IN)

+*            part_name: ÎļþÃû

+*            dwStart:   ¸ÃNVÏîµÄÆ«ÒÆµØÖ·(Ïà¶ÔÓÚNVÆðʼµØÖ·µÄÆ«ÒÆ)

+*            from:  	дÈëµÄÊý¾Ý

+*            dwLen:   	Êý¾Ý³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ÁÙʱ·½°¸ÊÊÓ㬺óÐøÉ¾³ý

+**************************************************************************/

+static UINT32 Nvram_FsWrite(const CHAR *part_name, UINT32 dwStart, UINT32 dwLen, UINT8 *from)

+{

+	SINT32 ret = 0;

+	SINT32 fd = 0;

+	mm_segment_t old_fs = get_fs();;

+

+	if(part_name == NULL || from == NULL)

+		return ZOSS_ERROR;

+	

+	set_fs(KERNEL_DS);

+	fd = CPPS_KO_FUNC(sys_open)(part_name, O_SYNC | O_RDWR | O_CREAT , 0);

+	if(fd < 0) 

+	{

+		printk("cpnv open %s fail,errno = %d\n", part_name, fd);

+		set_fs(old_fs);

+		return ZOSS_ERROR;

+	}

+	

+	ret = CPPS_KO_FUNC(sys_lseek)(fd, dwStart, 0);

+	if(ret < 0) 

+	{

+		printk("cpnv lseek %s fail,errno = %d\n", part_name, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+		set_fs(old_fs);

+		return ZOSS_ERROR;

+	}

+	

+	ret = CPPS_KO_FUNC(sys_write)(fd, from, dwLen);

+	if(ret != dwLen) 

+	{

+		printk("cpnv write %s fail,errno = %d\n", part_name, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+		set_fs(old_fs);

+		return ZOSS_ERROR;

+	}

+	

+	CPPS_KO_FUNC(sys_fsync)(fd);

+	CPPS_KO_FUNC(sys_close)(fd);

+	set_fs(old_fs);

+	

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_Remount

+* ¹¦ÄÜÃèÊö£º ÖØÐ¹ÒÔØ·ÖÇø

+* ²ÎÊý˵Ã÷£º (IN)

+*            DevName:   É豸Ãû³Æ

+*            DirName:  	¹ÒÔØÂ·¾¶

+*            Type:   	ÎļþÀàÐÍ

+*            Flag:   	±êÖ¾

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º ×èÈûº¯Êý£¬²»ÔÊÐíÖжϼäÖ´ÐÐ

+**************************************************************************/

+UINT32 Nvram_Remount(CHAR *DevName, CHAR *DirName, CHAR *Type, UINT32 Flag)

+{

+	int ret = 0;

+	mm_segment_t old_fs = get_fs();

+

+	set_fs(KERNEL_DS);

+retry1:	

+	ret = CPPS_KO_FUNC(sys_mount)(DevName, DirName, Type, Flag , 0);

+	if(ret == EBUSY)

+	{

+		msleep(10);

+		goto retry1;

+	}

+	set_fs(old_fs);

+	

+	if(ret < 0) 

+	{

+		printk("cpnv sys_mount fail,errno = %d\n", ret);

+		return ZOSS_ERROR;

+	}

+

+	return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_CopyFile

+* ¹¦ÄÜÃèÊö£º ±È½Ï¹¤×÷ÇøºÍ±¸·ÝÇø

+* ²ÎÊý˵Ã÷£º (IN)

+*            pDstFile:  Ä¿±êÎļþ

+*            pSrcFile:  Ô´Îļþ

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Nvram_CopyFile(const CHAR *pDstFile, const CHAR *pSrcFile)

+{

+	UINT8 *pBuf;

+	UINT32 len;

+	UINT32 ret;

+	

+	if(pDstFile == NULL || pSrcFile == NULL)

+		return ZOSS_ERROR;

+

+	pBuf = Nvram_ReadFile(pSrcFile, &len);

+	if(!pBuf)

+		return ZOSS_ERROR;

+

+	ret = Nvram_FsWrite(pDstFile, 0, len, pBuf);

+

+	zOss_Free(pBuf);

+	

+    return ret;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_CmpFile

+* ¹¦ÄÜÃèÊö£º ±È½Ï¹¤×÷ÇøºÍ±¸·ÝÇø

+* ²ÎÊý˵Ã÷£º (IN)

+*            pDstFile:  Ä¿±êÎļþ

+*            pSrcFile:  Ô´Îļþ

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Nvram_CmpFile(const CHAR *pDstFile, const CHAR *pSrcFile)

+{

+	UINT8 *pDst;

+	UINT8 *pSrc;

+	UINT32 DstLen;

+	UINT32 SrcLen;

+

+	if(pDstFile == NULL || pSrcFile == NULL)

+		return ZOSS_ERROR;

+

+	pDst = Nvram_ReadFile(pDstFile, &DstLen);

+	if(!pDst)

+		return ZOSS_ERROR;

+	

+	pSrc = Nvram_ReadFile(pSrcFile, &SrcLen);

+	if(!pSrc)

+	{

+		zOss_Free(pDst);

+		return ZOSS_ERROR;

+	}

+	

+	if(DstLen != SrcLen)

+	{

+		zOss_Free(pSrc);

+		zOss_Free(pDst);

+		

+		printk("Nvram_CmpFile Dstbuf = %d, Srcbuf = %d\n", DstLen, SrcLen);

+		return ZOSS_ERROR;

+	}

+

+	if(memcmp(pSrc, pDst, SrcLen) != 0)

+	{

+		zOss_Free(pSrc);

+		zOss_Free(pDst);

+		return ZOSS_ERROR;

+	}

+

+	zOss_Free(pSrc);

+	zOss_Free(pDst);

+	

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_ReadFile

+* ¹¦ÄÜÃèÊö£º ¶ÁÈ¡Õû¸önvÎļþ

+* ²ÎÊý˵Ã÷£º (IN)

+*            pFile:  Îļþ

+*            len:    ³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º·µ»ØÖµµ÷ÓÃÕßÊÍ·Å

+**************************************************************************/

+static UINT8 *Nvram_ReadFile(const CHAR *pFile, UINT32 *len)

+{

+	SINT32 fd  		= 0;

+	SINT32 ret 		= 0;

+    struct stat buf = {0};

+	UINT8 *pBuf 		= {0};

+

+	if(pFile == NULL)

+		return NULL;

+

+	fd = CPPS_KO_FUNC(sys_open)(pFile, O_RDONLY, 0);

+	if(fd < 0) 

+	{

+		printk("cpnv open %s fail,errno = %d\n", pFile, fd);

+		return NULL;

+	}

+	

+	ret = CPPS_KO_FUNC(sys_newfstat)(fd, &buf);

+    if(0 != ret)

+    {

+    	printk("cpnv stat %s fail,errno = %d\n", pFile, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+        return NULL;

+    }

+	

+	pBuf = zOss_Malloc(buf.st_size);

+	if (pBuf == NULL)

+	{

+		printk("cpnv malloc fail\n");

+		CPPS_KO_FUNC(sys_close)(fd);

+		return NULL;

+	}

+

+	ret = CPPS_KO_FUNC(sys_read)(fd, pBuf, buf.st_size);

+	if(ret != buf.st_size) 

+	{

+		printk("cpnv read %s fail,errno = %d\n", pFile, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+		zOss_Free(pBuf);

+		return NULL;

+	}

+	CPPS_KO_FUNC(sys_close)(fd);

+	*len = buf.st_size;

+	

+    return pBuf;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Nvram_WriteFile

+* ¹¦ÄÜÃèÊö£º дÕû¸önvÎļþ

+* ²ÎÊý˵Ã÷£º (IN)

+*            pFile:  Îļþ

+*            len:    ³¤¶È

+*            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º·µ»ØÖµµ÷ÓÃÕßÊÍ·Å

+**************************************************************************/

+/*

+static SINT32 Nvram_WriteFile(const CHAR *pFile, UINT8 *pBuf, UINT32 len)

+{

+	SINT32 fd  		= 0;

+	SINT32 ret 		= 0;

+

+	fd = CPPS_KO_FUNC(sys_open)(pFile, O_SYNC | O_RDWR | O_CREAT | O_TRUNC, 0);

+	if(fd < 0) 

+	{

+		printk("cpnv11 open %s fail,errno = %d\n", pFile, fd);

+		return 0;

+	}

+

+	ret = CPPS_KO_FUNC(sys_write)(fd, pBuf, len);

+	if(ret != len) 

+	{

+		printk("cpnv write %s fail,errno = %d\n", pFile, ret);

+		CPPS_KO_FUNC(sys_close)(fd);

+		return ret;

+	}

+	

+	CPPS_KO_FUNC(sys_fsync)(fd);

+	CPPS_KO_FUNC(sys_close)(fd);

+

+    return ret;

+}

+*/

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_printf.c b/cp/ps/plat/src/oss/sup/src/sup_printf.c
new file mode 100644
index 0000000..bf78ce8
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_printf.c
@@ -0,0 +1,114 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : printagt.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ´òÓ¡´úÀíÔ´Îļþ

+* ×÷    Õß : ÀîÑô 

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007-06-09

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ÐíÐË¿ü

+* ÐÞ¸ÄÈÕÆÚ : 2007-09-12

+* ÐÞ¸ÄÄÚÈÝ : ÐÞ¸ÄÁËOSS_Printfʹ֮¿ÉÒÔÔÚOSE¶Ë´òÓ¡

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : ÐíÐË¿ü

+* ÐÞ¸ÄÈÕÆÚ : 2008-04-29

+* ÐÞ¸ÄÄÚÈÝ : ¶Ô´òÓ¡µÄЧÂʽøÐÐÁËÓÅ»¯

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0003

+* ÐÞ ¸Ä ÈË : Ï°Ö¾Ùæ

+* ÐÞ¸ÄÈÕÆÚ : 2009-03-20

+* ÐÞ¸ÄÄÚÈÝ : ÓÅ»¯´òӡЧÂÊ¡¢Ö§³Ö´òÓ¡µ½Îļþ¡¢¼Ç¼×îºó´òÓ¡¹¦ÄܺʹòÓ¡»º³å¸ßЧ»¯

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0004

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0005

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC:617001782003

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷                                          

+**************************************************************************/

+#ifdef _OS_WIN

+#define vsnprintf _vsnprintf

+#endif

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**********************************************************************

+* º¯ÊýÃû³Æ£ºvsnformat

+* ¹¦ÄÜÃèÊö£º¸ñʽ»¯×Ö·û´®²¢Êä³öÖÁ»º³åÇø

+* ²ÎÊý˵Ã÷: (IN)

+            dwMaxCount£º»º³åÇø´óС£¨°üÀ¨NULL½áÊø·û£©

+            format    £ºÒªÊ¹Óõĸñʽ´®

+            vaList    £º¿É±ä²ÎÊýÁбí

+            (OUT)

+            pcBuffer  £ºÊä³ö»º³åÇø

+* ·µ »Ø Öµ£º-1  £ºÊµ¼ÊÒªÊä³öµÄ×Ö½ÚÊý³¬³ö»º³åÇø´óС

+            ÆäËü£ºÊµ¼ÊÊä³öµÄ×Ö½ÚÊý¡£

+* ÆäËü˵Ã÷£º²»Ö§³Ö¸¡µãÊä³ö

+***********************************************************************/

+SINT32 vsnformat(CHAR *pcBuffer, UINT32 dwMaxCount, const CHAR *pcParamFormat, va_list vaList)

+{

+    return vsnprintf(( char *)pcBuffer, dwMaxCount, (char *)pcParamFormat, vaList);

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_arm.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_arm.c
new file mode 100644
index 0000000..5e62528
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_arm.c
@@ -0,0 +1,267 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump_arm.c

+* Ïà¹ØÎļþ : Éú³ÉramdumpµÄarmv6¡¢armv5Ìåϵ½á¹¹µÄcmm½Å±¾Îļþ£»

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2013/10/19

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ¸ß»ª·å

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é              

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_ramdump.h"

+#ifdef _OS_TOS

+#include "tos_except_arm.h"

+#elif defined (_OS_LINUX)

+#include "linux_except_arm.h"

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_ARM_MODE_NUM               6

+#define ZOSS_BANK_REG_NUM               3

+#define ZOSS_NORMAL_REG_NUM             15

+

+#define ZOSS_EXCEPT_UNDEF_INSTRUTION    0x04 

+#define ZOSS_EXCEPT_PREFETCH_ABORT      0x0C

+#define ZOSS_EXCEPT_DATA_ABORT          0x10

+#define ZOSS_EXCEPT_IRQ                 0x18

+#define ZOSS_EXCEPT_FIQ                 0x1C

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+/**************************************************************************

+*Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+#ifdef _OS_TOS

+extern char *zTos_MpuDisplayCp15(char *addr);

+extern char *zTos_MmuDisplayCp15(char *addr);

+#elif defined (_OS_LINUX)

+extern char *ramdump_mpu_cp15(char *addr);

+extern char *ramdump_mmu_cp15(char *addr);

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static CHAR *ramdump_CreateCpsrCmmFile(CHAR *address);

+static CHAR *ramdump_CreateRegsitersCmmFile(CHAR *address);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+struct cpu_core Osa_CoreRegisters   = {0}; 

+static struct cpu_regdump *g_zRadmumpRegInfo        = NULL;

+static UINT8 g_zRamdump_ArmMode[ZOSS_ARM_MODE_NUM]  =   /* Êý×é˳ÐòÓëstruc coreÖеÄ˳ÐòÒ»Ö£¬²»Äܸü¸Ä */

+{

+    0xdf,   /* SYS */

+    0xd3,   /* SVC */

+    0xd7,   /* ABT */

+    0xdb,   /* UND */

+    0xd2,   /* IRQ */

+    0xd1,   /* FIQ */

+}; 

+static CHAR *g_zRamdumpBankReg[ZOSS_BANK_REG_NUM]   = {(CHAR *)"r13", (CHAR *)"r14", (CHAR *)"spsr"};

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_CreateCpsrCmmFile

+ * ¹¦ÄÜÃèÊö£º´´½¨cpsr½Å±¾£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *                cmmAddress : ½Å±¾µÄµØÖ·Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º ·µ»Ø½Å±¾µØÖ·£»

+**************************************************************************/

+static CHAR *ramdump_CreateCpsrCmmFile(CHAR *cmmAddress)

+{

+    UINT32  value       = 0;

+    

+    /* Êä³öcpsr */

+    if(g_zRadmumpRegInfo != NULL)

+    {

+        switch(g_zRadmumpRegInfo->vector)

+        {

+        case ZOSS_EXCEPT_UNDEF_INSTRUTION:  /* undefined instruction */

+            {

+                value = Osa_CoreRegisters.undefined.psr;

+                break;

+            }

+        case ZOSS_EXCEPT_PREFETCH_ABORT:    /* prefetch abort */

+            {

+                value = Osa_CoreRegisters.abort.psr;

+                break;

+            }

+        case ZOSS_EXCEPT_DATA_ABORT:        /* data abort */

+            {

+                value = Osa_CoreRegisters.abort.psr;

+                break;

+            }

+        case ZOSS_EXCEPT_IRQ:               /* IRQ */

+            {

+                value = Osa_CoreRegisters.irq.psr;

+                break;

+            }

+        case ZOSS_EXCEPT_FIQ:               /* FIQ */

+            {

+                value = Osa_CoreRegisters.fiq.psr;

+                break;

+            }

+        default:

+            {

+                break;

+            }

+        }

+    }

+    else

+    {

+        value =zOss_ReadCpsr();

+    }

+    

+    return cmmAddress += (UINT32)sprintf(cmmAddress, "r.s cpsr %#lx\r\n", value);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_CreateRegsitersCmmFile

+ * ¹¦ÄÜÃèÊö£º´´½¨cpsr½Å±¾£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *                  cmmAddress: ½Å±¾µÄµØÖ·Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º·µ»Ø½Å±¾µØÖ·£»   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static CHAR *ramdump_CreateRegsitersCmmFile(CHAR *cmmAddress)

+{

+    UINT32  value       = 0;

+    UINT32  *paddress   = NULL; 

+    UINT32  i           = 0;

+    UINT32  j           = 0;

+

+    zOss_ASSERT(cmmAddress != NULL);

+    if(g_zRadmumpRegInfo != NULL)

+    {

+        value = g_zRadmumpRegInfo->pc;

+    }

+    else

+    {

+        value = Osa_CoreRegisters.supervisor.lr;

+    }

+    cmmAddress += sprintf(cmmAddress, "r.s pc %#lx\r\n", value);

+    

+    /* Çл»µ½svcģʽ£¬»¹Ô­r0-r12 */

+    cmmAddress += sprintf(cmmAddress, "r.s cpsr %#lx\r\n", (UINT32)g_zRamdump_ArmMode[0]);

+

+    for(i = 0; i < ZOSS_NORMAL_REG_NUM-2; i++)

+    {

+        cmmAddress += sprintf(cmmAddress, "r.s r%d %#lx\r\n",(int)i, Osa_CoreRegisters.r[i]);

+    }

+    paddress = (UINT32 *)(&Osa_CoreRegisters.user.sp);

+    /* Êä³ö³ýfiqÖ®ÍâµÄÆäËûģʽ±¸·Ý¼Ä´æÆ÷ */

+    for(i = 0; i < ZOSS_ARM_MODE_NUM-1; i++)

+    {

+        cmmAddress += sprintf(cmmAddress, "r.s cpsr %#lx\r\n", (UINT32)g_zRamdump_ArmMode[i]);

+        for(j = 0; j < ZOSS_BANK_REG_NUM; j++)

+        {

+            cmmAddress += sprintf(cmmAddress, "r.s %s %#lx\r\n", g_zRamdumpBankReg[j], *paddress);

+            paddress++; 

+        }

+    }  

+    /* Êä³öFIQ r8-r14 */

+    cmmAddress += sprintf(cmmAddress, "r.s cpsr %#lx\r\n", (UINT32)g_zRamdump_ArmMode[5]);

+    for(i = 8; i < ZOSS_NORMAL_REG_NUM; i++)

+    {

+        cmmAddress += sprintf(cmmAddress, "r.s r%d %#lx\r\n", (int)i, *paddress);

+        paddress++;

+    }

+    /* Êä³öFIQ spsr */

+    cmmAddress += sprintf(cmmAddress, "r.s spsr %#lx\r\n", *paddress);

+    /* ´´½¨cpsr½Å±¾ */

+    return  ramdump_CreateCpsrCmmFile(cmmAddress);

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpCreateCmmFile

+ * ¹¦ÄÜÃèÊö£º Éú³É»Ö¸´¶ÑÕ»µÄT32½Å±¾

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                  pCmmFileInfo: ½Å±¾ÎļþÐÅÏ¢Ö¸Õ룻

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+VOID zOss_RamdumpCreateCmmFile(T_zOss_RamdumpCmmFileInfo  *pCmmFileInfo)

+{

+    CHAR    *cmmAddress = NULL;

+   

+    cmmAddress  =  pCmmFileInfo->cmmFileBuffer; 

+    cmmAddress  += sprintf(cmmAddress, "ENTRY &%s\r\n", ZOSS_RAMDUMP_DIR_NAME);

+    /*´´½¨¼Ä´æÆ÷½Å±¾ */

+    cmmAddress  =  ramdump_CreateRegsitersCmmFile(cmmAddress);

+    /* ½ûÖ¹MMU»òMPU */   

+    cmmAddress  += sprintf(cmmAddress, "per.s c15:0x1 %%long %#lx\r\n", (zOss_Cp15ReadControlRegister() & 0xfffffffe));  

+    /* ´´½¨region ½Å±¾ */

+    cmmAddress  =  zOss_RamdumpCreateRegionsCmmFile(cmmAddress);

+    /* Êä³öcp15 c1 ¿ØÖƼĴæÆ÷ */

+    cmmAddress  += sprintf(cmmAddress, "per.s c15:0x1 %%long %#lx\r\n", zOss_Cp15ReadControlRegister());

+

+#ifdef _OS_TOS

+# ifdef CYGOPT_HAL_ARM_MMU

+    /* Êä³ömmuÏà¹ØµÄ¼Ä´æÆ÷ */

+    cmmAddress = zTos_MmuDisplayCp15(cmmAddress);

+# endif

+

+# ifdef CYGOPT_HAL_ARM_MPU

+    /* Êä³ömpuÏà¹ØµÄ¼Ä´æÆ÷ */

+    cmmAddress = zTos_MpuDisplayCp15(cmmAddress);

+# endif

+#elif defined (_OS_LINUX)

+# ifdef CONFIG_MMU

+    /* Êä³ömmuÏà¹ØµÄ¼Ä´æÆ÷ */

+    cmmAddress = ramdump_mmu_cp15(cmmAddress);

+# else

+    /* Êä³ömpuÏà¹ØµÄ¼Ä´æÆ÷ */

+    cmmAddress = ramdump_mpu_cp15(cmmAddress);

+# endif

+#endif

+    

+    /* Êä³ö½áÊø·û */

+    cmmAddress  += sprintf(cmmAddress, "ENDDO\r\n");

+    

+    pCmmFileInfo->cmmFileSize = (UINT32)(cmmAddress - pCmmFileInfo->cmmFileBuffer);

+    zOss_AssertExN(pCmmFileInfo->cmmFileSize <= pCmmFileInfo->cmmFileMaxSize);

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_client.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_client.c
new file mode 100644
index 0000000..c8cd6ea
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_client.c
@@ -0,0 +1,443 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : tos_ramdump_arm_client.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2013/07/18

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_ramdump.h"

+#include "drvs_icp.h"

+#include "ram_config.h"

+

+#ifdef _OS_TOS

+#include <cyg/hal/tos_arm_mmu.h>

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/*************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+T_zOss_RamdumpOpt           g_zRamdump_Optfunc      = {NULL,NULL};

+T_zOss_RamdumpClientInfo    *g_zRamdump_ClientInfo  = NULL;

+T_zOss_RamdumpClientMsgInfo g_zRamdump_IcpMsgInfo   = {0};

+

+#define ZRAMDUMP_CLIENT_FILE "sup_ramdump_client.con"

+#define ZRAMDUMP_CLIENT_ICP_TABLE(srcModId,desModId,chID)

+#define ZRAMDUMP_CLIENT_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize) 

+#define ZRAMDUMP_SERVER_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize,serverFlagBase)

+#undef  ZRAMDUMP_CLIENT_ICP_TABLE

+#define ZRAMDUMP_CLIENT_ICP_TABLE(identifier,actorID,chID)                      \

+                             (UINT32)(identifier),(T_HalIcp_MsgActor)(actorID), \

+                             (T_ZDrvRpMsg_ChID)(chID)

+static T_zOss_RamdumpIcpInfo s_zRamdump_IcpClientInfo = 

+{

+    #include ZRAMDUMP_CLIENT_FILE

+};

+

+#undef  ZRAMDUMP_CLIENT_ICP_TABLE

+#define ZRAMDUMP_CLIENT_ICP_TABLE(identifier,actorID,chID)

+#undef  ZRAMDUMP_CLIENT_MEM_TABLE

+#define ZRAMDUMP_CLIENT_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize)     \

+                              (UINT32)(identifier),(CHAR *)(pRamdumpStartAddr), \

+                              (UINT32)(ramdumpSize)                           

+static T_zOss_RamdumpClientConInfo s_zRamdump_ClientCfgInfo = 

+{

+    #include ZRAMDUMP_CLIENT_FILE

+};

+#undef  ZRAMDUMP_CLIENT_MEM_TABLE

+#define ZRAMDUMP_CLIENT_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize)

+static BOOL s_zRamdump_InitFlag = FALSE;

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_RAMDUMP_CLIENT_ICP_SIZE        0x40

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID ramdump_ClientSendMsg(T_zOss_RamdumpIcpInfo *IcpInfo, T_zOss_RamdumpClientMsgInfo *pMsgInfo);

+static VOID ramdump_ClientProcessMsg(VOID *pMsg, UINT32 len);

+static VOID ramdump_Main(VOID);

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ClientSendMsg

+ * ¹¦ÄÜÃèÊö£ººË¼äͨѶÏûÏ¢·¢ËͽӿÚ

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              pIcpInfo: ramdump ICPÐÅÏ¢

+ *              pMsgInfo: ICPÏûÏ¢

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ClientSendMsg(T_zOss_RamdumpIcpInfo *pIcpInfo, T_zOss_RamdumpClientMsgInfo *pMsgInfo)

+{

+    T_ZDrvRpMsg_Msg icpMsg  = { 0 };

+

+    icpMsg.actorID = pIcpInfo->actorID;

+    icpMsg.chID    = pIcpInfo->chID;

+    icpMsg.flag    = 1;

+    icpMsg.buf     = pMsgInfo;

+    icpMsg.len     = sizeof(T_zOss_RamdumpClientMsgInfo);

+    zDrvRpMsg_WriteLockIrq(&icpMsg);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_GetConfigRegion

+ * ¹¦ÄÜÃèÊö£º»ñÈ¡ramdÒªµ¼³öµÄÇøÓò£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+#ifdef CYGOPT_HAL_ARM_MMU

+static VOID ramdump_GetConfigRegion(VOID)

+{    

+    T_zOss_RamdumpRegion regionInfo = {0};

+    UINT32               cnt        = 0;

+    T_zTos_MmuConfigItem *pItem     = NULL;

+    

+    for (cnt = 0; cnt < g_zTos_MmuConfigTable.count; cnt++)

+    {   

+        pItem = &g_zTos_MmuConfigTable.item[cnt];

+        if (pItem->attr & ZTOS_MMU_REGION_DUMP)

+        {

+            regionInfo.baseForServer = pItem->server_base;

+            regionInfo.baseForSelf   = pItem->physical_base;

+            regionInfo.size          = pItem->size;

+            regionInfo.baseForCopy   = (pItem->attr & ZTOS_MMU_REGION_COPY) ? pItem->server_base : 0;

+            zOss_RamdumpConfigureMem(&regionInfo);

+        }

+    }

+}

+#endif

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SetPartition

+ * ¹¦ÄÜÃèÊö£ºramdump¿Õ¼ä»®·Ö£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SetPartition(VOID)

+{    

+    UINT32 size;

+    UINT32 sizeUnit = s_zRamdump_ClientCfgInfo.ramdumpSize/ZOSS_RAMDUMP_CLIENT_TOTAL_RATE;;

+   

+    /* ramdumpµØÖ·»®·Ö */

+    memset(s_zRamdump_ClientCfgInfo.pRamdumpStartAddr, 0, s_zRamdump_ClientCfgInfo.ramdumpSize);

+    g_zRamdump_ClientInfo  = (T_zOss_RamdumpClientInfo *)(((UINT32)s_zRamdump_ClientCfgInfo.pRamdumpStartAddr + sizeof(UINT32) - 1) & ~(sizeof(UINT32) - 1));

+    g_zRamdump_ClientInfo->clientFlagBase = (UINT32)g_zRamdump_ClientInfo+((sizeof(T_zOss_RamdumpClientInfo) + sizeof(UINT32) - 1)& ~(sizeof(UINT32) - 1));

+    g_zRamdump_ClientInfo->pCmmInfo = (T_zOss_RamdumpCmmFileInfo *)((char *)g_zRamdump_ClientInfo->clientFlagBase+4);

+    g_zRamdump_ClientInfo->pCmmInfo->cmmFileSize = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_CMM_INFO_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ClientInfo->pCmmInfo->cmmFileMaxSize = (size - sizeof(T_zOss_RamdumpCmmFileInfo));

+     

+    g_zRamdump_ClientInfo->pConfigureInfo= (T_zOss_RamdumpRegionInfo *)((CHAR*)g_zRamdump_ClientInfo->pCmmInfo + size);

+    g_zRamdump_ClientInfo->pConfigureInfo->regionNum = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_CONFIGURED_REGION_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ClientInfo->pConfigureInfo->regionMaxNum = (size - sizeof(T_zOss_RamdumpRegionInfo)) / sizeof(T_zOss_RamdumpRegion);

+    

+    g_zRamdump_ClientInfo->pParsedInfo = (T_zOss_RamdumpRegionInfo *)((CHAR*)g_zRamdump_ClientInfo->pConfigureInfo + size);

+    g_zRamdump_ClientInfo->pParsedInfo->regionNum = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_PARSED_REGION_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ClientInfo->pParsedInfo->regionMaxNum = (size - sizeof(T_zOss_RamdumpRegionInfo)) / sizeof(T_zOss_RamdumpRegion);

+    

+    g_zRamdump_ClientInfo->pErrInfo = (T_zOss_RamdumpBuffInfo *)((CHAR *)g_zRamdump_ClientInfo->pParsedInfo + size);

+    size = (sizeUnit * ZOSS_RAMDUMP_ERR_INFO_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);  

+    g_zRamdump_ClientInfo->pErrInfo->pBuff = (CHAR *)g_zRamdump_ClientInfo->pErrInfo + sizeof(T_zOss_RamdumpBuffInfo);

+    g_zRamdump_ClientInfo->pErrInfo->buffLen = size - sizeof(T_zOss_RamdumpBuffInfo);  

+    g_zRamdump_ClientInfo->clientId    = s_zRamdump_ClientCfgInfo.clientId;

+    sprintf((char *)g_zRamdump_ClientInfo->pErrInfo->pBuff, "%d_c_core: exact error!\n",(int)s_zRamdump_ClientCfgInfo.clientId); 

+

+    zOss_AssertExN(((CHAR *)g_zRamdump_ClientInfo->pErrInfo->pBuff+ size) <= 

+                   (s_zRamdump_ClientCfgInfo.pRamdumpStartAddr + s_zRamdump_ClientCfgInfo.ramdumpSize));

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ClientProcessMsg

+ * ¹¦ÄÜÃèÊö£ººË¼äͨѶserverÏûÏ¢´¦Àí½Ó¿Ú

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              pBuff:ÏûÏ¢µÄbuff

+ *              len  :ÏûÏ¢µÄ³¤¶È

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ClientProcessMsg(VOID *pBuff, UINT32 len)

+{

+    T_zOss_RamdumpServerMsgInfo *ramdumpMsg = (T_zOss_RamdumpServerMsgInfo *)pBuff;

+

+    switch(ramdumpMsg->msgType)

+    { 

+    case ZOSS_RAMDUMP_EXCPT_TYPE:

+        {

+            sprintf((char *)g_zRamdump_ClientInfo->pErrInfo->pBuff, "%d_c_core: force error!\n",(int)g_zRamdump_ClientInfo->clientId); 

+            zOss_RamdumpHandle(1, 1, 1);

+            break;

+        }

+    case ZOSS_RAMDUMP_TEST_EXCPT_TYPE:

+        {

+            sprintf((char *)g_zRamdump_ClientInfo->pErrInfo->pBuff, "%d_c_core: exact error!\n",(int)g_zRamdump_ClientInfo->clientId); 

+            zOss_RamdumpHandle(1, 1, 1);

+            break;

+        }

+    default:

+        {

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ClientIcpInit

+ * ¹¦ÄÜÃèÊö£ºclient ICP ³õʼ»¯£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ClientIcpInit(VOID)

+{

+    zDrvRpMsg_CreateChannel(s_zRamdump_IcpClientInfo.actorID, s_zRamdump_IcpClientInfo.chID, ZOSS_RAMDUMP_CLIENT_ICP_SIZE);

+    zDrvRpMsg_RegCallBack(s_zRamdump_IcpClientInfo.actorID, s_zRamdump_IcpClientInfo.chID, ramdump_ClientProcessMsg);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_NotifyServerExceptionOccur

+ * ¹¦ÄÜÃèÊö£ºÍ¨Öªserver·¢ÉúÁËÒì³££»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_NotifyServerExceptionOccur(VOID)

+{

+    T_zOss_RamdumpClientMsgInfo msgInfo = {0};

+

+    msgInfo.Identifier        = s_zRamdump_ClientCfgInfo.clientId;

+    msgInfo.msgType           = ZOSS_RAMDUMP_EXCPT_TYPE;

+    msgInfo.pRamdumpStartAddr = s_zRamdump_ClientCfgInfo.pRamdumpStartAddr;

+    msgInfo.radmumpSize       = s_zRamdump_ClientCfgInfo.ramdumpSize;

+    ramdump_ClientSendMsg(&s_zRamdump_IcpClientInfo, &msgInfo);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ProcessException

+ * ¹¦ÄÜÃèÊö£º´¦ÀíÒì³£ÐÅÏ¢£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ProcessException(VOID)

+{

+    *(UINT32 *)g_zRamdump_ClientInfo->clientFlagBase = ZOSS_RAMDUMP_FLAG_SECOND_VALUE;

+    zOss_CleanCache();

+    while (*(UINT32 *)g_zRamdump_ClientInfo->clientFlagBase != ZOSS_RAMDUMP_FLAG_THIRD_VALUE);

+    zOss_RamdumpCreateCmmFile(g_zRamdump_ClientInfo->pCmmInfo);

+    *(UINT32 *)g_zRamdump_ClientInfo->clientFlagBase = ZOSS_RAMDUMP_FLAG_FOUR_VALUE;

+    zOss_CleanCache();

+}

+

+/*****************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_Main

+ * ¹¦ÄÜÃèÊö£º Ö´ÐÐramdump

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+static VOID ramdump_Main(VOID)

+{

+    ramdump_NotifyServerExceptionOccur();

+    ramdump_ProcessException();

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpHandle

+ * ¹¦ÄÜÃèÊö£º Ramdump´¦Àíº¯Êý

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º ²ÎÊýÔÚTOS²Ù×÷ϵͳÉÏûÓÐʵ¼ÊÒâÒ壻

+ **************************************************************************/

+VOID zOss_RamdumpHandle(UINT16 user_called, UINT16 ecode, UINT16 extra)

+{

+    static UINT32   excepNum = 0;

+    ZOSS_INTR       old_intr;

+    

+    ZOSS_SAVE_IRQ(old_intr);

+    if (++excepNum > 1 || !s_zRamdump_InitFlag)   /* Ö»±£´æµÚÒ»´Î³ö´íÏÖ³¡ */

+    {

+        for( ; ; ) ;

+    }

+    zOss_RamdumpEncodeError(g_zRamdump_ClientInfo->pErrInfo->pBuff, user_called, ecode, extra);

+    ramdump_Main();

+    for( ; ; ) ;

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_RegionsCmmFile

+ * ¹¦ÄÜÃèÊö£ºT32cmm½Å±¾ÄÚ´æ¶ÎдÈë

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              address: cmm½Å±¾µÄµØÖ·£»             

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+CHAR *zOss_RamdumpCreateRegionsCmmFile(CHAR *address)

+{

+    CHAR    fileName[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    UINT32  i                                   = 0;

+  

+    sprintf(fileName, "%d_c_mem.bin", (int)g_zRamdump_ClientInfo->clientId);

+    for (i = 0; i < g_zRamdump_ClientInfo->pParsedInfo->regionNum; i++)

+    {   

+        T_zOss_RamdumpRegion *pRegion = &(g_zRamdump_ClientInfo->pParsedInfo->regions[i]);

+        if (pRegion->baseForSelf != pRegion->baseForServer)

+        {

+            UINT32 parsedEnd  = pRegion->baseForSelf + pRegion->size - 1;

+            address += sprintf(address, "data.load.binary &%s\\%d_%s %#lx--%#lx /noclear\r\n", ZOSS_RAMDUMP_DIR_NAME, 

+                               (int)i, fileName, pRegion->baseForSelf, parsedEnd);

+            if (pRegion->baseForCopy != 0)

+            {

+                memcpy((void*)pRegion->baseForCopy, (void*)pRegion->baseForSelf,(parsedEnd - pRegion->baseForSelf + 1));

+            }

+        }

+        else

+        {      

+            address += (UINT32)sprintf(address, "data.load.binary &%s\\%d_%s %#lx--%#lx /noclear\r\n", ZOSS_RAMDUMP_DIR_NAME,

+                                       (int)i, fileName, pRegion->baseForSelf, pRegion->baseForSelf + pRegion->size - 1);

+        }

+    }

+    

+    return address;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpConfigureMem

+ * ¹¦ÄÜÃèÊö£º ±£´æÄÚ´æ¶ÎÊý¾ÝÅäÖÃÐÅÏ¢

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              regionInfo: ÅäÖÃÇøÓòÖ¸Õ룻

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpConfigureMem(T_zOss_RamdumpRegion *regionInfo)

+{

+    T_zOss_RamdumpRegionInfo *pCfgInfo = g_zRamdump_ClientInfo->pConfigureInfo;

+    

+    if (regionInfo->size == 0)

+        return;

+    zOss_AssertExN(pCfgInfo->regionNum < pCfgInfo->regionMaxNum);

+    zOss_AssertExN((regionInfo->size - 1) <= (0xFFFFFFFF - regionInfo->baseForServer));

+    pCfgInfo->regions[pCfgInfo->regionNum].baseForServer = regionInfo->baseForServer;

+    pCfgInfo->regions[pCfgInfo->regionNum].baseForSelf   = regionInfo->baseForSelf;

+    pCfgInfo->regions[pCfgInfo->regionNum].baseForCopy   = regionInfo->baseForCopy;

+    pCfgInfo->regions[pCfgInfo->regionNum].size          = regionInfo->size;

+    (pCfgInfo->regionNum)++;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpSetOperation

+ * ¹¦ÄÜÃèÊö£º ramdumpÓû§×¢²á½Ó¿Ú£»

+ * ²ÎÊý˵Ã÷£º (IN): 

+ *              funcObjPtr: »Øµ÷º¯Êý£»

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpSetOperation(T_zOss_RamdumpOpt *funcObjPtr)

+{

+    zOss_AssertExN(funcObjPtr != NULL);

+    

+    if (funcObjPtr->ramdump_Process_PreHook != NULL)

+    {

+        g_zRamdump_Optfunc.ramdump_Process_PreHook = funcObjPtr->ramdump_Process_PreHook;

+    }

+    

+    if (funcObjPtr->ramdump_Process_AftHook != NULL)

+    {

+        g_zRamdump_Optfunc.ramdump_Process_AftHook = funcObjPtr->ramdump_Process_AftHook;

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ: zOss_RamdumpInit

+ * ¹¦ÄÜÃèÊö£ºRamdump³õʼ»¯£» 

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ***************************************************************************/     

+VOID zOss_RamdumpInit(VOID)

+{    

+    ramdump_SetPartition();

+#ifdef CYGOPT_HAL_ARM_MMU

+    ramdump_GetConfigRegion();   

+#endif

+    ramdump_ClientIcpInit();

+    *(UINT32 *)g_zRamdump_ClientInfo->clientFlagBase = ZOSS_RAMDUMP_FLAG_FIRST_VALUE;

+    g_zRamdump_IcpMsgInfo.Identifier        = s_zRamdump_ClientCfgInfo.clientId;

+    g_zRamdump_IcpMsgInfo.msgType           = ZOSS_RAMDUMP_INIT_TYPE;

+    g_zRamdump_IcpMsgInfo.pRamdumpStartAddr = s_zRamdump_ClientCfgInfo.pRamdumpStartAddr;

+    g_zRamdump_IcpMsgInfo.radmumpSize       = s_zRamdump_ClientCfgInfo.ramdumpSize;

+

+    ramdump_ClientSendMsg(&s_zRamdump_IcpClientInfo, &g_zRamdump_IcpMsgInfo);

+    zOss_CleanCache();

+    s_zRamdump_InitFlag = TRUE;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºOsa_SysErrHndInit

+ * ¹¦ÄÜÃèÊö£ºµØÖ·È«¾Ö±äÁ¿³õʼ»¯,»ñÈ¡ramdumpÄÚ´æ¿éĬÈÏÅäÖÃ

+                                  arm0ºÍarm1ͬ²½»úÖÆ

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º´ò×®£¬ÎªÁ˼æÈÝose¡¢cskyµÈramdump¹¦ÄÜ£»

+ ***************************************************************************/

+VOID Osa_SysErrHndInit(VOID)

+{

+

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_client_lib.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_client_lib.c
new file mode 100644
index 0000000..f50dd73
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_client_lib.c
@@ -0,0 +1,412 @@
+/*******************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+********************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump_m0_adapt.c

+* Ïà¹ØÎļþ : sup_ramdump_m0_adapt.c

+* ʵÏÖ¹¦ÄÜ : ʵÏÖm0°æ±¾È±ÉÙµÄc¿âº¯Êý£»

+* ×÷    Õß : ¸ß»ª·å

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2013/10/17 

+* ÆäËü˵Ã÷ : 

+*******************************************************************************/

+

+/*******************************************************************************

+* Ð޸ļǼ

+*******************************************************************************/

+

+/*******************************************************************************

+* #includeÇø

+*******************************************************************************/

+#include <stdarg.h>

+#include "oss_api.h"

+#include "sup_ramdump.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/*******************************************************************************

+* ºê¶¨ÒåÇø

+*******************************************************************************/

+#define ZOSS_VSNFORMAT_BUFF_SIZE        100

+#define ZOSS_VSNFORMAT_TOCHAR(n)        ((n) + '0')

+#define ZOSS_VSNFORMAT__DECIMAL         10

+#define ZOSS_VSNFORMAT_HEX              16

+#define ZOSS_VSNFORMAT_HEXPREFIX_LEN    2

+#define ZOSS_VSNFORMAT_LONG             0X0

+#define ZOSS_VSNFORMAT_PREFIX           0X1

+#define ZOSS_VSNFORMAT_HEXPREFIX        0X4

+#define ZOSS_INT_MAX                    0xFF

+

+/*******************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+*******************************************************************************/

+/* ¸ñʽ»¯·µ»ØÖµÀàÐÍ */

+typedef enum

+{

+    FORMAT_TYPE_CONTINUE,

+    FORMAT_TYPE_PUTFMTSTR,

+    FORMAT_TYPE_INTVALUE,

+    FORMAT_TYPE_ERROR,

+    FORMAT_TYPE_MAX    

+}T_zOss_FormatTypeRet;

+

+/*******************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+*******************************************************************************/

+static SINT32 vsnformat(CHAR *pcBuffer, UINT32 dwMaxCount, const CHAR *pcParamFormat, va_list vaList);

+static SINT32 getVareIntValue(UINT32 *pFormatType, SINT32 swBase, va_list *vaList);

+static CHAR   *translateNumberToStr(CHAR *pAcBuf, SINT32 dwVal, SINT32 swBase, SINT32 *sdwSize);

+static CHAR   *getStrLen(va_list *vaList, SINT32 *pSdwSize);

+static T_zOss_FormatTypeRet  getFormatType(SINT32 swCh, UINT32 *pFormatType, SINT32 *pSwBase);

+

+/*******************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+*******************************************************************************/

+static  CHAR BIG_HEX_DIGIT[]    = "0123456789ABCDEF";

+static  CHAR NULLSTRING[]       = "(null)";

+

+/*******************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+*******************************************************************************/

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º getVareIntValue

+ * ¹¦ÄÜÃèÊö£º »ñÈ¡±ä²ÎÖÐÕûÐεÄÊýÖµ£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              pFormatType: ¸ñʽ»¯ÀàÐÍ£»

+ *            (OUT):

+ *              swBase: ÖÆÊ½£»

+ *              vaList: ¿É±ä²ÎÊý£»

+ * ·µ »Ø Öµ£º ·µ»Ø±ä²ÎÖеÄÕûÐÎÊýÖµ£»

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+static SINT32 getVareIntValue(UINT32 *pFormatType, SINT32 swBase, va_list *vaList)

+{

+    SINT32 dwVal    = 0;

+    

+    if (*pFormatType & (1 << ZOSS_VSNFORMAT_LONG))

+    {

+        dwVal = va_arg(*vaList, unsigned long);

+    }

+    else

+    {

+        dwVal = va_arg(*vaList, unsigned int);

+    }

+

+    if ((*pFormatType & (1 << ZOSS_VSNFORMAT_PREFIX)) && (ZOSS_VSNFORMAT_HEX == swBase) && (0 != dwVal))

+    {

+        *pFormatType = *pFormatType | (1<< ZOSS_VSNFORMAT_HEXPREFIX);

+    }

+    

+    return dwVal;    

+}

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º translateNumberToStr

+ * ¹¦ÄÜÃèÊö£º ½«Êý×Öת»¯ÎªÊý×Ö×Ö·û´®£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              pAcBuf: »º´æµÄÖ¸Õ룻

+ *              dwVal: ÕûÐÎÊýÖµ£»

+ *              swBase: ÖÆÊ½£»

+ *            (OUT):

+ *              sdwSize: ת»¯ºóÊýÖµµÄ´óС£»

+ * ·µ »Ø Öµ£º ·µ»ØÊýÖµ´æ·ÅµÄµØÖ·£»

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+static CHAR *translateNumberToStr(CHAR *pAcBuf, SINT32 dwVal, SINT32 swBase, SINT32 *sdwSize)

+{

+    CHAR *pch = pAcBuf + ZOSS_VSNFORMAT_BUFF_SIZE;

+    

+    switch (swBase)

+    {

+    case ZOSS_VSNFORMAT__DECIMAL:                      /* 10½øÖÆÊä³ö */

+        {

+            while (dwVal >= ZOSS_VSNFORMAT__DECIMAL)

+            {

+                *--pch = (CHAR)ZOSS_VSNFORMAT_TOCHAR(dwVal % ZOSS_VSNFORMAT__DECIMAL);

+                dwVal /= ZOSS_VSNFORMAT__DECIMAL;

+            }

+            *--pch = (CHAR)ZOSS_VSNFORMAT_TOCHAR(dwVal);

+            break;

+        }

+    case ZOSS_VSNFORMAT_HEX:                            /* 16½øÖÆÊä³ö */

+        {

+            do

+            {

+                *--pch = BIG_HEX_DIGIT[dwVal & 15];

+                dwVal >>= 4;

+            }

+            while (dwVal);

+            break;

+        }       

+    default:

+        break;

+    }

+    *sdwSize = pAcBuf + ZOSS_VSNFORMAT_BUFF_SIZE - pch;

+    return pch;

+}

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º getStrLen

+ * ¹¦ÄÜÃèÊö£º »ñÈ¡¿É±ä×Ö·û´®µÄ³¤¶È£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              vaList: ¿É±ä²ÎÊý

+ *              pSdwSize: ¿É±ä²ÎÊýµÄ³¤¶È£»

+ *            (OUT):

+ * ·µ »Ø Öµ£º ·µ»Ø%ÔÚ×Ö·û´®µÄλÖã»

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+CHAR *getStrLen(va_list *vaList, SINT32 *pSdwSize)

+{

+    CHAR *pch  = (CHAR *)va_arg(*vaList, CHAR *);

+    

+    if (pch == NULL)

+    {

+        pch = NULLSTRING;

+    }

+    *pSdwSize = (SINT32)strlen((char *)pch);

+    return pch;

+}

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º getFormatType

+ * ¹¦ÄÜÃèÊö£º ½«Êý×Öת»¯ÎªÊý×Ö×Ö·û´®£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              swCh: ¸ñʽ»¯×Ö·û£»

+ *            (OUT):

+ *              pFormatType: ¸ñʽ»¯ÀàÐÍ£»

+ *              pSwBase: Êý¾ÝµÄÖÆÊ½

+ * ·µ »Ø Öµ£º ¸ñʽ»¯µÄ·µ»ØÖµÀàÐÍ£»

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+static T_zOss_FormatTypeRet getFormatType(SINT32 swCh, UINT32 *pFormatType, SINT32 *pSwBase)

+{

+    T_zOss_FormatTypeRet retType = FORMAT_TYPE_MAX;

+    

+    switch (swCh)

+    {

+    case '#':

+        {

+            *pFormatType = *pFormatType | (1 << ZOSS_VSNFORMAT_PREFIX);

+            retType = FORMAT_TYPE_CONTINUE;

+            break;

+        }

+    case 'l': 

+        {

+            *pFormatType = *pFormatType | (1 << ZOSS_VSNFORMAT_LONG);

+            retType = FORMAT_TYPE_CONTINUE;

+            break;

+        }

+    case 's':

+        {

+            retType = FORMAT_TYPE_PUTFMTSTR;

+            break;

+        }

+    case 'X':

+    case 'x':

+        {

+            *pSwBase    = ZOSS_VSNFORMAT_HEX;

+            retType     = FORMAT_TYPE_INTVALUE;

+        }

+        break;

+    case 'd':

+    case 'i':

+        {

+            *pSwBase = ZOSS_VSNFORMAT__DECIMAL;

+            retType = FORMAT_TYPE_INTVALUE;

+            break;

+        }

+    default:

+        {

+            break;

+        }

+    }

+    return retType;

+}

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º vsnformat

+ * ¹¦ÄÜÃèÊö£º ¸ñʽ»¯×Ö·û´®²¢Êä³öÖÁ»º³åÇø

+ * ²ÎÊý˵Ã÷£º (IN):

+ *                  dwMaxCount£º»º³åÇø´óС£¨°üÀ¨NULL½áÊø·û£©

+ *                  format    £ºÒªÊ¹Óõĸñʽ´®

+ *                  vaList    £º¿É±ä²ÎÊýÁбí

+ *            (OUT):

+ *                   pcBuffer  £ºÊä³ö»º³åÇø

+ * ·µ »Ø Öµ£º -1  £ºÊµ¼ÊÒªÊä³öµÄ×Ö½ÚÊý³¬³ö»º³åÇø´óС,ÆäËü£ºÊµ¼ÊÊä³öµÄ×Ö½ÚÊý¡£

+ * ÆäËü˵Ã÷£º ΪÁËM0°æ±¾Öƶ¨µÄ¹¦ÄÜ£¬²»Ö§³ÖºÜ¶àvsnformat¹¦ÄÜ£»

+ ******************************************************************************/

+static SINT32 vsnformat(CHAR *pcBuffer, UINT32 dwMaxCount, const CHAR *pcParamFormat, va_list vaList)

+{

+    SINT16      swCh;                                           /* È¡×ÔpcParamFormatµÄ×Ö·û */

+    CHAR        *pch;                                           /* ´¦Àí×Ö·ûµÄÖ¸Õë */

+    SINT32      dwVal;                                          /* ÕûÊý²ÎÊý %[diouxX] */

+    SINT32      sdwSize;                                        /* ÒªÊä³ö²ÎÊýµÄ³¤¶È */

+    SINT32      sdwRealSize;                                    /* ²ÎÊýµÄʵ¼ÊÊä³ö³¤¶È */

+    CHAR        acBuf[ZOSS_VSNFORMAT_BUFF_SIZE];                /* ´æ·ÅÕûÊý²ÎÊýµÄ»º´æ */

+    SINT32      sdwRet              = 0;                        /* Êä³ö¼ÆÊý */

+    SINT32      swBase              = ZOSS_VSNFORMAT__DECIMAL;  /* ÕûÐβÎÊýµÄÊä³öµÄ½øÖÆ */

+    SINT32      dwCount             = 0;                        /* ͳ¼ÆÊä³ö»º³åÇøµ±Ç°µÄ×Ö½ÚÊý */

+    CHAR        *pcOut              = pcBuffer;                 /* Êä³ö»º³åÇøÖ¸Õë */

+    UINT32      formatType          = 0;

+    T_zOss_FormatTypeRet retFmtType = FORMAT_TYPE_MAX;

+

+    zOss_ASSERT((NULL != pcBuffer) || (NULL != pcParamFormat));

+    for (;;)                                        /* ɨÃè¸ñʽ´®ÖеÄ%×Ö·û */

+    {

+        for (pch = (CHAR *)pcParamFormat; ((swCh = *pcParamFormat) != '\0') && (swCh != '%');

+                  pcParamFormat++) ;                /* ËÑË÷%×Ö·û */     

+

+        /* Êä³ö%ǰµÄÆäËü×Ö·û */ 

+        dwCount += pcParamFormat - pch;

+        memcpy(pcOut, pch, (UINT32)(pcParamFormat - pch));

+        pcOut +=  pcParamFormat - pch;

+        sdwRet +=  pcParamFormat - pch;

+        if ('\0' == swCh)

+        {

+            *pcOut = '\0';                          /* ²¹ÉÏNULL½áÊø·û */

+            return sdwRet;

+        }

+        pcParamFormat++;                            /* Ìø¹ý '%' */

+        /* Ñ­»·´¦Àíµ±Ç°%µÄÊä³ö¸ñʽ */   

+        for (;;)

+        {

+            swCh = *pcParamFormat++;

+            retFmtType = getFormatType(swCh,&formatType,&swBase);

+            if ((retFmtType == FORMAT_TYPE_INTVALUE) || (retFmtType == FORMAT_TYPE_PUTFMTSTR))

+            {

+                break;

+            }

+        }

+        if ((retFmtType == FORMAT_TYPE_INTVALUE))   /* »ñÈ¡±ä²ÎÖеÄÕûÐͲÎÊý */    

+        {

+            dwVal   = getVareIntValue(&formatType, swBase, &vaList);

+            pch     = translateNumberToStr(acBuf, dwVal, swBase, &sdwSize);

+        }

+        if (retFmtType == FORMAT_TYPE_PUTFMTSTR)

+            pch = getStrLen(&vaList, &sdwSize);

+        sdwRealSize = sdwSize;

+        if ( formatType & (1 << ZOSS_VSNFORMAT_HEXPREFIX))

+        {

+            sdwRealSize += ZOSS_VSNFORMAT_HEXPREFIX_LEN;

+            dwCount     += ZOSS_VSNFORMAT_HEXPREFIX_LEN;

+            *pcOut++    = '0';

+            *pcOut++    = (CHAR)swCh;

+        }

+        /* Êä³öʵ¼ÊµÄ¸ñʽ´®¾»ºÉ */

+        dwCount += (UINT32)sdwSize;

+        zOss_ASSERT(dwCount < dwMaxCount);

+        memcpy(pcOut, pch, (UINT32)sdwSize);

+        pcOut += sdwSize;

+        sdwRet += sdwRealSize;

+    }

+}

+

+/*******************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+*******************************************************************************/

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º sprintf

+ * ¹¦ÄÜÃèÊö£º ʵÏÖc¿âsprintf¹¦ÄÜ£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              s:      »º´æÖ¸Õ룻

+ *              format: ¸ñʽ»¯×Ö·û´®£»

+ *              ...   : ´ý¸ñʽ»¯Êý¾Ý£»

+ *            (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º Ϊm0°æ±¾¶¨ÖÆ£»

+ ******************************************************************************/

+int sprintf(char *s, const char *format, ...)

+{

+    int rc;      

+    va_list ap;  

+

+    va_start(ap, format); 

+    rc = vsnformat(s, ZOSS_INT_MAX, format, ap);

+    va_end(ap); 

+

+    return rc;

+} 

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º memcpy

+ * ¹¦ÄÜÃèÊö£º ʵÏÖc¿âmemcpy¹¦ÄÜ£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              pDst: Ä¿±êµØÖ·£»

+ *              pSrc: Ô´µØÖ·£»

+ *              n   : ³¤¶È£»

+ *            (OUT):

+ * ·µ »Ø Öµ£º ·µ»ØÄ¿±êµØÖ·pDst£»

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+void *memcpy(void *pDst, const void *pSrc, size_t n)

+{

+    char *pTmpDst = (char *)pDst;

+    const char *pTmpSrc = (const char *)pSrc;

+    

+    while (n--)

+    {

+        *pTmpDst++ = *pTmpSrc++;

+    } 

+    return pDst;

+}

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º memchr

+ * ¹¦ÄÜÃèÊö£º ʵÏÖc¿âmemcpy¹¦ÄÜ£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              pStr: Ä¿±ê×Ö·û´®Ö¸Õ룻

+ *              c   : ×Ö·û£»

+ *              n   : ³¤¶È£»

+ *            (OUT):

+ * ·µ »Ø Öµ£º ²éÕÒµÄ×Ö·ûµÄµØÖ·£»

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+void *memchr(const void *pStr, int c, size_t n)

+{

+    const unsigned char *pTmpStr = (const unsigned char *)pStr;   

+    

+    c &= 0xff;

+    while (n--)

+    {

+        if (*pTmpStr == c)

+        {

+            return (void *)pTmpStr;

+        }

+        pTmpStr++;

+    }

+    return NULL;

+}

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º memset

+ * ¹¦ÄÜÃèÊö£º ʵÏÖc¿âmemset¹¦ÄÜ£»

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              pStr: bufferµÄÖ¸Õ룻

+ *              c   : ·ûºÅ£»

+ *              n   : ×Ö·û´®µÄ³¤¶È£»

+ *            (OUT):

+ * ·µ »Ø Öµ£º ·µ»ØpStrÖ¸Õ룻

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+void *memset(void *pStr, int c, size_t n)

+{

+    char *pTmpStr = (char *)pStr;

+    

+    while (n-- != 0)

+    {

+        *pTmpStr++ = (char)c;

+    }

+    return pStr;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_comm.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_comm.c
new file mode 100644
index 0000000..9550f46
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_comm.c
@@ -0,0 +1,313 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump_comm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ramdumpµÄIO½Ó¿ÚʵÏÖ·â×°£»

+* ×÷    Õß :

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2014/03/25

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#ifdef _USE_CP_USB

+#include "oss_api.h"

+#include "drvs_usbPoll.h"

+#else

+#include "oss_api.h"

+#include "drvs_icp.h"

+#include "drv_api.h"

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýºÍ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+#ifndef _USE_CP_USB

+extern SINT32 zDrvRpMsg_CreateLockSaveChannel (T_ZDrvRpMsg_MsgActor actorID, T_ZDrvRpMsg_ChID chID, UINT32 size);

+extern SINT32 zDrvRpMsg_ReadLockIrq(const T_ZDrvRpMsg_Msg *pMsg);

+#endif

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_RAMDUMP_USB_POLL_CNT        100

+#define ZOSS_RAMDUMP_ICP_CHANNEL_SIZE   0x2800

+#define ZOSS_RAMDUMP_ICP_DATA_SIZE(len) (min((len),(ZOSS_RAMDUMP_ICP_CHANNEL_SIZE/2)))

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+#ifdef _USE_CP_USB

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpUsbInit

+ * ¹¦ÄÜÃèÊö£ºramdump USB ³õʼ»¯.

+ * ²ÎÊý˵Ã÷£º

+ *           (IN)

+ *              ÎÞ

+ *           (OUT)

+ *              ÎÞ

+ *·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+VOID zOss_RamdumpUsbInit(VOID)

+{

+    zDrvUsbPoll_Init();                 /* ³õʼ»¯USB        */

+    while (!zDrvUsbPoll_isConnect()) ;  /* ²éѯUSBÊÇ·ñÁ¬½Ó  */

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpUsbReadData

+ * ¹¦ÄÜÃèÊö£º¶ÁÖ¸¶¨Í¨µÀµÄÊý¾Ý.

+ * ²ÎÊý˵Ã÷£º

+ *           (IN)

+ *              buffer: ¶ÁÊý¾ÝµÄbufferÖ¸Õ룻

+ *              size  : ¶ÁÊý¾ÝµÄ´óС£»

+ *           (OUT)

+ *              ÎÞ

+ *·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+VOID zOss_RamdumpUsbReadData(UINT8 *buffer, UINT32 size)

+{

+    UINT32 count = 0;

+

+    do

+    {

+        zDrvUsbPoll_Isr();

+        count = (UINT32)zDrvUsbPoll_Read(buffer, size);

+        if( size <= count)

+        {

+            break;

+        }        

+        buffer += count;

+        size -=count;

+    }

+    while (size > 0);

+}

+

+/***************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpIoWriteData

+ * ¹¦ÄÜÃèÊö£ºÐ´Êý¾Ýµ½Ö¸¶¨Í¨µÀ.

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              buffer: ¶ÁÊý¾ÝµÄbufferÖ¸Õ룻

+ *              size  : ¶ÁÊý¾ÝµÄ´óС£»

+ *           (OUT):

+ *              ÎÞ£»

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+VOID zOss_RamdumpUsbWriteData(UINT8 *buffer, UINT32 size)

+{

+    UINT32 count = 0;

+

+    while (size > 0)

+    {

+        zDrvUsbPoll_Isr();

+        count = (UINT32)zDrvUsbPoll_Write(buffer, size);

+        if( size <= count)

+        {

+            break;

+        }

+        

+        buffer += count;

+        size -=count;

+    }

+}

+

+/***************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpIoFinish

+ * ¹¦ÄÜÃèÊö£ºRamdumpÎļþ´«Êä½áÊø£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+VOID zOss_RamdumpUsbFinish(VOID)

+{

+    UINT32  i;

+    

+    for (i = 0; i < ZOSS_RAMDUMP_USB_POLL_CNT; i++)  /* µÈ´ýÊý¾Ý·¢ËÍÍêºó£¬ÔÙÖØÆô */

+    {

+        zDrvUsbPoll_Isr();

+    }

+}

+

+/***************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpSetUsbOpt

+ * ¹¦ÄÜÃèÊö£ºÉèÖÃUsbͨµÀ;

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+VOID zOss_RamdumpSetUsbOpt(VOID)

+{

+    T_zOss_RamdumpIoOpt hook = {zOss_RamdumpUsbInit, zOss_RamdumpUsbReadData, zOss_RamdumpUsbWriteData, zOss_RamdumpUsbFinish};

+

+    zOss_RamdumpSetIoOpt(hook);

+    return;

+}

+#else

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpIcpReadData

+ * ¹¦ÄÜÃèÊö£º¶ÁÖ¸¶¨Í¨µÀµÄÊý¾Ý.

+ * ²ÎÊý˵Ã÷£º

+ *           (IN)

+ *              buffer: ¶ÁÊý¾ÝµÄbufferÖ¸Õ룻

+ *              size  : ¶ÁÊý¾ÝµÄ´óС£»

+ *           (OUT)

+ *              ÎÞ

+ *·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+static VOID zOss_RamdumpIcpReadData(UINT8 *buffer, UINT32 size)

+{

+    T_ZDrvRpMsg_Msg icpMsg = {0};

+    UINT8  *pBuf           = buffer;

+    SINT32 retCode         = RPMSG_CHANNEL_NOMSG;

+    

+    icpMsg.actorID = ICP_MSG_ACTOR_A9;

+    icpMsg.chID    = RAMDUMP;

+    icpMsg.buf     = buffer;

+    icpMsg.len     = size;

+    icpMsg.flag    |= RPMSG_READ_POLL;

+    

+    do

+    {

+        retCode = zDrvRpMsg_ReadLockIrq(&icpMsg);

+        if(retCode != RPMSG_CHANNEL_NOMSG)

+        {

+            if( size <= icpMsg.len)

+            {

+                break;

+            }

+            pBuf       =  icpMsg.buf;

+            pBuf       += icpMsg.len;

+            icpMsg.buf =  pBuf;

+            size       -= icpMsg.len;

+            icpMsg.len =  size;

+        }        

+    }while (size > 0);

+}

+

+/***************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpIcpWriteData

+ * ¹¦ÄÜÃèÊö£ºÐ´Êý¾Ýµ½Ö¸¶¨Í¨µÀ.

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              buffer: ¶ÁÊý¾ÝµÄbufferÖ¸Õ룻

+ *              size  : ¶ÁÊý¾ÝµÄ´óС£»

+ *           (OUT):

+ *              ÎÞ£»

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+static VOID zOss_RamdumpIcpWriteData(UINT8 *buffer, UINT32 size)

+{

+    T_ZDrvRpMsg_Msg icpMsg = {0};

+    SINT32 retCode         = RPMSG_SPACE_NOT_ENOUGH;

+        

+    icpMsg.actorID  = ICP_MSG_ACTOR_A9;

+    icpMsg.chID     = RAMDUMP;

+    icpMsg.buf      = buffer;

+    icpMsg.len      = ZOSS_RAMDUMP_ICP_DATA_SIZE(size);

+    icpMsg.flag     |= RPMSG_WRITE_INT;

+

+    do

+    {

+        retCode = zDrvRpMsg_WriteLockIrq(&icpMsg);

+        if(retCode>0)

+        {

+            buffer      += retCode;

+            size        -= retCode;

+            icpMsg.buf  = buffer;

+            icpMsg.len  = ZOSS_RAMDUMP_ICP_DATA_SIZE(size);

+        }

+    }while ((retCode == RPMSG_SPACE_NOT_ENOUGH)||(size > 0));

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpIcpInit

+ * ¹¦ÄÜÃèÊö£ºramdump Icp ³õʼ»¯.

+ * ²ÎÊý˵Ã÷£º

+ *           (IN)

+ *              ÎÞ

+ *           (OUT)

+ *              ÎÞ

+ *·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+static VOID zOss_RamdumpIcpInit(VOID)

+{

+    SINT32 retCode  = DRV_SUCCESS;

+    UINT8  pBuff[]  = "ramdump";

+    

+    retCode = zDrvRpMsg_CreateLockSaveChannel(ICP_MSG_ACTOR_A9, RAMDUMP, ZOSS_RAMDUMP_ICP_CHANNEL_SIZE);

+    zOss_ASSERT(retCode == DRV_SUCCESS);

+

+    /*ÏòͨµÀÖÐдÈëµÚÒ»°üÊý¾Ý±íʾÇëÇó½¨Á¢Í¨ÐÅ*/

+    zOss_RamdumpIcpWriteData(pBuff, strlen((const char *)pBuff));    

+}

+

+/***************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpIcpFinish

+ * ¹¦ÄÜÃèÊö£ºRamdumpÎļþ´«Êä½áÊø£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+static VOID zOss_RamdumpIcpFinish(VOID)

+{

+

+}

+

+/***************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpSetIcpOpt

+ * ¹¦ÄÜÃèÊö£ºÉèÖÃICPͨµÀ;

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+VOID zOss_RamdumpSetIcpOpt(VOID)

+{

+    T_zOss_RamdumpIoOpt hook = {zOss_RamdumpIcpInit, zOss_RamdumpIcpReadData, zOss_RamdumpIcpWriteData, zOss_RamdumpIcpFinish};

+	

+    zOss_RamdumpSetIoOpt(hook);

+    return;

+}

+#endif

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_cortexm.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_cortexm.c
new file mode 100644
index 0000000..690bab7
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_cortexm.c
@@ -0,0 +1,100 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump_cortextm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Éú³ÉramdumpµÄarmv6-mÌåϵ½á¹¹µÄcmm½Å±¾Îļþ£»

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2013/07/19

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ¸ß»ª·å

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é              

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_ramdump.h"

+#include "tos_except_cortexm.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_NORMAL_REG_NUM         13

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+struct cpu_core g_zRamdumpRegisters = {0};

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/*******************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpCreateCmmFile

+ * ¹¦ÄÜÃèÊö£º Éú³É»Ö¸´¶ÑÕ»µÄT32½Å±¾

+ * ²ÎÊý˵Ã÷£º (IN):

+ *              pCmmFileInfo: cmm½Å±¾ÎļþÐÅÏ¢Ö¸Õ룻

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ******************************************************************************/

+VOID zOss_RamdumpCreateCmmFile(T_zOss_RamdumpCmmFileInfo  *pCmmFileInfo)

+{

+    CHAR    *cmmAddress = NULL;

+    UINT32  i           = 0;

+    

+    cmmAddress = pCmmFileInfo->cmmFileBuffer;   

+    cmmAddress += sprintf(cmmAddress, "ENTRY &%s\r\n", ZOSS_RAMDUMP_DIR_NAME);

+    cmmAddress += sprintf(cmmAddress, "r.s control %#lx\r\n", g_zRamdumpRegisters.control);	

+    cmmAddress += sprintf(cmmAddress, "r.s pc %#lx\r\n", g_zRamdumpRegisters.lr);

+    cmmAddress += sprintf(cmmAddress, "r.s xpsr %#lx\r\n", g_zRamdumpRegisters.psr);

+    cmmAddress += sprintf(cmmAddress, "r.s primask %#lx\r\n", g_zRamdumpRegisters.primask);

+    cmmAddress += sprintf(cmmAddress, "r.s r13 %#lx\r\n", g_zRamdumpRegisters.sp);

+

+    for(i = 0; i < ZOSS_NORMAL_REG_NUM; i++)

+    {

+        cmmAddress += sprintf(cmmAddress, "r.s r%d %#lx\r\n", (int)i, g_zRamdumpRegisters.r[i]);

+    }

+    

+    cmmAddress = zOss_RamdumpCreateRegionsCmmFile(cmmAddress);

+    cmmAddress += sprintf(cmmAddress, "ENDDO\r\n");     /*Êä³ö½áÊø·û*/

+    pCmmFileInfo->cmmFileSize = (UINT32)(cmmAddress - pCmmFileInfo->cmmFileBuffer);

+    zOss_AssertExN(pCmmFileInfo->cmmFileSize <= pCmmFileInfo->cmmFileMaxSize);

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_csky.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_csky.c
new file mode 100644
index 0000000..5a64081
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_csky.c
@@ -0,0 +1,129 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump_csky.c

+* Ïà¹ØÎļþ : Éú³Éck610Ìåϵ½á¹¹µÄcmm½Å±¾Îļþ

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2013/07/19

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : ¸ß»ª·å

+* ÐÞ¸ÄÈÕÆÚ : 2012/10/10

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é              

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "sup_ramdump.h"

+#ifdef _OS_TOS

+#include "tos_except_arm.h"

+#elif defined (_OS_LINUX)

+#include "linux_except_arm.h"

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZRAMDUMP_REGS_TOTAL_CNT     80

+#define ZRAMDUMP_NORMAL_REGS_CNT    16

+#define ZRADMUMP_CTRL_REGS_CNT      22   

+           

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+tos_except_register_t  *g_zEceptRegister                            = NULL;

+volatile UINT32         g_zRamdumpAdrress[ZRAMDUMP_REGS_TOTAL_CNT]  = {0};  /* ±£´æ¼Ä´æÆ÷ÐÅÏ¢       */

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpCreateCmmFile

+ * ¹¦ÄÜÃèÊö£º Éú³É»Ö¸´¶ÑÕ»µÄcds½Å±¾

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ **************************************************************************/

+VOID zOss_RamdumpCreateCmmFile(T_zOss_RamdumpCmmFileInfo  *pCmmFileInfo)

+{

+    UINT32  regIndex    = 0;

+    CHAR    *cmmAddress = pCmmFileInfo->cmmFileBuffer; 

+    UINT32  i           = 0;

+

+    g_zEceptRegister    = tos_dump_except_register();

+    if (g_zEceptRegister != NULL)

+    {

+        zOss_Memcpy((VOID *)g_zRamdumpAdrress,g_zEceptRegister,sizeof(tos_except_register_t));

+    }

+

+    cmmAddress += sprintf(cmmAddress, "ENTRY &%s\r\n", ZOSS_RAMDUMP_DIR_NAME);

+    cmmAddress += sprintf(cmmAddress, "restore  %s binary %#lx\r\n",RAM_NAME, (UINT32)_ram_start);

+

+    /* Êä³ö¿ØÖƼĴæÆ÷, g_zRamdumpAdrress µØÖ·Ç°Ãæ±£´æµÄÊÇr0-r15,ËùÒÔregIndexÊÇ´Ó16¿ªÊ¼µÄ */

+    regIndex = ZRAMDUMP_NORMAL_REGS_CNT;

+    if (g_zEceptRegister != NULL)

+    {

+        cmmAddress += sprintf(cmmAddress,"set $cr0 = %#lx\r\n", (int)g_zEceptRegister->epsr);

+        regIndex++;

+    }

+    else

+    {

+        cmmAddress += sprintf(cmmAddress, "set $cr0 = %#lx\r\n", g_zRamdumpAdrress[regIndex++]);

+    }

+

+    for (i = 1; i < ZRADMUMP_CTRL_REGS_CNT; i++)

+    {

+        if (i == ZRAMDUMP_NORMAL_REGS_CNT)

+        {

+            continue;

+        }

+        cmmAddress += sprintf(cmmAddress,"set $cr%d =  %#lx\r\n", (int)i, g_zRamdumpAdrress[regIndex++]);

+    }

+    /* Êä³ör0-r15 */

+    regIndex = 0;

+    for (i = 0; i < ZRAMDUMP_NORMAL_REGS_CNT; i++)

+    {

+        cmmAddress += sprintf(cmmAddress, "set  $r%d =  %#lx\r\n", (int)i, g_zRamdumpAdrress[regIndex++]);

+    }

+    if (g_zEceptRegister != NULL)

+    {

+        cmmAddress += sprintf(cmmAddress, "set  $pc =  %#lx\r\n",(unsigned int)g_zEceptRegister->epc );

+    }

+    else

+    {

+        cmmAddress += sprintf(cmmAddress, "set  $pc =  %#lx\r\n",  g_zRamdumpAdrress[--regIndex]);

+    }

+    pCmmFileInfo->cmmFileSize = (UINT32)(cmmAddress - pCmmFileInfo->cmmFileBuffer);

+    zOss_AssertExN(pCmmFileInfo->cmmFileSize <= pCmmFileInfo->cmmFileMaxSize);

+}

+

+#ifdef __cplusplus

+}

+#endif

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramdump_server.c b/cp/ps/plat/src/oss/sup/src/sup_ramdump_server.c
new file mode 100644
index 0000000..6e5ac02
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramdump_server.c
@@ -0,0 +1,1408 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : 

+* ÎÄ ¼þ Ãû : sup_ramdump_server.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : 

+* ×÷    Õß : ÎâÕý¾ü

+* °æ    ±¾ : 1.0

+* Íê³ÉÈÕÆÚ : 2013/07/19

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_ramdump.h"

+#include "sys_func_atcfg.h"

+#include "sys_com.h"

+#include "drvs_usbPoll.h"

+#include "ram_config.h"

+#include "drvs_icp.h"

+

+#if defined (_USE_ARM1_RAMDUMP) || defined (_USE_ZSP_RAMDUMP)

+#include "ps_ephy_interface.h"

+#include "drv_api.h"

+#endif

+

+#ifdef _OS_TOS

+#include <cyg/hal/tos_cache.h>

+#include <cyg/hal/tos_arm_mmu.h>

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýºÍ±äÁ¿ÉùÃ÷Çø

+**************************************************************************/

+#ifdef __GNUC__

+# ifdef _OS_LINUX

+#define _ramdump_size 0x6000

+char _ramdump_array[_ramdump_size];

+#define _ramdump_start (_ramdump_array)

+# else

+extern char _ramdump_start[];

+extern char _ramdump_size[];

+# endif

+#elif defined (__ARMCC_VERSION)

+extern  char Image$$RAMDUMP$$ZI$$Base[];    

+extern  char Image$$RAMDUMP$$ZI$$Limit[];   

+

+#define _ramdump_start  Image$$RAMDUMP$$ZI$$Base                              

+#define _ramdump_size   (Image$$RAMDUMP$$ZI$$Limit - Image$$RAMDUMP$$ZI$$Base)

+#endif

+

+extern SINT32 zDrvIcp_ClearState(T_HalIcp_MsgActor actor, T_HalIcp_Dword bit_map);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+T_zOss_RamdumpOpt           g_zRamdump_Optfunc       = {NULL,NULL};

+T_zOss_RamdumpServerInfo    g_zRamdump_ServerInfo    = {0};

+

+#define ZRAMDUMP_SERVER_FILE    "sup_ramdump_server.con"

+#define ZRAMDUMP_CLIENT_ICP_TABLE(srcModId,desModId,low_word,high_word)

+#define ZRAMDUMP_AGENT_ICP_TABLE(srcModId,desModId,low_word,high_word)

+#define ZRAMDUMP_SERVER_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize)

+#undef  ZRAMDUMP_CLIENT_ICP_TABLE

+#define ZRAMDUMP_CLIENT_ICP_TABLE(srcModId,desModId,low_word,high_word)                  \

+                      {(srcModId),(desModId),{low_word,high_word}},

+T_zOss_RamdumpIcpInfo g_zRamdump_ClientIcpInfo[] = 

+{

+    #include ZRAMDUMP_SERVER_FILE

+};

+

+#undef  ZRAMDUMP_CLIENT_ICP_TABLE

+#define ZRAMDUMP_CLIENT_ICP_TABLE(srcModId,desModId,low_word,high_word)

+#undef  ZRAMDUMP_AGENT_ICP_TABLE

+#define ZRAMDUMP_AGENT_ICP_TABLE(srcModId,desModId,low_word,high_word)                   \

+                      {(srcModId),(desModId),{low_word,high_word}},

+static T_zOss_RamdumpIcpInfo   s_zRamdump_AgentIcpInfo[] = 

+{

+    #include ZRAMDUMP_SERVER_FILE

+};

+

+#undef  ZRAMDUMP_AGENT_ICP_TABLE

+#define ZRAMDUMP_AGENT_ICP_TABLE(srcModId,desModId,low_word,high_word)

+#undef  ZRAMDUMP_SERVER_MEM_TABLE

+#define ZRAMDUMP_SERVER_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize)     \

+                              (UINT32)(identifier), (CHAR*)(pRamdumpStartAddr), \

+                              (UINT32)(ramdumpSize)

+static T_zOss_RamdumpServerConInfo  s_zRamdump_ServerCfgInfo = 

+{

+    #include ZRAMDUMP_SERVER_FILE

+};

+#undef  ZRAMDUMP_SERVER_MEM_TABLE

+#define ZRAMDUMP_SERVER_MEM_TABLE(identifier,pRamdumpStartAddr,ramdumpSize)

+static T_zOss_RamdumpClientInfo **s_zRamdump_ClientInfo = NULL;

+static T_zOss_RamdumpExceptInfo s_zRamdump_ExceptCore   = {FALSE, 0};

+static BOOL                     s_zRamdump_InitFlag     = FALSE;

+#ifdef _USE_ARM1_RAMDUMP

+static BOOL                     s_zRamdump_Arm1WaitFlag = FALSE;

+#endif

+

+static T_zOss_RamdumpIoOpt  g_zRamdumpIoOpt;

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* io read/write buffer: [msg][data] */

+#define ZOSS_RAMDUMP_IO_DATA_BASE(addr)         ((UINT32)addr + 4)

+#define ZOSS_RAMDUMP_ICP_CLIENT_SIZE            0X24

+#define ZOSS_RAMDUMP_ICP_AGENT_SIZE             0X24

+#define ZOSS_RAMDUMP_DELAYTIME_CNT              2500   

+

+#ifdef _USE_ARM1_RAMDUMP

+#define ZOSS_RAMDUNP_PHY_INFO_BASE              0x24A60000

+#define ZOSS_RAMDUMP_PHY_COREDID                0XFF

+#define ZOSS_RAMDUMP_FLAG_ARM02ARM1_SIZE        4

+#define ZOSS_RAMDUMP_FLAG_ARM12ARM0_SIZE        4

+#define ZOSS_RAMDUMP_CMM_BUFFER_SIZE            4096

+#define ZOSS_RAMDUMP_CFG_REGIONS_SIZE           4096

+#define ZOSS_RAMDUMP_PARSED_REGIONS_SIZE        4096

+#define ZOSS_RAMDUMP_FILE_SIZE                  2048

+#define ZOSS_RAMDUMP_ERROR_FILE_SIZE            1024

+#define ZOSS_RAMDUMP_ARM1_NAME                  "arm1_memory.bin"

+#define ZOSS_RAMDUMP_ARM1_CMM_INFO_BASE         0x24A60000

+#define ZOSS_RAMDUMP_CFG_REGION_BASE            (ZOSS_RAMDUMP_ARM1_CMM_INFO_BASE + ZOSS_RAMDUMP_CMM_BUFFER_SIZE)

+#define ZOSS_RAMDUMP_ARM1_PARSED_REGION_BASE    (ZOSS_RAMDUMP_CFG_REGION_BASE + ZOSS_RAMDUMP_CFG_REGIONS_SIZE)

+#define ZOSS_RADMUMP_ARM1_ERROR_FILE_BASE       (ZOSS_RAMDUMP_ARM1_PARSED_REGION_BASE + ZOSS_RAMDUMP_PARSED_REGIONS_SIZE)

+#define ZOSS_RAMDUMP_ARM1_FLAG_ARM02ARM1_BASE   (ZOSS_RADMUMP_ARM1_ERROR_FILE_BASE + ZOSS_RAMDUMP_ERROR_FILE_SIZE)

+#define ZOSS_RAMDUMP_ARM1_FLAG_ARM12ARM0_BASE   (ZOSS_RAMDUMP_ARM1_FLAG_ARM02ARM1_BASE + ZOSS_RAMDUMP_FLAG_ARM02ARM1_SIZE)

+#define ZOSS_RAMDUMP_CMM_FILE_BUF_SIZE(addr)    (*(UINT32 *)addr)

+#define ZOSS_RAMDUMP_CMM_FILE_BUF_BASE(addr)    ((UINT32)addr + 4)

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID ramdump_TransferData(VOID);

+static VOID ramdump_GetAvailableRegion(T_zOss_RamdumpRegion *pCfgInfo, T_zOss_RamdumpRegionInfo *pParsedInfo);

+static VOID ramdump_ParseRegionInfo(T_zOss_RamdumpRegionInfo *pCfgInfo, T_zOss_RamdumpRegionInfo *pParsedInfo);

+static VOID ramdump_SaveFileInfo(const CHAR *name, UINT32 baseServer, UINT32 size);

+static VOID ramdump_SaveRegionFileInfo(T_zOss_RamdumpRegionInfo *pRegionInfo, const CHAR *pFileName);

+static VOID ramdump_SaveAgentFileInfo(const CHAR *name, UINT32 baseServer, UINT32 size );

+static VOID ramdump_SaveAllFilesInfo(VOID);

+static VOID ramdump_Main(VOID);

+#if defined (_OS_TOS) && defined (CYGOPT_HAL_ARM_MMU)

+static VOID ramdump_GetConfigRegion(VOID);

+#endif

+static VOID ramdump_SetPartition(VOID);

+static VOID except_RecordExceptInfo(UINT32 exceptCoreID);

+static BOOL ramdump_delay(UINT32 ms, volatile UINT32 *addr, UINT32 flag);

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef _USE_ARM1_RAMDUMP

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_CheckArm1InitFinish

+ * ¹¦ÄÜÃèÊö£ºÅжÏarm1³õʼ»¯ÊÇ·ñ³õʼ»¯Íê³É£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static BOOL ramdump_CheckArm1InitFinish(VOID)

+{

+    return (*(volatile UINT32 *)ZOSS_RAMDUMP_ARM1_FLAG_ARM12ARM0_BASE == 0);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ProcessMsgFromArm1

+ * ¹¦ÄÜÃèÊö£ºserver ´¦Àíarm1µÄICPÏûÏ¢º¯Êý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ProcessMsgFromArm1(const T_HalIcp_Msg *pMsg)

+{

+    T_HalIcp_Dword state = { 0 };

+   

+    zDrvIcp_GetState(ICP_MSG_ACTOR_ARM, &state);

+    zDrvIcp_ClearState(ICP_MSG_ACTOR_ARM, state);

+    except_RecordExceptInfo(ZOSS_RAMDUMP_PHY_COREDID);

+    sprintf((char *)g_zRamdump_ServerInfo.pErrInfo->pBuff, "%d_s_core: force error!\n", (int)s_zRamdump_ServerCfgInfo.serverId);

+#ifdef _OS_LINUX

+    linux_ramdump_entry();

+#else

+    zOss_RamdumpHandle(1, 1, 1);

+#endif

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_Arm1Init

+ * ¹¦ÄÜÃèÊö£ºarm1³õʼ»¯£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_Arm1Init(VOID)

+{

+    *(volatile UINT32 *)ZOSS_RAMDUMP_ARM1_FLAG_ARM02ARM1_BASE = 0;

+#ifdef _OS_TOS

+    TOS_CACHE_CLEAN_ALL();

+#endif

+    zDrvIcp_RegCallback(ICP_ARM0_MODULE_ID_OS, ICP_ARM1_MODULE_ID_OS, ramdump_ProcessMsgFromArm1, ICP_ISR_CALLBACK); 

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SendMsgToArm1

+ * ¹¦ÄÜÃèÊö£ºÏòarm1·¢ËÍICPÏûÏ¢£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SendMsgToArm1(UINT32 exceptType)

+{

+    T_HalIcp_Msg icpMsg = { 0 };

+   

+    icpMsg.SrcModId          = ICP_ARM0_MODULE_ID_OS;

+    icpMsg.desModId          = ICP_ARM1_MODULE_ID_OS;

+    icpMsg.len               = exceptType;

+    icpMsg.IntInfo.high_word = ZPLAT_PS2PHY_RAMDUMP_INT_ICP_CF;

+    zDrvIcp_SendMsg( (const T_HalIcp_Msg *)&icpMsg );

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_GetArm1AvailableRegion

+ * ¹¦ÄÜÃèÊö£º¶ÔĬÈÏÅäÖõÄÄÚ´æ¿éÊý¾ÝÓëMMU½âÎöµÄÄÚ´æ¿éÊý¾Ý¶Ô±È£¬

+             ±£´æ¿Éµ¼³öÀ´µÄÄÚ´æ¿é

+ * ²ÎÊý˵Ã÷£º(IN): 

+ *              pCfgInfo:    ÅäÖõĵØÖ·ÐÅÏ¢Ö¸Õ룻

+ *              pParsedInfo: ½âÎöºóµÄµØÖ·ÐÅÏ¢Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_GetArm1AvailableRegion(T_zOss_RamdumpArm1Region *pCfgInfo, T_zOss_RadmumpArm1RegionInfo *pParsedInfo)

+{

+    UINT32                   i             = 0;

+    T_zTos_MmuRamdumpTable   mmuTable      = { 0 };

+    T_zOss_RamdumpArm1Region *pParseRegion = &(pParsedInfo->regions[0]);

+    

+    if (zTos_MmuGetMappingRegion(pCfgInfo->startAddr, (pCfgInfo->endAddr - pCfgInfo->startAddr + 1), &mmuTable))

+    {

+        for (i= 0; i < mmuTable.count; i++, pParsedInfo->regionNum++)

+        {

+            pParseRegion[pParsedInfo->regionNum].startAddr = mmuTable.item[i].virBase;

+            pParseRegion[pParsedInfo->regionNum].mapAddr   = pCfgInfo->startAddr != pCfgInfo->mapAddr ?

+                                                             (pCfgInfo->mapAddr + mmuTable.item[i].phyBase - pCfgInfo->startAddr) : mmuTable.item[i].virBase;

+            pParseRegion[pParsedInfo->regionNum].copyAddr  = pCfgInfo->copyAddr != 0 ? (pCfgInfo->copyAddr + mmuTable.item[i].phyBase - pCfgInfo->startAddr) : 0;

+            pParseRegion[pParsedInfo->regionNum].endAddr   = mmuTable.item[i].virBase + mmuTable.item[i].size - 1;  

+        }

+    } 

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ParseArm1RegionInfo

+ * ¹¦ÄÜÃèÊö£º½âÎöÄÚ´æ¿éÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN): 

+ *              pCfgInfo:    ÅäÖÃÇøÓòÊý¾ÝÐÅÏ¢Ö¸Õ룻

+ *              pParsedInfo: ½âÎöÇøÓòÊý¾ÝÐÅÏ¢Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ParseArm1RegionInfo(T_zOss_RadmumpArm1RegionInfo *pCfgInfo, T_zOss_RadmumpArm1RegionInfo *pParsedInfo)

+{   

+    UINT32  i = 0;

+

+    for (i = 0; i < pCfgInfo->regionNum; i++)

+    {

+        ramdump_GetArm1AvailableRegion(&(pCfgInfo->regions[i]), pParsedInfo);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveArm1RegionFileInfo

+ * ¹¦ÄÜÃèÊö£º±£´æarm1 RegionÎļþÐÅÏ¢£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              pRegionInfo: ½âÎöºóµÄÊý¾Ý¶ÎµÄÖ¸Õ룻

+ *              pFileName  : ÎļþÃû×Ö£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveArm1RegionFileInfo(T_zOss_RadmumpArm1RegionInfo *pRegionInfo, const CHAR *pFileName)

+{

+    UINT32               i                               = 0;

+    CHAR                 name[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    T_zOss_RamdumpRegion serverRegion                    = { 0 };

+   

+    for (i = 0; i < pRegionInfo->regionNum; i++)

+    {

+        serverRegion.baseForServer = pRegionInfo->regions[i].startAddr;

+        serverRegion.baseForSelf   = pRegionInfo->regions[i].mapAddr;

+        serverRegion.baseForCopy   = pRegionInfo->regions[i].copyAddr;

+        serverRegion.size          = pRegionInfo->regions[i].endAddr - pRegionInfo->regions[i].startAddr + 1;

+        sprintf(name, "%s_%d", pFileName, (int)i);

+        ramdump_SaveFileInfo(name, serverRegion.baseForServer, serverRegion.size);

+        ramdump_SaveAgentFileInfo(name, serverRegion.baseForServer, serverRegion.size);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveArm1FilesInfo

+ * ¹¦ÄÜÃèÊö£º±£´æarm1 ÎļþÐÅÏ¢£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveArm1FilesInfo(VOID)

+{

+    if (s_zRamdump_Arm1WaitFlag)

+    {

+        ramdump_SaveArm1RegionFileInfo((T_zOss_RadmumpArm1RegionInfo *)ZOSS_RAMDUMP_ARM1_PARSED_REGION_BASE, ZOSS_RAMDUMP_ARM1_NAME);

+        ramdump_SaveFileInfo("arm1_targetstate.cmm", ZOSS_RAMDUMP_CMM_FILE_BUF_BASE(ZOSS_RAMDUMP_ARM1_CMM_INFO_BASE), 

+                             ZOSS_RAMDUMP_CMM_FILE_BUF_SIZE(ZOSS_RAMDUMP_ARM1_CMM_INFO_BASE));

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ProcessArm1Exception

+ * ¹¦ÄÜÃèÊö£º´¦ÀíArm1Òì³££»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ProcessArm1Exception(VOID)

+{

+    if (ramdump_CheckArm1InitFinish())

+    {

+        UINT32 delayTimeLen = 1000;      /* ʱ¼ä´óÔ¼ÔÚ1s×óÓÒ*/

+        ramdump_ParseArm1RegionInfo((T_zOss_RadmumpArm1RegionInfo *)ZOSS_RAMDUMP_CFG_REGION_BASE, (T_zOss_RadmumpArm1RegionInfo *)ZOSS_RAMDUMP_ARM1_PARSED_REGION_BASE);

+        *(volatile UINT32 *)ZOSS_RAMDUMP_ARM1_FLAG_ARM02ARM1_BASE = ZOSS_RAMDUMP_FLAG_SECOND_VALUE;    

+#ifdef _OS_TOS

+        TOS_CACHE_CLEAN_ALL();

+#endif

+        s_zRamdump_Arm1WaitFlag = ramdump_delay(delayTimeLen, (UINT32 *)ZOSS_RAMDUMP_ARM1_FLAG_ARM12ARM0_BASE, ZOSS_RAMDUMP_FLAG_SECOND_VALUE);

+    }

+}

+

+#endif

+

+#ifdef _USE_ZSP_RAMDUMP

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ZspRegionCfg

+ * ¹¦ÄÜÃèÊö£ºzsp µ¼³öÇøÓòÅäÖã»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ZspRegionCfg(VOID)

+{

+    T_ZDrvSys_PowerOn_Type powOnType;

+

+    powOnType = zDrvComm_GetPowerOnState();

+    if(POWER_ON_FOTA == powOnType || POWER_ON_CHARGING == powOnType)

+        return;   

+

+    ramdump_SaveFileInfo("DTCM.bin", RAMDUMP_ZSP_DTCM_BASE, RAMDUMP_ZSP_DTCM_SIZE);

+    ramdump_SaveFileInfo("DDDR.bin", RAMDUMP_ZSP_DDDR_BASE, RAMDUMP_ZSP_DDDR_SIZE);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SendMsgToZsp

+ * ¹¦ÄÜÃèÊö£ºÏòzsp·¢ËÍICPÏûÏ¢£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º ·¢ËÍicpÏûÏ¢£¬Í¨Öªzsp²»ÒªÐÝÃߣ¬ÒÔ·À˯ÃßzspʱµÄÄÚ´æ²»ÄÜ·ÃÎÊ£»

+**************************************************************************/

+static VOID ramdump_SendMsgToZsp(VOID)

+{

+    T_HalIcp_Msg icpMsg = { 0 };

+   

+    icpMsg.SrcModId          = ICP_ARM0_MODULE_ID_OS;

+    icpMsg.desModId          = ICP_ARM1_MODULE_ID_OS;

+ //   icpMsg.len               = exceptType;

+    icpMsg.IntInfo.high_word = ZPLAT_PS2PHY_RAMDUMP_INT_ICP_CF;

+    zDrvIcp_SendMsg((const T_HalIcp_Msg *)&icpMsg);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ProcessMsgFromZsp

+ * ¹¦ÄÜÃèÊö£ºserver ´¦ÀízspµÄICPÏûÏ¢º¯Êý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ProcessMsgFromZsp(const T_HalIcp_Msg *pMsg)

+{

+    T_HalIcp_Dword  state   = { 0 };

+

+    zDrvIcp_GetState(ICP_MSG_ACTOR_ARM, &state);

+    zDrvIcp_ClearState(ICP_MSG_ACTOR_ARM, state);

+    sprintf((char *)g_zRamdump_ServerInfo.pErrInfo->pBuff, "zsp: exact error!\n");

+#ifdef _OS_LINUX

+    linux_ramdump_entry();

+#else

+    zOss_RamdumpHandle(1, 1, 1);

+#endif

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ZspInit

+ * ¹¦ÄÜÃèÊö£ºzsp³õʼ»¯£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ZspInit(VOID)

+{

+    zDrvIcp_RegCallback(ICP_ARM0_MODULE_ID_OS, ICP_ARM1_MODULE_ID_OS, ramdump_ProcessMsgFromZsp, ICP_ISR_CALLBACK); 

+}

+

+#endif

+

+/******************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_TransferData

+ * ¹¦ÄÜÃèÊö£ºÓëPC²à¹¤¾ß½øÐн»»¥£¬´«µÝÐèÒª±£´æµÄÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ *******************************************************************************/

+static VOID ramdump_TransferData(VOID)

+{

+    UINT32             rspDataLen = 0;            

+    CHAR               *reqBuffer = (CHAR *)g_zRamdump_ServerInfo.pIoReadbuf->pBuff;

+    CHAR               *rspBuffer = (CHAR *)g_zRamdump_ServerInfo.pIoWritebuf->pBuff;

+    UINT32             *reqCmd    = (UINT32 *)reqBuffer;

+    UINT32             *rspCmd    = (UINT32 *)rspBuffer;

+    T_zOss_RamdumpFile *fileInfo  = g_zRamdump_ServerInfo.pFileInfo->fileInfo;

+    

+    g_zRamdumpIoOpt.init();

+

+    for(;;)

+    {

+        g_zRamdumpIoOpt.read((UINT8 *)reqBuffer, ZOSS_RAMDUMP_CMD_BUFFER_LEN);      

+        switch (*reqCmd)

+        {

+        case ZOSS_RAMDUMP_FILE_LINK_REQ:            /* ͬ²½ÇëÇó */

+            {

+                T_zOss_RamumpFileLinkRsp *rspMsg = (T_zOss_RamumpFileLinkRsp *)ZOSS_RAMDUMP_IO_DATA_BASE(rspBuffer);

+                *rspCmd = ZOSS_RAMDUMP_FILE_LINK_RSP;

+                

+                rspMsg->fileNum = g_zRamdump_ServerInfo.pFileInfo->fileNum;

+                rspDataLen = sizeof(*rspCmd) + sizeof(T_zOss_RamumpFileLinkRsp);

+                break;

+            }

+        case ZOSS_RAMDUMP_FILE_FILE_REQ:            /* ¶ÁÈ¡ÎļþÐÅÏ¢£¬¿ªÊ¼´«ÊäÎļþÇëÇó */

+            {

+                T_zOss_RamdumpFileFileReq *reqMsg = (T_zOss_RamdumpFileFileReq *)ZOSS_RAMDUMP_IO_DATA_BASE(reqBuffer);

+                T_zOss_RamdumpFileFileRsp *rspMsg = (T_zOss_RamdumpFileFileRsp *)ZOSS_RAMDUMP_IO_DATA_BASE(rspBuffer);

+

+                zOss_AssertExN(reqMsg->fileNo < g_zRamdump_ServerInfo.pFileInfo->fileNum);

+                *rspCmd = ZOSS_RAMDUMP_FILE_FILE_RSP;

+                strcpy((char *)rspMsg->fileName, (char *)fileInfo[reqMsg->fileNo].fileName);

+                rspMsg->size = fileInfo[reqMsg->fileNo].size;

+                rspDataLen = sizeof(*rspCmd) + sizeof(T_zOss_RamdumpFileFileRsp);            

+                break;

+            }

+        case ZOSS_RAMDUMP_FILE_READ_REQ:            /* ¶ÁÈ¡ÎļþÄÚÈÝ */

+            {

+                T_zOss_RamdumpFileReadReq *reqMsg = (T_zOss_RamdumpFileReadReq *)ZOSS_RAMDUMP_IO_DATA_BASE(reqBuffer);

+                *rspCmd = ZOSS_RAMDUMP_FILE_READ_RSP;

+                

+                zOss_AssertExN(reqMsg->fileNo <= g_zRamdump_ServerInfo.pFileInfo->fileNum);  

+                zOss_AssertExN(reqMsg->offset + reqMsg->length <= fileInfo[reqMsg->fileNo].size);                

+                g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, sizeof(*rspCmd));

+                g_zRamdumpIoOpt.write((UINT8 *)(fileInfo[reqMsg->fileNo].baseforServer + reqMsg->offset), reqMsg->length);

+                continue;                           /* ¼ÌÐøÖ´ÐÐÏÂÒ»´Î¶Á */

+            }

+        case ZOSS_RAMDUMP_FILE_END_REQ:             /* ´«Êä½áÊø */

+            {

+                *rspCmd = ZOSS_RAMDUMP_FILE_END_RSP;

+                g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, sizeof(*rspCmd));

+                g_zRamdumpIoOpt.finish();

+                return;

+            }

+        default:                /* ´íÎóÖ¸Áî */

+            {

+                *rspCmd = ZOSS_RAMDUMP_FILE_CMD_FAIL;

+                rspDataLen = sizeof(*rspCmd);

+                break;

+            }

+        } 

+        zOss_AssertExN(rspDataLen < g_zRamdump_ServerInfo.pIoWritebuf->buffLen);

+        g_zRamdumpIoOpt.write((UINT8 *)rspBuffer, rspDataLen);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_get_available_region

+ * ¹¦ÄÜÃèÊö£º¶ÔĬÈÏÅäÖõÄÄÚ´æ¿éÊý¾ÝÓëMMU½âÎöµÄÄÚ´æ¿éÊý¾Ý¶Ô±È£¬

+             ±£´æ¿Éµ¼³öÀ´µÄÄÚ´æ¿é

+ * ²ÎÊý˵Ã÷£º(IN): 

+ *              pCfgInfo:     ÅäÖõĵØÖ·ÐÅÏ¢Ö¸Õ룻

+ *              pParsedInfo:  ½âÎöºóµÄµØÖ·ÐÅÏ¢Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+#if defined (_OS_TOS) && defined (CYGOPT_HAL_ARM_MMU)

+static VOID ramdump_GetAvailableRegion(T_zOss_RamdumpRegion *pCfgInfo, T_zOss_RamdumpRegionInfo *pParsedInfo)

+{

+    UINT32                 i             = 0;

+    T_zTos_MmuRamdumpTable mmuTable      = { 0 };

+    T_zOss_RamdumpRegion   *pParseRegion = &(pParsedInfo->regions[0]);

+    

+    if (zTos_MmuGetMappingRegion(pCfgInfo->baseForServer, pCfgInfo->size, &mmuTable))

+    {

+        zOss_AssertExN((pParsedInfo->regionMaxNum - pParsedInfo->regionNum) >= mmuTable.count);

+        for (i= 0; i < mmuTable.count; i++, pParsedInfo->regionNum++)

+        {

+            pParseRegion[pParsedInfo->regionNum].baseForServer = mmuTable.item[i].virBase;

+            pParseRegion[pParsedInfo->regionNum].baseForSelf   = pCfgInfo->baseForServer != pCfgInfo->baseForSelf ?

+                                                                  (pCfgInfo->baseForSelf + mmuTable.item[i].phyBase - pCfgInfo->baseForServer) : mmuTable.item[i].virBase;

+            pParseRegion[pParsedInfo->regionNum].baseForCopy   = pCfgInfo->baseForCopy != 0 ? (pCfgInfo->baseForCopy + mmuTable.item[i].phyBase - pCfgInfo->baseForServer) : 0;

+            pParseRegion[pParsedInfo->regionNum].size          = mmuTable.item[i].size;  

+        }

+    } 

+}

+#else

+static VOID ramdump_GetAvailableRegion(T_zOss_RamdumpRegion *pCfgInfo, T_zOss_RamdumpRegionInfo *pParsedInfo)

+{

+    T_zOss_RamdumpRegion *pParseRegion = &(pParsedInfo->regions[0]);

+

+    pParseRegion[pParsedInfo->regionNum].baseForServer = pCfgInfo->baseForServer;

+    pParseRegion[pParsedInfo->regionNum].baseForSelf   = pCfgInfo->baseForSelf;

+    pParseRegion[pParsedInfo->regionNum].baseForCopy   = pCfgInfo->baseForCopy;

+    pParseRegion[pParsedInfo->regionNum].size          = pCfgInfo->size;

+    pParsedInfo->regionNum++;

+}

+#endif

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ParseRegioInfo

+ * ¹¦ÄÜÃèÊö£º½âÎöÄÚ´æ¿éÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN): 

+ *              pCfgInfo:    ÅäÖÃÇøÓòÊý¾ÝÐÅÏ¢Ö¸Õ룻

+ *              pParsedInfo: ½âÎöÇøÓòÊý¾ÝÐÅÏ¢Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ParseRegionInfo(T_zOss_RamdumpRegionInfo *pCfgInfo, T_zOss_RamdumpRegionInfo *pParsedInfo)

+{   

+    UINT32  i = 0;

+

+    for (i = 0; i < pCfgInfo->regionNum; i++)

+    {

+        ramdump_GetAvailableRegion(&(pCfgInfo->regions[i]), pParsedInfo);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveAgentFileInfo

+ * ¹¦ÄÜÃèÊö£º½«ÎļþÐÅÏ¢±£´æÖÁ¸ß¶ÎÄÚ´æ,ÓÃÓÚºÍAGENT½øÐÐͨÐÅ£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              name: ÎļþÃû×Ö£»

+ *              baseServer:µØÖ·£»

+ *              size: Êý¾Ý´óС£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveAgentFileInfo(const CHAR *name, UINT32 baseServer, UINT32 size )

+{

+    T_zOss_RamdumpFile *pFileInfo = g_zRamdump_ServerInfo.pAgentFileInfo->fileInfo + g_zRamdump_ServerInfo.pAgentFileInfo->fileNum;

+

+    strcpy((char *)pFileInfo->fileName, name);

+#ifdef _OS_TOS

+# ifdef CYGOPT_HAL_ARM_MMU

+    zTos_MmuGetPaddrByVaddr(baseServer,(cyg_uint32 *)&(pFileInfo->baseforServer));

+# elif defined (CYGOPT_HAL_ARM_MPU)

+    pFileInfo->baseforServer = baseServer;

+# endif

+#elif defined (_OS_LINUX)

+# ifdef CONFIG_MMU

+    /* FIXME */

+# else

+    pFileInfo->baseforServer = baseServer;

+# endif

+#endif

+    pFileInfo->size = size;

+    g_zRamdump_ServerInfo.pAgentFileInfo->fileNum++;

+    zOss_AssertExN(g_zRamdump_ServerInfo.pAgentFileInfo->fileNum < g_zRamdump_ServerInfo.pAgentFileInfo->fileMaxNum); 

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveFileInfo

+ * ¹¦ÄÜÃèÊö£º½«ÎļþÐÅÏ¢±£´æÖÁ¸ß¶ÎÄÚ´æ

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              name: Ãû×Ö£»

+ *              baseServer: µØÖ·£»

+ *              size: Êý¾Ý´óС£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveFileInfo(const CHAR *name, UINT32 baseServer, UINT32 size )

+{

+    T_zOss_RamdumpFile *pFileInfo = g_zRamdump_ServerInfo.pFileInfo->fileInfo + g_zRamdump_ServerInfo.pFileInfo->fileNum;

+

+    strcpy((char *)pFileInfo->fileName, name);

+    pFileInfo->baseforServer = baseServer;

+    pFileInfo->size          = size;

+    g_zRamdump_ServerInfo.pFileInfo->fileNum++;

+    zOss_AssertExN(g_zRamdump_ServerInfo.pFileInfo->fileNum < g_zRamdump_ServerInfo.pFileInfo->fileMaxNum); 

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveRegionFileInfo

+ * ¹¦ÄÜÃèÊö£ºÕûÀíÄÚ´æ¿éµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              p_region_info: ½âÎöºóµÄÊý¾Ý¶ÎµÄÖ¸Õ룻

+ *              file_name    : ÎļþÃû×Ö£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveRegionFileInfo(T_zOss_RamdumpRegionInfo *pRegionInfo, const CHAR *pFileName)

+{

+    UINT32  i                               = 0;

+    CHAR    name[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    

+    for (i = 0; i < pRegionInfo->regionNum; i++)

+    {

+        sprintf(name, "%d_%s", (int)i, pFileName);

+        ramdump_SaveFileInfo(name, pRegionInfo->regions[i].baseForServer, pRegionInfo->regions[i].size);

+        ramdump_SaveAgentFileInfo(name, pRegionInfo->regions[i].baseForServer, pRegionInfo->regions[i].size);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveServerFilesInfo

+ * ¹¦ÄÜÃèÊö£º±£´æserverµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveServerFilesInfo(VOID)

+{

+    CHAR                      binName[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    CHAR                      cmmName[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    T_zOss_RamdumpCmmFileInfo *pCmmInfo   = g_zRamdump_ServerInfo.pCmmInfo;

+    

+    sprintf(binName, "%d_s_mem.bin", (int)s_zRamdump_ServerCfgInfo.serverId);

+    ramdump_SaveRegionFileInfo(g_zRamdump_ServerInfo.pParsedInfo, binName);

+    sprintf(cmmName, "%d_s_targetstate.cmm", (int)s_zRamdump_ServerCfgInfo.serverId);

+    ramdump_SaveFileInfo(cmmName, (UINT32)pCmmInfo->cmmFileBuffer, pCmmInfo->cmmFileSize);

+    ramdump_SaveAgentFileInfo(cmmName, (UINT32)pCmmInfo->cmmFileBuffer, pCmmInfo->cmmFileSize);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveClientFilesInfo

+ * ¹¦ÄÜÃèÊö£º±£´æclientµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveClientFilesInfo(VOID)

+{

+    CHAR    binName[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    CHAR    cmmName[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    UINT32  cnt                                = 0;

+    

+    for (cnt = 0; cnt < sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {    

+        if ((s_zRamdump_ClientInfo[cnt] != NULL) && g_zRamdump_ServerInfo.pWaitMsgFlag[cnt])

+        {

+            T_zOss_RamdumpCmmFileInfo *pCmmInfo = s_zRamdump_ClientInfo[cnt]->pCmmInfo;

+            

+            sprintf(binName, "%d_c_mem.bin", (int)s_zRamdump_ClientInfo[cnt]->clientId);

+            ramdump_SaveRegionFileInfo(s_zRamdump_ClientInfo[cnt]->pParsedInfo, binName);

+            sprintf(cmmName, "%d_c_targetstate.cmm",(int)s_zRamdump_ClientInfo[cnt]->clientId);

+            ramdump_SaveFileInfo(cmmName, (UINT32)pCmmInfo->cmmFileBuffer, pCmmInfo->cmmFileSize);

+            ramdump_SaveAgentFileInfo(cmmName, (UINT32)pCmmInfo->cmmFileBuffer, pCmmInfo->cmmFileSize);

+        }

+    }

+    

+#ifdef _USE_ARM1_RAMDUMP

+    ramdump_SaveArm1FilesInfo();

+#endif

+

+#ifdef _USE_ZSP_RAMDUMP

+    ramdump_ZspRegionCfg();

+#endif

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveErrorFileInfo

+ * ¹¦ÄÜÃèÊö£º±£´æ´íÎóÐÅÏ¢ÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveErrorFileInfo(VOID)

+{

+    T_zOss_RamdumpBuffInfo *pErrInfo  = g_zRamdump_ServerInfo.pErrInfo;

+    UINT32                  cnt       = 0;

+    UINT32                  len       = 0;

+    UINT32                  errLogLen = strlen((const char *)pErrInfo->pBuff);

+

+    for (cnt = 0; cnt < sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {    

+        if ((s_zRamdump_ClientInfo[cnt] != NULL) && g_zRamdump_ServerInfo.pWaitMsgFlag[cnt])

+        {

+            len       =  errLogLen;

+            errLogLen += strlen(s_zRamdump_ClientInfo[cnt]->pErrInfo->pBuff);

+            zOss_AssertExN(errLogLen < pErrInfo->buffLen);

+            strcpy((char *)(pErrInfo->pBuff+ len), (char *)s_zRamdump_ClientInfo[cnt]->pErrInfo->pBuff);

+        }

+    }

+    

+#ifdef _USE_ARM1_RAMDUMP    

+    if (s_zRamdump_Arm1WaitFlag)

+    {

+        len       =  errLogLen;

+        errLogLen += strlen((char *)ZOSS_RADMUMP_ARM1_ERROR_FILE_BASE);

+        zOss_AssertExN(errLogLen < pErrInfo->buffLen);

+        strcpy((char *)(pErrInfo->pBuff+ len), (char *)ZOSS_RADMUMP_ARM1_ERROR_FILE_BASE);

+    }

+#endif 

+

+    ramdump_SaveFileInfo("err_log.txt", (UINT32)pErrInfo->pBuff, errLogLen); 

+    ramdump_SaveAgentFileInfo("err_log.txt", (UINT32)pErrInfo->pBuff, errLogLen);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SaveAllFilesInfo

+ * ¹¦ÄÜÃèÊö£ºÕûÀíµ¼³öÎļþÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):

+ *            (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SaveAllFilesInfo(VOID)

+{

+    ramdump_SaveServerFilesInfo();

+    ramdump_SaveClientFilesInfo();

+    ramdump_SaveErrorFileInfo();

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ServerSendMsg

+ * ¹¦ÄÜÃèÊö£ººË¼äͨѶÏûÏ¢·¢ËͽӿÚ

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              pIcpInfo: ICPÐÅÏ¢Ö¸Õ룻

+ *              pMsgInfo: ÏûÏ¢Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ServerSendMsg(T_zOss_RamdumpIcpInfo *pIcpInfo ,T_zOss_RamdumpServerMsgInfo *pMsgInfo)

+{

+    T_HalIcp_Msg icpMsg;  

+    icpMsg.SrcModId            = pIcpInfo->srcModId;

+    icpMsg.desModId            = pIcpInfo->desModId;

+    icpMsg.IntInfo.high_word   = pIcpInfo->intInfo.high_word;

+    icpMsg.pBuf                = pMsgInfo;

+    icpMsg.len                 = sizeof(T_zOss_RamdumpServerMsgInfo);

+    zDrvIcp_SendMsg((const T_HalIcp_Msg *)&icpMsg);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºexcept_RecordExceptInfo

+ * ¹¦ÄÜÃèÊö£º¼Ç¼Òì³£ÐÅÏ¢£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              exceptCore: Òì³£ºËID

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID except_RecordExceptInfo(UINT32 exceptCoreID)

+{

+    if(!s_zRamdump_ExceptCore.exceptFlag)

+    {

+        s_zRamdump_ExceptCore.exceptFlag = TRUE;

+        s_zRamdump_ExceptCore.exceptCore = exceptCoreID;

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ServerProcessClientMsg

+ * ¹¦ÄÜÃèÊö£ººË¼äͨѶclientÏûÏ¢´¦Àí½Ó¿Ú

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              pBuff: ÏûÏ¢buffÖ¸Õ룻

+ *              len  : ÏûÏ¢´óС£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ServerProcessClientMsg(const T_HalIcp_Msg *pMsg)

+{

+    UINT32                      cnt         = 0;

+    T_zOss_RamdumpClientMsgInfo *ramdumpMsg = (T_zOss_RamdumpClientMsgInfo *)pMsg->pBuf;

+

+    switch(ramdumpMsg->msgType)

+    {    

+    case ZOSS_RAMDUMP_INIT_TYPE:

+        {

+            for (cnt = 0; cnt < sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+            {

+                if (ramdumpMsg->srcModId == g_zRamdump_ClientIcpInfo[cnt].srcModId)

+                    s_zRamdump_ClientInfo[cnt] = (T_zOss_RamdumpClientInfo *)ramdumpMsg->pRamdumpStartAddr;

+            }   

+            break;

+        }  

+    case ZOSS_RAMDUMP_EXCPT_TYPE:

+        {

+            except_RecordExceptInfo(ramdumpMsg->srcModId);

+            sprintf((char *)g_zRamdump_ServerInfo.pErrInfo->pBuff, "%d_s_core: force error!\n", (int)s_zRamdump_ServerCfgInfo.serverId); 

+            zOss_RamdumpHandle(1, 1, 1);

+            break;

+        }

+    default:

+        {

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ServerProcessAgentMsg

+ * ¹¦ÄÜÃèÊö£ººË¼äͨѶagentÏûÏ¢´¦Àí½Ó¿Ú

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              pBuff: ÏûÏ¢bufferÖ¸Õ룻

+ *              len  : ÏûÏ¢´óС£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ServerProcessAgentMsg(const T_HalIcp_Msg *pMsg)

+{

+    T_zOss_RamdumpAgentMsgInfo *ramdumpMsg = (T_zOss_RamdumpAgentMsgInfo *)pMsg->pBuf;

+

+    switch(ramdumpMsg->msgType)

+    {

+    

+    default:

+        {

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_delay

+ * ¹¦ÄÜÃèÊö£º³¬Ê±µÈ´ýÅж϶àºËramdumpµÄͬ²½±êÖ¾£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *                ms  : 550MhzÖ÷Ƶϵ¥Î»ÊÇ1ms

+ *                addr: µØÖ·

+ *                falg: µÈ´ý±êÖ¾

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static BOOL ramdump_delay(UINT32 ms, volatile UINT32 *addr, UINT32 flag)

+{

+    UINT32 i, j;

+    

+    for (j = 0; j < ZOSS_RAMDUMP_DELAYTIME_CNT; j++)

+    {

+        for (i = 0; i < ms; i++)

+        {

+            if (*addr == flag)

+                return TRUE;

+        } 

+    }

+    return FALSE;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_GetConfigRegion

+ * ¹¦ÄÜÃèÊö£º»ñÈ¡radmumpÒªµ¼³öµÄÇøÓò£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+#if defined (_OS_TOS) && defined (CYGOPT_HAL_ARM_MMU)

+static VOID ramdump_GetConfigRegion(VOID)

+{

+    T_zOss_RamdumpRegion regionInfo = {0};

+    UINT32 cnt                      = 0;

+    T_zTos_MmuConfigItem *pItem     = NULL;

+    

+    for (cnt = 0; cnt < g_zTos_MmuConfigTable.count; cnt++)

+    {   

+        pItem = &g_zTos_MmuConfigTable.item[cnt];

+        if (pItem->attr & ZTOS_MMU_REGION_DUMP)

+        {

+            regionInfo.baseForServer = pItem->server_base;

+            regionInfo.baseForSelf   = pItem->physical_base;

+            regionInfo.size          = pItem->size;

+            regionInfo.baseForCopy   = (pItem->attr & ZTOS_MMU_REGION_COPY) ? pItem->server_base : 0;

+            zOss_RamdumpConfigureMem(&regionInfo);

+        }

+    }

+}

+#endif

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_SetPartition

+ * ¹¦ÄÜÃèÊö£ºramdump¿Õ¼ä»®·Ö£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_SetPartition(VOID)

+{

+    UINT32 size     = 0;

+    UINT32 sizeUnit = s_zRamdump_ServerCfgInfo.ramdumpSize/ZOSS_RAMDUMP_SERVER_TOTAL_RATE;

+    

+    g_zRamdump_ServerInfo.pCmmInfo = (T_zOss_RamdumpCmmFileInfo *)(((UINT32)s_zRamdump_ServerCfgInfo.pRamdumpStartAddr + sizeof(UINT32) - 1) & ~(sizeof(UINT32) - 1));

+    g_zRamdump_ServerInfo.pCmmInfo->cmmFileSize = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_CMM_INFO_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pCmmInfo->cmmFileMaxSize = size - sizeof(T_zOss_RamdumpCmmFileInfo);

+  

+    g_zRamdump_ServerInfo.pConfigureInfo = (T_zOss_RamdumpRegionInfo *)((CHAR*)g_zRamdump_ServerInfo.pCmmInfo + size);

+    g_zRamdump_ServerInfo.pConfigureInfo->regionNum = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_CONFIGURED_REGION_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pConfigureInfo->regionMaxNum = (size - sizeof(T_zOss_RamdumpRegionInfo)) / sizeof(T_zOss_RamdumpRegion);

+

+    g_zRamdump_ServerInfo.pParsedInfo = (T_zOss_RamdumpRegionInfo *)((CHAR*)g_zRamdump_ServerInfo.pConfigureInfo+size);

+    g_zRamdump_ServerInfo.pParsedInfo->regionNum = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_PARSED_REGION_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pParsedInfo->regionMaxNum = (size - sizeof(T_zOss_RamdumpRegionInfo)) / sizeof(T_zOss_RamdumpRegion);

+

+    g_zRamdump_ServerInfo.pFileInfo  = (T_zOss_RamdumpFileInfo*)((CHAR*)g_zRamdump_ServerInfo.pParsedInfo + size);

+    g_zRamdump_ServerInfo.pFileInfo->fileNum = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_FILE_INFO_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pFileInfo->fileMaxNum = (size - sizeof(T_zOss_RamdumpFileInfo)) / sizeof(T_zOss_RamdumpFile);

+

+    g_zRamdump_ServerInfo.pAgentFileInfo = (T_zOss_RamdumpFileInfo*)((CHAR*)g_zRamdump_ServerInfo.pFileInfo + size);

+    g_zRamdump_ServerInfo.pAgentFileInfo->fileNum = 0;

+    size = (sizeUnit * ZOSS_RAMDUMP_FILE_INFO_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pAgentFileInfo->fileMaxNum = (size - sizeof(T_zOss_RamdumpFileInfo)) / sizeof(T_zOss_RamdumpFile);

+

+    g_zRamdump_ServerInfo.pErrInfo = (T_zOss_RamdumpBuffInfo *)((CHAR*)g_zRamdump_ServerInfo.pAgentFileInfo + size);

+    size = (sizeUnit * ZOSS_RAMDUMP_ERR_INFO_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pErrInfo->pBuff = (CHAR*)g_zRamdump_ServerInfo.pErrInfo + sizeof(T_zOss_RamdumpBuffInfo); 

+    g_zRamdump_ServerInfo.pErrInfo->buffLen = size - sizeof(T_zOss_RamdumpBuffInfo);  

+    sprintf( (char *)g_zRamdump_ServerInfo.pErrInfo->pBuff, "%d_s_core: exact error!\n", (int)s_zRamdump_ServerCfgInfo.serverId); 

+

+    g_zRamdump_ServerInfo.pIoReadbuf = (T_zOss_RamdumpBuffInfo *)((CHAR *)g_zRamdump_ServerInfo.pErrInfo + size);

+    size = (sizeUnit * ZOSS_RAMDUMP_IO_READBUF_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pIoReadbuf->pBuff = (CHAR*)g_zRamdump_ServerInfo.pIoReadbuf + sizeof(T_zOss_RamdumpBuffInfo);

+    g_zRamdump_ServerInfo.pIoReadbuf->buffLen = size - sizeof(T_zOss_RamdumpBuffInfo);  

+    

+    g_zRamdump_ServerInfo.pIoWritebuf = (T_zOss_RamdumpBuffInfo *)((CHAR *)g_zRamdump_ServerInfo.pIoReadbuf + size);

+    size = (sizeUnit * ZOSS_RAMDUMP_IO_WRITEBUF_RATE - sizeof(UINT32) + 1) & ~(sizeof(UINT32) - 1);

+    g_zRamdump_ServerInfo.pIoWritebuf->pBuff = (CHAR*)g_zRamdump_ServerInfo.pIoWritebuf + sizeof(T_zOss_RamdumpBuffInfo);

+    g_zRamdump_ServerInfo.pIoWritebuf->buffLen = size - sizeof(T_zOss_RamdumpBuffInfo); 

+    

+    zOss_AssertExN(((CHAR *)g_zRamdump_ServerInfo.pIoWritebuf + size) <= 

+                    (s_zRamdump_ServerCfgInfo.pRamdumpStartAddr + s_zRamdump_ServerCfgInfo.ramdumpSize));

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ClientIcpInit

+ * ¹¦ÄÜÃèÊö£ºclient ICP ³õʼ»¯£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ClientIcpInit(VOID)

+{

+    UINT32 cnt       = 0;

+    UINT32 clientNum = sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo);

+

+    if(clientNum != 0)

+    {

+        s_zRamdump_ClientInfo  = (T_zOss_RamdumpClientInfo **)zOss_Malloc(sizeof(VOID *) * clientNum);

+        zOss_Memset(s_zRamdump_ClientInfo, 0, sizeof(VOID *) * clientNum);

+        g_zRamdump_ServerInfo.pWaitMsgFlag= (BOOL *)zOss_Malloc(sizeof(BOOL) * clientNum);

+        zOss_Memset(g_zRamdump_ServerInfo.pWaitMsgFlag, 0, sizeof(BOOL) * clientNum);

+    }

+    

+    for (cnt = 0; cnt < clientNum; cnt++)

+    {         

+        zDrvIcp_RegCallback(g_zRamdump_ClientIcpInfo[cnt].srcModId, g_zRamdump_ClientIcpInfo[cnt].desModId, ramdump_ServerProcessClientMsg, ICP_ISR_CALLBACK); 

+    } 

+    

+#ifdef _USE_ARM1_RAMDUMP

+    ramdump_Arm1Init(); 

+#endif

+

+#ifdef _USE_ZSP_RAMDUMP

+    ramdump_ZspInit();

+#endif

+

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_NotifyClientExceptionOccur

+ * ¹¦ÄÜÃèÊö£ºÍ¨Öªclient·¢ÉúÁËÒì³££»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_NotifyClientExceptionOccur(VOID)

+{

+    UINT32                      cnt     = 0;

+    T_zOss_RamdumpServerMsgInfo msgInfo = {0};

+    

+    for (cnt = 0; cnt < sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {        

+        msgInfo.msgType         = ZOSS_RAMDUMP_EXCPT_TYPE;

+        msgInfo.pServerConInfo  = NULL;

+        ramdump_ServerSendMsg(g_zRamdump_ClientIcpInfo, &msgInfo);

+    }

+    

+#ifdef _USE_ARM1_RAMDUMP

+    if (ramdump_CheckArm1InitFinish())

+        ramdump_SendMsgToArm1(ZOSS_RAMDUMP_EXCPT_TYPE);

+#endif

+

+#ifdef _USE_ZSP_RAMDUMP

+    ramdump_SendMsgToZsp();

+#endif

+

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_ProcessClientException

+ * ¹¦ÄÜÃèÊö£º´¦ÀíclientÒì³££»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_ProcessClientException(VOID)

+{

+    UINT32 cnt          = 0;

+    UINT32 delayTimeLen = 1000;     /* ʱ¼ä´óÔ¼ÔÚ1s×óÓÒ*/

+    

+    for (cnt = 0; cnt < sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {

+        if (s_zRamdump_ClientInfo[cnt] != NULL)

+        {

+            g_zRamdump_ServerInfo.pWaitMsgFlag[cnt] = ramdump_delay(delayTimeLen, (volatile UINT32 *)(s_zRamdump_ClientInfo[cnt]->clientFlagBase), ZOSS_RAMDUMP_FLAG_SECOND_VALUE);

+            if (g_zRamdump_ServerInfo.pWaitMsgFlag[cnt])

+            {

+                ramdump_ParseRegionInfo(s_zRamdump_ClientInfo[cnt]->pConfigureInfo, s_zRamdump_ClientInfo[cnt]->pParsedInfo);

+                *(UINT32 *)s_zRamdump_ClientInfo[cnt]->clientFlagBase = ZOSS_RAMDUMP_FLAG_THIRD_VALUE;

+#ifdef _OS_TOS

+                TOS_CACHE_CLEAN_ALL();

+#endif

+                g_zRamdump_ServerInfo.pWaitMsgFlag[cnt] = ramdump_delay(delayTimeLen, (volatile UINT32 *)(s_zRamdump_ClientInfo[cnt]->clientFlagBase), ZOSS_RAMDUMP_FLAG_FOUR_VALUE);            

+            }

+        }

+    }

+

+#ifdef _USE_ARM1_RAMDUMP

+    ramdump_ProcessArm1Exception();

+#endif

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_AgentIcpInit

+ * ¹¦ÄÜÃèÊö£ºAGENT ICP ×ÊÔ´³õʼ»¯£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_AgentIcpInit(VOID)

+{

+    UINT32 cnt = 0;

+    

+    for (cnt = 0; cnt < sizeof(s_zRamdump_AgentIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {

+        zDrvIcp_RegCallback(s_zRamdump_AgentIcpInfo[cnt].srcModId, s_zRamdump_AgentIcpInfo[cnt].desModId, ramdump_ServerProcessAgentMsg, ICP_ISR_CALLBACK);     

+    } 

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_NotifyAgentExceptionOccur

+ * ¹¦ÄÜÃèÊö£ºÍ¨Öªagent·¢ÉúÁËÒì³££»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_NotifyAgentExceptionOccur(VOID)

+{

+    UINT32                      cnt     = 0;

+    T_zOss_RamdumpServerMsgInfo msgInfo = {0};

+    

+    for (cnt = 0; cnt < sizeof(s_zRamdump_AgentIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {       

+        msgInfo.msgType         = ZOSS_RAMDUMP_EXCPT_TYPE;

+        msgInfo.pServerConInfo  = NULL;

+        ramdump_ServerSendMsg(&s_zRamdump_AgentIcpInfo[cnt], &msgInfo);

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_NotifyAgentSaveData

+ * ¹¦ÄÜÃèÊö£ºÍ¨ÖªAGENT¿ÉÒÔ±£´æÊý¾Ý£»

+ * ²ÎÊý˵Ã÷£º(IN):

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+static VOID ramdump_NotifyAgentSaveData(VOID)

+{

+    UINT32                      cnt     = 0;

+    T_zOss_RamdumpServerMsgInfo msgInfo = {0};

+

+    for (cnt = 0; cnt < sizeof(s_zRamdump_AgentIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo); cnt++)

+    {        

+        msgInfo.msgType         = ZOSS_RAMDUMP_DATA_READY_TYPE;

+#ifdef _OS_TOS

+        zTos_MmuGetPaddrByVaddr((cyg_uint32)g_zRamdump_ServerInfo.pAgentFileInfo,(cyg_uint32 *)&(msgInfo.pServerConInfo));

+#endif

+        ramdump_ServerSendMsg(&s_zRamdump_AgentIcpInfo[cnt], &msgInfo);

+    }

+}

+

+/*****************************************************************************

+ * º¯ÊýÃû³Æ£º ramdump_Main

+ * ¹¦ÄÜÃèÊö£º Ö´ÐÐramdump£¬ÓëPC²à¹¤¾ßÒÔ¼°´úÀí²à½øÐн»»¥£¬´«µÝÐèÒª±£´æµÄÊý¾Ý

+ * ²ÎÊý˵Ã÷£º (IN):ÎÞ

+ *            (OUT):ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ****************************************************************************/

+static VOID ramdump_Main(VOID)

+{

+    ramdump_ParseRegionInfo(g_zRamdump_ServerInfo.pConfigureInfo, g_zRamdump_ServerInfo.pParsedInfo);

+    zOss_RamdumpCreateCmmFile(g_zRamdump_ServerInfo.pCmmInfo);

+    ramdump_NotifyAgentExceptionOccur();

+    ramdump_NotifyClientExceptionOccur();

+    ramdump_ProcessClientException();

+    ramdump_SaveAllFilesInfo();

+    ramdump_NotifyAgentSaveData();

+

+    if (g_zRamdump_Optfunc.ramdump_Process_AftHook != NULL)

+    {

+        g_zRamdump_Optfunc.ramdump_Process_AftHook();

+    }

+    ramdump_TransferData();

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpHandle

+ * ¹¦ÄÜÃèÊö£º Ramdump´¦Àíº¯Êý

+ * ²ÎÊý˵Ã÷£º (IN)

+ *               ser_called:ÎªÕæÊ±,±íʾ´íÎóÀ´×ÔÓû§µ÷ÓÃ,Ϊ¼Ùʱ,±íʾ´íÎóÀ´×ÔÄÚºË

+ *               ecode:´íÎóÂë

+ *               extra:´íÎ󸽼ÓÂë

+ *            (OUT)

+ *               ÎÞ£»

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º ²ÎÊýÔÚTOS²Ù×÷ϵͳÉÏûÓÐʵ¼ÊÒâÒå;

+ **************************************************************************/

+VOID zOss_RamdumpHandle(UINT16 user_called, UINT16 ecode, UINT16 extra)

+{

+    static UINT32  excepNum = 0;

+    ZOSS_INTR      old_intr;

+

+    ZOSS_SAVE_IRQ(old_intr); 

+    if(++excepNum > 1 || !s_zRamdump_InitFlag)          /* Ö»±£´æµÚÒ»´Î³ö´íÏÖ³¡ */

+    {

+        for ( ; ; ) ;

+    }

+

+    if (zOss_GetExceptResetFlag() != EXCEPT_RESET_ENABLE)

+    {

+        zOss_RamdumpEncodeError(g_zRamdump_ServerInfo.pErrInfo->pBuff, user_called, ecode, extra);

+        /* Ö´ÐÐramdumpÒì³£´¦Àíº¯Êý */

+        ramdump_Main();

+        if(zOss_GetRamdumpResetFlag() == 0)

+        {

+            for ( ; ; ) ;

+        }

+        else

+        {

+            zSys_ExceptReboot(s_zRamdump_ExceptCore.exceptCore);

+        }

+    }

+    else

+    {

+        except_RecordExceptInfo(s_zRamdump_ServerCfgInfo.serverId);

+        zSys_ExceptReboot(s_zRamdump_ExceptCore.exceptCore);

+    }

+    

+    ZOSS_RESTORE_IRQ(old_intr);

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºramdump_RegionsCmmFile

+ * ¹¦ÄÜÃèÊö£ºT32cmm½Å±¾ÄÚ´æ¶ÎдÈë

+ * ²ÎÊý˵Ã÷£º(IN):

+ *              address: cmm½Å±¾Ö¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º·µ»Ø½Å±¾Ö¸Õ룻

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+CHAR *zOss_RamdumpCreateRegionsCmmFile(CHAR *address)

+{

+    CHAR    fileName[ZOSS_RAMDUMP_FILENAME_LEN] = {0};

+    UINT32  i                                   = 0;  

+   

+    sprintf(fileName, "%d_s_mem.bin", (int)s_zRamdump_ServerCfgInfo.serverId);

+    /* Êä³öramdump ÄÚ´æ¶ÎÎļþ */

+    for (i = 0; i < g_zRamdump_ServerInfo.pParsedInfo->regionNum; i++)

+    {

+        T_zOss_RamdumpRegion *pRegion =  &g_zRamdump_ServerInfo.pParsedInfo->regions[i];   

+        address += sprintf(address, "data.load.binary &%s\\%d_%s %#lx--%#lx /noclear\r\n", ZOSS_RAMDUMP_DIR_NAME, 

+                           (int)i, fileName, pRegion->baseForSelf, pRegion->baseForSelf + pRegion->size - 1);

+    }

+    return address;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpConfigureMem

+ * ¹¦ÄÜÃèÊö£º±£´æÄÚ´æ¶ÎÊý¾ÝÅäÖÃÐÅÏ¢

+ * ²ÎÊý˵Ã÷£º(IN):

+ *             regionInfo: Êý¾ÝÅäÖÃÇøÓò£»

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpConfigureMem(T_zOss_RamdumpRegion *regionInfo)

+{

+    T_zOss_RamdumpRegionInfo *pCfgInfo = g_zRamdump_ServerInfo.pConfigureInfo;

+

+    if (regionInfo->size == 0)

+        return;

+    zOss_AssertExN(pCfgInfo->regionNum < pCfgInfo->regionMaxNum);

+    pCfgInfo->regions[pCfgInfo->regionNum].baseForServer =  regionInfo->baseForServer;

+    pCfgInfo->regions[pCfgInfo->regionNum].baseForSelf   =  regionInfo->baseForSelf;

+    pCfgInfo->regions[pCfgInfo->regionNum].baseForCopy   =  regionInfo->baseForCopy;

+    pCfgInfo->regions[pCfgInfo->regionNum].size          =  regionInfo->size;

+    (pCfgInfo->regionNum)++;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpSetOperation

+ * ¹¦ÄÜÃèÊö£ºramdumpÓû§×¢²á½Ó¿Ú£»

+ * ²ÎÊý˵Ã÷£º(IN): 

+ *              funcObjPtr: »Øµ÷º¯ÊýµÄÖ¸Õ룻

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpSetOperation(T_zOss_RamdumpOpt *funcObjPtr)

+{

+    zOss_AssertExN(funcObjPtr != NULL);

+    

+    if (funcObjPtr->ramdump_Process_PreHook != NULL)

+    {

+        g_zRamdump_Optfunc.ramdump_Process_PreHook = funcObjPtr->ramdump_Process_PreHook;

+    }

+    if (funcObjPtr->ramdump_Process_AftHook != NULL)

+    {

+        g_zRamdump_Optfunc.ramdump_Process_AftHook = funcObjPtr->ramdump_Process_AftHook;

+    }

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpInit

+ * ¹¦ÄÜÃèÊö£ºramdump³õʼ»¯£»

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º

+ ***************************************************************************/

+VOID zOss_RamdumpInit(VOID)

+{

+    ramdump_SetPartition();

+#if defined (_OS_TOS) && defined (CYGOPT_HAL_ARM_MMU)

+    ramdump_GetConfigRegion();

+#endif

+    ramdump_ClientIcpInit();

+    ramdump_AgentIcpInit();

+

+#ifdef _USE_CP_USB

+    zOss_RamdumpSetUsbOpt();

+#else

+    zOss_RamdumpSetIcpOpt();

+#endif

+    

+    s_zRamdump_InitFlag = TRUE;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpForceClientException

+ * ¹¦ÄÜÃèÊö£ºÖÆÔìclientËÀ»ú£»

+ * ²ÎÊý˵Ã÷£º(IN)

+ *              coreId: client ID

+ *           (OUT)

+ *              ÎÞ

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º²»ÒªÒªÇóÈ·¶¨ÄǸöclientºËËÀ»úµ«ÊÇÒªÇóÿ¸öclientºË¿ÉÒÔËÀ»ú£»

+ ***************************************************************************/

+UINT32 zOss_RamdumpForceClientException(UINT32 coreId)

+{ 

+#ifdef _USE_ARM1_RAMDUMP

+    if (coreId == ZOSS_RAMDUMP_PHY_COREDID)

+    {

+       ramdump_SendMsgToArm1(ZOSS_RAMDUMP_TEST_EXCPT_TYPE);     

+    }

+    else

+#endif

+    {

+        T_zOss_RamdumpServerMsgInfo msgInfo = {0};

+        

+        zOss_AssertEx(coreId <= sizeof(g_zRamdump_ClientIcpInfo)/sizeof(T_zOss_RamdumpIcpInfo), ZOSS_ERROR);

+        msgInfo.msgType         = ZOSS_RAMDUMP_TEST_EXCPT_TYPE;

+        msgInfo.pServerConInfo  = NULL;

+        ramdump_ServerSendMsg(&g_zRamdump_ClientIcpInfo[coreId-1], &msgInfo);

+    }

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºOsa_SysErrHndInit

+ * ¹¦ÄÜÃèÊö£ºµØÖ·È«¾Ö±äÁ¿³õʼ»¯,»ñÈ¡ramdumpÄÚ´æ¿éĬÈÏÅäÖÃ

+ *           arm0ºÍarm1ͬ²½»úÖÆ

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º´ò×®£¬ÎªÁ˼æÈÝose¡¢cskyµÈramdump¹¦ÄÜ£»

+ ***************************************************************************/

+VOID Osa_SysErrHndInit(VOID)

+{

+

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£º zOss_RamdumpSetIoOpt

+ * ¹¦ÄÜÃèÊö£º ÉèÖÃramdump Io ͨµÀ£»

+ * ²ÎÊý˵Ã÷£º (IN): 

+ *           (OUT):

+ * ·µ »Ø Öµ£º   

+ * ÆäËü˵Ã÷£º 

+**************************************************************************/

+VOID zOss_RamdumpSetIoOpt(T_zOss_RamdumpIoOpt hook)

+{

+    g_zRamdumpIoOpt.init    = hook.init;

+    g_zRamdumpIoOpt.read    = hook.read;

+    g_zRamdumpIoOpt.write   = hook.write;

+    g_zRamdumpIoOpt.finish  = hook.finish;    

+}

+

+/**************************************************************************

+ * º¯ÊýÃû³Æ£ºzOss_RamdumpGetParsedRegions

+ * ¹¦ÄÜÃèÊö£º»ñÈ¡MMU½âÎöÇøÓò

+ * 

+ * ²ÎÊý˵Ã÷£º

+ * ·µ »Ø Öµ£º

+ * ÆäËü˵Ã÷£º½öΪT32 CMM½Å±¾Ê¹Óã»

+ ***************************************************************************/

+VOID zOss_RamdumpGetParsedRegions(VOID)

+{

+    if(s_zRamdump_InitFlag)

+    {

+        g_zRamdump_ServerInfo.pParsedInfo->regionNum = 0;

+        ramdump_ParseRegionInfo(g_zRamdump_ServerInfo.pConfigureInfo, g_zRamdump_ServerInfo.pParsedInfo);

+        for ( ; ; ) ;

+    }

+    else

+    {

+        for ( ; ; ) ;    

+    }

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_ramlog.c b/cp/ps/plat/src/oss/sup/src/sup_ramlog.c
new file mode 100644
index 0000000..84e74f2
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_ramlog.c
@@ -0,0 +1,135 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : Ramlog.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ³õʼ»¯´òÓ¡Îļþ

+* ×÷    Õß : gongyi

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2008-04-30

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC:617001782003

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define ZOSS_RAMLOG_MAX_LEN         59

+#define ZOSS_RAMLOG_MAX_ENTRIES     30

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    UINT8 is_use;

+    CHAR Ram[ZOSS_RAMLOG_MAX_LEN+1];

+}T_Comm_Ram;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static T_Comm_Ram gCommRam[ZOSS_RAMLOG_MAX_ENTRIES] = {0};

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RamLog

+* ¹¦ÄÜÃèÊö£º¼Ç¼³õʼ»¯ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) 

+            rambuf:   ´òÓ¡µ½RAMLOGµÄÊý¾Ý

+            restrict: Êý¾Ý¸ñʽ»¯ÀàÐÍ

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºrambuf»º³åÇøµÄ×Ö·û³¤¶È²»ÄÜ´óÓÚZOSS_RAMLOG_MAX_LEN¸ö×Ö½Ú£¬·ñÔòÖ±½Ó·µ»Ø

+**************************************************************************/

+VOID zOss_RamLog( CHAR * rambuf, UINT32 restric ) 

+{

+    UINT32  i    = 0;

+    

+    if (strlen((char *)rambuf) > ZOSS_RAMLOG_MAX_LEN)

+    {

+        return;

+    }

+    

+    for (i = 0; i < ZOSS_RAMLOG_MAX_ENTRIES; i++)

+    {

+        if (gCommRam[i].is_use == 0)

+        {

+            SINT32 ret = sprintf((char *)gCommRam[i].Ram, (char *)rambuf, restric);

+            if (ret <= 0)

+            {

+                break;

+            }

+            

+            gCommRam[i].is_use = 1;

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RamPrintf

+* ¹¦ÄÜÃèÊö£º´òÓ¡³õʼ»¯ÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) 

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÔÚϵͳ³õʼ»¯Íê³Éºóµ÷ÓÃ

+**************************************************************************/

+VOID zOss_RamPrintf(VOID)

+{

+    UINT32   i = 0;

+    

+    for( ; i < ZOSS_RAMLOG_MAX_ENTRIES; i++)

+    {

+        if(gCommRam[i].is_use == 0)

+        {

+            return;

+        }

+        

+        zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "%s", gCommRam[i].Ram);

+    }

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef __cplusplus

+}

+#endif

+

+

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_shell.c b/cp/ps/plat/src/oss/sup/src/sup_shell.c
new file mode 100755
index 0000000..53f9127
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_shell.c
@@ -0,0 +1,790 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : shell·½°¸ÊµÏÖÎļþ

+* ×÷    Õß : ÖܹúÆÂ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2008-04-21

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC:617001782003

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_shell_cmd.h"

+#include "drv_api.h"

+#include "commgt_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifndef _OS_WIN

+#ifndef stricmp

+#define stricmp strcasecmp

+#endif

+

+#ifndef strnicmp

+#define strnicmp strncasecmp

+#endif

+#endif

+

+#define EV_ZOSS_SHELL_COMM_CMD  1000

+#define SHELL_MAX_DYNAMIC_CMD   100

+

+#define SHELL_ISNUMBER(x)       ((x) >= '0' && (x) <= '9')

+#define SHELL_ISHEXNUMBER(x)    (SHELL_ISNUMBER((x)) || ((x) >= 'a' && (x) <= 'f') || ((x) >= 'A' && (x) <= 'F'))

+#define SHELL_ISIDENTIFIER(x)   (SHELL_ISNUMBER((x)) || ((x) >= 'a' && (x) <= 'z') || ((x) >= 'A' && (x) <= 'Z') || (x) == '_')

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+VOID Shell_TaskEntry(UINT8 state, UINT32 msg_id, UINT8 *buf, UINT16 msg_len, UINT8 *private_data);

+

+static SINT32 Shell_findCmd(CHAR *cmd);

+static VOID ShellHelpProcess(T_Shell_CommandMessage *CmdMsg);

+static UINT32 Shell_FindDynamicCmd(const CHAR *cmd);

+static VOID Shell_help(T_Shell_CommandMessage *pCmdMsg);

+static VOID Shell_MessageDivide(T_Shell_CommandMessage *msg);

+static UINT32 Shell_Process(T_Shell_CommandMessage *CmdMsg);

+static VOID Shell_CommCallBack(UINT32 msgID, const UINT8 *msg, UINT16 msgLen);

+static UINT32 Shell_ParseMessageFromCommData(T_Shell_CommandMessage *CmdMsg, const UINT8 *buf, UINT32 bufLen);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/ 

+ZOSS_THREAD_ID  gShellTaskID                = NULL;     /* È«¾ÖµÄshell ÈÎÎñID   */

+static UINT32   gShell_WintracePrintFlag    = 1;

+

+/* ÃüÁî±í */

+static T_Shell_Cmd gShell_Cmds[] =

+{

+    /*ÃüÁîÃû³Æ                      Èë¿Úº¯Êý                                      ˵Ã÷                                    */

+    

+    {(CHAR *)"help",                (Shell_Func)Shell_help,                       (CHAR *)"ÌṩSHELLÃüÁîµÄ°ïÖúÐÅÏ¢"       },

+#ifdef _USE_OSS_SHELL_MISC

+    /* »ù±¾ÃüÁî */

+    {(CHAR *)"bootInfo",            (Shell_Func)OSS_DbgShowBootInfo,              (CHAR *)"ÏÔʾÆô¶¯ÐÅÏ¢"                  },

+    {(CHAR *)"threadSuspend",       (Shell_Func)OSS_DbgSuspendThread,             (CHAR *)"¹ÒÆðÏß³Ì"                      },

+    {(CHAR *)"threadResume",        (Shell_Func)OSS_DbgResumeThread,              (CHAR *)"»Ö¸´Ïß³Ì"                      },

+    {(CHAR *)"setThreadPrior",      (Shell_Func)OSS_DbgSetThreadPri,              (CHAR *)"¸Ä±äÏß³ÌÓÅÏȼ¶"                },

+    {(CHAR *)"showMsg",             (Shell_Func)OSS_DbgShowMsg,                   (CHAR *)"ÏÔʾ/¹Ø±ÕÏûÏ¢¸ú×Ù"             },

+    {(CHAR *)"showReg",             (Shell_Func)OSS_DbgShowRegInfo,               (CHAR *)"»ñÈ¡¼Ä´æÆ÷ÐÅÏ¢"                },

+    {(CHAR *)"ramdumpConfigRegion", (Shell_Func)OSS_DbgRamdumpConfigRegionInfo,   (CHAR *)"ÉèÖÃÐèÒªµ¼³öµÄÄÚ´æÇøÓò"        },

+    {(CHAR *)"showProcSig",         (Shell_Func)Shell_ShowProcSig,                (CHAR *)"ÏÔʾÏß³ÌsignalʹÓÃÇé¿ö"        },

+    {(CHAR *)"forceRamdump",        (Shell_Func)OSA_ForceRamdump,                 (CHAR *)"ÖÆÔìÒì³£Ç¿ÖÆramdump"           },

+    {(CHAR *)"reboot",              (Shell_Func)OSS_DbgReboot,                    (CHAR *)"ÖØÆô"                          },

+    {(CHAR *)"setWintracePrint",    (Shell_Func)OSS_DbgSetWintracePrintFlag,      (CHAR *)"´ò¿ª¹Ø±Õwintrace´òÓ¡"          },

+    {(CHAR *)"trace",               (Shell_Func)OSA_DbgTrace,                     (CHAR *)"²é¿´¸ú×ÙÄ£¿éÐÅÏ¢"              },

+    {(CHAR *)"profile",             (Shell_Func)OSS_DbgProfile,                   (CHAR *)"½«gmon.outдÈëÎļþϵͳ"        },

+    {(CHAR *)"openTraceSwitch",     (Shell_Func)OSS_OpenTraceSwitch,              (CHAR *)"´ò¿ªÖжϺÍÏ̵߳ĸú×ÙÐÅÏ¢¿ª¹Ø"  },

+    {(CHAR *)"setAssertLevel",      (Shell_Func)OSS_SetAssertLevel,               (CHAR *)"ÉèÖÃÄں˶ÏÑÔµ÷ÊÔ¼¶±ð"          },

+#endif

+#ifdef _USE_OSS_SHELL_MEM

+    /* ÄÚ´æ¹Û²ì */

+    {(CHAR *)"mem",                 (Shell_Func)OSS_DbgShowMemInfo,               (CHAR *)"´òӡϵͳÄÚ´æÐÅÏ¢"              }, 

+    {(CHAR *)"ub",                  (Shell_Func)OSS_DbgShowUbInfo,                (CHAR *)"´òӡϵͳÄÚ´æ´æ³ØÐÅÏ¢"          },

+    {(CHAR *)"threadUB",            (Shell_Func)OSS_DbgShowThreadUbInfo,          (CHAR *)"´òÓ¡Ö¸¶¨Ï̵߳ÄUBÐÅÏ¢"          },

+    {(CHAR *)"taskUB",              (Shell_Func)OSS_DbgShowTaskUbInfo,            (CHAR *)"´òÓ¡Ö¸¶¨ÈÎÎñµÄUBÐÅÏ¢"          },

+    {(CHAR *)"showPoolInfo",        (Shell_Func)Shell_ShowPoolInfo,               (CHAR *)"ÏÔʾpoolÐÅÏ¢"                  },

+    {(CHAR *)"opendbgub",           (Shell_Func)OSA_SetUBDbgSwitch,               (CHAR *)"´ò¿ªubµ÷ÊÔ¿ª¹Ø"                },

+    {(CHAR *)"checkUb",             (Shell_Func)OSA_DbgUbInfo,                    (CHAR *)"¼ì²éubÐÅÏ¢"                    },

+    {(CHAR *)"showMem",             (Shell_Func)OSS_DbgGetMem,                    (CHAR *)"²é¿´ÄÚ´æÐÅÏ¢"                  },

+    {(CHAR *)"setMem",              (Shell_Func)OSS_DbgSetMem,                    (CHAR *)"ÐÞ¸ÄÄÚ´æÐÅÏ¢"                  },

+    {(CHAR *)"checkMem",            (Shell_Func)OSA_DbgMemInfo,                   (CHAR *)"¼ì²émemµÄʹÓÃÐÅÏ¢(й¶ºÍÔ½½ç)" },

+    {(CHAR *)"checkLeakMem",        (Shell_Func)OSA_DbgMemTimeLeakInfo,           (CHAR *)"¼ì²éµÄij¸öʱ¼ä¶ÎMemµÄй¶ÐÅÏ¢" },

+#endif

+#ifdef _USE_OSS_SHELL_THREAD

+    /* µ÷¶ÈͨѶ */

+    {(CHAR *)"threadInfo",          (Shell_Func)OSS_DbgShowThreadInfo,            (CHAR *)"²é¿´Ïß³ÌÐÅÏ¢"                  },

+    {(CHAR *)"taskInfo",            (Shell_Func)OSS_DbgShowTaskInfo,              (CHAR *)"´òӡϵͳËùÓÐÈÎÎñÐÅÏ¢"          },

+    {(CHAR *)"threadCpu",           (Shell_Func)OSS_DbgDisplayThreadExecInfo,     (CHAR *)"ÏÔʾij¸öÏ̵߳ÄÖ´ÐÐʱ¼ä"        },

+    {(CHAR *)"threadsCpu",          (Shell_Func)OSS_DbgDisplayThreadsExecInfo,    (CHAR *)"ÏÔʾËùÓÐÏ̵߳ÄÖ´ÐÐʱ¼ä"        },

+    {(CHAR *)"threadSwapflag",      (Shell_Func)OSS_DbgThreadSetFlag,             (CHAR *)"¹Ø±Õ/´ò¿ª¼Ç¼Ïß³ÌCPUʱ¼ä¿ª¹Ø"  },

+    {(CHAR *)"syscpu",              (Shell_Func)OSS_DbgGetSysCPU,                 (CHAR *)"»ñµÃϵͳCPUÕ¼ÓÃÂÊ"             },

+    {(CHAR *)"setUpdateCpuTime",    (Shell_Func)OSS_DbgSetUpdateCPUTime,          (CHAR *)"ÉèÖÃCPUʹÓÃÂÊË¢ÐÂʱ¼ä"         },

+    {(CHAR *)"startDaemonTask",     (Shell_Func)OSS_StartDaemonTask,              (CHAR *)"Æô¶¯ÈÎÎñËÀÑ­»·¼à²â"            },    

+#endif

+

+#ifdef _USE_OSS_SHELL_PSM

+#ifdef _USE_PSM

+    {(CHAR *)"psminfo",             (Shell_Func)OSS_PsmTraceInfo,                 (CHAR *)"Êä³öpsmµ÷ÊÔÐÅÏ¢"               },

+#ifdef _USE_CPU_DFM

+    {(CHAR *)"dfmifno",             (Shell_Func)OSS_DfmTraceInfo,                 (CHAR *)"Êä³ödfmµ÷ÊÔÐÅÏ¢"               },

+#endif

+#endif

+#endif

+};

+

+static T_Shell_Cmd gShell_DynamicCmds[SHELL_MAX_DYNAMIC_CMD] = { 0 };

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_TaskEntry

+* ¹¦ÄÜÃèÊö£ºSHELLÈÎÎñÈë¿Úº¯Êý

+* ²ÎÊý˵Ã÷£º

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID Shell_TaskEntry(UINT8 state, UINT32 msg_id, UINT8 *buf, UINT16 msg_len, UINT8 *private_data)

+{

+    UINT32 status = ZOSS_ERROR;

+    

+    switch (state)

+    {

+    case ZOSS_STATUS_INIT:

+        {

+            switch (msg_id)

+            {

+            case EV_INIT:

+                {

+                    break;

+                }

+            case EV_POWERON:

+                {

+                    gShellTaskID = zOss_GetSelfTaskID();

+                    /* ÏòͨѶģ¿é×¢²áµ±Ç°×ÓÄ£¿é */

+                    #ifdef _USE_WINCOMM_SERVER

+                    status = zTools_CommReg(SUBMDL_SHELL, ZDRV_DEV_USBSIO_2, (ModuleFunc)Shell_CommCallBack);

+                    #else

+                    status = zOss_CommReg(SUBMDL_SHELL, ZDRV_DEV_USBSIO_2, Shell_CommCallBack);

+                    #endif

+                    if (status != ZOSS_SUCCESS)

+                    {

+                        zOss_ASSERT(0);

+                        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "SHELL_POWERON:Fail to register submodule!");

+                        break;

+                    }

+                    status = zOss_SetState(ZOSS_STATUS_WORK);

+                    if (status != ZOSS_SUCCESS)

+                    {

+                        zOss_ASSERT(0);

+                        zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "SHELL_POWERON:Fail to set state!");

+                        break;

+                    }

+                    

+                    break;

+                }

+            default:

+                {

+                    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "SHELL:Receive a invalid message");

+                    break;

+                }

+            }

+            break;

+        }

+    case ZOSS_STATUS_WORK:

+        {

+            switch (msg_id)

+            {

+            case EV_ZOSS_SHELL_COMM_CMD:

+                {

+                    T_Shell_CommandMessage cmdMsg = {0};

+                    

+                    /* ´Ó½ÓÊÕµ½µÄÊý¾Ý·ÖÀë³öÃüÁî */

+                    if (ZOSS_SUCCESS == Shell_ParseMessageFromCommData(&cmdMsg, (UINT8 *)buf, msg_len))

+                    {

+                        /* ¸ù¾ÝÃüÁîÖ´ÐвÙ×÷ */

+                        Shell_MessageDivide(&cmdMsg);

+                    }

+                    

+                    break;

+                }

+            default:

+                {

+                    zOss_Printf(SUBMDL_SHELL, PRINT_LEVEL_ABNORMAL, "SHELL:Receive a invalid message");

+                    break;

+                }

+            }    

+            break;

+        }

+    default:

+        break;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_AddShellCmd

+* ¹¦ÄÜÃèÊö£ºÌí¼Ó¶¯Ì¬ÃüÁî

+* ²ÎÊý˵Ã÷£º(IN)

+            cmd:ÃüÁî×Ö·û´®,²»ÄÜΪ¿Õ

+            func:ÃüÁîÖ´Ðк¯Êý,²»ÄÜΪNULL

+            description:ÃüÁîÃèÊö,¿ÉÒÔΪNULL

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º¶à´Îµ÷Óú¯Êý,ÏàͬµÄcmd_name,ºóÃæµ÷ÓõĻḲ¸ÇÇ°Ãæµ÷ÓõÄ

+**************************************************************************/

+UINT32 zOss_AddShellCmd(const CHAR *cmd_name, const Shell_Func func, const CHAR *description)

+{

+    UINT32 i            = 0;

+    UINT32 name_size    = 0;

+    UINT32 desc_size    = 0;

+    

+    zOss_AssertEx((NULL != cmd_name) && (func != NULL), ZOSS_ERROR);

+    

+    i = Shell_FindDynamicCmd(cmd_name);

+    zOss_AssertEx(i < SHELL_MAX_DYNAMIC_CMD, ZOSS_ERROR);

+    

+    name_size = strlen((char *)cmd_name);

+    if (NULL != description)

+    {

+        desc_size = strlen((char *)description);

+    }

+    

+    if (NULL != gShell_DynamicCmds[i].cmd)

+    {

+        zOss_Free(gShell_DynamicCmds[i].cmd);

+        zOss_Free(gShell_DynamicCmds[i].desc);

+        gShell_DynamicCmds[i].cmd = NULL;

+        gShell_DynamicCmds[i].func = NULL;

+        gShell_DynamicCmds[i].desc = NULL;

+    }

+    

+    gShell_DynamicCmds[i].cmd = (CHAR *)zOss_Malloc(name_size + 1);

+    if (NULL == gShell_DynamicCmds[i].cmd)

+    {

+        return ZOSS_ERROR;

+    }

+    zOss_Memset(gShell_DynamicCmds[i].cmd, 0, name_size + 1);

+    zOss_Memcpy(gShell_DynamicCmds[i].cmd, cmd_name, name_size);

+    

+    gShell_DynamicCmds[i].desc = (CHAR *)zOss_Malloc(desc_size + 1);    /* Èç¹ûdescΪNULL,ÉêÇë1¸ö×Ö·û¿Õ¼ä */

+    if (NULL == gShell_DynamicCmds[i].desc)

+    {

+        zOss_Free(gShell_DynamicCmds[i].cmd);

+        gShell_DynamicCmds[i].cmd = NULL;

+        return ZOSS_ERROR;

+    }

+    zOss_Memset(gShell_DynamicCmds[i].desc, 0, desc_size + 1);

+    if (0 != desc_size)

+    {

+        zOss_Memcpy(gShell_DynamicCmds[i].desc, description, desc_size);

+    }

+    

+    gShell_DynamicCmds[i].func = func;

+    

+    return ZOSS_SUCCESS;

+}

+

+UINT32 Shell_GetWintracePrintFlag(VOID)

+{

+    return gShell_WintracePrintFlag;

+}

+

+UINT32 Shell_SetPrintFlag(UINT32 WintraceFlag)

+{

+    zOss_AssertEx(WintraceFlag < 2 , ZOSS_ERROR);

+

+    gShell_WintracePrintFlag = WintraceFlag;     

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_StrisNumber

+* ¹¦ÄÜÃèÊö£º×Ö·û´®ÊÇ·ñÈ«²¿ÊÇÊý×Ö

+* ²ÎÊý˵Ã÷£º(IN)

+            pStr:×Ö·û´®Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º0±íʾȫ²¿ÊÇÊý×Ö£¬-1±íʾ°üº¬·ÇÊý×Ö

+* ÆäËü˵Ã÷£ºÖ§³Ö10½øÖƺÍ16½øÖÆ£¬16½øÖÆÒªÇó0x»ò0XµÄǰ׺

+**************************************************************************/

+SINT32 Shell_StrisNumber(const CHAR *pStr)

+{

+    const CHAR *tmp = NULL;

+    

+    zOss_AssertEx(pStr != NULL, (SINT32)ZOSS_ERROR);

+    tmp = pStr;

+    if (0 == strnicmp((char *)tmp, "0x", 2))

+    {

+        tmp = pStr + 2;

+        while ('\0' != *tmp)

+        {

+            if (!SHELL_ISHEXNUMBER(*tmp))

+            {

+                return -1;

+            }

+            tmp++;

+        }

+    }

+    else

+    {

+        while ('\0' != *tmp)

+        {

+            if (!SHELL_ISNUMBER(*tmp))

+            {

+                return -1;

+            }

+            tmp++;

+        }

+    }

+    return 0;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_isIdentifier

+* ¹¦ÄÜÃèÊö£º×Ö·û´®ÊÇ·ñÈ«²¿ÊÇÊý×Ö,×Öĸ»òÏ»®ÏßµÄ×éºÏ

+* ²ÎÊý˵Ã÷£º(IN)

+            Str:×Ö·û´®Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º0±íʾȫ²¿ÊÇÊý×Ö,×Öĸ»òÏ»®Ïß×éºÏ£¬-1±íʾ°üº¬·Ç·¨×Ö·û

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+SINT32 Shell_isIdentifier(const CHAR *pStr)

+{

+    const CHAR *tmp = NULL;

+        

+    zOss_AssertEx(pStr != NULL, (SINT32)ZOSS_ERROR);

+    tmp = pStr;

+

+    while ('\0' != *tmp)

+    {

+        if (!SHELL_ISIDENTIFIER(*tmp))

+        {

+            return -1;

+        }

+        tmp++;

+    }

+    return 0;

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_CommCallBack

+* ¹¦ÄÜÃèÊö£ºShell´úÀí»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+            msgID:  ÏûÏ¢ID

+            msg:    ÊÕµ½µÄÏûÏ¢

+            msgLen: ÊÕµ½µÄÏûÏ¢³¤¶È

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÎÞ

+**************************************************************************/

+static VOID Shell_CommCallBack(UINT32 msgID, const UINT8 *msg, UINT16 msgLen)

+{

+    UINT32  RetCode         = 0;

+    UINT8   *pCmdMsgBuff    = NULL;

+    

+    if (msgLen == 0 || msg == NULL)

+    {

+        return;

+    }

+    

+    pCmdMsgBuff = (UINT8 *)zOss_GetUB(msgLen);           /* È¥µôÏûϢͷ */

+    if (NULL == pCmdMsgBuff)

+    {

+        return;

+    }

+    zOss_Memcpy((VOID *)pCmdMsgBuff, msg, msgLen);

+    RetCode = zOss_TaskSend(EV_ZOSS_SHELL_COMM_CMD, pCmdMsgBuff, msgLen, gShellTaskID);   

+    zOss_ASSERT(RetCode == ZOSS_SUCCESS);

+    

+    RetCode = zOss_RetUB(pCmdMsgBuff);

+    zOss_ASSERT(RetCode == ZOSS_SUCCESS);

+}

+

+/***************************************************************************

+* º¯ÊýÃû³Æ£ºShell_ParseMessageFromCommData

+* ¹¦ÄÜÃèÊö£º´ÓÊÕµ½µÄÊý¾ÝBUFFERÖнâÎö³öÃüÁî

+* ²ÎÊý˵Ã÷£º(IN)

+            uf:Êý¾Ý»º³åÇø

+            ufLen:Êý¾Ý»º³åÇøµÄ³¤¶È

+            (OUT)

+* ·µ »Ø Öµ£ºÃüÁîµÄ½á¹¹

+* ÆäËü˵Ã÷£ºÄÚ²¿½Ó¿Ú

+*****************************************************************************/

+static UINT32 Shell_ParseMessageFromCommData(T_Shell_CommandMessage *CmdMsg, const UINT8 *buf, UINT32 bufLen)

+{

+    UINT32      i           = 0;

+    UINT16      offset      = 0;

+    UINT32      strLen      = 0;

+    const CHAR  *pStr       = NULL;

+    

+    zOss_AssertEx(NULL != CmdMsg && NULL != buf, ZOSS_ERROR);

+    

+    /* ÃüÁî³õʼ»¯ */

+    zOss_Memset(CmdMsg, 0, sizeof(T_Shell_CommandMessage));

+    CmdMsg->paraCount = (UINT32)buf[0];

+    offset = 1;

+    pStr = (CHAR *)&buf[offset];

+    strLen = strlen((char *)pStr);

+    strncpy((char *)CmdMsg->cmd, (char *)pStr, strLen > SHELL_CMD_LENGTH ? SHELL_CMD_LENGTH : strLen);  /* »ñÈ¡ÃüÁî */

+    

+    /* ·ÖÎö²ÎÊý */

+    offset += (UINT16)strLen + 1;      /* Ìø¹ýÃüÁ¶È£¬+1ÊÇÔÙÌø¹ý'\0' */

+    while ((offset < bufLen) && (i < SHELL_CMD_PARAM_NUM))

+    {

+        pStr = (CHAR *)&buf[offset];

+        strLen = strlen((char *)pStr);

+        strncpy((char *)CmdMsg->para[i], (char *)pStr, strLen > SHELL_CMD_PARAM_LENGTH ? SHELL_CMD_PARAM_LENGTH : strLen); /* »ñÈ¡²ÎÊý */

+        offset += (UINT16)strLen + 1;    /* +1ÊÇÔÙÌø¹ý'\0' */

+        i++;

+    }

+    return ZOSS_SUCCESS;

+}

+

+/***************************************************************************

+* º¯ÊýÃû³Æ£ºShell_MessageDivide

+* ¹¦ÄÜÃèÊö£ºÃüÁî·Ö·¢µ½:TESTÄ£¿é»òSHELLÄ£¿é

+* ²ÎÊý˵Ã÷£º(IN)

+            msg£º½âÎö³öµÄÏûÏ¢½á¹¹Ìå

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÄÚ²¿½Ó¿Ú

+*****************************************************************************/

+static VOID Shell_MessageDivide(T_Shell_CommandMessage *msg)

+{

+    zOss_AssertExN(NULL != msg);

+    

+    if (ZOSS_ERROR == Shell_Process(msg))       

+    {

+        ShellHelpProcess(msg);

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_Process

+* ¹¦ÄÜÃèÊö£ºShellÃüÁî´¦Àí

+* ²ÎÊý˵Ã÷£º(IN)

+            CmdMsg:ÃüÁî½á¹¹Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£ºÕÒµ½ÃüÁî²¢Ö´Ðзµ»ØZOSS_SUCCESS£¬ÕÒ²»µ½ÃüÁî·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Shell_Process(T_Shell_CommandMessage *CmdMsg)

+{

+    SINT32  cmd_count   = 0;

+    SINT32  i           = 0;

+    

+    zOss_AssertEx(CmdMsg != NULL, ZOSS_ERROR);

+    

+    cmd_count = sizeof(gShell_Cmds) / sizeof(gShell_Cmds[0]);

+    i = Shell_findCmd(CmdMsg->cmd);     /* ²éÕÒÆ¥ÅäÃüÁî */

+    

+    if (i >= 0 && i < cmd_count)

+    {

+        gShell_Cmds[i].func(CmdMsg);    /* Ö´ÐÐÃüÁî     */

+        return ZOSS_SUCCESS;

+    }

+    

+    i = (SINT32)Shell_FindDynamicCmd(CmdMsg->cmd);        

+    if (i < SHELL_MAX_DYNAMIC_CMD)

+    {

+        if (NULL != gShell_DynamicCmds[i].cmd)

+        {

+            gShell_DynamicCmds[i].func(CmdMsg);

+            return ZOSS_SUCCESS;

+        }

+    }

+    

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_findCmd

+* ¹¦ÄÜÃèÊö£º²éÕÒÃüÁî

+* ²ÎÊý˵Ã÷£º(IN)

+            cmd:ÃüÁî×Ö·û´®

+            (OUT)

+* ·µ »Ø Öµ£ºÕÒµ½ÁË·µ»ØÔÚÃüÁî±íµÄλÖã¬ÕÒ²»µ½·µ»Ø-1

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static SINT32 Shell_findCmd(CHAR *cmd)

+{

+    SINT32 cmd_count    = 0;

+    SINT32 i            = 0;

+    

+    zOss_AssertEx(cmd != NULL, -1);

+    cmd_count = sizeof(gShell_Cmds) / sizeof(gShell_Cmds[0]);

+    for (i = 0; i < cmd_count; i++)

+    {

+        if (0 == stricmp((char *)cmd, (char *)gShell_Cmds[i].cmd))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-60s ", "***********************************************************************");

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s %s", "* ÃüÁÄÜ:", gShell_Cmds[i].desc);

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s ", "*ƽ̨֧³ÅÌṩ¸Ã¹¦ÄÜ");

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-60s ", "***********************************************************************");

+            return i;

+        }

+    }

+    return -1;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_FindDynamicCmd

+* ¹¦ÄÜÃèÊö£º²éÕÒ¶¯Ì¬ÃüÁî

+* ²ÎÊý˵Ã÷£º(IN)

+            cmd:ÃüÁî×Ö·û´®

+            (OUT)

+* ·µ »Ø Öµ£ºÕÒµ½ÁË·µ»ØÔÚÃüÁî±íµÄλÖã¬ÕÒ²»µ½·µ»ØÒ»¸ö¿ÕµÄλÖÃ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 Shell_FindDynamicCmd(const CHAR *cmd)

+{

+    UINT32 i = 0;

+    

+    zOss_AssertEx(NULL != cmd, 0);

+    for (i = 0; i < SHELL_MAX_DYNAMIC_CMD; i++)

+    {

+        if (NULL != gShell_DynamicCmds[i].cmd)

+        {

+            if (0 == stricmp((char *)cmd, (char *)gShell_DynamicCmds[i].cmd))

+            {

+                return i;

+            }

+        }

+        else

+        {

+            return i;

+        }

+    }

+    return i;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShellFindStaticCmd

+* ¹¦ÄÜÃèÊö£º²éÕÒ¾²Ì¬µÄshellÃüÁî²¢Ìṩ°ïÖúÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+            cmd:shellÃüÁî

+            cmdLen:shellÃüÁîµÄ³¤¶È

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 ShellHelpFindStaticCmd(CHAR *cmd, UINT32 cmdLen)

+{

+    UINT32  cmd_count       = sizeof(gShell_Cmds) / sizeof(gShell_Cmds[0]);

+    UINT32  i               = 0;

+    BOOL    cmdIsDisplay    = TRUE;

+

+    zOss_AssertEx(cmd != NULL && cmdLen != 0, ZOSS_ERROR);

+    for (i = 0; i < cmd_count; i++)

+    {

+        if (0 == strnicmp((char *)cmd, (char *)gShell_Cmds[i].cmd, (unsigned int)cmdLen))

+        {

+            if (cmdIsDisplay)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÃüÁî: %s ûÓÐÕÒµ½!", cmd);

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s¿ªÍ·µÄÃüÁîÈçÏÂ:", cmd);

+                cmdIsDisplay = FALSE;

+            }

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s \t%s", gShell_Cmds[i].cmd, gShell_Cmds[i].desc);

+        }

+    }

+    if (cmdIsDisplay)

+    {

+        return ZOSS_ERROR;

+    }

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShellHelpFindDynamicCmd

+* ¹¦ÄÜÃèÊö£º²éÕÒ¶¯Ì¬shellÃüÁî

+* ²ÎÊý˵Ã÷£º(IN)

+            cmd:shellÃüÁî

+            cmdLen:shellÃüÁîµÄ³¤¶È

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 ShellHelpFindDynamicCmd(CHAR *cmd, UINT32 cmdLen)

+{

+    UINT32  i               = 0;

+    BOOL    cmdIsDisplay    = TRUE;

+   

+    zOss_AssertEx(cmd != NULL && cmdLen != 0, ZOSS_ERROR);

+    for (i = 0; i < SHELL_MAX_DYNAMIC_CMD && NULL != gShell_DynamicCmds[i].cmd; i++)

+    {

+        if (0 == strnicmp((char *)cmd, (char *)gShell_DynamicCmds[i].cmd, (unsigned int)cmdLen))

+        {

+            if (cmdIsDisplay)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÃüÁî: %s ûÓÐÕÒµ½!", cmd);

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s¿ªÍ·µÄÃüÁîÈçÏÂ:", cmd);

+                cmdIsDisplay = FALSE;

+            }

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s \t%s", gShell_DynamicCmds[i].cmd, gShell_DynamicCmds[i].desc);

+        }

+    }

+    if (cmdIsDisplay)

+    {

+        return ZOSS_ERROR;

+    }

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShellHelpProcess

+* ¹¦ÄÜÃèÊö£ºµ±Ã»ÓÐÕÒµ½ÏàÓ¦µÄshellÃüÁîÌṩһЩ°ïÖúÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:ÃüÁî½á¹¹Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID ShellHelpProcess(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32  ret1    = ZOSS_ERROR;

+    UINT32  ret2    = ZOSS_ERROR;

+    CHAR    *cmd    = NULL;

+    UINT32  cmp_len = 0; 

+

+    zOss_AssertExN(CmdMsg != NULL);

+    cmd = CmdMsg->cmd;

+    cmp_len = strlen((char *)cmd);

+    ret1 = ShellHelpFindStaticCmd(cmd, cmp_len);

+    ret2 = ShellHelpFindDynamicCmd(cmd, cmp_len);

+    if ((ZOSS_ERROR == ret1) && (ZOSS_ERROR == ret2))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t%sÃüÁî²»ÊÇshellÃüÁî!", cmd);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÊäÈëhelpÁгöËùÓÐÃüÁî");

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºshell_help

+* ¹¦ÄÜÃèÊö£ºShell helpÃüÁî´¦Àí

+* ²ÎÊý˵Ã÷£º(IN)

+            pCmdMsg:ÃüÁî½á¹¹Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID Shell_help(T_Shell_CommandMessage *pCmdMsg)

+{

+    SINT32  cmdCount    = sizeof(gShell_Cmds) / sizeof(gShell_Cmds[0]);

+    SINT32  i           = 0;

+    CHAR    *cmd        = NULL;

+    SINT32  cmpLen      = 0;

+    UINT32  ret         = 0;

+    

+    zOss_AssertExN(pCmdMsg != NULL);

+    if (1 != pCmdMsg->paraCount)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓйØÃüÁîµÄÏêϸÐÅÏ¢£¬Çë¼üÈëhelp º¯ÊýÃû");

+        

+        for (i = 0; i < cmdCount; i++)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s \t%s", gShell_Cmds[i].cmd, gShell_Cmds[i].desc);

+        }

+        for (i = 0; i < SHELL_MAX_DYNAMIC_CMD; i++)

+        {

+            if (NULL != gShell_DynamicCmds[i].cmd)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s \t%s", gShell_DynamicCmds[i].cmd, gShell_DynamicCmds[i].desc);

+            }

+            else

+            {

+                break;

+            }

+        }

+    }

+    else

+    {

+        cmd = pCmdMsg->para[0];

+        if (0 == strcmp((char *)cmd, "help"))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\thelp:°ïÖú\n\t help [command]\n\t hÓëhelpͬÒå");

+            return;

+        }

+        

+        i = Shell_findCmd(cmd);

+        if (i >= 0 && i < cmdCount)

+        {

+            cmpLen = strlen(pCmdMsg->para[0]);

+            zOss_Memcpy((char *)pCmdMsg->cmd, pCmdMsg->para[0],cmpLen);

+            pCmdMsg->cmd[cmpLen] = '\0';

+            strncpy((char *)pCmdMsg->para[0], "help", SHELL_CMD_PARAM_LENGTH);

+            pCmdMsg->para[0][SHELL_CMD_PARAM_LENGTH] = '\0';            

+            gShell_Cmds[i].func(pCmdMsg);

+            return;

+        }

+        i = (long)Shell_FindDynamicCmd(cmd);

+        if (i >= SHELL_MAX_DYNAMIC_CMD)

+            return;

+

+        if (NULL != gShell_DynamicCmds[i].cmd)

+        {

+            cmpLen =  strlen(pCmdMsg->para[0]);

+            zOss_Memcpy((char *)pCmdMsg->cmd, pCmdMsg->para[0],cmpLen);

+            pCmdMsg->cmd[cmpLen] = '\0';

+            strncpy((char *)pCmdMsg->para[0], "help", SHELL_CMD_PARAM_LENGTH);

+            pCmdMsg->para[0][SHELL_CMD_PARAM_LENGTH] = '\0';

+            gShell_DynamicCmds[i].func(pCmdMsg);

+            return;

+        }

+        

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÃüÁî: %s ûÓÐÕÒµ½!", cmd);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s¿ªÍ·µÄÃüÁîÈçÏÂ:", cmd);

+        cmpLen = (long)strlen((char *)cmd);

+        ret = ZOSS_ERROR;

+        for (i = 0; i < cmdCount; i++)

+        {

+            if (0 == strnicmp((char *)cmd, (char *)gShell_Cmds[i].cmd, ( unsigned int )cmpLen))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s \t%s", gShell_Cmds[i].cmd, gShell_Cmds[i].desc);

+                ret = ZOSS_SUCCESS;

+            }

+        }

+        for (i = 0; i < SHELL_MAX_DYNAMIC_CMD; i++)

+        {

+            if (NULL != gShell_DynamicCmds[i].cmd)

+            {

+                if (0 == strnicmp((char *)cmd, (char *)gShell_DynamicCmds[i].cmd, ( unsigned int )cmpLen))

+                {

+                    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-20s \t%s", gShell_DynamicCmds[i].cmd, gShell_DynamicCmds[i].desc);

+                    ret = ZOSS_SUCCESS;

+                }

+            }

+            else

+            {

+                break;      /* ÃüÁîΪNULL,½áÊø²éÕÒ */

+            }

+        }

+        if (ZOSS_ERROR == ret)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tûÓÐ%s¿ªÍ·µÄÃüÁî!", cmd);

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÊäÈëhelpÁгöËùÓÐÃüÁî");

+        }

+    }

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_shell_mem.c b/cp/ps/plat/src/oss/sup/src/sup_shell_mem.c
new file mode 100755
index 0000000..57e448a
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_shell_mem.c
@@ -0,0 +1,885 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell_mem.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ÄÚ´æÏà¹ØµÄshellÃüÁî

+* ×÷    Õß : ´ú¿µ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2019-01-10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_shell.h"

+#include "sup_shell_cmd.h"

+#include "sup_except.h"

+#include "osa.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef _DEBUG

+#define UBLEAKNUM   10000

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct 

+{

+	BOOL			isUsed; 							/* ʹÓñê¼Ç 		*/

+	UINT32			usingSize;							/* ʵ¼ÊÕ¼ÓôóС 	*/

+	CHAR			name[ZOSS_UBHEAD_FILENAME_LEN + 1]; /* ÉêÇëλÖÃÎļþÃû	*/

+	UINT32			line;								/* ÉêÇëλÖÃÐкŠ	*/

+	ZOSS_THREAD_ID	threadId;							/* ÉêÇëÏß³ÌID		*/

+	ZOSS_TASK_ID	taskId; 							/* ÉêÇëÈÎÎñºÅ		*/

+	UINT32			applyTimeTick;						/* ÉêÇëʱ¼ä(TICK)	*/

+	UINT32			use_num;							/* ʹÓôÎÊý 		*/

+	UINT32			block_size; 						/* ub¿éµÄ´óС		*/

+}T_DbgMem_UBHead;										/* ÄÚ´æÍ·			*/

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+#ifdef _DEBUG

+extern UINT32           gMem_UBStart;

+extern T_ZOss_UBPOOL    *gMem_UBPoolCfg;

+extern UINT32           gMem_UBPoolNum;

+extern UINT32           gUBSuperviseSitch;

+#endif

+

+#ifdef _OS_TOS

+extern cyg_bool zTos_MmuGetReadableRegion(cyg_uint32 start, cyg_uint32 end, cyg_uint32 *p_start, cyg_uint32 *p_end);

+extern cyg_bool zTos_MmuIsPageCanWrite(cyg_uint32 addr);

+#endif

+#ifdef _OS_OSE

+extern void list_pools(void);

+extern void list_all_sig_info(void);

+extern void list_proc_sig_info(PROCESS pid, OSBOOLEAN listDetail);

+extern BOOL mmu_get_readable_region( UINT32 begin, UINT32 end , UINT32 *p_begin, UINT32 *p_end );

+extern BOOL mmu_is_writeable(UINT32 v_addr);

+extern VOID mmu_generate_info(VOID);

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+#ifdef _USE_HEAP_DEBUG

+static VOID shellSetMemTimeLeak(CHAR *cmd);

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: shellSetUBDebugFlag

+* ¹¦ÄÜÃèÊö: Êä³ö°ïÖúÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN) 

+			cmd:shellÃüÁî

+			(OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+#ifndef _OS_TOS

+static VOID shellSetUBDebugFlag(CHAR *cmd)

+{

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s   n", cmd);

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t nȡֵÕûÐÍ");

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t0±íʾ¹Ø±ÕUB µ÷ÊÔ¿ª¹Ø");

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t·ÇÁãÖµ±íʾ´ò¿ªUB µ÷ÊÔ¿ª¹Ø");

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: shellSetMemTimeLeak

+* ¹¦ÄÜÃèÊö: Êä³ö°ïÖúÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+			cmd:shellÃüÁî

+			(OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+#ifdef _USE_HEAP_DEBUG

+static VOID shellSetMemTimeLeak(CHAR *cmd)

+{	 

+	zOss_AssertExN(cmd != NULL);

+

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s  \n", cmd);

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t¿ªÊ¼Ê±ÊäÈë %s	 leakstart	  й¶µÄ·§Öµ", cmd);

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t½áÊøÊ±ÊäÈë %s	 leakend  ", cmd);

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tй¶µÄ·§ÖµÖ¸¾­¹ý¶à³¤Ê±¼ämemÈç¹ûûÓÐÊͷž͵±×öй¶");

+}

+#endif

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/* ÄÚ´æ¹Û²ì */

+VOID OSS_DbgShowMemInfo(T_Shell_CommandMessage *CmdMsg)

+{

+	T_Mem_MemInfo	meminfo = {0};

+	UINT32			status	= ZOSS_ERROR;

+	

+	zOss_AssertExN(CmdMsg != NULL);

+

+	if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:ÏÔʾÄÚ´æ»ù±¾ÐÅÏ¢", CmdMsg->cmd);

+		return;

+	}

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t=====================================");

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%10s %10s\t %10s","TotalMem","UsedMem","MaxFreeMem");

+	

+	zOss_Memset(&meminfo, 0, sizeof(meminfo));

+	status = zOss_GetSysMemInfo(&meminfo);

+	if (ZOSS_SUCCESS == status)

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%10d %10d\t %10d", meminfo.nMemTotal, meminfo.nMemUsed, meminfo.nMemMaxFree);

+	}

+	else

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tGet mem info error!");

+	}

+	

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t=====================================");

+	return;

+}

+

+VOID OSS_DbgShowUbInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _DEBUG

+	

+	zOss_AssertExN(CmdMsg != NULL);

+	

+	if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:ÏÔʾÄÚ´æ³Ø»ù±¾ÐÅÏ¢,¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s leak:ÏÔʾÄÚ´æ³ØÐ¹Â¶ÐÅÏ¢,¸ÃÃüÁîÔÚoseƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s stat:ÏÔʾÄÚ´æ³ØÍ³¼ÆÐÅÏ¢,¸ÃÃüÁîÔÚoseƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+		return;

+	}

+# if defined (_OS_TOS) || defined (_OS_LINUX)

+	if (0 == CmdMsg->paraCount)

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+	}

+	else if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "leak"))

+	{

+#ifdef _UB_USE_POOL

+		pool_print_leak(0);

+#endif

+	}

+	else if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "stat"))

+	{

+#ifdef _UB_USE_POOL

+		pool_print_alloc_fail();

+		pool_print_free();

+		pool_print_alloc_statistic();

+#endif

+	}

+	else

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈë%s help²éѯÓ÷¨", CmdMsg->cmd);

+	}

+	

+	return;

+# else

+

+	if(0 == gUBSuperviseSitch)

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tubµ÷ÊÔ¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+		return;

+	}

+

+	if(0 == CmdMsg->paraCount)

+	{

+		T_Mem_UBPoolGrpInfo ub_pool_grp_info	= {0};

+		UINT32				i					= 0;

+		

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t	´óС		×ÜÊý		ʹÓÃÊýÄ¿	ʹÓ÷åÖµ");

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===============================================");

+		if (ZOSS_SUCCESS == Mem_GetUBUseInfo(&ub_pool_grp_info, 1))

+		{

+			for (i = 0; i < ub_pool_grp_info.pool_num; i++)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%10d %10d %10d %10d", 

+							ub_pool_grp_info.pool_info[i].pool_size, ub_pool_grp_info.pool_info[i].total_block_num,

+							ub_pool_grp_info.pool_info[i].total_block_num - ub_pool_grp_info.pool_info[i].free_block_num,

+							ub_pool_grp_info.pool_info[i].peak_value);

+			}

+		}

+		else

+		{

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_SEVERE,"\tGet UB info error!");

+		}

+		

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===============================================");

+	}

+	else if (1 == CmdMsg->paraCount && (0 == strcmp((char *)CmdMsg->para[0], "leak") || 0 == strcmp((char *)CmdMsg->para[0], "stat")))

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚoseƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+	}

+	else

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈë%s help²éѯÓ÷¨", CmdMsg->cmd);

+	}

+# endif    

+#else

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµ±Ç°Îªrelease°æ±¾£¬´Ë¹¦ÄܽûÓÃ");

+	return;

+#endif

+}

+

+VOID OSS_DbgShowThreadUbInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _DEBUG

+	zOss_AssertExN(CmdMsg != NULL);

+

+# if defined (_OS_TOS) || defined (_OS_LINUX)

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+	return;

+# else

+

+	if (0 != gUBSuperviseSitch)

+	{

+		if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+		{

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:ÏÔʾָ¶¨Ïß³ÌÉêÇëµÄUB¿éÇé¿ö", CmdMsg->cmd);

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s	[thread_id][ubNum][poolNum]", CmdMsg->cmd);

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t²ÎÊýthread_idΪָ¶¨Ïß³Ìid£¬²»ÄÜΪ¿Õ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t²ÎÊýubNum²éѯ¸ÃÏß³Ìub¿éµÄ×î´óÊýÄ¿");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t²ÎÊýpoolNumΪҪ²éѯµÄÄÚ´æ³ØºÅ£¬ÔÝÎÞЧ¹û£¬Æ½Ì¨Ä¬ÈÏΪ1");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t½á¹ûÏÔʾÁÐ˵Ã÷:");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tNum:UB¿éÐòºÅ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUbSize:Õ¼ÓÃUB¿éµÄ´óС");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUbUsingSize:ʵ¼ÊÕ¼ÓôóС");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tName:UB¿éÉêÇëÎļþ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tLine:UB¿éÉêÇëÐкÅ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUbBlockAdd:UB¿éµØÖ·");

+			return;

+		}

+		else if (3 == CmdMsg->paraCount)

+		{

+			T_Mem_UBBlockInfo	*threadUbInfo	= NULL;

+			T_Mem_UBBlockInfo	*pUbInfoStart	= NULL;

+			ZOSS_THREAD_ID		threadId		= NULL;

+			UINT32				threadUbRealNum = 0;

+			UINT32				i				= 0;

+			UINT32				maxNum			= 0;

+			UINT8				poolNum 		= 1;

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===========================================================================");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-10s%-10s%10s%10s%10s%20s","Num","UbSize", "UbUsingSize","Name","Line","UbBlockAdd");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===========================================================================");

+			

+			if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tthread_id²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+				return;

+			}									  

+			threadId = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[0], NULL, 0);

+			if (NULL == threadId)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tthread_id²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+				return;

+			}

+			

+			maxNum = (UINT32)atoi((const char *)CmdMsg->para[1]);

+			if(0 == maxNum)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tmaxNum²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+				return;

+			}

+			

+			threadUbInfo = (T_Mem_UBBlockInfo *)zOss_Malloc(maxNum * sizeof(T_Mem_UBBlockInfo));

+			zOss_AssertExN(threadUbInfo != NULL);

+			pUbInfoStart = threadUbInfo;

+			

+			threadUbRealNum = Mem_ThreadUBInfo(threadId, threadUbInfo, maxNum, poolNum);

+			if (0 == threadUbRealNum)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t¸ÃÏß³Ì0x%XÔÚ%dºÅÄÚ´æ³ØµÄUBÊýÁ¿Îª0", threadId, poolNum);

+			}

+			else

+			{

+				for (i = 0; i < threadUbRealNum; i++)

+				{

+					zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-10d%-10d%10d%10s%10d%10X", i + 1, 

+								threadUbInfo->ubBlockSize, threadUbInfo->usingSize,

+								threadUbInfo->name, threadUbInfo->line, threadUbInfo->ubBlock);

+					threadUbInfo++;

+				}

+			}

+			zOss_Free(pUbInfoStart);

+			pUbInfoStart = NULL;

+		}

+		else

+		{

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+		}

+	}

+	else

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tubµ÷ÊÔ¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+		return;

+	}

+# endif    

+#else

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµ±Ç°Îªrelease°æ±¾£¬´Ë¹¦ÄܽûÓÃ");

+	return;

+#endif

+}

+

+VOID OSS_DbgShowTaskUbInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _DEBUG

+

+	zOss_AssertExN(CmdMsg != NULL);

+

+# if defined (_OS_TOS) || defined (_OS_LINUX)

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+	return;

+# else

+

+	if (0 != gUBSuperviseSitch)

+	{

+		if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+		{

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:ÏÔʾָ¶¨ÈÎÎñÉêÇëµÄUB¿éÇé¿ö", CmdMsg->cmd);

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s	[task_id][ubNum][poolNum]", CmdMsg->cmd);

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t²ÎÊýtask_idΪָ¶¨ÈÎÎñid£¬²»ÄÜΪ¿Õ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t²ÎÊýubNum²éѯ¸ÃÈÎÎñub¿éµÄ×î´óÊýÄ¿");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t²ÎÊýpoolNumΪҪ²éѯµÄÄÚ´æ³ØºÅ£¬ÔÝÎÞЧ¹û£¬Æ½Ì¨Ä¬ÈÏΪ1");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t½á¹ûÏÔʾÁÐ˵Ã÷:");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUBNumber:UB¿éÐòºÅ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUBsize:Õ¼ÓÃUB¿éµÄ´óС");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUBsize:ʵ¼ÊÕ¼ÓôóС");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUBsize:UB¿éÉêÇëÎļþ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUBsize:UB¿éÉêÇëÐкÅ");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\tUBsize:UB¿éµØÖ·");

+			return;

+		}

+		else if (3 == CmdMsg->paraCount)

+		{

+			T_Mem_UBBlockInfo	*taskUbInfo 		= NULL;

+			T_Mem_UBBlockInfo	*pTaskUbInfoStart	= NULL;

+			ZOSS_TASK_ID		taskId				= NULL;

+			UINT32				taskUbRealNum		= 0;

+			UINT32				i					= 0;

+			UINT32				maxNum				= 0;

+			UINT8				poolNum 			= 1;

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===========================================================================");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-10s%-10s%10s%10s%10s%20s", "Num", "UbSize", "UbUsingSize", "Name", "Line", "UbBlockAdd");

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===========================================================================");

+			

+			if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\ttaskId²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+				return;

+			}									  

+			taskId = (ZOSS_TASK_ID)strtoul((char *)CmdMsg->para[0], NULL, 0);

+			if (NULL == taskId)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\ttaskId²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+				return;

+			}

+			

+			maxNum = (UINT32)atoi((const char *)CmdMsg->para[1]);

+			if(0 == maxNum)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tmaxNum²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+				return;

+			}

+

+			taskUbInfo = (T_Mem_UBBlockInfo *)zOss_Malloc(maxNum * sizeof(T_Mem_UBBlockInfo));

+			zOss_AssertExN(taskUbInfo != NULL);

+			pTaskUbInfoStart = taskUbInfo;

+			

+			taskUbRealNum = Mem_TaskUBInfo(taskId, taskUbInfo ,maxNum, poolNum);

+			if (taskUbRealNum == 0)

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t¸ÃÈÎÎñ0x%XÔÚ%dºÅÄÚ´æ³ØµÄUBÊýÁ¿Îª0", taskId, poolNum);

+			}

+			else

+			{

+				for (i = 0; i < taskUbRealNum; i++)

+				{

+					zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-10d%-10d%10d%10s%10d%10X", i + 1, taskUbInfo->ubBlockSize, taskUbInfo->usingSize,

+								taskUbInfo->name, taskUbInfo->line, taskUbInfo->ubBlock);

+					

+					taskUbInfo++;

+				}

+			}

+			zOss_Free(pTaskUbInfoStart);

+			pTaskUbInfoStart = NULL;

+		}

+		else

+		{

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+		}

+	}

+	else

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tubµ÷ÊÔ¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ\n");

+		return;

+	}

+# endif    

+#else

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµ±Ç°Îªrelease°æ±¾£¬´Ë¹¦ÄܽûÓÃ\n");

+	return;

+#endif

+}

+

+/* µ×²ãµ÷ÊÔÖ¸Áî */

+VOID OSS_DbgGetMem(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT8   *pData      = NULL;

+    UINT32  len         = 0;

+    UINT32  i           = 0;

+    CHAR    *pbuf       = NULL;

+#if (defined _OS_TOS && defined CYGOPT_HAL_ARM_MMU) || defined _OS_OSE

+    UINT32  end         = 0;

+    UINT32  regionStart = 0;

+    UINT32  regionEnd   = 0;

+#endif    

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tshowMem  µØÖ·(Äܹ»±»4Õû³ý)  ³¤¶È[1-256], ·ÃÎÊÎ´ÖªÇøÓò¿ÉÄܵ¼ÖÂÒì³£, ½÷É÷ʹÓÃ!");

+        return;

+    }

+    else

+    {

+        if (2 == CmdMsg->paraCount)

+        {

+            if (0 != Shell_StrisNumber(CmdMsg->para[0]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý%sȡֵֻÄÜÊÇÊý×Ö(10½øÖÆ»ò16½øÖÆ)", CmdMsg->para[0]);

+                return;

+            }

+            pData = (UINT8 *)(strtoul((char *)CmdMsg->para[0], (char **)NULL, 0));

+            if (0 != ((UINT32)pData) % 4)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµØÖ·0x%x(%u)²»Äܱ»4Õû³ý!", pData, pData);

+                return;

+            }

+            if (0 != Shell_StrisNumber(CmdMsg->para[1]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý%sȡֵֻÄÜÊÇÊý×Ö(10½øÖÆ»ò16½øÖÆ)", CmdMsg->para[1]);

+                return;

+            }

+            

+            len = strtoul((char *)CmdMsg->para[1], (char **)NULL, 0);

+            if (!(len > 0 && len <= 256))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÊý¾Ý0x%x(%u)·¶Î§²»¶Ô[1-256]!", len, len);

+                return;

+            }

+#if defined _OS_TOS && defined CYGOPT_HAL_ARM_MMU

+            end = (UINT32)pData + ((len - 1) / 16 + 1) * 16 - 1;

+            zTos_MmuGetReadableRegion((UINT32)pData, end, (cyg_uint32 *)&regionStart, (cyg_uint32 *)&regionEnd);

+            if((UINT32)pData != regionStart || end > regionEnd)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµØÖ·0x%x(%u)~0x%x(%u)´íÎó!", pData, pData, end, end);

+                return;                   

+            }

+#endif

+#ifdef _OS_OSE

+            end = (UINT32)pData + ((len - 1) / 16 + 1) * 16 - 1;

+            mmu_generate_info();

+            mmu_get_readable_region((UINT32)pData, end, &regionStart, &regionEnd);

+            if((UINT32)pData != regionStart || end != regionEnd)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµØÖ·0x%x(%u)~0x%x(%u)´íÎó!", pData, pData, end, end);

+                return;                   

+            }

+#endif

+            pbuf = (CHAR *)zOss_Malloc(256);

+            if (NULL == pbuf)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tzOss_Mallocʧ°Ü");

+                return;

+            }

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t==============================");

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tµØÖ·                     Êý¾Ý");

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t               0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F");

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t==============================");

+            for (i = 0; i < len; i += 16)

+            {

+                sprintf((char *)pbuf, "\t0x%08x     %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x  :  %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", 

+                        (int)pData, pData[0], pData[1], pData[2], pData[3], pData[4], pData[5], pData[6], pData[7], pData[8], pData[9], pData[10], pData[11], pData[12], pData[13], pData[14], pData[15],

+                        CHAR_PRT(pData[0]), CHAR_PRT(pData[1]), CHAR_PRT(pData[2]), CHAR_PRT(pData[3]), CHAR_PRT(pData[4]), CHAR_PRT(pData[5]), CHAR_PRT(pData[6]), CHAR_PRT(pData[7]), 

+                        CHAR_PRT(pData[8]), CHAR_PRT(pData[9]), CHAR_PRT(pData[10]), CHAR_PRT(pData[11]), CHAR_PRT(pData[12]), CHAR_PRT(pData[13]), CHAR_PRT(pData[14]), CHAR_PRT(pData[15]));

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "%s", pbuf);

+                pData += 16;

+            }

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t==============================");

+        }

+        else

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý²»¶Ô!ÊäÈëshowMem help²é¿´°ïÖú");

+        }

+    }

+    

+    if (NULL != pbuf)

+    {

+        zOss_Free(pbuf);

+    }

+}

+

+VOID OSS_DbgSetMem(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32 *pData   = NULL;

+    UINT32 data     = 0;

+

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tsetMem  µØÖ·(Äܹ»±»4Õû³ý)  ÊýÖµ(ÎÞ·ûºÅÕûÐÍ·¶Î§ÄÚ), ·ÃÎÊÎ´ÖªÇøÓò¿ÉÄܵ¼ÖÂÒì³£, ½÷É÷ʹÓÃ!");

+        return;

+    }

+    else

+    {

+        if (2 == CmdMsg->paraCount)

+        {

+            if (0 != Shell_StrisNumber(CmdMsg->para[0]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý%sȡֵֻÄÜÊÇÊý×Ö(10½øÖÆ»ò16½øÖÆ)", CmdMsg->para[0]);

+                return;

+            }

+            pData = (UINT32 *)(strtoul((char *)CmdMsg->para[0], (char **)NULL, 0));

+            if (0 != ((UINT32)pData) % 4)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµØÖ·0x%x(%u)²»Äܱ»4Õû³ý!", pData, pData);

+                return;

+            }

+#if defined (_OS_TOS) && defined (CYGOPT_HAL_ARM_MMU)

+            if(!zTos_MmuIsPageCanWrite((UINT32)pData))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµØÖ·0x%x(%u)²»ÔÊÐíд!", pData, pData);

+                return;

+            }

+#endif

+#ifdef _OS_OSE

+            if(!mmu_is_writeable((UINT32)pData))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tµØÖ·0x%x(%u)²»ÔÊÐíд!", pData, pData);

+                return;

+            }

+#endif

+            if (0 != Shell_StrisNumber(CmdMsg->para[1]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý%sȡֵֻÄÜÊÇÊý×Ö(10½øÖÆ»ò16½øÖÆ)", CmdMsg->para[1]);

+                return;

+            }

+            data = strtoul((char *)CmdMsg->para[1], (char **)NULL, 0);

+            *pData = data;

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÐ޸ĵØÖ·0x%x(%u)µÄÊý¾ÝΪ0x%x(%u)³É¹¦", pData, pData, data, data);

+        }

+        else

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý²»¶Ô!ÊäÈësetMem help²é¿´°ïÖú");

+        }

+    }

+}

+

+VOID Shell_ShowPoolInfo(T_Shell_CommandMessage *CmdMsg)

+{

+    zOss_AssertExN(CmdMsg != NULL);

+

+#ifdef _OS_TOS

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+#endif

+

+#ifdef _OS_OSE    

+    switch (CmdMsg->paraCount)

+    {

+    case 0:

+        {

+            zOss_Printf(SUBMDL_TEST,PRINT_LEVEL_NORMAL, "\t===============================================================================");

+            list_pools();

+            zOss_Printf(SUBMDL_TEST,PRINT_LEVEL_NORMAL, "===============================================================================");

+            break;

+        }

+    default:

+        {

+            if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+            { 

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s", CmdMsg->cmd);

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó£¬Çë¼üÈë%s help²é¿´ÃüÁî˵Ã÷", CmdMsg->cmd);

+            }

+            break;

+        }

+    }

+#endif

+

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSS_SetMenDbgFlag

+* ¹¦ÄÜÃèÊö: ´ò¿ªubµ÷ÊÔ¿ª¹Ø

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shell ÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSA_SetUBDbgSwitch(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _OS_TOS

+    zOss_AssertExN(CmdMsg != NULL);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+    return;

+#elif defined (_OS_LINUX)

+

+#else

+    UINT32 tmp = 0;

+

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 != CmdMsg->paraCount)

+    {

+        shellSetUBDebugFlag(CmdMsg->cmd);

+        return;

+    }

+    if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+    {

+        shellSetUBDebugFlag(CmdMsg->cmd);

+        return;

+    }

+    

+    tmp = strtoul((char*)CmdMsg->para[0], NULL, 0);

+    zOss_SetUbDbgSwitch(tmp);

+    if (tmp)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t³É¹¦´ò¿ªubµÄµ÷ÊÔ¿ª¹Ø");

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t³É¹¦¹Ø±ÕubµÄµ÷ÊÔ¿ª¹Ø");

+    }

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSA_DbgMemInfo

+* ¹¦ÄÜÃèÊö: ¼ì²émemµÄʹÓÃÐÅÏ¢(й¶ºÍÔ½½ç)

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSA_DbgMemInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _USE_HEAP_DEBUG

+    zOss_AssertExN(CmdMsg != NULL);

+      

+    if(CmdMsg->paraCount == 0)

+    {

+        zOss_CheckMem();

+    }

+    else if (CmdMsg->paraCount == 1 && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s", CmdMsg->cmd);

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÊäÈë%s help ²é¿´ÃüÁîÓ÷¨", CmdMsg->cmd);

+    }

+#else

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t_USE_HEAP_DEBUGδ´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+    return;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSA_DbgMemTimeLeakInfo

+* ¹¦ÄÜÃèÊö: ¼ì²éµÄij¸öʱ¼ä¶ÎMemµÄй¶ÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSA_DbgMemTimeLeakInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _USE_HEAP_DEBUG

+    UINT32 tmp = 0;

+

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if ((CmdMsg->paraCount == 2) && (0 == strcmp((const char *)CmdMsg->para[0], "leakstart")))

+    {

+        if (-1 == Shell_StrisNumber(CmdMsg->para[1]))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó");

+            return;

+        }

+        tmp = strtoul((char*)CmdMsg->para[1], NULL, 0);

+        zOss_MemLeakStart(tmp);

+    }

+    else if ((CmdMsg->paraCount == 1) && (0 == strcmp((const char *)CmdMsg->para[0], "leakend")))

+    {

+        zOss_MemLeakEnd();

+    }

+    else

+    {

+        shellSetMemTimeLeak(CmdMsg->cmd);

+    }

+#else

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t_USE_HEAP_DEBUGδ´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+    return;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSA_UBLeakInfo

+* ¹¦ÄÜÃèÊö: ¸ù¾ÝÄÚ´æºÅͳ¼ÆÄÚ´æ³ØµÄʹÓÃÇé¿ö

+* ²ÎÊý˵Ã÷: (IN)

+            poolNum:ÄÚ´æ³ØºÅ

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSA_UBLeakInfo(UINT32 poolNum)

+{

+#if defined (_OS_OSE) || defined (_OS_WIN)

+#if defined (_DEBUG)

+    T_Mem_UBPoolCtl     *pUbControlStart    = NULL;

+    T_Mem_UBListNode    *pUbListNodeStart   = NULL;

+    UINT32              i                   = 0;

+    UINT32              j                   = 0;

+    UINT32              k                   = 0;

+    UINT32              tmpPoolNum          = 0;

+    T_Mem_UBListNode    *pUbListNodeTemp    = NULL;

+    T_DbgMem_UBHead     *pUBDbgLeakInfo     = NULL;

+    T_DbgMem_UBHead     *pTmpUBDbgLeakInfo  = NULL;

+    UINT32              UBLeakNum           = 0;

+    UINT32              tmpSize             = 0;

+    

+    tmpPoolNum = poolNum;

+    pUbControlStart = (T_Mem_UBPoolCtl *)gMem_UBStart;

+    pUbListNodeStart = (T_Mem_UBListNode *)(pUbControlStart + gMem_UBPoolNum); 

+    pUbListNodeTemp = pUbListNodeStart;

+    tmpSize = sizeof(T_DbgMem_UBHead) * gMem_UBPoolCfg[tmpPoolNum].total_block_num;

+    

+    pUBDbgLeakInfo = (T_DbgMem_UBHead *)zOss_Malloc(tmpSize);

+    

+    zOss_AssertExN(NULL != pUBDbgLeakInfo);

+    

+    zOss_Memset(pUBDbgLeakInfo, 0, tmpSize);

+    pTmpUBDbgLeakInfo = pUBDbgLeakInfo;

+    for (i = 0; i < tmpPoolNum; i++)

+    {

+        pUbListNodeTemp = pUbListNodeTemp + gMem_UBPoolCfg[i].total_block_num;

+    }

+    

+    for (j = 0; j < gMem_UBPoolCfg[tmpPoolNum].total_block_num; j++)

+    {

+        if (pUbListNodeTemp->ubBlockHeader.isUsed == TRUE)

+        {

+            for (k = 0; k < UBLeakNum; k++)

+            {

+                pTmpUBDbgLeakInfo = pUBDbgLeakInfo + k;

+                if ((0 == strcmp((char *)pTmpUBDbgLeakInfo->name, (char *)pUbListNodeTemp->ubBlockHeader.name)) && 

+                                (pTmpUBDbgLeakInfo->line == pUbListNodeTemp->ubBlockHeader.line) &&

+                                (pTmpUBDbgLeakInfo->usingSize == pUbListNodeTemp->ubBlockHeader.usingSize) && 

+                                (pTmpUBDbgLeakInfo->taskId == pUbListNodeTemp->ubBlockHeader.taskId) && 

+                                (pTmpUBDbgLeakInfo->threadId == pUbListNodeTemp->ubBlockHeader.threadId))

+                {

+                    ++pTmpUBDbgLeakInfo->use_num;

+                    break;

+                }

+                

+            }

+            if (k >= UBLeakNum)

+            {

+                pTmpUBDbgLeakInfo = pUBDbgLeakInfo + UBLeakNum;

+                zOss_Memcpy(pTmpUBDbgLeakInfo, (char *)pUbListNodeTemp, sizeof(T_Mem_UBListNode) - 4);  /* ¿½±´ÄÚ´æÍ· */

+                pTmpUBDbgLeakInfo->use_num = 1;

+                ++UBLeakNum;

+            }

+        }

+        pUbListNodeTemp++;

+    }

+    

+    for (i = 0; i < UBLeakNum; i++)

+    {

+        pTmpUBDbgLeakInfo = pUBDbgLeakInfo + i;

+        zOss_Printf(SUBMDL_OSA, PRINT_LEVEL_SEVERE, "\tÄÚ´æ¿éÒÑʹÓôóС:%-8d й©ÎļþÃû×Ö:%-30s ÐкÅ:%-8d  Ïß³ÌID :0x%08x      ÈÎÎñID :0x%08x      ʹÓôÎÊý:%-8d", 

+                    pTmpUBDbgLeakInfo->usingSize, pTmpUBDbgLeakInfo->name, pTmpUBDbgLeakInfo->line, pTmpUBDbgLeakInfo->threadId, 

+                    pTmpUBDbgLeakInfo->taskId, pTmpUBDbgLeakInfo->use_num);

+    }

+    

+    zOss_Sleep(1000);

+    zOss_Free(pUBDbgLeakInfo);

+#endif  // #if defined (_DEBUG)

+#endif  // #if defined (_OS_OSE) || defined (_OS_WIN)

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSA_DbgUbInfo

+* ¹¦ÄÜÃèÊö: ubµ÷ÊÔÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSA_DbgUbInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _DEBUG

+    zOss_AssertExN(CmdMsg != NULL);    

+# if defined (_OS_TOS) || defined (_OS_LINUX)

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+    return;

+# else

+

+    if(0 == gUBSuperviseSitch)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tubµ÷ÊÔ¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+        return;

+    }

+

+    if(CmdMsg->paraCount == 0)

+    {

+        UINT32 pool_num = 0;  

+        for (pool_num = 0; pool_num < gMem_UBPoolNum; pool_num++)

+        {

+            OSA_UBLeakInfo(pool_num);

+        }

+    }

+    else if (CmdMsg->paraCount == 1 && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s", CmdMsg->cmd);

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÊäÈë%s help ²é¿´ÃüÁîÓ÷¨", CmdMsg->cmd);

+    }

+# endif

+#endif

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_shell_misc.c b/cp/ps/plat/src/oss/sup/src/sup_shell_misc.c
new file mode 100755
index 0000000..139f7a8
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_shell_misc.c
@@ -0,0 +1,943 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell_misc.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : misc shellÃüÁî

+* ×÷    Õß : ´ú¿µ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2019-01-10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_shell.h"

+#include "sup_shell_cmd.h"

+#include "sup_except.h"

+#include "osa.h"

+

+#ifdef _USE_MULTI_CORE_RAMDUMP

+#include "sup_ramdump.h"

+#else

+#include "osa_ramdump.h"

+#endif

+

+#ifdef _OS_LINUX

+#include <linux/kernel.h>

+#else

+#include <stdio.h>

+#include <stdlib.h>

+#endif

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+#ifdef _OS_LINUX

+extern UINT32 zOss_SetProcessPri(VOID *thread_id, UINT32 priority);

+extern UINT32 zOss_GetProcessPri(VOID *thread_id, UINT32 priority);

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef _OS_TOS

+# define GMON_OUT_FILE  "/c/gmon.out"

+#endif

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_SetIrqLogFlag

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÖжϵ÷ÊÔÐÅÏ¢µÄflag

+* ²ÎÊý˵Ã÷£º(IN)

+				flag:´ò¿ª»ò¹Ø±ÕµÄ±êÖ¾;

+			(OUT)

+				ÎÞ;

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID Shell_SetIrqLogFlag(UINT32 flag)

+{

+#ifdef TOS_STATISTIC_IRQ

+	if (flag == 0)

+	{

+		tos_statistic_irq_close();

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ³É¹¦¹Ø±ÕÖжÏͳ¼Æ¹¦ÄÜ;");

+	}

+	else

+	{

+		tos_statistic_irq_open();

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ³É¹¦´ò¿ªÖжÏͳ¼Æ¹¦ÄÜ;");

+	}		 

+#else

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ºêTOS_STATISTIC_IRQûÓдò¿ª;");

+#endif

+

+#ifdef TOS_TRACE_IRQ

+	if (flag == 0)

+	{

+		tos_trace_irq_close();

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ³É¹¦¹Ø±ÕÖжϸú×Ù¹¦ÄÜ;");

+	}

+	else

+	{

+		tos_trace_irq_open();

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ³É¹¦´ò¿ªÖжϸú×Ù¹¦ÄÜ;");

+	}

+#else

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ºêTOS_TRACE_IRQûÓдò¿ª;");

+#endif       

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºShell_SetThreadLogFlag

+* ¹¦ÄÜÃèÊö£ºÉèÖÃÏ̵߳÷ÊÔÐÅÏ¢µÄflag

+* ²ÎÊý˵Ã÷£º(IN)

+				flag:´ò¿ª»ò¹Ø±ÕµÄ±êÖ¾;

+			(OUT)

+				ÎÞ;

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID Shell_SetThreadLogFlag(UINT32 flag)

+{

+#ifdef OSS_TRACE_THREAD

+	if (flag == 0)

+	{

+		oss_trace_thread_close();

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ³É¹¦¹Ø±ÕÏ̸߳ú×Ù¹¦ÄÜ;");

+	}

+	else

+	{

+		oss_trace_thread_open();

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ³É¹¦´ò¿ªÏ̸߳ú×Ù¹¦ÄÜ;");

+	}

+#else

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ºêOSS_TRACE_THREADûÓдò¿ª;");

+#endif   

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/* »ù±¾ÃüÁî */

+VOID OSS_DbgShowBootInfo(T_Shell_CommandMessage *CmdMsg)

+{ 

+	zOss_AssertExN(CmdMsg != NULL);

+

+	if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:´òÓ¡Æô¶¯ÐÅÏ¢", CmdMsg->cmd);

+		return;

+	}

+

+	zOss_RamPrintf();

+}

+

+VOID OSS_DbgSetWintracePrintFlag(T_Shell_CommandMessage *CmdMsg)

+{

+	UINT32 type = 0;

+	

+	zOss_AssertExN(CmdMsg != NULL);

+	if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+	{

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s	type", CmdMsg->cmd);

+		zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\ttype:ȡֵ0»ò1¡£1±íʾ´ò¿ª£¬0±íʾ¹Ø±Õ");

+		return;

+	}

+	else

+	{

+		if (1 == CmdMsg->paraCount)

+		{

+			if (0 != Shell_StrisNumber(CmdMsg->para[0]))

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\ttypeÖ»ÄÜȡֵÊÇÊý×Ö");

+				return;

+			}

+			type = strtoul((char *)CmdMsg->para[0], (char **)NULL, 0);

+			if (type < 2)

+			{

+				Shell_SetPrintFlag(type);

+			}

+			else

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\ttype:ȡֵ0»ò1¡£1±íʾ´ò¿ª£¬0±íʾ¹Ø±Õ");

+			}

+		}

+		else

+		{

+			zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó£¬ÊäÈë%s help»ñµÃ°ïÖú", CmdMsg->cmd);

+		}

+	}

+}

+

+VOID OSS_DbgRamdumpConfigRegionInfo (T_Shell_CommandMessage *CmdMsg)

+{    

+#ifdef _USE_MULTI_CORE_RAMDUMP

+    T_zOss_RamdumpRegion regionInfo = {0};

+#else

+    UINT32  base        = 0;

+    UINT32  size        = 0;

+    UINT32  map_base    = 0;

+    UINT32  copy_base   = 0;

+#endif

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    switch (CmdMsg->paraCount)

+    {

+    case 1:

+        {

+            if (0 == strcmp((char *)CmdMsg->para[0], "help"))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, 

+                            "\tÅäÖõ¼³öÄÚ´æÇøÓò£¬ÒÔ16½øÖÆÐÎʽÊäÈëÄÚ´æÆðʼµØÖ·ºÍÄÚ´æ¶Î´óС£¬ÖмäÓÿոñ¸ô¿ª");

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëramdumpConfigRegion help²éѯÓ÷¨");

+            }           

+            break;

+        }

+    case 2:

+        {

+            if (-1 == Shell_StrisNumber(CmdMsg->para[0]) || -1 == Shell_StrisNumber(CmdMsg->para[1]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëramdumpConfigRegion help²éѯÓ÷¨");

+                break;

+            }            

+#ifdef _USE_MULTI_CORE_RAMDUMP

+            regionInfo.baseForServer = strtoul((char *)CmdMsg->para[0], NULL, 16);

+            regionInfo.size          = strtoul((char *)CmdMsg->para[1], NULL, 16);

+            regionInfo.baseForSelf   = regionInfo.baseForServer;

+            regionInfo.baseForCopy   = 0;

+            

+            zOss_RamdumpConfigureMem(&regionInfo);

+#else

+            base = strtoul((char *)CmdMsg->para[0], NULL, 16);

+            size = strtoul((char *)CmdMsg->para[1], NULL, 16);

+            map_base    = base;

+            copy_base   = 0;

+            

+            zOss_RamdumpConfigureMem(base, size, map_base, copy_base);

+#endif

+            break;

+        }

+    default:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëramdumpConfigRegion help²éѯÓ÷¨");

+            break;

+        }

+    }

+}

+

+VOID OSS_DbgShowMsg(T_Shell_CommandMessage *CmdMsg)

+{

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t¸ÃÃüÁîδʵÏÖ");

+}

+

+#if defined(__ARMCC_VERSION) && __ARMCC_VERSION > 220000

+__asm shell_GetR11(VOID)

+{

+    mov r0, r11

+    bx lr

+}

+#endif

+

+VOID OSS_DbgShowRegInfo(T_Shell_CommandMessage *CmdMsg)

+{

+#if defined(__ARMCC_VERSION) && __ARMCC_VERSION > 220000

+    UINT32 Reg11    = 0;

+    UINT32 spReg    = 0;

+    UINT32 pcReg    = 0;

+    UINT32 lrReg    = 0;

+    UINT32 cReg     = 0;

+    UINT32 sReg     = 0;

+#endif

+

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s", CmdMsg->cmd);

+        return;

+    }

+

+#if defined(__ARMCC_VERSION) && __ARMCC_VERSION > 220000

+    Reg11 = shell_GetR11();

+    __asm

+    {

+        MOV spReg, __current_sp()

+        MOV pcReg, __current_pc()

+        MOV lrReg, __return_address()

+        MRS cReg, CPSR

+        MRS sReg, SPSR

+    }

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tfp:0x%08x", Reg11);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tsp:0x%08x", spReg);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tpc:0x%08x", pcReg);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tlr:0x%08x", lrReg);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tcpsr:0x%08x", cReg);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tspsr:0x%08x", sReg);

+#else

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t¸Ã¹¦ÄÜδʵÏÖ");

+#endif

+}

+

+VOID OSS_DbgReboot(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32 type = 0;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\treboot  type");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\ttype:ȡֵ1»ò2¡£1±íʾÈí¼þÖØÆô£¬2±íʾӲ¼þÖØÆô");

+        return;

+    }

+    else

+    {

+        if (1 == CmdMsg->paraCount)

+        {

+            if (0 != Shell_StrisNumber(CmdMsg->para[0]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\ttypeÖ»ÄÜȡֵÊÇÊý×Ö");

+                return;

+            }

+            type = strtoul((char *)CmdMsg->para[0], (char **)NULL, 0);

+            switch (type)

+            {

+            case 1:

+                {

+                    zOss_SysSoftReset(SYS_RESET_TO_NORMAL);

+                    break;

+                }

+            case 2:

+                {

+                    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tº¯Êý½Ó¿Ú»¹Î´ÊµÏÖ");

+                    break;

+                }

+            default:

+                {

+                    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\ttype:0x%x(%u)ȡֵ´íÎó£¬ÊäÈëreboot help»ñµÃ°ïÖú", type, type);

+                    break;

+                }

+            }

+        }

+        else

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó£¬ÊäÈëreboot help»ñµÃ°ïÖú");

+        }

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ÌáÈ¡³öprofileÊý¾Ý

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  void

+*   (´«³ö²ÎÊý)  void

+*				void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID Shell_ProfileRecords(VOID)

+{

+#if defined (_OS_TOS) && defined (CYGPKG_PROFILE_GPROF) 

+	FILE *file                              = NULL;

+	UINT32 bucket                           = 0;

+	UINT32 size                             = 0;

+	CHAR* buf                               = NULL;

+	CHAR* hist_data_start                   = NULL;

+    profile_records_t *profile_records_ptr  = NULL;

+

+	profile_records_ptr = cyg_profile_get_records();

+    size =  sizeof(struct gmon_hdr)+

+            sizeof(profile_records_ptr->profile_tags[0])+

+            sizeof(struct gmon_hist_hdr)+

+            profile_records_ptr->profile_hist_hdr.hist_size*sizeof(profile_time_t);

+

+    buf = (CHAR *)zOss_Malloc(size);

+    if (!buf)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t·ÖÅä¿Õ¼äʧ°Ü!");

+        return;

+    }

+

+    hist_data_start = buf + sizeof(struct gmon_hdr)

+                          + sizeof(profile_records_ptr->profile_tags[0])

+                          + sizeof(struct gmon_hist_hdr);

+

+    zOss_Memset(buf, 0, size);

+    zOss_Memcpy(buf, &profile_records_ptr->profile_gmon_hdr, sizeof(struct gmon_hdr));

+    zOss_Memcpy(buf+sizeof(struct gmon_hdr), 

+                &profile_records_ptr->profile_tags[0], 

+                sizeof(profile_records_ptr->profile_tags[0]));

+    zOss_Memcpy(buf+sizeof(struct gmon_hdr) + sizeof(profile_records_ptr->profile_tags[0]),

+                &profile_records_ptr->profile_hist_hdr,

+                sizeof(struct gmon_hist_hdr));

+#ifdef CYGPKG_PROFILE_HIST_HOOK

+    for (bucket = 0; bucket < profile_records_ptr->profile_hist_hdr.hist_size; bucket++)

+    {

+        if (profile_records_ptr->profile_hist_data_ptr[bucket].sum_time)

+            zOss_Memcpy((hist_data_start + sizeof(profile_time_t)*bucket),

+                        &(profile_records_ptr->profile_hist_data_ptr[bucket].sum_time),

+                        sizeof(profile_time_t));

+    }

+#else

+    zOss_Memcpy(hist_data_start, profile_records_ptr->profile_hist_data_ptr,

+                profile_records_ptr->profile_hist_hdr.hist_size*sizeof(profile_time_t));

+#endif

+

+	if ((file = zOss_FOpen(GMON_OUT_FILE, "wb")) == NULL)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t´ò¿ªgmon.outÎļþʧ°Ü!");

+        zOss_Free((VOID *)buf);

+        return;

+    }

+

+	size = zOss_FWrite(buf, size, 1, file);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, size ? "\t\t ³É¹¦Íê³Éдgmon.outÎļþ!" : "\t\tдgmon.outÎļþʧ°Ü!");

+    zOss_FClose(file);

+    zOss_Free((VOID *)buf);

+#endif	// #if defined (_OS_TOS) && defined (CYGPKG_PROFILE_GPROF)

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö:     ½«ÏµÍ³ÔËÐÐʱµÄprofileÐÅÏ¢µ¼³ö

+* ²ÎÊý˵Ã÷:     

+*   (´«Èë²ÎÊý)  CmdMsg: shellÃüÁîÏûÏ¢Ö¸Õë

+*   (´«³ö²ÎÊý)  void

+* ·µ »Ø Öµ:     void

+* ÆäËü˵Ã÷:     void

+**************************************************************************/

+VOID OSS_DbgProfile(T_Shell_CommandMessage *CmdMsg)

+{

+#if defined (_OS_TOS) && defined (CYGPKG_PROFILE_GPROF)

+    zOss_AssertExN(CmdMsg != NULL);

+

+    Shell_ProfileRecords();

+#endif  // #if defined (_OS_TOS) && defined (CYGPKG_PROFILE_GPROF)

+}

+

+VOID Shell_ShowProcSig(T_Shell_CommandMessage *CmdMsg)

+{

+    zOss_AssertExN(CmdMsg != NULL);

+

+#ifdef _OS_TOS

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÔÚtosƽ̨ÎÞʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+#endif

+

+#ifdef _OS_OSE

+    switch (CmdMsg->paraCount)

+    {

+    case 0:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "===============================================================================");

+            list_all_sig_info();

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "===============================================================================");

+            break;

+        }

+    default:

+        {

+            if (CmdMsg->paraCount == 1)

+            {

+                if (0 == strcmp((char *)CmdMsg->para[0], "help"))

+                {

+                    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s : ÏÔʾÏß³ÌsignalÐÅÏ¢", CmdMsg->cmd);

+                    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t %s  [thread_id]", CmdMsg->cmd);

+                    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t ²ÎÊýthread_idΪָ¶¨Ïß³Ìid,Èç¹û²»Ö¸¶¨,ÏÔʾËùÓÐÏß³ÌsignalÐÅÏ¢");

+                }

+                else

+                {

+                    ZOSS_THREAD_ID pid = NULL;

+                    if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tthread_id²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+                        return;

+                    }                         

+                    pid = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[0], NULL, 0);

+                    if (NULL == pid)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tthread_id²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+                        return;

+                    }

+

+                    if (OSA_IdentifyThread(pid) != ZOSS_SUCCESS)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó:Ïß³Ì%#lx²»´æÔÚ", pid);

+                    }

+                    else

+                    {

+                        list_proc_sig_info((PROCESS)pid, 1);

+                    }

+                }

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó£¬Çë¼üÈë%s help²é¿´ÃüÁî˵Ã÷", CmdMsg->cmd);

+            }

+            break;

+        }

+    }

+#endif

+

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_OpenTraceSwitch

+* ²ÎÊý˵Ã÷:     

+*           (IN)  CmdMsg: shellÃüÁîÏûÏ¢Ö¸Õë

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_OpenTraceSwitch(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _OS_TOS

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if(0 == strcmp(CmdMsg->para[0], "help") && CmdMsg->paraCount == 1)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t irq:´ò¿ª»òÕ߹رÕÖжÏͳ¼ÆºÍ¸ú×Ù¹¦ÄÜ; thread: ´ò¿ª»ò¹Ø±ÕÏ̸߳ú×Ù¹¦ÄÜ;");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t 0:¹Ø±ÕÏàÓ¦µÄ¹¦ÄÜ, 1:´ò¿ªÏàÓ¦µÄ¹¦ÄÜ;");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÀýÈç:openTraceSwitch irq 1»òÕßopenTraceSwitch irq 0£¬´ò¿ª»òÕ߹رÕÖжÏͳ¼ÆºÍ¸ú×Ù¹¦ÄÜ;");

+        return;

+    }

+

+    if(CmdMsg->paraCount == 2 && -1 != Shell_StrisNumber(CmdMsg->para[1]))

+    {

+        UINT32 type = strtoul((char *)CmdMsg->para[1], NULL, 0);

+        if(type == 0 || type == 1)

+        {

+            if(0 == strcmp(CmdMsg->para[0], "irq"))

+            {

+                Shell_SetIrqLogFlag(type);

+                return;

+            }            

+            if(0 == strcmp(CmdMsg->para[0], "thread"))

+            {

+                Shell_SetThreadLogFlag(type);

+                return;

+            }

+        }

+    }

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîÊäÈë´íÎó;");

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÇëÊäÈë%s help²é¿´¸ÃÃüÁîµÄ¹¦ÄÜ;", CmdMsg->cmd);

+#else

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÖ»ÔÚTOSƽ̨ÓÐʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+#endif

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_SetAssertLevel

+* ²ÎÊý˵Ã÷:     

+*           (IN)  CmdMsg: shellÃüÁîÏûÏ¢Ö¸Õë

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_SetAssertLevel(T_Shell_CommandMessage *CmdMsg)

+{

+#ifdef _OS_TOS

+    UINT32 level = 0;

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    if(0 == strcmp(CmdMsg->para[0], "help") && CmdMsg->paraCount == 1)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÉèÖÃÄں˶ÏÑԵȼ¶1:ÑÏÖØ 2: Ò»°ã 3: Çá;");

+        return;

+    }

+    if ((CmdMsg->paraCount != 1) || (-1 == Shell_StrisNumber(CmdMsg->para[0])))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîÊäÈë´íÎó;");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÇëÊäÈë%s help²é¿´¸ÃÃüÁîµÄ¹¦ÄÜ;", CmdMsg->cmd);

+        return;

+    }

+    level = strtoul((char *)CmdMsg->para[0], NULL, 0);

+    if(level >= 1 && level <= 3)

+    {

+        cyg_set_dbg_level(level);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:ÉèÖóɹ¦", CmdMsg->cmd);

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîÊäÈë´íÎó;");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÇëÊäÈë%s help²é¿´¸ÃÃüÁîµÄ¹¦ÄÜ;", CmdMsg->cmd);

+    }

+#else

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:¸ÃÃüÁîÖ»ÔÚTOSƽ̨ÓÐʵ¼Ê¹¦ÄÜ", CmdMsg->cmd);

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSS_DbgSuspendThread

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSS_DbgSuspendThread(T_Shell_CommandMessage *CmdMsg)

+{

+    ZOSS_THREAD_ID  thread_id   = NULL;

+    UINT32          result      = 0;

+    UINT8           i           = 0;

+   

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    switch (CmdMsg->paraCount)

+    {

+    case 0:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tsuspend_thread:no followed by thread_id!");

+            break;

+        }

+    default:

+        {

+            if (CmdMsg->paraCount == 1 && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tsuspend_thread:followed by the specified thread ID to suspend the thread!");

+            }

+            else

+            {

+                for (i = 0; i < CmdMsg->paraCount; i++)

+                {

+                    thread_id = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[i], NULL, 0);

+                    

+                    if (thread_id == NULL)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+                        break;

+                    }

+                    if (OSA_IdentifyThread(thread_id) == ZOSS_ERROR)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+                        break;

+                    }

+

+                    result = zOss_SuspendThread(thread_id);

+                    

+                    if (result != ZOSS_SUCCESS)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tSuspend Thread Fail!");

+                    }

+                    else

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tSuspend Thread OK!");

+                    }

+                }

+            }

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSS_DbgResumeThread

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSS_DbgResumeThread(T_Shell_CommandMessage *CmdMsg)

+{

+    ZOSS_THREAD_ID  thread_id   = NULL;

+    UINT32          result      = 0;

+    UINT8           i           = 0;

+   

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    switch (CmdMsg->paraCount)

+    {

+    case 0:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tresum_thread:no followed by thread_id!");

+            break;

+        }

+    default:

+        {

+            if (CmdMsg->paraCount == 1 && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tresum_thread:followed by the specified thread ID to resume the thread!");

+            }

+            else

+            {

+                for (i = 0; i < CmdMsg->paraCount; i++)

+                {

+                    thread_id = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[i], NULL, 0);

+                    

+                    if (thread_id == NULL)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+                        break;

+                    }

+                    if (OSA_IdentifyThread(thread_id) == ZOSS_ERROR)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+                        break;

+                    }

+

+                    result = zOss_ResumeThread(thread_id);

+                    

+                    if (result != ZOSS_SUCCESS)

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tResume Thread Fail!");

+                    }

+                    else

+                    {

+                        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tResume Thread OK!");

+                    }

+                }

+            }

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSS_DbgSetThreadPri

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSS_DbgSetThreadPri(T_Shell_CommandMessage *CmdMsg)

+{

+    ZOSS_THREAD_ID  thread_id   = NULL;

+    UINT32          result      = 0;

+    UINT32          pre_prio    = 0;

+    UINT32          priority    = 0;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+

+    switch (CmdMsg->paraCount)

+    {

+    case 0:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tset_thread_pri:no followed by thread_id and priority!");

+        }

+        break;

+    case 1:

+        {

+            if (CmdMsg->paraCount == 1 && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tset_thread_pri:followed by the specified thread ID and priority to set priority of the thread!");

+            }

+        }

+        break;

+    default:

+        {

+            thread_id = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[0], NULL, 0);

+            

+            if (thread_id == NULL)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+                break;

+            }

+#ifdef _OS_LINUX

+            priority = strtoul((char *)CmdMsg->para[1], NULL, 0);

+            if (priority > 99 || priority <= 0)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong priority! now can only set RT prio 1~99");

+                break;

+            }

+            result = zOss_GetProcessPri((VOID *)thread_id, &pre_prio);

+            if (result != ZOSS_SUCCESS)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+            }

+            result = zOss_SetProcessPri(thread_id, priority);

+#else

+            if (OSA_IdentifyThread(thread_id) != ZOSS_SUCCESS)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, " The thread 0x%08x is not exist!",thread_id);

+                break;

+            }

+

+            priority = strtoul((char *)CmdMsg->para[1], NULL, 0);

+            if (priority > 31)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong priority!");

+                break;

+            }

+            

+            result = zOss_GetThreadPri(thread_id, &pre_prio);

+            if (result != ZOSS_SUCCESS)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\twrong thread_id!");

+            }

+            result = zOss_SetThreadPri(thread_id, priority);

+#endif

+            

+            if (result == ZOSS_SUCCESS)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tPrior Set From %u to %u OK!",  pre_prio, priority);

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tPrior Set  From %u to %u Fail!", pre_prio, priority);

+            }

+        }

+        break;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSA_ForceRamdump

+* ¹¦ÄÜÃèÊö: Ç¿ÖÆ²úÉúÒì³£,ÒÔ±ãramdump

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSA_ForceRamdump(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32 ret = 0;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 == CmdMsg->paraCount)

+    {

+        if (0 == strcmp((char *)CmdMsg->para[0], "help"))

+        {

+#ifdef _USE_MULTI_CORE_RAMDUMP

+#ifdef _USE_ARM1_RAMDUMP

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t0:serverÇ¿ÖÆËÀ»ú, ·ÇÁãÖµ:clientÇ¿ÖÆËÀ»ú(N¸öclient¶ÔÓ¦Êý×Ö1:N),Arm1¶ÔÓ¦255");

+#else

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t0:serverÇ¿ÖÆËÀ»ú, ·ÇÁãÖµ:clientÇ¿ÖÆËÀ»ú(N¸öclient¶ÔÓ¦Êý×Ö1:N)");

+#endif

+#else

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t0:ARMÒì³£ 1: ¶ÏÑÔÒì³£ 2: ²Ù×÷ϵͳ¶ÏÑÔÒì³£");

+#endif

+            return;

+        }

+        

+        if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+            return;

+        }

+            

+        ret = strtoul((char *)CmdMsg->para[0], NULL, 0);

+#ifdef _USE_MULTI_CORE_RAMDUMP

+        if(ret == 0)

+        {

+            zOss_AssertExN(FALSE);

+        }

+        else

+        {            

+            ret = zOss_RamdumpForceClientException(ret);

+            if(ret != ZOSS_SUCCESS)

+               zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+        }

+#else

+        if(ret <= 2)

+        {

+            zOss_RamdumpForceException(ret);

+        }

+        else

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+        }

+#endif

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSA_DbgTrace

+* ¹¦ÄÜÃèÊö: ²é¿´¸ú×ÙÄ£¿éÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            CmdMsg:shellÃüÁî²ÎÊý

+            (OUT)

+* ·µ »Ø Öµ: VOID

+* ÆäËü˵Ã÷: VOID

+**************************************************************************/

+VOID OSA_DbgTrace(T_Shell_CommandMessage *CmdMsg)

+{

+    zOss_AssertExN(CmdMsg != NULL);

+

+    switch (CmdMsg->paraCount)

+    {

+    case 1:

+        {

+            if (strcmp((const char *)CmdMsg->para[0], "init") == 0)

+            {

+                zOss_TraceFuncInit();

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\ttrace¸ú×Ù¹¦Äܳõʼ»¯³É¹¦");                

+            }

+            else if (strcmp((const char *)CmdMsg->para[0], "info") == 0)

+            {

+                zOss_TraceFuncInfo(NULL);

+            }

+            else if (strcmp((const char *)CmdMsg->para[0], "help") == 0)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\ttrace¹¦ÄÜ:²é¿´¸ú×ÙÄ£¿éÐÅÏ¢");

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t³õʼ»¯¸ú×Ù±ê־λ trace init");

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²é¿´¸ú×Ùº¯ÊýÐÅÏ¢ trace info [funcname]");

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tfuncnameΪº¯ÊýÃû");

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+            }

+            break;

+        }

+    case 2:

+        {

+            if (strcmp((const char *)CmdMsg->para[0], "info") == 0)

+            {

+                zOss_TraceFuncInfo(CmdMsg->para[1]);

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+            }

+            break;

+        }

+    default:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+            break;

+        }

+    }

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_shell_psm.c b/cp/ps/plat/src/oss/sup/src/sup_shell_psm.c
new file mode 100755
index 0000000..fb51e7d
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_shell_psm.c
@@ -0,0 +1,222 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell_psm.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Ê¡µçÏà¹ØµÄshellÃüÁî

+* ×÷    Õß : ´ú¿µ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2019-01-10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_shell.h"

+#include "sup_shell_cmd.h"

+#include "sup_except.h"

+#include "osa.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+ 

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+#ifdef _USE_PSM

+ZOSS_SEMAPHORE_ID g_zTos_PsmInfoSema   = NULL;

+ZOSS_TIMER_ID	  g_zTos_PsmInfoTimer  = NULL;

+ZOSS_THREAD_ID	  g_zTos_PsmInfoThread = NULL;

+#ifdef _USE_CPU_DFM

+ZOSS_SEMAPHORE_ID g_zTos_DfmInfoSema   = NULL;

+ZOSS_TIMER_ID	  g_zTos_DfmInfoTimer  = NULL;

+ZOSS_THREAD_ID	  g_zTos_DfmInfoThread = NULL;

+#endif

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+#ifdef _USE_PSM

+#ifdef _USE_CPU_DFM

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_DfmInfoTimerFunc

+* ²ÎÊý˵Ã÷:     

+*           (IN)  args: ²ÎÊý

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_DfmInfoTimerFunc(SINT32 args)

+{

+    UINT32 status = zOss_PutSemaphore(g_zTos_DfmInfoSema);

+    zOss_AssertExN(status == ZOSS_SUCCESS);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_DfmInfoThreadEntry

+* ²ÎÊý˵Ã÷:     

+*           (IN)  args:²ÎÊý

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_DfmInfoThreadEntry(SINT32 args)

+{

+    while(1)

+    {

+        zOss_GetSemaphore(g_zTos_DfmInfoSema, ZOSS_WAIT_FOREVER);

+        zOss_DfmTraceInfo();

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_DfmTraceInfo

+* ²ÎÊý˵Ã÷:     

+*           (IN)  CmdMsg: shellÃüÁîÏûÏ¢Ö¸Õë

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_DfmTraceInfo(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32 tmp = 0;

+

+    zOss_AssertExN(CmdMsg != NULL);

+    if ((1 != CmdMsg->paraCount) || (-1 == Shell_StrisNumber(CmdMsg->para[0])))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîµÄ¸ñʽ: dfminfo 0»ò1 \n");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t 0:¹Ø±Õ, 1:´ò¿ª\n");

+        return;

+    }

+

+    tmp = strtoul((char*)CmdMsg->para[0], NULL, 0);

+    if (tmp >1)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîµÄ¸ñʽ: dfminfo 0»ò1 \n");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t 0:¹Ø±Õ, 1:´ò¿ª\n");

+        return;

+    }

+    

+    if (tmp)

+    {

+        g_zTos_DfmInfoSema   = zOss_CreateSemaphore("dfminfosema", 0);

+        g_zTos_DfmInfoTimer  = zOss_CreateTimer("dfminfotimer", OSS_DfmInfoTimerFunc, 10, TRUE);

+        g_zTos_DfmInfoThread = zOss_CreateThread("dfminfothread", OSS_DfmInfoThreadEntry, 0, 4096, 25, 1, 1);

+        zOss_StartTimer(g_zTos_DfmInfoTimer, 10, OSS_DfmInfoTimerFunc, 0);

+    }

+    else

+    {

+        zOss_DeleteThread(g_zTos_DfmInfoThread);

+        zOss_KillTimer(g_zTos_DfmInfoTimer);

+        zOss_DeleteSemaphore(g_zTos_DfmInfoSema);

+    }

+

+    return;

+}

+#endif  //_USE_CPU_DFM

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_PsmInfoTimerFunc

+* ²ÎÊý˵Ã÷:     

+*           (IN)  args: ²ÎÊý

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_PsmInfoTimerFunc(SINT32 args)

+{

+    UINT32 status = zOss_PutSemaphore(g_zTos_PsmInfoSema);

+    zOss_AssertExN(status == ZOSS_SUCCESS);

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_PsmInfoThreadEntry

+* ²ÎÊý˵Ã÷:     

+*           (IN)  args: ²ÎÊý

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_PsmInfoThreadEntry(SINT32 args)

+{

+    while(1)

+    {

+        zOss_GetSemaphore(g_zTos_PsmInfoSema, ZOSS_WAIT_FOREVER);

+        zOss_PsmTraceInfo();

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_PsmTraceInfo

+* ²ÎÊý˵Ã÷:     

+*           (IN)  CmdMsg: shellÃüÁîÏûÏ¢Ö¸Õë

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_PsmTraceInfo(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32 tmp = 0;

+

+    zOss_AssertExN(CmdMsg != NULL);

+    if ((1 != CmdMsg->paraCount)||(-1 == Shell_StrisNumber(CmdMsg->para[0])))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîµÄ¸ñʽ: psminfo 0»ò1 \n");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t 0:¹Ø±Õ, 1:´ò¿ª\n");

+        return;

+    }

+

+    tmp = strtoul((char*)CmdMsg->para[0], NULL, 0);

+    if (tmp > 1)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîµÄ¸ñʽ: psminfo 0»ò1 \n");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t 0:¹Ø±Õ, 1:´ò¿ª\n");

+        return;

+    }

+    

+    if (tmp)

+    {

+        g_zTos_PsmInfoSema   = zOss_CreateSemaphore("psminfosema", 0);

+        g_zTos_PsmInfoTimer  = zOss_CreateTimer("psminfotimer", OSS_PsmInfoTimerFunc, 10, TRUE);

+        g_zTos_PsmInfoThread = zOss_CreateThread("psminfothread", OSS_PsmInfoThreadEntry, 0, 4096, 25, 1, 1);

+        zOss_StartTimer(g_zTos_PsmInfoTimer, 30, OSS_PsmInfoTimerFunc, 0);

+    }

+    else

+    {

+        zOss_DeleteThread(g_zTos_PsmInfoThread);

+        zOss_KillTimer(g_zTos_PsmInfoTimer);

+        zOss_DeleteSemaphore(g_zTos_PsmInfoSema);

+    }

+

+    return;

+}

+#endif // _USE_PSM

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_shell_thread.c b/cp/ps/plat/src/oss/sup/src/sup_shell_thread.c
new file mode 100755
index 0000000..de1ef8b
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_shell_thread.c
@@ -0,0 +1,883 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sup_shell_thread.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : Ï̡߳¢ÈÎÎñ¡¢CPUÕ¼ÓÃÂÊͳ¼ÆÏà¹ØµÄshellÃüÁî

+* ×÷    Õß : ´ú¿µ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2019-01-10

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "sup_shell.h"

+#include "sup_shell_cmd.h"

+#include "sup_except.h"

+#include "osa.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#ifdef _OS_WIN

+#ifndef PROCESS

+#define PROCESS ZOSS_THREAD_ID

+#endif

+#endif

+

+#define SHELL_SIGN  "\t================================================================================================================="

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+ 

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID Shell_ShowThread(T_ZOsa_ThreadUserArea *pThreadInfo);

+static VOID Shell_ShowThreadTitle(VOID);

+

+#ifdef _OS_LINUX

+void linux_thread_sched_stat(int type);

+#endif

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+ZOSS_TIMER_ID   gShell_UpdataCpuTimerId = NULL; /* ¼ÆËãcpuÕ¼ÓÃÂʶ¨Ê±Æ÷ */

+ZOSS_TIMER_ID   gShell_FreshCpuTimerId  = NULL; /* ÏÔʾcpuÕ¼ÓÃÂʶ¨Ê±Æ÷ */

+

+#ifdef _OS_LINUX

+extern void *linux_get_threadID_by_name(const char *name);

+extern void linux_reset_cpupinfo(void);

+#endif

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+static VOID Shell_ThreadCPU(SINT32 para)

+{

+    if(OSA_IdentifyThread((ZOSS_THREAD_ID)para) == ZOSS_SUCCESS)

+    {        

+        Osa_DisplayThreadExecInfo((PROCESS)para);

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t¸ÃÏ̲߳»´æÔÚ");

+    }

+}

+

+static VOID Shell_ThreadsCPU(SINT32 para)

+{

+    Osa_DisplayThreadsExecInfo((UINT32)para);

+}

+

+static VOID Shell_ThreadSetFlagUse(const CHAR *cmd)

+{    

+    zOss_AssertExN(cmd != NULL);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s   m", cmd);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tmȡֵ[0-1]");

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t m = 0±íʾ¹Ø±Õ¼Ç¼Ïß³Ìcpuʱ¼ä¿ª¹Ø");

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t m = 1±íʾ´ò¿ª¼Ç¼Ïß³Ìcpuʱ¼ä¿ª¹Ø");

+}

+

+static VOID Shell_PrintSysCPU(VOID)

+{

+#ifdef _OS_LINUX

+    UINT32 rate = 0;

+    rate = 100 - Osa_GetProcessCPU(linux_get_threadID_by_name(EXCEP_IDLETHREADNAME));

+    zOss_AssertExN(rate <= 100);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tϵͳCPUÕ¼ÓÃÂÊΪ[%u%%]", rate);

+    rate = 100 - rate;

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tϵͳCPU¿ÕÏÐÂÊΪ[%u%%]", rate);    

+#else

+    FLOAT rate = 0;

+    rate = 100 - Osa_GetProcessCPU(zOss_GetThreadIDByName(EXCEP_IDLETHREADNAME));

+    zOss_AssertExN(rate <= 100);

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tϵͳCPUÕ¼ÓÃÂÊΪ[%.2f%%]", rate);

+    rate = 100 - rate;

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tϵͳCPU¿ÕÏÐÂÊΪ[%.2f%%]", rate);

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Shell_UpdateCpuTimerCallBack

+* ¹¦ÄÜÃèÊö£º ¶¨Ê±¼ÆËãCPU¶¨Ê±Æ÷º¯Êý»Øµ÷

+* ²ÎÊý˵Ã÷£º

+   (IN)

+   arg:¶¨Ê±Æ÷»Øµ÷²ÎÊý

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID Shell_UpdateCpuTimerCallBack(SINT32 arg)

+{

+    Osa_UpdateCpu();

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º Shell_SetCpuUpdateTime

+* ¹¦ÄÜÃèÊö£º Ð޸ļÆËãCPU¸üÐÂʱ¼ä

+* ²ÎÊý˵Ã÷£º

+   (IN)

+   time_in_second:¶à³¤Ê±¼ä¼ÆËãÒ»´ÎÏß³ÌCPU(µ¥Î»£ºÃë),·¶Î§2-10

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static VOID Shell_SetCpuUpdateTime(UINT32 time_in_second)

+{

+    UINT32 ret          = ZOSS_ERROR;

+    UINT32 freshTime    = 0;

+    

+    if(NULL == gShell_UpdataCpuTimerId)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t¼Ç¼Ïß³ÌCPUʱ¼ä¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+        return;

+    }

+    

+    ret = zOss_StopTimer(gShell_UpdataCpuTimerId);  /* ÏÈÍ£Ö¹¶¨Ê±Æ÷ */

+    if(ZOSS_ERROR == ret)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tË¢ÐÂʱ¼äÉèÖÃʧ°Ü");

+        return;

+    }

+    

+    freshTime = time_in_second * 1000;

+    

+    ret = zOss_StartTimer(gShell_UpdataCpuTimerId, freshTime, Shell_UpdateCpuTimerCallBack, 0); /* Æô¶¯¶¨Ê±Æ÷ */

+    if(ZOSS_ERROR == ret)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tË¢ÐÂʱ¼äÉèÖÃʧ°Ü");

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tË¢ÐÂʱ¼äÉèÖóɹ¦");

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: Shell_ShowThread

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN)

+            pThreadInfo:Ïß³ÌÏêϸÐÅÏ¢½á¹¹ÌåÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+static VOID Shell_ShowThread(T_ZOsa_ThreadUserArea *pThreadInfo)

+{

+    UINT8 index;

+    CHAR status[][10] = {"RUN","READY","BLOCK","UNKNOW"};

+    

+    zOss_AssertExN(pThreadInfo != NULL);

+

+    index = (pThreadInfo->runstatus)/2;

+    if (index >= (sizeof(status) / sizeof(status[0])))

+        index = (sizeof(status) / sizeof(status[0])) - 1;

+

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-40s%p%11s%8u%10.2f%10u%10u%12u%8u%10u",

+                pThreadInfo->threadname, pThreadInfo->threadid, status[index], 

+                pThreadInfo->priority, pThreadInfo->cpupercent, pThreadInfo->stacksize, 

+                pThreadInfo->maxstack, pThreadInfo->RunTimeInMs, pThreadInfo->msgnum, pThreadInfo->runcount);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: Shell_ShowThreadTitle

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN)

+            (OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+static VOID Shell_ShowThreadTitle(VOID)

+{

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-40s%-10s%11s%10s%12s%10s%10s%12s%8s%10s",

+                "ThreadName", "ThreadID", "Status", "Priority", "CpuPercent", "StackSize", "MaxStack",

+                "RunTimeInMs", "MsgNum", "RunCount");

+}

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: OSS_DbgShowThreadInfo

+* ¹¦ÄÜÃèÊö:

+* ²ÎÊý˵Ã÷: (IN) 

+			CmdMsg:shellÃüÁî

+			(OUT)

+* ·µ »Ø Öµ:

+* ÆäËü˵Ã÷:

+**************************************************************************/

+VOID OSS_DbgShowThreadInfo(T_Shell_CommandMessage *CmdMsg)

+{

+	UINT32					thread_num			= 0;	/* Ïß³ÌÊý				*/

+	ZOSS_THREAD_ID			*AllThreadIdArray	= NULL; /* ËùÓÐÏß³ÌIDÊý×éÖ¸Õë	*/

+	T_ZOsa_ThreadUserArea	*pThreadInfo		= NULL; /* Ïß³ÌUAÖ¸Õë			*/

+	ZOSS_THREAD_ID			thread_id			= NULL;

+	UINT32					i					= 0;

+	

+	zOss_AssertExN(CmdMsg != NULL);

+	

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tThread Info");

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, SHELL_SIGN);

+	

+	switch (CmdMsg->paraCount)

+	{

+	case 0: 	/* ÏÔʾËùÓÐÏß³ÌÐÅÏ¢ */

+		{

+#ifdef _OS_LINUX

+			linux_thread_sched_stat(0);

+#else

+			Shell_ShowThreadTitle();

+			thread_num = Osa_GetAllThreadId(&AllThreadIdArray); /* º¯ÊýÄÚÉêÇë¿Õ¼ä */

+			

+			if (0 == thread_num)

+			{

+				break;

+			}

+			

+			for (i = 0; i < thread_num; i++)

+			{

+				pThreadInfo = Osa_GetThreadUserArea(AllThreadIdArray[i], TRUE);

+				if (pThreadInfo)

+				{

+					Shell_ShowThread(pThreadInfo);

+				}

+			}

+			zOss_Free(AllThreadIdArray);

+#endif

+			break;

+		}

+	default:

+		{

+			if (CmdMsg->paraCount == 1 && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+			{

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s : ÏÔʾÏß³ÌÐÅÏ¢", CmdMsg->cmd);

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t %s  [thread_id]", CmdMsg->cmd);

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t\t ²ÎÊýthread_idΪָ¶¨Ïß³Ìid,Èç¹û²»Ö¸¶¨,ÏÔʾËùÓÐÏß³ÌÐÅÏ¢");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t½á¹ûÏÔʾÁÐ˵Ã÷:");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ThreadName:ΪÏß³ÌÃû");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ThreadID:Ïß³ÌID");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t Status:ÔËÐÐ״̬");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t Priority:Ïß³ÌÓÅÏȼ¶");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t CpuPercent:Ïß³ÌʹÓÃÂÊ");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t StackSize:Õ»´óС");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t MaxStack:×î´óջʹÓÃÂÊ");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t RunTimeInMs:Ïß³ÌÕ»ÔËÐÐʱ¼ä");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t MsgNum:ÏûÏ¢¶ÓÁ㤶È");

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t RunCount:ÔËÐдÎÊý");

+			}

+			else

+			{

+#ifdef  _OS_LINUX

+				zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tLinuxÉϲ»Ö§³Ö²ÎÊý");

+				return;

+#else

+				Shell_ShowThreadTitle();

+				

+				for (i = 0; i < CmdMsg->paraCount; i++)

+				{

+					if (-1 == Shell_StrisNumber(CmdMsg->para[i]))

+					{

+						zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tthread_id²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+						return;

+					} 

+					thread_id = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[i], NULL, 0);

+					if (NULL == thread_id)

+					{

+						zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tthread_id²ÎÊý´íÎó£¬Çë²Î¼û%s help\n", CmdMsg->cmd);

+						return;

+					}

+					

+					if (OSA_IdentifyThread(thread_id) != ZOSS_SUCCESS)

+					{

+						zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, " The thread 0x%08x is not exist!",thread_id);

+						break;

+					}

+					

+					pThreadInfo = Osa_GetThreadUserArea(thread_id, TRUE);

+					if (pThreadInfo)

+					{

+						Shell_ShowThread(pThreadInfo);

+					}

+				}

+#endif

+			}

+			break;

+		}

+	}

+	

+	zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, SHELL_SIGN);

+}

+

+VOID OSS_DbgShowTaskInfo(T_Shell_CommandMessage *CmdMsg)

+{

+    ZOSS_TASK_ID    *task_id_arr        = NULL;

+    T_OSS_PARAM     *pPlatCfg           = NULL;

+    ZOSS_TASK_ID    task_id             = NULL;

+    T_ZOss_TCB      pCurTCB             = {0};

+    UINT32          task_num            = 0;

+    UINT32          i                   = 0;

+    UINT32          nRet                = 0;

+    UINT32          current_ticks       = 0;

+    CHAR            run_stat_str[][6]   = {"ÔÝÍ£","¿ÕÏÐ","¾ÍÐ÷","ÔËÐÐ"};

+    

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:ÏÔʾÈÎÎñÐÅÏ¢\n\t %s [taskname]:ÏÔʾÈÎÎñÐÅÏ¢", CmdMsg->cmd, CmdMsg->cmd);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t Èç¹û²»Ö¸¶¨ÈÎÎñÃû£¬ÏÔʾËùÓÐÈÎÎñÐÅÏ¢£¨²»°üÀ¨SDLÈÎÎñ£©");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ½á¹ûÏÔʾÁÐ˵Ã÷:");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t TaskName:ΪÈÎÎñÃû");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t TaskID:ÈÎÎñID");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t Prior:ÈÎÎñÓÅÏȼ¶");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ThreadID:ÈÎÎñËùÔÚµ÷¶ÈÏß³ÌID");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t RunState:ÈÎÎñÔËÐÐ״̬£¬¿ÉÄÜΪÔÝÍ££¬¿ÕÏУ¬¾ÍÐ÷£¬ÔËÐÐËÄÖÖÖ®Ò»");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t LifeTime:ÈÎÎñ×Ô´´½¨µ½ÏÖÔÚµÄtickÊý");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t RunTimeInMs:ÈÎÎñÔËÐÐʱ¼ä");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t CpuPencent:ÈÎÎñcpuÕ¼ÓÃÂÊ");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t MsgCounts:ÈÎÎñÏûÏ¢¶ÓÁÐÖл¹Î´´¦ÀíµÄÏûÏ¢¸öÊý");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t RunCounts:ÈÎÎñ±»´´½¨Ò»À´Ö´ÐеĴÎÊý");

+        return;

+    }

+    

+    current_ticks = zOss_GetTickCount();

+    if (1 == CmdMsg->paraCount)

+    {

+        task_id = zOss_GetTaskID(CmdMsg->para[0]);

+        

+        if (task_id == ZOSS_INVALID_TASK_ID)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t[ʧ°Ü]ÈÎÎñÃûΪ%s²»´æÔÚ !", CmdMsg->para[0]);

+            return;

+        }

+        

+        nRet = zOss_GetTaskInfo(task_id, &pCurTCB);

+        if (nRet == ZOSS_ERROR)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t[ʧ°Ü]»ñÈ¡%sÈÎÎñÐÅϢʧ°Ü !", CmdMsg->para[0]);

+            return;

+        }

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tTask Info");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===============================================================================================");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-30s %-10s %8s %-10s %10s %10s %10s %10s %10s %10s","TaskName","TaskID","Prior","ThreadID","RunState","LifeTime","RunTimeInMs","CpuPencent","MsgCounts","RunCounts");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-30s %p%8u  %-10p%8s%10u%10u%10f%10u%10u", pCurTCB.task_name, pCurTCB.task_id, pCurTCB.priority,

+                    pCurTCB.thread_id, run_stat_str[pCurTCB.run_status - 1], current_ticks - pCurTCB.time, pCurTCB.runtime / 1000, pCurTCB.cpupercent, zOss_ListCount(&pCurTCB.msg_queue), pCurTCB.count);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===============================================================================================");

+    }

+    

+    if (0 == CmdMsg->paraCount)

+    {

+        pPlatCfg = zOss_GetOssCfg();

+        task_id_arr = (ZOSS_TASK_ID *)zOss_Malloc(pPlatCfg->TaskCfg.max_task_num * sizeof(ZOSS_TASK_ID));

+        if (NULL == task_id_arr)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tzOss_Malloc for task_id_arr failed!");

+            return;

+        }

+        task_num = zOss_GetAllTaskID(task_id_arr);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tTask Info");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===============================================================================================");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-30s %-10s %8s %-10s %10s %10s %10s %10s %10s %10s","TaskName","TaskID","Prior","ThreadID","RunState","LifeTime","RunTimeInMs","CpuPencent","MsgCounts","RunCounts");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t===============================================================================================");

+        

+        for (i = 0; i < task_num; i++)

+        {

+            nRet = zOss_GetTaskInfo(task_id_arr[i], &pCurTCB);

+            if (nRet == ZOSS_ERROR)

+            {

+                continue;   /* Èç¹ûÊÇSDLÈÎÎñÒ²¿ÉÄÜÊÇ·µ»Ø´íÎó */

+            }

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%-30s %p%8u   %-10p%8s%10u%10u%10f%10u%10u", pCurTCB.task_name, pCurTCB.task_id, pCurTCB.priority,

+                              pCurTCB.thread_id, run_stat_str[pCurTCB.run_status - 1],  current_ticks-pCurTCB.time, pCurTCB.runtime, pCurTCB.cpupercent, zOss_ListCount(&pCurTCB.msg_queue), pCurTCB.count);

+        }

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t=============================================================================================");

+        zOss_Free(task_id_arr);

+    }

+    return;

+}

+

+VOID OSS_DbgDisplayThreadExecInfo(T_Shell_CommandMessage *CmdMsg)

+{

+    ZOSS_THREAD_ID          tid         = ZOSS_INVALID_THREAD_ID;

+    static ZOSS_TIMER_ID    freshTimer = NULL;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if(FALSE == gOsa_SwapTimeFlag)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t¼Ç¼Ïß³ÌCPUʱ¼ä¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+        return;

+    }

+

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s   Ïß³ÌID [time]", CmdMsg->cmd);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÏß³ÌID¿ÉÒÔ10½øÖÆÊýºÍ16½øÖÆÊý(ǰ׺0x»ò0X)");    

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t timeΪ¿ÉÑ¡ÏÉèÖÃÏÔʾµÄË¢ÐÂʱ¼ä(µ¥Î»:Ãë)£¬·¶Î§[2~10]£¬Èô²»´øtimeÔòֹͣˢÐÂ");

+        return;

+    }

+    else if(1 == CmdMsg->paraCount || 2 == CmdMsg->paraCount)

+    {

+        if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó");

+            return;

+        }                         

+        tid = (ZOSS_THREAD_ID)strtoul((char *)CmdMsg->para[0], NULL, 0);

+        if (ZOSS_INVALID_THREAD_ID == tid)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó");

+            return;

+        }

+        

+        if (1 == CmdMsg->paraCount)

+        {

+            Shell_ThreadCPU((SINT32)tid);

+            if (NULL != freshTimer)

+            {

+                zOss_KillTimer(freshTimer);

+                freshTimer = NULL;

+            }

+            return;

+        }

+        

+        if (2 == CmdMsg->paraCount)

+        {

+            UINT32 freshTime = 0;

+            

+            if (-1 == Shell_StrisNumber(CmdMsg->para[1]))

+            {         

+                return;

+            }

+            

+            freshTime = strtoul((char *)CmdMsg->para[1], (char **)NULL, 0);

+            if (freshTime < 2 || freshTime > 10)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+                return;

+            }

+            if (NULL != freshTimer)

+            {

+                zOss_KillTimer(freshTimer);

+                freshTimer = NULL;

+            }

+            freshTimer = zOss_CreateTimer("Timer_ThreadCPUPrint", (ZOSS_TIMER_FUN)Shell_ThreadCPU, (SINT32)tid, TRUE);

+            if (NULL == freshTimer)

+            {

+                return;

+            }

+            if (ZOSS_ERROR == zOss_StartTimer(freshTimer, (freshTime * 1000), (ZOSS_TIMER_FUN)Shell_ThreadCPU, (SINT32)tid))

+            {

+                zOss_KillTimer(freshTimer);

+                freshTimer = NULL;

+            }

+        }

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+    }

+}

+

+

+VOID OSS_DbgDisplayThreadsExecInfo(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32                  type        = 0;

+    UINT32                  timeLen     = 0;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    if (FALSE == gOsa_SwapTimeFlag)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t¼Ç¼Ïß³ÌCPUʱ¼ä¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+        return;

+    }

+    

+    if (1 == CmdMsg->paraCount && 0 == strcmp((char *)CmdMsg->para[0], "help"))

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s live/lazy/all time1 [time2]", CmdMsg->cmd);

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t live:Ö»ÏÔʾ»î¶¯µÄỊ̈߳¬lazy:Ö»ÏÔʾ²»»î¶¯µÄỊ̈߳¬all:ÏÔʾËùÓÐÏß³Ì");    

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t time1ÉèÖÃij¶Îʱ¼äÄÚÏß³ÌÖ´ÐÐÇé¿ö(µ¥Î»:Ãë)£¬·¶Î§[0~10](oseƽ̨Î޸ù¦ÄÜ,ÉèÖÃΪ0), 0±íʾȫ²¿Ê±¼äÄÚµÄÏß³ÌÖ´ÐÐÇé¿ö");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t time2Ϊ¿ÉÑ¡ÏÉèÖÃÏÔʾµÄË¢ÐÂʱ¼ä(µ¥Î»:Ãë,µ±time1Ϊ0ʱÓÐЧ)£¬·¶Î§[2~10]£¬Èô²»´øtime2ÔòֹͣˢÐÂ");

+        return;

+    }

+    else if (2 == CmdMsg->paraCount || 3 == CmdMsg->paraCount)

+    {

+        if (0 == strcmp((char *)CmdMsg->para[0], "live"))

+        {

+            type |= SUP_THREAD_LIVE_BIT; /* Ö»ÏÔʾ»î¶¯µÄÏß³Ì     */

+        }

+        else if (0 == strcmp((char *)CmdMsg->para[0], "lazy"))

+        {

+            type |= SUP_THREAD_LAZY_BIT; /* Ö»ÏÔʾ²»»î¶¯µÄÏß³Ì   */

+        }

+        else if (0 == strcmp((char *)CmdMsg->para[0], "all"))

+        {

+            type = 0;                   /* ÏÔʾËùÓÐÏß³Ì         */

+        }

+        else

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+            return;

+        }

+        

+        if (-1 == Shell_StrisNumber(CmdMsg->para[1]))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó");

+            return;

+        }                                     

+        timeLen = strtoul((char *)CmdMsg->para[1], (char **)NULL, 0);

+

+        if (1 <= timeLen && 10 >= timeLen)

+        {

+            type |= SUP_THREAD_STATISTIC_INFO_BIT;

+        }

+        else if (0 != timeLen)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+            return;            

+        }        

+            

+        if (2 == CmdMsg->paraCount)

+        {

+            if (0 != timeLen)

+            {

+#ifdef TOS_STATISTIC_TIMESLICE

+                zOss_StatisticTimesliceStart(timeLen * 1000, type);

+#endif

+            }

+            else

+            {

+                Shell_ThreadsCPU((SINT32)type);

+            }

+            

+            if (NULL != gShell_FreshCpuTimerId)

+            {

+                zOss_KillTimer(gShell_FreshCpuTimerId);

+                gShell_FreshCpuTimerId = NULL;

+            }        

+            return;

+        }

+        

+        if (3 == CmdMsg->paraCount)

+        {

+            UINT32 freshTime = 0;

+            

+            if (0 != timeLen || -1 == Shell_StrisNumber(CmdMsg->para[2]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t²ÎÊý´íÎó");

+                return;

+            }                                     

+            freshTime = strtoul((char *)CmdMsg->para[2], (char **)NULL, 0);

+            if (freshTime < 2 || freshTime > 10)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+                return;

+            }

+            if (NULL != gShell_FreshCpuTimerId)

+            {

+                zOss_KillTimer(gShell_FreshCpuTimerId);

+                gShell_FreshCpuTimerId = NULL;

+            }

+            gShell_FreshCpuTimerId = zOss_CreateTimer("Timer_ThreadsCPUPrint", (ZOSS_TIMER_FUN)Shell_ThreadsCPU, (long)type, TRUE);

+            if (NULL == gShell_FreshCpuTimerId)

+            {

+                return;

+            }

+            if (ZOSS_ERROR == zOss_StartTimer(gShell_FreshCpuTimerId, (freshTime * 1000), (ZOSS_TIMER_FUN)Shell_ThreadsCPU, (long)type))

+            {

+                zOss_KillTimer(gShell_FreshCpuTimerId);

+                gShell_FreshCpuTimerId = NULL;

+            }

+        }  

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+    }      

+}

+

+VOID OSS_DbgSetUpdateCPUTime(T_Shell_CommandMessage *CmdMsg)

+{

+    UINT32 new_time = 0;

+    zOss_AssertExN(CmdMsg != NULL);

+

+    if(FALSE == gOsa_SwapTimeFlag)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t¼Ç¼Ïß³ÌCPUʱ¼ä¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+        return;

+    }

+

+    if (1 == CmdMsg->paraCount)

+    {

+        if (0 == strcmp((char *)CmdMsg->para[0], "help"))

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s time", CmdMsg->cmd);

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t time:Ë¢ÐÂʱ¼äÒªÇóÔÚ[2-10]ÃëÖ®¼ä");    

+            return;

+        }

+        else if (0 == Shell_StrisNumber(CmdMsg->para[0]))

+        {

+            new_time = strtoul((char *)CmdMsg->para[0], NULL, 0);

+            if (new_time >= 2 && new_time <= 10)

+            {

+                Shell_SetCpuUpdateTime(new_time);

+                return;

+            }

+        }

+    }

+    

+    zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\tÊäÈëhelp²éѯÓ÷¨");

+

+}

+

+VOID OSS_DbgThreadSetFlag(T_Shell_CommandMessage *CmdMsg)

+{

+    BOOL        enableRunTime   = FALSE;

+    T_OSS_PARAM *pPlatCfg       = NULL;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    if (1 != CmdMsg->paraCount)

+    {

+        Shell_ThreadSetFlagUse(CmdMsg->cmd);

+        return;

+    }

+    if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+    {

+        Shell_ThreadSetFlagUse(CmdMsg->cmd);

+        return;

+    }

+

+    enableRunTime = (BOOL)strtoul((char *)CmdMsg->para[0], NULL, 0);

+

+    Osa_SwapCtl(enableRunTime);

+    

+    if (enableRunTime)

+    {

+        UINT32 freshTime = 0;

+

+        pPlatCfg    = zOss_GetOssCfg();

+        freshTime   = pPlatCfg->ExcepCfg.UpdateCPUTime;

+        

+#ifdef _OS_TOS

+# ifdef CYGOPT_KERNEL_EXTEND_CLOCK_STATISTIC_TIMESLICE

+        cyg_set_statistic_counter_flag(TRUE);

+# endif

+# ifdef CYGOPT_KERNEL_EXTEND_THREAD_STATISTIC_TIMESLICE

+        cyg_thread_set_statistic_timeslice_flag(TRUE);

+# endif

+#endif

+        if (NULL != gShell_UpdataCpuTimerId)

+        {

+            zOss_KillTimer(gShell_UpdataCpuTimerId);

+            gShell_UpdataCpuTimerId = NULL;

+        }

+        gShell_UpdataCpuTimerId = zOss_CreateTimer("Shell_UpdateCpuTimer", Shell_UpdateCpuTimerCallBack, 0, TRUE);

+        if (NULL == gShell_UpdataCpuTimerId)

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t´ò¿ª¼Ç¼Ïß³Ìcpuʱ¼ä¿ª¹ØÊ§°Ü");

+            return;

+        }

+        if (ZOSS_ERROR == zOss_StartTimer(gShell_UpdataCpuTimerId, freshTime, Shell_UpdateCpuTimerCallBack, 0))

+        {

+            zOss_KillTimer(gShell_UpdataCpuTimerId);

+            gShell_UpdataCpuTimerId = NULL;

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t´ò¿ª¼Ç¼Ïß³Ìcpuʱ¼ä¿ª¹ØÊ§°Ü");

+        }

+        else

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t³É¹¦´ò¿ª¼Ç¼Ïß³Ìcpuʱ¼ä¿ª¹Ø");

+        }

+        

+    }

+    else

+    {

+        UINT32                  i                   = 0;

+        UINT32                  totalNum            = 0;

+        T_ZOss_TCB              *pTCB               = NULL;

+        ZOSS_TASK_ID            *taskIdArray        = NULL;

+        ZOSS_THREAD_ID          *allThreadIdArray   = NULL;

+        T_ZOsa_ThreadUserArea   *pThreadInfo        = NULL;

+

+        if (NULL != gShell_UpdataCpuTimerId)

+        {

+            zOss_KillTimer(gShell_UpdataCpuTimerId);

+            gShell_UpdataCpuTimerId = NULL;

+        }

+        if(NULL != gShell_FreshCpuTimerId)

+        {

+            zOss_KillTimer(gShell_FreshCpuTimerId);

+            gShell_FreshCpuTimerId = NULL;

+        }

+#ifdef _OS_TOS

+# ifdef CYGOPT_KERNEL_EXTEND_CLOCK_STATISTIC_TIMESLICE

+        cyg_set_statistic_counter_flag(FALSE);

+        cyg_zero_statistic_counter_value();

+# endif

+# ifdef CYGOPT_KERNEL_EXTEND_THREAD_STATISTIC_TIMESLICE

+        cyg_thread_set_statistic_timeslice_flag(FALSE);

+        cyg_thread_zero_all_statistic_timeslice();

+# endif

+#endif

+

+#ifdef _OS_LINUX

+        linux_reset_cpupinfo();

+#else

+        totalNum = Osa_GetAllThreadId(&allThreadIdArray);                

+        for (i = 0; i < totalNum; i++)

+        {

+            pThreadInfo = Osa_GetThreadUserArea(allThreadIdArray[i], TRUE);

+            if (pThreadInfo)

+            {

+                pThreadInfo->cputime        = 0;

+                pThreadInfo->runtime        = 0;

+                pThreadInfo->RunTimeInMs    = 0;

+                pThreadInfo->runcount       = 0;

+                pThreadInfo->cpupercent     = 0;

+            }

+        }

+        zOss_Free(allThreadIdArray);

+        

+        pPlatCfg    = zOss_GetOssCfg();

+        taskIdArray = (ZOSS_TASK_ID *)zOss_Malloc(pPlatCfg->TaskCfg.max_task_num * sizeof(ZOSS_TASK_ID));

+        totalNum    = zOss_GetAllTaskID(taskIdArray);

+        for (i = 0; i < totalNum; i++)

+        {

+            pTCB = (T_ZOss_TCB *)taskIdArray[i];

+            if (pTCB != pTCB->task_id)

+            {

+                continue;

+            }

+            pTCB->cputime       = 0;

+            pTCB->cpupercent    = 0;

+            pTCB->runtime       = 0;

+        }

+        zOss_Free(taskIdArray);

+#endif

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t³É¹¦¹Ø±Õ¼Ç¼Ïß³Ìcpuʱ¼ä¿ª¹Ø");

+    }

+}

+

+VOID OSS_DbgGetSysCPU(T_Shell_CommandMessage *CmdMsg)

+{

+    static ZOSS_TIMER_ID sys_timer = NULL;

+    

+    zOss_AssertExN(CmdMsg != NULL);

+    

+    if(FALSE == gOsa_SwapTimeFlag)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t¼Ç¼Ïß³ÌCPUʱ¼ä¿ª¹ØÎ´´ò¿ª£¬´Ë¹¦ÄܽûÓÃ");

+        return;

+    }

+

+    switch (CmdMsg->paraCount)

+    {

+    case 0:

+        {

+            Shell_PrintSysCPU();

+            if (NULL != sys_timer)

+            {

+                zOss_KillTimer(sys_timer);

+                sys_timer = NULL;

+            }

+            break;

+        }   

+    case 1:

+        {

+            UINT32 freshTime = 0;

+            if (0 == strcmp((char *)CmdMsg->para[0], "help"))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\tÓ÷¨:%s [time]", CmdMsg->cmd);

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t timeΪ¿ÉÑ¡ÏÉèÖÃÏÔʾµÄË¢ÐÂʱ¼ä(µ¥Î»:Ãë)£¬·¶Î§[2~10]£¬Èô²»´øtimeÔòֹͣˢÐÂ");

+                break;

+            }

+

+            if (-1 == Shell_StrisNumber(CmdMsg->para[0]))

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+                break;

+            }

+            freshTime = strtoul((char *)CmdMsg->para[0], (char **)NULL, 0);

+            if (freshTime < 2 || freshTime > 10)

+            {

+                zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+                break;

+            }

+            if (NULL != sys_timer)

+            {

+                zOss_KillTimer(sys_timer);

+                sys_timer = NULL;

+            }

+            sys_timer = zOss_CreateTimer("Timer_SysCPUPrint", (ZOSS_TIMER_FUN)Shell_PrintSysCPU, 0, TRUE);

+            if (NULL == sys_timer)

+            {

+                break;

+            }

+            if (ZOSS_ERROR == zOss_StartTimer(sys_timer, (freshTime * 1000), (ZOSS_TIMER_FUN)Shell_PrintSysCPU, 0))

+            {

+                zOss_KillTimer(sys_timer);

+                sys_timer = NULL;

+            }

+            break;

+        }

+    default:

+        {

+            zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_ABNORMAL, "\t²ÎÊý´íÎó");

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+* ¹¦ÄÜÃèÊö: OSS_StartDaemonTask

+* ²ÎÊý˵Ã÷:     

+*           (IN)  CmdMsg: shellÃüÁîÏûÏ¢Ö¸Õë

+*           (OUT) ÎÞ

+* ·µ »Ø Öµ: ÎÞ

+* ÆäËü˵Ã÷: ÎÞ

+**************************************************************************/

+VOID OSS_StartDaemonTask(T_Shell_CommandMessage *CmdMsg)

+{

+    if(0 == strcmp(CmdMsg->para[0], "help") && CmdMsg->paraCount == 1)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t Æô¶¯ÈÎÎñµÄËÀÑ­»·¼à²â£¬¸ÃÃüÁî²»´ø²ÎÊý;");

+        return;

+    }

+

+    if (CmdMsg->paraCount != 0)

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÃüÁîÊäÈë´íÎó;");

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t ÇëÊäÈë%s help²é¿´¸ÃÃüÁîµÄ¹¦ÄÜ;", CmdMsg->cmd);

+        return;

+    }

+

+    if(ZOSS_SUCCESS == EXCEP_StartDaemonTask())

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:Æô¶¯³É¹¦", CmdMsg->cmd);

+

+    }

+    else

+    {

+        zOss_Printf(SUBMDL_TEST, PRINT_LEVEL_NORMAL, "\t%s:Æô¶¯Ê§°Ü", CmdMsg->cmd);

+    }

+

+    return;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_sys.c b/cp/ps/plat/src/oss/sup/src/sup_sys.c
new file mode 100644
index 0000000..636a6f3
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_sys.c
@@ -0,0 +1,581 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS

+* ÎÄ ¼þ Ãû : sysmgt.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : OSSÖ÷¿ØÈÎÎñ

+* ×÷    Õß : xiaxinguo

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007-07-16

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC:617001782003

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "sup.h"

+#include "drv_api.h"

+#include "ThreadPriority.h"

+#include "osa_ramdump.h"

+#include "sup_task.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define SYSM_STATUS_STARTTASK   (ZOSS_STATUS_USERBASE + 1)

+#define SYSM_TASK_NAME          "zOss_SysmTask"

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+typedef struct

+{

+    T_ZOss_TaskTabItem *curreatpTaskItem;

+}T_P_DATA;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID Sysm_MainProc(UINT8 state, UINT32 msgId, UINT8 *pBuf, UINT16 msgLen, UINT8 *private_data);

+static UINT32 Sysm_PoweronTasks(VOID);

+static UINT32 Sysm_InitTasks(T_ZOss_TaskTabItem *pTaskItem, UINT32 task_index); 

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+ZOSS_TASK_ID                gSysm_SysMTaskID        = ZOSS_INVALID_TASK_ID;

+static UINT32               gSysm_AckTaskIndex      = 0;

+static BOOL                 bInit                   = FALSE;

+static T_ZOss_TaskTabItem   *gSysm_TaskTab          = NULL;

+ZOSS_TASK_ID                *gSysm_TaskIDTab        = NULL;

+static UINT32               gSche_Max_TaskTab_Num   = 0;

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷Çø

+**************************************************************************/

+#ifdef _OS_OSE

+extern UINT32 SYSTIME_Init(VOID);

+#endif

+

+#ifdef _OS_LINUX

+extern void zx29_restart(char str, const char *cmd);

+#endif

+

+#ifdef _USE_WBT

+extern VOID zWbt_Entry(VOID);

+#endif

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_Init

+* ¹¦ÄÜÃèÊö£ºOSS×Óϵͳ³õʼ»¯º¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_Init(VOID)

+{

+    T_OSS_PARAM *pPlatCfg   = NULL;

+    UINT32      nRet        = ZOSS_SUCCESS;

+    

+    if (bInit == TRUE)             /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_SUCCESS;

+    }

+

+    /* oss cfg fs mount*/

+#ifdef _OS_TOS

+    nRet = zOss_FsMount();

+    if (nRet != ZOSS_SUCCESS)

+    {

+        zOss_RamLog((CHAR *)"SysEntry: zOss_FsMount Fail, Code=%d!", nRet);

+        return ZOSS_ERROR;

+    }

+#endif

+

+    /* Timer Init */

+#ifdef _OS_WIN

+    nRet = TIMER_Init();

+    if (nRet != ZOSS_SUCCESS)

+    {

+        zOss_RamLog((CHAR *)"SysEntry: TIMER_Init Fail, Code=%d!", nRet);

+        return ZOSS_ERROR;

+    }

+    zOss_RamLog((CHAR *)"SysEntry(%d): TIMER_Init Start OK!", zOss_GetTickCount());

+#endif

+    

+#if 0

+    /* NV Init */

+    #ifndef _USE_SMALL_VERSION

+    nRet = NV_Init();

+    if (nRet != ZOSS_SUCCESS)

+    {

+        zOss_RamLog((CHAR *)"SysEntry: NV_Init Fail, Code=%d!", nRet);

+        return ZOSS_ERROR;

+    }

+    zOss_RamLog((CHAR *)"SysEntry(%d): NV_Init Start OK!", zOss_GetTickCount());

+    #endif

+#endif

+    /* ²ÎÊýÅäÖà */

+    pPlatCfg = zOss_GetOssCfg();

+    gSysm_TaskTab = pPlatCfg->SysmCfg.pSysm_TaskItemTab;

+    gSche_Max_TaskTab_Num = pPlatCfg->SysmCfg.task_num;

+    if (gSche_Max_TaskTab_Num > pPlatCfg->TaskCfg.max_task_num)

+    {

+        return ZOSS_ERROR;

+    }

+    if (gSche_Max_TaskTab_Num != 0)

+    {

+        gSysm_TaskIDTab = (ZOSS_TASK_ID *)zOss_Malloc(sizeof(ZOSS_TASK_ID) * gSche_Max_TaskTab_Num);

+        if (gSysm_TaskIDTab == NULL)

+        {

+            return ZOSS_ERROR;

+        }

+        zOss_Memset((UINT8 *)gSysm_TaskIDTab, 0, sizeof(ZOSS_TASK_ID) * gSche_Max_TaskTab_Num);

+    }

+    

+    /* ³õʼ»¯OSS¸÷Ä£¿é£¬Æô¶¯ÏȺó´ÎÐò²»µÃ¸ü¸Ä */

+    /* ³õʼ»¯Sche */

+    nRet = SCHE_Init();

+    if (nRet == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+    /* ³õʼ»¯Except */

+    nRet = EXCEP_Init();

+    if (nRet == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+    /* ³õʼ»¯test */

+#ifdef ZOSS_TEST_MODE

+    nRet = TEST_Init();

+    if (nRet == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+#ifdef _USE_PSM

+    /* Ê¡µç¹ÜÀí³õʼ»¯ */

+#ifdef _USE_PSM_NEW_FRAMEWORK

+    nRet = zOss_PsmInit();

+#else

+    nRet = PSM_Init();

+#endif

+    if (nRet == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }    

+#endif

+

+#ifdef _OS_WIN

+    FS_Init();

+#endif

+

+#ifdef _OS_OSE

+    nRet = SYSTIME_Init();

+    if (nRet == ZOSS_ERROR)

+    {

+        return ZOSS_ERROR;

+    }

+#endif

+

+#ifdef _USE_WBT

+    zWbt_Entry();

+#endif

+

+    /* Ramdump Init */   

+    zOss_RamdumpInit();

+

+    bInit = TRUE;

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_Start

+* ¹¦ÄÜÃèÊö£ºOSSÆô¶¯º¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_Start(VOID)

+{

+    /* ´´½¨ÏµÍ³ÈÎÎñ */

+    ZOSS_TASK_ID taskId = zOss_CreateTask(SYSM_TASK_NAME, Sysm_MainProc, 2 * 1024, THR_SYSM_PRI, 1024, 0);

+    if (ZOSS_INVALID_TASK_ID == taskId)

+    {

+        return ZOSS_ERROR;    

+    }

+    

+    gSysm_SysMTaskID = taskId;

+    return zOss_TaskSend(EV_POWERON, NULL, 0, taskId); /* ÏòÖ÷ÈÎÎñ·¢ÉϵçÏûÏ¢ */

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_TaskStartOK

+* ¹¦ÄÜÃèÊö£ºÓÉÏàÓ¦ÈÎÎñµ÷ÓÃ, ÈÎÎñÔÚ´¦ÀíÍêEVENT_INITºó, µ÷Óñ¾º¯Êý£¬

+            ֪ͨÖ÷¿ØÈÎÎñÆô¶¯µÇ¼Ç±íÖÐÏÂÃæµÄÈÎÎñ.

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_TaskStartOK(VOID)

+{

+    UINT32 nRet = ZOSS_SUCCESS;

+    

+    if (ZOSS_INVALID_TASK_ID == gSysm_SysMTaskID)

+    {

+        gSysm_SysMTaskID = zOss_GetTaskID(SYSM_TASK_NAME);  /* »ñÈ¡Ö÷¿ØÈÎÎñID */

+    

+        zOss_AssertExN(ZOSS_INVALID_TASK_ID != gSysm_SysMTaskID);

+    }

+    nRet = zOss_TaskSend(EV_POWERON_OK, NULL, 0, gSysm_SysMTaskID);

+

+    zOss_ASSERT(nRet != ZOSS_ERROR);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SysPowerdown

+* ¹¦ÄÜÃèÊö£º¹Ø»ú

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,ʧ°Ü·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SysPowerdown(VOID)

+{

+    zOss_NvramFlush();

+#ifdef _USE_OSS_FS

+    zOss_SyncFS();

+#endif

+    zDrv_ShutDown();

+    

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SysSoftReset

+* ¹¦ÄÜÃèÊö£ºÈí¼þÖØÆô

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+VOID zOss_SysSoftReset(T_ZOssSys_RESET_TYPE type)

+{

+    if (SYS_RESET_TO_EXCEPTRESET != type)

+    {

+        zOss_NvramFlush();

+#ifdef _USE_OSS_FS

+        zOss_SyncFS();

+#endif

+    }

+

+#ifdef _OS_LINUX

+    switch(type)

+    {

+        case SYS_RESET_TO_CHARGER:

+            zx29_restart(0, "drv_key reboot");

+            break;

+        case SYS_RESET_TO_ALRAM:

+            zx29_restart(0, "mmi_rtc reboot");

+            break;

+        case SYS_RESET_TO_EXCEPTRESET:

+            zx29_restart(0, "drv_except reboot");

+            break;			

+        case SYS_RESET_TO_NORMAL:

+        default:

+            zx29_restart(0, NULL);

+    }

+#else

+    switch(type)

+    {

+        case SYS_RESET_TO_NORMAL:

+            zDrv_Soft_Reset(RESET_TO_NORMAL);

+            break;

+        case SYS_RESET_TO_CHARGER:

+            zDrv_Soft_Reset(RESET_TO_CHARGER);

+            break;

+        case SYS_RESET_TO_ALRAM:

+            zDrv_Soft_Reset(RESET_TO_ALRAM);

+            break;

+        case SYS_RESET_TO_EXCEPTRESET:

+            zDrv_Soft_Reset(RESET_TO_EXCEPTRESET);

+            break;

+        default:

+            zDrv_Soft_Reset(RESET_TO_NORMAL);

+            break;

+    }

+#endif

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSysm_MainProc

+* ¹¦ÄÜÃèÊö£ºÆ½Ì¨ÈÎÎñÆô¶¯£¬Ð­ÒéÕ»ÈÎÎñ¹ÜÀí

+* ²ÎÊý˵Ã÷£º(IN)

+            state:ÈÎÎñ״̬

+            msgId:ÏûÏ¢ID

+            pBuf:ÏûÏ¢Ìå

+            msgLen:ÏûÏ¢³¤¶È

+            pPrivateData:˽ÓÐÊý¾Ý

+            (OUT)

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+static VOID Sysm_MainProc(UINT8 state, UINT32 msgId, UINT8 *pBuf, UINT16 msgLen, UINT8 *pPrivateData)

+{

+    UINT32      task_index  = 0;

+    UINT32      nRet        = 0;

+    T_P_DATA    *ptPData    = NULL;

+    

+    ptPData = (T_P_DATA *)pPrivateData;

+    switch (state)

+    {

+    case ZOSS_STATUS_INIT:

+        {

+            switch (msgId)

+            {

+            case EV_INIT:

+                {

+                    break;

+                }

+            case EV_POWERON:

+                {

+                    /* Æô¶¯ÈÎÎñ */

+                    ptPData->curreatpTaskItem = gSysm_TaskTab;

+                    task_index = 0;

+                    task_index = Sysm_InitTasks(ptPData->curreatpTaskItem, task_index);

+                    if (gSche_Max_TaskTab_Num == task_index)

+                    {

+                        /* È«²¿Æô¶¯Íê³É */

+                        nRet = Sysm_PoweronTasks();

+                        zOss_AssertExN(ZOSS_ERROR != nRet);

+            

+                        zOss_SetState(ZOSS_STATUS_WORK);

+                    }

+                    else if (gSche_Max_TaskTab_Num < task_index)

+                    {

+                        zOss_ASSERT(0);/* ´íÎó */

+                    }

+                    else

+                    {

+                        zOss_SetState(SYSM_STATUS_STARTTASK);

+                    }

+                    break;

+                }

+            default:

+                {

+                    zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Sysm_MainProc > Recv unknown msgid=%d\n", msgId);

+                    break;

+                }

+            }

+            break;

+        }

+        

+    case SYSM_STATUS_STARTTASK:

+        {

+            switch (msgId)

+            {

+            case EV_POWERON_OK:

+                {

+                    task_index = Sysm_InitTasks(ptPData->curreatpTaskItem, gSysm_AckTaskIndex + 1);

+                    if (gSche_Max_TaskTab_Num == task_index)

+                    {

+                        /* È«²¿Æô¶¯Íê³É */

+                        nRet = Sysm_PoweronTasks();

+                        if (ZOSS_SUCCESS == nRet)

+                        {

+                            zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Poweron All Task OK!!!\n");

+                        }

+                        else

+                        {

+                            zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Poweron Task Fail!!!\n");

+                        }

+                        zOss_SetState(ZOSS_STATUS_WORK);

+                    }

+                    else if (gSche_Max_TaskTab_Num < task_index)

+                    {

+                        /* ´íÎó */

+                    }

+                    

+                    break;

+                }

+            case EV_SYSM_DOWN:

+                {

+                    zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "System Down!!!\n");

+                    Nvram_Finish();

+                    zOss_Sleep(500);

+                    zDrv_ShutDown();

+                    break;

+                }

+            default:

+                {

+                    zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Sysm_MainProc > Recv unknown msgid=%d\n", msgId);

+                    break;

+                }

+            }

+            break;

+        }

+        

+    case ZOSS_STATUS_WORK:

+        {

+            switch (msgId)

+            {

+            case EV_SYSM_DOWN:

+                {

+                    zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "System Down!!!\n");

+                    Nvram_Finish();

+                    zOss_Sleep(500);

+                    zDrv_ShutDown();

+                    break;

+                }

+            default:

+                {

+                    zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Sysm_MainProc > Recv unknown msgid=%d\n", msgId);

+                    break;

+                }

+            }

+            break;

+        }

+        

+    default:

+        {

+            zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Sysm_MainProc: recv unknown msgid=%d\n", msgId);

+            break;

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSysm_PoweronTasks

+* ¹¦ÄÜÃèÊö£ºÆô¶¯ÈÎÎñ×¢²á±íÖеÄÈÎÎñ

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+static UINT32 Sysm_PoweronTasks(VOID)

+{

+    UINT32 task_index   = 0;

+    UINT32 nRet         = ZOSS_SUCCESS;

+    

+    for ( ; task_index < gTask_TaskNum; task_index++)

+    {

+        nRet = zOss_GetSemaphore(gSche_SaticTaskInitSema, ZOSS_WAIT_FOREVER);

+        if (nRet != ZOSS_SUCCESS)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    

+    nRet = zOss_DeleteSemaphore(gSche_SaticTaskInitSema);

+    

+    if (nRet != ZOSS_SUCCESS)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    for ( task_index = 0; task_index < gSche_Max_TaskTab_Num; task_index++)

+    {

+        if (NULL != gSysm_TaskIDTab[task_index])

+        {

+            nRet = zOss_TaskSend(EV_POWERON, NULL, 0, gSysm_TaskIDTab[task_index]);

+            if (ZOSS_ERROR == nRet)

+            {

+                zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Fail!\n");

+                return nRet;

+            }

+        }

+    }

+    

+    return nRet;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSysm_InitTasks

+* ¹¦ÄÜÃèÊö£ºÆô¶¯ÈÎÎñ×¢²á±íÖеÄÈÎÎñ

+* ²ÎÊý˵Ã÷£º(IN)

+            pTaskItem:ÈÎÎñ×¢²á±í

+            task_index:ÈÎÎñ×¢²á±íÀïµÄÐòºÅ

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»Ø×îºóÆô¶¯µÄÄǸöÈÎÎñµÄϸöÈÎÎñµÄÐòÁкÅ,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+static UINT32 Sysm_InitTasks(T_ZOss_TaskTabItem *pTaskItem, UINT32 task_index)

+{

+    UINT32 nRet = ZOSS_ERROR;

+    

+    zOss_AssertEx(pTaskItem != NULL && task_index <= gSche_Max_TaskTab_Num, ZOSS_ERROR);

+    

+    pTaskItem = pTaskItem + task_index;

+    

+    for ( ; task_index < gSche_Max_TaskTab_Num; task_index++)

+    {

+        if (1 == pTaskItem->is_use)

+        {

+            zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "[%d]Start Task %s ", task_index, pTaskItem->task_name);

+            

+            /* ·¢Ëͳõʼ»¯ÏûÏ¢ */

+            nRet = zOss_TaskSend(EV_INIT, NULL, 0, gSysm_TaskIDTab[task_index]);

+            

+            if (nRet == ZOSS_ERROR)

+            {

+                zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Fail!\n");

+                return ZOSS_ERROR;

+            }

+            else

+            {

+                zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "OK!\n");

+            }

+            

+            if (1 == pTaskItem->ack_flag)

+            {

+                gSysm_AckTaskIndex = task_index;

+                zOss_Printf(SUBMDL_SYSM, PRINT_LEVEL_DEBUG, "Wait Ack!!!\n");

+                return task_index;

+            }

+        }

+        

+        pTaskItem++;

+    }

+

+    return task_index;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_task.c b/cp/ps/plat/src/oss/sup/src/sup_task.c
new file mode 100755
index 0000000..0be13eb
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_task.c
@@ -0,0 +1,2427 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98C_OSS 

+* ÎÄ ¼þ Ãû : taskmgt.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : ÈÎÎñ¹ÜÀíÄ£¿é

+* ×÷    Õß : xiaxinguo

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2007-07-16

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-17

+* ÐÞ¸ÄÄÚÈÝ : ¸ñʽ¹æ·¶ºÍPC-LINT×ß²é EC:617001782014

+**************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0002

+* ÐÞ ¸Ä ÈË : chenxingfang

+* ÐÞ¸ÄÈÕÆÚ : 2012-09-27

+* ÐÞ¸ÄÄÚÈÝ : ´úÂë×ß²é EC:617001782003

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "sup_task.h"

+#include "osa.h"

+#include "sup.h"

+#include "ThreadPriority.h"

+#include "osa.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+/* ÈÎÎñ¹ÜÀíÄ£¿éÏûÏ¢¶¨Òå */

+#define EV_TASK_END         (UINT32)(EV_ZOSS_SCHE_BASE + 0) /* ÈÎÎñÍ˳öÏûÏ¢     */

+#define EV_TASK_CRE         (UINT32)(EV_ZOSS_SCHE_BASE + 1) /* ÈÎÎñ´´½¨ÏûÏ¢     */

+

+/**************************************************************************

+* Êý¾Ý½á¹¹¶¨ÒåÇø

+**************************************************************************/

+static struct

+{

+    Task_SEND_HOOK          send_to;

+    Task_SEND_DATA_HOOK     send_data_to;

+    Task_GET_ALL_ID_HOOK    get_all_id;

+    Task_GET_ID_HOOK        get_id;

+    Task_GET_THAKNAME_HOOK  get_name;

+}gSche_Task_Hook; 

+

+typedef struct 

+{

+    ZOSS_TASK_ID    task_id;

+    UINT32          msg_id;

+    UINT32          arg;

+    T_TIMER_NODE    *pTimerNode;

+}T_Task_Arg;

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static VOID Sche_DefTaskEntry(SINT32 arg);      /* µ÷¶ÈÏß³ÌÈë¿Úº¯Êý     */

+static UINT32 Sche_AddTCB(T_ZOss_TCB *ptTcb);   /* TCB±í¿ØÖƺ¯ÊýÉêÃ÷    */

+static UINT32 Sche_RemoveTCB(T_ZOss_TCB *pDelTcb);

+static T_ZOss_TCB *Sche_GetTCB(const ZOSS_TASK_ID taskId);

+static VOID TaskTimer_CallBack(T_Task_Arg *task_arg);

+static BOOL Timer_IgnoreTaskMsg(ZOSS_TIMER_ID timerId);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+ZOSS_SEMAPHORE_ID                      gSche_SaticTaskInitSema = NULL;

+__tcm_data UINT32                      gTask_TaskNum           = 0;

+__tcm_data static T_ZOss_TCB           *gSche_TCBHeadPtr       = NULL;

+__tcm_data static T_ZOss_TCB           *gSche_TCBTailPtr       = NULL;

+__tcm_data static UINT32               gSche_MaxTCBLen         = 0;

+__tcm_data static ZOSS_MUTEX_ID        gSche_TCBMutex          = NULL;

+__tcm_data static ZOSS_MUTEX_ID        gSche_TRFMutex          = NULL;

+__tcm_data static ZOSS_MUTEX_ID        gSche_CreMutex          = NULL;

+__tcm_data static T_ZOss_List          gSche_TRF_List;

+__tcm_data static BOOL                 gSche_IsTaskInit        = FALSE;

+__tcm_data static UINT32               gSche_pDataRegion_Test  = 0x5a5a5a5a;

+__tcm_data static T_ZOss_TRF           *gSche_ThreadItemTab    = NULL;   

+__tcm_data static UINT32               gSche_Max_TaskTab_Num   = 0;

+__tcm_data static UINT32               gSche_Max_Thread_Num    = 0;

+__tcm_data static UINT32               gSche_Max_MsgQueue_Len  = 0;

+__tcm_data static UINT32               gSche_DeadLoop_Time     = 0;

+__tcm_data static UINT32               gSche_TaskNum           = 0;

+__tcm_data static T_ZOss_TaskTabItem   *gSche_TaskItemTab      = NULL;

+extern BOOL         gOsa_SwapTimeFlag;

+extern ZOSS_TASK_ID gExcep_DaemonTask;

+extern ZOSS_TASK_ID         *gSysm_TaskIDTab;

+

+#ifdef _USE_SDL

+__tcm_data tasksdl_desc  *tasksdl_table = NULL; 

+extern const UINT32 nof_signalcode;

+extern struct signalcode_desc signalcode_table[];

+#endif

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSCHE_Init

+* ¹¦ÄÜÃèÊö£º³õʼ»¯ÈÎÎñ¹ÜÀíÄ£¿é

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 SCHE_Init(VOID)

+{

+    T_ZOss_TRF      *pTRF       = NULL;

+    T_OSS_PARAM     *pPlatCfg   = NULL;

+    ZOSS_THREAD_ID  threadId    = NULL;

+    UINT32          i           = 0;

+    UINT32          nRet        = ZOSS_ERROR;

+    UINT32          priority[8] = {THR1_PRI, THR2_PRI, THR3_PRI, THR4_PRI, THR5_PRI, THR6_PRI, THR7_PRI, THR8_PRI}; 

+    UINT32          *stSize     = NULL;

+    

+    if (gSche_IsTaskInit)            

+    {

+        return ZOSS_SUCCESS;

+    }

+    

+    /* ²ÎÊýÅäÖà */

+    pPlatCfg = zOss_GetOssCfg();

+    gSche_Max_TaskTab_Num = pPlatCfg->TaskCfg.max_task_num;

+    if (gSche_Max_TaskTab_Num < 1)

+    {

+        return ZOSS_ERROR;

+    }

+    gSche_Max_Thread_Num = pPlatCfg->TaskCfg.max_schthread_num;

+    if (!gSche_Max_Thread_Num || gSche_Max_Thread_Num > sizeof(priority)/sizeof(priority[0]))

+    {

+        return ZOSS_ERROR;

+    }

+    gSche_TaskItemTab = pPlatCfg->SysmCfg.pSysm_TaskItemTab;

+    gSche_TaskNum = pPlatCfg->SysmCfg.task_num;

+    

+    gSche_Max_MsgQueue_Len = pPlatCfg->TaskCfg.max_msg_queue_len;

+    if (gSche_Max_MsgQueue_Len < 1)

+    {

+        return ZOSS_ERROR;

+    }

+    gSche_DeadLoop_Time = pPlatCfg->TaskCfg.deadloop_time;

+    

+    /* ¶¯Ì¬¿Õ¼äÉêÇë */

+    if (gSche_ThreadItemTab == 0)

+    {

+        gSche_ThreadItemTab = (T_ZOss_TRF *)zOss_Malloc(sizeof(T_ZOss_TRF) * gSche_Max_Thread_Num);

+        if (gSche_ThreadItemTab == NULL)

+        {

+            return ZOSS_ERROR;

+        }

+        zOss_Memset((UINT8 *)gSche_ThreadItemTab, 0, sizeof(T_ZOss_TRF) * gSche_Max_Thread_Num);

+    }

+        

+    /* ´´½¨»¥³â */

+    gSche_TCBMutex = zOss_CreateMutex("gSche_TCBMutex", ZOSS_INHERIT);   /* ´´½¨TCB±í»¥³âÌå */

+    if (NULL == gSche_TCBMutex)

+    {

+        return ZOSS_ERROR;

+    }

+    gSche_TRFMutex = zOss_CreateMutex("gSche_TRFMutex", ZOSS_INHERIT);   /* ´´½¨TRF±í»¥³âÌå */

+    if (NULL == gSche_TRFMutex)

+    {

+        return ZOSS_ERROR;

+    }

+    gSche_CreMutex = zOss_CreateMutex("gSche_CreMutex", ZOSS_INHERIT);   /* ´´½¨Create»¥³âÌå */

+    if (NULL == gSche_CreMutex)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    zOss_ListInit(&gSche_TRF_List);          /* ³õʼ»¯TRFÁ´±í */

+    

+    stSize = (UINT32 *)zOss_Malloc(gSche_Max_Thread_Num * sizeof(UINT32));

+    if (!stSize)

+        return ZOSS_ERROR;

+

+    for (i = 0; i < gSche_Max_Thread_Num; i++)

+    {

+        stSize[i] = 4096;

+    }

+    

+    for (i = 0; i < gSche_TaskNum; i++)

+    {

+        if ((gSche_TaskItemTab + i)->process_no > 0 && (gSche_TaskItemTab + i)->process_no <= gSche_Max_Thread_Num)

+        {

+            if ((gSche_TaskItemTab + i)->stack_size > stSize[(gSche_TaskItemTab + i)->process_no - 1])

+            {

+                stSize[(gSche_TaskItemTab + i)->process_no - 1] = (gSche_TaskItemTab + i)->stack_size;

+            }

+        }

+    }

+

+    for (i = 0; i < gSche_Max_Thread_Num; i++)  /* ´´½¨µ÷¶ÈÏß³Ì */

+    {

+        pTRF = &gSche_ThreadItemTab[i];

+        sprintf((char *)pTRF->thread_name, "thread%lu", i + 1);

+        pTRF->priority = priority[i];

+        pTRF->pno = 1;

+        

+        /* ´´½¨Ïß³Ì */

+        threadId = zOss_CreateThread(pTRF->thread_name, Sche_DefTaskEntry, (SINT32)pTRF, stSize[i], pTRF->priority, 1, 0);

+        if (threadId == ZOSS_INVALID_THREAD_ID)

+        {

+            zOss_Free((VOID *)stSize);

+            return ZOSS_ERROR;

+        }

+        

+        zOss_ListInit(&pTRF->TCBReady);      /* ³õʼ»¯¾ÍÐ÷ÈÎÎñÁ´±í */

+        zOss_ListInit(&pTRF->TCBStopped);    /* ³õʼ»¯ÔÝÍ£ÈÎÎñÁ´±í */

+        zOss_ListInit(&pTRF->TCBIdle);       /* ³õʼ»¯¿ÕÏÐÈÎÎñÁ´±í */

+        pTRF->thread_id = threadId;

+        zOss_ListAdd(&gSche_TRF_List, &(pTRF->node));

+        nRet = Sche_SetTaskID(threadId, pTRF);

+        if (nRet == ZOSS_ERROR)

+        {

+            zOss_Free((VOID *)stSize);

+            return ZOSS_ERROR;

+        }

+    }

+    

+    zOss_Free((VOID *)stSize);

+    

+    

+    /* Æô¶¯µ÷¶ÈÏß³Ì */

+    for (i = 0; i < gSche_Max_Thread_Num; i++)

+    {

+        pTRF = &gSche_ThreadItemTab[i];

+        nRet = zOss_ResumeThread(pTRF->thread_id);

+        if (nRet == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    

+    gSche_MaxTCBLen  = 0;

+    gSche_IsTaskInit = TRUE;

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_Task_HookSet

+* ¹¦ÄÜÃèÊö£ºÉèÖÃSDLÏà¹Ø»Øµ÷º¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_Task_HookSet(UINT8 type, VOID *HookFunc)

+{

+    switch (type)

+    {

+    case ZOSS_SETHOOK_SEND:

+        {

+            gSche_Task_Hook.send_to = (Task_SEND_HOOK)HookFunc;           

+            break;

+        }

+    case ZOSS_SETHOOK_SEND_DATA:

+        {

+            gSche_Task_Hook.send_data_to = (Task_SEND_DATA_HOOK)HookFunc;

+            break;

+        }

+    case ZOSS_SETHOOK_GET_ALL_ID:

+        {

+            gSche_Task_Hook.get_all_id = (Task_GET_ALL_ID_HOOK)HookFunc;

+            break;

+        }

+    case ZOSS_SETHOOK_GET_ID:

+        {

+            gSche_Task_Hook.get_id = (Task_GET_ID_HOOK)HookFunc;

+            break;

+        }

+    case ZOSS_SETHOOK_GET_NAME:

+        {

+            gSche_Task_Hook.get_name = (Task_GET_THAKNAME_HOOK)HookFunc;

+            break;

+        }

+    default:

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_CreateTask

+* ¹¦ÄÜÃèÊö£º¸Ãº¯ÊýÓÃÓÚ´´½¨Ò»¸öÐÂÈÎÎñ

+* ²ÎÊý˵Ã÷£º(IN)

+            thread_name: ÈÎÎñÃû³Æ

+            entry: ÈÎÎñÖ´ÐеÄÈë¿Úº¯Êý

+            stack_size: ¶ÑÕ»´óС£¨µ¥Î»£º×Ö½Ú£©,ĬÈÏֵΪ0

+            priority: Ïß³ÌÓÅÏȼ¶£¨0-31£©, pnoΪ0ʱÓÐÓã¬ÖµÔ½µÍÓÅÏȼ¶Ô½¸ß

+            private_data_len: ÈÎÎñ˽ÓÐÊý¾ÝµÄ´óС

+            pno:µ÷¶ÈÏ̱߳àºÅ(1-8)

+            is_static:ÊÇ·ñ¾²Ì¬ÈÎÎñ

+           (OUT)

+* ·µ »Ø Öµ£º·µ»ØÈÎÎñID,ʧ°Ü·µ»ØZOSS_INVALID_TASK_ID

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+ZOSS_TASK_ID zOss_CreateTask_EX(const CHAR      *task_name,

+                                FUNC_TASKENTRY  task_entry, 

+                                UINT32          stack_size,

+                                UINT32          priority,

+                                UINT32          private_data_len,

+                                UINT8           pno,

+                                UINT8           is_static)

+{

+    ZOSS_THREAD_ID  threadId        = NULL;

+    ZOSS_TASK_ID    testtaskId      = NULL;

+    UINT8           *pDataRegion    = NULL;

+    T_ZOss_TCB      *pTCB           = NULL;

+    T_ZOss_TRF      *pTRF           = NULL;

+    UINT32          nRet            = ZOSS_ERROR;

+    UINT32          status          = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)               /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    zOss_AssertEx(NULL != task_name && NULL != task_entry, ZOSS_INVALID_TASK_ID);

+    zOss_AssertEx(0 < stack_size && pno <= gSche_Max_Thread_Num, ZOSS_INVALID_TASK_ID);

+

+    if (strlen((char *)task_name) > ZOSS_MAX_TASKNAME_LEN)

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    if (ZOSS_SUCCESS != zOss_GetMutex(gSche_CreMutex, ZOSS_WAIT_FOREVER))

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    testtaskId = zOss_GetTaskID(task_name);

+    zOss_ASSERT(ZOSS_INVALID_TASK_ID == testtaskId);

+    if (ZOSS_INVALID_TASK_ID != testtaskId)

+    {

+        zOss_PutMutex(gSche_CreMutex);

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    /* ²úÉúÈÎÎñ¿ØÖÆ¿éTCB */

+    pTCB = (T_ZOss_TCB *)zOss_Malloc(sizeof(T_ZOss_TCB));

+    if (NULL == pTCB)

+    {

+        zOss_PutMutex(gSche_CreMutex);

+        return ZOSS_INVALID_TASK_ID;

+    }

+    zOss_Memset((UINT8 *)pTCB, 0, sizeof(T_ZOss_TCB));

+    

+    /* ·ÖÅäÓû§Ë½ÓÐÊý¾Ý¿Õ¼ä */

+    if (0 == private_data_len)

+    {

+        pDataRegion = NULL;

+    }

+    else

+    {

+        private_data_len = ALIGN_TO(private_data_len, sizeof(UINT32));

+        pDataRegion = (UINT8 *)zOss_Malloc(private_data_len + 4);  /* Óû§Êý¾ÝÇø */

+        if (NULL == pDataRegion)

+        {

+            zOss_PutMutex(gSche_CreMutex);

+            zOss_Free(pTCB);

+            return ZOSS_INVALID_TASK_ID;

+        }

+        zOss_Memset(pDataRegion, 0, private_data_len);

+        *(UINT32 *)((UINT32)pDataRegion + private_data_len) = gSche_pDataRegion_Test;

+    }

+    

+    /* ÏòTCB±íÌí¼ÓÈÎÎñÐÅÏ¢ */

+    zOss_ListInit(&pTCB->msg_queue);

+    pTCB->taskData = pDataRegion;

+    strncpy((char *)pTCB->task_name,(const char *)task_name,ZOSS_MAX_TASKNAME_LEN);

+    pTCB->task_name[ZOSS_MAX_TASKNAME_LEN] = '\0';

+    pTCB->taskEntry = task_entry;

+    pTCB->HookEntry[0] = NULL;

+    pTCB->HookEntry[1] = NULL;

+    pTCB->HookEntry[2] = NULL;

+    pTCB->state = ZOSS_STATUS_INIT;

+    pTCB->priority = priority;

+    pTCB->stack_size = stack_size;

+    pTCB->private_data_len = private_data_len;

+    pTCB->task_time = 0;

+    pTCB->sender_task_id = NULL;

+    pTCB->thread_no = pno;

+    pTCB->type = SCHE_OSS_TASK;

+    pTCB->reserved[0] = is_static;

+    pTCB->malloc_size = 0xFFFFFFFF; /* mallocδʵÏÖ */

+    

+    if (pno == 0)                   /* Èç¹ûÊǶÀÕ¼Ị̈߳¬ÔòÐèÒªµ¥¶À´´½¨Ò»¸öµ÷¶ÈÏß³Ì */

+    {

+        /* ²úÉúÏ̵߳ǼDZí */

+        pTRF = (T_ZOss_TRF *)zOss_Malloc(sizeof(T_ZOss_TRF));

+        if (NULL == pTRF)

+        {

+            zOss_PutMutex(gSche_CreMutex);

+            if (0 != private_data_len)

+            {

+                zOss_Free(pDataRegion);

+            }

+            zOss_Free((UINT8 *)pTCB);

+            return ZOSS_INVALID_TASK_ID;

+        }

+        zOss_Memset((UINT8 *)pTRF, 0, sizeof(T_ZOss_TRF));

+        

+        /* ´´½¨µ÷¶ÈÏß³Ì */

+        threadId = zOss_CreateThread(task_name, Sche_DefTaskEntry, (SINT32)pTRF, stack_size, priority, 1, 0);

+        if (threadId == ZOSS_INVALID_THREAD_ID)          /* Èç¹û´´½¨Ê§°ÜÔòÊͷſռä */

+        {

+            zOss_PutMutex(gSche_CreMutex);

+            SCHE_printf("Fail!\n");

+            if (0 != private_data_len)

+            {

+                zOss_Free(pDataRegion);

+            }

+            zOss_Free((UINT8 *)pTCB);

+            zOss_Free((UINT8 *)pTRF);

+            return ZOSS_INVALID_TASK_ID;

+        }

+        

+        /* ³õʼ»¯ÈÎÎñÁ´±í */

+        zOss_ListInit(&pTRF->TCBReady);

+        zOss_ListInit(&pTRF->TCBStopped);

+        zOss_ListInit(&pTRF->TCBIdle);

+        

+        /* ÏòÏ̵߳ǼDZíÖÐдÈëµ÷¶ÈÏß³ÌÐÅÏ¢ */

+        pTRF->priority = priority;

+        pTRF->thread_id = threadId;

+        pTRF->pno = 0;

+        

+        /* ½«ÈÎÎñ¹ÒÈëµ÷¶ÈÏß³Ì */

+        pTCB->thread_id = threadId;

+        

+        nRet = Sche_SetTaskID(threadId, pTRF);

+        if (nRet == ZOSS_ERROR)

+        {

+            zOss_PutMutex(gSche_CreMutex);

+            

+            SCHE_printf("Fail!\n");

+            if (0 != private_data_len)

+            {

+                zOss_Free(pDataRegion);

+            }

+            zOss_Free((UINT8 *)pTCB);

+            zOss_Free((UINT8 *)pTRF);

+            return ZOSS_INVALID_TASK_ID;

+        }

+        

+        /* ½«Ï̵߳ǼDZí¹ÒÈëTRFÁ´±í */

+        if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TRFMutex, ZOSS_WAIT_FOREVER))

+        {

+            zOss_ListAdd(&gSche_TRF_List, &(pTRF->node));

+            

+            /* Æô¶¯µ÷¶ÈÏß³Ì */

+            nRet = zOss_ResumeThread(threadId);

+            if (nRet == ZOSS_ERROR)            /* Èç¹ûÆô¶¯Ê§°ÜÔòÊͷſռä */

+            {

+                zOss_PutMutex(gSche_CreMutex);

+                SCHE_printf("Fail!\n");

+                if (0 != private_data_len)

+                {

+                    zOss_Free(pDataRegion);

+                }

+                zOss_Free((UINT8 *)pTCB);

+                status = zOss_DeleteThread(threadId);

+                if (status == ZOSS_SUCCESS)

+                {

+                    zOss_ListDelete(&gSche_TRF_List, &(pTRF->node));

+                    zOss_Free((UINT8 *)pTRF);

+                }

+                zOss_PutMutex(gSche_TRFMutex);

+                return ZOSS_INVALID_TASK_ID;

+            }

+            zOss_PutMutex(gSche_TRFMutex);

+        }

+    }

+    else                                /* ·Ç¶Àռʱ¸ù¾Ýµ÷¶ÈÏ̺߳Ž«ÈÎÎñ¹ÒÈëÏàÓ¦µ÷¶ÈÏß³Ì */

+    {

+        pTRF = &gSche_ThreadItemTab[pno - 1];

+        pTCB->thread_id = pTRF->thread_id;

+    }

+    

+    /* ½«ÈÎÎñ¿ØÖÆ¿épTaskInfo¹Òµ½ÈÎÎñÁбíÉÏ */

+    nRet = Sche_AddTCB(pTCB);

+    if (nRet == ZOSS_ERROR)             /* Èç¹ûʧ°ÜÔò±íʾ³¬¹ý×î´óÈÎÎñÊý */

+    {

+        zOss_PutMutex(gSche_CreMutex);

+        SCHE_printf("Fail!\n");

+        if (0 != private_data_len)

+        {

+            zOss_Free(pDataRegion);

+        }

+        zOss_Free((UINT8 *)pTCB);

+        if (pno == 0)                   /* Èç¹ûÊǶÀÕ¼µ÷¶ÈÏß³ÌÔòÐèҪɾ³ýÏß³Ì */

+        {

+            status = zOss_DeleteThread(threadId);

+            if (status == ZOSS_SUCCESS )

+            {

+                if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TRFMutex, ZOSS_WAIT_FOREVER))

+                {

+                    zOss_ListDelete(&gSche_TRF_List, &(pTRF->node));

+                    nRet = zOss_PutMutex(gSche_TRFMutex);

+                    if (nRet == ZOSS_ERROR)

+                    {

+                        return NULL;

+                    }

+                }

+                zOss_Free((UINT8 *)pTRF);

+            }

+        }

+        

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    pTCB->time = zOss_GetTickCount();

+    pTCB->task_id = (ZOSS_TASK_ID)pTCB;

+    

+    zOss_PutMutex(gSche_CreMutex);

+    

+    /* Ïòµ÷¶ÈÏ̷߳¢ÈÎÎñ´´½¨ÏûÏ¢ */

+    zOss_TaskSend(EV_TASK_CRE, NULL, 0, (ZOSS_TASK_ID)pTCB);

+    return pTCB;

+}

+

+ZOSS_TASK_ID zOss_CreateTask(const CHAR      *task_name,

+                             FUNC_TASKENTRY  task_entry, 

+                             UINT32          stack_size,

+                             UINT32          priority,

+                             UINT32          private_data_len,

+                             UINT8           pno)

+{

+    ZOSS_TASK_ID    taskID  = NULL;

+    UINT32          nRet    = 0;

+    

+    taskID = zOss_CreateTask_EX(task_name, task_entry, stack_size, priority, private_data_len, pno, 0);

+    if (taskID != ZOSS_INVALID_TASK_ID)

+    {

+        nRet = zOss_TaskSend(EV_INIT, NULL, 0, taskID);

+        zOss_AssertEx(nRet != ZOSS_ERROR, ZOSS_INVALID_TASK_ID);

+    }

+    return taskID;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_DeleteTask

+* ¹¦ÄÜÃèÊö£º¸Ãº¯ÊýÓÃÓÚɾ³ýÒ»¸öÈÎÎñ

+* ²ÎÊý˵Ã÷£º(IN)

+            task_id:ÈÎÎñID,Èç¹ûΪ0£¬Ôòɾ³ýµ±Ç°ÈÎÎñ

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º²»»áÁ¢¼´É¾³ý£¬ÈÎÎñ»á´¦ÀíÍ굱ǰÏûÏ¢

+**************************************************************************/

+UINT32 zOss_DeleteTask(ZOSS_TASK_ID task_id)

+{

+    T_ZOss_TCB  *pTCB   = NULL;

+    UINT32      status  = ZOSS_ERROR;

+    UINT32      nore    = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)               /* ¼ì²éÊÇ·ñÒѳõʼ»¯            */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    if (NULL == task_id)                         /* ÈÎÎñIDΪ¿ÕÔòɾ³ýµ±Ç°ÈÎÎñ    */

+    {

+        task_id = zOss_GetSelfTaskID();          /* »ñÈ¡µ±Ç°ÈÎÎñID              */

+        if (task_id == ZOSS_INVALID_TASK_ID)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    

+    pTCB = (T_ZOss_TCB *)task_id;                /* »ñÈ¡ÈÎÎñTCB±í               */

+    

+    if (pTCB->type != SCHE_OSS_TASK)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))   /* ÐźÅÁ¿±£»¤           */

+    {

+        if (task_id == pTCB->task_id)                                       /* ¼ì²éÈÎÎñÊÇ·ñ´æÔÚ     */

+        {

+            status = zOss_TaskSend(EV_TASK_END, NULL, 0, task_id);          /* Ïòµ÷¶ÈÏ̷߳¢É¾³ýÏûÏ¢ */

+            pTCB->task_id = NULL;

+        }

+        else

+        {

+            zOss_PutMutex(gSche_TCBMutex);

+            return ZOSS_ERROR;

+        }

+        nore = zOss_PutMutex(gSche_TCBMutex);

+        if (nore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    

+    return status;

+}

+

+/**************************************************************************

+*º¯ÊýÃû³Æ£ºzOss_PauseTask

+*¹¦ÄÜÃèÊö£ºÔÝÍ£ÈÎÎñÖ´ÐÐ

+*²ÎÊý˵Ã÷£ºtask_id:´ýÔÝÍ£ÈÎÎñµÄID

+*·µ»ØÖµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+*ÆäËû˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_PauseTask(ZOSS_TASK_ID task_id)

+{

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_ResumTask

+* ¹¦ÄÜÃèÊö£º»Ö¸´ÈÎÎñ,תµ½¾ÍÐ÷̬

+* ²ÎÊý˵Ã÷£º(IN)

+            task_id:´ý»Ö¸´ÈÎÎñµÄID

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_ResumeTask(ZOSS_TASK_ID task_id)

+{

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+*º¯ÊýÃû³Æ£ºzOss_GetTaskInfo

+*¹¦ÄÜÃèÊö£º»ñÈ¡ÈÎÎñÐÅÏ¢

+*²ÎÊý˵Ã÷£º(IN)

+           task_id:ÈÎÎñID,Èç¹ûΪ0£¬»ñÈ¡µ±Ç°ÈÎÎñÐÅÏ¢

+           task_info:ÈÎÎñ¿ØÖÆ¿é±íÖ¸Õ룬ָÏò´æ·Å¸ÃÈÎÎñÐÅÏ¢µÄ´æ´¢¿é£¬ÔÚµ÷ÓÃ

+                     ǰ³õʼ»¯

+           (OUT)

+*·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+*ÆäËû˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_GetTaskInfo(ZOSS_TASK_ID task_id, T_ZOss_TCB *task_info)

+{

+    T_ZOss_TCB  *pTCB   = NULL;

+    UINT32      nore    = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)             /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    zOss_AssertEx(NULL != task_info, ZOSS_ERROR);

+    

+    if (ZOSS_INVALID_TASK_ID == task_id)       /* ÈÎÎñIDΪ¿ÕÔò»ñÈ¡µ±Ç°ÈÎÎñÐÅÏ¢ */

+    {

+        task_id = zOss_GetSelfTaskID();

+        if (task_id == ZOSS_INVALID_TASK_ID)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    

+    pTCB = (T_ZOss_TCB *)task_id;              /* »ñÈ¡ÈÎÎñTCB±í */

+    

+    if (pTCB->type != SCHE_OSS_TASK)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    /* ÐźÅÁ¿±£»¤ */

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        if (task_id == pTCB->task_id)       /* ÈÎÎñ´æÔÚ     */

+        {

+            *task_info = *pTCB;             /* »ñÈ¡ÈÎÎñÐÅÏ¢ */

+            nore = zOss_PutMutex(gSche_TCBMutex);

+            if (nore == ZOSS_ERROR)

+            {

+                return ZOSS_ERROR;

+            }

+            return ZOSS_SUCCESS;

+        }

+        zOss_PutMutex(gSche_TCBMutex);

+    }

+    

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetAllTaskInfo

+* ¹¦ÄÜÃèÊö£º»ñÈ¡µ±Ç°ËùÓзÇSDLÈÎÎñµÄÏà¹ØÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+*           (OUT) pMonTaskInfo: ÈÎÎñÐÅÏ¢´æ·ÅµØÖ·

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËû˵Ã÷£º´Ëº¯ÊýÉêÇëµÄÄÚ´æ¿Õ¼ä£¬±ØÐëÓÉʹÓÃÕßÊÍ·Å£¬·ñÔò»áÔì³ÉÄÚ´æÐ¹Â¶¡£

+**************************************************************************/

+VOID zOss_GetAllTaskInfo(T_ZOss_Mon_Task *pMonTaskInfo)

+{

+#ifdef _USE_MONITOR

+    T_ZOss_Mon_Task  taskInfo   = {0};

+    T_ZOss_TCB      *TCBNode    = NULL;

+    UINT32          cnt         = 0;

+

+    if (pMonTaskInfo == NULL)

+    {

+        return;

+    }

+    

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        taskInfo.num = gSche_MaxTCBLen;

+        taskInfo.ele = (T_ZOss_Mon_Task_Ele *)zOss_GetUB(taskInfo.num * sizeof(T_ZOss_Mon_Task_Ele));

+        zOss_AssertExN(taskInfo.ele != NULL);

+        TCBNode = gSche_TCBHeadPtr;

+        for (cnt = 0; cnt < taskInfo.num ; cnt++)

+        {

+            taskInfo.ele[cnt].name          = TCBNode->task_name;

+            taskInfo.ele[cnt].handle        = (UINT32)TCBNode->task_id;

+            taskInfo.ele[cnt].thread_handle = (UINT32)TCBNode->thread_id;

+            taskInfo.ele[cnt].status        = TCBNode->run_status;  

+            TCBNode = TCBNode->next;

+        }

+        zOss_PutMutex(gSche_TCBMutex);

+

+        pMonTaskInfo->num = taskInfo.num;

+        pMonTaskInfo->ele = taskInfo.ele;

+    }

+#endif    

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetAllTaskID

+* ¹¦ÄÜÃèÊö£º»ñÈ¡ËùÓÐÈÎÎñID£¬°üÀ¨SDLÈÎÎñ

+* ²ÎÊý˵Ã÷£º(IN)

+            task_id_arr:´æ·ÅÈÎÎñIDµÄÖ¸Õ룬ÔÚµ÷ÓÃǰ³õʼ»¯

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØÈÎÎñÊý£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_GetAllTaskID(ZOSS_TASK_ID *task_id_arr)

+{

+    T_ZOss_TCB  *pCurTCB    = NULL;

+    UINT32      tasknum     = 0;

+    UINT32      sdltasknum  = 0;

+    UINT32      nore        = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    zOss_AssertEx(NULL != task_id_arr, ZOSS_ERROR);

+    

+    /* ÐźÅÁ¿±£»¤ */

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        /* ȡһ°ãÈÎÎñID */

+        if (NULL != gSche_TCBHeadPtr)   /* Á´±í²»Îª¿Õ */

+        {

+            pCurTCB = gSche_TCBHeadPtr;

+            while (NULL != pCurTCB)

+            {

+                if (pCurTCB == (T_ZOss_TCB *)pCurTCB->task_id)

+                {

+                    *task_id_arr = pCurTCB->task_id;

+                    tasknum++;

+                }

+                pCurTCB = pCurTCB->next;

+                task_id_arr++;

+            }

+        }

+        

+        /* È¡SDLÈÎÎñID */

+        if (gSche_Task_Hook.get_all_id != NULL)

+        {

+            sdltasknum = gSche_Task_Hook.get_all_id(task_id_arr);

+        }

+        

+        nore = zOss_PutMutex(gSche_TCBMutex);

+        if (nore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+        return (tasknum + sdltasknum);

+    }

+    return 0;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_TaskSend

+* ¹¦ÄÜÃèÊö£º¸øÈÎÎñ·¢ËÍÒì²½ÏûÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+            msg:ÏûÏ¢ID

+            msg_buf:ÏûÏ¢¶ÑÕ»

+            msg_len:ÏûÏ¢³¤¶È

+            task_id:Ä¿±êÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º±¾½Ó¿Ú×èÈû£¬²»ÄÜÔÚÖжÏÖÐʹÓÃ

+**************************************************************************/

+__tcm_func UINT32 zOss_TaskSend(UINT32 msg_id, const VOID *buf, UINT16 msg_len, ZOSS_TASK_ID task_id)

+{

+    UINT32              nRet    = ZOSS_ERROR;

+    T_ZOss_TaskMsgHead  *pMsg   = NULL;

+    T_ZOss_TCB          *pTCB   = NULL;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    zOss_AssertEx(NULL != task_id, ZOSS_ERROR);

+    

+    if (gSche_Task_Hook.send_to != NULL)

+    {

+        nRet = gSche_Task_Hook.send_to(msg_id, buf, msg_len, task_id, zOss_GetSelfTaskID());

+        if (nRet == ZOSS_SUCCESS)

+        {

+            return ZOSS_SUCCESS;

+        }

+    }

+    

+    /* ¶¨Î»Ä¿±êÈÎÎñ */

+    pTCB = (T_ZOss_TCB *)task_id;           /* »ñȡĿ±êÈÎÎñTCB±í    */

+    if (task_id != pTCB->task_id)           /* ÈÎÎñ²»´æÔÚ           */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    /* ·ÖÅäÏûÏ¢¿Õ¼ä */

+    pMsg = (T_ZOss_TaskMsgHead *)zOss_GetUB(msg_len + SCHE_M_TASKMSGHEAD_LEN);

+    if (NULL == pMsg)

+    {

+        return ZOSS_ERROR;

+    }

+    /* дÏûϢͷ */

+    pMsg->t_task_id     = task_id;

+    pMsg->s_task_id     = zOss_GetSelfTaskID();

+    pMsg->send_state    = ZOSS_MSGSENDTYPE_MSG;

+    pMsg->msgID         = msg_id;

+    pMsg->msgLen        = msg_len;

+    if (msg_len > 0 && buf != NULL)

+    {

+        zOss_Memcpy((UINT8 *)(pMsg + 1), (UINT8 *)buf, msg_len);

+    }

+    /* ·¢ËÍÏûÏ¢ */

+    nRet = zOss_TaskSendDataEx(pMsg);

+   

+    return nRet;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_TaskSendData

+* ¹¦ÄÜÃèÊö£º¸øÆäËûÈÎÎñ·¢ËÍÒì²½ÏûÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+            msg:ÏûÏ¢ID

+            msg_buf:ÏûÏ¢¶ÑÕ»

+            msg_len:ÏûÏ¢³¤¶È

+            task_id:Ä¿±êÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£º Èç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º±¾½Ó¿Ú×èÈû£¬²»ÄÜÔÚÖжÏÖÐʹÓà £¬Ö»´«µÝ

+            ÏûÏ¢Ö¸Õ룬²»×ö¿½±´£¬Òò´ËÏûÏ¢ÓÉÓû§ÊÍ·Å

+**************************************************************************/

+CODE_BEGIN(.PLAT_TCM_CODE)

+__tcm_func UINT32 zOss_TaskSendData(UINT32 msg_id, VOID *buf, UINT16 msg_len, ZOSS_TASK_ID task_id)

+{

+    UINT32              nRet    = ZOSS_ERROR;

+    T_ZOss_TaskMsgHead  *pMsg   = NULL;

+    T_ZOss_TaskMsg      *pBuf   = NULL;

+    T_ZOss_TCB          *pTCB   = NULL;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    zOss_AssertEx(NULL != task_id, ZOSS_ERROR);

+    

+    if (gSche_Task_Hook.send_to != NULL)

+    {

+        nRet = gSche_Task_Hook.send_to(msg_id, buf, msg_len, task_id, zOss_GetSelfTaskID());

+        if (nRet == ZOSS_SUCCESS)

+        {

+            if (buf != NULL)

+            {

+                if (ZOSS_SUCCESS != zOss_RetUB(buf))

+                {

+                    return ZOSS_ERROR;

+                }

+            }

+            return ZOSS_SUCCESS;

+        }

+    }

+    

+    /* ¶¨Î»Ä¿±êÈÎÎñ */

+    pTCB = (T_ZOss_TCB *)task_id;           /* »ñȡĿ±êÈÎÎñTCB±í    */

+    if (task_id != pTCB->task_id)           /* ÈÎÎñ²»´æÔÚ           */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    /* ·ÖÅäÏûÏ¢¿Õ¼ä */

+    pMsg = (T_ZOss_TaskMsgHead *)zOss_GetUB(SCHE_M_TASKMSGEX_LEN + SCHE_M_TASKMSGHEAD_LEN);

+    if (NULL == pMsg)

+    {

+        return ZOSS_ERROR;

+    }

+    pBuf = (T_ZOss_TaskMsg *)(pMsg + 1);

+    

+    /* дÏûϢͷ */

+    pMsg->t_task_id     = task_id;

+    pMsg->s_task_id     = zOss_GetSelfTaskID();

+    pMsg->send_state    = ZOSS_MSGSENDTYPE_DATA;

+    pMsg->msgID         = msg_id;

+    pMsg->msgLen        = SCHE_M_TASKMSGEX_LEN;

+    pBuf->msgbuf        = buf;

+    pBuf->msgLenEX      = msg_len;

+    

+    /* ·¢ËÍÏûÏ¢ */

+    nRet = zOss_TaskSendDataEx(pMsg);

+    

+    return nRet;

+}

+CODE_END

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_TaskSendDataEx

+* ¹¦ÄÜÃèÊö£º¸øÆäËûÈÎÎñ´«µÝÏûÏ¢Ìå

+* ²ÎÊý˵Ã÷£º(IN)

+            buf:ÏûÏ¢¶ÑÕ»

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º±¾½Ó¿Ú×èÈû£¬²»ÄÜÔÚÖжÏÖÐʹÓÃ

+**************************************************************************/

+__tcm_func UINT32 zOss_TaskSendDataEx(T_ZOss_TaskMsgHead *buf)

+{

+    UINT32          nRet        = ZOSS_ERROR;

+    T_ZOss_TCB      *pTCB       = NULL;

+    T_ZOss_TRF      *pTRF       = NULL;

+    ZOSS_THREAD_ID  threadId    = NULL;

+#if ZOSS_CAPT_MSG

+    UINT32          i           = 0;

+    T_ZOss_TCB      *pSTCB      = NULL;

+    T_ZOss_SDLTCB   *pSSTCB     = NULL;

+    UINT8           fleg[3]     = {0};

+#endif

+

+    zOss_AssertEx(buf != NULL, ZOSS_ERROR);

+

+    if (gSche_IsTaskInit == FALSE || buf->t_task_id == NULL 

+        || buf->send_state > ZOSS_MSGSENDTYPE_TIMER || buf->send_state < ZOSS_MSGSENDTYPE_MSG)

+    {

+        zOss_RetUB(buf);

+        return ZOSS_ERROR;

+    }

+    

+    if (buf->send_state == ZOSS_MSGSENDTYPE_DATA && gSche_Task_Hook.send_data_to != NULL)

+    {

+        nRet = gSche_Task_Hook.send_data_to(buf->msgID, ((T_ZOss_TaskMsg *)(buf + 1))->msgbuf,

+                ((T_ZOss_TaskMsg *)(buf + 1))->msgLenEX, buf->t_task_id, buf->s_task_id);

+    }

+    else if (buf->send_state == ZOSS_MSGSENDTYPE_MSG && gSche_Task_Hook.send_to != NULL)

+    {

+        nRet = gSche_Task_Hook.send_to(buf->msgID, buf + 1, buf->msgLen, buf->t_task_id, buf->s_task_id);

+    }

+    if (nRet == ZOSS_SUCCESS)

+    {

+        zOss_RetUB(buf);

+        return ZOSS_SUCCESS;

+    }

+    

+    /* ¶¨Î»Ä¿±êÈÎÎñ */

+    pTCB = (T_ZOss_TCB *)buf->t_task_id;        /* »ñȡĿ±êÈÎÎñTCB±í            */

+    if (buf->t_task_id == pTCB->task_id)        /* ÈÎÎñ´æÔÚ                     */

+    {

+        threadId = pTCB->thread_id;             /* »ñȡĿ±êÈÎÎñËùÔÚµ÷¶ÈÏß³ÌID   */

+    }

+    else

+    {

+        zOss_RetUB(buf);

+        return ZOSS_ERROR;

+    }

+    

+#if ZOSS_CAPT_MSG

+    /* ·¢ËÍÏûÏ¢²¶»ñ */

+    if (buf->s_task_id != NULL)                 /* Ô´²»ÎªÏß³Ì   */

+    {

+        pSTCB = (T_ZOss_TCB *)buf->s_task_id;

+        if (pSTCB->type == SCHE_OSS_TASK)       /*ԴΪ·ÇSDLÈÎÎñ */

+        {

+            for (i = 0; i < 3; i++)

+            {

+                if (pSTCB->dire[i] == ZOSS_MSGDIRE_OUT || pSTCB->dire[i] == ZOSS_MSGDIRE_INOUT)

+                {

+                    fleg[i] = 1;

+                    nRet = pSTCB->HookEntry[i](buf, ZOSS_MSGDIRE_OUT);

+                }

+            }

+        }

+        else if (pSTCB->type == SCHE_SDL_TASK)  /* ԴΪSDL ÈÎÎñ */

+        {

+            pSSTCB = (T_ZOss_SDLTCB *)buf->s_task_id;

+            for (i = 0; i < 3; i++)

+            {

+                if (pSSTCB->dire[i] == ZOSS_MSGDIRE_OUT || pSSTCB->dire[i] == ZOSS_MSGDIRE_INOUT)

+                {

+                    fleg[i] = 1;

+                    nRet = pSSTCB->HookEntry[i](buf, ZOSS_MSGDIRE_OUT);

+                }

+            }

+        }

+        if (fleg[2] == 1)

+        {

+            zOss_RetUB((UINT8 *)buf);

+            return ZOSS_SUCCESS;

+        }

+    }

+    

+    /* ½ÓÊÕÏûÏ¢²¶»ñ */

+    for (i = 0; i < 3; i++)

+    {

+        if (fleg[i] == 0 && (pTCB->dire[i] == ZOSS_MSGDIRE_IN || pTCB->dire[i] == ZOSS_MSGDIRE_INOUT))

+        {

+            fleg[i] = 1;

+            nRet = pTCB->HookEntry[i](buf, ZOSS_MSGDIRE_IN);

+        }

+    }

+    if (fleg[2] == 1)

+    {

+        zOss_RetUB((UINT8 *)buf);

+        return ZOSS_SUCCESS;

+    }

+    

+#endif

+    /* ÌØÊâÏûÏ¢ */

+    if (buf->msgID == EV_TASK_CRE || buf->msgID == EV_TASK_END || buf->msgID == EV_INIT || buf->msgID == EV_POWERON)

+    {

+        nRet = zOss_SendMsg(threadId, (UINT8 *)buf, buf->msgLen + SCHE_M_TASKMSGHEAD_LEN, ZOSS_WAIT_FOREVER);

+        if (nRet == ZOSS_ERROR)

+        {

+            zOss_RetUB((UINT8 *)buf);

+        }

+        return nRet;

+    }

+    

+    /* Ïß³ÌÏòÈÎÎñ·¢ÏûÏ¢ */

+    if (buf->s_task_id == NULL)

+    {

+        nRet = zOss_SendMsg(threadId, (UINT8 *)buf, buf->msgLen + SCHE_M_TASKMSGHEAD_LEN, ZOSS_WAIT_FOREVER);

+        if (nRet == ZOSS_ERROR)

+        {

+            zOss_RetUB((UINT8 *)buf);

+        }

+        return nRet;

+    }

+    

+    /* ÆÕͨÏûÏ¢ */

+    if (threadId == zOss_GetCurThreadID())

+    {

+        /* ÔÚͬһµ÷¶ÈÏß³ÌÖÐ */

+        zOss_ListAdd(&pTCB->msg_queue, &(buf->node));

+        if (pTCB->run_status == ZOSS_STATE_IDLE)

+        {

+            pTRF = &gSche_ThreadItemTab[pTCB->thread_no - 1];

+            zOss_ListDelete(&(pTRF->TCBIdle), &(pTCB->node));

+            zOss_ListAdd(&(pTRF->TCBReady), &(pTCB->node));

+            pTCB->run_status = ZOSS_STATE_READY;

+        }

+        return ZOSS_SUCCESS;

+    }

+    else

+    {

+        /* ²»ÔÚͬһµ÷¶ÈÏß³ÌÖÐ */

+        nRet = zOss_SendMsg(threadId, (UINT8 *)buf, buf->msgLen + SCHE_M_TASKMSGHEAD_LEN, ZOSS_WAIT_FOREVER);

+        if (nRet == ZOSS_ERROR)

+        {

+            zOss_RetUB((UINT8 *)buf);

+        }

+        return nRet;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_TaskSend

+* ¹¦ÄÜÃèÊö£º¸øÆäËûÈÎÎñ·¢ËÍÒì²½ÏûÏ¢,²âÊÔרÓÃ

+* ²ÎÊý˵Ã÷£º(IN)

+            msg_id:ÏûÏ¢ID

+            buf:ÏûÏ¢ÄÚÈÝ

+            msg_len:ÏûÏ¢³¤¶È

+            s_task_id:Ô´ÈÎÎñID

+            t_task_id:Ä¿±êÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º±¾½Ó¿Ú×èÈû£¬²»ÄÜÔÚÖжÏÖÐʹÓà 

+**************************************************************************/

+__tcm_func UINT32 Sche_TaskSend(UINT32 msg_id, VOID *buf, UINT16 msg_len, ZOSS_TASK_ID s_task_id, ZOSS_TASK_ID t_task_id)

+{

+    UINT32              nRet = ZOSS_ERROR;

+    T_ZOss_TaskMsgHead *pMsg = NULL;

+

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    /* ·ÖÅäÏûÏ¢¿Õ¼ä */

+    pMsg = (T_ZOss_TaskMsgHead *)zOss_GetUB(msg_len + SCHE_M_TASKMSGHEAD_LEN);

+    zOss_AssertEx(NULL != pMsg, ZOSS_ERROR);

+    

+    /* дÏûϢͷ */

+    pMsg->send_state    = ZOSS_MSGSENDTYPE_MSG;

+    pMsg->msgID         = msg_id;

+    pMsg->msgLen        = msg_len;

+    pMsg->s_task_id     = s_task_id;

+    pMsg->t_task_id     = t_task_id;

+    

+    if (msg_len > 0 && buf != NULL)

+    {

+        zOss_Memcpy((UINT8 *)(pMsg + 1), (UINT8 *)buf, msg_len);

+    }

+    

+    /* ·¢ËÍÏûÏ¢ */

+    nRet = zOss_TaskSendDataEx(pMsg);

+    return nRet;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_TaskSendData

+* ¹¦ÄÜÃèÊö£º¸øÆäËûÈÎÎñ·¢ËÍÒì²½ÏûÏ¢,²âÊÔרÓÃ

+* ²ÎÊý˵Ã÷£º(IN)

+            msg_id:ÏûÏ¢ID

+            buf:ÏûÏ¢ÄÚÈÝ

+            msg_len:ÏûÏ¢³¤¶È

+            s_task_id:Ô´ÈÎÎñID

+            t_task_id:Ä¿±êÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º±¾½Ó¿Ú×èÈû£¬²»ÄÜÔÚÖжÏÖÐʹÓà 

+**************************************************************************/

+__tcm_func UINT32 Sche_TaskSendData(UINT32 msg_id, VOID *buf, UINT16 msg_len, ZOSS_TASK_ID s_task_id, ZOSS_TASK_ID t_task_id)

+{

+    UINT32              nRet    = ZOSS_ERROR;

+    T_ZOss_TaskMsgHead  *pMsg   = NULL;

+    T_ZOss_TaskMsg      *pBuf   = NULL;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    /* ·ÖÅäÏûÏ¢¿Õ¼ä */

+    pMsg = (T_ZOss_TaskMsgHead *)zOss_GetUB(SCHE_M_TASKMSGEX_LEN + SCHE_M_TASKMSGHEAD_LEN);

+

+    zOss_AssertEx(NULL != pMsg, ZOSS_ERROR);

+

+    pBuf = (T_ZOss_TaskMsg *)(pMsg + 1);

+    

+    /* дÏûϢͷ */

+    pMsg->send_state    = ZOSS_MSGSENDTYPE_DATA;

+    pMsg->msgID         = msg_id;

+    pMsg->msgLen        = SCHE_M_TASKMSGEX_LEN;

+    pMsg->s_task_id     = s_task_id;

+    pMsg->t_task_id     = t_task_id;

+    

+    pBuf->msgbuf = buf;

+    pBuf->msgLenEX = msg_len;

+    

+    /* ·¢ËÍÏûÏ¢ */

+    nRet = zOss_TaskSendDataEx(pMsg);

+    return nRet;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_InterruptTaskSend

+* ¹¦ÄÜÃèÊö£ºÔÚÖжÏÖиøÈÎÎñ·¢ËÍÒì²½ÏûÏ¢

+* ²ÎÊý˵Ã÷£º(IN)

+            msg:ÏûÏ¢ID

+            msg_buf:ÏûÏ¢¶ÑÕ»,ÔÚ·¢ËÍʱ²»¿½±´,ÓÉÄ¿±êÈÎÎñÔÚ´¦ÀíÍêÏûÏ¢ºóÊÍ·Å

+            msg_len:ÏûÏ¢³¤¶È

+            task_id:Ä¿±êÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£ºÈç¹û³É¹¦£¬·µ»ØZOSS_SUCCESS£¬·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º±¾½Ó¿ÚÔÚÖжÏÖÐʹÓÃ

+**************************************************************************/

+UINT32 Sche_InterruptTaskSend(UINT32 msg_id, T_ZOss_TaskMsgHead *pMsg, UINT16 msg_len, ZOSS_TASK_ID task_id)

+{

+    UINT32          nRet        = ZOSS_ERROR;

+    T_ZOss_TCB      *pTCB       = NULL;

+    ZOSS_THREAD_ID  threadId    = NULL;

+    

+    zOss_AssertEx(NULL != task_id && NULL != pMsg, ZOSS_ERROR);

+    

+    /* ¶¨Î»Ä¿±êÈÎÎñ */

+    pTCB = (T_ZOss_TCB *)task_id;            /* »ñȡĿ±êÈÎÎñTCB±í */

+    if (task_id == pTCB->task_id)

+    {

+        threadId = pTCB->thread_id;          /* »ñȡĿ±êÈÎÎñËùÔÚµ÷¶ÈÏß³ÌID */

+    }

+    else

+    {

+        return ZOSS_ERROR;

+    }

+    

+    /* Ìî³äÏûϢͷºÍÏûÏ¢Ìå */

+    pMsg->t_task_id     = task_id;

+    pMsg->s_task_id     = (ZOSS_TASK_ID)zOss_GetCurThreadID();

+    pMsg->send_state    = ZOSS_MSGSENDTYPE_INTER;

+    pMsg->msgID         = msg_id;

+    pMsg->msgLen        = msg_len;

+    

+    /* ·¢ËÍÏûÏ¢ */

+    nRet = zOss_SendMsg(threadId, (UINT8 *)pMsg, msg_len, ZOSS_NO_WAIT);

+    return nRet;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_getBufPoint

+* ¹¦ÄÜÃèÊö£º¸ù¾ÝÍ·Ö¸Õë»ñÈ¡bufÖ¸Õë

+* ²ÎÊý˵Ã÷£º(IN)

+            phead:Í·Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º·µ»Ø VOID ÀàÐ͵ÄÖ¸Õ룬ָÏòÏûÏ¢ÄÚÈÝ£»Ê§°Ü£¬Ôò·µ»Ø ZOSS_NULL

+* ÆäËü˵Ã÷£ºÖ÷ÒªÓÃÓÚÏûϢͨѶ

+**************************************************************************/

+VOID *Sche_getBufPoint(T_ZOss_TaskMsgHead *phead)

+{

+    T_ZOss_TaskMsg *pBuf = NULL;

+    

+    zOss_AssertEx(phead != NULL, NULL);

+    

+    if (phead->send_state == ZOSS_MSGSENDTYPE_MSG)

+    {

+        return ((CHAR *)phead + SCHE_M_TASKMSGHEAD_LEN);

+    }

+    else if (phead->send_state == ZOSS_MSGSENDTYPE_DATA)

+    {

+        pBuf = (T_ZOss_TaskMsg *)((CHAR *)phead + SCHE_M_TASKMSGHEAD_LEN);

+        return (pBuf->msgbuf);

+    }

+    else

+    {

+        return NULL;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_getBufLength

+* ¹¦ÄÜÃèÊö£º¸ù¾ÝÍ·Ö¸Õë»ñÈ¡buf³¤¶È

+* ²ÎÊý˵Ã÷£º(IN)

+            phead:Í·Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º·µ»Ø buf³¤¶È

+* ÆäËü˵Ã÷£ºÖ÷ÒªÓÃÓÚÏûϢͨѶ

+**************************************************************************/

+UINT32 Sche_getBufLength(T_ZOss_TaskMsgHead *phead)

+{

+    T_ZOss_TaskMsg *pBuf = NULL;

+    

+    zOss_AssertEx(phead != NULL, 0);

+    

+    if (phead->send_state == ZOSS_MSGSENDTYPE_MSG)

+    {

+        return (phead->msgLen);

+    }

+    else if (phead->send_state == ZOSS_MSGSENDTYPE_DATA)

+    {

+        pBuf = (T_ZOss_TaskMsg *)((CHAR *)phead + SCHE_M_TASKMSGHEAD_LEN);

+        return (pBuf->msgLenEX);

+    }

+    else

+    {

+        return 0;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_SetState

+* ¹¦ÄÜÃèÊö£ºÉ趨ÈÎÎñ״̬

+* ²ÎÊý˵Ã÷£º(IN)

+            next_state:ÈÎÎñ״̬

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_SetState(UINT8 next_state)

+{

+    T_ZOss_TCB      *pTCB   = NULL;

+    ZOSS_TASK_ID    taskId  = NULL;

+    UINT32          nore    = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    taskId = zOss_GetSelfTaskID();          /* »ñÈ¡µ±Ç°ÈÎÎñID   */

+    if (ZOSS_INVALID_TASK_ID == taskId)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    pTCB = (T_ZOss_TCB *)taskId;            /* »ñÈ¡ÈÎÎñTCB±í    */

+    if (pTCB->type != SCHE_OSS_TASK)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    /* ÐźÅÁ¿±£»¤ */

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        if (taskId != pTCB->task_id)        /* ÈÎÎñ²»´æÔÚ       */

+        {

+            zOss_PutMutex(gSche_TCBMutex);

+            return ZOSS_ERROR;

+        }

+        

+        pTCB->state = next_state;           /* ÉèÖÃ״̬         */

+        nore = zOss_PutMutex(gSche_TCBMutex);

+        if (nore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+        return ZOSS_SUCCESS;

+    }

+    return ZOSS_ERROR;

+}

+

+#if ZOSS_CAPT_MSG

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_RegTaskSendHook

+* ¹¦ÄÜÃèÊö£ºÉ趨ÈÎÎñÏûÏ¢·¢Ëͻص÷º¯Êý

+* ²ÎÊý˵Ã÷£º(IN)

+            task_id:ÈÎÎñID£¬Îª0Ϊµ±Ç°ÈÎÎñ

+            intercept_Entry:»Øµ÷º¯ÊýÖ¸Õë

+            hooktype:»Øµ÷º¯ÊýÖÖÀà

+            dire:   ZOSS_SETHOOKFLAG_MONI  :ÏûÏ¢¼à¿Ø

+                    ZOSS_SETHOOKFLAG_TRACK : ÏßÐÔ¸ú×Ù

+                    ZOSS_SETHOOKFLAG_INTER : ÏûÏ¢½Ø»ñ

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£ºÉèÖÃSDLÈÎÎñʱ£¬Èë²Îtask_id²»ÄÜΪ0

+**************************************************************************/

+UINT32 zOss_RegTaskSendHook(ZOSS_TASK_ID task_id, UINT8 hooktype, UINT8 dire, TASK_SEND_HOOK intercept_Entry)

+{

+    T_ZOss_TCB      *pTCB       = NULL;

+    T_ZOss_SDLTCB   *pSDLTCB    = NULL;

+    UINT32          nore        = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    if (hooktype < 1 || hooktype > 3)

+    {

+        return ZOSS_ERROR;

+    }

+    

+    if (intercept_Entry != NULL && (dire < 1 || dire > 3))

+    {

+        return ZOSS_ERROR;

+    }

+    

+    if (intercept_Entry == NULL)

+    {

+        dire = 0;

+    }

+    

+    if (NULL == task_id)                    /* Èç¹ûÈÎÎñIDΪ¿ÕÔòÉ趨µ±Ç°ÈÎÎñ */

+    {

+        task_id = zOss_GetSelfTaskID();

+        if (ZOSS_INVALID_TASK_ID == task_id)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    pTCB = (T_ZOss_TCB *)task_id;           /* »ñÈ¡ÈÎÎñTCB±í    */

+    

+    if (pTCB->type == SCHE_OSS_TASK)        /* ÉèÖ÷ÇSDLÈÎÎñ    */

+    {

+        /* ÐźÅÁ¿±£»¤ */

+        if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+        {

+            if (task_id != pTCB->task_id)   /* ÈÎÎñ²»´æÔÚ       */

+            {

+                zOss_PutMutex(gSche_TCBMutex);

+

+                return ZOSS_ERROR;

+            }

+            pTCB->HookEntry[hooktype - 1] = intercept_Entry;

+            pTCB->dire[hooktype - 1] = dire;

+            nore = zOss_PutMutex(gSche_TCBMutex);

+            if (nore == ZOSS_ERROR)

+            {

+                return ZOSS_ERROR;

+            }

+            return ZOSS_SUCCESS;

+        }

+    }

+    else if (pTCB->type == SCHE_SDL_TASK)   /* ÉèÖÃSDLÈÎÎñ */

+    {

+        pSDLTCB = (T_ZOss_SDLTCB *)task_id;

+        pSDLTCB->HookEntry[hooktype - 1] = intercept_Entry;

+        pSDLTCB->dire[hooktype - 1] = dire;

+        return ZOSS_SUCCESS;

+    }

+    return ZOSS_ERROR;

+}

+#endif

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetSelfTaskID

+* ¹¦ÄÜÃèÊö£º»ñÈ¡µ±Ç°ÈÎÎñID

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º·µ»ØÈÎÎñID

+* ÆäËû˵Ã÷£º²»Ö§³ÖSDLÈÎÎñ

+**************************************************************************/

+__tcm_func ZOSS_TASK_ID zOss_GetSelfTaskID(VOID)

+{

+    ZOSS_THREAD_ID  threadId    = NULL;

+    T_ZOss_TCB      *pTCB       = NULL;

+    T_ZOss_TRF      *pTRF       = NULL;

+    

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    threadId = zOss_GetCurThreadID();       /* »ñÈ¡µ±Ç°Ïß³ÌID   */

+    if (threadId == NULL)

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    pTRF = (T_ZOss_TRF *)Sche_GetTaskID(threadId);

+    if (pTRF == NULL)

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    if (pTRF->thread_id == threadId)

+    {

+        pTCB = (T_ZOss_TCB *)zOss_ListFirst(&(pTRF->TCBReady));

+        

+        if (NULL != pTCB)

+        {

+            return (ZOSS_TASK_ID)pTCB;  /* ·ÀÖ¹ÈÎÎñËûɱʱ»ñ²»µ½ÈÎÎñid */

+        }

+    }

+    return ZOSS_INVALID_TASK_ID;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetTaskID

+* ¹¦ÄÜÃèÊö£ºÍ¨¹ýÈÎÎñÃû»ñÈ¡ÈÎÎñID

+* ²ÎÊý˵Ã÷£º(IN)

+            task_name:ÈÎÎñÃû

+            (OUT)

+* ·µ »Ø Öµ£º·µ»ØÈÎÎñID

+* ÆäËû˵Ã÷£º¿ÉÒÔ»ñÈ¡SDLÈÎÎñID

+**************************************************************************/

+__tcm_func ZOSS_TASK_ID zOss_GetTaskID(const CHAR *task_name)

+{

+    T_ZOss_TCB  *pCurTCB    = NULL;

+    UINT32      nore        = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)            /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    zOss_AssertEx(NULL != task_name, ZOSS_INVALID_TASK_ID);

+    

+    /* ÐźÅÁ¿±£»¤ */

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        pCurTCB = gSche_TCBHeadPtr;

+        while (NULL != pCurTCB)

+        {

+            if (0 == strcmp((char*)task_name, (char *)pCurTCB->task_name) && pCurTCB == (T_ZOss_TCB *)pCurTCB->task_id)

+            {

+                zOss_PutMutex(gSche_TCBMutex);

+                return (ZOSS_TASK_ID)pCurTCB;

+            }

+            pCurTCB = pCurTCB->next;

+        }

+        nore = zOss_PutMutex(gSche_TCBMutex);

+        if (nore == ZOSS_ERROR)

+        {

+            return ZOSS_INVALID_TASK_ID;

+        }

+    }

+    

+    if (gSche_Task_Hook.get_id != NULL)

+    {

+        return gSche_Task_Hook.get_id(task_name);

+    }

+    

+    return ZOSS_INVALID_TASK_ID;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_GetTaskName

+* ¹¦ÄÜÃèÊö£ºÍ¨¹ýÈÎÎñID»ñÈ¡ÈÎÎñÃû

+* ²ÎÊý˵Ã÷£º(IN)

+            task_id:ÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£º·µ»ØÈÎÎñÃû

+* ÆäËû˵Ã÷£º

+**************************************************************************/

+__tcm_func CHAR *zOss_GetTaskName(ZOSS_TASK_ID task_id)

+{

+    T_ZOss_TCB  *pCurTCB    = NULL;

+    CHAR        *task_name  = NULL;

+

+    if (gSche_IsTaskInit == FALSE)            /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return NULL;

+    }

+

+    zOss_AssertEx(NULL != task_id, NULL);

+ 

+    if (gSche_Task_Hook.get_name != NULL)

+    {

+        task_name = gSche_Task_Hook.get_name(task_id);

+        if (task_name != NULL)

+        {

+            return task_name;

+        }

+    }

+

+    pCurTCB = (T_ZOss_TCB *)task_id;

+

+    if (pCurTCB == (T_ZOss_TCB *)pCurTCB->task_id)

+    {

+        return pCurTCB->task_name;

+    }

+

+    return NULL;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_Sender

+* ¹¦ÄÜÃèÊö£º»ñÈ¡ÏûÏ¢Ô´ÈÎÎñID

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£ºÏûÏ¢Ô´ÈÎÎñID

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+__tcm_func ZOSS_TASK_ID zOss_Sender(VOID)

+{

+    T_ZOss_TCB *pTCB = NULL;

+    

+    pTCB = (T_ZOss_TCB *)zOss_GetSelfTaskID();      /* »ñÈ¡µ±Ç°ÈÎÎñTCB±í */

+    if (pTCB == NULL)

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    if (pTCB->type != SCHE_OSS_TASK)

+    {

+        return ZOSS_INVALID_TASK_ID;

+    }

+    

+    return pTCB->sender_task_id;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_DeadLoop

+* ¹¦ÄÜÃèÊö£ºËÀÑ­»·¼ì²â

+* ²ÎÊý˵Ã÷£º(IN)

+            task_id_arr:´æ·ÅËÀÑ­»·ÈÎÎñIDµÄ¿Õ¼ä

+            (OUT)

+* ·µ »Ø Öµ£ºËÀÑ­»·ÈÎÎñÊýºÍID

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 Sche_DeadLoop(ZOSS_TASK_ID *task_id_arr)

+{

+    T_ZOss_TCB  *pCurTCB            = NULL;

+    UINT32      Curtask_time        = 0;

+    UINT32      i                   = 0;

+    UINT32      deadloop_task_num   = 0;

+    UINT32      nore                = ZOSS_ERROR;

+    

+    if (gSche_IsTaskInit == FALSE)                  /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_ERROR;

+    }

+    

+    zOss_AssertEx(NULL != task_id_arr, ZOSS_ERROR);

+    

+    /* ÐźÅÁ¿±£»¤ */

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        Curtask_time    = Osa_HwTimeRead();

+        pCurTCB         = gSche_TCBHeadPtr;

+        while (NULL != pCurTCB)

+        {

+            if (pCurTCB->run_status == ZOSS_STATE_STOPPED || pCurTCB->task_time == 0)

+            {

+                pCurTCB = pCurTCB->next;

+                continue;

+            }

+            

+            /* »ñÈ¡ÈÎÎñÖ´ÐÐʱ¼ä */

+            i = Curtask_time - pCurTCB->task_time;

+            

+            /* ÅжÏÊÇ·ñ³¬Ê± */

+            if (i >= gSche_DeadLoop_Time * 1000 * 1000)

+            {

+                *task_id_arr = pCurTCB->task_id;

+                task_id_arr++;

+                deadloop_task_num++;

+            }

+            pCurTCB = pCurTCB->next;

+        }

+        nore = zOss_PutMutex(gSche_TCBMutex);

+        if (nore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+    }

+    

+    return deadloop_task_num;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºzOss_TaskInit

+* ¹¦ÄÜÃèÊö£º´´½¨¾²Ì¬ÈÎÎñ

+* ²ÎÊý˵Ã÷£º(IN)

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_TaskInit(VOID)

+{

+    ZOSS_TASK_ID        task_id                 = NULL;

+    UINT32              task_index              = 0;

+    UINT32              i                       = 0;

+    T_OSS_PARAM         *pPlatCfg               = NULL;

+    T_ZOss_TaskTabItem  *TaskTab                = NULL;

+    UINT32              uiSche_Max_TaskTab_Num  = 0;

+    

+    pPlatCfg = zOss_GetOssCfg();

+    TaskTab = pPlatCfg->SysmCfg.pSysm_TaskItemTab;

+    uiSche_Max_TaskTab_Num = pPlatCfg->SysmCfg.task_num;

+    gSche_SaticTaskInitSema = zOss_CreateSemaphore("static_task", 0);

+#ifdef _USE_HAL_HRDTST

+    if (zDrvComm_GetPowerOnState() == POWER_ON_HDT_TEST)

+    {

+        for ( ; task_index < uiSche_Max_TaskTab_Num; task_index++)

+        {

+            if ((1 == TaskTab->is_use) && (TRUE == TaskTab->hardTestFlag))

+            {

+                task_id = zOss_CreateTask_EX(TaskTab->task_name, TaskTab->task_entry,

+                                             TaskTab->stack_size, TaskTab->priority, 

+                                             TaskTab->private_data_len, TaskTab->process_no, 1);

+                

+                if (task_id == ZOSS_INVALID_TASK_ID)

+                {

+                    return ZOSS_ERROR;

+                }

+                else

+                {

+                    gSysm_TaskIDTab[task_index] = task_id;     /* µÇ¼ÇÈÎÎñID */

+                    gTask_TaskNum++;

+                }

+            }

+            TaskTab++;

+        }

+    }

+    else

+    {

+#endif

+#ifdef _USE_SDL

+        tasksdl_table  = (tasksdl_desc *)zOss_Malloc((nof_signalcode * sizeof(tasksdl_desc)));

+        if (tasksdl_table == NULL)

+        {

+            return ZOSS_ERROR;

+        }

+        memset(tasksdl_table, 0, (nof_signalcode * sizeof(tasksdl_desc)));

+#endif

+        for ( ; task_index < uiSche_Max_TaskTab_Num; task_index++)

+        {

+#ifdef _USE_HAL_HRDTST

+            if ((1 == TaskTab->is_use) && ( FALSE == TaskTab->hardTestFlag))

+#else

+            if (1 == TaskTab->is_use)

+#endif

+            {

+                task_id = zOss_CreateTask_EX(TaskTab->task_name, TaskTab->task_entry,

+                                             TaskTab->stack_size, TaskTab->priority, 

+                                             TaskTab->private_data_len, TaskTab->process_no, 1);

+                        

+                if (task_id == ZOSS_INVALID_TASK_ID)

+                {

+                    return ZOSS_ERROR;

+                }

+                else

+                {

+                    gSysm_TaskIDTab[task_index] = task_id;     /* µÇ¼ÇÈÎÎñID */

+                    gTask_TaskNum++; 

+                }

+            }

+#ifdef _USE_SDL

+            for (i = 0; i < nof_signalcode; i++)

+            {

+                if (strcmp((const char *)TaskTab->task_name, (const char *)signalcode_table[i].task_name) == 0)

+                {

+                    tasksdl_table[i].selfid     = signalcode_table[i].selfid;

+                    tasksdl_table[i].task_id    = task_id;

+                    break;

+                }

+            }

+#endif

+            TaskTab++;

+        }

+#ifdef _USE_HAL_HRDTST

+    }

+#endif

+

+    return ZOSS_SUCCESS;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetTaskTimer

+* ¹¦ÄÜÃèÊö: ÉèÖÃÖÜÆÚÐÔ/·ÇÖÜÆÚÐÔÈÎÎñ¶¨Ê±Æ÷ÏòÄ¿±êÈÎÎñ·¢ËÍÏûÏ¢;

+            ÉèÖÃʱ¿ÌΪ²Î¿¼µã,¾­¹ýÖ¸¶¨Ê±¼äºó, ÏòÉèÖö¨Ê±Æ÷µÄÈÎÎñ·¢ËÍÖ¸¶¨ÏûÏ¢²¢×Ô¶¯ÊͷŶ¨Ê±Æ÷ËùÕ¼×ÊÔ´(·ÇÖÜÆÚÐÔ).

+* ²ÎÊý˵Ã÷: (IN)

+            time_len:ʱ³¤, µ¥Î»ms

+            msg_id:¶¨Ê±µ½ºó,·¢Ë͸øÉèÖö¨Ê±Æ÷ÈÎÎñµÄÏûÏ¢ºÅ

+            arg:¸½¼Ó²ÎÊý,¶¨´«µÝ¸øÈÎÎñÈë¿Úº¯ÊýµÄbufÐβδËʱmsg_lenֵΪ4(sizeof(UINT32/arg))

+            desk_task:Ö¸¶¨Ä¿±êÈÎÎñ£¬Èç¹ûÄ¿±êÈÎÎñΪ¿Õʱ£¬½«·¢ËÍÉèÖö¨Ê±Æ÷µÄÈÎÎñ

+            bPeriod:ÊÇ·ñÖÜÆÚÐÔ

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦:ÏàÓ¦µÄ¶¨Ê±Æ÷ID; ʧ°Ü:ZOSS_INVALID_TIMER_ID

+* ÆäËü˵Ã÷: 

+**************************************************************************/

+ZOSS_TIMER_ID zOss_SetTaskTimer(UINT32 time_len, UINT32 msg_id, UINT32 arg, ZOSS_TASK_ID desk_task_id, BOOL bPeriod)

+{

+    T_TIMER_NODE    *pTimerNode = NULL;

+    T_Task_Arg      *ptTaskArg  = NULL;

+    UINT32          status      = 0;

+

+    if (gSche_IsTaskInit == FALSE)          /* ¼ì²éÊÇ·ñÒѳõʼ»¯ */

+    {

+        return ZOSS_INVALID_TIMER_ID;

+    }

+

+    if(desk_task_id == NULL)

+    {

+        desk_task_id = zOss_GetSelfTaskID();

+        zOss_AssertEx(NULL != desk_task_id, ZOSS_INVALID_TIMER_ID);

+    }

+    

+    ptTaskArg = (T_Task_Arg *)zOss_Malloc(sizeof(T_Task_Arg));

+    if (NULL == ptTaskArg)

+    {

+        return ZOSS_INVALID_TIMER_ID;

+    }

+    

+    ptTaskArg->task_id  = desk_task_id;

+    ptTaskArg->msg_id   = msg_id;

+    ptTaskArg->arg      = arg;

+

+    pTimerNode = (T_TIMER_NODE *)zOss_CreateTimer("TaskTimer", (ZOSS_TIMER_FUN)TaskTimer_CallBack, (SINT32)ptTaskArg, bPeriod);

+    

+    if (ZOSS_INVALID_TIMER_ID == pTimerNode)

+    {

+        zOss_Free(ptTaskArg);

+    }

+    else

+    {

+        ptTaskArg->pTimerNode = pTimerNode;

+        pTimerNode->attached = (VOID *)ptTaskArg;

+        status = zOss_StartTimer(pTimerNode, time_len, NULL, 0);

+        

+        if (status == ZOSS_ERROR)

+        {

+            zOss_KillTimer(pTimerNode);

+            zOss_Free(ptTaskArg);

+            pTimerNode = ZOSS_INVALID_TIMER_ID;

+        }

+    }

+    return (ZOSS_TIMER_ID)pTimerNode;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetRelativeTimer

+* ¹¦ÄÜÃèÊö: ÉèÖ÷ÇÖÜÆÚÐÔÈÎÎñ¶¨Ê±Æ÷;

+            ÉèÖÃʱ¿ÌΪ²Î¿¼µã,¾­¹ýÖ¸¶¨Ê±¼äºó, ÏòÉèÖö¨Ê±Æ÷µÄÈÎÎñ·¢ËÍÖ¸¶¨ÏûÏ¢²¢×Ô¶¯ÊͷŶ¨Ê±Æ÷ËùÕ¼×ÊÔ´.

+* ²ÎÊý˵Ã÷: (IN)

+            time_len:ʱ³¤, µ¥Î»ms

+            msg_id:¶¨Ê±µ½ºó,·¢Ë͸øÉèÖö¨Ê±Æ÷ÈÎÎñµÄÏûÏ¢ºÅ

+            arg:¸½¼Ó²ÎÊý,¶¨´«µÝ¸øÈÎÎñÈë¿Úº¯ÊýµÄbufÐβδËʱmsg_lenֵΪ4(sizeof(UINT32/arg))

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦:ÏàÓ¦µÄ¶¨Ê±Æ÷ID; ʧ°Ü:ZOSS_INVALID_TIMER_ID

+* ÆäËü˵Ã÷: ±ØÐèÔÚÈÎÎñÄÚµ÷ÓÃ

+**************************************************************************/

+ZOSS_TIMER_ID zOss_SetRelativeTimer(UINT32 time_len, UINT32 msg_id, UINT32 arg)

+{

+    return zOss_SetTaskTimer(time_len, msg_id, arg, NULL, FALSE);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetRelativeTimerByTaskId

+* ¹¦ÄÜÃèÊö: ÉèÖ÷ÇÖÜÆÚÐÔÈÎÎñ¶¨Ê±Æ÷ÏòÄ¿±êÈÎÎñ·¢ËÍÏûÏ¢;

+            ÉèÖÃʱ¿ÌΪ²Î¿¼µã,¾­¹ýÖ¸¶¨Ê±¼äºó, ÏòÉèÖö¨Ê±Æ÷µÄÈÎÎñ·¢ËÍÖ¸¶¨ÏûÏ¢²¢×Ô¶¯ÊͷŶ¨Ê±Æ÷ËùÕ¼×ÊÔ´.

+* ²ÎÊý˵Ã÷: (IN)

+            time_len:ʱ³¤, µ¥Î»ms

+            msg_id:¶¨Ê±µ½ºó,·¢Ë͸øÉèÖö¨Ê±Æ÷ÈÎÎñµÄÏûÏ¢ºÅ

+            arg:¸½¼Ó²ÎÊý,¶¨´«µÝ¸øÈÎÎñÈë¿Úº¯ÊýµÄbufÐβδËʱmsg_lenֵΪ4(sizeof(UINT32/arg))

+            desk_task:Ö¸¶¨Ä¿±êÈÎÎñ£¬Èç¹ûÄ¿±êÈÎÎñΪ¿Õʱ£¬½«·¢ËÍÉèÖö¨Ê±Æ÷µÄÈÎÎñ

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦:ÏàÓ¦µÄ¶¨Ê±Æ÷ID; ʧ°Ü:ZOSS_INVALID_TIMER_ID

+* ÆäËü˵Ã÷: 

+**************************************************************************/

+ZOSS_TIMER_ID zOss_SetRelativeTimerByTaskId(UINT32 time_len, UINT32 msg_id, UINT32 arg, ZOSS_TASK_ID desk_task_id)

+{

+    return zOss_SetTaskTimer(time_len, msg_id, arg, desk_task_id, FALSE);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetLoopTimer

+* ¹¦ÄÜÃèÊö: ÉèÖÃÖÜÆÚÐÔÈÎÎñ¶¨Ê±Æ÷;

+            ÒÔÉèÖÃʱ¿ÌΪ²Î¿¼µã,¾­¹ýÖ¸¶¨Ê±¼äºó, ÏòÉèÖö¨Ê±Æ÷µÄÈÎÎñ·¢ËÍÖ¸¶¨ÏûÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            time_len:ʱ³¤, µ¥Î»ms

+            msg_id:¶¨Ê±µ½ºó,·¢Ë͸øÉèÖö¨Ê±Æ÷ÈÎÎñµÄÏûÏ¢ºÅ

+            arg:¸½¼Ó²ÎÊý,¶¨´«µÝ¸øÈÎÎñÈë¿Úº¯ÊýµÄbufÐβδËʱmsg_lenֵΪ4(sizeof(UINT32/arg))

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦:ÏàÓ¦µÄ¶¨Ê±Æ÷±êʶ; ʧ°Ü:ZOSS_INVALID_TIMER_ID

+* ÆäËü˵Ã÷: ±ØÐèÔÚÈÎÎñÄÚµ÷ÓÃ.

+**************************************************************************/

+ZOSS_TIMER_ID zOss_SetLoopTimer(UINT32 time_len, UINT32 msg_id, UINT32 arg)

+{

+    return zOss_SetTaskTimer(time_len, msg_id, arg, NULL, TRUE);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: zOss_SetLoopTimerByTaskId

+* ¹¦ÄÜÃèÊö: ÉèÖÃÖÜÆÚÐÔÈÎÎñ¶¨Ê±Æ÷ÏòÄ¿±êÈÎÎñ·¢ËÍÏûÏ¢;

+            ÉèÖÃʱ¿ÌΪ²Î¿¼µã,¾­¹ýÖ¸¶¨Ê±¼äºó, ÏòÉèÖö¨Ê±Æ÷µÄÈÎÎñ·¢ËÍÖ¸¶¨ÏûÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            time_len:ʱ³¤, µ¥Î»ms

+            msg_id:¶¨Ê±µ½ºó,·¢Ë͸øÉèÖö¨Ê±Æ÷ÈÎÎñµÄÏûÏ¢ºÅ

+            arg:¸½¼Ó²ÎÊý,¶¨´«µÝ¸øÈÎÎñÈë¿Úº¯ÊýµÄbufÐβδËʱmsg_lenֵΪ4(sizeof(UINT32/arg))

+            desk_task:Ö¸¶¨Ä¿±êÈÎÎñ£¬Èç¹ûÄ¿±êÈÎÎñΪ¿Õʱ£¬½«·¢ËÍÉèÖö¨Ê±Æ÷µÄÈÎÎñ

+            (OUT)

+* ·µ »Ø Öµ: ³É¹¦:ÏàÓ¦µÄ¶¨Ê±Æ÷ID; ʧ°Ü:ZOSS_INVALID_TIMER_ID

+* ÆäËü˵Ã÷: 

+**************************************************************************/

+ZOSS_TIMER_ID zOss_SetLoopTimerByTaskId(UINT32 time_len, UINT32 msg_id, UINT32 arg, ZOSS_TASK_ID desk_task_id)

+{

+    return zOss_SetTaskTimer(time_len, msg_id, arg, desk_task_id, TRUE);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_SetTaskID

+* ¹¦ÄÜÃèÊö£ºÉèÖõ÷¶ÈÏß³ÌÈÎÎñÐÅÏ¢

+* ²ÎÊý˵Ã÷£º(IN) 

+            threadId: µ÷¶ÈÏß³Ìid

+            taskId:ÈÎÎñÐÅÏ¢Ö¸Õë

+            (OUT)

+* ·µ »Ø Öµ£ºZOSS_ERRORÉèÖÃʧ°Ü£¬ZOSS_SUCCESSÉèÖóɹ¦

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+UINT32 Sche_SetTaskID(ZOSS_THREAD_ID threadId, VOID *taskId)

+{

+    T_ZOsa_ThreadUserArea *ptArea = NULL;

+    

+    zOss_AssertEx(threadId != NULL && taskId != NULL, ZOSS_ERROR);    

+    ptArea = Osa_GetThreadUserArea(threadId, TRUE);

+    if (NULL == ptArea)

+    {

+        return ZOSS_ERROR;

+    }

+    else

+    {

+        ptArea->ptrf = taskId;

+        return ZOSS_SUCCESS;

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_GetTaskID

+* ¹¦ÄÜÃèÊö£º»ñµÃµ÷¶ÈÏß³ÌÈÎÎñÐÅÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            threadId: µ÷¶ÈÏß³Ìid

+            (OUT)

+* ·µ »Ø Öµ£ºNULL »ñµÃʧ°Ü

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+__tcm_func VOID *Sche_GetTaskID(ZOSS_THREAD_ID threadId)

+{

+    T_ZOsa_ThreadUserArea *ptArea = NULL;

+    

+    zOss_AssertEx(threadId != NULL, NULL);

+    ptArea = Osa_GetThreadUserArea(threadId, FALSE);

+    

+    if (NULL == ptArea)

+    {

+        return NULL;

+    }

+    else

+    {

+        return ptArea->ptrf;

+    }

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_DefTaskEntry

+* ¹¦ÄÜÃèÊö£ºÈ±Ê¡ÈÎÎñÈë¿Ú

+* ²ÎÊý˵Ã÷£º(IN)

+            arg:²ÎÊýÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+__tcm_func static VOID Sche_DefTaskEntry(SINT32 arg)

+{

+    T_ZOss_TCB              *pTCB       = NULL;

+    T_ZOss_TRF              *pTRF       = NULL;

+    T_ZOss_TaskMsgHead      *msgPtr     = NULL;

+    T_ZOss_TaskMsg          *bufPtr     = NULL;

+    T_ZOsa_ThreadUserArea   *pUa        = NULL;

+    ZOSS_THREAD_ID          threadId    = NULL;

+    VOID                    *buf        = NULL;

+    UINT32                  msgLen      = 0;

+    UINT32                  nRet        = ZOSS_ERROR;

+    UINT32                  nore        = ZOSS_ERROR;

+#ifndef _OS_WIN

+    UINT32  tempTaskTime    = 0;

+    UINT32  taskTimeLen     = 0;

+#endif

+    

+    pTRF = (T_ZOss_TRF *)arg;

+    zOss_AssertExN(NULL != pTRF);

+    

+    pUa = Osa_GetThreadUserArea(zOss_GetCurThreadID(), FALSE);

+    zOss_AssertExN(NULL != pUa);

+

+    /* ÏûÏ¢·Ö·¢ */

+    while (1)

+    {

+        /* »ñÈ¡ÏûÏ¢ */

+        nRet = zOss_RecvMsg((VOID **)&msgPtr, &msgLen, ZOSS_WAIT_FOREVER);

+        zOss_AssertExN(nRet != ZOSS_ERROR);

+        

+        do

+        {

+            if (msgPtr->send_state > 4)

+            {

+                zOss_ASSERT(0);

+                break;

+            }

+

+            pTCB = (T_ZOss_TCB *)msgPtr->t_task_id;         /* »ñȡĿ±êÈÎÎñTCB±í   */

+            

+            switch (msgPtr->msgID)

+            {

+            case EV_TASK_END:                               /* ÈÎÎñɾ³ýÏûÏ¢        */

+                {

+                    if (NULL == Sche_GetTCB(msgPtr->t_task_id))

+                    {

+                        break;

+                    }

+                    pTCB->task_id = NULL;

+                    switch (pTCB->run_status)

+                    {

+                    case ZOSS_STATE_STOPPED:

+                        {

+                            zOss_ListDelete(&(pTRF->TCBStopped), &(pTCB->node));

+                            break;

+                        }

+                    case ZOSS_STATE_IDLE:

+                        {

+                            zOss_ListDelete(&(pTRF->TCBIdle), &(pTCB->node));

+                            break;

+                        }

+                    case ZOSS_STATE_READY:

+                        {

+                            zOss_ListDelete(&(pTRF->TCBReady), &(pTCB->node));

+                            break;

+                        }

+                    default:

+                        {

+                            break;

+                        }

+                    }

+                    Sche_RemoveTCB(pTCB);

+                    if (pTCB->taskData != NULL)

+                    {

+                        zOss_Free(pTCB->taskData);

+                    }

+

+                    while (zOss_ListCount(&pTCB->msg_queue) > 0)

+                    {

+                        buf = (VOID *)zOss_ListFirst(&pTCB->msg_queue);

+                        zOss_AssertExN(buf != NULL);

+                        zOss_ListDelete(&pTCB->msg_queue, (T_ZOss_Node *)buf);

+                        zOss_RetUB(buf);

+                    }

+                    zOss_Free(pTCB);

+                    nore = zOss_RetUB(msgPtr);

+                    if (nore == ZOSS_ERROR)

+                    {

+                        return;

+                    }

+                    if (pTRF->pno == 0)

+                    {

+                        if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TRFMutex, ZOSS_WAIT_FOREVER))

+                        {

+                            zOss_ListDelete(&gSche_TRF_List, &(pTRF->node));

+                            zOss_PutMutex(gSche_TRFMutex);

+                        }

+                        zOss_Free(pTRF);

+                        zOss_ExitThread();

+                    }              

+                    break;

+                }

+                

+            case EV_TASK_CRE:                          /* ÈÎÎñ´´½¨ÏûÏ¢  */

+                {

+                    if (pTCB->task_id == msgPtr->t_task_id)

+                    {

+                        zOss_ListAdd(&(pTRF->TCBIdle), &(pTCB->node));

+                        pTCB->run_status = ZOSS_STATE_IDLE;

+                    }

+                    zOss_RetUB(msgPtr);             

+                    break;

+                }

+                

+            default:                                   /* ÆÕͨÏûÏ¢      */

+                {

+                    if (pTCB->task_id == msgPtr->t_task_id)

+                    {

+                        zOss_ListAdd(&pTCB->msg_queue, &(msgPtr->node));

+                        if (pTCB->run_status == ZOSS_STATE_IDLE)

+                        {

+                            zOss_ListDelete(&(pTRF->TCBIdle), &(pTCB->node));

+                            zOss_ListAdd(&(pTRF->TCBReady), &(pTCB->node));

+                            pTCB->run_status = ZOSS_STATE_READY;

+                        }

+                    }

+                    else

+                    {

+                        zOss_RetUB((UINT8 *)msgPtr);

+                    }              

+                    break;

+                }

+            }

+        }while (ZOSS_SUCCESS == zOss_RecvMsg((VOID **)&msgPtr, &msgLen, ZOSS_NO_WAIT));

+        

+        /* ÏûÏ¢´¦Àí */

+        while (0 != zOss_ListCount(&(pTRF->TCBReady)))

+        {

+            pTCB = (T_ZOss_TCB *)zOss_ListFirst(&(pTRF->TCBReady));     /* È¡¾ÍÐ÷ÈÎÎñÁ´±íµÄµÚÒ»¸öÈÎÎñ */

+            if (pTCB->task_id == NULL)                                  /* Òѱ»É¾³ý */

+            {

+                pTCB->run_status = ZOSS_STATE_STOPPED;

+                zOss_ListDelete(&(pTRF->TCBReady), &(pTCB->node));

+                zOss_ListAdd(&(pTRF->TCBStopped), &(pTCB->node));

+            }

+            else

+            {

+                msgPtr = (T_ZOss_TaskMsgHead *)zOss_ListFirst(&pTCB->msg_queue);   /* È¡ÏûÏ¢¶ÓÁеĵÚÒ»¸öÏûÏ¢ */

+                zOss_AssertExN(msgPtr != NULL);

+                zOss_ListDelete(&pTCB->msg_queue, (T_ZOss_Node *)msgPtr);

+                

+                /* ¶¨Ê±Æ÷ÏûÏ¢ */

+                if (msgPtr->send_state == ZOSS_MSGSENDTYPE_TIMER)

+                {

+                    /* ¶¨Ê±Æ÷ÒѾ­É¾³ý»òÕßÔÝÍ£ */

+                    if (Timer_IgnoreTaskMsg((ZOSS_TIMER_ID)(msgPtr->s_task_id)))

+                    {

+                        zOss_RetUB((UINT8 *)msgPtr);

+                        zOss_ListDelete(&(pTRF->TCBReady), &(pTCB->node));

+                        if (zOss_ListCount(&pTCB->msg_queue) == 0)          /* ÏûÏ¢¶ÓÁÐΪ¿Õ     */

+                        {

+                            pTCB->run_status = ZOSS_STATE_IDLE;

+                            zOss_ListAdd(&(pTRF->TCBIdle), &(pTCB->node));

+                        }

+                        else                                            /* ÏûÏ¢¶ÓÁв»Îª¿Õ   */

+                        {

+                            pTCB->run_status = ZOSS_STATE_READY;

+                            zOss_ListAdd(&(pTRF->TCBReady), &(pTCB->node));

+                        }

+                        continue;

+                    }

+                    msgPtr->s_task_id = NULL;

+                }

+                /* ¼Ç¼ÏûÏ¢ÐÅÏ¢     */

+                pTCB->msg_id = msgPtr->msgID;

+                pTCB->sender_task_id = msgPtr->s_task_id;

+                /* ¸ü¸ÄÈÎÎñ״̬     */

+                pTCB->run_status = ZOSS_STATE_RUN;

+                /* É趨ÈÎÎñ¿ªÊ¼Ê±¼ä */

+                if (gOsa_SwapTimeFlag && gExcep_DaemonTask != NULL)

+                {

+                    pTCB->task_time = Osa_HwTimeRead(); //zOss_GetTickCount();

+                }

+                pUa->curtaskid  = pTCB->task_id;

+#if ZOSS_SELF_MIMO

+                

+                /* ˽ÓÐÊý¾ÝÇø±ß½ç¼ì²é */

+                if (NULL != pTCB->taskData && *(UINT32 *)((UINT32)pTCB->taskData + pTCB->private_data_len) != gSche_pDataRegion_Test)

+                {

+                    SCHE_printf("%s private data overflow", pTCB->task_name);

+                    zOss_ASSERT(0);

+                    return;

+                }

+                threadId = zOss_GetCurThreadID();

+                zOss_AssertExN(pTCB->thread_id == threadId);

+#endif

+                /* µ÷ÓÃÓû§ÏûÏ¢´¦Àíº¯Êý´¦Àí */

+                switch (msgPtr->send_state)

+                {

+                    case ZOSS_MSGSENDTYPE_TIMER:

+                    case ZOSS_MSGSENDTYPE_MSG:

+                    {

+                        pTCB->count++;

+                        if (0 == msgPtr->msgLen)

+                        {

+                            pTCB->taskEntry(pTCB->state, msgPtr->msgID, NULL, msgPtr->msgLen, pTCB->taskData);

+                        }

+                        else

+                        {

+                            pTCB->taskEntry(pTCB->state, msgPtr->msgID, (UINT8 *)(msgPtr + 1), msgPtr->msgLen, pTCB->taskData);

+                        }

+                        if (pTCB->reserved[0] == 1 && msgPtr->msgID == EV_INIT && pTCB->state == ZOSS_STATUS_INIT )

+                        {

+                            zOss_PutSemaphore(gSche_SaticTaskInitSema);

+                            pTCB->reserved[0] = 0;

+                        }

+                        /* ÊÍ·ÅÏûÏ¢ */

+                        zOss_RetUB((UINT8 *)msgPtr);

+                        break;

+                    }

+                            

+                    case ZOSS_MSGSENDTYPE_DATA:

+                    {

+                        bufPtr = (T_ZOss_TaskMsg *)(msgPtr + 1);

+                        pTCB->count++;

+                        pTCB->taskEntry(pTCB->state, msgPtr->msgID, (UINT8 *)bufPtr->msgbuf, bufPtr->msgLenEX, pTCB->taskData);

+                        zOss_RetUB((UINT8 *)msgPtr);

+                        break;

+                    }

+                            

+                    case ZOSS_MSGSENDTYPE_INTER:

+                    {

+                        pTCB->count++;

+                        pTCB->taskEntry(pTCB->state, msgPtr->msgID, (UINT8 *)msgPtr, msgPtr->msgLen, pTCB->taskData);

+                        break;

+                    }

+                            

+                    default:

+                    {

+                        break;

+                    }

+                }

+

+#if ZOSS_SELF_MIMO

+                /* ˽ÓÐÊý¾ÝÇø±ß½ç¼ì²é */

+                if (NULL != pTCB->taskData && *(UINT32 *)((UINT32)pTCB->taskData + pTCB->private_data_len) != gSche_pDataRegion_Test)

+                {

+                    SCHE_printf("%s private data overflow", pTCB->task_name);

+                    zOss_ASSERT(0);

+                    return;

+                }

+#endif

+#ifndef _OS_WIN

+                if (gOsa_SwapTimeFlag)

+                {

+                    tempTaskTime = Osa_HwTimeRead();

+                    if (tempTaskTime >= pTCB->task_time)

+                    {

+                        taskTimeLen = tempTaskTime - pTCB->task_time;

+                    }

+                    else

+                    {

+                        taskTimeLen = tempTaskTime + ~pTCB->task_time;  /* ʱ¼äÒç³ö´¦Àí */

+                    }

+                    pTCB->cputime += taskTimeLen;

+                    pTCB->runtime += taskTimeLen;

+                }

+#endif

+                pUa->curtaskid = 0;

+                /* ÖØÖÃÈÎÎñÖ´ÐÐʱ¼ä */

+                pTCB->task_time = 0;

+                zOss_ListDelete(&(pTRF->TCBReady), &(pTCB->node));

+                if (zOss_ListCount(&pTCB->msg_queue) == 0)                  /* ÏûÏ¢¶ÓÁÐΪ¿Õ     */

+                {

+                    pTCB->run_status = ZOSS_STATE_IDLE;

+                    zOss_ListAdd(&(pTRF->TCBIdle), &(pTCB->node));

+                }

+                else                                                    /* ÏûÏ¢¶ÓÁв»Îª¿Õ   */

+                {

+                    pTCB->run_status = ZOSS_STATE_READY;

+                    zOss_ListAdd(&(pTRF->TCBReady), &(pTCB->node));

+                }

+            }

+        }

+    }

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_GetTCB

+* ¹¦ÄÜÃèÊö£º¸ù¾ÝÈÎÎñID»ñÈ¡TCB

+* ²ÎÊý˵Ã÷£º(IN)

+            taskId:ÈÎÎñID

+            (OUT)

+* ·µ »Ø Öµ£ºTCB±íÖ¸Õ룬ʧ°Ü·µ»ØNULL

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+__tcm_func static T_ZOss_TCB *Sche_GetTCB(const ZOSS_TASK_ID taskId)

+{

+    T_ZOss_TCB *pCurTCB = NULL;

+    

+    zOss_AssertEx(NULL != gSche_TCBHeadPtr, NULL);

+  

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        pCurTCB = gSche_TCBHeadPtr;

+        while (NULL != pCurTCB)

+        {

+            if (pCurTCB == (T_ZOss_TCB *)taskId)

+            {

+                zOss_PutMutex(gSche_TCBMutex);

+                return pCurTCB;

+            }

+            pCurTCB = pCurTCB->next;

+        }

+        zOss_PutMutex(gSche_TCBMutex);

+    }

+    return NULL;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_AddTCB

+* ¹¦ÄÜÃèÊö£ºÌí¼ÓÒ»¸öTCB

+* ²ÎÊý˵Ã÷£º(IN)

+            ptTcb:Ìí¼ÓµÄTCB±íÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+static UINT32 Sche_AddTCB(T_ZOss_TCB *ptTcb)

+{

+    UINT32 nore = ZOSS_ERROR;

+    

+    zOss_AssertEx(NULL != ptTcb, ZOSS_ERROR);

+    

+    ptTcb->next = NULL;

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        if (gSche_MaxTCBLen >= gSche_Max_TaskTab_Num)                /* ³¬¹ý×î´óÈÎÎñÊý */

+        {

+            zOss_PutMutex(gSche_TCBMutex);

+            return ZOSS_ERROR;

+        }

+        

+        if (NULL == gSche_TCBTailPtr)

+        {

+            gSche_TCBHeadPtr = ptTcb;

+            gSche_TCBTailPtr = ptTcb;

+        }

+        else

+        {

+            gSche_TCBTailPtr->next = ptTcb;

+            gSche_TCBTailPtr = ptTcb;

+        }

+        

+        gSche_MaxTCBLen++;

+        nore = zOss_PutMutex(gSche_TCBMutex);

+        if (nore == ZOSS_ERROR)

+        {

+            return ZOSS_ERROR;

+        }

+        return ZOSS_SUCCESS;

+    }

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºSche_RemoveTCB

+* ¹¦ÄÜÃèÊö£ºÉ¾³ýÒ»¸öTCB£¬²»ÊÍ·Å

+* ²ÎÊý˵Ã÷£º(IN)

+            pDelTcb:ÐèҪɾ³ýµÄTCB±íÖ¸Õë

+            (OUT)

+* ·µ »Ø Öµ£º³É¹¦·µ»ØZOSS_SUCCESS,·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º¿ÉÑ¡

+**************************************************************************/

+static UINT32 Sche_RemoveTCB(T_ZOss_TCB *pDelTcb)

+{

+    T_ZOss_TCB  *pCurTCB    = NULL;

+    UINT32      nore        = ZOSS_ERROR;

+    

+    zOss_AssertEx(NULL != pDelTcb, ZOSS_ERROR);

+

+    if (ZOSS_SUCCESS == zOss_GetMutex(gSche_TCBMutex, ZOSS_WAIT_FOREVER))

+    {

+        if (NULL == gSche_TCBHeadPtr)       /* Á´±íΪ¿Õ */

+        {

+            zOss_PutMutex(gSche_TCBMutex);

+            return ZOSS_ERROR;

+        }

+

+        if (pDelTcb == gSche_TCBHeadPtr)    /* ɾ³ýÍ·½áµã */

+        {

+            if (gSche_TCBHeadPtr == gSche_TCBTailPtr)   /* Ö»ÓÐÒ»¸ö½áµã */

+            {

+                gSche_TCBTailPtr = NULL;

+                gSche_TCBHeadPtr = NULL;

+            }

+            else

+            {

+                gSche_TCBHeadPtr = gSche_TCBHeadPtr->next;

+            }

+            gSche_MaxTCBLen--;

+            nore = zOss_PutMutex(gSche_TCBMutex);

+            if (nore == ZOSS_ERROR)

+            {

+                return ZOSS_ERROR;

+            }

+            return ZOSS_SUCCESS;

+        }

+

+        pCurTCB = gSche_TCBHeadPtr;

+        while (NULL != pCurTCB)

+        {

+            if (pCurTCB->next == pDelTcb)

+            {

+                pCurTCB->next = pDelTcb->next;

+                if (gSche_TCBTailPtr == pDelTcb)  /* ɾ³ýβ½áµã */

+                {

+                    gSche_TCBTailPtr = pCurTCB;

+                }

+                gSche_MaxTCBLen--;

+                nore = zOss_PutMutex(gSche_TCBMutex);

+                if (nore == ZOSS_ERROR)

+                {

+                    return ZOSS_ERROR;

+                }

+                return ZOSS_SUCCESS;

+            }

+            pCurTCB = pCurTCB->next;

+        }

+        zOss_PutMutex(gSche_TCBMutex);

+    }

+    return ZOSS_ERROR;

+}

+

+__tcm_func static VOID TaskTimer_CallBack(T_Task_Arg *task_arg)

+{

+    T_ZOss_TaskMsgHead *pTaskMsg = NULL;

+    

+    zOss_AssertExN(task_arg != NULL);

+    

+    pTaskMsg = (T_ZOss_TaskMsgHead *)zOss_GetUB(sizeof(T_ZOss_TaskMsgHead) + sizeof(task_arg->arg)); /* ÉêÇëÄÚ´æ³Ø */

+    

+    zOss_AssertExN(pTaskMsg != NULL);

+    

+    pTaskMsg->send_state    = ZOSS_MSGSENDTYPE_TIMER;

+    pTaskMsg->msgID         = task_arg->msg_id;

+    pTaskMsg->msgLen        = sizeof(task_arg->arg);

+    pTaskMsg->t_task_id     = task_arg->task_id;

+    pTaskMsg->s_task_id     = (ZOSS_TASK_ID)task_arg->pTimerNode;

+    zOss_Memcpy((UINT8 *)(pTaskMsg + 1), &(task_arg->arg), pTaskMsg->msgLen);

+    zOss_TaskSendDataEx(pTaskMsg); /* ·¢ËÍÏûÏ¢ */

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ: Timer_IgnoreTaskMsg

+* ¹¦ÄÜÃèÊö: ÅжÏÊÇ·ñÐèÒªºöÂÔÊÕµ½µÄ¶¨Ê±Æ÷ÏûÏ¢

+* ²ÎÊý˵Ã÷: (IN)

+            timerId:¶¨Ê±Æ÷ID

+            (OUT)

+* ·µ »Ø Öµ: ÐèÒªºöÂÔ:TRUE;·ñÔòFALSE

+* ÆäËü˵Ã÷: ¸Ãº¯Êý½öÌṩ¸øÈÎÎñµ÷¶È³ÌÐòʹÓã¬ÓÉÓû§±£Ö¤¡£

+            ¶ÔÓÚ·ÇÖÜÆÚÐÔ¶¨Ê±Æ÷£¬Èç¹û·µ»ØTRUE,ÔòͬʱÊͷŶ¨Ê±Æ÷ËùÕ¼×ÊÔ´

+**************************************************************************/

+__tcm_func static BOOL Timer_IgnoreTaskMsg(ZOSS_TASK_ID timerId)

+{

+    T_TIMER_NODE *pTimerNode = NULL;

+    

+    zOss_AssertEx(NULL != timerId, TRUE);

+    pTimerNode = (T_TIMER_NODE *)timerId;

+    

+    if (pTimerNode->Flag != TIMER_USE && pTimerNode->Flag != TIMER_SUSPEND)

+    {

+        return TRUE;

+    }

+    

+    if (pTimerNode->bPeriod == FALSE)

+    {

+        zOss_KillTimer(timerId);

+    }

+        

+    return FALSE;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_vsim.c b/cp/ps/plat/src/oss/sup/src/sup_vsim.c
new file mode 100644
index 0000000..8bb7963
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_vsim.c
@@ -0,0 +1,781 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : P98_VSIM

+* ÎÄ ¼þ Ãû : sup_vsim.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : vsimÊý¾Ý¹ÜÀí½Ó¿Ú

+* ×÷    Õß : ´ú¿µ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2016-08-06

+* ÆäËü˵Ã÷ : 

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "oss_api.h"

+#include "drv_api.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/**************************************************************************

+* ºê¶¨ÒåÇø

+**************************************************************************/

+#define VSIM_OP_MEM           0x01  /* VSIMÄÚ´æÄ£Ê½   */

+#define VSIM_OP_FLASH         0x02  /* VSIM FLASHģʽ */

+

+#define VSIM_SYMBOL_DOWNLOAD  0xA2  /* °æ±¾ÏÂÔØ±ê־λ */

+#define VSIM_SYMBOL_NORMAL    0xB3  /* Õý³£±ê־λ     */

+#define VSIM_SYMBOL_WRITE     0xC4  /* дÊý¾Ý±ê־λ   */

+#define VSIM_SYMBOL_MEM       0xD5  /* VSIM ÄÚ´æÄ£Ê½  */

+

+#define VSIM_WORK_AREA        0x01  /* ¹¤×÷Çø±êʶ         */

+#define VSIM_BACKUP_AREA      0x02  /* ±¸·ÝÇø±êʶ         */

+#define VSIM_BOTH_AREA        0x03  /* ¹¤×÷ÇøºÍ±¸·ÝÇø±êʶ */

+

+/**************************************************************************

+* Íⲿº¯ÊýÉùÃ÷

+**************************************************************************/

+extern UINT8  zOss_GetVsimSupport(VOID);

+extern VOID zOss_vSIMAgtInit(VOID);

+extern SINT32 zDrvNand_SimNvRead(UINT32 dwStart, UINT32 dwLen, UINT8* to);

+extern SINT32 zDrvNand_SimNvProgram(UINT32 dwStart, UINT32 dwLen, UINT8* from);

+extern SINT32 zDrvNand_SimNvFacRead(UINT32 dwStart, UINT32 dwLen, UINT8* to);

+extern SINT32 zDrvNand_SimNvFacProgram(UINT32 dwStart, UINT32 dwLen, UINT8* from);

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+**************************************************************************/

+static UINT32 vSIM_Resume_Data(UINT8 index);

+static VOID vSIM_Fill_Factory(VOID);

+static BOOL vSIM_Check_Data(VOID);

+static SINT32 vSIM_ReadWithNoReset(UINT32 dwStart, UINT32 dwLen, UINT8* to);

+

+/**************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+**************************************************************************/

+static BOOL             gvSIM_Inited   = FALSE;

+static BOOL             gvSIM_OP_MODE  = VSIM_OP_FLASH;

+static BOOL             gvSIM_InResume = FALSE;         /* vSIM»Ö¸´Á÷³ÌÖÐ */

+static VOID             *gvSIM_FacMem  = NULL;

+static ZOSS_MUTEX_ID    gvSIM_Mutex    = ZOSS_NULL;

+static T_vSIM_PARAM     *gpvSIM_Param  = NULL;

+

+/**************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£º VSIM_Init

+* ¹¦ÄÜÃèÊö£º VSIM³õʼ»¯

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_vSIMInit(VOID)

+{

+#if 0

+    T_OSS_PARAM *pOssParam = NULL;

+

+    if (!zOss_GetVsimSupport())

+    {

+        return ZOSS_SUCCESS;

+    }

+    

+    if (gvSIM_Inited)

+    {

+        return ZOSS_SUCCESS;

+    }

+

+    pOssParam    = zOss_GetOssCfg();

+    gpvSIM_Param = &(pOssParam->vSIMCfg);

+

+    if (!vSIM_Check_Data())

+    {

+        return ZOSS_ERROR;

+    }

+

+    gvSIM_Mutex = zOss_CreateMutex("vSIM_Mutex", ZOSS_INHERIT);

+    if (gvSIM_Mutex == NULL)

+    {

+        return ZOSS_ERROR;

+    }

+

+#ifdef _USE_VSIM_AGT

+    zOss_vSIMAgtInit();

+#endif

+

+    gvSIM_Inited = TRUE;

+

+    return ZOSS_SUCCESS;

+#else

+	return ZOSS_SUCCESS;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMDataRead

+* ¹¦ÄÜÃèÊö£º ¶Áȡָ¶¨Çø¼äµÄvSIMÊý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            addr:  Æ«ÒÆµØÖ·

+*            data:  Êý¾Ý´æ´¢¿Õ¼ä

+*            len:   ¶ÁÈ¡Êý¾ÝµÄ³¤¶È,µ¥Î»×Ö½Ú;

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_vSIMDataRead(UINT32 addr, VOID *data, UINT32 len)

+{

+#if 0

+    SINT32  status = -1;

+

+    zOss_AssertEx(gvSIM_Inited, ZOSS_ERROR);

+    zOss_AssertEx(addr >= gpvSIM_Param->Work_Area_Base_Addr

+                  && len  <= gpvSIM_Param->Area_Size

+                  && addr + len <= gpvSIM_Param->Work_Area_Base_Addr + gpvSIM_Param->Area_Size,

+                  ZOSS_ERROR);

+

+    zOss_GetMutex(gvSIM_Mutex, ZOSS_WAIT_FOREVER);

+

+    if(VSIM_OP_MEM == gvSIM_OP_MODE)

+    {

+        if(!gvSIM_FacMem)

+        {

+            zOss_PutMutex(gvSIM_Mutex);

+            return ZOSS_ERROR;

+        }

+        zOss_Memcpy(data, (VOID *)((UINT8 *)gvSIM_FacMem + addr), len);

+        status = 0;

+    }

+    else

+    {

+        status = zDrvNand_SimNvRead(gpvSIM_Param->Work_Area_Base_Addr + addr, len, data);

+    }

+

+

+    zOss_PutMutex(gvSIM_Mutex);

+

+    return (status == 0) ? ZOSS_SUCCESS : ZOSS_ERROR;

+#else

+    zOss_AssertEx(0, ZOSS_ERROR);

+    return ZOSS_ERROR;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMDataWrite

+* ¹¦ÄÜÃèÊö£º дÈëÖ¸¶¨Çø¼äµÄvSIMÊý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            addr:  µØÖ·

+*            data:  Êý¾ÝÔ´¿Õ¼ä

+*            len:   дÈëÊý¾ÝµÄ³¤¶È,µ¥Î»×Ö½Ú;

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_vSIMDataWrite(UINT32 addr, VOID *data, UINT32 len)

+{

+#if 0

+    UINT8   symbol = VSIM_SYMBOL_WRITE;

+    SINT32  status = -1;

+

+    zOss_AssertEx(gvSIM_Inited, ZOSS_ERROR);

+    zOss_AssertEx(addr >= gpvSIM_Param->Work_Area_Base_Addr

+                  && len  <= gpvSIM_Param->Area_Size

+                  && addr + len <= gpvSIM_Param->Work_Area_Base_Addr + gpvSIM_Param->Area_Size,

+                  ZOSS_ERROR);

+

+    zOss_GetMutex(gvSIM_Mutex, ZOSS_WAIT_FOREVER);

+

+    if(VSIM_OP_MEM == gvSIM_OP_MODE)

+    {

+        if(!gvSIM_FacMem)

+        {

+            zOss_PutMutex(gvSIM_Mutex);

+            return ZOSS_ERROR;

+        }

+        zOss_Memcpy((VOID *)((UINT8 *)gvSIM_FacMem + addr), data, len);

+        status = 0;

+    }

+    else

+    {

+        do

+        {

+            /* д¹¤×÷Çø */

+            symbol = VSIM_SYMBOL_WRITE;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+

+            status    = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Base_Addr + addr, len, data);

+            if (status != 0)

+            {

+                break;

+            }

+

+            symbol = VSIM_SYMBOL_NORMAL;

+            status    = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+

+            /* д±¸·ÝÇø */

+            symbol = VSIM_SYMBOL_WRITE;

+            status    = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+

+            status    = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Base_Addr + addr, len, data);

+            if (status != 0)

+            {

+                break;

+            }

+

+            symbol = VSIM_SYMBOL_NORMAL;

+            status    = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+        }while(0);

+    }

+

+    zOss_PutMutex(gvSIM_Mutex);

+

+    return (status == 0) ? ZOSS_SUCCESS : ZOSS_ERROR;

+#else

+    zOss_AssertEx(0, ZOSS_ERROR);

+    return ZOSS_ERROR;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMFacWrite

+* ¹¦ÄÜÃèÊö£º дÈëvSIM³ö³§ÇøµÄÈ«²¿Êý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*            data:  Êý¾Ý´æ´¢¿Õ¼ä

+*            len:   ¶ÁÈ¡Êý¾ÝµÄ³¤¶È,µ¥Î»×Ö½Ú;

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+UINT32 zOss_vSIMFacWrite(VOID *data, UINT32 len)

+{

+#if 0

+    UINT8   symbol = VSIM_SYMBOL_WRITE;

+    SINT32  status = -1;

+

+    zOss_AssertEx(gvSIM_Inited && gpvSIM_Param->Area_Size >= len, ZOSS_ERROR);

+

+    if(VSIM_OP_MEM == gvSIM_OP_MODE)

+    {

+        zOss_AssertEx(!gvSIM_FacMem, ZOSS_ERROR);

+        gvSIM_FacMem = zOss_Malloc(len);

+        if(NULL == gvSIM_FacMem)

+        {

+            return ZOSS_ERROR;

+        }

+        zOss_Memcpy(gvSIM_FacMem, data, len);

+        status = 0;

+    }

+    else

+    {

+        do

+        {

+            symbol = VSIM_SYMBOL_WRITE;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+

+            status = zDrvNand_SimNvFacProgram(gpvSIM_Param->Factory_Area_Base_Addr, len, data);

+            if(status != 0)

+            {

+                break;

+            }

+

+            symbol = VSIM_SYMBOL_DOWNLOAD;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol);

+            if(status != 0)

+            {

+                break;

+            }

+        }while(0);

+    }

+    

+    return (status == 0) ? ZOSS_SUCCESS : ZOSS_ERROR;

+#else

+    zOss_AssertEx(0, ZOSS_ERROR);

+    return ZOSS_ERROR;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMRecovery

+* ¹¦ÄÜÃèÊö£º ´Ó³ö³§Çø»Ö¸´Êý¾Ýµ½¹¤×÷ÇøºÍ±¸·ÝÇø

+* ²ÎÊý˵Ã÷£º (IN)

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS

+* ÆäËü˵Ã÷£º ÖØÆôºóÉúЧ

+**************************************************************************/

+UINT32 zOss_vSIMRecovery(VOID)

+{

+#if 0

+    UINT8 symbol = VSIM_SYMBOL_DOWNLOAD;

+    

+    if(gvSIM_OP_MODE == VSIM_OP_MEM)

+        return ZOSS_ERROR;

+

+    return zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol) == DRV_SUCCESS ? ZOSS_SUCCESS : ZOSS_ERROR;

+#else

+    zOss_AssertEx(0, ZOSS_ERROR);

+    return ZOSS_ERROR;

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMSetErrorAddr

+* ¹¦ÄÜÃèÊö£º ¸ù¾Ý³ö´íµÄµØÖ·¿Õ¼ä,ÉèÖöÔÓ¦Çø¼äµÄ±ê־λ,ÒÔ±ãÖØÆôºó½øÈë»Ö¸´Á÷³Ì,½â¾önandµÄ±ÈÌØÎ»·´×ªÎÊÌâ

+* ²ÎÊý˵Ã÷£º addr:²Ù×÷³ö´íÇøÓòµÄÂß¼­µØÖ·

+* ·µ »Ø Öµ£º ÎÞ

+* ÆäËü˵Ã÷£º Çý¶¯½öÔÚvSIMÇø²Ù×÷³öÏÖECC´íÎóʱµ÷ÓÃ

+**************************************************************************/

+VOID zOss_vSIMSetErrorAddr(UINT32 addr)

+{

+#if 0

+    UINT8  symbol   = VSIM_SYMBOL_WRITE;

+    UINT32 rw_start = 0;

+    UINT32 bk_start = 0;

+    UINT32 rw_end   = 0;

+    UINT32 bk_end   = 0;

+

+    rw_start = gpvSIM_Param->Work_Area_Base_Addr;

+    bk_start = gpvSIM_Param->Backup_Area_Base_Addr;

+    rw_end   = rw_start + gpvSIM_Param->Area_Size - 1;

+    bk_end   = bk_start + gpvSIM_Param->Area_Size - 1;

+

+    gvSIM_InResume = TRUE;

+    if(addr >= rw_start && addr <= rw_end)

+    {

+        zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+    }

+    else if(addr >= bk_start && addr <= bk_end)

+    {

+        zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+    }

+    else

+    {

+        zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr,   1, &symbol);

+        zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+        symbol = VSIM_SYMBOL_DOWNLOAD;

+        zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol);

+    }

+    gvSIM_InResume = FALSE;

+    return;

+#else

+    return;	

+#endif

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMInResume

+* ¹¦ÄÜÃèÊö£º ÊÇ·ñ´¦ÓÚ»Ö¸´Á÷³ÌÖÐ

+* ²ÎÊý˵Ã÷£º ÎÞ

+* ·µ »Ø Öµ£º TRUE:´¦ÓÚ»Ö¸´Á÷³Ì£»FLASE:²»´¦ÓÚ»Ö¸´Á÷³Ì

+* ÆäËü˵Ã÷£º Çý¶¯Ê¹ÓÃ

+**************************************************************************/

+BOOL zOss_vSIMInResume(VOID)

+{

+    return gvSIM_InResume;

+}

+

+/**************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+**************************************************************************/

+/**************************************************************************

+* º¯ÊýÃû³Æ£º vSIM_Resume_Data

+* ¹¦ÄÜÃèÊö£º »Ö¸´Êý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*                index: ÇøÓòË÷ÒýºÅ:

+*                index = VSIM_WORK_AREA:   »Ö¸´¹¤×÷Çø

+*                index = VSIM_BACKUP_AREA: »Ö¸´±¸·ÝÇø  

+*                index = VSIM_BOTH_AREA:   »Ö¸´¹¤×÷ÇøºÍ±¸·ÝÇø  

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static UINT32 vSIM_Resume_Data(UINT8 index)

+{

+    UINT8   symbol = 0;

+    UINT8   *temp  = NULL;

+    SINT32  status = -1;

+    

+    switch (index)

+    {

+    case VSIM_WORK_AREA:

+        {

+            temp = (UINT8 *)zOss_Malloc(gpvSIM_Param->Area_Size);

+            if (temp == NULL)

+            {

+                return ZOSS_ERROR;

+            }

+            status = zDrvNand_SimNvRead(gpvSIM_Param->Backup_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            

+            if (status != 0)

+            {

+                break;

+            }

+            

+            gvSIM_InResume = TRUE;

+

+            symbol = VSIM_SYMBOL_WRITE;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            symbol = VSIM_SYMBOL_NORMAL;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            gvSIM_InResume = FALSE;

+            

+            zOss_Free(temp);

+            return ZOSS_SUCCESS;

+        }

+    case VSIM_BACKUP_AREA:

+        {

+            temp = (UINT8 *)zOss_Malloc(gpvSIM_Param->Area_Size);

+            if (temp == NULL)

+            {

+                return ZOSS_ERROR;

+            }

+            

+            status = zDrvNand_SimNvRead(gpvSIM_Param->Work_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            gvSIM_InResume = TRUE;

+

+            symbol = VSIM_SYMBOL_WRITE;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            symbol = VSIM_SYMBOL_NORMAL;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            gvSIM_InResume = FALSE;

+            

+            zOss_Free(temp);

+            return ZOSS_SUCCESS;

+        }

+    case VSIM_BOTH_AREA:

+        {           

+            temp = (UINT8 *)zOss_Malloc(gpvSIM_Param->Area_Size);

+            if (temp == NULL)

+            {

+                return ZOSS_ERROR;

+            }

+            zOss_Memset(temp, 0xff, gpvSIM_Param->Area_Size);

+            

+            status = zDrvNand_SimNvFacRead(gpvSIM_Param->Factory_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            if (status != 0)

+            {

+                zOss_Free(temp);

+                zOss_AssertEx(0, ZOSS_ERROR);

+            }

+

+            gvSIM_InResume = TRUE;

+            

+            /* »Ö¸´¹¤×÷Çø */

+            symbol = VSIM_SYMBOL_WRITE;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            symbol = VSIM_SYMBOL_NORMAL;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+

+            /* »Ö¸´±¸·ÝÇø */

+            symbol = VSIM_SYMBOL_WRITE;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            symbol = VSIM_SYMBOL_NORMAL;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+

+            /* ÖØÖóö³¡Çø±ê־λ */

+            symbol = VSIM_SYMBOL_NORMAL;

+            status = zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol);

+            if (status != 0)

+            {

+                break;

+            }

+            

+            gvSIM_InResume = FALSE;

+            

+            zOss_Free(temp);

+            

+            return ZOSS_SUCCESS;

+        }

+    default:

+        {

+            return ZOSS_ERROR;

+        }    

+    }

+

+    gvSIM_InResume = FALSE;

+

+    if(temp != NULL)

+    {

+        zOss_Free(temp);

+    }

+    return ZOSS_ERROR;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£ºvSIM_Fill_Factory

+* ¹¦ÄÜÃèÊö£º´Ó¹¤×÷Çø/±¸·ÝÇø¿½±´Êý¾Ýµ½³ö³§Çø

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£ºÎÞ

+* ÆäËü˵Ã÷£ºÎÞ

+**************************************************************************/

+static VOID vSIM_Fill_Factory(VOID)

+{

+    VOID    *temp  = NULL;

+    UINT8   symbol = 0;

+    SINT32  Status = -1;

+

+    temp = zOss_Malloc(gpvSIM_Param->Area_Size);

+    zOss_AssertExN(temp != NULL);

+

+    do

+    {

+        Status = vSIM_ReadWithNoReset(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &symbol);

+        if(Status != 0 || symbol != VSIM_SYMBOL_NORMAL)

+        {

+            break;

+        }

+

+        Status = zDrvNand_SimNvRead(gpvSIM_Param->Work_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);        

+        if(Status != 0)

+        {

+            break;

+        }

+

+        symbol = VSIM_SYMBOL_NORMAL;

+        gvSIM_InResume = TRUE;

+        zDrvNand_SimNvFacProgram(gpvSIM_Param->Factory_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+        zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol);

+        gvSIM_InResume = FALSE;

+

+        zOss_Free(temp);

+        return;

+    }while(0);

+

+    do

+    {

+        Status = vSIM_ReadWithNoReset(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &symbol);

+        if(Status != 0 || symbol != VSIM_SYMBOL_NORMAL)

+        {

+            break;

+        }

+

+        Status = zDrvNand_SimNvRead(gpvSIM_Param->Backup_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);        

+        if(Status != 0)

+        {

+            break;

+        }

+

+        symbol = VSIM_SYMBOL_NORMAL;

+        gvSIM_InResume = TRUE;

+        zDrvNand_SimNvFacProgram(gpvSIM_Param->Factory_Area_Base_Addr, gpvSIM_Param->Area_Size, temp);

+        zDrvNand_SimNvProgram(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &symbol);

+        gvSIM_InResume = FALSE;

+

+        zOss_Free(temp);

+        return;

+    }while(0);

+

+    zOss_Free(temp);

+    zOss_AssertExN(0);

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º vSIM_ReadWithNoReset

+* ¹¦ÄÜÃèÊö£º ¼òµ¥·â×°Çý¶¯¶Á½Ó¿Ú£¬·¢ÉúECC´íÎóʱ²»ÖØÆô

+* ²ÎÊý˵Ã÷£º (IN)

+*                dwStart: Æ«ÒÆµØÖ·

+*                dwLen:   ³¤¶È

+*                to:      Ä¿±ê»º´æ¿Õ¼ä

+*            (OUT)

+* ·µ »Ø Öµ£º ͬÇý¶¯½Ó¿Ú·µ»ØÖµ£¬³É¹¦·µ»Ø0

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static SINT32 vSIM_ReadWithNoReset(UINT32 dwStart, UINT32 dwLen, UINT8* to)

+{

+    SINT32 status = -1;

+    

+    gvSIM_InResume = TRUE;

+    status = zDrvNand_SimNvRead(dwStart, dwLen, to);

+    gvSIM_InResume = FALSE;

+

+    return status;

+}

+

+/**************************************************************************

+* º¯ÊýÃû³Æ£º vSIM_Check_Data

+* ¹¦ÄÜÃèÊö£º vSIMÊý¾Ý»Ö¸´Á÷³Ì

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØTRUE, ·ñÔò·µ»ØFALSE

+* ÆäËü˵Ã÷£º

+**************************************************************************/

+static BOOL vSIM_Check_Data(VOID)

+{

+    UINT8   index           = 0;

+    UINT8   WorkArea_Symbol = 0;

+    UINT8   BackUp_Symbol   = 0;

+    UINT8   Factory_Symbol  = 0;

+    UINT32  status          = ZOSS_ERROR;

+    SINT32  WorkArea_Status = -1;

+    SINT32  BackUp_Status   = -1;

+

+    status = vSIM_ReadWithNoReset(gpvSIM_Param->Factory_Area_Symbol_Addr, 1, &Factory_Symbol);

+    if(Factory_Symbol == VSIM_SYMBOL_MEM)

+    {

+        gvSIM_OP_MODE = VSIM_OP_MEM;

+        return TRUE;

+    }

+    

+    /* °æ±¾ÏÂÔØ */

+    if(Factory_Symbol == VSIM_SYMBOL_DOWNLOAD)

+    {

+        return (vSIM_Resume_Data(VSIM_WORK_AREA | VSIM_BACKUP_AREA) == ZOSS_SUCCESS) ? TRUE : FALSE;

+    }

+

+    /* ³ö³§Çøµôµç */

+    if(status != 0 || Factory_Symbol == VSIM_SYMBOL_WRITE)

+    {

+        vSIM_Fill_Factory();

+    }

+

+    /* ¶ÁÈ¡¹¤×÷ÇøºÍ±¸·ÝÇøÖеıê־λ */

+    WorkArea_Status = zDrvNand_SimNvRead(gpvSIM_Param->Work_Area_Symbol_Addr, 1, &WorkArea_Symbol);

+    BackUp_Status   = zDrvNand_SimNvRead(gpvSIM_Param->Backup_Area_Symbol_Addr, 1, &BackUp_Symbol);

+    if (WorkArea_Status == 0 && BackUp_Status == 0)

+    {

+        if (WorkArea_Symbol != VSIM_SYMBOL_NORMAL)

+        {

+            index = VSIM_WORK_AREA;

+        }

+

+        if (BackUp_Symbol != VSIM_SYMBOL_NORMAL)

+        {

+            index |= VSIM_BACKUP_AREA;

+        }

+

+        if (index != 0)

+        {

+            status = vSIM_Resume_Data(index);

+            if (status != ZOSS_SUCCESS)

+            {

+                return FALSE;

+            }

+        }

+    }

+    else if (WorkArea_Status == 0 && WorkArea_Symbol == VSIM_SYMBOL_NORMAL)

+    {

+        index  = VSIM_BACKUP_AREA;

+        status = vSIM_Resume_Data(index);

+        if (status != ZOSS_SUCCESS)

+        {

+            return FALSE;

+        }

+    }

+    else if (BackUp_Status == 0 && BackUp_Symbol == VSIM_SYMBOL_NORMAL)

+    {

+        index  = VSIM_WORK_AREA;

+        status = vSIM_Resume_Data(index);

+        if (status != ZOSS_SUCCESS)

+        {

+            return FALSE;

+        }  

+    }

+    else

+    {

+        index  = VSIM_WORK_AREA | VSIM_BACKUP_AREA;

+        status = vSIM_Resume_Data(index);

+        if (status != ZOSS_SUCCESS)

+        {

+            return FALSE;

+        }

+    }

+

+    return TRUE;

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/src/sup_vsim_agt.c b/cp/ps/plat/src/oss/sup/src/sup_vsim_agt.c
new file mode 100644
index 0000000..b9ce357
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/src/sup_vsim_agt.c
@@ -0,0 +1,215 @@
+/*******************************************************************************

+*

+*                  Copyright (c) 2012 ZTE Corporation.

+*

+********************************************************************************

+* Ä£ ¿é Ãû : P98_VSIM

+* ÎÄ ¼þ Ãû : vsim_icp.c

+* Ïà¹ØÎļþ : 

+* ʵÏÖ¹¦ÄÜ : vsimÊý¾Ý¹ÜÀí½Ó¿Ú

+* ×÷    Õß : ´ú¿µ

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2016-08-06

+* ÆäËü˵Ã÷ : 

+*******************************************************************************/

+

+/*******************************************************************************

+* #includeÇø

+*******************************************************************************/

+#include "oss_api.h"

+#include "drv_api.h"

+#include "drvs_rpmsg.h"

+#include "drvs_icp.h"

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+/*******************************************************************************

+* ºê¶¨ÒåÇø

+*******************************************************************************/

+#define VSIM_ICP_CHANNEL_SIZE    (1 * 1024)

+#define VSIM_ICP_CHANNEL         (VSIM)

+#define VSIM_ICP_MAX_SIZE        (5 * 1024)

+#define VSIM_ICP_MSG_HEADER_SIZE (16)

+#define VSIM_ICP_BUF_SIZE        (VSIM_ICP_MAX_SIZE-VSIM_ICP_MSG_HEADER_SIZE)

+

+/*******************************************************************************

+*                                Êý¾ÝÀàÐͶ¨Òå                                  *
+*******************************************************************************/

+

+typedef struct
+{

+    UINT32 addr;

+    UINT32 len;

+    CHAR   buf[VSIM_ICP_BUF_SIZE];

+} icp_msg_data_t;

+

+typedef struct

+{

+    unsigned long  cmd;

+    unsigned long  total;

+    icp_msg_data_t data;

+} icp_msg_t;

+

+enum
+{

+    VSIM_CMD_RECOVERY = 1,

+	VSIM_CMD_WRITE_FACTORY,

+	VSIM_CMD_WRITE_SPECIAL,

+};

+

+/*******************************************************************************

+* Íⲿº¯ÊýÉùÃ÷

+*******************************************************************************/

+

+

+/*******************************************************************************

+* ¾Ö²¿º¯ÊýÔ­ÐÍ

+*******************************************************************************/

+static UINT32 vsim_icp_buf[VSIM_ICP_MAX_SIZE / sizeof(UINT32)];

+

+/*******************************************************************************

+* È«¾Ö³£Á¿/±äÁ¿

+*******************************************************************************/

+

+

+/*******************************************************************************

+* ¾Ö²¿º¯ÊýʵÏÖ

+*******************************************************************************/

+

+/*******************************************************************************

+* º¯ÊýÃû³Æ£º vSIM_Resume_Data

+* ¹¦ÄÜÃèÊö£º »Ö¸´Êý¾Ý

+* ²ÎÊý˵Ã÷£º (IN)

+*                index: ÇøÓòË÷ÒýºÅ:

+*                index = VSIM_WORK_AREA:   »Ö¸´¹¤×÷Çø

+*                index = VSIM_BACKUP_AREA: »Ö¸´±¸·ÝÇø  

+*                index = VSIM_BOTH_AREA:   »Ö¸´¹¤×÷ÇøºÍ±¸·ÝÇø  

+*            (OUT)

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+*******************************************************************************/

+static VOID vsim_icp_read_blocked(SINT32 args)

+{

+    UINT32          ret   = ZOSS_ERROR;

+    CHAR            *pBuf = NULL;

+    CHAR            *pTmp = NULL;

+    UINT32           len  = 0;

+    icp_msg_t       *pMsg = NULL;    

+    T_ZDrvRpMsg_Msg msgRead;

+    T_ZDrvRpMsg_Msg msgWrite;

+

+    msgRead.actorID = ICP_MSG_ACTOR_A9;

+    msgRead.chID    = VSIM_ICP_CHANNEL;

+    msgRead.buf     = vsim_icp_buf;

+

+    msgWrite.actorID = ICP_MSG_ACTOR_A9;

+    msgWrite.chID    = VSIM_ICP_CHANNEL;

+

+    while(1)

+    {

+        ret = ZOSS_ERROR;

+        msgRead.flag = ~RPMSG_READ_POLL;

+        msgRead.len  = sizeof(vsim_icp_buf);

+

+        do

+        {

+            ret = zDrvRpMsg_Read(&msgRead);

+            if (ret == RPMSG_CHANNEL_INEXISTANCE)

+                break;

+            zOss_ASSERT(ret > 0);

+

+            pMsg = (icp_msg_t *)vsim_icp_buf;

+            if(pMsg->total)

+            {

+                if(!pBuf)

+                {

+                    pBuf = zOss_Malloc(pMsg->total);

+                    if (pBuf == NULL)

+                        zOss_ASSERT(pBuf != NULL);

+

+                    pTmp = pBuf;

+                    len = pMsg->total;

+                }

+                zOss_Memcpy(pTmp, pMsg->data.buf, pMsg->data.len);

+                pTmp += pMsg->data.len;

+                len -= pMsg->data.len;

+

+                msgWrite.buf = &ret;

+                ret = 0;

+                msgWrite.flag = RPMSG_WRITE_INT;

+                msgWrite.len = sizeof(ret);

+                ret = zDrvRpMsg_Write(&msgWrite);

+                zOss_ASSERT(ret > 0);

+            }

+        }while(len > 0);

+

+        if (ret == RPMSG_CHANNEL_INEXISTANCE)

+            continue;

+

+        switch (pMsg->cmd)

+        {

+            case VSIM_CMD_RECOVERY:

+                ret = zOss_vSIMRecovery();

+                break;

+

+            case VSIM_CMD_WRITE_FACTORY:                    

+                ret = zOss_vSIMFacWrite((VOID *)pBuf, pMsg->total);

+                ret = 0;

+                break;

+

+            case VSIM_CMD_WRITE_SPECIAL:

+                ret = zOss_vSIMDataWrite(pMsg->data.addr, (VOID *)pBuf, pMsg->total);

+                ret = 0;

+                break;

+

+            default:

+                break;

+        }

+

+        if (pBuf != NULL)

+        {

+            zOss_Free(pBuf);

+            pBuf = NULL;

+        }

+

+        msgWrite.buf = &ret;

+        msgWrite.flag = RPMSG_WRITE_INT;

+        msgWrite.len = sizeof(ret);

+        ret = zDrvRpMsg_Write(&msgWrite);

+        zOss_ASSERT(ret > 0);

+

+        zOss_Memset(vsim_icp_buf, 0, VSIM_ICP_MAX_SIZE);

+    }

+}

+

+

+/*******************************************************************************

+* È«¾Öº¯ÊýʵÏÖ

+*******************************************************************************/

+/*******************************************************************************

+* º¯ÊýÃû³Æ£º zOss_vSIMAgtInit

+* ¹¦ÄÜÃèÊö£º VSIM´úÀí³õʼ»¯

+* ²ÎÊý˵Ã÷£º 

+* ·µ »Ø Öµ£º ³É¹¦·µ»ØZOSS_SUCCESS, ·ñÔò·µ»ØZOSS_ERROR

+* ÆäËü˵Ã÷£º

+*******************************************************************************/

+VOID zOss_vSIMAgtInit(VOID)

+{

+    SINT32         ret;

+    ZOSS_THREAD_ID threadID;

+    

+    ret = zDrvRpMsg_CreateChannel(ICP_MSG_ACTOR_A9, VSIM_ICP_CHANNEL, VSIM_ICP_CHANNEL_SIZE);

+    zOss_ASSERT(ret == DRV_SUCCESS);

+

+

+    threadID = zOss_CreateThread("vsim_icp_read_thread", vsim_icp_read_blocked, 0, 4 * 1024, 25, 1, 1);

+    zOss_ASSERT(threadID != NULL);

+}

+

+#ifdef __cplusplus

+}

+#endif

+

diff --git a/cp/ps/plat/src/oss/sup/ws/makefile b/cp/ps/plat/src/oss/sup/ws/makefile
new file mode 100644
index 0000000..4c9e1f0
--- /dev/null
+++ b/cp/ps/plat/src/oss/sup/ws/makefile
@@ -0,0 +1,48 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: Makefile

+#* ÄÚÈÝÕªÒª: ±àÒë×Óϵͳsup

+#* ʹÓ÷½·¨:     

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2013/01/01      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+include $(PRJ_PATH)/config/project.mk

+

+#===============================================================================

+#·¾¶ÉèÖÃ

+#===============================================================================

+_SUBSYS_NAME = plat_sup

+

+_SUBSYS_LIB_PATH = $(PLAT_LIB_INTERNAL_PATH)

+

+_ALL_MDLS = 

+_ALL_OBJECTS = 

+

+MDL_PATH = $(PLAT_PATH)/src/oss/sup/src

+

+#===============================================================================

+#SUPÄ£¿é

+#===============================================================================

+sup:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(MDL_PATH)

+supclean:

+	@$(GNUMAKE) --no-print-directory  $(MAKEOPTS) -C $(MDL_PATH) clean

+

+_ALL_MDLS += sup 

+_ALL_OBJECTS += $(wildcard $(OBJ_PATH)/plat/oss/sup/*.o) 

+

+ifeq ($(USE_VDD),yes)

+_ALL_OBJECTS += $(wildcard $(OBJ_PATH)/plat/drv/vdd/*.o)

+endif

+

+#===============================================================================

+# ±àÒë¹æÔò

+#===============================================================================

+include $(FRAME_PATH)/rules/lib_rules.mk

+

diff --git a/cp/ps/plat/src/oss/ws/Makefile b/cp/ps/plat/src/oss/ws/Makefile
new file mode 100644
index 0000000..e50735f
--- /dev/null
+++ b/cp/ps/plat/src/oss/ws/Makefile
@@ -0,0 +1,110 @@
+# /*****************************************************************************

+#* °æÈ¨ËùÓÐ(C) 2013 ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾

+#* 

+#* ÎļþÃû³Æ: Makefile

+#* Îļþ±êʶ: oss_mk

+#* ÄÚÈÝÕªÒª: ±àÒëOSS×Óϵͳ

+#* ʹÓ÷½·¨:     

+#* 

+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç       ÐÞ¸ÄÈË        ÐÞ¸ÄÄÚÈÝ

+#* -----------------------------------------------------------------------------

+#* 2013/01/01      V1.0        001            P98G          ´´½¨

+#* 

+# *****************************************************************************/

+

+include $(PRJ_PATH)/config/project.mk

+

+.PHONY :

+lib: oss

+clean: ossclean

+

+ifeq ($(OSTYPE),ose)

+OSS_MODS += osa_ose_lib

+OSS_MODS_CLEAN += osa_ose_libclean

+LIB_TO_WARP += $(PLAT_LIB_INTERNAL_PATH)/plat_osa_ose.a

+endif

+

+ifeq ($(OSTYPE),tos)

+OSS_MODS += osa_tos_lib

+OSS_MODS_CLEAN += osa_tos_libclean

+LIB_TO_WARP += $(PLAT_LIB_INTERNAL_PATH)/plat_osa_tos.a

+endif

+

+ifeq ($(OSTYPE),linux)

+OSS_MODS += osa_linux_lib

+OSS_MODS_CLEAN += osa_linux_libclean

+LIB_TO_WARP += $(PLAT_LIB_INTERNAL_PATH)/plat_osa_linux.a

+OBJ_TO_WARP += $(PLAT_LIB_INTERNAL_PATH)/plat_osa_linux-builtin.o

+endif

+

+OSS_MODS += sup

+OSS_MODS_CLEAN += supclean

+LIB_TO_WARP += $(PLAT_LIB_INTERNAL_PATH)/plat_sup.a

+OBJ_TO_WARP += $(PLAT_LIB_INTERNAL_PATH)/plat_sup-builtin.o

+

+ifneq ($(USE_OSS_MIN), yes)

+ifeq ($(USE_PSM), yes)

+OSS_MODS += psm

+OSS_MODS_CLEAN += psmclean

+LIB_TO_WARP += $(PLAT_LIB_INTERNAL_PATH)/plat_psm.a

+OBJ_TO_WARP += $(PLAT_LIB_INTERNAL_PATH)/plat_psm-builtin.o

+endif

+endif

+

+oss: $(OSS_MODS) wraplib

+ossclean: $(OSS_MODS_CLEAN) wraplibclean

+

+#===============================================================================

+#	osa Lib Compile

+#===============================================================================

+#ose

+OSA_OSE_PATH = $(PLAT_PATH)/src/oss/osa/ose

+osa_ose_lib:

+	@$(GNUMAKE) --no-print-directory -C $(OSA_OSE_PATH)/ws lib

+osa_ose_libclean:

+	@$(GNUMAKE) --no-print-directory -C $(OSA_OSE_PATH)/ws clean

+

+#tos

+OSA_TOS_PATH = $(PLAT_PATH)/src/oss/osa/tos

+osa_tos_lib:

+	@$(GNUMAKE) --no-print-directory -C $(OSA_TOS_PATH)/ws lib

+osa_tos_libclean:

+	@$(GNUMAKE) --no-print-directory -C $(OSA_TOS_PATH)/ws clean

+

+#linux

+OSA_LINUX_PATH = $(PLAT_PATH)/src/oss/osa/linux

+osa_linux_lib:

+	@$(GNUMAKE) --no-print-directory -C $(OSA_LINUX_PATH)/ws lib

+osa_linux_libclean:

+	@$(GNUMAKE) --no-print-directory -C $(OSA_LINUX_PATH)/ws clean

+

+#===============================================================================

+#	sup Lib Compile

+#===============================================================================

+SUP_PATH = $(PLAT_PATH)/src/oss/sup

+sup:

+	@$(GNUMAKE) --no-print-directory -C $(SUP_PATH)/ws lib

+supclean:

+	@$(GNUMAKE) --no-print-directory -C $(SUP_PATH)/ws clean

+

+#===============================================================================

+#	psm Lib Compile

+#===============================================================================

+PSM_PATH = $(PLAT_PATH)/src/oss/psm

+psm:

+	@$(GNUMAKE) --no-print-directory -C $(PSM_PATH)/ws lib

+psmclean:

+	@$(GNUMAKE) --no-print-directory -C $(PSM_PATH)/ws clean

+

+#===============================================================================

+#´ò°ü×ÓÄ£¿éµÄ.a¿â

+#===============================================================================

+wraplib:

+ifeq ($(USE_ENABLE_LTO),yes)

+	@$(COPY) --force $(OBJ_TO_WARP) $(PLAT_LIB_EXTERNAL_PATH)

+else

+	@$(COPY) --force $(LIB_TO_WARP) $(PLAT_LIB_EXTERNAL_PATH)

+endif

+

+wraplibclean:

+	@$(RM) -rf $(PLAT_LIB_INTERNAL_PATH)