2017년 8월 25일 금요일

Dual booting android and Ubuntu on ODROID-XU4

I made dual booting image for ODROID-C2.
https://codewalkerster.blogspot.kr/2016/03/dual-booting-android-and-ubuntu-on.html

We will make dual booting image for ODROID-XU3/4.

It is recommended to use a storage device of 16Gbyte or more.

Make bootable android media(eMMC or SD).

https://wiki.odroid.com/odroid-xu4/os_images/android/v5.4

Add "VFAT" to label of fat32 partition.



Download ODROID-XU3/4 Ubuntu Image.

https://wiki.odroid.com/odroid-xu4/os_images/linux/ubuntu_4.9/20170824



Copy rootfs and boot partition of ODROID-XU3/4 Ubuntu to your desktop Ubuntu.


mount disk wrote ODROID-XU3/4 Ubuntu image on your desktop PC.




$ mount
...
/.../ubuntu-16.04.3-4.9-mate* on /media/codewalker/boot type vfat (ro,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2)
/.../ubuntu-16.04.3-4.9-mate* on /media/codewalker/rootfs type ext4 (ro,nosuid,nodev,uhelper=udisks2)


$ mkdir dual
$ cd dual
$ mkdir boot
$ sudo cp -a /media/username/boot/* boot/
$ mkdir rootfs
$ sudo cp -a /media/username/rootfs/* rootfs/


Unmount ubuntu disk image.


Delete rootfs/aafirstboot

$ rm -rf rootfs/aafirstboot

Edit rootfs/etc/fstab

$ sudo vi rootfs/etc/fstab
LABEL=VFAT /media/boot vfat defaults,rw,owner,flush,umask=000 0 0

Chagne userdata partition UUID.

- Insert disk wrote android image on your desktop PC and unmount /dev/sdX3.
$ sudo umount /dev/sdX3
$ cat rootfs/etc/fstab 
LABEL=VFAT /media/boot vfat defaults,rw,owner,flush,umask=000 0 0

UUID=e139ce78-9841-40fe-8823-96a304a09859 / ext4 errors=remount-ro,noatime 0 1

$ sudo tune2fs /dev/sdX3 -U e139ce78-9841-40fe-8823-96a304a09859

Copy ODROID-XU3/4 Ubuntu files to android disk.

$ mv /media/username/VFAT/boot. ini  /media/username/VFAT/boot. ini.android
$ cp boot/* /media/username/VFAT/
$ sudo cp rootfs/* /media/username/e139ce78-9841-40fe-8823-96a304a09859/ -a
$ sync

Make script to change OS.

in Ubuntu
$ vi boot_android.sh
------------------------------------------------------------------------
#!/bin/bash
sudo mv /media/boot/boot.ini /media/boot/boot.ini.ubuntu
sudo mv /media/boot/boot.ini.android /media/boot/boot.ini
sudo reboot
------------------------------------------------------------------------
#chmod +x boot_android.sh


in Adnroid
$ su
# mount -o rw,remount /
# vi /system/bin/boot_ubuntu.sh
------------------------------------------------------------------------
#!/bin/sh
mv /storage/internal/boot.ini /storage/internal/boot.ini.android
mv /storage/internal/boot.ini.ubuntu /storage/internal/boot.ini
reboot
------------------------------------------------------------------------
# chmod 777 /system/bin/boot_ubuntu.sh

2017년 6월 30일 금요일

How to change DDR Clock on ODROID-C2(android)

Official wiki page
http://odroid.com/dokuwiki/doku.php?id=en:c2_adjust_ddrclk

Guide to change DDR Clock by android update and recovery.

Open https://dn.odroid.com/S905/BootLoader/ODROID-C2/


Download files.
updatepackage-odroidc2-ddr-408.zip
updatepackage-odroidc2-ddr-792.zip
updatepackage-odroidc2-ddr-912.zip
updatepackage-odroidc2-ddr-1104.zip

Open Utility app.
Select "Package install from storage"



Select "File Manager" -> Download folder


Select updatepackage-odroidc2-ddr-xxx.zip wanted DDR clock.


Recovery!



After reboot, you can check the DDR configuration using the following logs of boot loader if you have a usb-uart module kit.

BL2 Built : 11:44:26, Nov 25 2015.
gxb gfb13a3b-c2 - jcao@wonton

Board ID = 8
set vcck to 1100 mv
set vddee to 1070 mv
CPU clk: 1536MHz
DDR channel setting: DDR0 Rank0+1 same
DDR0: 2048MB(auto) @ 1104MHz(2T)-14

2017년 6월 27일 화요일

How to enable Touch Wake up.

I refer to this in the site.

http://processors.wiki.ti.com/index.php/TI-Android-GingerBread-2.3.4-DevKit-2.1_PortingGuides?TB_iframe=true


anroid-6.0.1_r67

frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java


    /** {@inheritDoc} */
    @Override
    public int interceptMotionBeforeQueueingNonInteractive(long whenNanos, int policyFlags) {
        if ((policyFlags & FLAG_WAKE) != 0) {
            if (wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromMotion,
                    "android.policy:MOTION")) {
                return 0;
            }
        }

        if (shouldDispatchInputWhenNonInteractive()) {
            return ACTION_PASS_TO_USER;
        }

        // If we have not passed the action up and we are in theater mode without dreaming,
        // there will be no dream to intercept the touch and wake into ambient.  The device should
        // wake up in this case.
        if (isTheaterModeEnabled() && (policyFlags & FLAG_WAKE) != 0) {
            wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromMotionWhenNotDreaming,
                    "android.policy:MOTION");
        }

        if (!mPowerManager.isInteractive()) {
            wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromMotion,
                    "android.policy:MOTION");
        }
        return 0;
    }


android-5.1.1_r38

--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -4943,6 +4943,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
             wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromMotionWhenNotDreaming);
         }

+        if (!mPowerManager.isInteractive()) {
+            wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromMotion);
+        }
+
         return 0;
     }

android-4.4.4_r2.0.1

diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 10323a4..b2da523 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -4176,6 +4176,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
         if (isWakeMotion) {
             result |= ACTION_WAKE_UP;
         }
+        if (!mPowerManager.isScreenOn())
+            mPowerManager.wakeUp(SystemClock.uptimeMillis());
         return result;
     }



2017년 4월 28일 금요일

Nexus 5X LCD 교환

약 2주전 이렇게 케이스를 잘 씌우고 다니던 스마트 폰이 재수가 없으면 뒤로 넘어져도 코가 깨진다고 액정이 박살 났습니다.



LG 서비스 센터에서 수리비가 약 12만원 정도 이길래 검색해 보니 repair kit을 Ali Express 에서 판매하고 있더군요.


생각 보다 빨리 10일 만에 도착 하여 교환 하였는데...


Nexus 5 때는 Battery가 쉽게 떼어 졌는데 이번 5X는 너무 잘 붙어 있어서 떼다가 그만 battery에서 불이 났습니다.

그 땐 당황해서 사진을 못 찍었는데 사무실에 연기로 가득차고 난리가 아니였네요.
Battery를 바닥에 집어 던졌서 바닥까지 타버렸네요.


결국 LG 서비스센터에서 Battery를 3만원 주고 사서 조립은 완성 ...
하지만 LCD가 원래색보다 파란색이 강하게 보입니다.


결론 시간에 금액에 액정 떼는 것도 힘들고 Battery 떼는 건 더 위험하고 그냥 서비스센터에서 교환하세요.

2017년 4월 21일 금요일

ODROID-C2를 CCTV로 활용하기

ODROID-C2와 Webcam을 이용하여 CCTV를 만들어 보자.

http://www.hardkernel.com/main/products/prdt_info.php?g_code=G145457216438



안드로이드 최신 버전을 다운 받는다.
http://odroid.com/dokuwiki/doku.php?id=en:c2_release_android

eMMC나 sdcard에 설치 한다.

안드로이드가 부팅이 되면 Google Apps를 설치한다.
https://codewalkerster.blogspot.kr/2016/06/how-to-install-google-play-store-on.html

Goolge Market이 설치되었으면 Google 계정을 넣고 market에서 CCTV로 검색하여 Alfred를 설치한다.

https://play.google.com/store/apps/details?id=com.ivuu


Viewer로 볼 smartphone에도 alfred를 설치한다.
ODROID-C2에 Alfred는 Camera로 설정하자.


 아래와 같이 어항을 바라보게 Webcam을 설치하였다.


Smartphone에서 아래와 같이 볼 수 있다.




2017년 3월 7일 화요일

How to Enable Multi-Window in Marshmallow.

Go back to Settings > Developer Options > go to the bottom of the Drawing category and enable Multi-window from the options.



Enable multi-window on ODROID-C2.

2017년 2월 28일 화요일

How to write to external storage on odroid(marshmallow android 6.0.1).

You maybe install utorrent app, but you can't download torrent file in external storage installed android 6.0.1(marshmallow).


Edit packages.xml.

$ su
# vi /data/system/packages.xml

<package name="com.utorrent.client" codePath="/data/app/com.utorrent.client-1" nativeLibraryPath="/data/app/com.utorrent.client-1/lib" primaryCpuAbi="armeabi-v7a" publicFlags="940097092" privateFlags="0" ft="15a648b6388" it="15a648b6f1f" ut="15a648b6f1f" version="245" userId="10069" installer="com.android.vending">
        ...
        <perms>
            ...
            <item name="android.permission.ACCESS_WIFI_STATE" granted="true" flags="0" />
            <item name="android.permission.WAKE_LOCK" granted="true" flags="0" />
            <item name="android.permission.WRITE_MEDIA_STORAGE" granted="true" flags="0" />
        </perms>


or hacking frameworks.


diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 647c17b..1ec1fe7 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -22,6 +22,7 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
 import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
+import static android.Manifest.permission.WRITE_MEDIA_STORAGE;
 import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
 import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
 import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
@@ -1935,6 +1936,8 @@ final class Settings {
             return;
         }

+        boolean isMediaStoragePermission = false;
+
         serializer.startTag(null, TAG_PERMISSIONS);

         for (PermissionState permissionState : permissionStates) {
@@ -1943,6 +1946,19 @@ final class Settings {
             serializer.attribute(null, ATTR_GRANTED, String.valueOf(permissionState.isGranted()));
             serializer.attribute(null, ATTR_FLAGS, Integer.toHexString(permissionState.getFlags()));
             serializer.endTag(null, TAG_ITEM);
+
+            if (!isMediaStoragePermission
+                    && permissionState.getName().equals(WRITE_MEDIA_STORAGE)) {
+                isMediaStoragePermission = true;
+            }
+        }
+
+        if (!isMediaStoragePermission) {
+            serializer.startTag(null, TAG_ITEM);
+            serializer.attribute(null, ATTR_NAME, WRITE_MEDIA_STORAGE);
+            serializer.attribute(null, ATTR_GRANTED, "true");
+            serializer.attribute(null, ATTR_FLAGS, Integer.toHexString(0));
+            serializer.endTag(null, TAG_ITEM);
         }

         serializer.endTag(null, TAG_PERMISSIONS);

Automatically permission string is inserted in packages.xml.


After install app from Market you must reboot system.


2017년 1월 7일 토요일

후쿠오카, 구로카와 온천 여행 팁

일본 여행에 필수 220v-110v 어텁터를 준비한다.
충전기 두개라서 2개를 준비 했다.



면세점을 여유 있게 쇼핑하려면 최소 두시간 전에는 도착하자.
한 시간 전에 도착 했지만 사람이 많아서 비행기 티켓 찾고 입국 심사를 하는데 겨우 담배 2보루 사고 출발 10분 전에 비행기에 탑승했다.

산큐패스는 미리 하나투어같은 여행 사이트에서 주문한다.
일본 현지에서 사는것 보다 싸다고 한다.

미리 주문하지 못하려 여행전까지 택배 도착이 걱정 되어 직접 수령하러 강남까지 다녀왔다..
http://www.hanatour.com/asp/booking/pass/ps-20000.asp?compCode=B00002&prdMstCode=J10PS13

아래와 같이 카톡으로 알려 준다.



이렇게 생겼다.


데이터 로밍을 알아봤는데 일본은 3G로 연결되고 그리고 잘 끊어진다는 정보에 와이드모바일 에그를 예약했다.
가격은 3일에 2만원이 안되는 요금이다. 여기에 두사람이니 더욱 더 저렴해 진다.
기존에 사용하던 보조밧데리가 하나 있지만 두사람이라서 밧데리도 2개 추가 하였다. 하지만 에그 단말기가 생각보다 밧데리가 오래 가기 때문에 필요하지 않았다. 한 10시간 정도는 가는 것 같다.
아래 사이트에서 예약하고 인천국제공항 1층 7번 출구에서 받아 갈 수 있다.
http://www.widemobile.com/v3/index.aspx


아래와 같이 두사람이 이 에그에 접속하여 있다.


대여한 보조 밧데리이다. 이중 중에 충전하고 있다.


단점은 여러 사람일 경우 와이파이에그에서 떨어지면 연락한 방법이 애매하다.

일본 고속버스 사이트에서 좌석을 예약하고 출력한다.

https://www.highwaybus.com/

크롬 브라우저에서 번역이 잘된다. 몇몇 그림은 번역이 안되지만 대충 감으로 알 수 있다.


후쿠오카 공항에서 1층 2번 버스 타는 곳에서 하카타행 버스를 기다린다. 버스가 자주 있지 않다. 산큐패스를 내릴때 보여주면 된다.
국제선 건물에서 나와 4개의 버스 정류장이 있는데 2번으로 가면 바닥에 하카타라고 쓰여 있다.
블로그를 작성하는 기준으로 시간표는 아래와 같다.




하카타 버스 터미날에 도착하면 3층에가서 예약 내용 프린트와 산큐 패스를 보여주면 표를 준다. 물론 오는 날 표까지 미리 준다. 잘 챙겨 놓자.







구로카와 온천에서 하카타로 오는 버스는 예매시 삼각형으로 표시 되었는데 예약이 많아서 두 좌석이 떨어져 예약이 되었다. 그래서 여행전 미리 예약하자.
출발 당시 기사분께서 두 좌석이 떨어져 있는거에 대해서 한국인이라서 그런지 매우 미안해 했던 기억이 인상적이다.
우리나라에서 있을 수 없는 일이어서 기억이 난다.

하카타 버스 터미날 5층에 다이소가 있다. 한국에 없는 일본 다이소에만 있는 물건들을 구매 하였다.





하카타역으로 이동하여 점심을 먹는다. 라멘은 캐널 시티에서 먹을꺼라 다른 메뉴를 찾아본다.

구로카와 버스는 하루 4번 밖에 운행하지 않는다.

하카타에서 출발한 버스는 텐진, 후쿠오카 공항으로 가서 구로카와로 간다. 말이 고속버스지 정차도 많이 하고 천천히? 가서 3시간 걸린다.

특이하게 버스에 화장실이 있다.




도착하면 료칸에서 온 직원이 픽업이 온다.
체크인후
석식, 조식 시간을 물어본다.
오규갸야는 두개의 프라이빗(가족)탕이 있다.
연인끼리 가신분들은 여기를 이용하면 된다. 따로 예약을 하지 않고 사용하는 사람이 없으면 들어가서 문 잠그고 사용하면 된다.
그리고 몇개의 노천탕이 있고 하루씩 남여가 바꿔서 입장한다.
따라서 혼탕이 아니기 때문에 수영복이 필요 없다.

짐을 풀고 바로 마을 구경을 나섰다.



하지만 겨울이라 해가 빨리지고 어두워지기 시작해서 사진을 겨우 찍었다.












석시 예약 시간이 되면 인터폰으로 알려주고 데리러 온다.
조식은 인터폰으로 알려주고 어제 먹은 방으로 가서 먹으면 된다.
료칸에서 저녁, 아침 식사가 나오기 때문에 따로 군것질 할 필요가 없을 만큼 배가 부르다.






프라이빗 탕

석식 사진이다. 그리고 유카타를 주기 때문에 따로 잠옷은 필요 없다.


말고기 육회다. 조금 찔긴 쇠고기 같다.




식사 후 노천탕으로 갔다.










다음날 아침에 다른 프라이빗 탕을 이용해 보았다.



노천탕은 하루 마다 여자 남자 바꿔가면 사용하도록 되어 있어서 아침은 다른 노천탕의 사진이다.







온천 후 조식을 했다.



미리 짐을 들고 체크아웃하고 료칸 이용료를 지불한다.
그리고 마을 구경을 하였다.


















체크아웃후 역시 차로 버스정류장까지 모셔준다.
버스는 후쿠오카 공항에서 하카타 버스 터미날로 간다.



하카타역에서 캐널시티까지는 걸어서 넉넉잡고 15분 정도면 걸어간다.
후쿠오카의 서울보도 겨울은 7도 이상 따뜻하기 때문에 늦가을 복장으로 간다.





캐널시티는 매우 넓다.







라멘 스타디움으로 가서 라멘을 먹고...







MUJI , FRANC franc, 등등 쇼핑한다.




나카스는 유흥가이기 때문에 가족, 연인들은 섬 안 쪽까지 들어가지 말기 바란다.
포장마차는 캐널시티에서 섬으로 넘어가는 다리에서 왼쪽으로 진입하면 보인다.
별거 없다.





12시 비행기라 아침에 뭔가 할 시간이 애매하다.

캐널시티 호텔에서는 짐을 맡아주니 짐 챙겨 내려와서 프런트에 맡기고 걸어서 10분거리에 스미요시 신사가 있다. 구경하고 편의점에서 식사 후 공항으로 출발.





















호텔에 한국 여행객 프린트물에서 나카스에 미나미 신지에서 출발하는 후쿠오카 공항까지 80번 버스를 타면 된다고 나와 있지만 80번 버스가 정류소에 없었다.
버스로 하카타 버스 터미날가서 공항 가는 버스를 탄다.







후쿠오카 공항은 매우 작은 공항이다 표를 찾고 뒤에 보이는 특산물 면세점이 있고 출입국 심사후 더 큰 면세점이 있으니 들어가서 사도 된다.





비행기 시간 때문에 첫날 온천을 잡았는데 3일 일정이면 첫날 후쿠오카 관광, 쇼핑하고 이틀째 온천가서 휴식하고 바로 공항가서 돌아오는게 만족도가 높을것 같다. 참고 하시기 바랍니다.