From b20978afef9aeac60c217b7d4ba02a87b8b95296 Mon Sep 17 00:00:00 2001 From: Kibum Kim Date: Mon, 27 Feb 2012 21:16:23 +0900 Subject: [PATCH 1/1] tizen beta release --- AUTHORS | 2 + CMakeLists.txt | 37 +++ LICENSE | 204 ++++++++++++++++ SLP_pm_PG.h | 141 +++++++++++ TC/build.sh | 20 ++ TC/execute.sh | 19 ++ TC/tet_code | 12 + TC/tet_scen | 7 + TC/tetbuild.cfg | 3 + TC/tetclean.cfg | 2 + TC/tetexec.cfg | 1 + TC/unit/Makefile | 24 ++ TC/unit/tc_gen.sh | 28 +++ TC/unit/tslist | 3 + TC/unit/utc_MODULE_API_func.c.in | 64 +++++ TC/unit/utc_SystemFW_pm_change_state_func.c | 63 +++++ TC/unit/utc_SystemFW_pm_lock_state_func.c | 65 +++++ TC/unit/utc_SystemFW_pm_unlock_state_func.c | 72 ++++++ debian/changelog | 364 ++++++++++++++++++++++++++++ debian/compat | 1 + debian/control | 28 +++ debian/dirs | 2 + debian/docs | 1 + debian/libslp-pm-0.install.in | 1 + debian/libslp-pm-dev.install.in | 2 + debian/rules | 128 ++++++++++ image/SLP_pm_PG_architecture.png | Bin 0 -> 15990 bytes image/SLP_pm_PG_state_diagram.png | Bin 0 -> 50427 bytes packaging/libslp-pm.spec | 68 ++++++ pm.c | 134 ++++++++++ pm.h | 38 +++ pmapi.h | 197 +++++++++++++++ pmapi.pc.in | 13 + 33 files changed, 1744 insertions(+) create mode 100644 AUTHORS create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 SLP_pm_PG.h create mode 100755 TC/build.sh create mode 100755 TC/execute.sh create mode 100755 TC/tet_code create mode 100755 TC/tet_scen create mode 100755 TC/tetbuild.cfg create mode 100755 TC/tetclean.cfg create mode 100755 TC/tetexec.cfg create mode 100644 TC/unit/Makefile create mode 100755 TC/unit/tc_gen.sh create mode 100644 TC/unit/tslist create mode 100644 TC/unit/utc_MODULE_API_func.c.in create mode 100644 TC/unit/utc_SystemFW_pm_change_state_func.c create mode 100644 TC/unit/utc_SystemFW_pm_lock_state_func.c create mode 100644 TC/unit/utc_SystemFW_pm_unlock_state_func.c create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/dirs create mode 100644 debian/docs create mode 100644 debian/libslp-pm-0.install.in create mode 100644 debian/libslp-pm-dev.install.in create mode 100755 debian/rules create mode 100755 image/SLP_pm_PG_architecture.png create mode 100755 image/SLP_pm_PG_state_diagram.png create mode 100644 packaging/libslp-pm.spec create mode 100644 pm.c create mode 100644 pm.h create mode 100644 pmapi.h create mode 100644 pmapi.pc.in diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..67e6bd9 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Jinkun Jang +DongGi Jang diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..0875ff4 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,37 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(pmapi C) + + +SET(SRCS pm.c) +SET(HEADERS pmapi.h SLP_pm_PG.h) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(EXEC_PREFIX "\${prefix}") +SET(LIBDIR "\${prefix}/lib") +SET(INCLUDEDIR "\${prefix}/include") +SET(VERSION 1.2) + +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}) + +FOREACH(flag ${pkg_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkg_LDFLAGS}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${VERSION}) + +CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION lib COMPONENT RuntimeLibraries) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION lib/pkgconfig) + +FOREACH(hfile ${HEADERS}) + INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${hfile} DESTINATION include) +ENDFOREACH(hfile) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9c13a9b --- /dev/null +++ b/LICENSE @@ -0,0 +1,204 @@ +Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/SLP_pm_PG.h b/SLP_pm_PG.h new file mode 100644 index 0000000..2dfd57c --- /dev/null +++ b/SLP_pm_PG.h @@ -0,0 +1,141 @@ +/* + * libslp-pm + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: DongGi Jang + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +/** + * + * @ingroup SLP_PG + * @defgroup SLP_PG_PM Power Manager + * @{ + +

Introduction

+ +

Purpose

+The purpose of this document is to describe how applications can use Power Manager APIs to save system power consumption. +This document gives programming guidelines to application engineers. + +

Scope

+The scope of this document is limited to Power Manager API usage. + +
+

Power Manager Architecture

+The Power Manager (PM) consists of a client API library and a Power Manager daemon. + +

Power Manager Architecture

+@image html SLP_pm_PG_architecture.png +
+Power Manager daemon controls a kernel power management module and peripheral device drivers to save system power consumption. +It manages the system power states and makes state transitions according to the events.
+There are four power states ? Normal (i.e. LCD on), LCD dimming, LCD off and Sleep. + +

Power Manager State Diagram

+@image html SLP_pm_PG_state_diagram.png + +Applications can put conditions on specific state transitions. For example, Video Player applications do not want the Power Manager +to allow the LCD to be in a dimming state or to turn off the LCD backlight. +For this purpose, Video Player applications can use Power Manager APIs to send the condition to Power Manager. + +

Power Manager Features

+- There are four power states, Normal(i.e. LCD on), LCD dimming, LCD off and Sleep. +- If there is no user input for a certain time, PM changes the state of PM to a state that has lower power consumption. +- When user input or another system interrupt occurs, PM rolls the state back immediately. +- However, some applications may want PM not to change the state, for example music players that do not want to suspend, +can sustain PM in the state required by using the pm_lock_power_state() API. + +

Power Manager Funtions

+ +

Power Manager API Introduction

+API : pm_lock_state +
Parameter In : unsigned int state, unsigned int flag, unsigned int timeout +
Return : int +
Functionality : This API is used to lock a particular power-state as the current power-state.
+The parameter state specifies the power state which you want to lock LCD_NORMAL, LCD_DIM, LCD_OFF. \n +The second parameter Flag is set if you want to go the requested lock state directly.\n +The third parameter timeout specifies lock-timeout in milliseconds. +If the value 0 is selected, the power state remains locked until pm_unlock_state is called.
+This function returns 0 on success and a negative value (-1) on failure. +

+API : pm_unlock_state +
Parameter In : unsigned int state, unsigned int flag +
Return : int +
Functionality : This API is used to Unlock the power state.
+The parameter state specifies the power state which you want to unlock .Some examples are LCD_NORMAL, LCD_DIM, LCD_OFF.
+The second parameter flag is set if you want to go to the requested state directly after unlocking.
+PM_SLEEP_MARGIN - If the current status is lcd off, power-manager reset timer to 5 second. If the current status is not lcd off, power-manager uses the existing timer.
+PM_RESET_TIMER - Power-manager resets timer. (lcd normal : reset timer to predfined value which is set in setting module, lcd dim or off : reset timer to 5 seconds)
+PM_KEEP_TIMER - Power-manager uses the existing timer (if timer is already expired, pwoer-manager changes the status)
+This is valid only when the current state transition was blocked by the locking and this function call releases the blocking.
+This function returns 0 on success and a negative value (-1) on failure. +

+API : pm_change_state +
Parameter In : unsigned int (power state) +
Return : int +
Functionality : This API is used to change the power manager state by force.
+This function returns 0 on success, -1 if failed. + +Power state: +@code +// POWER STATES +#define LCD_NORMAL 0x1 // NORMAL state +#define LCD_DIM 0x2 // LCD dimming state +#define LCD_OFF 0x4 // LCD off state +#define SUSPEND 0x8 // Sleep state +@endcode + +

Sample Code

+@code +#include +int main() +{ + int result; + + // Lock current state as LCD_NORMAL + result = pm_lock_state(LCD_NORMAL, GOTO_STATE_NOW, 0); + if( result < 0 ) { + printf("[ERROR] return value result =%d, \n",result); + } + else + printf("[SUCCESS]return value result =%d \n",result); + + // Do something here + + //Un-lock NORMAL state so that power state change can occur with system-events + + result = pm_unlock_state(LCD_NORMAL, PM_RESET_TIMER); + if( result < 0 ) { + printf("[ERROR] return value result =%d, \n",result); + } + else + printf("[SUCCESS]return value result =%d \n",result); + + // change the state into LCD ON + result = pm_change_state(LCD_NORMAL); + if( result < 0 ) + printf("[ERROR] return value result =%d, \n",result); + else + printf("[SUCCESS]return value result =%d \n",result); + + return 0; +} +@endcode + + @} +**/ diff --git a/TC/build.sh b/TC/build.sh new file mode 100755 index 0000000..98ebeff --- /dev/null +++ b/TC/build.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +export TET_INSTALL_PATH=/scratchbox/tetware # local tetware path +export TET_TARGET_PATH=$TET_INSTALL_PATH/tetware-target +export PATH=$TET_TARGET_PATH/bin:$PATH +export LD_LIBRARY_PATH=$TET_TARGET_PATH/lib/tet3:$LD_LIBRARY_PATH +export TET_ROOT=$TET_TARGET_PATH + +export TET_SUITE_ROOT=`pwd` +FILE_NAME_EXTENSION=`date +%s` + +RESULT_DIR=results +HTML_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.html +JOURNAL_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.journal + +mkdir -p $RESULT_DIR + +tcc -c -p ./ +tcc -b -j $JOURNAL_RESULT -p ./ +grw -c 3 -f chtml -o $HTML_RESULT $JOURNAL_RESULT diff --git a/TC/execute.sh b/TC/execute.sh new file mode 100755 index 0000000..6720da0 --- /dev/null +++ b/TC/execute.sh @@ -0,0 +1,19 @@ +#!/bin/sh +export TET_INSTALL_PATH=/mnt/nfs/tetware +export TET_TARGET_PATH=$TET_INSTALL_PATH/tetware-target +export PATH=$TET_TARGET_PATH/bin:$PATH +export LD_LIBRARY_PATH=$TET_TARGET_PATH/lib/tet3:$LD_LIBRARY_PATH + +export TET_ROOT=$TET_TARGET_PATH + +export TET_SUITE_ROOT=`pwd` +FILE_NAME_EXTENSION=`date +%s` + +RESULT_DIR=results +HTML_RESULT=$RESULT_DIR/exec-tar-result-$FILE_NAME_EXTENSION.html +JOURNAL_RESULT=$RESULT_DIR/exec-tar-result-$FILE_NAME_EXTENSION.journal + +mkdir -p $RESULT_DIR + +tcc -e -j $JOURNAL_RESULT -p ./ +grw -c 3 -f chtml -o $HTML_RESULT $JOURNAL_RESULT diff --git a/TC/tet_code b/TC/tet_code new file mode 100755 index 0000000..a2cf6c1 --- /dev/null +++ b/TC/tet_code @@ -0,0 +1,12 @@ +# TET reserved codes +0 "PASS" +1 "FAIL" +2 "UNRESOLVED" +3 "NOTINUSE" +4 "UNSUPPORTED" +5 "UNTESTED" +6 "UNINITIATED" +7 "NORESULT" + +# Test suite additional codes +33 "INSPECT" diff --git a/TC/tet_scen b/TC/tet_scen new file mode 100755 index 0000000..43cbc9b --- /dev/null +++ b/TC/tet_scen @@ -0,0 +1,7 @@ +all + ^TEST +##### Scenarios for TEST ##### + +# Test scenario +TEST + :include:/unit/tslist diff --git a/TC/tetbuild.cfg b/TC/tetbuild.cfg new file mode 100755 index 0000000..6192c78 --- /dev/null +++ b/TC/tetbuild.cfg @@ -0,0 +1,3 @@ +TET_OUTPUT_CAPTURE=False +TET_BUILD_TOOL=make +TET_PASS_TC_NAME=True diff --git a/TC/tetclean.cfg b/TC/tetclean.cfg new file mode 100755 index 0000000..c66eda4 --- /dev/null +++ b/TC/tetclean.cfg @@ -0,0 +1,2 @@ +TET_OUTPUT_CAPTURE=False +TET_CLEAN_TOOL=make clean diff --git a/TC/tetexec.cfg b/TC/tetexec.cfg new file mode 100755 index 0000000..0d9d39a --- /dev/null +++ b/TC/tetexec.cfg @@ -0,0 +1 @@ +TET_OUTPUT_CAPTURE=False diff --git a/TC/unit/Makefile b/TC/unit/Makefile new file mode 100644 index 0000000..8474034 --- /dev/null +++ b/TC/unit/Makefile @@ -0,0 +1,24 @@ +CC ?= gcc + +TARGETS = utc_SystemFW_pm_change_state_func \ + utc_SystemFW_pm_lock_state_func \ + utc_SystemFW_pm_unlock_state_func \ + +PKGS = pmapi + +LDFLAGS = `pkg-config --libs $(PKGS)` +LDFLAGS += $(TET_ROOT)/lib/tet3/tcm_s.o +LDFLAGS += -L$(TET_ROOT)/lib/tet3 -ltcm_s +LDFLAGS += -L$(TET_ROOT)/lib/tet3 -lapi_s + +CFLAGS = -I. `pkg-config --cflags $(PKGS)` +CFLAGS += -I$(TET_ROOT)/inc/tet3 +CFLAGS += -Wall + +all: $(TARGETS) + +$(TARGETS): %: %.c + $(CC) -o $@ $< $(CFLAGS) $(LDFLAGS) + +clean: + rm -f $(TARGETS) diff --git a/TC/unit/tc_gen.sh b/TC/unit/tc_gen.sh new file mode 100755 index 0000000..54f482d --- /dev/null +++ b/TC/unit/tc_gen.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +TMPSTR=$0 +SCRIPT=${TMPSTR##*/} + +if [ $# -lt 2 ]; then + echo "Usage) $SCRIPT module_name api_name" + exit 1 +fi + +MODULE=$1 +API=$2 +TEMPLATE=utc_MODULE_API_func.c.in +TESTCASE=utc_${MODULE}_${API}_func + +sed -e ' + s^@API@^'"$API"'^g + s^@MODULE@^'"$MODULE"'^g + ' $TEMPLATE > $TESTCASE.c + +if [ ! -e "$TESTCASE.c" ]; then + echo "Failed" + exit 1 +fi +echo "Testcase file is $TESTCASE.c" +echo "Done" +echo "please put \"$TESTCASE\" as Target in Makefile" +echo "please put \"/unit/$TESTCASE\" in tslist" diff --git a/TC/unit/tslist b/TC/unit/tslist new file mode 100644 index 0000000..4b93156 --- /dev/null +++ b/TC/unit/tslist @@ -0,0 +1,3 @@ +/unit/utc_SystemFW_pm_change_state_func +/unit/utc_SystemFW_pm_lock_state_func +/unit/utc_SystemFW_pm_unlock_state_func diff --git a/TC/unit/utc_MODULE_API_func.c.in b/TC/unit/utc_MODULE_API_func.c.in new file mode 100644 index 0000000..b235fa3 --- /dev/null +++ b/TC/unit/utc_MODULE_API_func.c.in @@ -0,0 +1,64 @@ +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup)(void) = startup; +void (*tet_cleanup)(void) = cleanup; + +static void utc_@MODULE@_@API@_func_01(void); +static void utc_@MODULE@_@API@_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_@MODULE@_@API@_func_01, POSITIVE_TC_IDX }, + { utc_@MODULE@_@API@_func_02, NEGATIVE_TC_IDX }, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of @API@() + */ +static void utc_@MODULE@_@API@_func_01(void) +{ + int r = 0; + +/* + r = @API@(...); +*/ + if (r) { + tet_infoline("@API@() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of ug_init @API@() + */ +static void utc_@MODULE@_@API@_func_02(void) +{ + int r = 0; + +/* + r = @API@(...); +*/ + if (r) { + tet_infoline("@API@() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_SystemFW_pm_change_state_func.c b/TC/unit/utc_SystemFW_pm_change_state_func.c new file mode 100644 index 0000000..ebdcedc --- /dev/null +++ b/TC/unit/utc_SystemFW_pm_change_state_func.c @@ -0,0 +1,63 @@ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup)(void) = startup; +void (*tet_cleanup)(void) = cleanup; + +static void utc_SystemFW_pm_change_state_func_01(void); +static void utc_SystemFW_pm_change_state_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_SystemFW_pm_change_state_func_01, POSITIVE_TC_IDX }, + { utc_SystemFW_pm_change_state_func_02, NEGATIVE_TC_IDX }, + { NULL, 0 }, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of pm_change_state() + */ +static void utc_SystemFW_pm_change_state_func_01(void) +{ + int ret_val = 0; + + ret_val = pm_change_state(LCD_NORMAL); + if(ret_val < 0) { + tet_infoline("pm_change_state() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of ug_init pm_change_state() + */ +static void utc_SystemFW_pm_change_state_func_02(void) +{ + int r = 0; + + r = pm_change_state(-1); + + if (r>=0) { + tet_infoline("pm_change_state() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_SystemFW_pm_lock_state_func.c b/TC/unit/utc_SystemFW_pm_lock_state_func.c new file mode 100644 index 0000000..cdf5edf --- /dev/null +++ b/TC/unit/utc_SystemFW_pm_lock_state_func.c @@ -0,0 +1,65 @@ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup)(void) = startup; +void (*tet_cleanup)(void) = cleanup; + +static void utc_SystemFW_pm_lock_state_func_01(void); +static void utc_SystemFW_pm_lock_state_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_SystemFW_pm_lock_state_func_01, POSITIVE_TC_IDX }, + { utc_SystemFW_pm_lock_state_func_02, NEGATIVE_TC_IDX }, + { NULL, 0 }, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of pm_lock_state() + */ +static void utc_SystemFW_pm_lock_state_func_01(void) +{ + int ret_val = 0; + + //Lock State as LCD_DIM for infinite time + ret_val = pm_lock_state(LCD_DIM, GOTO_STATE_NOW, 0); + pm_unlock_state (LCD_DIM ,GOTO_STATE_NOW); + if(ret_val < 0) { + tet_infoline("pm_lock_state() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of ug_init pm_lock_state() + */ +static void utc_SystemFW_pm_lock_state_func_02(void) +{ + int r = 0; + + r = pm_lock_state(-1, GOTO_STATE_NOW, 0); + + if (r>=0) { + tet_infoline("pm_lock_state() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} diff --git a/TC/unit/utc_SystemFW_pm_unlock_state_func.c b/TC/unit/utc_SystemFW_pm_unlock_state_func.c new file mode 100644 index 0000000..3dc187a --- /dev/null +++ b/TC/unit/utc_SystemFW_pm_unlock_state_func.c @@ -0,0 +1,72 @@ +#include +#include + +static void startup(void); +static void cleanup(void); + +void (*tet_startup)(void) = startup; +void (*tet_cleanup)(void) = cleanup; + +static void utc_SystemFW_pm_unlock_state_func_01(void); +static void utc_SystemFW_pm_unlock_state_func_02(void); + +enum { + POSITIVE_TC_IDX = 0x01, + NEGATIVE_TC_IDX, +}; + +struct tet_testlist tet_testlist[] = { + { utc_SystemFW_pm_unlock_state_func_01, POSITIVE_TC_IDX }, + { utc_SystemFW_pm_unlock_state_func_02, NEGATIVE_TC_IDX }, + { NULL, 0 }, +}; + +static void startup(void) +{ +} + +static void cleanup(void) +{ +} + +/** + * @brief Positive test case of pm_unlock_state() + */ +static void utc_SystemFW_pm_unlock_state_func_01(void) +{ + int ret_val = 0; + + //Lock State as LCD_DIM for infinite time + ret_val = pm_lock_state(LCD_DIM, GOTO_STATE_NOW, 0); + if(ret_val < 0) + { + tet_infoline("\nSystem Fwk : call to pm_lock_state for unlock failed \n"); + } + + + //Unlock previously locked state + ret_val = pm_unlock_state(LCD_DIM,GOTO_STATE_NOW); + if(ret_val < 0) { + tet_infoline("pm_unlock_state() failed in positive test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} + +/** + * @brief Negative test case of ug_init pm_unlock_state() + */ +static void utc_SystemFW_pm_unlock_state_func_02(void) +{ + int r = 0; + + r = pm_unlock_state(-1 ,GOTO_STATE_NOW); + + if (r>=0) { + tet_infoline("pm_unlock_state() failed in negative test case"); + tet_result(TET_FAIL); + return; + } + tet_result(TET_PASS); +} diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..b1d608f --- /dev/null +++ b/debian/changelog @@ -0,0 +1,364 @@ +libslp-pm (1.2.4-20) unstable; urgency=low + + * source clean up (remove unnecessary comments, and so on) + * Git: 165.213.180.234:slp/pkgs/l/libslp-pm + * Tag: libslp-pm_1.2.4-20 + + -- Jinkun Jang Tue, 06 Dec 2011 16:39:27 +0900 + +libslp-pm (1.2.4-19) unstable; urgency=low + + * remove unnecessary API for DVFS (move DVFS APIs to system-server) + * change boiler plate + * Git: 165.213.180.234:slp/pkgs/l/libslp-pm + * Tag: libslp-pm_1.2.4-19 + + -- Jinkun Jang Mon, 05 Dec 2011 12:29:27 +0900 + +libslp-pm (1.2.4-18) unstable; urgency=low + + * Modify Makefile of TC units + * Git: 165.213.180.234:slp/pkgs/l/libslp-pm + * Tag: libslp-pm_1.2.4-18 + + -- DongGi Jang Thu, 06 Oct 2011 13:29:27 +0900 + +libslp-pm (1.2.4-17) unstable; urgency=low + + * code cleaup(indent) + * Git: 165.213.180.234:slp/pkgs/l/libslp-pm + * Tag: libslp-pm_1.2.4-17 + + -- Jinkun.Jang Tue, 02 Jul 2011 12:18:08 +0900 + +libslp-pm (1.2.4-16) unstable; urgency=low + + * add new defined values for pm_unlock_state() + * Git: 165.213.180.234:slp/pkgs/l/libslp-pm + * Tag: libslp-pm_1.2.4-16 + + -- Jinkun.Jang Wed, 02 Mar 2011 12:18:08 +0900 + +libslp-pm (1.2.4-15) unstable; urgency=low + + * update TC + * Git: 165.213.180.234:slp/pkgs/l/libslp-pm + * Tag: libslp-pm_1.2.4-15 + + -- Jinkun.Jang Tue, 04 Jan 2011 16:48:08 +0900 + +libslp-pm (1.2.4-14) unstable; urgency=low + + * update TC + * Git: 165.213.180.234:slp/pkgs/l/libslp-pm + * Tag: libslp-pm_1.2.4-14 + + -- Jinkun.Jang Tue, 21 Dec 2010 20:48:08 +0900 + +libslp-pm (1.2.4-13) unstable; urgency=low + + * add checking parameter + * Git: 165.213.180.234:slp/pkgs/l/libslp-pm + * Tag: libslp-pm_1.2.4-13 + + -- Jinkun.Jang Wed, 08 Dec 2010 20:48:08 +0900 + +libslp-pm (1.2.4-12) unstable; urgency=low + + * update TC + * Git: 165.213.180.234:/git/slp/pkgs/libslp-pm + * Tag: libslp-pm_1.2.4-12 + + -- Jinkun Jang Thu, 02 Dec 2010 10:26:27 +0900 + +libslp-pm (1.2.4-11) unstable; urgency=low + + * update PG + * Git: 165.213.180.234:/git/slp/pkgs/libslp-pm + * Tag: libslp-pm_1.2.4-11 + + -- Jinkun Jang Thu, 18 Nov 2010 15:51:59 +0900 + +libslp-pm (1.2.4-10) unstable; urgency=low + + * add power off state same with sleep + * Git: 165.213.180.234:/git/slp/pkgs/libslp-pm + * Tag: libslp-pm_1.2.4-10 + + -- Jinkun Jang Wed, 03 Nov 2010 19:26:01 +0900 + +libslp-pm (1.2.4-9) unstable; urgency=low + + * add copyright + * Git: 165.213.180.234:/git/slp/pkgs/libslp-pm + * Tag: libslp-pm_1.2.4-9 + + -- Jinkun Jang Wed, 27 Oct 2010 13:52:42 +0900 + +libslp-pm (1.2.4-8) unstable; urgency=low + + * add programming guide + * Git: 165.213.180.234:/git/slp/pkgs/libslp-pm + * Tag: libslp-pm_1.2.4-8 + + -- Jinkun Jang Wed, 13 Oct 2010 15:47:22 +0900 + +libslp-pm (1.2.4-7) unstable; urgency=low + + * add TC + * Git: 165.213.180.234:/git/slp/pkgs/libslp-pm + * Tag: libslp-pm_1.2.4-7 + + -- Jinkun Jang Tue, 05 Oct 2010 23:23:48 +0900 + +libslp-pm (1.2.4-6) unstable; urgency=low + + * update doxigen for pm_unlock_state() + * Git: 165.213.180.234:/git/slp/pkgs/libslp-pm + * Tag: libslp-pm_1.2.4-6 + + -- Jinkun Jang Mon, 13 Sep 2010 11:59:24 +0900 + +libslp-pm (1.2.4-5) unstable; urgency=low + + * modify header files for doxygen + * Git: 165.213.180.234:/git/slp/pkgs/libslp-pm + * Tag: libslp-pm_1.2.4-5 + + -- Jinkun Jang Wed, 01 Sep 2010 17:03:03 +0900 + +libslp-pm (1.2.4-4) unstable; urgency=low + + * change maintainer + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/libslp-pm-0 + * Tag: libslp-pm_1.2.4-4 + + -- Jinkun Jang Thu, 08 Jul 2010 15:45:06 +0900 + +libslp-pm (1.2.4-3) unstable; urgency=low + + * add get/attach/detach function on pm state (changed) + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/libslp-pm-0 + * Tag: libslp-pm_1.2.4-3 + + -- Wonil Choi Thu, 24 Jun 2010 20:39:49 +0900 + +libslp-pm (1.2.4-2) unstable; urgency=low + + * change printing logs + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/libslp-pm-0 + * Tag: libslp-pm_1.2.4-2 + + -- Wonil Choi Tue, 15 Jun 2010 21:05:51 +0900 + +libslp-pm (1.2.4-1) unstable; urgency=low + + * remove deprecated APIs + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/libslp-pm-0 + * Tag: libslp-pm_1.2.4-1 + + -- Wonil Choi Thu, 03 Jun 2010 19:58:26 +0900 + +libslp-pm (1.2.3-2) unstable; urgency=low + + * remove a script file for DAC + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/libslp-pm-0 + * Tag: libslp-pm_1.2.3-2 + + -- Wonil Choi Wed, 12 May 2010 15:52:38 +0900 + +libslp-pm (1.2.3-1) unstable; urgency=low + + * add deprecate warnings to pm_control() + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/libslp-pm-0 + * Tag: libslp-pm_1.2.3-1 + + -- Wonil Choi Thu, 06 May 2010 09:02:41 +0900 + +libslp-pm (1.2.2-4) unstable; urgency=low + + * add a script file for DAC + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/libslp-pm-0 + * Tag: libslp-pm-0_1.2.2-4 + + -- Wonil Choi Mon, 19 Apr 2010 18:17:57 +0900 + +libslp-pm (1.2.2-3) unstable; urgency=low + + * increasing package version + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/libslp-pm-0 + * Tag: libslp-pm-0_1.2.2-3 + + -- Wonil Choi Wed, 14 Apr 2010 19:16:32 +0900 + +libslp-pm (1.2.2-2) unstable; urgency=low + + * remove applog in the .pc file + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/libslp-pm-0 + * Tag: libslp-pm-0_1.2.2-2 + + -- Wonil Choi Wed, 14 Apr 2010 10:39:31 +0900 + +libslp-pm (1.2.2-1) unstable; urgency=low + + * remove applog.h + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/libslp-pm-0 + * Tag: libslp-pm-0_1.2.2-1 + + -- Wonil Choi Tue, 13 Apr 2010 18:07:22 +0900 + +libslp-pm (1.2.1-2) unstable; urgency=low + + * corrected wrong comments + + -- Wonil Choi Mon, 29 Mar 2010 11:41:28 +0900 + +libslp-pm (1.2.1-1) unstable; urgency=low + + * remove unused (deprecated) codes + + -- Wonil Choi Thu, 25 Mar 2010 16:43:19 +0900 + +libslp-pm (1.2.0-8) unstable; urgency=low + + * Toolchain Upgrade + + -- Wonil Choi Thu, 25 Mar 2010 16:39:22 +0900 + +libslp-pm (1.2.0-7) unstable; urgency=low + + * add dbg pkg + + -- Wonil Choi Tue, 02 Mar 2010 20:35:09 +0900 + +libslp-pm (1.2.0-6) unstable; urgency=low + + * remove a copy for old so + + -- Wonil Choi Tue, 02 Mar 2010 18:53:59 +0900 + +libslp-pm (1.2.0-5) unstable; urgency=low + + * modified doxygen comments + + -- Wonil Choi Fri, 19 Feb 2010 16:48:39 +0900 + +libslp-pm (1.2.0-4) unstable; urgency=low + + * fix i686 build break + + -- Wonil Choi Thu, 18 Feb 2010 13:30:29 +0900 + +libslp-pm (1.2.0-2) unstable; urgency=low + + * so.1.1 temporary added + + -- Wonil Choi Thu, 18 Feb 2010 13:09:50 +0900 + +libslp-pm (1.2.0-1) unstable; urgency=low + + * modified API name and parameter + + -- Wonil Choi Wed, 17 Feb 2010 17:15:40 +0900 + +libslp-pm (1.1.1-2) unstable; urgency=low + + * add the so version to the library extention + + -- Wonil Choi Mon, 01 Feb 2010 10:12:59 +0900 + +libslp-pm (1.1.1-1) unstable; urgency=low + + * add old pmcontrol() for SDK + + -- Wonil Choi Sat, 30 Jan 2010 13:44:45 +0900 + +libslp-pm (1.1.0-2) unstable; urgency=low + + * add pmcontrol.h to dev pkg + + -- Wonil Choi Fri, 29 Jan 2010 16:03:28 +0900 + +libslp-pm (1.1.0-1) unstable; urgency=low + + * change names - remove SLP + + -- Wonil Choi Tue, 26 Jan 2010 17:54:13 +0900 + +libslp-pm (1.0.4-4) unstable; urgency=low + + * update doxygen tags for SDK + + -- root Sat, 23 Jan 2010 23:51:34 +0900 + +libslp-pm (1.0.4-3) unstable; urgency=low + + * add doxygen tags for SDK + + -- root Sat, 23 Jan 2010 21:47:57 +0900 + +libslp-pm (1.0.4-2) unstable; urgency=low + + * update debug pkg + + -- Wonil Choi Fri, 22 Jan 2010 12:18:24 +0900 + +libslp-pm (1.0.4-1) unstable; urgency=low + + * i686 bug fix + + -- Wonil Choi Fri, 08 Jan 2010 11:07:45 +0900 + +libslp-pm (1.0.3-1) unstable; urgency=low + + * added dvfs condition + + -- Wonil Choi Tue, 05 Jan 2010 20:45:48 +0900 + +libslp-pm (1.0.2-1) unstable; urgency=low + + * implemented SLP_pm_state_change() function + + -- Wonil Choi Tue, 22 Dec 2009 19:25:54 +0900 + +libslp-pm (1.0.1-1) unstable; urgency=low + + * Bug fix - return value is 0 for success. And add new function. + + -- Wonil Choi Fri, 18 Dec 2009 20:25:03 +0900 + +libslp-pm (1.0-6) unstable; urgency=low + + * fix build script + + -- Suchang Woo Mon, 30 Nov 2009 20:20:08 +0900 + +libslp-pm (1.0-5) unstable; urgency=low + + * remove project name(X1) + + -- Suchang Woo Fri, 20 Nov 2009 17:17:17 +0900 + +libslp-pm (1.0-4) unstable; urgency=low + + * rename prefix + + -- Suchang Woo Fri, 20 Nov 2009 16:20:30 +0900 + +libslp-pm (1.0-3) unstable; urgency=low + + * change copyright + + -- Suchang Woo Tue, 17 Nov 2009 15:49:17 +0900 + +libslp-pm (1.0-2) unstable; urgency=low + + * uncomment dh_makeshlibs + + -- Suchang Woo Mon, 16 Nov 2009 11:06:21 +0900 + +libslp-pm (1.0-1) unstable; urgency=low + + * Initial Release. + + -- Suchang Woo Thu, 12 Nov 2009 22:19:58 +0900 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..f0d7b8f --- /dev/null +++ b/debian/control @@ -0,0 +1,28 @@ +Source: libslp-pm +Section: libs +Priority: extra +Maintainer: Jonghoon Han Jinkun Jang DongGi Jang +Uploaders: Jinkun Jang +Build-Depends: debhelper (>= 5) +Standards-Version: 3.7.2 + +Package: libslp-pm-dev +Section: libs +Architecture: any +Depends: libslp-pm-0 (= ${Source-Version}) +Description: Samsung Linux platform power manager client library + Samsung Linux platform power manager client library + +Package: libslp-pm-0 +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Samsung Linux platform power manager client library + Samsung Linux platform power manager client library + +Package: libslp-pm-0-dbg +Section: debug +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, libslp-pm-0 (= ${Source-Version}) +Description: Samsung Linux platform power manager client library (unstripped) + Samsung Linux platform power manager client library (unstripped) diff --git a/debian/dirs b/debian/dirs new file mode 100644 index 0000000..ca882bb --- /dev/null +++ b/debian/dirs @@ -0,0 +1,2 @@ +usr/bin +usr/sbin diff --git a/debian/docs b/debian/docs new file mode 100644 index 0000000..a0f0008 --- /dev/null +++ b/debian/docs @@ -0,0 +1 @@ +CMakeLists.txt diff --git a/debian/libslp-pm-0.install.in b/debian/libslp-pm-0.install.in new file mode 100644 index 0000000..daeeae9 --- /dev/null +++ b/debian/libslp-pm-0.install.in @@ -0,0 +1 @@ +@PREFIX@/lib/lib*.so* diff --git a/debian/libslp-pm-dev.install.in b/debian/libslp-pm-dev.install.in new file mode 100644 index 0000000..37b3bd4 --- /dev/null +++ b/debian/libslp-pm-dev.install.in @@ -0,0 +1,2 @@ +@PREFIX@/include/*.h +@PREFIX@/lib/pkgconfig/*.pc diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..8b10ede --- /dev/null +++ b/debian/rules @@ -0,0 +1,128 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +CFLAGS ?= -Wall -g +CXXFLAGS ?= -Wall -g +LDFLAGS ?= +PREFIX ?= /usr +DATADIR ?= /opt + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 + CXXFLAGS += -O0 +else + CFLAGS += -O2 + CXXFLAGS += -O2 +endif + +LDFLAGS += -Wl,--rpath=$(PREFIX)/lib -Wl,--as-needed + +CMAKE_TMP_DIR = $(CURDIR)/cmake_tmp + + +configure: configure-stamp +configure-stamp: + dh_testdir + # Add here commands to configure the package. + mkdir -p $(CMAKE_TMP_DIR); + cd $(CMAKE_TMP_DIR); CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" cmake .. -DCMAKE_INSTALL_PREFIX=$(PREFIX) + + touch configure-stamp + +build: build-stamp + +build-stamp: configure-stamp + dh_testdir + + # Add here commands to compile the package. + cd $(CMAKE_TMP_DIR) && $(MAKE) + #docbook-to-man debian/wavplayer.sgml > wavplayer.1 + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + cat $$f > $${f%.in}; \ + sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \ + sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \ + done + + touch $@ + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + + # Add here commands to clean up after the build process. + -cd $(CMAKE_TMP_DIR) && $(MAKE) clean + rm -rf $(CMAKE_TMP_DIR) + + rm -rf CMakeCache.txt + rm -rf CMakeFiles + rm -rf cmake_install.cmake + rm -rf Makefile + rm -rf install_manifest.txt + rm -rf *.so + rm -rf debian/libpmapi-0-dbg + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + rm -f $${f%.in}; \ + done + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/wavplayer. + cd $(CMAKE_TMP_DIR) && $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install + # cp $(CMAKE_TMP_DIR)/libpmapi.so.1.2 $(CURDIR)/debian/tmp/usr/lib/libpmapi.so.1.1 + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs +# dh_installdocs + dh_installexamples + dh_install --sourcedir=debian/tmp +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link +# dh_strip + dh_strip --dbg-package=libslp-pm-0-dbg + dh_compress + dh_fixperms +# dh_perl + dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/image/SLP_pm_PG_architecture.png b/image/SLP_pm_PG_architecture.png new file mode 100755 index 0000000000000000000000000000000000000000..046c121e8fb1c78bcdc4a563e85768adcb3f0937 GIT binary patch literal 15990 zcmd73cTm$`@GeY81BlWTP(Y+gC{m?^fRxai0VzQUNSEHF35XP_p?3j6N(fDQ1OXuw z1?fdaigfAH-@~{4?)~S^+?jXYd1u0eoSd>}KYMncXZIvhTT__=!T`a;!=q4DQPjo5 zBe255!+&y#0JMy?>)C@hd^cU?2Y3|&HsjVy%u0vnjLz>x&0H2}r@6U`)MBcP!%{C@zjXP0@2b?v zJr#;KRC01eu6#6_LZZz=57~n@XHq-a6H9wO*48%l&D~)HTtR=m(E7o=ze4}}WP*?Axg?KI zBL`l=1jIq?3Lh)6vn_sYgMW<(;Qsxq;I*A+H&)keliYS{xj5&{l<%VVFIaH(fW+#j z_&W-|(xcFk(#i>e;Drp6i)B8i5KPrOlcLh|f*hX{2O-V*LVUIHh%crWW+)`UQjvy( zPQ?UR*QB@Dr-+H-jNFSk5tqFlmf)d3`sCq3cELY4+3yN4!1tFqYDQ~qkhor^@-B<9 zk2H9wXEsR?JY0!4E54cITqk zbWr9nW1Q}8)M2lPqJxU`1o0lx{xc2ibfEA>7>Vh&xu2-PpN2Y)E$e5UI^Q$MWTFXr zQ`6;B8BAPUw!Z1e%R_CG?W;r+1q5a)?%m_(`yhGT^d|1jEq2A*k($Io3tT$EU$DBx z3MJMCHy0afYB;Qi??3wz5pH~Yzsz<-+Ww2ay@OV}k|bugf9}XmU8cHqI?kmmt+8?9*~w%JFfv?yH)7+2pzQPqZnaGswO|bhH|p!Mfn<|1p%-O(i>AyRmImd;%~XtGZ! z%T=|U6UykR>N)@K;`l80{jf6Z-I=~A&r<_ZURt=kx^`R^^fvP(N_H+KV*YL~apPzM zX~O-$lc1$S)*l~8=&RTDegxEU7(F4J+p#YDBO!de|3u8gfwE>$&SoOj8`)|a|-+U=w%5-;rjOrMg%IwQfPYp2; zeIFzK&*3iV%Xt%#K>Fv^bPFkJKoEHnanNx||4ax+_>yE7a@NEdLpL00Bzaad>(~&j zu0dW@*X0mmRMrm}A z=omUB2%QQXs4dMGGE-^y(zY!Lrbme+mW@s#PaaTZXbya|-G#)%dywcF&Q~qN=+-*8 zP_OEXbRm{w4(cLAa?IMtn+S0=eS|Pte^Gb(RC1Y7#uY70mh^+x0S{v>1^8*hp1O6#cBz{PUlbIp%0DjVcMK4Ffb^fLCw0s`EoEBGQ; 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 OJXIx4#fk@rkpBlQx*R0{ literal 0 HcmV?d00001 diff --git a/image/SLP_pm_PG_state_diagram.png b/image/SLP_pm_PG_state_diagram.png new file mode 100755 index 0000000000000000000000000000000000000000..bf07b7968d6f5585086492361868b7f35c7ee25b GIT binary patch literal 50427 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 z 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 literal 0 HcmV?d00001 diff --git a/packaging/libslp-pm.spec b/packaging/libslp-pm.spec new file mode 100644 index 0000000..b6e46a2 --- /dev/null +++ b/packaging/libslp-pm.spec @@ -0,0 +1,68 @@ + +Name: libslp-pm +Summary: Power manager library +Version: 1.2.4 +Release: 2.1 +Group: TO_BE/FILLED_IN +License: TO BE FILLED IN +Source0: libslp-pm-%{version}.tar.bz2 +Patch0: remove_tests.patch +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig +BuildRequires: cmake + + +%description +Samsung Linux platform power manager client library + + + +%package devel +Summary: SLP power manager client (devel) +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} +Requires: libslp-pm + +%description devel +SLP power manager client library (devel) + + +%prep +%setup -q +%patch0 -p1 + + +%build +cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} + + +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install + + + + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + + + + + +%files +%defattr(-,root,root,-) +%doc COPYING +%{_libdir}/libpmapi.so.1.2 + + +%files devel +%defattr(-,root,root,-) +%{_includedir}/pmapi.h +%{_includedir}/SLP_pm_PG.h +%{_libdir}/pkgconfig/pmapi.pc +%{_libdir}/libpmapi.so + diff --git a/pm.c b/pm.c new file mode 100644 index 0000000..32cfe59 --- /dev/null +++ b/pm.c @@ -0,0 +1,134 @@ +/* + * libslp-pm + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: DongGi Jang + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +#include +#include +#include +#include +#include +#include +#include + +#include "pmapi.h" +#include "pm.h" + +#define SOCK_PATH "/tmp/pm_sock" +#define SHIFT_UNLOCK 4 +#define SHIFT_UNLOCK_PARAMETER 12 +#define SHIFT_CHANGE_STATE 8 +#define TIMEOUT_RESET_BIT 0x80 + +struct pwr_msg { + pid_t pid; + unsigned int cond; + unsigned int timeout; +}; + +static int send_msg(unsigned int s_bits, unsigned int timeout) +{ + int rc = 0; + int sock; + struct pwr_msg p; + struct sockaddr_un remote; + + p.pid = getpid(); + p.cond = s_bits; + p.timeout = timeout; + + sock = socket(AF_UNIX, SOCK_DGRAM, 0); + if (sock == -1) { + ERR("pm socket() failed"); + return -1; + } + + remote.sun_family = AF_UNIX; + if(strlen(SOCK_PATH) >= sizeof(remote.sun_path)) { + ERR("socket path is vey long"); + return -1; + } + strncpy(remote.sun_path, SOCK_PATH, sizeof(remote.sun_path)); + + rc = sendto(sock, (void *)&p, sizeof(p), 0, (struct sockaddr *)&remote, + sizeof(struct sockaddr_un)); + if (rc == -1) { + ERR("pm socket sendto() failed"); + } else + rc = 0; + + close(sock); + return rc; +} + +API int pm_change_state(unsigned int s_bits) +{ + /* s_bits is LCD_NORMAL 0x1, LCD_DIM 0x2, LCD_OFF 0x4, SUSPEND 0x8 + * Stage change to NORMAL 0x100 + * Stage change to LCDDIM 0x200 + * Stage change to LCDOFF 0x400 + * Stage change to SLEEP 0x800 + * */ + switch (s_bits) { + case LCD_NORMAL: + case LCD_DIM: + case LCD_OFF: + case SUSPEND: + case POWER_OFF: + break; + default: + return -1; + } + return send_msg(s_bits << SHIFT_CHANGE_STATE, 0); +} + +API int pm_lock_state(unsigned int s_bits, unsigned int flag, + unsigned int timeout) +{ + switch (s_bits) { + case LCD_NORMAL: + case LCD_DIM: + case LCD_OFF: + break; + default: + return -1; + } + if (flag & GOTO_STATE_NOW) + /* if the flag is true, go to the locking state directly */ + s_bits = s_bits | (s_bits << SHIFT_CHANGE_STATE); + return send_msg(s_bits, timeout); +} + +API int pm_unlock_state(unsigned int s_bits, unsigned int flag) +{ + switch (s_bits) { + case LCD_NORMAL: + case LCD_DIM: + case LCD_OFF: + break; + default: + return -1; + } + + s_bits = (s_bits << SHIFT_UNLOCK); + s_bits = (s_bits | (flag << SHIFT_UNLOCK_PARAMETER)); + return send_msg(s_bits, 0); +} + diff --git a/pm.h b/pm.h new file mode 100644 index 0000000..77d5ab5 --- /dev/null +++ b/pm.h @@ -0,0 +1,38 @@ +/* + * libslp-pm + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: DongGi Jang + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +#ifndef __POWER_MANAGER_LIBRARY_I_H__ +#define __POWER_MANAGER_LIBRARY_I_H__ + +#ifndef API +#define API __attribute__ ((visibility("default"))) +#endif + +#if defined(ENABLE_DLOG_OUT) +# define LOG_TAG "PMAPI" +# include +# define ERR SLOGE +#else +# define ERR perror +#endif + +#endif /* __POWER_MANAGER_LIBRARY_I_H__ */ diff --git a/pmapi.h b/pmapi.h new file mode 100644 index 0000000..fbd9c6c --- /dev/null +++ b/pmapi.h @@ -0,0 +1,197 @@ +/* + * libslp-pm + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: DongGi Jang + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +#ifndef __POWER_MANAGER_LIBRARY_H__ +#define __POWER_MANAGER_LIBRARY_H__ + +/** + * @defgroup POWER_MANAGER Power manager library + * @ingroup SYSTEM_FRAMEWORK + * @brief Power manager control API library + * + * @open + * @addtogroup POWER_MANAGER + * @{ + * This library provides APIs to lock/unlock the power state of the system. + * Power Manager controls the power state as following. + * @image html power-manager-fsm.bmp "Fig. 1 State Diagram of Power Manager + *
If there is no user input for a certain time, PM changes the power state + * that has lower power consumption.
When the user input or other system interrupt occurs, + * PM rolls the state back immediately.
If applications or other frameworks want to stop + * enter the specific state of power manager, use pm_lock_state() and pm_unlock_state() + *
Be careful! A caller process should unlock the power state after locking without timeout. + *
If you want to stay the LCD normal state, you can use + * @li @c pm_lock_state(LCD_NORMAL, GOTO_STATE_NOW, 0) + *


After finishing your job with locking, call + * @li @c pm_unlock_state(LCD_NORMAL, PM_RESET_TIMER) + *


Additionally, you can use the timeout for lock the state. + * If timeout is set, caller process doesn't need to call the unlock API. + * But the process should be alive. + * If caller process is dead, lock condition would be drop by the power manager. + *


Here is sample codes + * @code + +#include "pmapi.h" +int main(int argc, char** argv) +{ + int result; + + printf("=========================================\n"); + printf("= Lock / Unlock to transit a power manager state =\n"); + printf("=========================================\n"); + + result = pm_lock_state(LCD_NORMAL, GOTO_STATE_NOW,0); //Lock on lcd-off until explicit unlock. + if (!result) + printf("SUCCESS"); + else + printf("FAILED"); + + // DO something. + + result = pm_unlock_state(LCD_NORMAL,PM_RESET_TIMER); //Unlock + if (!result) + printf("SUCCESS"); + else + printf("FAILED"); + + result = pm_lock_state(LCD_OFF,STAY_CUR_STATE, 5000); // Lock on lcd-off during 5 seconds. + if (!result) + printf("SUCCESS"); + else + printf("FAILED"); + + // DO something. + sleep(10); + + return 0; +} + * @endcode + * + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define LCD_NORMAL 0x1 /**< NORMAL state */ +#define LCD_DIM 0x2 /**< LCD dimming state */ +#define LCD_OFF 0x4 /**< LCD off state */ +#define SUSPEND 0x8 /**< Sleep state */ +#define POWER_OFF 0x16 /**< Sleep state */ +#define SETALL (LCD_DIM | LCD_OFF | LCD_NORMAL) /*< select all state - not supported yet */ + +/* parameters for pm_lock_state() */ +#define GOTO_STATE_NOW 0x1 +#define STAY_CUR_STATE 0x0 + +/* paramters for pm_unlcok_state() - details are described at 162 line */ +#define PM_SLEEP_MARGIN 0x0 /**< keep guard time for unlock */ +#define PM_RESET_TIMER 0x1 /**< reset timer for unlock */ +#define PM_KEEP_TIMER 0x2 /**< keep timer for unlock */ + +/** + * @fn int pm_lock_state (unsigned int state, + * unsigned int flag, + * unsigned int timeout); + * @brief This API is used to lock a particular power-state as the current power-state.\n + * The parameter state specifies the power state which you want to lock LCD_NORMAL, LCD_DIM, LCD_OFF. \n + * The second parameter Flag is set if you want to go the requested lock state directly.\n + * The third parameter timeout specifies lock-timeout in milliseconds. + * If the value 0 is selected, the power state remains locked until pm_unlock_state is called. + * @param[in] state target power state which you want to lock - LCD_NORMAL, LCD_DIM, LCD_OFF + * @param[in] flag set if you want to go the lock state directly - GOTO_STATE_NOW, STAY_CUR_STATE + * @param[in] timeout lock-timeout in miliseconds. + * 0 is always lock until calling pm_unlock_state + * If you call this function with same state in duplicate, + * only last one will be processed and others are ignored. + * @return 0 on success, -1 if failed + * @see pm_unlock_state(), pm_change_state() + * @par Example + * @code + * ... + * // Lock current state as LCD_NORMAL + * result = pm_lock_state(LCD_NORMAL, GOTO_STATE_NOW, SET_TIMEOUT); + * if( result < 0 ) + * printf("[ERROR] return value result =%d, \n",result); + * else + * printf("[SUCCESS]return value result =%d \n",result); + * ... + * @endcode + */ + int pm_lock_state(unsigned int, unsigned int, unsigned int); + +/** + * @fn int pm_unlock_state (unsigned int state, + * unsigned int flag) + * @brief This API is used to Unlock the power state. \n + * The parameter state specifies the power state which you want to unlock . + * Some examples are LCD_NORMAL, LCD_DIM, LCD_OFF.\n + * The second parameter flag is set if you want to go to the requested state directly after unlocking. (NOT SUPPOERTED YET) + * This is valid only when the current state transition was blocked by the locking and this function call releases the blocking. + * @param[in] state target power state which you want to unlock + * @param[in] flag set timer which is going to the next state after unlocking + * PM_SLEEP_MARGIN - If the current status is lcd off, pm reset timer to 5 second. If the current status is not lcd off, pm pm uses the existing timer. + * PM_RESET_TIMER - Power-manager resets timer. (lcd normal : reset timer to predfined value which is set in setting module, lcd dim or off : reset timer to 5 seconds) + * PM_KEEP_TIMER - Power-manager uses the existing timer (if timer is already expired, pm changes the status)
+ * @return 0 on success, -1 if failed + * @see pn_lock_state(), pm_change_state() + * @par Example + * @code + * ... + * //Un-lock NORMAL state so that power state change can occur with system-events + * result = pm_unlock_state(LCD_NORMAL,PM_RESET_TIMER); + * if( result < 0 ) + * printf("[ERROR] return value result =%d, \n",result); + * else + * printf("[SUCCESS]return value result =%d \n",result); + * ... + * @endcode + */ + int pm_unlock_state(unsigned int, unsigned int); + +/** + * @fn int pm_change_state(unsigned int state); + * @brief This API is used to change the power manager state by force. + * @param[in] state power manager state - LCD_NORMAL, LCD_DIM, LCD_OFF + * @return 0 on success, -1 if failed. + * @see pm_lock_state(), pm_unlock_state() + * @pat Example + * @code + * ... + * result = pm_change_state(LCD_OFF); + * if( result < 0 ) + * printf("[ERROR] return value result =%d, \n",result); + * else + * printf("[SUCCESS]return value result =%d \n",result); + * ... + * @endcode + */ + int pm_change_state(unsigned int); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif +#endif /* __POWER_MANAGER_LIBRARY_H__ */ diff --git a/pmapi.pc.in b/pmapi.pc.in new file mode 100644 index 0000000..f32c72f --- /dev/null +++ b/pmapi.pc.in @@ -0,0 +1,13 @@ +# Package Information for pkg-config + +prefix=@PREFIX@ +exec_prefix=@EXEC_PREFIX@ +libdir=@LIBDIR@ +includedir=@INCLUDEDIR@ + +Name: libpmapi +Description: power manager library +Version: @VERSION@ +Requires: +Libs: -L${libdir} -lpmapi +Cflags: -I${includedir} -- 2.7.4