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,§orSize);
+ 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, ¶m);
+ 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, ¶m);
+
+ 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, ¶m);
+
+ 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, ¶m);
+
+ 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, ¶m);
+
+ 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 *)®ion_start, (cyg_uint32 *)®ion_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 *)§or_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(®Dump);
+
+ 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)®Dump);
+ }
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ: 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, ®ion_start, ®ion_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,§orSize);
+ 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 *)®ion_start, (cyg_uint32 *)®ion_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(×leep);
+}
+#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(×leep);
+}
+#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(×leep);
+}
+#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; /* µ÷¶ÈÏ̵߳ǼDZí */
+
+/**************************************************************************
+* º¯ÊýÉùÃ÷Çø
+**************************************************************************/
+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(®ionInfo);
+ }
+ }
+}
+#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(®ionInfo);
+ }
+ }
+}
+#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 *)®ionStart, (cyg_uint32 *)®ionEnd);
+ 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, ®ionStart, ®ionEnd);
+ 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(®ionInfo);
+#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)