From d8d68cc44641cfd1023d1828fdb354be8bed78cf Mon Sep 17 00:00:00 2001 From: Kichan Kwon Date: Fri, 19 Jul 2019 15:47:47 +0900 Subject: [PATCH 01/16] Create the result file even if update is successful Change-Id: Ie9db0b5d1fb35287269aec71849abf2a5c885797 Signed-off-by: Kichan Kwon --- packaging/system-rw-update.spec | 2 +- upgrade/update.sh.in | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packaging/system-rw-update.spec b/packaging/system-rw-update.spec index 0a7a980..41a0371 100644 --- a/packaging/system-rw-update.spec +++ b/packaging/system-rw-update.spec @@ -1,6 +1,6 @@ Name: system-rw-update Summary: System RW update management -Version: 1.2.3 +Version: 1.2.4 Release: 0 Group: Base/Startup License: Apache-2.0 diff --git a/upgrade/update.sh.in b/upgrade/update.sh.in index ef11319..c081ce6 100755 --- a/upgrade/update.sh.in +++ b/upgrade/update.sh.in @@ -4,6 +4,7 @@ # PATH=/bin:/usr/bin:/sbin:/usr/sbin +RW_UPDATE_ERROR_NONE=00 UPI_RW_UPDATE_ERROR=fa1a TMP_DIR=/tmp/upgrade @@ -106,6 +107,7 @@ else sync echo "SUCCESS: Upgrade successfully finished" >> ${LOG_FILE} + echo "${RW_UPDATE_ERROR_NONE}" > ${RESULT_FILE} fi if [ -e ${SDB_RULE} ]; then -- 2.7.4 From 3f9a1ece3ba0c0cd8aa99dcaa4f2c692341a2aff Mon Sep 17 00:00:00 2001 From: Kichan Kwon Date: Thu, 8 Aug 2019 19:45:42 +0900 Subject: [PATCH 02/16] rw-script-list: add efl-misc script Change-Id: Iae4a315daf94f695f5c15e90eb229c809868a266 Signed-off-by: Kichan Kwon --- rw-script-list/rw-script.list | 1 + 1 file changed, 1 insertion(+) diff --git a/rw-script-list/rw-script.list b/rw-script-list/rw-script.list index 1df0cf5..de2ea4f 100755 --- a/rw-script-list/rw-script.list +++ b/rw-script-list/rw-script.list @@ -8,6 +8,7 @@ 500.context-service.sh 323908008385576f5b261f7d5811d8ae 500.crash-manager-upgrade.sh 9f11ad44cde7a8b27d4e69f0a5fa3f74 500.dnet_db_upgrade_30_40.sh 2718a6306157b4eba917c9c940a7f590 +500.efl-misc.sh a74f47437c226f3723c02e5759de2ea0 500.fontconfig.sh dafd6efdcd6b343623f9085606b594aa 500.mcc_mnc_oper_list_upgrade_30_40.sh 83823fa7036779564758a640fc5da58a 500.screen-reader.sh 75f0b2dd6d398d0ef7ab67ed72587d68 -- 2.7.4 From 3096c4778118dd741d036f47ffd8dabb8ad2a75e Mon Sep 17 00:00:00 2001 From: Kichan Kwon Date: Mon, 2 Sep 2019 10:22:26 +0900 Subject: [PATCH 03/16] Run all upgrade scripts without verification result - For each script developer's convenience Change-Id: I665aea2d6b118d4f034bda3c9d1b13caff59d9f5 Signed-off-by: Kichan Kwon --- upgrade/update.sh.in | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/upgrade/update.sh.in b/upgrade/update.sh.in index c081ce6..b2ac574 100755 --- a/upgrade/update.sh.in +++ b/upgrade/update.sh.in @@ -98,10 +98,8 @@ else echo ${progress} > ${TMP_DIR}/progress fi Verity_Check ${PATCH_DIR}/${PATCH} - # Skip in case of 'No entry' only - if [ "$?" != "1" ]; then - ${RUN} ${PATCH_DIR}/${PATCH} - fi + # Without verification result, run all scripts + ${RUN} ${PATCH_DIR}/${PATCH} done sync -- 2.7.4 From 636e515877937215e3dbda18a3a6a4a20aa459ac Mon Sep 17 00:00:00 2001 From: Kichan Kwon Date: Tue, 13 Aug 2019 15:08:46 +0900 Subject: [PATCH 04/16] rw-script-list: update RW script list Change-Id: Ie403a78913604ad8cec2ebe6c563bce0893049f3 Signed-off-by: Kichan Kwon --- rw-script-list/rw-script.list | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/rw-script-list/rw-script.list b/rw-script-list/rw-script.list index de2ea4f..6de84fe 100755 --- a/rw-script-list/rw-script.list +++ b/rw-script-list/rw-script.list @@ -1,22 +1,16 @@ -200.filesystem-pre.patch.sh 79b54c435348043a5573cb0611f960a3 -201.security_upgrade.sh 5c8b8ea34b3484ae409de1798b6fd14f -210.dlog_upgrade.sh 28fc518a34b338fb83fa8830abd5d50a -299.buxton2_upgrade.sh 978cfae060a388b8ffeaf4ae3efa7215 -500.account-manager.sh 5d8b0bbf15b1aecd7b5d146e8dce6d3d -500.bluez_upgrade.sh 09824b61cb3a02423d2a4c529c7cc8bc +201.security_upgrade.sh 869f8e1ba11ee37a17abe1d519a95bc8 +290.buxton2_upgrade.sh ff3ec647dd4c0360b56b3757ae43829a +295.key-manager_upgrade.sh 646b5031c415222c71b4b767c817e7d0 +500.account-manager.sh 43f8ff185180167241e1cd091f66dc06 500.connman_upgrade.sh 14efbfe125f33d44b22ade08ea64968c -500.context-service.sh 323908008385576f5b261f7d5811d8ae -500.crash-manager-upgrade.sh 9f11ad44cde7a8b27d4e69f0a5fa3f74 -500.dnet_db_upgrade_30_40.sh 2718a6306157b4eba917c9c940a7f590 +500.crash-manager-upgrade.sh 28c936a201035b086c37dd0438468726 +500.edge-orchestration-upgrade.sh 3284627d8fcfda64b5a50356740ecc4a 500.efl-misc.sh a74f47437c226f3723c02e5759de2ea0 -500.fontconfig.sh dafd6efdcd6b343623f9085606b594aa -500.mcc_mnc_oper_list_upgrade_30_40.sh 83823fa7036779564758a640fc5da58a -500.screen-reader.sh 75f0b2dd6d398d0ef7ab67ed72587d68 -500.starter.upgrade.sh 8c8a71d8b5c22322485e2634ef772071 -500.winsys_upgrade.sh 3a02e97e2c007ffae542275d5414a73f -502.syspopup_upgrade.sh 80de43183255616ae7635be9293e49a5 -505.notification_upgrade.sh d1ffa24f36b0aa265b682f2ca2d0d515 -700.pkgmgr.patch.sh e809a64bc4f9e55bccf13b14d966a263 -701.app2sd.patch.sh 857033620ccd4878446e89c376b61974 -711.security_privacy_package_migration.sh 69c4ce7f82d9a125f60cdb32b8891c18 -720.wrt.upgrade.sh b419dc607df95afbd389b84bccc2f1a7 +500.ode_upgrade.sh 1d9b1b99222f780d3b450194fcb75ea9 +500.stc-manager_upgrade.sh d8d98fd0881ec7e3db0a521389c99a6e +500.winsys_upgrade.sh 29ac61e4ac32a27705580614646bf7f0 +501.component_upgrade.sh aa728b7c613daa45e187f7663dc184e8 +502.syspopup_upgrade.sh 369ec9ab48fae5598e24091d76df4175 +504.watchface_complication_upgrade.sh bb3dfebd83cf95cda1a73738b27538a5 +505.notification_upgrade.sh 11dab5281d1a5965ff6a22d8aa37ba4c +700.pkgmgr.patch.sh f2a3ad5d4c7e25b152b2d50d4d7d9117 -- 2.7.4 From ac5fbeb0f673f7ca4c9d1f86f7fa9a170c565602 Mon Sep 17 00:00:00 2001 From: Kichan Kwon Date: Fri, 29 May 2020 14:34:43 +0900 Subject: [PATCH 05/16] Detach rw-update-ani - It is moved to tota-gui Change-Id: Iaebfeb6c08444be13590df7f19d03d02bab8dafa Signed-off-by: Kichan Kwon --- CMakeLists.txt | 1 - packaging/system-rw-update-ani.manifest | 5 - packaging/system-rw-update.spec | 24 +- res/tw1/images/solis_fota_progress_000.png | Bin 24287 -> 0 bytes res/tw1/images/wc_fota_downloading_0.png | Bin 1221 -> 0 bytes res/tw1/images/wc_fota_downloading_1.png | Bin 1095 -> 0 bytes res/tw1/images/wc_fota_downloading_2.png | Bin 1225 -> 0 bytes res/tw1/images/wc_fota_downloading_3.png | Bin 1274 -> 0 bytes res/tw1/images/wc_fota_downloading_4.png | Bin 1175 -> 0 bytes res/tw1/images/wc_fota_downloading_5.png | Bin 1217 -> 0 bytes res/tw1/images/wc_fota_downloading_6.png | Bin 1279 -> 0 bytes res/tw1/images/wc_fota_downloading_7.png | Bin 1188 -> 0 bytes res/tw1/images/wc_fota_downloading_8.png | Bin 1273 -> 0 bytes res/tw1/images/wc_fota_downloading_9.png | Bin 1293 -> 0 bytes res/tw1/images/wc_fota_downloading_slash.png | Bin 261 -> 0 bytes rw-update-ani/CMakeLists.txt | 60 ---- rw-update-ani/rw-update-ani_new.c | 450 ----------------------- rw-update-ani/rw-update-ani_new.h | 25 -- rw-update-ani/rw-update-log.h | 105 ------ rw-update-ani/rw-update_new_cairo.h | 49 --- rw-update-ani/rw-update_new_cairo_w_360_360.c | 492 -------------------------- rw-update-ani/rw-update_new_common.h | 74 ---- rw-update-ani/rw-update_new_common_display.h | 84 ----- rw-update-ani/rw-update_new_fb.h | 48 --- rw-update-ani/rw-update_new_fb_cairo.c | 257 -------------- rw-update-ani/rw-update_new_tdm_display.c | 465 ------------------------ 26 files changed, 1 insertion(+), 2138 deletions(-) delete mode 100644 packaging/system-rw-update-ani.manifest delete mode 100755 res/tw1/images/solis_fota_progress_000.png delete mode 100755 res/tw1/images/wc_fota_downloading_0.png delete mode 100755 res/tw1/images/wc_fota_downloading_1.png delete mode 100755 res/tw1/images/wc_fota_downloading_2.png delete mode 100755 res/tw1/images/wc_fota_downloading_3.png delete mode 100755 res/tw1/images/wc_fota_downloading_4.png delete mode 100755 res/tw1/images/wc_fota_downloading_5.png delete mode 100755 res/tw1/images/wc_fota_downloading_6.png delete mode 100755 res/tw1/images/wc_fota_downloading_7.png delete mode 100755 res/tw1/images/wc_fota_downloading_8.png delete mode 100755 res/tw1/images/wc_fota_downloading_9.png delete mode 100755 res/tw1/images/wc_fota_downloading_slash.png delete mode 100755 rw-update-ani/CMakeLists.txt delete mode 100755 rw-update-ani/rw-update-ani_new.c delete mode 100755 rw-update-ani/rw-update-ani_new.h delete mode 100755 rw-update-ani/rw-update-log.h delete mode 100755 rw-update-ani/rw-update_new_cairo.h delete mode 100755 rw-update-ani/rw-update_new_cairo_w_360_360.c delete mode 100755 rw-update-ani/rw-update_new_common.h delete mode 100755 rw-update-ani/rw-update_new_common_display.h delete mode 100755 rw-update-ani/rw-update_new_fb.h delete mode 100755 rw-update-ani/rw-update_new_fb_cairo.c delete mode 100755 rw-update-ani/rw-update_new_tdm_display.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 4559f6b..d2e8a78 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,5 +9,4 @@ CONFIGURE_FILE(units/udev-sdb-init.service.in units/udev-sdb-init.service @ONL CONFIGURE_FILE(units/offline-update.service.in units/offline-update.service @ONLY) #add sub directory -ADD_SUBDIRECTORY(rw-update-ani) ADD_SUBDIRECTORY(rstsmack) diff --git a/packaging/system-rw-update-ani.manifest b/packaging/system-rw-update-ani.manifest deleted file mode 100644 index 017d22d..0000000 --- a/packaging/system-rw-update-ani.manifest +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/packaging/system-rw-update.spec b/packaging/system-rw-update.spec index 41a0371..7ef6465 100644 --- a/packaging/system-rw-update.spec +++ b/packaging/system-rw-update.spec @@ -6,35 +6,20 @@ Group: Base/Startup License: Apache-2.0 Source0: %{name}-%{version}.tar.bz2 Source1001: %{name}.manifest -Source1002: %{name}-ani.manifest BuildRequires: cmake +BuildRequires: pkgconfig(libsmack) BuildRequires: pkgconfig(libtzplatform-config) %description This package provides files for RW update which is implemented by using systemd offline update. -%package ani -Summary: System RW Ani -Group: System/Utilities -License: Apache-2.0 - -BuildRequires: pkgconfig(cairo) -BuildRequires: pkgconfig(libtbm) -BuildRequires: pkgconfig(libtdm) -BuildRequires: pkgconfig(vconf) -BuildRequires: pkgconfig(libsmack) - -%description ani -UX for system RW update/upgrade - %prep %setup -q %build cp %{SOURCE1001} . -cp %{SOURCE1002} . export LDFLAGS+="-Wl,--rpath=%{_prefix}/lib -Wl,--as-needed" LDFLAGS="$LDFLAGS" @@ -89,10 +74,3 @@ fi %{_unitdir}/system-update.target.wants %{_unitdir}/udev-sdb-init.service %{_bindir}/rstsmack-for-update - -%files ani -%manifest %{name}-ani.manifest -%license LICENSE.Apache-2.0 -%attr(550,system,system_share) %{_bindir}/rw-update-ani -%{_prefix}/share/rw-updater/* - diff --git a/res/tw1/images/solis_fota_progress_000.png b/res/tw1/images/solis_fota_progress_000.png deleted file mode 100755 index 1292e6ae2604473afd715213b308357111fa4f24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24287 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 diff --git a/res/tw1/images/wc_fota_downloading_2.png b/res/tw1/images/wc_fota_downloading_2.png deleted file mode 100755 index e9aca8e31e86611e2edc3eab60193509aa405448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1225 zcmbVMZD`zN91rW(ZQY6;3|SA+G?igtN$$y8lkCoVm)y0dyIZ*)?3jp`OP=;(FE1vk zcP)ZlDaE-H{Ll)DU~zS*l)*r7GDIv`7_Q2wli~-NQ2k=D6hZwU*5}&0>W8uqh9u8R z{=eVv|NLKac`(!8-WF=ZFswZ_pk~o{0zExPTG4w|U6Rqz86@(-kTV=qG!J4i!zn^M zWoaWY3pHc>#oI7~VJ)_q%Ln=NIazlsN~_yYRm(+a42$$tT}>Z_0bYb7rX3|VZ+%YS zrV%AB@ab^cRba^+nDF4xL?)+CjOvm>^gW43sxl(5V4&eut8DvnHA?L8%4lBSrU`t< zBp8hnyH4fPgSg^&5a%hD)WZPafx^2_ z84IEW@^tqImYYuR5!-$vP$*<{RdZ=Tg=x#GpKHh353=xIH}VhcO>GltH?Z6T zv9jVpEpWV?}GR-tFU1dXKUSoltiWph7$ zmhFwjl?1CWVL=2yWSCeyE-6YZ&a=Fz5Dl#Hf8$0Yhv<5d{HJJ|Tc{H2)4dizi@hd- zHtHM?waB&Bm6NEwwo+;=SN*>D*Y#gnSFV22&adBq0yXWAi3oWlcH-Gbyk2+hwzRw(-t|)xr zw`=&@G4tl}uIaDtE*(CTdEw-{i7TI7dZtX}SKE*NsMQ|6_w+*RBDi=bxPPTsUOV)B zsB8HRkE0if*^Rqf=eQQx{qV~<=9~GS<_2G;POl%R-AUHE%!Sb8O2@kQ`0N@t{pg%{ z^~7Vz%ZO|%62E+ns zEd}vNUdq5Yl+vTmd=6VNY>TQS`mDZa7cXmhmsGKF74temV_56HqAtlFciG6K&Ymr9;d1y&^F`rXSzUU{`czHCh zY?B1OW@2Ui#JW>`(QaJO42XMOv{QBifHRB>c)Sb)T5!q@DAJ8?#tA&Um*FWNUcCsU zW~2xCxEQW#p_QK)vMik^$wHyvD$p*?$dG{JxC#eFIgy3a991o;=v2*y8iNQ;*-&&# z(Nw&`D5bO!%TFLr*N>3bqtOjw)vN{zg^VmpItg5EGM}%UYt7oU;_zQLHnlbrqdFwx z(9}i@8RcWJp$0~=yR%Tm5P8ENFcg#&DJN?3NFJ(IMD!Eriz}_9d77ai05aHixy5;;UxisU~%QziykqG&#_I zy^bB9oNFlCS8e>=*SzIJj_y~PzkY5!W?LxzFqzr&cGuA>u7hte)4N_@_1`eIotSMZ z9lzPRaPRZYw$c+HJ-T${!tV!G=JXck9be?9E~@<8NxhdHPQ0}EWz)&tmDA2_vtwyb z)7CB9uQA-?BQIx8hhw|HnYn##|H6uKG5Nu-k6bu5_389?rT(s?MzQ^huWcfuw_lo{ zeQ*N*^QqS^PnTPFH_bHW4(7^J9g8;=@yx|-O0LYG|I9JH_{Qzt2kiH^amx)``&&AP zvyUZzj5&_@51k5UXXos1?yp@$jjquYU2H g@O{VMoxf}!z#hIe^Yug{_DAJ!6bZ$|`QX6#KgY+l`~Uy| diff --git a/res/tw1/images/wc_fota_downloading_4.png b/res/tw1/images/wc_fota_downloading_4.png deleted file mode 100755 index 081e84e031e4d079211aba222d0eb2e3cea0498f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1175 zcmbVMOKj9e7&b|Pb|FeVnh(QjfdEC;?;fZ{lNLjV#8asSf^ung0@_OxV(=W2$Vy2 z5>=7w&t6zVgB;fz1+_Y@S3a^l9ExsgBeuhsp*e1Fs2#iB6r!MkCW9!)KmFl84+1~O zpVKPYN^GNMP?{rXY;L6H%}sfx&kvmhgKdiugowJJ9ZpAy)z0x-ycV0M+Y%49Oz2dO z-*&2A83i^b2xy`rcv%R6u8UCBbRB*GEW339s+Oi(@&M>uJX0h7gjIEhJ6dd& z;2Gkvd`ukef?4cd zE|eNFZ>*0=z>?xlJJ_2EQAEp5j%Qy)KkzL@R}h4rAwbjh1XXUhf-5%+K{L>VD$Ay- zBel!38(xNrqUIgPREBj3i>e_HKvRQiQL~|A7)}>kjuPrd9_nfbOuK`%Uy8MCf?SG8 z4ddx<6^u49#Yq##z#h}V@pD1s<5qGaP0{v=9Yli9kv~ju2)1Hu1-t1h%0Rwg7ZqF1 z>IQ^{EawXa)3);kP0$g{H3->PfKUwfEn%}QCgKu8zKmF<6+gGj*+FZ{;?%CNJa`V8-7wNB} MTpV$}D~vDv1J71_;s5{u diff --git a/res/tw1/images/wc_fota_downloading_5.png b/res/tw1/images/wc_fota_downloading_5.png deleted file mode 100755 index f015a4e732ba2e1eede16c7318f21ebae50efc60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1217 zcmbVMTWs4@7dRpEO?U3-;;a zh8Jkjq=8x?#HMwyJr$wBfHByGi^?>KOT`Nt5@H~vF)^e~li15N9=IL1N#UW|1D5S` z@&A3_fBuX2jSLTTc5Lb(2%_eLEPb3r7|k#pHvLjj_Z+4JhVNGCWyZ6p{E<;5Rnx)W;rS9w@*H! zNXtx7qe4EB_f%N31{*#sHik<^W89EUYWw44U#MUL8zP+y?FlDP!W6a4tKfOG%~0gB z2^vpPD^8X3Bc$s3kQCw^Z6p97MKKO|K@`DbB%1&%lfbt~16~nCg-w#pi^6KYSyc*J ze^U#uQdA8gPhpsPy&kV~an~PXfGo=q2g}mff)1t}q=&QsJl>jurU6`j`EibM+% ztnw@?^CIM1JZs?r%ZebIlw_`71R%>xY!b)<;Io1XG)dB0*qjp}-7#QG+rrvSZ1T2P zMfIVMT)*VH6Rj#3skz7vYOY7BMUmV(YB{D`4|<{$t(;hczO@IM{l06H%Q050HS}4I zOQthwmQ&e;C;=d`Y&w&XRW+RvI6+dWCf5AFabvJUOjIQQDVo+6uEc1%+5&j7+C+I}r`IdanJx3%UVYfu^kx68 z7aM-V5sMzYqOi*n%#fq(fb-N zv|XEisdjKSSV&AEIPAsJH}wc>%H`P?H#R4d)KlWJD0A|>Ida|_jEnid*SZ3 zc1`$#LIQCT78#ltCa|a>2Apw5qhv7SU=a*5qY=>$#!OTa6XOTJ>C>&9epvY6ZNaL_CmQ1uY@`^PgF zswyEY?MsjeQvi9jr)+`#a&Jm556YZ^bw7>%T8qyeW+kq0QGsixJ*(M%Ca7c@v$uR7)p~AO_1V-iyOUdy` zF;>-rs}PoV9Fr%AVzKBcdOe0UKu{dVRXAuGhZeX!qB~Lv*X?aJ1`*h@rJ9av=xBve z${IsX2!oz3A3-w{i4|hqt_BK*j3`MaL3v0*(<sA;QE zyNdPR7t0G4kQ~EG8AhR21$}wLG3>lyqC!85?o6w?VifJpN{W_GECNd%21?8_G;}G( zyt;}$?e+S@5h3aoXp#+3RDh<#kq9RU;fT-c3kX;htNh=%5zrx`QY8N=n%Wku#L9G~ z1>j<(iGU6}$AT^L#6=hE*9UgQ#c-;0``*6q+%J$DUp&7-S-0<+>*=;#@2=T(v*C8b z-Sy5|KC*jFOPf21wR8;M{q0=ic(3c2J$2*2S?7x_6LS~-iWJ(rv2QP4`?9s`ovp3k zMCT?q*H2%)fy;m9gQ@F@mecI+Q^!50+GH%-+sTYc}#9^#6P*!^vBDMM<+LYwJMCB>t?;)TfmL;nC%5~|ez diff --git a/res/tw1/images/wc_fota_downloading_7.png b/res/tw1/images/wc_fota_downloading_7.png deleted file mode 100755 index 023aa8e9e491d000af66b8834fd19019536b953e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1188 zcmbVMTWB0r7@oK)A!(qELTid}n7mkZF6Yc;XNGLk-I!AlDRlD zaX0b7O$BL0r0v%FQba+;DirgkZAC0qq6i{QL5m_*5q*;SpgxH8Op=X0gg!XT%(=|} zegAj<%dAXIJT}lb)JIX&K$tM9O%85yssHoG%`Gp6zj=!Fq1UR2vd0{urMfj z<}9vY(^-7-Q#?XZ8Q-nelX`hvvjdMcQyaGBg#=AeBcrX*wC8XFEIjM_Ir`U2AJV{e za&%29^W{*-4fpU;gr}D#s`k>HtvdARK`_$N2!V$a6STZ}Kh|0~dV^OZ^K_e|!G=jP zm!mgD)yq>r4@2$8zyexgOt& zVs~dpsUcCLO-3$BiaBot_JW7~q-5l1@`ZI=M-yZLLue}uR85-^k!3O_vJ^&A@QjF% zD#}>w^6Z3%2+6RRhN2i*YgEQkQANX!aDyqZX6NBrA6|eqUmmtN=&EQEkG9AO@w{Y zIT2}*p39H_MB3}~l98{rZdiZazCD_GqrI}+cWnLSYu4H`=-vM7N3R^edI3}>)!qGf z-O7Q3{kJmw*PZsYzlRSEji0+ebNBL}?0Q>Ri(cPXdGW`-z0t0o_isM9-v0LI->!Z# zF(mT&SMSr$8ntgee)G8%tG4@>!TJlApS}3J^YXsT>fo6VhE9Cf>GbHQzIr-*oBrq# z<@)#W%HZkR?QleaiMVR_&;@#hvEPL diff --git a/res/tw1/images/wc_fota_downloading_8.png b/res/tw1/images/wc_fota_downloading_8.png deleted file mode 100755 index 37f59ec85dd0808be24309d42d4ddcfff92a8883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1273 zcmbVMduZHr98YaGZA;Z{GI2~vvlW~+m)9kigr4P+T zu4V4!M5@kpRsR{AJqqIFU=$zNIZDSs?EIt52SeTFoR1;W;^x2y^$&k(@2Y>4{b5Lc z&+q5+eP^V*>+zPWeTa6X^h2c`&HWPNl_| z(oxX`cR?)Ux_OZx3Wb8N!1yeCfS?3H@Hl81hZ49mWV&h*H=Qk21_d~pt><0cGEt9F zOUJ#fLj-tYTo(@m~OZmgBOes9CRIw4$aaB_TRoyz& zUBU9V#fq{GRM)cOmX)hkL3hS-Ehl5;QMs2xAKsyxDXZXY^HQ|zu>x%US&-_mEdyPO zv8b=2pJtdqNRq>hOp_c>Q9MnDBuS9vki;@9FJl#K>i@=#fCdp>k^HA&3%AYk$;}SHH^j z9Y3;L8_8}x@Y%;bS!{Z;+;TDhQEWYhqAxu2mas>{7qHP67ysP&$jwrG{?l&{Uw^G{ z-8F5)OWSMqp-)(QOJZZorcW*<2Dgs8uiv<`=T^`7d~1Kr#E5Wl|5>Sd;^j-DopYN{ zw?BIA&$Kkj=29l+BEnzQ0_r?u5JcHja4Pa=W;bWPz@Iw$;0~XWQ+% zp>fQJD3~RH7~}9QCS&3dKi~^|&|qfJOfp`A1~U~UCS*j(jG`YVKDX_r9~M5?w0&Os z|NVad=l{~@TbdfnN*^di5Tq=&RY}0H0zT_kEQjxl${7g`RbDjZwc4FtPIUkh*6j{} z#!R&fB!H^-J@EyoN04QfkxY51_#={Ln}nLTA$&6n(Fjt%+0Uw48hB_2=rXJj_Uq|S zFx1dPSQ{Uw;#nDV8(aGw(AwXW)cVs}P{%eujMn=SBrt)eqQ052T*(h%bG#Cq=eJ1= zoip*$A#C2MRJ;Y1Z3mz{!QvW4)2JX2G{*}9y$NL~njtB83pmY5ydW_Fbm79Fnxl70 z38i5{3$8*~x94RglFa3DM2;nFr;DV6!C;<)VQ^@HyM30Y`nct;D=;X))f^-18McMy z8PyKE#|vT5)A=Kq*?4@B*m4&F1w%&qYL=u4iZspqx#p~0F9H5_V@Yc_*_Q=m0=RaM zqrrT1t}B3H?Cva-H-z3u&5i++qGl9Z>oI}l#gq^RzYw~iORT^Gn$|>|4yqc?F&!$d zG94n$i=dNZm>?$ruE4Vto(eDljurVJ+aS<%loOc%9pq^)%FDDOib??+vs_QLG*Hks zp!NcmyCYVT9iV!)leFzjp$b~MZO?YQ?JO#{3TR!MVd-|xU7t_U{D~Fd7`;GmaBLHu zi?L)Zq0g{vARLjStjth?NYf(2gd>rlEQcdJ%ZoC$fYtwR+(_sUnJ<$66is0ZR$_j- z*aC2|*hIjBo#Vh3nVng^3qgwbm=aFS~f_PKf6!eeSC7&sk=7*u%f59En89@ zZv3=jXK`h?@#xs2GxhI{z4bSB^}x$@hlZx7)3Q3Y>h;T!C*SNmJA{HCU-K^9yj@v+ z-Hp6G{J~-J>Glg#@cC%(JHz{1o40Jzmp${x1Xo*Bb(fi7eY}>q^DN@k33ML+uj>H=Hl|>by_ARP#$bwR=kZ{@cfX_SD3^$1aL>JXpK5>X!rcvDZCfF^<*6jEAbc&y@DSoYe?MSH)q zHCR6PnY`uNEo0y8wM#pn&H0>hDY<8&T2QF%tSvJmyIMLtT%KfHdiO4KQu(F5-{+}S zy}MPf@^@c$rl+u=tpBW;mcCoAMZNSiHkPlwy3#XVZ@Rag{CD36hJ1VOfjr6J>FVdQ I&MBb@09%V?`2YX_ diff --git a/rw-update-ani/CMakeLists.txt b/rw-update-ani/CMakeLists.txt deleted file mode 100755 index 466fffc..0000000 --- a/rw-update-ani/CMakeLists.txt +++ /dev/null @@ -1,60 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(rw-update-ani C) - -SET(PREFIX ${CMAKE_INSTALL_PREFIX}) -SET(EXEC_PREFIX "\${prefix}") -SET(LIBDIR "\${prefix}/lib") -SET(INCLUDEDIR "\${prefix}/include") -SET(EDJDIR "\${prefix}/share/edje") -SET(VERSION 0.1) -SET(PKGDIR "${PREFIX}/share/rw-updater") -SET(RESDIR "${PKGDIR}/res") - -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) - -INCLUDE(FindPkgConfig) -pkg_check_modules(pkgs_ani REQUIRED - vconf - cairo - libtbm - libtdm - dlog -) -SET(SRCS_ANI - rw-update-ani_new.c - rw-update_new_fb_cairo.c - rw-update_new_cairo_w_360_360.c - rw-update_new_tdm_display.c -) - -ADD_DEFINITIONS("-DFEATURE_ROTATE") -ADD_DEFINITIONS("-DCAIRO_LIB") - -FOREACH(flag ${pkgs_ani_CFLAGS}) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") -ENDFOREACH(flag) - -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE") -SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") -FIND_PROGRAM(UNAME NAMES uname) -EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") -IF("${ARCH}" MATCHES "^arm.*") - ADD_DEFINITIONS("-DTARGET") - MESSAGE("add -DTARGET") -ENDIF() - -ADD_DEFINITIONS("-DVENDOR=\"${VENDOR}\"") -ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE}\"") -ADD_DEFINITIONS("-DPACKAGE_NAME=\"${PKGNAME}\"") -ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") -ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"") -ADD_DEFINITIONS("-DEDJDIR=\"${EDJDIR}\"") - -SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") - -ADD_EXECUTABLE(rw-update-ani ${SRCS_ANI}) -TARGET_LINK_LIBRARIES(rw-update-ani ${pkgs_ani_LDFLAGS}) - - -INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/rw-update-ani DESTINATION bin) -INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/res/tw1/images DESTINATION ${RESDIR}) diff --git a/rw-update-ani/rw-update-ani_new.c b/rw-update-ani/rw-update-ani_new.c deleted file mode 100755 index 5b62384..0000000 --- a/rw-update-ani/rw-update-ani_new.c +++ /dev/null @@ -1,450 +0,0 @@ -/* - * rw-update animator - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * 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 -#include -#include -#include -#include -#include -#include - -#ifdef CAIRO_LIB -#include "rw-update_new_cairo.h" -#endif -#include -#include -#include - -#include "rw-update_new_common.h" -#include "rw-update_new_fb.h" -#ifdef FEATURE_ROTATE -#include "rw-update_new_common_display.h" -#endif - -#define EVT_LOOP_DURATION 1000 - -#define MAX_KEY_PATH 4 -#define CMDLINE_SIZE 20 - -#define FILE_IO_BUF_SIZE 128 -#define CHG_ENV_BATT_STATUS "/sys/class/power_supply/battery/status" - -FbInfo fbi; - -static pthread_t keyevent_thread; - -static char key_path[MAX_KEY_PATH+1][256]; - -static const char granted_event[5][256] = { - "gpio-keys", - "sci-keypad", - "qpnp_pon", - "LPM_MOTION", - "s2mpw01-power-keys" -}; - -static void update_lang(void) -{ - _FUNC_ENTER; - - char *lang = NULL; - char *r = NULL; - - lang = vconf_get_str(VCONFKEY_LANGSET); - if (lang) { - setenv("LANG", lang, 1); - setenv("LC_MESSAGES", lang, 1); - r = setlocale(LC_ALL, ""); - if (r == NULL) { - r = setlocale(LC_ALL, lang); - if (r) - _DEBUG_LOG("***** setlocale=%s\n", r); - } - - free(lang); - } - - _FUNC_EXIT; -} - -int read_from_file(const char *path, char *buf, size_t size) -{ - _FUNC_ENTER; - - if (path == NULL) { - _DEBUG_EXCEPTION("Inputted parameter is wrong"); - return -1; - } - - if (size == 0) { - _DEBUG_EXCEPTION("Inputted parameter is wrong"); - return 0; - } - - int fd; - ssize_t count; - - fd = open(path, O_RDONLY, 0); - if (fd == -1) { - _DEBUG_EXCEPTION("Could not open '%s'", path); - _FUNC_EXIT; - return -1; - } - _DEBUG_LOG("open '%s'\n", path); - - count = read(fd, buf, size); - if (count > 0) { - count = (count < (ssize_t)size) ? count : ((ssize_t)size - 1); - while (count > 0 && buf[count - 1] == '\n') - count--; - buf[count] = '\0'; - } else { - buf[0] = '\0'; - } - _DEBUG_LOG("read '%s'\n", buf); - - close(fd); - - _FUNC_EXIT; - return (int)count; -} - -static int read_event_node(void) -{ - _FUNC_ENTER; - - FILE *fp = NULL; - char buffer[1024]; - char *event_node = NULL; - int flag = 0; - int i = 0; - int node_cnt = 0; - - for (i = 0; i < sizeof(granted_event) / sizeof(granted_event[0]); i++) { - fp = fopen("/proc/bus/input/devices", "r"); - if (!fp) { - _DEBUG_EXCEPTION("Unable to open file. %m"); - return -1; - } - - memset(buffer, 0, sizeof(buffer)); - while (fgets(buffer, sizeof(buffer), fp)) { - char *ptr = NULL; - if ((ptr = strstr(buffer, granted_event[i]))) - flag = 1; - if (flag) { - if ((ptr = strstr(buffer, "Handlers="))) { - ptr = strstr(ptr, "event"); - if (ptr) { - char *ptr2 = strchr(ptr, ' '); - if (ptr2) - *ptr2 = '\0'; - - flag = 0; - - event_node = strndup(ptr, strlen(ptr)); - if (!event_node) { - fclose(fp); - _DEBUG_EXCEPTION("event_node is null"); - _FUNC_EXIT; - return -1; - } else { - _DEBUG_LOG("event_node : %s", event_node); - snprintf(key_path[node_cnt++], CMDLINE_SIZE, "/dev/input/%s", event_node); - - free(event_node); - - if (node_cnt > MAX_KEY_PATH) { - _DEBUG_EXCEPTION("node_cnt(%d) bigger than MAX_KEY_PATH(%d)", node_cnt, MAX_KEY_PATH); - fclose(fp); - _FUNC_EXIT; - return -1; - } - } - } - } - } else { - flag = 0; - } - } - - fclose(fp); - } - - _FUNC_EXIT; - return node_cnt; -} - -#ifdef FEATURE_ROTATE -static int read_degree(FbInfo *fbi) -{ - _FUNC_ENTER; - - char buffer[256] = {0,}; - int value = 0; - - if (read_from_file("/sys/class/sensors/ssp_sensor/fota_rotate_info", buffer, 256) < 0) { - value = -1; - _DEBUG_EXCEPTION("[%s] err %d", __func__, value); - fbi->degree = 0; - - _FUNC_EXIT; - return value; - } - - fbi->degree = atoi(buffer); - _DEBUG_LOG("fbi->degree : %d", fbi->degree); - - _FUNC_EXIT; - return 0; -} -#endif - -int is_batt_status(void) -{ - int value = 0; - char buf[FILE_IO_BUF_SIZE]; - - if (read_from_file(CHG_ENV_BATT_STATUS, buf, FILE_IO_BUF_SIZE) < 0) { - _DEBUG_EXCEPTION("read_from_file error"); - return -1; - } - if (strncmp(buf, "Charging", 8) == 0) - value = BATT_STATE_CHARGING; - else if (strncmp(buf, "Discharging", 11) == 0) - value = BATT_STATE_DISCONNECT; - else if (strncmp(buf, "Full", 4) == 0) - value = BATT_STATE_FULL; - else - value = BATT_STATE_NOTCHARGE; - - return value; -} - -/*----------------------------------------------------------------------------- - event_monitor_process() - ----------------------------------------------------------------------------*/ -void* event_monitor_process(void *arg) -{ - _FUNC_ENTER; - - int readcount = 0; - int ret = 0; - int i = 0; - int num_arg = *(int *)arg; - static unsigned int sys_power_cnt = 0; - struct pollfd pollevents[MAX_KEY_PATH]; - struct input_event event; - - _DEBUG_LOG("[main] event_monitor_process() started. %d\n", num_arg); - - memset(pollevents, 0, sizeof(pollevents)); - - for (i = 0; i < num_arg; i++) { - if ((pollevents[i].fd = open(key_path[i], O_RDWR)) < 0) { - _DEBUG_EXCEPTION("%s: open error, fd = %d\n", key_path[i], pollevents[i].fd); - - _FUNC_EXIT; - return (void *)i + 1; - } - pollevents[i].events = POLLIN | POLLERR; - } - - while (1) { - ret = poll(pollevents, num_arg, EVT_LOOP_DURATION); - if (ret < 0) - _DEBUG_EXCEPTION("poll error, ret = [%d]\n", ret); - - /* key event */ - for (i = 0; i < num_arg; i++) { - if (pollevents[i].revents & POLLIN) { - readcount = read(pollevents[i].fd, &event, sizeof(event)); - if (readcount != sizeof(event)) { - _DEBUG_EXCEPTION("key[%d] read error, readcount = [%d]\n", i, readcount); - continue; - } - _DEBUG_LOG("poll event:%d, fd:%d type=%d code=%d value=%d sys_power_cnt : %d, arg : %s", i, pollevents[i].fd, event.type, event.code, event.value, sys_power_cnt, key_path[i]); - - if (event.type == EV_KEY) - _DEBUG_LOG("keycode%d : 0x%x, value: %d\n", i, event.code, event.value); -#ifdef FEATURE_ROTATE - else if (event.type == EV_ABS) { - if (event.code == ABS_X) { - _DEBUG_LOG("LPM_MOTION event.code %d, event.value : %d ", event.code, event.value); - if (event.value == 1 || event.value == 3) { - fbi.degree = event.value; - - int battery_state = is_batt_status(); - if (battery_state == BATT_STATE_CHARGING || battery_state == BATT_STATE_FULL) - fb_draw_img_rotate_update(&fbi); - } - } - } else { - _DEBUG_LOG("etc event.code %d, event.value : %d ", event.code, event.value); - } -#endif - } - } - } - - _FUNC_EXIT; - return (void *)0; -} - -int rw_update_process(void) -{ - _FUNC_ENTER; - - int delay = 50000; - //int progress = 0; - - //initialize progress - vconf_set_int("db/SyncML/oma-dm-service/rw-updater-progress", 0); - - while (1) { - usleep(delay); - fb_draw_screen(&fbi); - sleep(1); - } - - _DEBUG_LOG("%s process killed!!", __func__); - - _FUNC_EXIT; - return 0; -} - -static int wait_ani_main_solis(void) -{ - _FUNC_ENTER; - - int ret = 0; - int status = 0; - int event_cnt = 0; - - event_cnt = read_event_node(); - if (event_cnt < 0) - _DEBUG_EXCEPTION("read_event_node failed, event_cnt = [%d]", event_cnt); - -#ifdef FEATURE_ROTATE - /* get degree */ - ret = read_degree(&fbi); - if (ret < 0) - _DEBUG_EXCEPTION("read_degree failed, ret = [%d]", ret); -#endif - /* open display interface */ - if (fb_open(&fbi) < 0) { - _DEBUG_EXCEPTION("fb_open failed"); - goto main_err_exit; - } - - /* cairo initialize */ -#ifdef CAIRO_LIB - cairo_ui_init(fbi.w, fbi.h); -#endif - - _DEBUG_LOG("charging-animation main function called."); - - chg_common_lcd_on(&s_disp); - - ret = pthread_create(&keyevent_thread, NULL, event_monitor_process, (void*)&event_cnt); - if (ret < 0) { - _DEBUG_LOG("[main] event_monitor_process ret : %d", ret); - goto main_exit; - } - - /* image drawing main thread */ - rw_update_process(); - -main_exit: - _DEBUG_LOG("[main] main_exit \n"); - - fb_close(&fbi); - -#ifdef CAIRO_LIB - cairo_ui_exit(); - pthread_join(keyevent_thread, (void *)&status); - _DEBUG_LOG("[main] keyevent_thread err_exit %d\n", status); -#endif - -main_err_exit: - _DEBUG_EXCEPTION("[main] main_err_exit \n"); - exit(0); - - _FUNC_EXIT; - return 0; - -} - -int main(int argc, char *argv[]) -{ - _FUNC_ENTER; - - int opt = 0; - int index = 0; - - struct option options[] = { - {"wait", 0, 0, 0}, - {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"", 0, 0, 0}, - {"", 0, 0, 0}, - {0, 0, 0, 0} - }; - - if (setpriority(PRIO_PROCESS, getpid(), -11) < 0) - _DEBUG_EXCEPTION("failed to setpriority\n"); - - opt = getopt_long(argc, argv, "", options, &index); - if (opt == -1) { - _DEBUG_EXCEPTION("getopt_long failed\n"); - _FUNC_EXIT; - return 0; - } - - switch (index) { - case 0: { - update_lang(); - - int ret = wait_ani_main_solis(); - - _FUNC_EXIT; - return ret; - } - case 1: - break; - case 2: - break; - case 3: - break; - case 4: - break; - default: - break; - } - - _FUNC_EXIT; - return 0; -} - diff --git a/rw-update-ani/rw-update-ani_new.h b/rw-update-ani/rw-update-ani_new.h deleted file mode 100755 index d88eb2e..0000000 --- a/rw-update-ani/rw-update-ani_new.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * rw-update animator - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * 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 __RW_UPDATE_ANI_NEW_H__ -#define __RW_UPDATE_ANI_NEW_H__ - -int is_batt_status(void); - -#endif /* __RW_UPDATE_ANI_H__ */ - diff --git a/rw-update-ani/rw-update-log.h b/rw-update-ani/rw-update-log.h deleted file mode 100755 index 023d15a..0000000 --- a/rw-update-ani/rw-update-log.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * rw-update animator - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * 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 __FOTA_LOG_H__ -#define __FOTA_LOG_H__ - -#include -#include - -#ifdef LOG_TAG -#undef LOG_TAG -#endif - -#define LOG_TAG "FOTA_GUI_RW" - -#define COLOR_RED "\033[0;31m" -#define COLOR_GREEN "\033[0;32m" -#define COLOR_BROWN "\033[0;33m" -#define COLOR_BLUE "\033[0;34m" -#define COLOR_PURPLE "\033[0;35m" -#define COLOR_CYAN "\033[0;36m" -#define COLOR_LIGHTBLUE "\033[0;37m" -#define COLOR_END "\033[0;m" - -#define _DEBUG_SECURE_LOG(fmt, args...) SECURE_SLOGD(fmt, ##args) -#define _DEBUG_SECURE_EXCEPTION(fmt, args...) SECURE_SLOGE(COLOR_RED"* Critical * " fmt COLOR_END, ##args) - -#define _DEBUG_LOG(fmt, args...) SLOGI(fmt, ##args) -#define _DEBUG_INFO(fmt, args...) SLOGI(COLOR_GREEN fmt COLOR_END, ##args) -#define _DEBUG_WARNING(fmt, args...) SLOGW(COLOR_BLUE"* Warning * " fmt COLOR_END, ##args) -#define _DEBUG_CHECK(fmt, args...) SLOGI(COLOR_LIGHTBLUE fmt, ##args) -#define _DEBUG_EXCEPTION(fmt, args...) SLOGE(COLOR_RED"* Critical * " fmt COLOR_END, ##args) -#define _FUNC_ENTER SLOGI(COLOR_GREEN"ENTER >>>>"COLOR_END) -#define _FUNC_EXIT SLOGI(COLOR_GREEN"EXIT <<<<"COLOR_END) - -/* - * DEBUGGING FEATURE - */ - -extern unsigned int __log_level__; -extern FILE *__log_out_file__; - -#define LOG_INFO (1<<8) -#define LOG_RWANI (1<<7) -#define LOG_FUNCS (1<<6) -#define LOG_GUI (1<<5) -#define LOG_DEBUG (1<<4) -#define LOG_FILE (1<<3) -#define LOG_FLASH (1<<2) - -#define LOG_PRFIX "FOTA_GUI" - -#define DEBUG_STDOUT -//#define DEBUG_FILE - -#ifdef DEBUG_STDOUT -#define LOGE(s, args...) printf(LOG_PRFIX "/ERROR(%s) " s, __func__, ##args) // Error log -#define LOGL(mask, s, args...) do { if ((mask) & __log_level__) \ - printf(LOG_PRFIX "/(%s): " s, __func__, ##args); } while (0) -#define LOG(s, args...) LOGL(LOG_DEBUG, s, ##args) - -#elif defined(DEBUG_FILE) -#define LOGE(s, args...) fprintf(__log_out_file__, LOG_PRFIX "/ERROR(%s) " s, __func__, ##args) -#define LOGL(mask, s, args...) do { if ((mask) & __log_level__) \ - fprintf(__log_out_file__, LOG_PRFIX "/(%s): " s , __func__, ##args); } while (0) -#define LOG(s, args...) LOGL(LOG_DEBUG, s, ##args) - -#elif defined(DEBUG_STDOUT_FILE) // debug printf -#define LOGE(s, args...) do {\ - printf(LOG_PRFIX "/ERROR(%s) " s, __func__, ##args);\ - fprintf(__log_out_file__, LOG_PRFIX "/ERROR(%s) " s, __func__, ##args);\ - } while (0) -#define LOGL(mask, s, args...) do { \ - if ((mask) & __log_level__) {\ - printf(LOG_PRFIX "/(%s): " s , __func__, ##args);\ - fprintf(__log_out_file__, LOG_PRFIX "/(%s): " s, __func__, ##args);\ - } \ - } while (0) -#define LOG(s, args...) LOGL(LOG_DEBUG, s, ##args) - -#else -#define LOGE(s, args...) -#define LOGL(mask, s, args...) -#define LOG(s, args...) - -#endif - - -#endif /* __FOTA_LOG_H__ */ - diff --git a/rw-update-ani/rw-update_new_cairo.h b/rw-update-ani/rw-update_new_cairo.h deleted file mode 100755 index a52592c..0000000 --- a/rw-update-ani/rw-update_new_cairo.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * rw-update animator - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * 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 __RW_UPDATE_NEW_CAIRO_H__ -#define __RW_UPDATE_NEW_CAIRO_H__ - -#include - -typedef struct _CairoInfo { - cairo_t *Cr; - cairo_surface_t *Surface; - int id; - int width; - int height; - int currentitem; - int currentfocus; - int currentselected; -} CairoInfo; - -extern long check_existence(const char *file_path); -extern int cairo_ui_init(int width, int height); -extern void cairo_ui_exit(void); -extern void cairo_clear_window(void); -extern void cairo_backgound_image(void); -extern void cairo_mask_image(void); -extern void cairo_update_screen(unsigned int * buffer, unsigned int size); -extern void cairo_draw_main_img(void); -extern void cairo_draw_main_text_img(void); -extern void cairo_draw_progress_bar(unsigned int progress); -extern void cairo_draw_num_progress(int progress, int total); -extern void cairo_draw_text(void); -extern int cairo_get_text_status(void); - -#endif /* __RW_UPDATE_NEW_CAIRO_H__ */ diff --git a/rw-update-ani/rw-update_new_cairo_w_360_360.c b/rw-update-ani/rw-update_new_cairo_w_360_360.c deleted file mode 100755 index 112f08e..0000000 --- a/rw-update-ani/rw-update_new_cairo_w_360_360.c +++ /dev/null @@ -1,492 +0,0 @@ -/* - * rw-update animator - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * 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 -#define _USE_MATH_DEFINES -#include - -#include "rw-update_new_common.h" -#include "rw-update_new_fb.h" -#include "rw-update_new_cairo.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include // dgettext - -CairoInfo cairoinfo; - -#define DEFAULT_FONT "SamsungOneUI" -#define TEXT_COLOR 1, 1, 1 /* #12b4ff */ -#define TEXT_FONT_SIZE_MAX 32 -#define TEXT_FONT_SIZE_MIN 16 - -#define RW_PROCESS_MSG dgettext("rw-updater", "WDS_FOTA_BODY_FINALISING_NUPDATE_ING_ABB") -//#define RW_PROCESS_MSG "Finalising\nupdate..." - - -#if !defined(RESDIR) -#define RESDIR "/usr/share/rw-updater/res" -#endif -#define IMG_BASE RESDIR "/images/" -#define MAIN_IMG_NAME "solis_fota_progress_000.png" -#define POPUP_IMG_NAME "wc_popup_line.png" -#define PROGRESS_IMG_PREFIX "solis_fota_progress_" -#define PROGRESS_BAR_IMG_PREFIX "solis_fota_progress_" -#define PROGRESS_NUM_PREFIX "wc_fota_downloading_" -#define SLASH_IMG_NAME "wc_fota_downloading_slash.png" - -#define RO_TEXT_IMG_FILE_PATH "/opt/usr/data/fota/FotaBgImage2.png" - -#define MAX_FILE_PATH 512 - -#define PROGRESS_IMG_CNT 101 -#define PROGRESS_NUM_CNT 10 - -#define TEXT_FONT_SIZE_MAX 32 -#define TEXT_FONT_SIZE_MIN 16 - -cairo_surface_t *img_surf_main = NULL; -cairo_surface_t *img_surf_popup = NULL; -cairo_surface_t *img_surf_main_txt = NULL; -cairo_surface_t *img_surf_prog[PROGRESS_IMG_CNT] = {NULL,}; -cairo_surface_t *img_surf_num[PROGRESS_NUM_CNT] = {NULL,}; -cairo_surface_t *img_surf_slash = NULL; - -int main_img_x = 0; -int main_img_y = 0; -int main_img_w = 0; -int main_img_h = 0; - -#define BG_COLOR 0.0, 0.0, 0.0 - -#define MAX_BUF_LEN 512 -char s_rw_process_msg1[MAX_BUF_LEN]; -char s_rw_process_msg2[MAX_BUF_LEN]; -int s_bnewline = 0; - -static double s_text_x1 = 0.0; -static double s_text_x2 = 0.0; -static double s_text_y1 = 0.0; -static double s_text_y2 = 0.0; - -static int s_font_sz = 0.0; - -int s_font_initialized = 0; - -/*----------------------------------------------------------------------------- - cairo_update_screen() - ----------------------------------------------------------------------------*/ -void cairo_update_screen(unsigned int *buffer, unsigned int size) -{ - _FUNC_ENTER; - - unsigned char *temp_buffer = NULL; - - /* get buffer pointer of cairo surface */ - temp_buffer = cairo_image_surface_get_data(cairoinfo.Surface); - if (temp_buffer == NULL) { - _DEBUG_EXCEPTION("cairo_update_screen temp_buffer NULL error!!"); - _FUNC_EXIT; - return; - } - - memcpy((void*)buffer, (void*)temp_buffer, size); - - _FUNC_EXIT; -} - -/*----------------------------------------------------------------------------- - cairo_clear_window() - ----------------------------------------------------------------------------*/ -void cairo_clear_window(void) -{ - _FUNC_ENTER; - - /* set default color */ - cairo_set_source_rgb(cairoinfo.Cr, BG_COLOR); - - /* fill buffer to default color */ - cairo_paint(cairoinfo.Cr); - - _FUNC_EXIT; -} - -long check_existence(const char *file_path) -{ - _FUNC_ENTER; - - if (file_path == NULL) { - _DEBUG_EXCEPTION("Inputted paramter is wrong"); - _FUNC_EXIT; - return 0; - } - _DEBUG_LOG("%s\n", file_path); - - struct stat statbuf; - char filename[MAX_FILE_PATH] = {0,}; - - if (strncpy(filename, file_path, strlen(file_path) + 1) == NULL) { - _DEBUG_EXCEPTION("strncpy error=%s\n", filename); - _FUNC_EXIT; - return 0; - } - if (stat(filename, &statbuf)) { - if (ENOENT == errno) { - _DEBUG_EXCEPTION("stat %s: %m\n", filename); - _FUNC_EXIT; - return 0; - } - } - _DEBUG_LOG("satbuf.st_size = %d\n", (int)statbuf.st_size); - - _FUNC_EXIT; - return statbuf.st_size; -} - -/*-----------------------------------------------------------------* - cairo_image_init() - ------------------------------------------------------------------*/ -static void cairo_image_init(void) -{ - _FUNC_ENTER; - - int i = 0; - char img_name[1024] = {0,}; - - snprintf(img_name, 1024, "%s%s", IMG_BASE, MAIN_IMG_NAME); - _DEBUG_LOG("img name = %s\n", img_name); - img_surf_main = cairo_image_surface_create_from_png(img_name); - - for (i = 0; i < PROGRESS_NUM_CNT; i++) { - snprintf(img_name, 1024, "%s%s%d.png", IMG_BASE, PROGRESS_NUM_PREFIX, i); - _DEBUG_LOG("img name = %s\n", img_name); - img_surf_num[i] = cairo_image_surface_create_from_png(img_name); - } - - snprintf(img_name, 1024, "%s%s", IMG_BASE, SLASH_IMG_NAME); - _DEBUG_LOG("img name = %s\n", img_name); - img_surf_slash = cairo_image_surface_create_from_png(img_name); - - if (check_existence((char *)RO_TEXT_IMG_FILE_PATH) > 0) - img_surf_main_txt = cairo_image_surface_create_from_png(RO_TEXT_IMG_FILE_PATH); - - main_img_w = cairo_image_surface_get_width(img_surf_main); - main_img_h = cairo_image_surface_get_height(img_surf_main); - main_img_x = (cairoinfo.width - main_img_w)/2; - main_img_y = 0; - _DEBUG_LOG("main_img_w = %d, main_img_h = %d\n", main_img_w, main_img_h); - _DEBUG_LOG("main_img_x = %d, main_img_y = %d\n", main_img_x, main_img_y); - - _FUNC_EXIT; -} - -/*-----------------------------------------------------------------* - cairo_image_exit() - ------------------------------------------------------------------*/ -static void cairo_image_exit() -{ - _FUNC_ENTER; - - int i = 0; - - cairo_surface_destroy(img_surf_main); - for (i = 0; i < PROGRESS_NUM_CNT; i++) - cairo_surface_destroy(img_surf_num[i]); - cairo_surface_destroy(img_surf_slash); - - if (check_existence((char *)RO_TEXT_IMG_FILE_PATH) > 0) - cairo_surface_destroy(img_surf_main_txt); - - _FUNC_EXIT; -} - -/*----------------------------------------------------------------------------- - cairo_backgound_image() - ----------------------------------------------------------------------------*/ -void cairo_backgound_image(void) -{ -} -/*-----------------------------------------------------------------* - cairo_draw_main_img() - ------------------------------------------------------------------*/ -void cairo_draw_main_img(void) -{ - _FUNC_ENTER; - - cairo_set_source_surface(cairoinfo.Cr, img_surf_main, main_img_x, main_img_y); - cairo_rectangle(cairoinfo.Cr, main_img_x, main_img_y, main_img_w, main_img_h); - cairo_fill(cairoinfo.Cr); - - _FUNC_EXIT; -} - -void cairo_mask_image(void) -{ -#if 0 - cairo_set_source_surface(cairoinfo.Cr, img_surf_black_mask, main_img_x, main_img_y); - cairo_rectangle(cairoinfo.Cr, main_img_x, main_img_y, main_img_w, main_img_h); - cairo_fill(cairoinfo.Cr); -#endif -} - -void cairo_draw_main_text_img(void) -{ - _FUNC_ENTER; - - if (img_surf_main_txt) { - cairo_set_source_surface(cairoinfo.Cr, img_surf_main_txt, main_img_x, main_img_y); - cairo_rectangle(cairoinfo.Cr, main_img_x, main_img_y, main_img_w, main_img_h); - cairo_fill(cairoinfo.Cr); - } - - _FUNC_EXIT; -} - -void cairo_draw_progress_bar(unsigned int progress) -{ - _FUNC_ENTER; - - double xc = 180.0; - double yc = 180.0; - double radius = 180.0; - double angle1 = 270.0 * (M_PI/180.0); - double angle2 = 360.0 * (M_PI/180.0); - - if (progress > 100) - progress = 100; - - if (progress <= 25) - angle2 = (270 + progress * 36 / 10) * (M_PI/180.0); - else if (progress > 25 && progress <= 99) - angle2 = (-90 + progress * 36 / 10) * (M_PI/180.0); - else - angle1 = 0; - - cairo_set_line_width(cairoinfo.Cr, 17.0); - cairo_set_source_rgb(cairoinfo.Cr, 0.0, 0.7, 1.0); - cairo_arc(cairoinfo.Cr, xc, yc, radius, angle1, angle2); - cairo_stroke(cairoinfo.Cr); - - _FUNC_EXIT; -} - -void cairo_draw_num_progress(int progress, int total) -{ - _FUNC_ENTER; - - int img_x = 110; - int img_y = 240; - int num; - - cairo_set_source_rgb(cairoinfo.Cr, BG_COLOR); - cairo_rectangle(cairoinfo.Cr, img_x, img_y, 140, 40); - cairo_fill(cairoinfo.Cr); - - if (total < 10) - img_x += 80; - else if (total < 100) - img_x += 90; - else - img_x += 100; - - num = total; - while (num > 0) { - cairo_set_source_surface(cairoinfo.Cr, img_surf_num[num % 10], img_x, img_y); - cairo_paint(cairoinfo.Cr); - img_x -= 18; - num /= 10; - } - - cairo_set_source_surface(cairoinfo.Cr, img_surf_slash, img_x, img_y); - cairo_paint(cairoinfo.Cr); - img_x -= 17; - - num = progress; - while (num > 0) { - cairo_set_source_surface(cairoinfo.Cr, img_surf_num[num % 10], img_x, img_y); - cairo_paint(cairoinfo.Cr); - img_x -= 18; - num /= 10; - } - - _FUNC_EXIT; -} - -void cairo_draw_text(void) -{ - _FUNC_ENTER; - - _DEBUG_LOG("s_font_initialized"); - - /* set text color */ - cairo_set_source_rgb(cairoinfo.Cr, TEXT_COLOR); - - /* set text font */ - cairo_set_font_size(cairoinfo.Cr, (double)s_font_sz); - cairo_select_font_face(cairoinfo.Cr, DEFAULT_FONT, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - - /* set text position */ - cairo_move_to(cairoinfo.Cr, s_text_x1, s_text_y1); - - if (s_bnewline) - /* set text position */ - cairo_move_to(cairoinfo.Cr, s_text_x2, s_text_y2); - - _FUNC_EXIT; - return; -} - -static void *__thread_font_init(void *arg) -{ - _FUNC_ENTER; - - double text_x1; - double text_x2; - double text_y; - int font_sz = 0; - char* pos_newline; - - /* separate text based on new line */ - s_rw_process_msg1[MAX_BUF_LEN - 1] = 0x00; - s_rw_process_msg2[MAX_BUF_LEN - 1] = 0x00; - strncpy(s_rw_process_msg1, RW_PROCESS_MSG, MAX_BUF_LEN - 1); - strncpy(s_rw_process_msg2, RW_PROCESS_MSG, MAX_BUF_LEN - 1); - _DEBUG_LOG("[%s], [%s]\n", s_rw_process_msg1, s_rw_process_msg2); - - pos_newline = strchr(s_rw_process_msg1, '\n'); - if (pos_newline != NULL) { - strncpy(s_rw_process_msg2, pos_newline + 1, MAX_BUF_LEN - 1); - *pos_newline = 0x00; - s_bnewline = 1; - } - - /* set text font */ - cairo_select_font_face(cairoinfo.Cr, DEFAULT_FONT, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - - /* calculate proper font size */ - for (font_sz = TEXT_FONT_SIZE_MAX; font_sz >= TEXT_FONT_SIZE_MIN; font_sz -= 2) { - /* set font size */ - cairo_set_font_size(cairoinfo.Cr, (double)font_sz); - } - - if (font_sz < TEXT_FONT_SIZE_MIN) - font_sz = TEXT_FONT_SIZE_MIN; - - /* set text position */ - text_x1 = (double)cairoinfo.width / 2; - text_x2 = (double)cairoinfo.width / 2; - - if (s_bnewline) - text_y = 180 - font_sz; - else - text_y = 180; - - /* keep for later use */ - s_text_x1 = text_x1; - s_text_y1 = text_y; - s_text_x2 = text_x2; - s_text_y2 = text_y + ((double)(font_sz)) * 1.2; - s_font_sz = font_sz; - - s_font_initialized = 1; - - _FUNC_EXIT; - return NULL; -} - -/*----------------------------------------------------------------------------- - cairo_ui_init() - ----------------------------------------------------------------------------*/ -int cairo_ui_init(int width, int height) -{ - _FUNC_ENTER; - - _DEBUG_LOG("cairo_image_init w :%d , h :%d", width, height); - - cairo_status_t status; - - /* get LCD resolution from fbinfo */ - cairoinfo.width = width; - cairoinfo.height = height; - - /* create cairo image surface(image surface means memory buffer) */ - cairoinfo.Surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, cairoinfo.width, cairoinfo.height); - status = cairo_surface_status(cairoinfo.Surface); - if (status != CAIRO_STATUS_SUCCESS) { - _DEBUG_EXCEPTION("cairo_image_init surface not create!!"); - _FUNC_EXIT; - return -1; - } - - /* create cairo context */ - cairoinfo.Cr = cairo_create(cairoinfo.Surface); - status = cairo_status(cairoinfo.Cr); - if (status != CAIRO_STATUS_SUCCESS) { - _DEBUG_EXCEPTION("cairo_image_init cairo_create fail!!"); - _FUNC_EXIT; - return -1; - } - - cairo_image_init(); - - cairo_clear_window(); - - /* draw main text image */ - if (check_existence((char *)RO_TEXT_IMG_FILE_PATH) > 0) { - cairo_draw_main_text_img(); - } else { - pthread_t th_id; - - int error = pthread_create(&th_id, NULL, __thread_font_init, NULL); - if (error != 0) { - _DEBUG_EXCEPTION("Thread creation failed errno [%d]\n", errno); - _FUNC_EXIT; - return -1; - } - } - - _FUNC_EXIT; - return 0; -} - -void cairo_ui_exit(void) -{ - _FUNC_ENTER; - - cairo_image_exit(); - cairo_destroy(cairoinfo.Cr); - - _FUNC_EXIT; -} - -int cairo_get_text_status(void) -{ - _FUNC_ENTER; - _FUNC_EXIT; - return s_font_initialized; -} diff --git a/rw-update-ani/rw-update_new_common.h b/rw-update-ani/rw-update_new_common.h deleted file mode 100755 index 77bf179..0000000 --- a/rw-update-ani/rw-update_new_common.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * rw-update animator - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * 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 __RW_UPDATE_NEW_COMMON_H__ -#define __RW_UPDATE_NEW_COMMON_H__ - -#include -#include -#include -#include - -#ifdef LOG_TAG -#undef LOG_TAG -#endif - -#define LOG_TAG "FOTA_GUI_RW" - -#define COLOR_RED "\033[0;31m" -#define COLOR_GREEN "\033[0;32m" -#define COLOR_BROWN "\033[0;33m" -#define COLOR_BLUE "\033[0;34m" -#define COLOR_PURPLE "\033[0;35m" -#define COLOR_CYAN "\033[0;36m" -#define COLOR_LIGHTBLUE "\033[0;37m" -#define COLOR_END "\033[0;m" - -#define _DEBUG_SECURE_LOG(fmt, args...) SECURE_SLOGD(fmt, ##args) -#define _DEBUG_SECURE_EXCEPTION(fmt, args...) SECURE_SLOGE(COLOR_RED"* Critical * " fmt COLOR_END, ##args) - -#define _DEBUG_LOG(fmt, args...) SLOGI(fmt, ##args) -#define _DEBUG_INFO(fmt, args...) SLOGI(COLOR_GREEN fmt COLOR_END, ##args) -#define _DEBUG_WARNING(fmt, args...) SLOGW(COLOR_BLUE"* Warning * " fmt COLOR_END, ##args) -#define _DEBUG_CHECK(fmt, args...) SLOGI(COLOR_LIGHTBLUE fmt, ##args) -#define _DEBUG_EXCEPTION(fmt, args...) SLOGE(COLOR_RED"* Critical * " fmt COLOR_END, ##args) -#define _FUNC_ENTER SLOGI(COLOR_GREEN"ENTER >>>>"COLOR_END) -#define _FUNC_EXIT SLOGI(COLOR_GREEN"EXIT <<<<"COLOR_END) - -#define FILE_IO_BUF_SIZE 128 - -#define TRUE 1 -#define FALSE 0 - -#define UNUSED(x) (void)(x) - -#ifdef FEATURE_ROTATE -enum { - BATT_STATE_CHARGING = 0, - BATT_STATE_FULL, - BATT_STATE_ERROR, - BATT_STATE_DISCONNECT, - BATT_STATE_LOWBATT, - BATT_STATE_OVERVOLTAGE, - BATT_STATE_OVERHEAT, - BATT_STATE_NOTCHARGE, - BATT_STATE_COLD -}; -#endif - -#endif /* __RW_UPDATE_NEW_COMMON_H__ */ diff --git a/rw-update-ani/rw-update_new_common_display.h b/rw-update-ani/rw-update_new_common_display.h deleted file mode 100755 index 456e184..0000000 --- a/rw-update-ani/rw-update_new_common_display.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * rw-update animator - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * 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 __RW_UPDATE_NEW_COMMON_DISPLAY_H__ -#define __RW_UPDATE_NEW_COMMON_DISPLAY_H__ - -#include -#include - -#include -#include -#include - -#define MAX_BUF 2 -#define RGB32_BPP 32 -#define RGB32_PITCH 4 - -typedef struct chg_common_disp { - tdm_display *disp; - tdm_output *output; - tdm_layer *layer; - tdm_pp *pp; - int tdm_fd; - int drm_fd; - - tbm_surface_h surf[MAX_BUF]; - tbm_surface_h pp_surf[MAX_BUF]; - tbm_bufmgr bufmgr; - unsigned int handle[MAX_BUF]; - unsigned int pp_handle[MAX_BUF]; - tbm_bo bo[MAX_BUF]; - tbm_bo_handle bo_handle[MAX_BUF]; - tbm_bo pp_bo[MAX_BUF]; - tbm_bo_handle pp_bo_handle[MAX_BUF]; - void *buffer[MAX_BUF]; - void *pp_buffer[MAX_BUF]; - int buffer_size; - int width; - int height; - int stride; - int current_buf_id; - int degree; - - bool use_tdm_hwc; - tdm_hwc *hwc; -} common_disp; - -typedef enum { - FRONT_BUFFER = 0, - BACK_BUFFER -} BUFFER_TYPE; - -enum { - CHG_DEGREE_0 = 0, - CHG_DEGREE_90 = 1, - CHG_DEGREE_180 = 2, - CHG_DEGREE_270 = 3, -}; - -extern common_disp s_disp; - -int chg_common_display_init(common_disp *st_disp); -void chg_common_display_deinit(common_disp *st_disp); -void chg_common_display_update(common_disp *st_disp); -void chg_common_lcd_on(common_disp *st_disp); -void chg_common_lcd_suspend(common_disp *st_disp); -void chg_common_lcd_off(common_disp *st_disp); -void chg_common_display_rotate(common_disp *st_disp); -#endif /* __RW_UPDATE_NEW_COMMON_DISPLAY_H__ */ diff --git a/rw-update-ani/rw-update_new_fb.h b/rw-update-ani/rw-update_new_fb.h deleted file mode 100755 index 58ef866..0000000 --- a/rw-update-ani/rw-update_new_fb.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * rw-update animator - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * 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 __CHG_FB_H__ -#define __CHG_FB_H__ - -typedef enum _CHG_SLEEP_TYPE { - CHG_SLEEP_TYPE_NORMAL, - CHG_SLEEP_TYPE_EFFECT, - CHG_SLEEP_TYPE_TEMP_ERROR -} CHG_SLEEP_TYPE; - -typedef struct _FbInfo { - unsigned char *buf[2]; - unsigned int current_fb_id; - int w; - int h; - int sz; - int degree; - CHG_SLEEP_TYPE sleep_type; - int full_flag; -} FbInfo; - -extern int fb_open(FbInfo *fbi); -extern void fb_close(FbInfo *fbi); -extern int fb_display(FbInfo *fbi); -extern void fb_clear_screen(FbInfo *fbi, unsigned int color); -extern void fb_fill_rect(FbInfo *fbi, int x1, int y1, int x2, int y2, - unsigned int color); -extern void fb_draw_screen(FbInfo *fbi); -#ifdef FEATURE_ROTATE -extern void fb_draw_img_rotate_update(FbInfo *fbi); -#endif -#endif /* __CHG_FB_H__ */ diff --git a/rw-update-ani/rw-update_new_fb_cairo.c b/rw-update-ani/rw-update_new_fb_cairo.c deleted file mode 100755 index a140ac6..0000000 --- a/rw-update-ani/rw-update_new_fb_cairo.c +++ /dev/null @@ -1,257 +0,0 @@ -/* - * rw-update animator - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * 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 "rw-update-ani_new.h" -#include "rw-update_new_common.h" -#include "rw-update_new_fb.h" -#include -#include -#include - -#ifdef CAIRO_LIB -#include "rw-update_new_cairo.h" -#endif -#include "rw-update_new_common_display.h" - -common_disp s_disp; - -/*----------------------------------------------------------------------------- - fb_open() - ----------------------------------------------------------------------------*/ -int fb_open(FbInfo *fbi) -{ - _FUNC_ENTER; - - memset(&s_disp, 0x00, sizeof(struct chg_common_disp)); - - if (chg_common_display_init(&s_disp)) { - _DEBUG_EXCEPTION("chg_common_display_init fail!!"); - _FUNC_EXIT; - return -1; - } - - fbi->buf[FRONT_BUFFER] = s_disp.buffer[FRONT_BUFFER]; - fbi->buf[BACK_BUFFER] = s_disp.buffer[BACK_BUFFER]; - fbi->current_fb_id = s_disp.current_buf_id; - fbi->w = s_disp.width; - fbi->h = s_disp.height; - fbi->sz = s_disp.buffer_size; - - _FUNC_EXIT; - return 0; -} - -/*----------------------------------------------------------------------------- - fb_close() - ----------------------------------------------------------------------------*/ -void fb_close(FbInfo *fbi) -{ - _FUNC_ENTER; - - chg_common_display_deinit(&s_disp); - - _FUNC_EXIT; -} - -/*------------------------------------------------------------------------------ - fb_display() -------------------------------------------------------------------------------*/ -int fb_display(FbInfo *fbi) -{ - s_disp.current_buf_id = fbi->current_fb_id; - - //_DEBUG_LOG("current_fb_id : %d", fbi->current_fb_id); -#ifdef FEATURE_ROTATE - s_disp.degree = fbi->degree; - - int battery_state = is_batt_status(); - - if ((fbi->degree != CHG_DEGREE_0) && - (battery_state == BATT_STATE_CHARGING || battery_state == BATT_STATE_FULL)) { - chg_common_display_rotate(&s_disp); - } else -#endif - { - chg_common_display_update(&s_disp); - } - - return 0; -} - -#ifdef FEATURE_ROTATE -/*------------------------------------------------------------------------------ - fb_rotate() -------------------------------------------------------------------------------*/ -int fb_rotate(FbInfo *fbi) -{ - s_disp.current_buf_id = fbi->current_fb_id; - _DEBUG_LOG("current_fb_id : %d", fbi->current_fb_id); - s_disp.degree = fbi->degree; - chg_common_display_rotate(&s_disp); - - return 0; -} - -/*----------------------------------------------------------------------------- - fb_draw_img_rotate_update() - ----------------------------------------------------------------------------*/ -void fb_draw_img_rotate_update(FbInfo *fbi) -{ - int ret = 0; - - ret = fb_rotate(fbi); - _DEBUG_LOG("ret : %d", ret); -} -#endif - -/*----------------------------------------------------------------------------- - fb_draw_img_forced_update() - ----------------------------------------------------------------------------*/ -void fb_draw_img_forced_update(FbInfo *fbi) -{ - int ret = 0; - ret = fb_display(fbi); - _DEBUG_LOG("current_fb_id : %d, ret : %d", fbi->current_fb_id, ret); -} -/*----------------------------------------------------------------------------- - fb_draw_img_check_lcd_on() - ----------------------------------------------------------------------------*/ -void fb_draw_img_check_lcd_on(FbInfo *fbi) -{ - _FUNC_ENTER; - - int ret = 0; - - fbi->current_fb_id = FRONT_BUFFER; - //_DEBUG_LOG("current_fb_id :%d", fbi->current_fb_id); - - ret = fb_display(fbi); - _DEBUG_LOG("%s - drawing... ret : %d", __func__, ret); - - _FUNC_EXIT; -} - -/*----------------------------------------------------------------------------- - fb_clear_screen() - ----------------------------------------------------------------------------*/ -void fb_clear_screen(FbInfo *fbi, unsigned int color) -{ - unsigned int *fb_buf_cur = NULL; - int loop_count = fbi->w * fbi->h; - - fb_buf_cur = (unsigned int *)fbi->buf[FRONT_BUFFER]; - - if (fb_buf_cur == NULL) { - _DEBUG_LOG("fb_buf_cur is null error..."); - return; - } - while (loop_count--) - *(fb_buf_cur++) = color; -} - -#ifdef CAIRO_LIB - -/*----------------------------------------------------------------------------- - fb_update_screen() - ----------------------------------------------------------------------------*/ -void fb_update_screen(FbInfo *fbi) -{ - _FUNC_ENTER; - - unsigned int *fb_buf_cur = NULL; - - fb_buf_cur = (unsigned int *)fbi->buf[FRONT_BUFFER]; - if (fb_buf_cur == NULL) { - _DEBUG_EXCEPTION("fb_buf_cur is null error..."); - _FUNC_EXIT; - return; - } - - cairo_update_screen(fb_buf_cur, fbi->sz); - - _FUNC_EXIT; -} - -static int progress_before = -1; -static int total = 0; - -void fb_draw_screen(FbInfo *fbi) -{ - _FUNC_ENTER; - - int acc; - int progress = 0; - static int b_text_drawn = 0; - FILE *fp; - - if (total <= 0 && access("/tmp/upgrade/total", R_OK) == 0) { - fp = fopen("/tmp/upgrade/total", "r"); - if (fp) { - if (fscanf(fp, "%d", &total) == EOF) - _DEBUG_LOG("Error occurs at reading total"); - if (total < 0) - total = 0; - if (total > 0xffffff) - total = 0xffffff; - fclose(fp); - } else - total = 0; - } - - if (access("/tmp/upgrade/progress", R_OK) == 0) { - fp = fopen("/tmp/upgrade/progress", "r"); - if (fp) { - if (fscanf(fp, "%d", &progress) == EOF) - _DEBUG_LOG("Error occurs at reading progress"); - if (progress < 0) - progress = 0; - if (progress > total) - progress = total; - fclose(fp); - } else - progress = 0; - } - - _DEBUG_LOG("progress: %d/%d", progress, total); - - if (total > 0 && progress > progress_before) { - for (acc = progress_before + 1; acc <= progress; acc++) { - /* draw image */ - cairo_draw_main_img(); - - cairo_draw_progress_bar(100 * acc / total); - cairo_draw_num_progress(acc, total); - - if (cairo_get_text_status() == 1) { - if (b_text_drawn == 0) { - cairo_draw_text(); - b_text_drawn = 1; - } - } - - fb_update_screen(fbi); - fb_draw_img_check_lcd_on(fbi); - } - progress_before = progress; - } - - _FUNC_EXIT; -} -#endif diff --git a/rw-update-ani/rw-update_new_tdm_display.c b/rw-update-ani/rw-update_new_tdm_display.c deleted file mode 100755 index a8ff0f7..0000000 --- a/rw-update-ani/rw-update_new_tdm_display.c +++ /dev/null @@ -1,465 +0,0 @@ -/* - * rw-update animator - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "rw-update_new_common.h" -#include "rw-update_new_common_display.h" - -static void chg_common_display_commit_handler_cb(tdm_output *output, unsigned int sequence, - unsigned int tv_sec, unsigned int tv_usec, void *user_data) -{ - _DEBUG_LOG("commit_handle_cb!!\n"); - return; -} - -int chg_common_display_init(common_disp *st_disp) -{ - _FUNC_ENTER; - - int color = 0; - int buf_cnt; - int output_count = 0; - int i = 0; - - tdm_error err = TDM_ERROR_NONE; - tdm_output *output = NULL; - tdm_output_type output_type = TDM_OUTPUT_TYPE_Unknown; - tdm_output_conn_status conn_status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED; - const tdm_output_mode *output_mode; - tdm_info_layer layer_info; - tbm_surface_info_s surf_info; - - st_disp->disp = tdm_display_init(&err); - if (!st_disp->disp) { - _DEBUG_EXCEPTION("failed to init tdm_display. error num = %d\n", err); - goto exit; - } - - err = tdm_display_get_fd(st_disp->disp, &st_disp->tdm_fd); - if (err != TDM_ERROR_NONE) { - _DEBUG_EXCEPTION("failed to get tdm fd. error num = %d\n", err); - goto exit; - } - - st_disp->drm_fd = tdm_helper_get_fd("TDM_DRM_MASTER_FD"); - if (st_disp->drm_fd == -1) { - _DEBUG_EXCEPTION("failed to get tdm fd. error num = %d\n", err); - goto exit; - } - - err = tdm_display_get_output_count(st_disp->disp, &output_count); - if (err != TDM_ERROR_NONE) { - _DEBUG_EXCEPTION("failed to get output count. error num = %d\n", err); - goto exit; - } - - for (i = 0; i < output_count; i++) { - output = tdm_display_get_output(st_disp->disp, i, &err); - if (err != TDM_ERROR_NONE) { - _DEBUG_EXCEPTION("failed to get outout. error num = %d\n", err); - goto exit; - } - - err = tdm_output_get_output_type(output, &output_type); - if (err != TDM_ERROR_NONE) { - _DEBUG_EXCEPTION("failed to get output type. error num = %d\n", err); - goto exit; - } - - err = tdm_output_get_conn_status(output, &conn_status); - if (err != TDM_ERROR_NONE) { - _DEBUG_EXCEPTION("failed to get output connection status. error num = %d\n", err); - goto exit; - } - - _DEBUG_LOG("output_type=%d conn_status=%d\n", output_type, conn_status); - if ((output_type == TDM_OUTPUT_TYPE_LVDS || output_type == TDM_OUTPUT_TYPE_DSI) && - (conn_status == TDM_OUTPUT_CONN_STATUS_CONNECTED)) { - int cnt = 0; - err = tdm_output_get_available_modes(output, &output_mode, &cnt); - if (err != TDM_ERROR_NONE) { - _DEBUG_EXCEPTION("failed to get output available modes. error num = %d\n", err); - goto exit; - } - - err = tdm_output_set_mode(output, &output_mode[0]); - if (err != TDM_ERROR_NONE) { - _DEBUG_EXCEPTION("failed to set mode. error num = %d\n", err); - goto exit; - } - - /* GET MODE INFO */ - st_disp->output = output; - st_disp->width = output_mode->hdisplay; - st_disp->height = output_mode->vdisplay; - - unsigned int width_mm = 0; - unsigned int height_mm = 0; - - err = tdm_output_get_physical_size(output, &width_mm, &height_mm); - _DEBUG_LOG("err = [%d]", err); - _DEBUG_LOG("TDM_OUTPUT_MODE:name[%s] mode:wh[%d %d] mm[%d %d]", output_mode->name, st_disp->width, st_disp->height, width_mm, height_mm); - - break; - } - } - - /* MEMORY ALLOCATION */ - st_disp->bufmgr = tbm_bufmgr_init(st_disp->drm_fd); - if (!st_disp->bufmgr) { - _DEBUG_EXCEPTION("failed to tbm_bufmgr_init\n"); - goto exit; - } - - st_disp->buffer_size = st_disp->width * st_disp->height * RGB32_PITCH; - st_disp->stride = st_disp->width * RGB32_PITCH; - - surf_info.width = st_disp->width; - surf_info.height = st_disp->height; - surf_info.format = TBM_FORMAT_ARGB8888; - surf_info.bpp = 32; - surf_info.size = st_disp->buffer_size; - surf_info.num_planes = 1; - surf_info.planes[0].size = st_disp->buffer_size; - surf_info.planes[0].offset = 0; - surf_info.planes[0].stride = st_disp->stride; - - for (buf_cnt = 0; buf_cnt < MAX_BUF; buf_cnt++) { - st_disp->bo[buf_cnt] = tbm_bo_alloc(st_disp->bufmgr, st_disp->buffer_size, TBM_BO_NONCACHABLE); - if (!st_disp->bo[buf_cnt]) { - _DEBUG_EXCEPTION("failed to tbm_bo_alloc\n"); - goto exit; - } - - st_disp->bo_handle[buf_cnt] = tbm_bo_map(st_disp->bo[buf_cnt], TBM_DEVICE_CPU, TBM_OPTION_WRITE); - st_disp->buffer[buf_cnt] = st_disp->bo_handle[buf_cnt].ptr; - st_disp->handle[buf_cnt] = tbm_bo_get_handle(st_disp->bo[buf_cnt], TBM_DEVICE_2D).u32; - - memset(st_disp->buffer[buf_cnt], color, st_disp->stride * st_disp->height); - - tbm_bo_unmap(st_disp->bo[buf_cnt]); - - st_disp->surf[buf_cnt] = tbm_surface_internal_create_with_bos(&surf_info, &st_disp->bo[buf_cnt], 1); - if (!st_disp->surf[buf_cnt]) { - _DEBUG_EXCEPTION("failed to create tbm_surface!!\n"); - goto exit; - } - } - -#ifdef FEATURE_ROTATE - for (buf_cnt = 0; buf_cnt < MAX_BUF; buf_cnt++) { - st_disp->pp_bo[buf_cnt] = tbm_bo_alloc(st_disp->bufmgr, st_disp->buffer_size, TBM_BO_NONCACHABLE); - if (!st_disp->pp_bo[buf_cnt]) { - _DEBUG_EXCEPTION("failed to tbm_bo_alloc pp\n"); - goto exit; - } - - st_disp->pp_bo_handle[buf_cnt] = tbm_bo_map(st_disp->pp_bo[buf_cnt], TBM_DEVICE_CPU, TBM_OPTION_WRITE); - st_disp->pp_buffer[buf_cnt] = st_disp->pp_bo_handle[buf_cnt].ptr; - st_disp->pp_handle[buf_cnt] = tbm_bo_get_handle(st_disp->pp_bo[buf_cnt], TBM_DEVICE_2D).u32; - - memset(st_disp->pp_buffer[buf_cnt], 0x00, st_disp->stride * st_disp->height); - - tbm_bo_unmap(st_disp->pp_bo[buf_cnt]); - - st_disp->pp_surf[buf_cnt] = tbm_surface_internal_create_with_bos(&surf_info, &st_disp->pp_bo[buf_cnt], 1); - if (!st_disp->surf[buf_cnt]) { - _DEBUG_EXCEPTION("failed to create tbm_surface for pp!!\n"); - goto exit; - } - _DEBUG_LOG("pp:b[%d]hdl[%d]", buf_cnt, st_disp->pp_handle[buf_cnt]); - } -#endif - - /* CHECK HWC USAGE */ - tdm_output_capability output_caps; - tdm_output_get_capabilities(st_disp->output, &output_caps); - if (output_caps & TDM_OUTPUT_CAPABILITY_HWC) - st_disp->use_tdm_hwc = true; - else - st_disp->use_tdm_hwc = false; - - /* SET LAYER */ - if (st_disp->use_tdm_hwc) { - st_disp->hwc = tdm_output_get_hwc(st_disp->output, &err); - if (!st_disp->hwc) { - _DEBUG_EXCEPTION("failed to get hwc. error num = %d\n", err); - goto exit; - } - } else { - tdm_layer_capability layer_caps; - tdm_layer *tmp_layer = NULL; - - for (i = 0; i < output_count; i++) { - tmp_layer = tdm_output_get_layer(st_disp->output, output_count, &err); - tdm_layer_get_capabilities(tmp_layer, &layer_caps); - if (layer_caps & TDM_LAYER_CAPABILITY_PRIMARY) - break; - } - - if (!tmp_layer) { - _DEBUG_EXCEPTION("failed to get output layer. error num = %d\n", err); - goto exit; - } - - st_disp->layer = tmp_layer; - - layer_info.src_config.size.h = st_disp->width; - layer_info.src_config.size.v = st_disp->height; - layer_info.src_config.pos.x = 0; - layer_info.src_config.pos.y = 0; - layer_info.src_config.pos.w = st_disp->width; - layer_info.src_config.pos.h = st_disp->height; - layer_info.src_config.format = TBM_FORMAT_ARGB8888; - layer_info.dst_pos.x = 0; - layer_info.dst_pos.y = 0; - layer_info.dst_pos.w = st_disp->width; - layer_info.dst_pos.h = st_disp->height; - layer_info.transform = TDM_TRANSFORM_NORMAL; - - err = tdm_layer_set_info(st_disp->layer, &layer_info); - if (err != TDM_ERROR_NONE) { - _DEBUG_EXCEPTION("failed to get output layer. error num = %d\n", err); - goto exit; - } - } - - /* SETUP PP */ -#ifdef FEATURE_ROTATE - st_disp->pp = tdm_display_create_pp(st_disp->disp, &err); - if (err != TDM_ERROR_NONE) { - _DEBUG_EXCEPTION("failed to get output layer. error num = %d\n", err); - goto exit; - } -#endif - - st_disp->current_buf_id = 0; - _DEBUG_LOG("done"); - _FUNC_EXIT; - return 0; - -exit: - chg_common_display_deinit(st_disp); - _FUNC_EXIT; - return -1; -} - -void chg_common_display_deinit(common_disp *st_disp) -{ - _FUNC_ENTER; - - int buf_cnt = 0; - - if (st_disp->disp != NULL) { - /* RELEASE RESOURCE */ - for (buf_cnt = 0; buf_cnt < MAX_BUF; buf_cnt++) { - if (st_disp->surf[buf_cnt] != NULL) - tbm_surface_destroy(st_disp->surf[buf_cnt]); - - if (st_disp->bo[buf_cnt] != NULL) - tbm_bo_unref(st_disp->bo[buf_cnt]); - -#ifdef FEATURE_ROTATE - if (st_disp->pp_surf[buf_cnt] != NULL) - tbm_surface_destroy(st_disp->pp_surf[buf_cnt]); - - if (st_disp->pp_bo[buf_cnt] != NULL) - tbm_bo_unref(st_disp->pp_bo[buf_cnt]); -#endif - } - - if (st_disp->bufmgr != NULL) - tbm_bufmgr_deinit(st_disp->bufmgr); - st_disp->bufmgr = NULL; - -#ifdef FEATURE_ROTATE - if (st_disp->pp) { - tdm_pp_destroy(st_disp->pp); - st_disp->pp = NULL; - } -#endif - - tdm_display_deinit(st_disp->disp); - st_disp->disp = NULL; - } - - _FUNC_EXIT; -} - -#ifdef FEATURE_ROTATE -void chg_common_display_rotate(common_disp *st_disp) -{ - int buf_cnt = 0; - int dst_degree = st_disp->degree; - - tdm_error err = TDM_ERROR_NONE; - tdm_info_pp pp_info; - - memset(&pp_info, 0x00, sizeof(tdm_info_pp)); - - pp_info.src_config.size.h = st_disp->width; - pp_info.src_config.size.v = st_disp->height; - pp_info.src_config.pos.x = 0; - pp_info.src_config.pos.y = 0; - pp_info.src_config.pos.w = st_disp->width; - pp_info.src_config.pos.h = st_disp->height; - pp_info.src_config.format = TBM_FORMAT_ARGB8888; - - pp_info.dst_config.size.h = st_disp->width; - pp_info.dst_config.size.v = st_disp->height; - pp_info.dst_config.pos.x = 0; - pp_info.dst_config.pos.y = 0; - pp_info.dst_config.pos.w = st_disp->width; - pp_info.dst_config.pos.h = st_disp->height; - pp_info.dst_config.format = TBM_FORMAT_ARGB8888; - - pp_info.sync = 1; - pp_info.flags = 0; - - switch (dst_degree) { - case CHG_DEGREE_0: - pp_info.transform = TDM_TRANSFORM_NORMAL; - break; - case CHG_DEGREE_90: - pp_info.transform = TDM_TRANSFORM_90; - break; - case CHG_DEGREE_180: - pp_info.transform = TDM_TRANSFORM_180; - break; - case CHG_DEGREE_270: - pp_info.transform = TDM_TRANSFORM_270; - break; - default: - pp_info.transform = TDM_TRANSFORM_NORMAL; - break; - } - - _DEBUG_LOG("dst_degree : %d", dst_degree); - - buf_cnt = st_disp->current_buf_id; - - err = tdm_pp_set_info(st_disp->pp, &pp_info); - if (err != TDM_ERROR_NONE) { - _DEBUG_LOG("failed to set pp info. error num = %d\n", err); - return; - } - - err = tdm_pp_attach(st_disp->pp, st_disp->surf[buf_cnt], st_disp->pp_surf[buf_cnt]); - if (err != TDM_ERROR_NONE) { - _DEBUG_LOG("failed to attach pp. error num = %d\n", err); - return; - } - - err = tdm_pp_commit(st_disp->pp); - if (err != TDM_ERROR_NONE) { - _DEBUG_LOG("failed to attach pp. error num = %d\n", err); - return; - } - - if (st_disp->use_tdm_hwc) { - uint32_t num_types; - tdm_region damage; - memset(&damage, 0, sizeof(damage)); - - tdm_hwc_set_client_target_buffer(st_disp->hwc, st_disp->surf[buf_cnt], damage); - tdm_hwc_validate(st_disp->hwc, NULL, 0, &num_types); - tdm_hwc_accept_validation(st_disp->hwc); - tdm_hwc_commit(st_disp->hwc, 1, chg_common_display_commit_handler_cb, st_disp); - } else { - tdm_layer_set_buffer(st_disp->layer, st_disp->pp_surf[buf_cnt]); - - // TODO: sync or async?? - tdm_output_commit(st_disp->output, 1, chg_common_display_commit_handler_cb, st_disp); - } -} -#endif - - -void chg_common_display_update(common_disp *st_disp) -{ - /* DISPLAY UPDATE */ - int buf_cnt = 0; - - buf_cnt = st_disp->current_buf_id; - //st_disp->current_buf_id = (++st_disp->current_buf_id)%MAX_BUF; - - if (st_disp->use_tdm_hwc) { - uint32_t num_types; - tdm_region damage; - memset(&damage, 0, sizeof(damage)); - - tdm_hwc_set_client_target_buffer(st_disp->hwc, st_disp->surf[buf_cnt], damage); - tdm_hwc_validate(st_disp->hwc, NULL, 0, &num_types); - tdm_hwc_accept_validation(st_disp->hwc); - tdm_hwc_commit(st_disp->hwc, 1, chg_common_display_commit_handler_cb, st_disp); - } else { - tdm_layer_set_buffer(st_disp->layer, st_disp->surf[buf_cnt]); - - // TODO: sync or async?? - tdm_output_commit(st_disp->output, 1, chg_common_display_commit_handler_cb, st_disp); - } - - return; -} - -void chg_common_lcd_on(common_disp *st_disp) -{ - _FUNC_ENTER; - - /* SET DPMS ON */ - _DEBUG_LOG("DPMS ON!\n"); - tdm_output_set_dpms(st_disp->output, TDM_OUTPUT_DPMS_ON); - - _FUNC_EXIT; - return; -} - -void chg_common_lcd_suspend(common_disp *st_disp) -{ - /* SET DPMS SUSPEND */ - _DEBUG_LOG("DPMS SUSPEND!\n"); - tdm_output_set_dpms(st_disp->output, TDM_OUTPUT_DPMS_SUSPEND); - - return; -} - -void chg_common_lcd_off(common_disp *st_disp) -{ - /* SET DPMS OFF */ - _DEBUG_LOG("DPMS OFF!\n"); - tdm_output_set_dpms(st_disp->output, TDM_OUTPUT_DPMS_OFF); - - return; -} -- 2.7.4 From 4b9cf6c84a54fd6c5cd32853bde586b1fef0388b Mon Sep 17 00:00:00 2001 From: Jeon Sang-Heon Date: Tue, 2 Jun 2020 10:46:01 +0900 Subject: [PATCH 06/16] Give permission of /opt/etc/version to system_fw Change-Id: Id9eb08b871679eeaa662611a08a7ec5163737ebd Signed-off-by: Jeon Sang-Heon --- upgrade/rw-update-macro.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/upgrade/rw-update-macro.inc b/upgrade/rw-update-macro.inc index ef7797b..2bd932f 100644 --- a/upgrade/rw-update-macro.inc +++ b/upgrade/rw-update-macro.inc @@ -28,6 +28,8 @@ get_version_info() { write_version_info() { get_version_info echo "OLD_VER=$NEW_VER" > $OLD_VER_INFO + /bin/chmod 775 $OLD_VER_INFO + /bin/chown .system_fw $OLD_VER_INFO } BACKUP_ZIP="/usr/system/RestoreDir/opt.zip" -- 2.7.4 From f39c4440eefeeaabe9c5ac29295b595a690b287d Mon Sep 17 00:00:00 2001 From: Kichan Kwon Date: Wed, 1 Jul 2020 16:01:37 +0900 Subject: [PATCH 07/16] Allow only debug mode file made by root Change-Id: Ib8c35358ec8bdfc0ecd2a84dd5483e3b46e121d4 Signed-off-by: Kichan Kwon --- upgrade/update-init.sh.in | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/upgrade/update-init.sh.in b/upgrade/update-init.sh.in index db05a1b..8f1d15b 100755 --- a/upgrade/update-init.sh.in +++ b/upgrade/update-init.sh.in @@ -5,7 +5,7 @@ PATH=/bin:/usr/bin:/sbin:/usr/sbin RW_MACRO=@TZ_SYS_UPGRADE@/rw-update-macro.inc RW_UPDATE=@TZ_SYS_UPGRADE@/update.sh -DEBUG_MODE=/opt/usr/.upgdebug +DEBUG_MODE_FILE=/opt/usr/.upgdebug if [ -f $RW_MACRO ]; then source $RW_MACRO @@ -22,8 +22,15 @@ fi /etc/gumd/useradd.d/91_user-dbspace-permissions.post owner sleep 10 -if [ -f $DEBUG_MODE ]; then - exit +if [ -f ${DEBUG_MODE_FILE} ]; then + DEBUG_MODE_FILE_OWNER=$(/bin/ls -l ${DEBUG_MODE_FILE} | /bin/cut -d " " -f 3) + if [ "${DEBUG_MODE_FILE_OWNER}" = "root" ]; then + echo "Enter RW debug mode" + echo "If you want to continue FOTA, please run ${RW_UPDATE}" + exit + fi + + echo "Warning: somebody make non-root debug mode file... ignore it" fi exec /bin/sh $RW_UPDATE -- 2.7.4 From ef2d967010e497482b5c47d8789a532484faaf0f Mon Sep 17 00:00:00 2001 From: Kichan Kwon Date: Mon, 6 Jul 2020 11:51:38 +0900 Subject: [PATCH 08/16] Define the prefix of error code - To check where this error occurs Change-Id: I0d8c138816d6beded2f8a339f2601d6ec45486fb Signed-off-by: Kichan Kwon --- upgrade/update.sh.in | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/upgrade/update.sh.in b/upgrade/update.sh.in index b2ac574..014f21f 100755 --- a/upgrade/update.sh.in +++ b/upgrade/update.sh.in @@ -5,7 +5,9 @@ PATH=/bin:/usr/bin:/sbin:/usr/sbin RW_UPDATE_ERROR_NONE=00 -UPI_RW_UPDATE_ERROR=fa1a + +UPI_RW_UPDATE_ERROR_PREFIX=FA +UPI_RW_UPDATE_ERROR=${UPI_RW_UPDATE_ERROR_PREFIX}1A TMP_DIR=/tmp/upgrade UPDATE_DIR=@TZ_SYS_UPGRADE@ -- 2.7.4 From 9ca3d1d1f1cc73fc34a21d108992b6ddcc6fcd32 Mon Sep 17 00:00:00 2001 From: Jeon Sang-Heon Date: Wed, 29 Jul 2020 10:29:23 +0000 Subject: [PATCH 09/16] Fix systemd setting file path to /usr/lib - systemd setting file should be in /usr/lib at 64bit Change-Id: Id3edb1390ecc4bf53dc35d817bac7260c992d345 Signed-off-by: Jeon Sang-Heon --- packaging/system-rw-update.spec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packaging/system-rw-update.spec b/packaging/system-rw-update.spec index 7ef6465..070f222 100644 --- a/packaging/system-rw-update.spec +++ b/packaging/system-rw-update.spec @@ -56,11 +56,11 @@ cp -f rw-script-list/rw-script.list %{buildroot}%{_datadir}/upgrade rm -rf %{buildroot} %posttrans -if [ -e %{_libdir}/udev/rules.d/99-sdb-switch.rules ]; then +if [ -e /usr/lib/udev/rules.d/99-sdb-switch.rules ]; then echo "Exist 99-sdb-switch.rules, Skip!" else - mkdir -p %{_libdir}/udev/rules.d - ln -s /opt/data/update/99-sdb-switch.rules %{_libdir}/udev/rules.d + mkdir -p /usr/lib/udev/rules.d + ln -s /opt/data/update/99-sdb-switch.rules /usr/lib/udev/rules.d fi if [ ! -e %{_bindir}/rstsmack ]; then ln -s %{_bindir}/rstsmack-for-update %{_bindir}/rstsmack -- 2.7.4 From ae8bd7b881c7574a03ac87071d7583bcc95de28b Mon Sep 17 00:00:00 2001 From: Kichan Kwon Date: Tue, 15 Dec 2020 14:58:25 +0900 Subject: [PATCH 10/16] Remove rstsmack and use factory-reset's instead - NOTICE : rstsmack is provided by Public factory-reset please consider it when you migrate this package Change-Id: I9c77bb3b81973b2531f33fd8ee58e5ae5ee025c6 Signed-off-by: Kichan Kwon --- CMakeLists.txt | 3 - packaging/system-rw-update.spec | 9 ++- rstsmack/CMakeLists.txt | 17 ----- rstsmack/rstsmack.c | 154 ---------------------------------------- 4 files changed, 4 insertions(+), 179 deletions(-) delete mode 100755 rstsmack/CMakeLists.txt delete mode 100644 rstsmack/rstsmack.c diff --git a/CMakeLists.txt b/CMakeLists.txt index d2e8a78..fdf84fd 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,3 @@ CONFIGURE_FILE(upgrade/update.sh.in upgrade/update.sh @ONL CONFIGURE_FILE(upgrade/record-version.sh.in upgrade/record-version.sh @ONLY) CONFIGURE_FILE(units/udev-sdb-init.service.in units/udev-sdb-init.service @ONLY) CONFIGURE_FILE(units/offline-update.service.in units/offline-update.service @ONLY) - -#add sub directory -ADD_SUBDIRECTORY(rstsmack) diff --git a/packaging/system-rw-update.spec b/packaging/system-rw-update.spec index 070f222..a6387a6 100644 --- a/packaging/system-rw-update.spec +++ b/packaging/system-rw-update.spec @@ -11,6 +11,10 @@ BuildRequires: cmake BuildRequires: pkgconfig(libsmack) BuildRequires: pkgconfig(libtzplatform-config) +# rstsmack is provided by Public factory-reset +# Please consider it when you migrate this package +Requires: %{_bindir}/rstsmack + %description This package provides files for RW update which is implemented by using systemd offline update. @@ -29,7 +33,6 @@ cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} \ %__make %{?_smp_mflags} %install -%make_install %define upgrade_dir %TZ_SYS_UPGRADE mkdir -p %{buildroot}%{upgrade_dir} @@ -62,9 +65,6 @@ else mkdir -p /usr/lib/udev/rules.d ln -s /opt/data/update/99-sdb-switch.rules /usr/lib/udev/rules.d fi -if [ ! -e %{_bindir}/rstsmack ]; then - ln -s %{_bindir}/rstsmack-for-update %{_bindir}/rstsmack -fi %files %manifest %{name}.manifest @@ -73,4 +73,3 @@ fi %{_unitdir}/offline-update.service %{_unitdir}/system-update.target.wants %{_unitdir}/udev-sdb-init.service -%{_bindir}/rstsmack-for-update diff --git a/rstsmack/CMakeLists.txt b/rstsmack/CMakeLists.txt deleted file mode 100755 index edfbb89..0000000 --- a/rstsmack/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(rstsmack-for-update C) - -SET(SRCS rstsmack.c) -INCLUDE(FindPkgConfig) -pkg_check_modules(pkgs REQUIRED libsmack) - -FOREACH(flag ${pkgs_CFLAGS}) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") -ENDFOREACH(flag) - -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC") - -ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} -pie) - -INSTALL(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME} DESTINATION bin) diff --git a/rstsmack/rstsmack.c b/rstsmack/rstsmack.c deleted file mode 100644 index e17d696..0000000 --- a/rstsmack/rstsmack.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * rstsmack - Restore smack attributes on files - * - * Copyright (c) 2000 - 2017 Samsung Electronics Co., Ltd. - * - * Contact: MyoungJune Park - * Created by Wonil Choi - * - * 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 -#include - -#ifdef DEBUG -# define LOGINFO(fmt, arg...) printf(fmt, ##arg) -#else -# define LOGINFO(fmt, arg...) -#endif - -void print_help(const char *cmd) -{ - printf("Usage: %s \n", cmd); - printf(" INPUT FILE should be same format as generated by" - " chsmack.\n\n"); - printf(" Ex) # chsmack /usr/bin/* > /tmp/rstsmack_input.txt\n"); -} - -static inline int abandonqm(char *label) -{ - int ret = 0; - /* ignore last character which must be a quotation mark */ - ret = (int) strlen(label); - ret--; - if (ret > SMACK_LABEL_LEN || ret <= 0) - return -1; - label[ret] = '\0'; - return 0; -} - -static void set_label(const char *pathname, char *label, int type) -{ - int ret = -1; - - if (abandonqm(label) == 0) { - ret = smack_lsetlabel(pathname, label, type); - if (ret < 0) - perror(pathname); - } else - fprintf(stderr, "The input file has wrong format, %s\n", - pathname); -} - -static int parse_and_set(const char *srcfile) -{ - /* We assume the text format of input file is same as chsmack output */ - FILE *fp; - int ret = 0; - char linebuf[PATH_MAX + 5 * SMACK_LABEL_LEN], pathname[PATH_MAX]; - char label[SMACK_LABEL_LEN + 1]; - char *plabel; /* pointer of beginning smack label */ - fp = fopen(srcfile, "r"); - if (fp == NULL) - return -1; - - while (fgets(linebuf, sizeof(linebuf), fp)) { - plabel = strstr(linebuf, " access="); - - if (plabel && strlen(plabel) >= SMACK_LABEL_LEN) { // handling "The maximum input length is not specified" - fclose(fp); - return -1; - } - if (plabel && linebuf != plabel) { - *plabel = '\0'; - strncpy(pathname, linebuf, sizeof(pathname)); - pathname[sizeof(pathname) - 1] = '\0'; - plabel++; - } else { - linebuf[strlen(linebuf) - 1] = '\0'; - LOGINFO("no label, set label: %s, access=\"_\"(floor)\n", linebuf); - strncpy(label, "_\"", SMACK_LABEL_LEN); - set_label(linebuf, label, SMACK_LABEL_ACCESS); - /* TODO: If file name contains " access=" then it would - * not be processed */ - continue; - } - - LOGINFO("set label: %s,", pathname); - - ret = sscanf(plabel, "access=\"%s", label); - if (ret > 0) { - LOGINFO(" access: \"%s", label); - set_label(pathname, label, SMACK_LABEL_ACCESS); - plabel = plabel + sizeof(" access=\"") + strlen(label); - } - - ret = sscanf(plabel, "execute=\"%s", label); - if (ret > 0) { - LOGINFO(", exec: \"%s", label); - set_label(pathname, label, SMACK_LABEL_EXEC); - plabel = plabel + sizeof(" execute=\"") + strlen(label); - } - - ret = sscanf(plabel, "mmap=\"%s", label); - if (ret > 0) { - LOGINFO(", mmap: \"%s", label); - set_label(pathname, label, SMACK_LABEL_MMAP); - plabel = plabel + sizeof(" mmap=\"") + strlen(label); - } - - ret = sscanf(plabel, "transmute=\"%s", label); - if (ret > 0) { - LOGINFO(", transmute: \"%s", label); - strncpy(label, "1\"", SMACK_LABEL_LEN); - set_label(pathname, label, SMACK_LABEL_TRANSMUTE); - } - LOGINFO("\n"); - - } - - fclose(fp); - return 0; -} - -int main(int argc, char *argv[]) -{ - if (argc < 2) { - print_help(argv[0]); - return -1; - } - if (parse_and_set(argv[1]) < 0) { - print_help(argv[0]); - return -1; - } - return 0; -} -- 2.7.4 From 4b23623f4eaf6455df2b1eb1652943c94ba6fee7 Mon Sep 17 00:00:00 2001 From: Jeon Sang-Heon Date: Fri, 18 Dec 2020 12:32:50 +0000 Subject: [PATCH 11/16] link dbus sockets to system-update.target.wants - End of RW update, reboot doesn't work because dbus doesn't activated. - To solve above problem, force active dbus socket with rw update Change-Id: Ifae69bf649ca180a538ce5851b9ba455daee587e Signed-off-by: Jeon Sang-Heon --- packaging/system-rw-update.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/packaging/system-rw-update.spec b/packaging/system-rw-update.spec index 070f222..68afecb 100644 --- a/packaging/system-rw-update.spec +++ b/packaging/system-rw-update.spec @@ -44,6 +44,7 @@ install -m 644 units/offline-update.service %{buildroot}%{_unitdir} ln -s ../offline-update.service %{buildroot}%{_unitdir}/system-update.target.wants/offline-update.service ln -s ../getty.target %{buildroot}%{_unitdir}/system-update.target.wants ln -s ../cynara.socket %{buildroot}%{_unitdir}/system-update.target.wants +ln -s ../dbus.socket %{buildroot}%{_unitdir}/system-update.target.wants # SDB debugging install -m 644 units/udev-sdb-init.service %{buildroot}%{_unitdir} -- 2.7.4 From 4b4e2889239f180b07eab62e1c4e8319cf1ad6c8 Mon Sep 17 00:00:00 2001 From: Kunhoon Baik Date: Mon, 21 Dec 2020 17:11:14 +0900 Subject: [PATCH 12/16] Change output of stdout/stderr to log file. Remove previous case by case log mechasim. Instead of such way, system-rw-update will log whole stdout/stderr into the @TZ_SYS_VAR@/log/system-rw-update.log Change-Id: If265c863be7bc317277bdbd98628995230d72b56 --- units/offline-update.service.in | 3 ++ upgrade/update.sh.in | 61 +++++++++++++++++++++++++++++------------ 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/units/offline-update.service.in b/units/offline-update.service.in index 5fb87e2..3634da5 100644 --- a/units/offline-update.service.in +++ b/units/offline-update.service.in @@ -7,4 +7,7 @@ After=sysinit.target [Service] Type=oneshot SmackProcessLabel=System::Privileged +ExecStartPre=/bin/rm -f @TZ_SYS_VAR@/log/system-rw-update.log ExecStart=@TZ_SYS_UPGRADE@/update-init.sh +StandardOutput=file:@TZ_SYS_VAR@/log/system-rw-update.log +StandardError=file:@TZ_SYS_VAR@/log/system-rw-update.log diff --git a/upgrade/update.sh.in b/upgrade/update.sh.in index 014f21f..7cce7b2 100755 --- a/upgrade/update.sh.in +++ b/upgrade/update.sh.in @@ -4,6 +4,11 @@ # PATH=/bin:/usr/bin:/sbin:/usr/sbin +COLOR_ERROR='\033[01;31m' +COLOR_DEBUG='\033[01;34m' +COLOR_NOTIFY='\033[01;33m' +COLOR_RESET='\033[00;00m' + RW_UPDATE_ERROR_NONE=00 UPI_RW_UPDATE_ERROR_PREFIX=FA @@ -11,18 +16,35 @@ UPI_RW_UPDATE_ERROR=${UPI_RW_UPDATE_ERROR_PREFIX}1A TMP_DIR=/tmp/upgrade UPDATE_DIR=@TZ_SYS_UPGRADE@ -PATCH_DIR=@TZ_SYS_UPGRADE_SCRIPTS@ +UPDATE_SCRIPT_DIR=@TZ_SYS_UPGRADE_SCRIPTS@ UPDATE_DATA_DIR=/opt/data/update -LOG_FILE=${UPDATE_DATA_DIR}/rw_update.log RESULT_FILE=${UPDATE_DATA_DIR}/result SDB_RULE=${UPDATE_DATA_DIR}/99-sdb-switch.rules VERSION_FILE=/opt/etc/version RW_MACRO=${UPDATE_DIR}/rw-update-macro.inc -RUN=/bin/sh +SHELL=/bin/bash RW_GUI= RW_ANI=/usr/bin/rw-update-ani +DEBUG() +{ + LOG_TEXT=$1 + echo -e "${COLOR_DEBUG}${LOG_TEXT}${COLOR_RESET}" +} + +ERROR() +{ + LOG_TEXT=$1 + echo -e "${COLOR_ERROR}${LOG_TEXT}${COLOR_RESET}" +} + +NOTIFY() +{ + LOG_TEXT=$1 + echo -e "${COLOR_NOTIFY}${LOG_TEXT}${COLOR_RESET}" +} + #------------------------------------------------ # shell script verity check # return 0 : pass @@ -32,7 +54,7 @@ RW_ANI=/usr/bin/rw-update-ani Verity_Check() { if [ "z$1" = "z" ]; then - echo "Input Shell Script Null" >> ${LOG_FILE} + DEBUG "Verity_Check: Input is Null" return 1 fi @@ -47,18 +69,18 @@ Verity_Check() { md5list=`/usr/bin/grep ${SC_FILE} ${SC_LIST} | /usr/bin/awk -F' ' '{print $2}'` if [ "$md5result" = "$md5list" ]; then - echo "[PASS ] ${SC_FILE} verity check" >> ${LOG_FILE} + DEBUG "Verity_Check: [PASS] ${SC_FILE} verity check" return 0 else - echo "[MISMATCH] ${SC_FILE} md5sum" >> ${LOG_FILE} + ERROR "Verity_Check: [MISMATCH] ${SC_FILE} md5sum" return 2 fi else - echo "[No entry] ${SC_FILE} in ${SC_LIST}" >> ${LOG_FILE} + ERROR "Verity_Check: [NO ENTRY] ${SC_FILE} in ${SC_LIST}" return 1 fi else - echo "No such file ${SC_LIST}" >> ${LOG_FILE} + ERROR "Verity_Check: No script list file ${SC_LIST}" return 1 fi } @@ -74,17 +96,17 @@ fi mkdir -p ${RECOVERY_DIR} -echo "System RW update: rw update started" > ${LOG_FILE} +NOTIFY "System RW update: rw update started" # Execute update scripts -if [ ! -d ${PATCH_DIR} ] +if [ ! -d ${UPDATE_SCRIPT_DIR} ] then - echo "FAIL: Upgrade directory does not exist" >> ${LOG_FILE} + ERROR "FAIL: Upgrade directory does not exist" echo "${UPI_RW_UPDATE_ERROR}" > ${RESULT_FILE} else if [ "${RW_GUI}" = "1" ]; then progress=0 - total=`ls -l ${PATCH_DIR} | grep -c '^-'` + total=`ls -l ${UPDATE_SCRIPT_DIR} | grep -c '^-'` mkdir -p ${TMP_DIR} echo ${total} > ${TMP_DIR}/total export XDG_RUNTIME_DIR=/run @@ -92,21 +114,26 @@ else /usr/bin/rw-update-ani --wait & fi - PATCHES=`/bin/ls ${PATCH_DIR}` + UPDATE_SCRIPTS=`/bin/ls ${UPDATE_SCRIPT_DIR}` - for PATCH in ${PATCHES}; do + for UPSCRIPT in ${UPDATE_SCRIPTS}; do if [ "${RW_GUI}" = "1" ]; then progress=$((progress+1)) echo ${progress} > ${TMP_DIR}/progress fi - Verity_Check ${PATCH_DIR}/${PATCH} + Verity_Check ${UPDATE_SCRIPT_DIR}/${UPSCRIPT} # Without verification result, run all scripts - ${RUN} ${PATCH_DIR}/${PATCH} + ${SHELL} ${UPDATE_SCRIPT_DIR}/${UPSCRIPT} + if [ $? -ne 0 ]; then + ERROR "[FAIL] ${UPSCRIPT}" + else + DEBUG "[DONE] ${UPSCRIPT}" + fi done sync - echo "SUCCESS: Upgrade successfully finished" >> ${LOG_FILE} + NOTIFY "SUCCESS: Upgrade successfully finished" echo "${RW_UPDATE_ERROR_NONE}" > ${RESULT_FILE} fi -- 2.7.4 From c018d6f4ca27882927dc3b5d70cb654bf2049ea1 Mon Sep 17 00:00:00 2001 From: Kichan Kwon Date: Mon, 21 Dec 2020 17:38:16 +0900 Subject: [PATCH 13/16] No more check hash value of RW script - Hash checking is for MCD FOTA - To prevent modification without notice - MCD no more uses ours, so we don't have to retain it which bothers script developer Change-Id: Ib473ce99adfe592a574fc01975e61fdff2479fce Signed-off-by: Kichan Kwon --- packaging/system-rw-update.spec | 3 --- rw-script-list/add_rwscript.sh | 31 ------------------------------ rw-script-list/del_rwscript.sh | 22 --------------------- rw-script-list/extract_list.sh | 23 ---------------------- rw-script-list/image_info.txt | 2 -- rw-script-list/rw-script.list | 16 ---------------- upgrade/update.sh.in | 42 ----------------------------------------- 7 files changed, 139 deletions(-) delete mode 100755 rw-script-list/add_rwscript.sh delete mode 100755 rw-script-list/del_rwscript.sh delete mode 100755 rw-script-list/extract_list.sh delete mode 100644 rw-script-list/image_info.txt delete mode 100755 rw-script-list/rw-script.list diff --git a/packaging/system-rw-update.spec b/packaging/system-rw-update.spec index 4bacce7..ffe2c4e 100644 --- a/packaging/system-rw-update.spec +++ b/packaging/system-rw-update.spec @@ -53,9 +53,6 @@ ln -s ../dbus.socket %{buildroot}%{_unitdir}/system-update.target.wants install -m 644 units/udev-sdb-init.service %{buildroot}%{_unitdir} ln -s ../udev-sdb-init.service %{buildroot}%{_unitdir}/system-update.target.wants -# rw-script-list -cp -f rw-script-list/rw-script.list %{buildroot}%{_datadir}/upgrade - %clean rm -rf %{buildroot} diff --git a/rw-script-list/add_rwscript.sh b/rw-script-list/add_rwscript.sh deleted file mode 100755 index 326079b..0000000 --- a/rw-script-list/add_rwscript.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -if [ "$#" != "1" ]; then - echo "Usage:" - echo "add_rwscript.sh " - echo " ex) add_rwscript.sh /home/work3/rw-updater/model/common/scripts/100.rw-updater.recovery.patch.sh" - exit; -fi - -FULLPATH=$1 -SC_NAME=`basename "${FULLPATH}"` - -grep ${SC_NAME} rw-script.list > /dev/null 2>&1 -if [ $? -eq 0 ]; then - cp rw-script.list rw-script.bak - grep -v ${SC_NAME} rw-script.bak > rw-script.list - rm -f rw-script.bak -fi - -POST=`date +"%d%H%M%S"` - -ret=`md5sum ${FULLPATH}` -mret=($(/bin/echo $ret)) -md5result=${mret[0]} - -cp rw-script.list rw-script.bak -echo "${SC_NAME} ${md5result}" >> rw-script.bak -sort -d rw-script.bak > rw-script.list - -rm -f rw-script.bak -echo "Add DONE: ${SC_NAME} ${md5sum}" diff --git a/rw-script-list/del_rwscript.sh b/rw-script-list/del_rwscript.sh deleted file mode 100755 index cc2346a..0000000 --- a/rw-script-list/del_rwscript.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -if [ "$#" != "1" ]; then - echo "Usage:" - echo "del_rwscript.sh " - echo " ex) del_rwscript.sh 220.evas.patch.sh" - exit; -fi - -SC_NAME="$1" - -grep ${SC_NAME} rw-script.list > /dev/null 2>&1 -if [ $? -ne 0 ]; then - echo "No entry ${SC_NAME} in rw-script list" - exit -fi - -cp rw-script.list rw-script.bak -grep -v ${SC_NAME} rw-script.bak > rw-script.list - -rm -f rw-script.bak -echo "Remove DONE: ${SC_NAME} ${GIT_NAME}" diff --git a/rw-script-list/extract_list.sh b/rw-script-list/extract_list.sh deleted file mode 100755 index 50a0db3..0000000 --- a/rw-script-list/extract_list.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# -# extract_list.sh -# Extract RW script list from target device -# - -TEMP_DIR=extract_scripts -SCRIPTS_PATH=/usr/share/upgrade/scripts -MODEL_CONFIG=/etc/config/model-config.xml - -if [ -e ${TEMP_DIR} ]; then - rm -rf ${TEMP_DIR} -fi -mkdir ${TEMP_DIR} - -sdb root on -sdb pull ${SCRIPTS_PATH} ${TEMP_DIR} - -for SCRIPT in ${TEMP_DIR}/*; do - ./add_rwscript.sh ${SCRIPT} -done - -rm -rf ${TEMP_DIR} diff --git a/rw-script-list/image_info.txt b/rw-script-list/image_info.txt deleted file mode 100644 index 2aa1b26..0000000 --- a/rw-script-list/image_info.txt +++ /dev/null @@ -1,2 +0,0 @@ -Base image of RW script list: -tizen-4.0-unified_20171215.1_wearable-wayland-armv7l-tw1 diff --git a/rw-script-list/rw-script.list b/rw-script-list/rw-script.list deleted file mode 100755 index 6de84fe..0000000 --- a/rw-script-list/rw-script.list +++ /dev/null @@ -1,16 +0,0 @@ -201.security_upgrade.sh 869f8e1ba11ee37a17abe1d519a95bc8 -290.buxton2_upgrade.sh ff3ec647dd4c0360b56b3757ae43829a -295.key-manager_upgrade.sh 646b5031c415222c71b4b767c817e7d0 -500.account-manager.sh 43f8ff185180167241e1cd091f66dc06 -500.connman_upgrade.sh 14efbfe125f33d44b22ade08ea64968c -500.crash-manager-upgrade.sh 28c936a201035b086c37dd0438468726 -500.edge-orchestration-upgrade.sh 3284627d8fcfda64b5a50356740ecc4a -500.efl-misc.sh a74f47437c226f3723c02e5759de2ea0 -500.ode_upgrade.sh 1d9b1b99222f780d3b450194fcb75ea9 -500.stc-manager_upgrade.sh d8d98fd0881ec7e3db0a521389c99a6e -500.winsys_upgrade.sh 29ac61e4ac32a27705580614646bf7f0 -501.component_upgrade.sh aa728b7c613daa45e187f7663dc184e8 -502.syspopup_upgrade.sh 369ec9ab48fae5598e24091d76df4175 -504.watchface_complication_upgrade.sh bb3dfebd83cf95cda1a73738b27538a5 -505.notification_upgrade.sh 11dab5281d1a5965ff6a22d8aa37ba4c -700.pkgmgr.patch.sh f2a3ad5d4c7e25b152b2d50d4d7d9117 diff --git a/upgrade/update.sh.in b/upgrade/update.sh.in index 7cce7b2..5620347 100755 --- a/upgrade/update.sh.in +++ b/upgrade/update.sh.in @@ -46,46 +46,6 @@ NOTIFY() } #------------------------------------------------ -# shell script verity check -# return 0 : pass -# return 1 : no entry in rw-script.list -# return 2 : verity fail -#------------------------------------------------ -Verity_Check() { - - if [ "z$1" = "z" ]; then - DEBUG "Verity_Check: Input is Null" - return 1 - fi - - SC_FILE=`/usr/bin/basename $1` - SC_LIST=${UPDATE_DIR}/rw-script.list - if [ -f ${SC_LIST} ]; then - grep ${SC_FILE} ${SC_LIST} > /dev/null 2>&1 - if [ "$?" = "0" ]; then - ret=`/usr/bin/md5sum "$1"` - mret=($(/bin/echo $ret)) - md5result=${mret[0]} - - md5list=`/usr/bin/grep ${SC_FILE} ${SC_LIST} | /usr/bin/awk -F' ' '{print $2}'` - if [ "$md5result" = "$md5list" ]; then - DEBUG "Verity_Check: [PASS] ${SC_FILE} verity check" - return 0 - else - ERROR "Verity_Check: [MISMATCH] ${SC_FILE} md5sum" - return 2 - fi - else - ERROR "Verity_Check: [NO ENTRY] ${SC_FILE} in ${SC_LIST}" - return 1 - fi - else - ERROR "Verity_Check: No script list file ${SC_LIST}" - return 1 - fi -} - -#------------------------------------------------ # main #------------------------------------------------ @@ -121,8 +81,6 @@ else progress=$((progress+1)) echo ${progress} > ${TMP_DIR}/progress fi - Verity_Check ${UPDATE_SCRIPT_DIR}/${UPSCRIPT} - # Without verification result, run all scripts ${SHELL} ${UPDATE_SCRIPT_DIR}/${UPSCRIPT} if [ $? -ne 0 ]; then ERROR "[FAIL] ${UPSCRIPT}" -- 2.7.4 From 38cd1f62cfbe350f3859fd3bdda3076dc6ca2ab4 Mon Sep 17 00:00:00 2001 From: Kunhoon Baik Date: Mon, 21 Dec 2020 18:03:29 +0900 Subject: [PATCH 14/16] Add missing Tizen platform config Change-Id: Iaf6a4d95c45ea61e34fc83840796807f0892b1bc --- packaging/system-rw-update.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/packaging/system-rw-update.spec b/packaging/system-rw-update.spec index ffe2c4e..fadcaaa 100644 --- a/packaging/system-rw-update.spec +++ b/packaging/system-rw-update.spec @@ -28,6 +28,7 @@ cp %{SOURCE1001} . export LDFLAGS+="-Wl,--rpath=%{_prefix}/lib -Wl,--as-needed" LDFLAGS="$LDFLAGS" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} \ + -DTZ_SYS_VAR=%TZ_SYS_VAR \ -DTZ_SYS_UPGRADE=%TZ_SYS_UPGRADE \ -DTZ_SYS_UPGRADE_SCRIPTS=%TZ_SYS_UPGRADE_SCRIPTS %__make %{?_smp_mflags} -- 2.7.4 From 757901f3929a2f94b99ad80727b2a9f974bc093e Mon Sep 17 00:00:00 2001 From: Kunhoon Baik Date: Tue, 22 Dec 2020 11:01:25 +0900 Subject: [PATCH 15/16] Refactoring RW Update - Separation of Update Progress Function - Seperation of Update Result Function with Error Change-Id: I316c8afe2410e565927e5be9c7535843580f8fd4 Signed-off-by: Kunhoon Baik --- packaging/system-rw-update.spec | 12 ++-- upgrade/update.sh.in | 125 ++++++++++++++++++++++++---------------- 2 files changed, 80 insertions(+), 57 deletions(-) diff --git a/packaging/system-rw-update.spec b/packaging/system-rw-update.spec index fadcaaa..a361b6e 100644 --- a/packaging/system-rw-update.spec +++ b/packaging/system-rw-update.spec @@ -1,5 +1,5 @@ Name: system-rw-update -Summary: System RW update management +Summary: System RW Update Manager Version: 1.2.4 Release: 0 Group: Base/Startup @@ -8,16 +8,17 @@ Source0: %{name}-%{version}.tar.bz2 Source1001: %{name}.manifest BuildRequires: cmake -BuildRequires: pkgconfig(libsmack) BuildRequires: pkgconfig(libtzplatform-config) # rstsmack is provided by Public factory-reset # Please consider it when you migrate this package Requires: %{_bindir}/rstsmack +%define upgrade_dir %TZ_SYS_UPGRADE + %description -This package provides files for RW update -which is implemented by using systemd offline update. +System RW update manager provides interface for running platform/application update scripts +after software is updated to new version which is implemented by using systemd offline update. %prep %setup -q @@ -35,7 +36,6 @@ cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} \ %install -%define upgrade_dir %TZ_SYS_UPGRADE mkdir -p %{buildroot}%{upgrade_dir} cp upgrade/99-sdb-switch.rules %{buildroot}%{upgrade_dir} cp upgrade/install-sdb-rule.sh %{buildroot}%{upgrade_dir} @@ -45,7 +45,7 @@ cp upgrade/update-init.sh %{buildroot}%{upgrade_dir} cp upgrade/update.sh %{buildroot}%{upgrade_dir} mkdir -p %{buildroot}%{_unitdir}/system-update.target.wants install -m 644 units/offline-update.service %{buildroot}%{_unitdir} -ln -s ../offline-update.service %{buildroot}%{_unitdir}/system-update.target.wants/offline-update.service +ln -s ../offline-update.service %{buildroot}%{_unitdir}/system-update.target.wants/ ln -s ../getty.target %{buildroot}%{_unitdir}/system-update.target.wants ln -s ../cynara.socket %{buildroot}%{_unitdir}/system-update.target.wants ln -s ../dbus.socket %{buildroot}%{_unitdir}/system-update.target.wants diff --git a/upgrade/update.sh.in b/upgrade/update.sh.in index 5620347..3377c2c 100755 --- a/upgrade/update.sh.in +++ b/upgrade/update.sh.in @@ -1,31 +1,20 @@ #!/bin/sh # -# RW update script +# System RW Update Script # -PATH=/bin:/usr/bin:/sbin:/usr/sbin COLOR_ERROR='\033[01;31m' COLOR_DEBUG='\033[01;34m' COLOR_NOTIFY='\033[01;33m' COLOR_RESET='\033[00;00m' +PATH=/bin:/usr/bin:/sbin:/usr/sbin +SHELL=/bin/bash -RW_UPDATE_ERROR_NONE=00 - -UPI_RW_UPDATE_ERROR_PREFIX=FA -UPI_RW_UPDATE_ERROR=${UPI_RW_UPDATE_ERROR_PREFIX}1A - -TMP_DIR=/tmp/upgrade -UPDATE_DIR=@TZ_SYS_UPGRADE@ UPDATE_SCRIPT_DIR=@TZ_SYS_UPGRADE_SCRIPTS@ UPDATE_DATA_DIR=/opt/data/update -RESULT_FILE=${UPDATE_DATA_DIR}/result SDB_RULE=${UPDATE_DATA_DIR}/99-sdb-switch.rules -VERSION_FILE=/opt/etc/version -RW_MACRO=${UPDATE_DIR}/rw-update-macro.inc -SHELL=/bin/bash -RW_GUI= -RW_ANI=/usr/bin/rw-update-ani +RW_MACRO=@TZ_SYS_UPGRADE@/rw-update-macro.inc DEBUG() { @@ -45,67 +34,101 @@ NOTIFY() echo -e "${COLOR_NOTIFY}${LOG_TEXT}${COLOR_RESET}" } -#------------------------------------------------ -# main -#------------------------------------------------ +PROGRESS_DIR=/tmp/upgrade +PROGRESS_INIT() +{ + mkdir -p ${PROGRESS_DIR} + echo "$1" > ${PROGRESS_DIR}/total + echo "0" > ${PROGRESS_DIR}/progress -# Check GUI availability -if [ -e ${RW_ANI} ]; then - RW_GUI=1 -fi + # if GUI is available, run the GUI + if [ -e "/usr/bin/rw-update-ani" ]; then + export XDG_RUNTIME_DIR=/run + export TBM_DISPLAY_SERVER=1 + /usr/bin/rw-update-ani --wait & + fi +} + +PROGRESS() +{ + echo "$1" > ${PROGRESS_DIR}/progress +} -mkdir -p ${RECOVERY_DIR} +# This result file will be used for Platform Update Control API to get update result. +UPDATE_RESULT_FILE=${UPDATE_DATA_DIR}/result +UPI_RW_UPDATE_ERROR_NONE=00 +UPI_RW_UPDATE_ERROR_PREFIX=FA +UPI_RW_UPDATE_ERROR_FAIL=${UPI_RW_UPDATE_ERROR_PREFIX}1A +SET_UPDATE_RESULT() +{ + echo "$1" > ${UPDATE_RESULT_FILE} +} +NOTIFY "----------------------------------------------------------------------" NOTIFY "System RW update: rw update started" -# Execute update scripts +UPDATE_PREPARE_ERR=0 +UPDATE_PROGRESS_ERR=0 + +if [ -f $RW_MACRO ]; +then + source $RW_MACRO +else + ERROR "FAIL: Upgrade macro does not exist" + UPDATE_PREPARE_ERR=1 +fi + if [ ! -d ${UPDATE_SCRIPT_DIR} ] then ERROR "FAIL: Upgrade directory does not exist" - echo "${UPI_RW_UPDATE_ERROR}" > ${RESULT_FILE} + UPDATE_PREPARE_ERR=1 +fi + +# Execute update scripts +if [ ${UPDATE_PREPARE_ERR} = "1" ] +then + ERROR "FAIL: Update preparation was failed" + SET_UPDATE_RESULT ${UPI_RW_UPDATE_ERROR_FAIL} else - if [ "${RW_GUI}" = "1" ]; then - progress=0 - total=`ls -l ${UPDATE_SCRIPT_DIR} | grep -c '^-'` - mkdir -p ${TMP_DIR} - echo ${total} > ${TMP_DIR}/total - export XDG_RUNTIME_DIR=/run - export TBM_DISPLAY_SERVER=1 - /usr/bin/rw-update-ani --wait & - fi + get_version_info + DEBUG "Version OLD: ${OLD_VER}, NEW: ${NEW_VER}" - UPDATE_SCRIPTS=`/bin/ls ${UPDATE_SCRIPT_DIR}` + TOTAL_TASKS=`ls -l ${UPDATE_SCRIPT_DIR} | grep -c '^-'` + PROGRESS_INIT ${TOTAL_TASKS} + UPDATE_SCRIPTS=`/bin/ls ${UPDATE_SCRIPT_DIR}` + NOTIFY "TOTAL TASKS: ${TOTAL_TASKS}" for UPSCRIPT in ${UPDATE_SCRIPTS}; do - if [ "${RW_GUI}" = "1" ]; then - progress=$((progress+1)) - echo ${progress} > ${TMP_DIR}/progress - fi + NOTIFY "CURRENT TASK: ${CURRENT_TASK} ${UPSCRIPT}" ${SHELL} ${UPDATE_SCRIPT_DIR}/${UPSCRIPT} if [ $? -ne 0 ]; then ERROR "[FAIL] ${UPSCRIPT}" + UPDATE_PROGRESS_ERR=1 else DEBUG "[DONE] ${UPSCRIPT}" fi + PROGRESS ${CURRENT_TASK} + CURRENT_TASK=$(( ${CURRENT_TASK} + 1 )) done - sync + write_version_info - NOTIFY "SUCCESS: Upgrade successfully finished" - echo "${RW_UPDATE_ERROR_NONE}" > ${RESULT_FILE} + if [ ${UPDATE_PROGRESS_ERR} = "1" ] + then + NOTIFY "SUCCESS: Upgrade finished, but some scripts are failed" + SET_UPDATE_RESULT ${UPI_RW_UPDATE_ERROR_FAIL} + else + NOTIFY "SUCCESS: Upgrade successfully finished" + SET_UPDATE_RESULT ${UPI_RW_UPDATE_ERROR_NONE} + fi fi if [ -e ${SDB_RULE} ]; then rm ${SDB_RULE} fi -if [ -e ${VERSION_FILE} ]; then - rm ${VERSION_FILE} - if [ -e ${RW_MACRO} ]; then - source ${RW_MACRO} - write_version_info - fi -fi +/bin/sync +NOTIFY "----------------------------------------------------------------------" -# Reboot -reboot -f +#Reboot +/sbin/reboot -f -- 2.7.4 From 37510617ecd3220197406c30b0ac8a9e6a7665e6 Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Mon, 1 Mar 2021 15:09:28 +0100 Subject: [PATCH 16/16] Add checkpoint for user and system_data partitions. Change-Id: Ibde9fb6e98d6128549d5a11e417a3d461dce293b --- CMakeLists.txt | 1 + packaging/system-rw-update.spec | 18 +++++++++- units/data-checkpoint.service.in | 17 +++++++++ units/data-checkpoint.target | 7 ++++ units/udev-trigger-dmbow@.service | 17 +++++++++ upgrade/update-checkpoint-create.sh | 69 +++++++++++++++++++++++++++++++++++++ upgrade/update.sh.in | 2 +- 7 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 units/data-checkpoint.service.in create mode 100644 units/data-checkpoint.target create mode 100644 units/udev-trigger-dmbow@.service create mode 100755 upgrade/update-checkpoint-create.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index fdf84fd..5481ce4 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,3 +7,4 @@ CONFIGURE_FILE(upgrade/update.sh.in upgrade/update.sh @ONL CONFIGURE_FILE(upgrade/record-version.sh.in upgrade/record-version.sh @ONLY) CONFIGURE_FILE(units/udev-sdb-init.service.in units/udev-sdb-init.service @ONLY) CONFIGURE_FILE(units/offline-update.service.in units/offline-update.service @ONLY) +CONFIGURE_FILE(units/data-checkpoint.service.in units/data-checkpoint.service @ONLY) diff --git a/packaging/system-rw-update.spec b/packaging/system-rw-update.spec index a361b6e..aa184e2 100644 --- a/packaging/system-rw-update.spec +++ b/packaging/system-rw-update.spec @@ -1,6 +1,6 @@ Name: system-rw-update Summary: System RW Update Manager -Version: 1.2.4 +Version: 1.3.0 Release: 0 Group: Base/Startup License: Apache-2.0 @@ -43,6 +43,7 @@ cp upgrade/record-version.sh %{buildroot}%{upgrade_dir} cp upgrade/rw-update-macro.inc %{buildroot}%{upgrade_dir} cp upgrade/update-init.sh %{buildroot}%{upgrade_dir} cp upgrade/update.sh %{buildroot}%{upgrade_dir} +cp upgrade/update-checkpoint-create.sh %{buildroot}%{upgrade_dir} mkdir -p %{buildroot}%{_unitdir}/system-update.target.wants install -m 644 units/offline-update.service %{buildroot}%{_unitdir} ln -s ../offline-update.service %{buildroot}%{_unitdir}/system-update.target.wants/ @@ -54,6 +55,17 @@ ln -s ../dbus.socket %{buildroot}%{_unitdir}/system-update.target.wants install -m 644 units/udev-sdb-init.service %{buildroot}%{_unitdir} ln -s ../udev-sdb-init.service %{buildroot}%{_unitdir}/system-update.target.wants +# DM-BOW device prepare +install -m 644 units/udev-trigger-dmbow@.service %{buildroot}%{_unitdir} +ln -s ../udev-trigger-dmbow@.service %{buildroot}%{_unitdir}/system-update.target.wants/udev-trigger-dmbow@user.service + +# data checkpoint target +install -m 644 units/data-checkpoint.target %{buildroot}%{_unitdir} +install -m 644 units/data-checkpoint.service %{buildroot}%{_unitdir} +ln -s ../data-checkpoint.target %{buildroot}%{_unitdir}/system-update.target.wants +mkdir -p %{buildroot}%{_unitdir}/data-checkpoint.target.wants +ln -s ../data-checkpoint.service %{buildroot}%{_unitdir}/data-checkpoint.target.wants/data-checkpoint.service + %clean rm -rf %{buildroot} @@ -72,3 +84,7 @@ fi %{_unitdir}/offline-update.service %{_unitdir}/system-update.target.wants %{_unitdir}/udev-sdb-init.service +%{_unitdir}/udev-trigger-dmbow@.service +%{_unitdir}/data-checkpoint.target +%{_unitdir}/data-checkpoint.service +%{_unitdir}/data-checkpoint.target.wants/data-checkpoint.service diff --git a/units/data-checkpoint.service.in b/units/data-checkpoint.service.in new file mode 100644 index 0000000..566d935 --- /dev/null +++ b/units/data-checkpoint.service.in @@ -0,0 +1,17 @@ +[Unit] +Description=Data checkpoint +DefaultDependencies=no +Before=systemd-journald.service opt.mount opt-usr.mount + + +[Service] +Type=oneshot +ExecStart=@TZ_SYS_UPGRADE@/update-checkpoint-create.sh +RemainAfterExit=yes +StandardOutput=journal+console +StandardError=journal+console +SmackProcessLabel=System::Privileged + +[Install] +WantedBy=data-checkpoint.target + diff --git a/units/data-checkpoint.target b/units/data-checkpoint.target new file mode 100644 index 0000000..b4694c5 --- /dev/null +++ b/units/data-checkpoint.target @@ -0,0 +1,7 @@ +[Unit] +Description=Data checkpoint +DefaultDependencies=no +Conflicts=shutdown.target +Before=local-fs-pre.target +OnFailure=emergency.target +OnFailureJobMode=replace-irreversibly diff --git a/units/udev-trigger-dmbow@.service b/units/udev-trigger-dmbow@.service new file mode 100644 index 0000000..294619f --- /dev/null +++ b/units/udev-trigger-dmbow@.service @@ -0,0 +1,17 @@ +# If coldplug (systemd-udev-trigger.service) is called before the "local file +# system" target is reached, it will not be possible to mount created bow +# device because it will have the "SYSTEMD_READY=0" flag. This unit trigger the +# change action on the bow device to remove that flag, then systemd sees the +# device as available. + +[Unit] +Description=Trigger the change action on DM-BOW device if system update +DefaultDependencies=no +After=systemd-udev-trigger.service +Before=opt.mount opt-usr.mount +ConditionPathExists=/dev/mapper/bowdev_%i + +[Service] +SmackProcessLabel=System +Type=oneshot +ExecStart=/usr/sbin/udevadm trigger -c change /dev/mapper/bowdev_%i diff --git a/upgrade/update-checkpoint-create.sh b/upgrade/update-checkpoint-create.sh new file mode 100755 index 0000000..4f8ba2a --- /dev/null +++ b/upgrade/update-checkpoint-create.sh @@ -0,0 +1,69 @@ +#!/bin/bash +PATH="/usr/bin:/bin:/usr/sbin:/sbin" + +SYNC="/bin/sync" +REBOOT="/sbin/reboot" +MOUNT="/bin/mount" +UMOUNT="/bin/umount" +BLKID="/usr/sbin/blkid" +DMSETUP="/usr/sbin/dmsetup" +FSTRIM="/usr/sbin/fstrim" +STAT="/usr/bin/stat" + +SYSTEM_DATA_MNT="opt" +USER_MNT="opt/usr" + + +get_partition_id() { + PART_ROOTFS=$("$BLKID" --match-token PARTLABEL=rootfs -o device || "$BLKID" --match-token LABEL=rootfs -o device) + PART_SYSTEM_DATA=$("$BLKID" --match-token PARTLABEL=system-data -o device || "$BLKID" --match-token LABEL=system-data -o device) + PART_USER=$("$BLKID" --match-token PARTLABEL=user -o device || "$BLKID" --match-token LABEL=user -o device) +} + +mount_bow_partition() { + LABEL=${1} + PARTITION=${2} + DIRECTORY=${3} + BOWDEV_NAME=bowdev_${LABEL} + BOWDEV_PATH=/dev/mapper/${BOWDEV_NAME} + SECTORS=$( /sys/block/dm-${DM_NUMBER}/bow/state + echo "[Debug] Mounted ${PARTITION} as DM-BOW" +} + +mount_f2fs_partition() { + LABEL=${1} + PARTITION=${2} + DIRECTORY=${3} + "${MOUNT}" -o checkpoint=disable ${PARTITION} ${DIRECTORY} + echo "[Debug] Mounted ${PARTITION} as F2FS checkpoint=disable" +} + +mount_checkpoint_partition() { + LABEL=${1} + PARTITION=${2} + DIRECTORY=${3} + FSTYPE=$(lsblk -o FSTYPE -n "${PARTITION}") + + if [ "${FSTYPE}" = "ext4" ]; then + mount_bow_partition ${LABEL} ${PARTITION} ${DIRECTORY} + elif [ "${FSTYPE}" = "f2fs" ]; then + mount_f2fs_partition ${LABEL} ${PARTITION} ${DIRECTORY} + else + mount ${PARTITION} ${DIRECTORY} + fi +} + +get_partition_id + +mount_checkpoint_partition system-data ${PART_SYSTEM_DATA} /${SYSTEM_DATA_MNT} +if [ ! -z "${PART_USER}" ]; then + mount_checkpoint_partition user ${PART_USER} /${USER_MNT} +fi diff --git a/upgrade/update.sh.in b/upgrade/update.sh.in index 3377c2c..2d065dd 100755 --- a/upgrade/update.sh.in +++ b/upgrade/update.sh.in @@ -131,4 +131,4 @@ fi NOTIFY "----------------------------------------------------------------------" #Reboot -/sbin/reboot -f +reboot -f -- 2.7.4