1. Module UVC driver
--- V4L USB devices
<M> USB Video Class (UVC)
[ ] UVC input events device support
<M> GSPCA based webcams --->
2. make and copy zImage
$cp arch/arm/boot/zImage android/device/hardkernel/odroidx[x2]/kernel_sdmmc[emmc]
3. copy uvcvideo.ko
$cp driver/media/video/uvcvideo.ko android/device/hardkernel/proprietary/bin/
4. copy driver into "/system/lib/modules/" directory.
device.mk
#
# UVC Module
#
PRODUCT_COPY_FILES += \
device/hardkernel/proprietary/bin/uvcvideo_x.ko:system/lib/modules/uvcvideo.ko
5. add service for module insert.
init.odroidx[x2][_realtek].rc
service uvc_usb_module /system/bin/insmod /system/lib/modules/uvcvideo.ko
class core
user root
group root
oneshot
6. select WebCam Camera library.
BoardConfig.mk
BOARD_CAMERA := odroidx //MIPI cameara
BOARD_CAMERA := odroidu //UVC
7. android build
2013년 6월 4일 화요일
2013년 5월 31일 금요일
Boot from system partition instead ramdisk for ODROID
mount eMMC or SDCard on PC.
Disk /dev/sde: 15.8 GB, 15758000128 bytes
255 heads, 63 sectors/track, 1915 cylinders, total 30777344 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sde1 6684672 30646271 11980800 c W95 FAT32 (LBA)
/dev/sde2 131072 2228223 1048576 83 Linux
/dev/sde3 2228224 6422527 2097152 83 Linux
/dev/sde4 6422528 6684671 131072 83 Linux
Partition table entries are not in disk order
[~/projects/ssd/JellyBean/out/target/product/odroidx2]$
#mount system partition
[~/projects/ssd/JellyBean/out/target/product/odroidx2]$ sudo mount /dev/sde2 /media/microSD/
# copy ramdisk fs.
[~/projects/ssd/JellyBean/out/target/product/odroidx2]$ sudo cp -a root/ /media/microSD/
# change permissions
[~/projects/ssd/JellyBean/out/target/product/odroidx2]$ sudo chmod 644 /media/microSD/init.*
[~/projects/ssd/JellyBean/out/target/product/odroidx2]$ sudo chmod 644 /media/microSD/build.prop
and ODROID power up...
make boot.scr
edit boot.ini
1 setenv v_out "hdmi"
2 setenv fake_fb "false"
3 setenv fb_x_res "1360"
4 setenv fb_y_res "768"
5 setenv hdmi_phy_res "1080"
6 setenv led_blink "1"
7 setenv bootcmd "movi read kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000"
8 setenv bootargs "root=/dev/mmcblk0p2 ro rootfstype=ext4 init=/init rootdelay=1 console=/dev/ttySAC1,115200n8 androidboot.console=ttySAC1 v_out=${v_out} fake_fb=${fake_fb} fb_x_res=${fb_x_res} fb_y_res=${ fb_y_res} hdmi_phy_res=${hdmi_phy_res} led_blink=${led_blink}"
9 boot
$./make_boot_scr.sh
$adb push boot.scr /sdcard/
$adb sync
$adb reboot
boot from system partition.
booting log
[ 0.000000] sclk_fimd: source is xusbxti (1), rate is 1500000
[ 0.000000] sclk_mfc: source is mout_mfc0 (0), rate is 55000000
[ 0.000000] sclk_g3d: source is mout_g3d0 (0), rate is 55000000
[ 0.000000] sclk_pwi: source is xusbxti (1), rate is 1500000
[ 0.000000] PERCPU: Embedded 7 pages/cpu @c1af8000 s7008 r8192 d13472 u32768
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 519938
[ 0.000000] Kernel command line: console=ttySAC1,115200n8 androidboot.console=ttySAC1 mem=2047M root=/dev/mmcblk0p2 ro rootfstype=ext4 init=/init rootdelay=1 console=/dev/ttySAC1,115200n8 androidboot.console=1
[ 0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)
[ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
[ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
[ 0.000000] Memory: 2047MB = 2047MB total
[ 0.000000] Memory: 1695464k/1695464k available, 400664k reserved, 1342464K highmem
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
Disk /dev/sde: 15.8 GB, 15758000128 bytes
255 heads, 63 sectors/track, 1915 cylinders, total 30777344 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sde1 6684672 30646271 11980800 c W95 FAT32 (LBA)
/dev/sde2 131072 2228223 1048576 83 Linux
/dev/sde3 2228224 6422527 2097152 83 Linux
/dev/sde4 6422528 6684671 131072 83 Linux
Partition table entries are not in disk order
[~/projects/ssd/JellyBean/out/target/product/odroidx2]$
#mount system partition
[~/projects/ssd/JellyBean/out/target/product/odroidx2]$ sudo mount /dev/sde2 /media/microSD/
# copy ramdisk fs.
[~/projects/ssd/JellyBean/out/target/product/odroidx2]$ sudo cp -a root/ /media/microSD/
# change permissions
[~/projects/ssd/JellyBean/out/target/product/odroidx2]$ sudo chmod 644 /media/microSD/init.*
[~/projects/ssd/JellyBean/out/target/product/odroidx2]$ sudo chmod 644 /media/microSD/build.prop
and ODROID power up...
make boot.scr
edit boot.ini
1 setenv v_out "hdmi"
2 setenv fake_fb "false"
3 setenv fb_x_res "1360"
4 setenv fb_y_res "768"
5 setenv hdmi_phy_res "1080"
6 setenv led_blink "1"
7 setenv bootcmd "movi read kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000"
8 setenv bootargs "root=/dev/mmcblk0p2 ro rootfstype=ext4 init=/init rootdelay=1 console=/dev/ttySAC1,115200n8 androidboot.console=ttySAC1 v_out=${v_out} fake_fb=${fake_fb} fb_x_res=${fb_x_res} fb_y_res=${ fb_y_res} hdmi_phy_res=${hdmi_phy_res} led_blink=${led_blink}"
9 boot
$./make_boot_scr.sh
$adb push boot.scr /sdcard/
$adb sync
$adb reboot
boot from system partition.
booting log
[ 0.000000] sclk_fimd: source is xusbxti (1), rate is 1500000
[ 0.000000] sclk_mfc: source is mout_mfc0 (0), rate is 55000000
[ 0.000000] sclk_g3d: source is mout_g3d0 (0), rate is 55000000
[ 0.000000] sclk_pwi: source is xusbxti (1), rate is 1500000
[ 0.000000] PERCPU: Embedded 7 pages/cpu @c1af8000 s7008 r8192 d13472 u32768
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 519938
[ 0.000000] Kernel command line: console=ttySAC1,115200n8 androidboot.console=ttySAC1 mem=2047M root=/dev/mmcblk0p2 ro rootfstype=ext4 init=/init rootdelay=1 console=/dev/ttySAC1,115200n8 androidboot.console=1
[ 0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)
[ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
[ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
[ 0.000000] Memory: 2047MB = 2047MB total
[ 0.000000] Memory: 1695464k/1695464k available, 400664k reserved, 1342464K highmem
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
2013년 5월 30일 목요일
Update ODROID-X2 firmware and install GMS.
1. Download Android_Beta 1.6 firmware
http://com.odroid.com/sigong/nf_file_board/nfile_board_view.php?keyword=&tag=&bid=182
http://dn.odroid.com/Android_Beta_1.6/X2/emmc_installer_for_odroidx2.zip
2. write to SD Card.
sudo dd if=./emmc_installer_for_odroidx2.img of=/dev/sdx
or
ImageWriter
3. write to eMMC
4. success to install Android Beta 1.6 version
5. Download GMS apps.
Must download gapps-jb-20121011-signed.zip,
10. Sing in Google Account.
go back step 7.
http://com.odroid.com/sigong/nf_file_board/nfile_board_view.php?keyword=&tag=&bid=182
http://dn.odroid.com/Android_Beta_1.6/X2/emmc_installer_for_odroidx2.zip
2. write to SD Card.
sudo dd if=./emmc_installer_for_odroidx2.img of=/dev/sdx
or
ImageWriter
3. write to eMMC
4. success to install Android Beta 1.6 version
5. Download GMS apps.
Must download gapps-jb-20121011-signed.zip,
6. Download Astor File Manager apk and install
7. Make updater directory and move gapps-jb-20121011-singed.zip there.
8. Settings -> About tablet -> ODROID Update.
9. Update
11. Download Android Beta 1.7 firmware
12. move odroidx2-ota-eng.codewalker.zip to updater directory.
13. Update
13. Reinstall GMS apps
2013년 5월 21일 화요일
ethernet으로 Wi-Fi 연결 fake
ODROID에 Ethernet port가 있고 기본적으로 dhcp가 가능한 회선에 연결하면 Wi-Fi 연결되어 있지 않아도 인터넷이 가능합니다.
하지면 몇몇 app들은 Mobile Network 또는 Wi-Fi 연결만을 체크하도록 되어 있어서 실행이 안되는 경우가 있습니다.
Ethernet 연결을 Wi-Fi 연결로 사용하여 android에서 Wi-Fi 연결된것 처럼 만들고 싶은데 관련 자료를 못찾겠네요.
아래의 그림과 같이 android는 wlan0가 wpa_supplicant와 연결되어 있습니다. 여기서 wlan0에 eth0를 어떻게 연결할지 생각되는 시나리오 들입니다.
wlan0 -> wpa_supplicant->android
^ ^
| ?(route) | ( wpa_supplicant -ieth0 -Dwired)?
eth0 --------->
1. wpa_supplicant -ieth0 -Dwired 옵션으로 ethernet을 연결
- 단 wpa_supplicant가 두개가 존재해야 하고 서비스 역시 두개가 되어야 한네요.
(wpa_supplicnat -iwlan -Dwext)
- "-Dwired"가 동작하기 위해 wpa_supplicant가 BOARD_WPA_SUPPLICANT_DRIVER := WIRED로 동작 확인이 먼저 일 듯 합니다.
2. eth0을 route하여 wlan0에 연결
- 하지만 wpa_supplicant 때문에 SSID등 연결된 상태로 만들기가 가능 할지 모르겠네요.
3. reverse tethering
- 이건 pc의 인터넷 연결을 USB(adb)로 스마트폰으로 연결해주는 기술인데 자세한 자료는 없고 howto만 보이네요. usb tethering apk 소스가 필요할 듯 합니다.
- 이건 기본적으로 eth0로 네트워크가 연결되어 있고 Wi-Fi 연결로 속일 수 없어서 안 될것 같은데 몇몇 동영상을 찾아 보면 3G Network 연결로 만드는 듯 하여 Wi-Fi가 아니라 Mobile Network로 연결된다면 가능할 것 같습니다.
MK802 란 모델이 위에 설명한 방법으로 Network이 구성이 된다고 합니다.
아래 주소에서 reverse tethering 소스를 구할 수 있습니다.
https://code.google.com/p/android-reverse-tethering/source/checkout
2013년 5월 17일 금요일
Pinch to zoom with mouse wheel.
Pinch to Zoom with mouse wheel.
You can test it.
download libinput.so here.
$adb remount
$adb push libinput.so /system/lib/
$adb shell sync
$adb shell reboot
settings -> Developer options -> Show touches(check)
2013년 5월 13일 월요일
adb shell sendevent로 pinch zoom in/out
adb shell sendevent로 android에 input event를 가상으로 보낼 수 있습니다.
http://toors.tistory.com/entry/android-touch-move-event-%EC%83%9D%EC%84%B1
위에 링크처럼 하면 move와 같이 single touch event는 만들 수 있습니다.
pinch zoom in/out과 같은 multi touch event도 만들 수 있습니다.
getevent에서 odroidx-ts가 touch screen device이고 node는 event1입니다.
# getevent
add device 1: /dev/input/event0
name: "odroid-keypad"
add device 2: /dev/input/event2
name: "Microsoft Microsoft 3-Button Mouse with IntelliEye(TM)"
add device 3: /dev/input/event1
name: "odroidx-ts"
저의 시스템에서 touch의 노드는 /dev/input/event3입니다.
sh로 만드실 경우 system을 없애고 "adb shell sendevent"로 고치시면 됩니다.
//첫번째 pointer의 ABS_MT_TRACKING_ID를 1로 설정한다.
system("sendevent /dev/input/event1 3 57 1");
system("sendevent /dev/input/event1 3 53 %d", X1);
system("sendevent /dev/input/event1 3 54 %d", Y1);
//ABS_MT_PRESSURE 8정도의 값을 보내서 press 되었다고 알려 줍니다.
system("sendevent /dev/input/event1 3 58 8");
//한 pointer에 대한 EV_SYN, SYN_REPORT를 보낸다.
system("sendevent /dev/input/event3 0 0 0");
//두번째 pointer 입력 전에 ABS_MT_SLOT을 보낸다.
system("sendevent /dev/input/event3 3 47 1");
//두번째 pointer의 위치를 정한다.
X1 = X2 + 50;
Y2 = Y2 + 50;
//두번째 pointer
//첫번째 pointer의 ABS_MT_TRACKING_ID를 2로 설정한다.
system("sendevent /dev/input/event1 3 57 2");
system("sendevent /dev/input/event1 3 53 %d", X2);
system("sendevent /dev/input/event1 3 54 %d", Y2);
system("sendevent /dev/input/event1 3 58 8");
system("sendevent /dev/input/event1 0 0 0");
//여기서 ABS_MT_POSITION_X(53), ABS_MT_POSITION_Y(54), 그리고 SYN_REPORT를 한 묶음으로 이동하고 싶은 만큼 반복한다.
system("sendevent /dev/input/event1 3 53 %d", X2 += 20);
system("sendevent /dev/input/event1 3 54 %d", Y2 += 20);
system("sendevent /dev/input/event1 0 0 0");
//첫번째 pointer의 ABS_MT_TR두ACKING_ID를 -1을 초기화 한다.
system("sendevent /dev/input/event1 3 57 -1");
system("sendevent /dev/input/event1 0 0 0");
//ABS_MT_SLOT(47)은 0,1로 번갈아 입력된다. 앞에서 1로 보냈으니 0으로 보낸다.
system("sendevent /dev/input/event1 3 47 0");
//두번째 pointer의 ABS_MT_TRACKING_ID를 -1을 초기화 한다.
system("sendevent /dev/input/event1 3 57 -1");
system("sendevent /dev/input/event1 0 0 0");
--------------------------------------------------------------------------------------------------
bionic/libc/kernel/common/linux/input.h에 define 되어 있습니다.
#define EV_ABS 0x03
#define ABS_MT_POSITION_X 0x35 -> 57(십진수)
#define ABS_MT_POSITION_Y 0x36 - > 58(십진수)
#define ABS_MT_PRESSURE 0x3a
아래와 같이 getevent -l 로 event를 확인 할 수 있는데 Multi touch시에 event가 어떻게 들어 오는지 확인하여 pinch zoom을 구현해 봤습니다.
$ adb shell getevent -l
add device 1: /dev/input/event0
name: "odroid-keypad"
add device 2: /dev/input/event2
name: "Microsoft Microsoft 3-Button Mouse with IntelliEye(TM)"
add device 3: /dev/input/event1
name: "odroidx-ts"
/dev/input/event2: EV_REL REL_X ffffffff
/dev/input/event2: EV_REL REL_Y 00000001
/dev/input/event2: EV_SYN SYN_REPORT 00000000
/dev/input/event2: EV_REL REL_X ffffffff
/dev/input/event2: EV_REL REL_Y 00000002
/dev/input/event2: EV_SYN SYN_REPORT 00000000
/dev/input/event2: EV_REL REL_X ffffffff
/dev/input/event2: EV_REL REL_Y 00000002
/dev/input/event2: EV_SYN SYN_REPORT 00000000
/dev/input/event2: EV_REL REL_X ffffffff
/dev/input/event2: EV_REL REL_Y 00000002
/dev/input/event2: EV_SYN SYN_REPORT 00000000
/dev/input/event2: EV_REL REL_X ffffffff
/dev/input/event2: EV_REL REL_Y 00000002
/dev/input/event2: EV_SYN SYN_REPORT 00000000
/dev/input/event2: EV_REL REL_X ffffffff
/dev/input/event2: EV_REL REL_Y 00000002
http://toors.tistory.com/entry/android-touch-move-event-%EC%83%9D%EC%84%B1
위에 링크처럼 하면 move와 같이 single touch event는 만들 수 있습니다.
pinch zoom in/out과 같은 multi touch event도 만들 수 있습니다.
getevent에서 odroidx-ts가 touch screen device이고 node는 event1입니다.
# getevent
add device 1: /dev/input/event0
name: "odroid-keypad"
add device 2: /dev/input/event2
name: "Microsoft Microsoft 3-Button Mouse with IntelliEye(TM)"
add device 3: /dev/input/event1
name: "odroidx-ts"
저의 시스템에서 touch의 노드는 /dev/input/event3입니다.
sh로 만드실 경우 system을 없애고 "adb shell sendevent"로 고치시면 됩니다.
//첫번째 pointer의 ABS_MT_TRACKING_ID를 1로 설정한다.
system("sendevent /dev/input/event1 3 57 1");
system("sendevent /dev/input/event1 3 53 %d", X1);
system("sendevent /dev/input/event1 3 54 %d", Y1);
//ABS_MT_PRESSURE 8정도의 값을 보내서 press 되었다고 알려 줍니다.
system("sendevent /dev/input/event1 3 58 8");
//한 pointer에 대한 EV_SYN, SYN_REPORT를 보낸다.
system("sendevent /dev/input/event3 0 0 0");
//두번째 pointer 입력 전에 ABS_MT_SLOT을 보낸다.
system("sendevent /dev/input/event3 3 47 1");
//두번째 pointer의 위치를 정한다.
X1 = X2 + 50;
Y2 = Y2 + 50;
//두번째 pointer
//첫번째 pointer의 ABS_MT_TRACKING_ID를 2로 설정한다.
system("sendevent /dev/input/event1 3 57 2");
system("sendevent /dev/input/event1 3 53 %d", X2);
system("sendevent /dev/input/event1 3 54 %d", Y2);
system("sendevent /dev/input/event1 3 58 8");
system("sendevent /dev/input/event1 0 0 0");
//여기서 ABS_MT_POSITION_X(53), ABS_MT_POSITION_Y(54), 그리고 SYN_REPORT를 한 묶음으로 이동하고 싶은 만큼 반복한다.
system("sendevent /dev/input/event1 3 53 %d", X2 += 20);
system("sendevent /dev/input/event1 3 54 %d", Y2 += 20);
system("sendevent /dev/input/event1 0 0 0");
//첫번째 pointer의 ABS_MT_TR두ACKING_ID를 -1을 초기화 한다.
system("sendevent /dev/input/event1 3 57 -1");
system("sendevent /dev/input/event1 0 0 0");
//ABS_MT_SLOT(47)은 0,1로 번갈아 입력된다. 앞에서 1로 보냈으니 0으로 보낸다.
system("sendevent /dev/input/event1 3 47 0");
//두번째 pointer의 ABS_MT_TRACKING_ID를 -1을 초기화 한다.
system("sendevent /dev/input/event1 3 57 -1");
system("sendevent /dev/input/event1 0 0 0");
--------------------------------------------------------------------------------------------------
bionic/libc/kernel/common/linux/input.h에 define 되어 있습니다.
#define EV_ABS 0x03
#define ABS_MT_POSITION_X 0x35 -> 57(십진수)
#define ABS_MT_POSITION_Y 0x36 - > 58(십진수)
#define ABS_MT_PRESSURE 0x3a
아래와 같이 getevent -l 로 event를 확인 할 수 있는데 Multi touch시에 event가 어떻게 들어 오는지 확인하여 pinch zoom을 구현해 봤습니다.
$ adb shell getevent -l
add device 1: /dev/input/event0
name: "odroid-keypad"
add device 2: /dev/input/event2
name: "Microsoft Microsoft 3-Button Mouse with IntelliEye(TM)"
add device 3: /dev/input/event1
name: "odroidx-ts"
/dev/input/event2: EV_REL REL_X ffffffff
/dev/input/event2: EV_REL REL_Y 00000001
/dev/input/event2: EV_SYN SYN_REPORT 00000000
/dev/input/event2: EV_REL REL_X ffffffff
/dev/input/event2: EV_REL REL_Y 00000002
/dev/input/event2: EV_SYN SYN_REPORT 00000000
/dev/input/event2: EV_REL REL_X ffffffff
/dev/input/event2: EV_REL REL_Y 00000002
/dev/input/event2: EV_SYN SYN_REPORT 00000000
/dev/input/event2: EV_REL REL_X ffffffff
/dev/input/event2: EV_REL REL_Y 00000002
/dev/input/event2: EV_SYN SYN_REPORT 00000000
/dev/input/event2: EV_REL REL_X ffffffff
/dev/input/event2: EV_REL REL_Y 00000002
/dev/input/event2: EV_SYN SYN_REPORT 00000000
/dev/input/event2: EV_REL REL_X ffffffff
/dev/input/event2: EV_REL REL_Y 00000002
2013년 4월 15일 월요일
Recovery for ODROID
I success to port recovery function of CM to ODROID-X2 base Android beta 1.5(android-4.1.2_r1).
well working.
well working.
now enable recovery UI on LCD.
피드 구독하기:
글 (Atom)