some launcher script tweaks
[android_pandora.git] / pnd / run_gingerbread.sh
CommitLineData
34a1da07 1#!/bin/bash
941f5584 2# run/kill Android from Linux, the hackjob script
34a1da07 3# (c) Grazvydas "notaz" Ignotas, 2012
4set -e -x
5
6if [ "`id -u`" != "0" ]; then
941f5584 7 # gksudo causes logging not to work somehow..
8 # so use it to only ask for password, use sudo to re-run the script
9 gksudo -m "Android needs root privileges to run, please enter your password" id
10 exec sudo -n $0
34a1da07 11fi
12
13root=/mnt/android
14mpoint_main=`pwd`
15kernel_ver=`uname -r`
4fdefb0f 16pnd_version=4
17last_pnd_version=`cat $mpoint_main/last_pnd_version || true`
941f5584 18exitcode=1
34a1da07 19
941f5584 20trap onexit INT QUIT TERM EXIT
21trap '' HUP
34a1da07 22
23err()
24{
25 zenity --error --text "$1"
26 echo "$1"
27}
28
29onexit()
30{
31 set +e +x
32
33 list="/sbin/ueventd /system/bin/logcat /system/bin/sh /system/bin/servicemanager
34 /system/bin/vold /system/bin/netd /system/bin/rild /system/bin/installd /sbin/adbd
35 /system/bin/mediaserver /system/bin/keystore /system/bin/debuggerd
36 /system/bin/dbus-daemon"
37 for pr in $list; do
38 pb=`basename $pr`
39 p=`ps -C $pb -o pid=,cmd= | grep $pr | awk '{print $1}'`
40 test -n "$p" && echo kill $p $pr && kill $p
41 done
42 for pr in $list; do
43 pb=`basename $pr`
44 p=`ps -C $pb -o pid=,cmd= | grep $pr | awk '{print $1}'`
45 test -n "$p" && echo kill -9 $p $pr && kill -9 $p
46 done
47 list2=`ps ax | grep -v grep | grep -e ':.. /system/' -e ':.. /data/' -e ' android\.' | awk '{print $1}'`
48 list3=`lsof | grep '/dev/binder' | awk '{print $2}' | uniq`
49 for p in $list2 $list3; do
50 test -n "$p" && echo kill $p && kill $p
51 done
52
53 sleep 0.5
54
941f5584 55 for i in `seq 4`; do
34a1da07 56 sdmounts=`grep -e '\.android_secure' -e 'secure/asec' -e 'mnt/sdcard' /proc/mounts`
57 if [ -n "$sdmounts" ]; then
58 echo "$sdmounts" | awk '{print $2}' | xargs umount
59 fi
60
941f5584 61 omounts=`grep "$root/" /proc/mounts | awk '{print $2}'`
62 if [ -n "$omounts" ]; then
63 for m in $omounts; do
64 if ! umount $m; then
65 umount -i $m
66 fi
67 done
68 fi
69
70 sleep 0.5
34a1da07 71 if umount $root; then
72 break;
73 fi
74 done
75
bc310215 76 if ! pidof udevd > /dev/null; then
77 # don't use /etc/init.d/udev, it remounts /dev blindly
78 /sbin/udevd -d
79 /sbin/udevadm trigger
80 fi
81
34a1da07 82 if ! pidof X > /dev/null; then
83 # need to restore SGX, X and friends
84 rmmod bufferclass_ti omaplfb pvrsrvkm
85 /etc/init.d/pvr-init start
86 rmmod wl1251_sdio # hmh
87 /etc/init.d/NetworkManager start
88 /etc/init.d/slim-init start
89 fi
941f5584 90
91 if ! ps a | grep -q 'pnd_run.*run_gingerbread.sh'; then
92 # something killed pnd_run, have to clean up for it
93 cat > /tmp/clean_android.sh <<EOF
94 #!/bin/bash
95 trap '' HUP
96 sleep 3
97 umount $mpoint_main
98 umount $mpoint_main # needed twice??
99 losetup -a | awk -F ':' '{ print \$1 }' | xargs losetup -d 2> /dev/null
100 rm $0
101EOF
102 cd /tmp/
103 chmod +x /tmp/clean_android.sh
104 /tmp/clean_android.sh &
105 sleep 1
106 fi
107 exit $exitcode
34a1da07 108}
109
110
111# logger, binder and ashmem
112delay=0
113if ! test -e /dev/log_events; then
114 modprobe logger
115 delay=0.5
116fi
117if ! test -e /dev/binder; then
118 modprobe binder
119 delay=0.5
120fi
121if ! test -e /dev/ashmem; then
122 modprobe ashmem
123 delay=0.5
124fi
bc310215 125if ! test -e /sys/module/lowmemorykiller; then
126 # this one is optional
127 modprobe lowmemorykiller || true
128fi
34a1da07 129sleep $delay
130if test ! -e /dev/log_events -o ! -e /dev/binder -o ! -e /dev/ashmem; then
131 err "could not load required Android modules,\n\
132perhaps you are running unsupported\nfirmware/kernel."
133 exit 1
134fi
135
4fdefb0f 136if test "x$last_pnd_version" != "x$pnd_version"; then
137 echo "version changed from $last_pnd_version to $pnd_version"
138 rm -f rootfs.ext2
139 echo "$pnd_version" > $mpoint_main/last_pnd_version
140fi
141
34a1da07 142if ! test -e rootfs.ext2; then
143 if ! cp -v pandora/default_rootfs.ext2 rootfs.ext2; then
144 err "file copy failed, not enough space?"
145 exit 1
146 fi
147fi
148
149if ! test -e data.ext4; then
150 size=`zenity --entry --text="\
151 Android needs a partition to store it's data and installed programs.\n\
152 This will be stored in preallocated file of size that you have to select now.\n\
153 Android documentation recommends at least 150MB, going below 50MB will cause\n\
154 problems, as well as over 2GB if you are running from FAT partitioned card.\n\n\
155 Please select size of Android data partition (in megabytes):\n\
156 (creation may take several minutes after you press OK)" \
157 --entry-text=150`
158 if test -z "$size" || ! dd if=/dev/zero of=data.ext4 bs=1M count=$size; then
159 err "failed to create file, not enough space? bad input?"
160 exit 1
161 fi
162 if ! mkfs.ext4 -O ^has_journal -m 0 -F data.ext4; then
163 err "failed to create filesystem"
164 exit 1
165 fi
166fi
167
168if ! fsck.ext4 -y data.ext4 || ! fsck.ext2 -y rootfs.ext2; then
169 if [ "$?" -ge "4" ]; then
170 err "file corruption detected, try clearing appdata."
171 exit 1
172 fi
173fi
174
175mkdir -p $root
176mount -o loop,rw,noatime rootfs.ext2 $root
177mount --bind $mpoint_main/system/ $root/system/
178mount -o loop,rw,noatime data.ext4 $root/data
179
941f5584 180mkdir -p $root/vendor/
34a1da07 181
182# handle SGX
183mkdir -p $root/vendor/pvr
184echo "0 0 android" > $root/vendor/pvr/egl.cfg
4fdefb0f 185rm -f $root/vendor/pvr/gralloc.omap3.so
bc310215 186sgx_kernel_loaded=false
4fdefb0f 187
188# load the right SGX driver
34a1da07 189if ! grep -q '1.5.15.2766' /proc/pvr/version 2> /dev/null; then
190 echo have to change SGX kernel driver
191 /etc/init.d/pvr-init stop || true
192 if test -d $mpoint_main/pandora/pvr/$kernel_ver; then
193 # found with this android release
194 pvrbase=$mpoint_main/pandora/pvr/$kernel_ver
195 elif test -d /lib/modules/$kernel_ver/kernel/drivers/gpu/pvr/1.5.15.2766; then
196 # found in firmware
197 pvrbase=/lib/modules/$kernel_ver/kernel/drivers/gpu/pvr/1.5.15.2766
198 fi
199
200 if [ "x$pvrbase" != "x" ]; then
201 if insmod $pvrbase/pvrsrvkm.ko && insmod $pvrbase/omaplfb.ko; then
202 sgx_kernel_loaded=true
203 # optional
204 insmod $pvrbase/bufferclass_ti.ko || true
205 fi
206 fi
207else
208 sgx_kernel_loaded=true
209fi
210
211sgx_user_ready=false
212#if false; then
213if $sgx_kernel_loaded; then
214 es=`cat /etc/powervr-esrev`
215 if [ "x$es" = "x" ]; then
216 err "unable to determine SGX version"
217 else
218 es="es$es"
219 # for some braindead reason 103 is named 121 too
220 sgx_ver=121
221 if [ "$es" = "es5" ]; then
222 sgx_ver=125
223 else
224 ln -fs /system/lib/$es/libGLESv2_POWERVR_SGX530_121.so $root/vendor/pvr/
225 ln -fs /system/lib/$es/libGLESv1_CM_POWERVR_SGX530_121.so $root/vendor/pvr/
226 fi
227 ln -fs /system/bin/$es/pvrsrvinit $root/vendor/pvr/
4fdefb0f 228 ln -fs /system/lib/hw/gralloc.omap3.so.1 $root/vendor/pvr/gralloc.omap3.so
34a1da07 229 ln -fs /system/lib/$es/libPVRScopeServices.so $root/vendor/pvr/
230 ln -fs /system/lib/$es/libglslcompiler.so $root/vendor/pvr/
231 ln -fs /system/lib/$es/libsrv_um.so $root/vendor/pvr/
232 ln -fs /system/lib/$es/libIMGegl.so $root/vendor/pvr/
233
234 echo "0 1 POWERVR_SGX530_$sgx_ver" >> $root/vendor/pvr/egl.cfg
235 sgx_user_ready=true
236 fi
237fi
238
239if ! $sgx_user_ready; then
240 err "SGX driver load failed, no 3D support"
241fi
242
243# stop X and interfering things, get wifi ready
244set +e
245if pidof xfce4-session > /dev/null; then
246 user=`cat /tmp/currentuser`
247 # most often doesn't work :(
248 #if ! test -z "$user"; then
249 # su -c 'xfce4-session-logout --logout' $user
250 #fi
251fi
252/etc/init.d/NetworkManager stop
253modprobe mac80211
254/etc/init.d/wl1251-init start
255/etc/init.d/slim-init stop
256sleep 1 # for wlan0, hmh..
257chvt 2 & # may hang..
258sleep 1
259killall chvt 2> /dev/null || true
260ifconfig wlan0 down
bc310215 261killall udevd || true
34a1da07 262
941f5584 263cp -v /lib/modules/$kernel_ver/kernel/drivers/net/wireless/wl1251/wl1251_sdio.ko $root/vendor/
34a1da07 264mkdir -p $root/vendor/firmware
941f5584 265cp -v /lib/firmware/brf6300.bin $root/vendor/firmware/
34a1da07 266
bc310215 267set -e
268cp -v /etc/pointercal $root/vendor/
269
34a1da07 270# some cleanup
271rm -rf $root/acct/uid/*
272
273chroot $root /init &
274
bc310215 275# revive udev when /init is done with uevents,
276# we'll need it to load firmwares and stuff
277sleep 10
278/sbin/udevd -d
279
34a1da07 280# wait for a message
281while true; do
282 sleep 1
283
284 if nc -V 2> /dev/null | grep -q GNU; then
285 # GNU nc always fails
286 msg=`nc -l -p 36936 localhost || true`
287 else
288 msg=`nc -l localhost 36936`
289 fi
290 if [ "x$msg" = "xquit" ]; then
291 break
292 fi
293 echo "unknown message: $msg"
294done
295
296# real init can't be killed this way
297killall init
941f5584 298
299# done, run exit handler indirectly
300exitcode=0