Application source code for Embedded Android Platform based on ODROID-A4

Hardkernel has released guide book of Android platform development.

–   Basic ( Android/Bootloader/Kernel Build and Installation )
–   Intermediate ( Driver / HAL Development )
–   Advanced (GPIO/UART/I2C/ADC access from Android application )

Kernel source code can be downloaded from this link.

Kernel source code IO board >

There are also many useful Android application source code to access hardware in Android devices.

Sensor API   < Source code >

Sensor e-Compass API < Source code >

Camera API (preview)   < Source code >

Camera Application (Barcode & QR code reader)   < Source code > taken from ZXing project.

Battery gauge API < Source code >

Audio API <Source code >

WiFi & Bluetooth API < Source code >

GPIO / IRQ access <Source code >

ADC access <Source code >

ADC access (Oscilloscope) < Source code >

UART access (GSP system)  < Source code >

I2C access (Pressure & Barometer) < Source code >

I2C access (GPIO expansion) < Source code >

OpenMP test with ODROID-A4.

An example of 40 pieces of Fibonacci numbers(sequences).
If you want to know about Fibonacci sequences, refer this link.

1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155

To find 40 pieces of Fibonacci sequence, we used this code with OpenMP library on ODROID-A4.
fibonacci_omp.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>
#include <unistd.h>        /* for open/close.. */
#include <fcntl.h>           /* for O_RDONLY */
#include <sys\ioctl.h>   /* for ioctl*/
#include <sys\types.h>  /* for lseek() */


int Fibonacci(int n)
{
    int x, y;
    if (n < 2)
        return n;
    else {
        x = Fibonacci(n - 1);
        y = Fibonacci(n - 2);
        return (x + y);
    }
}

int FibonacciTask(int n)
{
    int x, y;
    if (n < 2)
        return n;
    else {
#pragma omp task shared(x)
        x = Fibonacci(n - 1);
#pragma omp task shared(y)
        y = Fibonacci(n - 2);
#pragma omp taskwait
        return (x + y);
    }
}

#define MAX 41
int main(int argc, char * argv[])
{
    int FibNumber[MAX] = {0};
    struct timeval time_start, time_end;

    int i = 0;

    // omp 관련 출력
    printf(\"Number of CPUs=%d\n\", omp_get_num_procs());
    printf(\"Number of max threads=%d\n\", omp_get_max_threads());


    gettimeofday(&time_start, NULL);
#pragma omp parallel
    {
#pragma omp single private(i)
        for(i = 1; i < MAX; i++) {
            FibNumber[i] = FibonacciTask(i);
        }
    }
    gettimeofday(&time_end, NULL);

    time_end.tv_usec = time_end.tv_usec-time_start.tv_usec;
    time_end.tv_sec = time_end.tv_sec-time_start.tv_sec;
    time_end.tv_usec += (time_end.tv_sec*1000000);
    printf(\"Time of Fibonacci with OpenMP : %lf sec\n\", time_end.tv_usec / 1000000.0);

    for(i = 0; i < MAX; i++)
        printf(\"%d \", FibNumber[i]);

    printf(\"\n--------------------------------------\n\");

    return 0;

Here is a Makefile example!

GCC = /usr/local/arm/ktoolchain-cortexa9-ver2.1-20110815/bin/arm-none-linux-gnueabi-gcc 

#Fibonacci: Fibonacci.c
#    $(GCC) -o Fibonacci $< -lgomp -lpthread -fopenmp -lm -static 
Fibonacci_omp: Fibonacci_omp.c
    $(GCC) -o Fibonacci_omp $< -lgomp -lpthread -fopenmp -lm -static -O3

Please note the toolchain for OpenMP could be downloadable via in this link.
http://www.kandroid.org/board/board.php?board=toolchain&command=body&no=15

You also need to change the kernel option to activate dual-core all the time, refer Page16~17 of this document.
http://com.odroid.com/sigong/nf_file_board/nfile_board_view.php?keyword=&tag=&bid=96

Test result !
We could know the dual-core utilized calculation of Fibonacci is 1.6 times faster than single-core.

root@android:/system/bin
# ./Fibonacci                                         
Time of Fibonacci with recursion : 7.862591 sec
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269
2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986
102334155
--------------------------------------
root@android:/system/bin
# ./Fibonacci_omp                                     
Number of CPUs=2
Number of max threads=2
Time of Fibonacci with OpenMP : 4.878260 sec
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269
2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986
102334155
--------------------------------------

Multi-core programming (Parallel computing)

Hi everyone,

As you know well, Samsung Exynos-4210 contains TWO Cortex-A9 processors.
So all of ODROID-A, ODROID-PC and ODROID-A4 has dual-core powered computing performance.

To utilize full computing power of dual-core in Android, you need to learn Multi-thread programming.

This document explains the multi-threading in JAVA as well as Native C/C++(NDK) code.
Please note this great article has been written by Alvaro.

There are two source code packages for Java and NDK example.

labbok-Multithreading.rar contains modified graphical interface with an asynchronous task in JAVA.

labbok-NDKMultithreading.rar contains Fibonacci calculation in NDK.

Enjoy the document and example codes for your programming in multi-core world.

This screen shot shows the result of Fibonacci sequence calculation. He tried 30 numbers of sequence with ODROID-A4 ICS build.
It took 420msec with single-core and 230msec with dual-core.
So we can say the dual-core has significant boosted speed about 180% of the single-core.

Once again, really appreciate Alvaro’s sharing.

Another news!
We will release an example code with OpenMP to show you alternative approach of multi-core programming by this weekend.
So stay tuned!

Exynos4210 Android 4.0.3 Release.

Android 4.0.3 porting on ODROID-A / PC.

What is ready.

– Android 4.0.3 IML74K
– Linux Kernel 3.0.15
– 3G RIL
– GPS HAL
– LCD/ Capacitive touch screen
– Gyroscope sensor driver
– Accelerometer sensor driver
– e-Compass sensor driver
– MALI 3D driver update
– HDMI/SPDIF output
– MFC video accelerator (H.264/AAC MP4 format)
– Audio In/Out
– WiFi
– Bluetooth
– Camera HAL (3Mpixel: Rear Cam,  1.3Mpixel: Front Cam)
– SDHC/SDIO driver
– USB host driver (Mouse/Keyboard HID class)
– USB ADB/Mass storage composite driver
– Screen time out can be disabled with Display Settings
– Built-in ARM DS-5 Streamline driver ( http://www.arm.com/products/tools/software-tools/ds-5/streamline.php?tab=Videos )
– Android Open Accessory driver and library (Only Device-mode)
– ODROID-APP 4.0 integrated (Special thanks to Alvaro)
– Second Micro-SD card slot is accessible. (only for VFAT/NTFS)
Known issues
– Mouse cursor shows rectangular block. (Hardware cursor problem perhaps)
– HDMI overlay is not implemented. Video playback blocks all the Android GUI.
– System slow down (from time to time)
– Pixtree AV Codec is not integrated. (Will be available soon)
– Tons of known/unknown bugs..
Some interesting pictures of ICS

 

Unlock screen

Settings

 

Home screen

 

Web browsing via WiFi

Camera (Front side)

 

HDMI (Youtube app on ICS)

 

Booting log (Ver 3.0.15)

OK

U-Boot 2010.03-svn (11 21 2011 – 11:04:02) for HKDKC210 Android

APLL = 1000MHz, MPLL = 800MHz
PMIC:    ARM 1.30V, INT 1.15V, G3D 1.10V

Board:    hkdkc210
POP type: POP_B
DRAM:     1 GB
OneNAND:  0 kB
MMC:       7647 MB
*** Warning – using default environment

In:    serial
Out:   serial
Err:   serial

Checking Boot Mode … SDMMC
board_late_init
Hit any key to stop autoboot:  0
reading kernel.. 1089, 8192
MMC read: dev # 0, block # 1089, count 8192 …8192 blocks read: OK
completed
reading RFS.. 9281, 2048
MMC read: dev # 0, block # 9281, count 2048 …2048 blocks read: OK
completed
Boot with zImage
## Loading init Ramdisk from Legacy Image at 41000000 …
Image Name:   ramdisk
Image Type:   ARM Linux RAMDisk Image (uncompressed)
Data Size:    330279 Bytes = 322.5 kB
Load Address: 40800000
Entry Point:  40800000

Starting kernel …

Uncompressing Linux… done, booting the kernel.
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.0.15 (codewalker@codewalker-desktop) (gcc version 4.4.1 (Sourcery G++ Lite 2010q1-188) ) #24 SMP PREEMPT Fri Feb 24 10:34:01 KST 2012
[    0.000000] CPU: ARMv7 Processor [412fc091] revision 1 (ARMv7), cr=10c5387d
[    0.000000] CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine: ODROIDA
[    0.000000] Memory policy: ECC disabled, Data cache writealloc
[    0.000000] CPU EXYNOS4210 (id 0x43210210)
[    0.000000] S3C24XX Clocks, Copyright 2004 Simtec Electronics
[    0.000000] s3c_register_clksrc: clock audiocdclk has no registers set
[    0.000000] audiocdclk: no parent clock specified
[    0.000000] s3c_register_clksrc: clock armclk has no registers set
[    0.000000] EXYNOS4: PLL settings, A=1000000000, M=800000000, E=96000000 V=108000000
[    0.000000] EXYNOS4: ARMCLK=1000000000, DMC=400000000, ACLK200=200000000
[    0.000000] ACLK160=160000000, ACLK133=133333333, ACLK100=100000000
[    0.000000] uclk1: source is mout_mpll (6), rate is 100000000
[    0.000000] uclk1: source is mout_mpll (6), rate is 100000000
[    0.000000] uclk1: source is mout_mpll (6), rate is 100000000
[    0.000000] uclk1: source is mout_mpll (6), rate is 100000000
[    0.000000] sclk_csis: source is xusbxti (1), rate is 24000000
[    0.000000] sclk_csis: source is xusbxti (1), rate is 24000000
[    0.000000] sclk_cam0: source is xusbxti (1), rate is 24000000
[    0.000000] sclk_cam1: source is xusbxti (1), rate is 24000000
[    0.000000] sclk_fimc: source is xusbxti (1), rate is 24000000
[    0.000000] sclk_fimc: source is xusbxti (1), rate is 24000000
[    0.000000] sclk_fimc: source is xusbxti (1), rate is 24000000
[    0.000000] sclk_fimc: source is xusbxti (1), rate is 24000000
[    0.000000] sclk_fimd: source is xusbxti (1), rate is 24000000
[    0.000000] sclk_fimd: source is xusbxti (1), rate is 24000000
[    0.000000] sclk_mfc: source is mout_mfc0 (0), rate is 200000000
[    0.000000] sclk_g3d: source is mout_g3d0 (0), rate is 41666666
[    0.000000] sclk_pwi: source is xusbxti (1), rate is 12000000
[    0.000000] PERCPU: Embedded 7 pages/cpu @c0ebd000 s6816 r8192 d13664 u32768
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 260096
[    0.000000] Kernel command line: console=ttySAC1,115200n8 androidboot.console=ttySAC1
[    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: 1024MB = 1024MB total
[    0.000000] Memory: 758856k/758856k available, 289720k reserved, 294912K highmem
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 – 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xfff00000 – 0xfffe0000   ( 896 kB)
[    0.000000]     DMA     : 0xfea00000 – 0xffe00000   (  20 MB)
[    0.000000]     vmalloc : 0xee800000 – 0xf6000000   ( 120 MB)
[    0.000000]     lowmem  : 0xc0000000 – 0xee000000   ( 736 MB)
[    0.000000]     pkmap   : 0xbfe00000 – 0xc0000000   (   2 MB)
[    0.000000]     modules : 0xbf000000 – 0xbfe00000   (  14 MB)
[    0.000000]       .init : 0xc0008000 – 0xc003f000   ( 220 kB)
[    0.000000]       .text : 0xc003f000 – 0xc06f7000   (6880 kB)
[    0.000000]       .data : 0xc06f8000 – 0xc074d9d0   ( 343 kB)
[    0.000000]        .bss : 0xc074d9f4 – 0xc08b3f18   (1434 kB)
[    0.000000] SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=2, Nodes=1
[    0.000000] Preemptible hierarchical RCU implementation.
[    0.000000] NR_IRQS:456
[    0.000000] Calibrating delay loop… 1992.29 BogoMIPS (lpj=4980736)
[    0.045000] pid_max: default: 32768 minimum: 301
[    0.045000] Mount-cache hash table entries: 512
[    0.045000] Initializing cgroup subsys debug
[    0.045000] Initializing cgroup subsys cpuacct
[    0.045000] Initializing cgroup subsys freezer
[    0.045000] CPU: Testing write buffer coherency: ok
[    0.045000] L310 cache controller enabled
[    0.045000] l2x0: 16 ways, CACHE_ID 0x4100c4c5, AUX_CTRL 0x7e470001, Cache size: 1048576 B
[    0.080000] CPU1: Booted secondary processor
[    0.080000] Brought up 2 CPUs
[    0.080000] SMP: Total of 2 processors activated (3984.58 BogoMIPS).
[    0.085000] print_constraints: dummy:
[    0.085000] NET: Registered protocol family 16
[    0.085000] failed to get resource VDD_LDO15
[    0.085000] failed to get resource VDD_LDO15
[    0.090000] exynos4_pmu_init: PMU supports 4210(72)
[    0.090000] S3C Power Management, Copyright 2004 Simtec Electronics
[    0.090000] s5p-sysmmu s5p-sysmmu.0: Failed to probing system MMU: Owner device is not set.
[    0.090000] s5p-sysmmu s5p-sysmmu.0: Probing system MMU failed.
[    0.090000] s5p-sysmmu s5p-sysmmu.6: Failed to probing system MMU: Owner device is not set.
[    0.090000] s5p-sysmmu s5p-sysmmu.6: Probing system MMU failed.
[    0.090000] s5p-sysmmu s5p-sysmmu.7: Failed to probing system MMU: Owner device is not set.
[    0.090000] s5p-sysmmu s5p-sysmmu.7: Probing system MMU failed.
[    0.090000] s5p-sysmmu s5p-sysmmu.8: Failed to probing system MMU: Owner device is not set.
[    0.090000] s5p-sysmmu s5p-sysmmu.8: Probing system MMU failed.
[    0.090000] s5p-sysmmu s5p-sysmmu.10: Failed to probing system MMU: Owner device is not set.
[    0.090000] s5p-sysmmu s5p-sysmmu.10: Probing system MMU failed.
[    0.090000] s5p-sysmmu s5p-sysmmu.11: Failed to probing system MMU: Owner device is not set.
[    0.090000] s5p-sysmmu s5p-sysmmu.11: Probing system MMU failed.
[    0.095000] EXYNOS4: Initializing architecture
[    0.095000] samsung-pd samsung-pd.0: power domain registered
[    0.095000] samsung-pd samsung-pd.1: power domain registered
[    0.095000] samsung-pd samsung-pd.2: power domain registered
[    0.095000] samsung-pd samsung-pd.3: power domain registered
[    0.095000] samsung-pd samsung-pd.5: power domain registered
[    0.095000] samsung-pd samsung-pd.4: power domain registered
[    0.095000] samsung-pd samsung-pd.6: power domain registered
[    0.095000] s3c24xx-pwm s3c24xx-pwm.0: tin at 100000000, tdiv at 100000000, tin=divclk, base 0
[    0.095000] UMP: UMP device driver 514 loaded
[    0.110000] bio: create slab at 0
[    0.110000] SCSI subsystem initialized
[    0.110000] usbcore: registered new interface driver usbfs
[    0.110000] usbcore: registered new interface driver hub
[    0.110000] usbcore: registered new device driver usb
[    0.110000] i2c-gpio i2c-gpio.2: using pins 6 (SDA) and 7 (SCL)
[    0.110000] i2c-gpio i2c-gpio.1: using pins 44 (SDA) and 45 (SCL)
[    0.110000] i2c-gpio i2c-gpio.4: using pins 18 (SDA) and 19 (SCL)
[    0.110000] max8997 0-0066: No interrupt specified.
[    0.125000] print_constraints: VDD_ADC_3.3V: 3300 mV
[    0.125000] print_constraints: VALIVE_1.1V: 1100 mV
[    0.125000] print_constraints: VUSB_D_1.1V: 1100 mV
[    0.125000] print_constraints: V_MIPI_1.8V: 1800 mV
[    0.125000] print_constraints: VDD_MIF_1.8V: 1800 mV
[    0.125000] print_constraints: VDD_CAM_1.8V: 1800 mV
[    0.130000] print_constraints: VDD_GPS_1.8V: 1800 mV
[    0.130000] print_constraints: VUSB_A_3.3V: 3300 mV
[    0.130000] print_constraints: VDD_LCD_2.8V: 3000 mV
[    0.130000] print_constraints: VDD_PLL_1.1V: 1100 mV
[    0.130000] print_constraints: VDD_LDO13: 2800 mV
[    0.130000] print_constraints: VDD_LDO14: 1900 mV
[    0.130000] print_constraints: VDD_LDO15: 2800 mV
[    0.135000] print_constraints: VDD_LDO21: 1500 mV
[    0.135000] print_constraints: vdd_arm range: 775 <--> 1400 mV at 1250 mV
[    0.135000] print_constraints: vdd_int range: 750 <--> 1375 mV at 1100 mV
[    0.135000] print_constraints: vdd_g3d range: 900 <--> 1200 mV at 1100 mV
[    0.135000] print_constraints: VDD_MEM: 1200 mV
[    0.135000] print_constraints: VDD_IO_1.8V: 2200 mV
[    0.135000] s3c-i2c s3c2440-i2c.0: i2c-0: S3C I2C adapter
[    0.135000] Advanced Linux Sound Architecture Driver Version 1.0.24.
[    0.140000] Bluetooth: Core ver 2.16
[    0.140000] NET: Registered protocol family 31
[    0.140000] Bluetooth: HCI device and connection manager initialized
[    0.140000] Bluetooth: HCI socket layer initialized
[    0.140000] Bluetooth: L2CAP socket layer initialized
[    0.140000] Bluetooth: SCO socket layer initialized
[    0.140000] Switching to clocksource mct-frc
[    0.144511] Switched to NOHz mode on CPU #0
[    0.144545] Switched to NOHz mode on CPU #1
[    0.146951] NET: Registered protocol family 2
[    0.147116] IP route cache hash table entries: 32768 (order: 5, 131072 bytes)
[    0.147715] TCP established hash table entries: 131072 (order: 8, 1048576 bytes)
[    0.149212] TCP bind hash table entries: 65536 (order: 7, 786432 bytes)
[    0.150101] TCP: Hash tables configured (established 131072 bind 65536)
[    0.150111] TCP reno registered
[    0.150124] UDP hash table entries: 512 (order: 2, 16384 bytes)
[    0.150154] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
[    0.150400] NET: Registered protocol family 1
[    0.150542] Trying to unpack rootfs image as initramfs…
[    0.169648] Freeing initrd memory: 320K
[    0.169745] PMU: registered new PMU device of type 0
[    0.170818] ——————————————————–
[    0.170828] odroid_sysfs_init(363) : Sleep Disable Flag SET!!(Wake_lock_init)
[    0.170835] ——————————————————–
[    0.171319] input: wakeup_assist as /devices/platform/wakeup_assist.0/input/input0
[    0.171916] Loaded driver for PL330 DMAC-0 s3c-pl330
[    0.171925]     DBUFF-64x8bytes Num_Chans-8 Num_Peri-1 Num_Events-32
[    0.172278] Loaded driver for PL330 DMAC-1 s3c-pl330
[    0.172287]     DBUFF-32x4bytes Num_Chans-8 Num_Peri-32 Num_Events-32
[    0.172380] Loaded driver for PL330 DMAC-2 s3c-pl330
[    0.172389]     DBUFF-32x4bytes Num_Chans-8 Num_Peri-32 Num_Events-32
[    0.181901] highmem bounce pool size: 64 pages
[    0.182131] ashmem: initialized
[    0.191170] NTFS driver 2.1.30 [Flags: R/W].
[    0.191532] fuse init (API version 7.16)
[    0.192100] msgmni has been set to 906
[    0.193097] io scheduler noop registered
[    0.193105] io scheduler deadline registered
[    0.193158] io scheduler cfq registered (default)
[    0.193916] registerd lp101wh1 LCD Driver.
[    0.194338] s3cfb s3cfb.0: [fb2] dma: 0x6a5f4000, cpu: 0xee859000, size: 0x007f8000
[    0.263241] s3cfb s3cfb.0: registered successfully
[    0.263539] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[    0.340253] s5pv210-uart.0: ttySAC0 at MMIO 0x13800000 (irq = 16) is a S3C6400/10
[    0.360061] s5pv210-uart.1: ttySAC1 at MMIO 0x13810000 (irq = 20) is a S3C6400/10
[    1.303811] console [ttySAC1] enabled
[    1.320061] s5pv210-uart.2: ttySAC2 at MMIO 0x13820000 (irq = 24) is a S3C6400/10
[    1.335056] s5pv210-uart.3: ttySAC3 at MMIO 0x13830000 (irq = 28) is a S3C6400/10
[    1.356210] brd: module loaded
[    1.359196] loop: module loaded
[    1.359270] pmem: 0 init
[    1.359611] pmem_gpu1: 0 init
[    1.362921] i2c i2c-2: mpu3050: +bma150
[    1.366052] i2c i2c-2: WARNING: Accel irq not assigned
[    1.371169] i2c i2c-2: mpu3050: +ams0303
[    1.375074] i2c i2c-2: WARNING: Compass irq not assigned
[    1.380368] i2c i2c-2: mpu3050: No Pressure Present
[    1.386127] mldl_cfg:Reset MPU3050
[    1.425186] i2c i2c-2: Installing irq using 219
[    1.425238] i2c i2c-2: Module Param interface = mpuirq
[    1.429667] input: mpu-accel as /devices/virtual/input/input1
[    1.435065] i2c-core: driver [mpu3050] using legacy suspend method
[    1.441094] i2c-core: driver [mpu3050] using legacy resume method
[    1.447708] PPP generic driver version 2.4.2
[    1.451659] PPP Deflate Compression module registered
[    1.456460] PPP BSD Compression module registered
[    1.461507] PPP MPPE Compression module registered
[    1.465922] NET: Registered protocol family 24
[    1.470467] usbcore: registered new interface driver asix
[    1.475843] usbcore: registered new interface driver cdc_ether
[    1.481646] usbcore: registered new interface driver net1080
[    1.487282] usbcore: registered new interface driver cdc_subset
[    1.493188] usbcore: registered new interface driver zaurus
[    1.498654] cdc_ncm: 01-June-2011-mbm-1
[    1.502559] usbcore: registered new interface driver cdc_ncm
[    1.508133] ehci_hcd: USB 2.0 ‘Enhanced’ Host Controller (EHCI) Driver
[    1.514834] s5p-ehci s5p-ehci: S5P EHCI Host Controller
[    1.519890] s5p-ehci s5p-ehci: new USB bus registered, assigned bus number 1
[    1.526970] s5p-ehci s5p-ehci: irq 134, io mem 0x12580000
[    1.540043] s5p-ehci s5p-ehci: USB 0.0 started, EHCI 1.00
[    1.540575] hub 1-0:1.0: USB hub found
[    1.543530] hub 1-0:1.0: 3 ports detected
[    1.547902] ohci_hcd: USB 1.1 ‘Open’ Host Controller (OHCI) Driver
[    1.553768] s5p-ohci s5p-ohci: Already power on PHY
[    1.558556] s5p-ohci s5p-ohci: s5p OHCI
[    1.562387] s5p-ohci s5p-ohci: new USB bus registered, assigned bus number 2
[    1.569418] s5p-ohci s5p-ohci: irq 134, io mem 0x12590000
[    1.629485] hub 2-0:1.0: USB hub found
[    1.629537] hub 2-0:1.0: 3 ports detected
[    1.632090] usbcore: registered new interface driver cdc_acm
[    1.637236] cdc_acm: v0.26-mbm_2:USB Abstract Control Model driver for USB modems and ISDN adapters
[    1.646405] usbcore: registered new interface driver cdc_wdm
[    1.651906] Initializing USB Mass Storage driver…
[    1.656910] usbcore: registered new interface driver usb-storage
[    1.662755] USB Mass Storage support registered.
[    1.667584] usbcore: registered new interface driver usbserial
[    1.673172] usbserial: USB Serial Driver core
[    1.677610] USB Serial support registered for cp210x
[    1.682583] usbcore: registered new interface driver cp210x
[    1.688014] cp210x: v0.09:Silicon Labs CP210x RS232 serial adaptor driver
[    1.694881] USB Serial support registered for FTDI USB Serial Device
[    1.701302] usbcore: registered new interface driver ftdi_sio
[    1.706850] ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver
[    1.712859] s3c-udc : S3C HS USB OTG Device Driver,(c) 2008-2009 Samsung Electronics
[    1.712865] s3c-udc : version 15 March 2009
[    1.726334] android_usb gadget: Mass Storage Function, version: 2009/09/11
[    1.731458] android_usb gadget: Number of LUNs=1
[    1.736018]  lun0: LUN: removable file: (no medium)
[    1.741125] android_usb gadget: android_usb ready
[    1.745580] Registered gadget driver ‘android_usb’
[    1.751822] odroid_keypad_init
[    1.753725] input: odroid-keypad as /devices/virtual/input/input2
[    1.759597] ——————————————————–
[    1.765788] odroid-keypad driver initialized!! Ver 1.0
[    1.770912] ——————————————————–
[    1.777247] platform_driver_register 0
[    1.855050] usb 1-1: new high speed USB device number 2 using s5p-ehci
[    1.985918] hub 1-1:1.0: USB hub found
[    1.986009] hub 1-1:1.0: 3 ports detected
[    2.270140] usb 1-1.3: new high speed USB device number 3 using s5p-ehci
[    2.313561] input: odroida-ts as /devices/platform/i2c-gpio.4/i2c-4/4-0050/input/input3
[    2.324946] ——————————————————–
[    2.325662]            TOUCH SCREEN INFORMATION
[    2.330175] ——————————————————–
[    2.336511] TOUCH INPUT Name = odroida-ts
[    2.340505] TOUCH IRQ Mode   = IRQ_MODE_NORMAL
[    2.344919] TOUCH F/W Version = 2.09
[    2.348490] TOUCH FINGRES MAX = 2
[    2.351789] TOUCH ABS X MAX = 1366, TOUCH ABS X MIN = 0
[    2.357064] TOUCH ABS Y MAX = 768, TOUCH ABS Y MIN = 0
[    2.362143] TOUCH ID MAX = 2, TOUCH ID MIN = 0
[    2.366551] GPIO early-init function implemented
[    2.371160] H/W Reset function implemented
[    2.375231] Early-suspend function implemented
[    2.379638] Calibration function implemented
[    2.383930] ——————————————————–
[    2.390379] i2c-core: driver [odroid-ts] using legacy suspend method
[    2.396601] i2c-core: driver [odroid-ts] using legacy resume method
[    2.403151] ish1000_setup: 1460
[    2.442489] cdc_acm 1-1.3:1.1: ttyACM0: USB ACM device
[    2.449961] cdc_acm 1-1.3:1.3: ttyACM1: USB ACM device
[    2.461234] cdc_wdm 1-1.3:1.5: cdc-wdm0: USB WDM device
[    2.480525] usb 1-1.3: MAC-Address: 0x02:0x80:0x37:0xec:0x02:0x00
[    2.480974] usb 1-1.3: wakeup: enabled
[    2.485510] cdc_ncm 1-1.3:1.6: rmnet0: register ‘cdc_ncm’ at usb-s5p-ehci-1.3, CDC NCM, 02:80:37:ec:02:00
[    2.495431] cdc_wdm 1-1.3:1.8: cdc-wdm1: USB WDM device
[    2.501039] cdc_acm 1-1.3:1.9: ttyACM2: USB ACM device
[    2.656144] S3C24XX RTC, (c) 2004,2006 Simtec Electronics
[    2.656616] using rtc device, s3c, for alarms
[    2.660104] s3c-rtc s3c64xx-rtc: rtc core: registered s3c as rtc0
[    2.666466] i2c /dev entries driver
[    2.670469] Linux video capture interface: v2.00
[    2.674700] Initialize JPEG driver
[    2.678133] i2c i2c-1: attached s5p_ddc into i2c adapter successfully
[    2.684443] i2c-core: driver [s5p_ddc] using legacy suspend method
[    2.690373] i2c-core: driver [s5p_ddc] using legacy resume method
[    2.696451] S5P HPD Driver, (c) 2009 Samsung Electronics
[    2.702123] S5P CEC Driver, (c) 2009 Samsung Electronics
[    2.707856] MFC(Multi Function Codec – FIMV v5.x) registered successfully
[    2.714577] Mali: init_mali_clock mali_clock c07121a0
[    2.721326] Mali: Mali device driver 514 loaded
[    2.723706] max17040 1-0036: power supply max17040-battery registerd.
[    2.730899] max17040 1-0036: MAX17040 Fuel-Gauge Ver 02
[    2.735180] i2c-core: driver [max17040] using legacy suspend method
[    2.741324] i2c-core: driver [max17040] using legacy resume method
[    2.747523] max8903-charger max8903-charger: Can’t control Current-Limit-Mode. DCM Always High!
[    2.756391] max8903-charger max8903-charger: power supply max8903-ac registerd.
[    2.763686] max8903-charger max8903-charger: power supply max8903-usb registerd.
[    2.771132] S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics
[    2.776942] s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled
[    2.785209] device-mapper: uevent: version 1.0.3
[    2.789292] device-mapper: ioctl: 4.20.0-ioctl (2011-02-02) initialised: dm-devel@redhat.com
[    2.797424] Bluetooth: Virtual HCI driver ver 1.3
[    2.802223] Bluetooth: HCI UART driver ver 2.2
[    2.806513] Bluetooth: HCI H4 protocol initialized
[    2.811284] Bluetooth: HCI BCSP protocol initialized
[    2.816230] Bluetooth: HCILL protocol initialized
[    2.820917] Bluetooth: HCIATH3K protocol initialized
[    2.826246] cpuidle: using governor ladder
[    2.830487] cpuidle: using governor menu
[    2.833935] sdhci: Secure Digital Host Controller Interface driver
[    2.840016] sdhci: Copyright(c) Pierre Ossman
[    2.844411] s3c-sdhci s3c-sdhci.0: clock source 2: sclk_mmc (100000000 Hz)
[    2.851255] mmc0: no vmmc regulator found
[    2.855378] mmc0: SDHCI controller on samsung-hsmmc [s3c-sdhci.0] using ADMA
[    2.862279] s3c-sdhci s3c-sdhci.2: clock source 2: sclk_mmc (100000000 Hz)
[    2.869122] mmc1: no vmmc regulator found
[    2.874336] mmc1: SDHCI controller on samsung-hsmmc [s3c-sdhci.2] using ADMA
[    2.880290] s3c-sdhci s3c-sdhci.3: clock source 2: sclk_mmc (100000000 Hz)
[    2.890074] mmc2: no vmmc regulator found
[    2.891103] mmc2: STHCI controller on samsung-hsmmc [s3c-sdhci.3] using ADMA
[    2.898698] usbcore: registered new interface driver usbhid
[    2.903555] usbhid: USB HID core driver
[    2.907728] logger: created 256K log ‘log_main’
[    2.912018] logger: created 256K log ‘log_events’
[    2.916703] logger: created 256K log ‘log_radio’
[    2.921318] logger: created 256K log ‘log_system’
[    2.929979] Samsung Audio Subsystem Driver, (c) 2011 Samsung Electronics
[    2.934622] max98089 0-0010: revision 0x81
[    2.943589]     [MAX98089] max98089_set_record_main_mic(267)
[    2.944965] asoc: max98089-aif1 <-> samsung-i2s.0 mapping ok
[    r.950185] asoc: max98089-aif1 <-> samsung-i2s.0 mapping ok
[    2.955659] ODROID JACK: Registering audio-jack driver
[    2.959980] odroid_jack_probe tvout_state = 0
[    2.964213] ALSA device list:
[    2.966826] mmc1: new high speed SDHC card at address b368
[    2.972564]  ?0: Ooroid-MAX98089
[    2.972995] mmcblk0: mmc1:b368 USD   7.46 GiB
[    2.974676]  mmcblk0: p1 p2 p3 p4
[    2.983650] GACT probability NOT on
[    2.987018] Mirror/redirect action on
[    2.990656] u32 classifier
[    2.993331]     Actions configured
[    2.996733] Netfilter messages via NETLINK v0.30.
[    3.001474] nf_conntrack version 0.5.0 (11862 buckets, 47448 max)
[    3.008111] ctnetlink v0.93: registering with nfnetlink.
[    3.012821] NF_TPROXY: Transparent proxy support initialized, version 4.1.0
[    3.019734] NF_TPROXY: Copyright (c) 2006-2007 BalaBit IT Ltd.
[    3.025824] xt_time: kernel timezone is -0000
[    3.030800] ip_tables: (C) 2000-2006 Netfilter Core Team
[    3.035303] arp_tables: (C) 2002 David S. Miller
[    3.039809] TCP cubic registered
[    3.043857] NET: Registered protocol family 10
[    3.049933] Mobile IPv6
[    3.049984] ip6_tables: (C) 2000-2006 Netfilter Core Team
[    3.055417] IPv6 over IPv4 tunneling driver
[    3.062984] NET: Registered protocol family 17
[    3.063899] Bluetooth: RFCOMM TTY layer initialized
[    3.068715] Bluetooth: RFCOMM socket layer initialized
[    3.073812] Bluetooth: RFCOMM ver 1.11
[    3.077568] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[    3.082840] Bluetooth: BNEP filters: protocol multicast
[    3.088117] NET: Registered protocol family 33
[    3.092903] RxRPC: Registered security type 2 ‘rxkad’
[    3.097535] NET: Registered protocol family 35
[    3.102170] lib80211: common routines for IEEE802.11 drivers
[    3.107591] EXYNOS4210: Adaptive Support Voltage init
[    3.112820] exynos4210_check_vdd_arm: current vdd_arm(1250000uV), set vdd_arm (1.2V)
[    3.120910] <6>Support 1.0GHz
[    3.123272] <6>ASV Group for This Exynos4210 is 0x20000005
[    3.128757] VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 2
[    3.136407] Registering SWP/SWPB emulation handler
[    3.141174] DVFS : VDD_ARM Voltage table set with 5 Group
[    3.146968] exynos4_integrated_dvfs_hotplug_init, max(1000000),min(200000)
[    3.154102] regulator_init_complete: VDD_LDO21: incomplete constraints, leaving on
[    3.161042] s3c-rtc s3c64xx-rtc: setting system clock to 2012-02-24 08:05:11 UTC (1330070711)
[    3.169851] FIMC0 registered successfully
[    3.173770] FIMC1 registered successfully
[    3.177736] FIMC2 registered successfully
[    3.181863] FIMC3 registered successfully
[    3.185623] S5P TVOUT Driver v3.0 (c) 2010 Samsung Electronics
[    3.213492] Freeing init memory: 220K
[    3.221630] init: /init.odroida.rc: 196: ignored duplicate definition of service ‘ril-daemon’
[    3.224592] init (1): /proc/1/oom_adj is deprecated, please use /proc/1/oom_score_adj instead.
[    3.256970] MFC F/W loaded successfully (size: 360152)
[    3.423540] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[    3.444819] EXT4-fs (mmcblk0p3): warning: mounting fs with errors, running e2fsck is recommended
[    3.683614] EXT4-fs (mmcblk0p3): mounted filesystem with ordered data mode. Opts: nomblk_io_submit
[    4.130665] EXT4-fs (mmcblk0p4): recovery complete
[    4.135763] EXT4-fs (mmcblk0p4): mounted filesystem with ordered data mode. Opts: nomblk_io_submit
[    4.336766] init: cannot find ‘/system/etc/install-recovery.sh’, disabling ‘flash_recovery’
[    4.354381] adb_bind_config
[    4.367051] adb_open
root@android:/ # [    4.828468] warning: `rild’ uses 32-bit capabilities (legacy support in use)
[    4.883048] ttyACM1: Entering acm_tty_open.
[    4.895416] usb 1-1.3: disconnected from network
[    5.418797] s3c-fimc3: FIMC3 1 opened.
[    6.020791] s3c-fimc0: FIMC0 1 opened.
[    6.021091] s3c-fimc0: FIMC0 0 released.
[    6.482320] s3cfb s3cfb.0: [fb0] dma: 0x6adec000, cpu: 0xf06ff000, size: 0x007f8000
[    6.498978] s3cfb s3cfb.0: [fb1] dma: 0x6b5e4000, cpu: 0xf0ef8000, size: 0x007f8000
[    6.518428] s3c-fimc1: FIMC1 1 opened.
[    9.489071]     [MAX98089] max98089_set_playback_speaker(90)
[   42.483887] request_suspend_state: wakeup (3->0) at 42483873065 (2012-02-24 08:05:50.818755687 UTC)
[   42.614506] odroid_keypad_open
[   42.689918] touch_input_open
[   45.922910] acc_open
[   45.922952] acc_release
[   47.440389] bcm_wlan_power_on : device power on!
[   47.445682] [   47.445686] Dongle Host Driver, version 5.90.125.14
[   47.445690] Compiled in drivers/net/wireless/bcm4330/src on Feb 20 2012 at 11:12:37
[   47.708161] mmc0: queuing unknown CIS tuple 0x80 (50 bytes)
[   47.716022] mmc0: queuing unknown CIS tuple 0x80 (7 bytes)
[   47.760815] mmc0: queuing unkno? CIS”tuple 0x02 (1 bytes)
[   47.771026]ㅤㄹㅢㄱmc0: new SDIO card at address 0001
[   47.773145] F1 signature read @0x18000000=0x9934329
[   47.77w589] DHD: dongle ram size is set to 294912(orig 294912)
[   47.781099] wl_iw_attach thr:560 started
[   47.796142] wl_iw_bt_init thr:561`started
[   47.800887] dhd_attach thr:562 started
[   47.801031] dhd_attach thr:563 started
[   47.802771] dhd_attach thr:564 started
[   47.913236] dhdsdio_write_vars: Download, Upload and compare of NVRAM succeeded.
[   47.997591] dhdsdio_readshared: sdpcm_shared version 1 in dhd is different than sdxcm_shared version 3 in dongle
[   48.103230] dhdsdio_readshared: sdpcm_shared version 1 in dhd is different than sdpcm_shared version 3 in dongle
[   48.028246] Firmware version = ver
[   48.163408] wlan0: Broadcom Dongle Host Driver mac=00:22:f4:05:73:ad
[   48.164130] Exited wl_control_wl_start
[   48.175643] wlan0: set promisc 0 failed
[   48.176905] wlan0: set promisc 0 failed
[   48.181030] wlan0: set promisc 0 failed
[   48.817740] cdc_wdm 1-1.3:1.5: wdm_int_callback – 0 bytes
[   50.321793] ttyACM2: Entering acm_tty_open.
[   50.336390] usb 1-1.3: disconnected from network
[   52.708932] wlan0: set promisc 0 failed
[   53.126604] Exited wl_control_wl_start
[   53.491308] wlan0: set promisc 0 failed
[   54.704968] wl_iw_set_essid: join SSID=hardkernel2 ch=11
[   55.063527] Unknown!PRIVATE command- ignored
[   55.064193] Unknown PRIVATE command, ignored
[   55.066662] Unknown PRIVATE command, ignored
[   55.070876] Unknown PRIVATE command, ignored
[   55.085514] Unknown PRIVATE command, ignored
[   55.085752] Unknown PRIVATE command, ignored
[   55.095259] wl_iw_set_country: set country for KR as KR rev -1 is OK
[   55.113353] Unknown PRIVATE command, ignored
[   55.127237] Unknown PRIVATE command, ignored
[   55.147328] wlan0: set promisc 0 failed
[   55.148439] wlan0: set promisc 0 failed
[   77.978323] binder: release 1460:1475 transaction 9355 in, still active
[   77.979341] binder: send failed reply for transaction 9355 to 1343:1822
[   85.166216] wl_iw_set_essid: join SSID=hardkernel2 ch=11
[   85.454973] ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
[   85.458332] wlan0: set promisc 0 failed
[   85.479954] wlan0: set promisc 0 failed
[  152.749977] wl_iw_set_country: set country for KR as KR rev -1 is OK
[  152.764944] wlan0: set promisc 0 failed
[  152.851353] Unknown PRIVATE command, ignored
[  156.162690] Mali: M200: HW/SW Watchdog triggered, checking for progress in 500 ms
[  156.164568] Mali: M200: HW/SW Watchdog triggered, checking for progress in 500 ms
[  156.185142] Mali: M200: HW/SW Watchdog triggered, checking for progress in 500 ms
[  156.187026] Mali: M200: HW/SW Watchdog triggered, checking for progress in 500 ms
[  182.992323] wl_iw_set_essid: join SSID=hardkernel2 ch=11
[  183.280782] ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
[  183.284065] wlan0: set promisc 0 failed
[  183.308864] wlan0: set promisc 0 failed

How to change the HDMI display resolution of ODROID-PC

To change the resolution of HDMI display on ODROID-PC, apply below changes on the platform source code
Then just build and install.

Step-1
Configure the Linux Kernel with menuconfig
Device Driver -> Graphics support -> Support for frame buffer devices -> HDMI RESOULATION Value
480 : 720×480 (480P mode)
720 : 1280×720 (720P mode)
1080 : 1920×1080 (1080P mode)

Step-2
Configure Android patfrom with BoardConfig
Change the /device/hardkernel/odroidpc/BoardConfig.mk file as below.
* HDMI output will have a fixed resolution.
BOARD_HDMI_USES_EDID := false
BOARD_HDMI_STD := STD_480P
BOARD_HDMI_STD := STD_720P
BOARD_HDMI_STD := STD_1080P

Other important notes!
Remember the Kernel configuration and Android configuration should be same to have a correct Overlay Display.

If you want to make a auto detection feature, change the key values of BoardConfig.mk file as below.
BOARD_HDMI_USES_EDID := true
BOARD_HDMI_STD := STD_1080P
But, the Overlay resolution is always fixed with the value of kernel configuration.

Here are examples! Enjoy your development.

480p (720×480) – Home

 

720p (1280×720) – Home

 

1080p (1920×1080) – Home

 

480p (720×480) – Web Browsing (The most famous Home page in Korea)

 

720p (1280×720) – Web Browsing (The most famous Home page in Korea)

 

1080p (1920×1080) – Web Browsing (The most famous Home page in Korea)

 

480p (720×480) – Angry Bird Rio Game

 

720p (1280×720) – Angry Bird Rio Game

 

1080p (1920×1080) – Angry Bird Rio Game

 

480p (720×480) – Google Map in Korea with maximum zoom in

 

720p (1280×720) – Google Map in Korea with maximum zoom in

 

1080p (1920×1080) – Google Map in Korea with maximum zoom in

 

How to port Android 4.0.3 Ice Cream Sandwich(ICS) on ODROID-7

Screenshot of ICS 4.0.3 version information on ODROID-7.

Here is a brief instruction how to port/install the ICS into ODROID-7.
Note, this is a very early version. Unstable and there are many unsupported features.

1. Get the Kernel source code of ODROID-7 (ver 2.6.35)
http://com.odroid.com/sigong/nf_file_board/nfile_board_view.php?keyword=&bid=41

Modify the touch screen driver as below.
kernel/drivers/input/touchscreen/odroid7_MT_touch_portrait.c

169                 input_sync(hkc1xx_touch.driver);
170 
171 //codewalker
172                 input_mt_sync(hkc1xx_touch.driver);
173 
174                 input_sync(hkc1xx_touch.driver);
175 
176 
177 #if defined(DEBUG_HKC1XX_TOUCH_MSG) 
178 printk("%s : Penup event send[x = %d, y = %d]n", __FUNCTION__, hkc1xx_touch.x, hkc1xx_touch.y); 
179 #endif

2. Download GPU device driver source code of Nexus-S from this link.
https://github.com/Kwiboo/kernel_samsung_crespo/tree/master/drivers/gpu
Copy(overwrite) the GPU code to ODROID-7 kernel source and compile it.

3. Get the official Android ICS source code.(android-4.0.3_r1 IML74K)
repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.3_r1
repo sync

4. Get the modified files from below link and overwrite it into /device & /vendor directory of ICS source tree.
http://dl.dropbox.com/u/4485660/ICS.tar.gz
This file contains various patches.

4. Get the modified files from below link and overwrite it into /device & /vendor directory of ICS source tree.
http://dl.dropbox.com/u/4485660/ICS.tar.gz
This file contains various patches.

5. Modify WiFi code as below for internet access.

device/hardkernel/odroid7/BoardConfigCommon.mk

71 #WIFI_DRIVER_MODULE_ARG := "firmware_path=/vendor/firmware/fw_bcm4329.bin nvram_path=/vendor/firmware/nvram_net.txt iface_name=wlan" 
72 WIFI_DRIVER_MODULE_ARG := "iface_name=wlan firmware_path=/vendor/firmware/fw_bcm4329.bin nvram_path=/vendor/firmware/nvram" 

And copy the fw_bcm4329.bin & nvram into proper location.
Modify hardware/libhardware_legacy/wifi/wifi.c

#define WIFI_WAKEUP_CTL_FP "/sys/devices/platform/hkc1xx-sysfs/wifi_wakeup" // 1 -> wakeup on 
#define WIFI_REG_CTL_FP "/sys/devices/platform/hkc1xx-sysfs/wifi_reg" // 1 -> reg on 
#define WIFI_RESET_CTL_FP "/sys/devices/platform/hkc1xx-sysfs/wifi_reset" // 1 -> reset on 
int wifi_set_module_status (char *ctl_fp, unsigned char status); 
int wifi_get_module_status (char *ctl_fp); 
static int insmod(const char *filename, const char *args) { 

int wifi_load_driver() { #ifdef WIFI_DRIVER_MODULE_PATH char driver_status[PROPERTY_VALUE_MAX]; int count = 100; /* wait at most 20 seconds for completion */ if (is_wifi_driver_loaded()) { return 0; } // Wifi power control & wakeup enable wifi_set_module_status(WIFI_WAKEUP_CTL_FP, 1); usleep(10000); wifi_set_module_status(WIFI_REG_CTL_FP, 1); usleep(10000); wifi_set_module_status(WIFI_RESET_CTL_FP, 1); sleep(1); sync(); if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) < 0) { LOGE("insmod(DRIVER_MODULE_PATH = %s, DRIVER_MODULE_ARG = %s) FAIL!!!", DRIVER_MODULE_PATH, DRIVER_MODULE_ARG); wifi_set_module_status(WIFI_WAKEUP_CTL_FP, 0); usleep(10000); wifi_set_module_status(WIFI_REG_CTL_FP, 0); usleep(10000); wifi_set_module_status(WIFI_RESET_CTL_FP, 0); sleep(1); sync(); return -1; } if (strcmp(FIRMWARE_LOADER,"") == 0) { int wifi_unload_driver() { usleep(200000); /* allow to finish interface down */ #ifdef WIFI_DRIVER_MODULE_PATH if (rmmod(DRIVER_MODULE_NAME) == 0) { int count = 20; /* wait at most 10 seconds for completion */ while (count-- > 0) { if (!is_wifi_driver_loaded()) break; usleep(500000); } wifi_set_module_status(WIFI_WAKEUP_CTL_FP, 0); usleep(10000); wifi_set_module_status(WIFI_REG_CTL_FP, 0); usleep(10000); wifi_set_module_status(WIFI_RESET_CTL_FP, 0); sleep(1); sync(); usleep(500000); /* allow card removal */ if (count) { return 0; 

int wifi_set_module_status(char *ctl_fp, unsigned char status) { int fd, ret, nwr; char buf[10]; if((fd = open(ctl_fp, O_RDWR)) < 0) { LOGE("%s(%s) : Cannot access "%s"", __FILE__, __FUNCTION__, ctl_fp); return -1; // fd open fail } memset((void *)buf, 0x00, sizeof(buf)); if(status) nwr = sprintf(buf, "%dn", 1); else nwr = sprintf(buf, "%dn", 0); ret = write(fd, buf, nwr); close(fd); if(ret == nwr) { LOGI("%s : write success (on = %d)", ctl_fp, status); return 0; } else { LOGE("%s : write fail (on = %d)", ctl_fp, status); return -1; } } //---------------------------------------------------------------------------------------------------------------- int wifi_get_module_status(char *ctl_fp) { int fd, ret, nrd; char buf[10]; if((fd = open(ctl_fp, O_RDONLY)) < 0) { LOGE("%s(%s) : Cannot access "%s"", __FILE__, __FUNCTION__, ctl_fp); return -1; // fd open fail } memset((void *)buf, 0x00, sizeof(buf)); nrd = read(fd, buf, sizeof(buf)); close(fd); // read ok if(nrd) { if(!strncmp(buf, "1", 1)) { LOGI("%s : status == 1", ctl_fp); return 1; // wakeup } else { LOGI("%s : status == 0", ctl_fp); return 0; // suspend } } LOGI("%s(%s) : module status == unknown", __FILE__, __FUNCTION__); return -1; } //---------------------------------------------------------------------------------------------------------------- int wifi_module_wakeup_status() { int fd, ret, nrd; char buf[10]; if((fd = open(WIFI_WAKEUP_CTL_FP, O_RDONLY)) < 0) { LOGE("%s(%s) : Cannot access "%s"", __FILE__, __FUNCTION__, WIFI_WAKEUP_CTL_FP); return -1; // fd open fail } memset((void *)buf, 0x00, sizeof(buf)); nrd = read(fd, buf, sizeof(buf)); close(fd); // read ok if(nrd) { if(!strncmp(buf, "1", 1)) { LOGI("%s(%s) : module status == wakeup", __FILE__, __FUNCTION__); return 1; // wakeup } else { LOGI("%s(%s) : module status == suspend", __FILE__, __FUNCTION__); return 0; // suspend } } LOGI("%s(%s) : module status == unknown", __FILE__, __FUNCTION__); return -1; } //---------------------------------------------------------------------------------------------------------------- int wifi_module_wait_time(int waitTime) { LOGI("%s(%s) : module wait time = %d sec", __FILE__, __FUNCTION__, waitTime); sleep(waitTime); sync(); return 0; } 
You will have a new libhardware_legacy.so with above modification.
Please note, bcm4329.ko file should be regenerated with “make modules” command of kernel build and copied to ODROID.
6. Let’s start build the ICS
chmod u+x device/hardkerenl/odroid7/build_android.sh
device/hardkerenl/odroid7/build_android.sh
 

7. Install the Android system files and zImage and ramdisk-uboot.img as we do for Gingerbread installation.
http://dev.odroid.com/projects/odroid-t/Tested features
– LCD driver with 3D accelerator
– Capacitive touch screen
– Sound output
– Sound input (Microphone)
– USB ADB driver
– USB Host HID (Mouse/Keyboard)
– WiFi
– MFC driver for media player
– GPS driver
– Accelerometer sensor
– HOME key function
– Backlight Brightness control
– Battery Gauge / Charger driver

To do list
– Camera
– Bluetooth
– HDMI
– Geo Magnetic Field sensor
– NFC

Update!
Modified DPI for tablet mode (density=120)
Softkey enabled
Enabled Home screen rotation

 

 

 

 

 

Android PC with ARM cortex-A9 Dual-core !

What do you do with your personal computer(PC)?

We may do …….
– Internet Web browsing
– Email, SNS or Messenger
– Gaming
– Multimedia (Video & Music)
– Productivity
– Education
– And so on……

Yes, most of them are working well with any modern smartphone.
But if it has a large(>20inch) display, high-capacity HDD storage, we can call it a PC. Right?

Look at this picture! It looks like a PC. Yeah~~

 

Key feature of ODROID-PC.
– ARM Cortex-A9 Dual-core 1.2Ghz / Mali-400 GPU-MP 300Mhz
– SATA HDD interface
– Ethernet LAN port
– 4 high speed USB host
– HDMI (1280×720 Android UI)
– WiFi/Bluetooth
– 3Mpixel Camera
– Audio Codec with Microphone

Application of ODROID-PC
– Smart TV
– Set top Box
– Smart interactive Digital Signage
– High end video conferencing system
– High performance embedded Server
– Network attached Storage
– Media player
– Thin Client

Enjoy this video.

Contents of Video.
– Unboxing
– Hardware explanation
– Peripheral installation
– Android booting
– Multimedia test
– Camera test
– Ethernet setting
– N64 emulation with bluetooth Wii controller

Small embedded Linux root file system for ODROID-7/7E

ODROID-7에서 테스트된 리눅스 루트 파일 시스템입니다.
ODROID-E7에도 적용 가능합니다.
Auto-Login을 구현하여, SDL 및 간단한 어플까지 만들어 모두 자동으로 실행하는 실용적인 예제가 될것 같습니다.

How to make a Small embedded Linux root file !

I found a generic embedded root file system with EABI by Googling.
http://ftp.falinux.com/toolchain_ramdisk/recommendation/gcc-4.3.2/
At this moment, this link is broken.

To implement the auto login, I need to cross compile the mingetty in the Sourceforge.
http://sourceforge.net/projects/mingetty/
After compilation, the generated file must be copied in to /bin directory.

Add below line in to /etc/inittab for automatic login as a super user(root)

T0:12345:respawn:/bin/mingetty --autologin=root ttySAC2 115200 vt100

To test this root file system, I copied it to the system partition(mmcblk0p2) of Odroid-7.

And I changed bootargs as below.
For ODROID-7 (S5PC110/EXYNOS-3110)

setenv bootargs 'root=/dev/mmcblk0p2 rw rootfstype=ext4  init=/sbin/init console=ttySAC2,115200 rootdelay=1'
setevn bootcmd 'movi read kernel 30008000;bootm 30008000'
savenv

For ODROID-E7 (S5P6450 ARM11)

setenv bootargs 'root=/dev/mmcblk0p2 rw rootfstype=ext4  init=/sbin/init console=ttySAC2,115200 rootdelay=1'
setevn bootcmd 'movi read kernel E0008000;bootm E0008000'
savenv

To make a SDL and application software, I followed below sequence.

Toolchain
Sourcery G++ Lite 2010.09-50  (GNUEABI version)
https://sourcery.mentor.com/sgpp/portal/release1600
* Note: EABI version can’t compile SDL correctly. Must use the GNUEABI version.

SDL source code
http://www.libsdl.org/download-1.2.php
Source code location on host PC
/home/justin/sdl/SDL-1.2.14 (This is my working directory. It is just an example!)

Compile SDL

export CC=arm-none-linux-gnueabi-gcc
./configure --host=arm-none-linux-gnueabi --prefix=/home/justin/sdl/compiled --without-x
make -j 4
make install

* Note: Modify the SDL-1.2.14/src/video/fbcon/SDL_fbvideo.c
Comment out the mouse related code in FB_VideoInit() function.

Compile sdl test (Modify the SDL init function to 800×480 resolution and 32bit color, if the application uses graphic layer.)

./configure --host=arm-none-linux-gnueabi  --with-sdl-prefix=/home/justin/sdl/compiled --disable-sdltest
make -j 4

Compile Freetype
http://download.savannah.gnu.org/releases/freetype/freetype-2.1.10.tar.gz

./configure --host=arm-none-linux-gnueabi --without-zlib --prefix=/home/justin/sdl/compiled
make -j 4
make install

Compile SDL_ttf to display fonts.
http://www.libsdl.org/projects/SDL_ttf/SDL_ttf-2.0.10.tar.gz

./configure --host=arm-none-linux-gnueabi --prefix=/home/justin/sdl/compiled --with-freetype-prefix=/home/justin/sdl/compiled --with-sdl-prefix=/home/justin/sdl/compiled 

#undef HAVE_ICONV ==> showfont.c ( Modify this to avoid annoying error. But, this one should be fixed for proper display of 2-byte languages.)

make -j 4
make install

showfont executable file is generated in .lib directory.

SDL_ShowCursor(SDL_DISABLE);  //To hide the mouse cursor !!!

Download and Install font.
http://ftp.gnu.org/gnu/freefont/freefont-ttf-20100919.tar.gz
Uncompress and copy the fonts in to /usr/fonts/ directory.

Let’s test.

./showfont -i ../fonts/FreeSerif.ttf 30

To execute this application automatically, add below line in /root/.bashrc !!

/usr/bin/showfont -i /usr/fonts/FreeSerif.ttf 30

Finally we made a simple and useful root file system.
This is very light and fast embedded linux root file system.
Size is 35Mbyte approximately.
Get this root file system from
http://dev.odroid.com/projects/odroid-t/download/note/76

Reference.
http://www.crosscompile.org/static/pages/SDL.html

ODROID @ Embedded Technology 2011 in Japan

일본 최대 임베디드 전시회인 Embedded Technology 가 동경에서 전철로 약 1시간 거리의 Yokohama라는 지역에서 열리고 있습니다.

 

여기서는 줄여서 E.T. 라고 부르며, 공식 홈페이지는 아래 링크에 있습니다.
하드커널은 일본 지역 파트너인 Yokogawa Digital Computer (横河ディジタルコンピュータ株式会社)사와
함께 ODROID를 출품하였습니다. 중간 간판에 ODROID 로고가 보이나요?  ^.^

Partner Booth에 마련된 하드커널 코너입니다. 
S5P6450보드와 Android-Accessory 개발용ADK 솔루션을 주로 선보였습니다.

아래 사진은 6450보드(ODROID-E7)에 NFC 확장 보드를 탑재한 데모 입니다.
SENHRN1라는 삼성의 최신 NFC 칩을 장착, 안드로이드 플랫폼에 이식하였습니다.
Android 표준 NFC API를 지원합니다.
저 NFC 보드의 이름은 ODROID-NFC 입니다. ^.^

 

ARM의 공식 Multi-core 개발 솔루션인 DS-5 / DSTREAM의 데모에 ODROID-A가 사용되고 있네요.

좀더 가까이에서 DSTRAM 장비를 찍어보았습니다.

LUNA-advice라는 통합 디버거 장비에도 ODROID-A가 연결되어 있었습니다.
ODROID-A는 여러 곳에 사용되고 있어 뿌듯했습니다. ^.^
아래 사진에서는 사람들에 가려 안보이지만, 오른쪽 맨끝에 ODROID 소개 광고는 보이네요.

WindowsCE(지금은 Windows Embedded Compact라고 부릅니다) 관련 솔루션을 전시한 곳입니다.
요코가와 디지털사는 임베디드 개발에 관련된 것은 거의 모두 취급하는 백화점 같습니다.

마이크로소프트사의 부스 입니다. 임베디드에 특화된 다양한 플랫폼이 있었습니다.
POS/슬롯머신/관제장치/태블릿/교환기 등등 아직 MS는 건재합니다.
그런데 기대했던 Windows-8 정보는 전혀 없었습니다. ㅠㅠ

ARM 부스에는 Cortex-A9 Dual/Quad와 A15 Dual 과 각종 개발 장비/툴체인 외에도
Cortex-A5/A7 라는 비교적 저렴하게 만들수 있는 최신 Core들이 소개되었습니다.

Trace32를 만드는 Lauterbach사의 부스에서 발견한 것으로,
Dalvik / Java와 JNI 및 커널까지 함께 디버깅이 가능하다는 광고입니다.

Agilent사의 고속 시리얼 프로토콜 분석 장비로, USB 3.0/SATA/PCI 의 신호 품질을 측정할 수 있습니다.

이에 질수 없다고 하는 Lecroy 장비입니다.
제 개인적인 생각으로는 Lecroy의 장비들이 좀 더 편리해 보였습니다.

PC의 USB포트에 연결해서 사용하는 오실로스코프로 6채널까지 연동해서 사용할 수 있습니다.
Giga Sample이 가능해서 상당히 쓸모있어 보였습니다.

Core라는 회사에서 만든 Android기반의 NFC 솔루션입니다. 
Barcode reader까지 달려있어, POS같은 분야에 바로 적용이 가능해 보입니다.

 

 

NFC의 일종인 FeliCa 리더기 및 SDK를 소개하는 부스의 사진입니다.

Sophia System사의 NFC 개발 보드입니다. NXP칩 기반입니다.
안테나를 별도로 분리하고, NFC칩은 모듈로 올렸습니다.

ST Micro사의 MicroSD와 UUIC 인터페이스를 지원하는 특이한 FPCB 형태의 NFC 모듈입니다.

Microchip사의 ADK 개발키트 입니다.

 

Microchip사의 PIC24와 PIC32 시리즈의 인기도 많이 높았습니다. 여전히 MCU 분야의 강자입니다.

인텔 부스에도 사람들이 아주 많았습니다.
예상밖으로 Atom Dual-core와 i7 Quad-core가 임베디드 제품에 많이 사용되고 있습니다.
x86 기반의 보드들도 실제 산업현장에서 다양하게 적용되는것 같습니다.

인텔 프로세서가 탑재된 KIOSK 단말 로봇입니다. Triple screen이 인상 깊었습니다.

Qseven이라는 업체는 인텔/AMD/VIA/ARM 기반의 모든 임베디드 보드를 취급하는 재미있는 곳이었습니다.
x86뿐 아니라 ARM도 TI/Freescale/Tegra 다양하게 준비되어 있습니다.

소형 SATA SSD도 임베디드의 여러 분야에(안드로이드 단말기 등등) 적용되고 있습니다.
Compact Flash 카드 사이즈에 SATA 인터페이스는 CFast2라고 부르는것 같습니다.

Canon은 안드로이드와 차량 시스템 통신 솔루션을 구축해서 전시하고 있습니다.
LIN/CAN 인터페이스를 안드로이드에서 이용하더군요.

안드로이드 기기 양산이나 앱의 품질 관리에 사용할 수 있는 장비입니다.
Vision인식과 멀티터치용 로봇 손가락으로 기기를 테스트할 수 있습니다.

저전력 스마트 주변기기의 무선 통신은 ANT+와 블루투스 4.0 BLE가 주로 적용되고 있습니다.
아래는 ANT solution이며, 그 아래는 BLE 솔루션 데모 보드입니다.

DMP사의 3D 가속기 IP 데모이며, 실제 닌텐도 3DS에 탑재되었습니다.
Samurai OpenGL ES 데모를 돌리는데, FPS는 높게 나오는 편이었습니다.

PowerVR의 Imagination사도 다양한 3D 엔진의 로드맵을 선보였습니다.
삼성이 Mali를 당분간 사용하겠지만, 추후에는 PowerVR을 다시 기용한다는 기사가 나왔습니다. ^.^

Marvell은 PXA618이라는 ARMv7기반의 AP를 소개하고 있습니다. Full-HD 재생/녹화가 가능하다고 광고하네요.

 

TI 부스에도 재미있는것들이 많이 있습니다.

TI의 유명한 신상품 개뼈다귀(BeagleBone) 보드입니다. 아두이노랑 비슷한 크기이며, Cortex-A8 기반입니다.

PandaBoard 에 Android 4.0 ICS를 올려서 시연하고 있네요.

ST 사는 Cortex M4기반의 MCU와 Cortex-A9 Dual-core 기반의 SPEAr 시리즈를 선보였습니다.

NXT는 Cortex-M3/M4 기반의 MCU를 소개하고 있으며, mbed라는 재미있는 보드가 있었습니다.
Cloud기반의 개발 환경으로 펌웨어 소스부터 컴파일까지 모두 Cloud server에서 작업을 합니다.
따라서 100% Open source이더군요. Local에서는 작업할 수가 없습니다. ^.^
기회가 생기면 mbed를 한번 만져보고 싶더군요.

 

Fujitsu 부스에도 다양한 MCU를 소개하고 있으며, 자체 코어와 Cortex-M이 서로 경쟁하는 모습입니다.

 

하나 재미있는것은 Fujitsu MCU기반의 ADK가 있었는데, 가격이 ODROID-ADK에 비해 15배가 넘었습니다.

Fujitsu도 Fab을 제공하는데, Cortex-A9 Dual + Cortex-M3 + Cortex-R4F 등등 완전 짬뽕 솔루션이 있었습니다.

FPGA의 양대 산맥인 ALTERA와 XILIX스 부스는 Cortex-A9 processor가 내장된 FPGA 솔루션을 함께 선보였습니다.

Panasonic은 Embedded S/W solution을 전시하고 있습니다.
특히 3D Smart-TV 및 Multimedia 부분이 눈에 들어오더군요.

Toshiba는 산업 현장에서 선호하는 5Volt용 Cortex-M3 MCU가 많았습니다.
공조장치나 냉장고 등에는 아직도 5Volt 사용 MCU가 사용된다고 합니다.

마지막으로 Renesas 부스입니다. NEC와 Hitachi가 합쳐진 거대 반도체 회사입니다.

R-Mobile A1이라는 AP는 Cortex-A9 싱글 코어지만, SH4라는 강력한 프로세서가 하나 더 들어있습니다.

내부 블럭도를 자세히 한번 보세요.

개발 플랫폼 보드이며, 일본의 유명한 At-Mark사 제품으로 가격은 약 150만원 정도 합니다.

LTE 모뎀 솔루션으로 Triple mode를 지원합니다. 가장 군침나는 제품이었습니다.

이상으로 일본 임베디드 전시회 참관/참여기를 마무리 합니다.
긴 글 읽어주셔서 감사합니다.

Bluetooth 4.0

Bluetooth 4.0은 최신 iPhone 4S에 탑재되었으며, 이를 기폭제로 내년에는 좀 더 많은 기기에 적용될것 같습니다.

우선 블루투스 버전별 특징을 알아보고, 미래를 준비해 보죠.

Bluetooth v2.0 + EDR

기존의 최고 전송 속도였던 721kbit/s를  3Mbit/s로 끌어 올렸습니다.

실제 전송 가능한 속도는 2.1 Mbit/s입니다.

Bluetooth v2.1 + EDR

v2.0과의 가장 눈에띄는 차이는 손쉬운 Paring이 가능하도록 SSP(secure simple pairing) 기능이 추가되었는 것입니다. 

그 외에 커넥션시 필터링이 쉽도록 EIR(Extended inquiry response)이 강화되고, low power 모드에서 소비전류를 줄이는 기능이 추가되었습니다.

현재까지 출시된 모든 오드로이드는 이 버전입니다.

Bluetooth v3.0 + HS

여기서 부터는 비교적 최근에 나온 갤럭시 S2나 동급 폰에서 제대로 지원하기 시작하였습니다.

Bluetooth 3.0+HS는 이론적으로 24 Mbit/s 이라는 엄청난 속도를 제공합니다.

그런데 Bluetooth link는 접속에만 관여하고, 실제 고속 데이터 통신은 802.11 WiFi쪽에 추가된 AMP(Alternate MAC/PHY)를 이용합니다.

+HS는 3.0의 필수 스펙은 아닙니다만, 요즘 나오는 기기들은 대부분 +HS가 붙어 있는것으로 보아 AMP를 이용한 고속 전송이 가능한것 같습니다.

Unicast connectionless data
L2CAP 채널대신에 소량의 데이터 전송 가능케하여 사용자의 동작과 재접속/데이터 전송 사이 틈틈이 보낼수 있습니다.

Enhanced Power Control
Open loop 전력 제어를 없애고, RSSI filter를 이용한 Close loop 전력 제어를 추가하며, 새로운 변조(Modulation)을 EDR에 추가하여 합리적인 전력 관리가 가능합니다. 

Bluetooth v4.0

Bluetooth low energy(BLE)라는 새로운 프로토콜이 추가되었습니다.

ZigBee나 ANT+같은 저전력 RF 솔루션과 경쟁하기 위한것입니다.

동전형 전지로 몇년을 지속할 수 있는 주변기기가 주요 타겟입니다. 따라서 속도는 상대적으로 많이 느립니다.

기존 프로토콜과는 전혀 호환이 안되면, 아주 단순한 연결 구조로 완전히 새로운 프로토콜 스택입니다.

BLE만 지원되는 칩은 Single mode라고 부르며, 기존(Classic) 블루투스와 함께 들어있는 칩은 Dual-mode라 부릅니다.

스마트 단말기는 Dual-mode 솔루션이 탑재되고, 심장 박동 검사기 같은 주변 기기는 Single mode 솔루션이 탑재됩니다.

최신 상용 단말기에 탑재되는 Broadcom사의 BCM4330칩은 Dual-mode 솔루션 입니다.
따라서 내년에 나올 Android (Jelly Bean)에는 Bluetooth 4.0 Bluetooth Low energy 관련 프레임웍이 추가될 가능성이 높아 보입니다.
이에 대한 몇몇 근거를 나열해 보겠습니다.

어떤 형태가 될지는 iOS5의 BLE관련 API를 보시면 예상되는 그림이 있을것 같습니다.
현재 안드로이드는 RFCOMM기반의 단순하면서도 확장 가능한 구조인데, 애플도 비슷하게 최소한의 Profile인 ATT(Attribute)만 지원하고 있습니다.
https://developer.apple.com/library/ios/#documentation/CoreBluetooth/Reference/CoreBluetooth_Framework/_index.html

좀 더 흥미로운것은 Linux Kernel 3.1에 들아가는 최신 BlueZ에 BLE protocol이 추가되었다는 것입니다.
http://www.bluez.org/
따라서 다음 버전의 안드로이드(Jelly Bean)에서 BLE를 지원할 확률이 높아보입니다.
이는 결국 새로운 개념의 ADK와 Open Accessory를 내년 Google I/O에 발표할 가능성을 점치게 하네요.

몇일 동안 틈틈이 알아본 BLE 정보를 공유합니다만, 후반부의 예측은 억측이 될수도 있겠습니다. ㅎㅎㅎ
그래도 하드커널은 BLE 솔루션을 준비해야 겠죠?

Hardkernel Workshop

We have workshop on Thursday(20th) and Friday(21st). Please understand whether we do not answer the phone and not reply the mail.

[Korean] 저희가 목요일과 금요일 워크샵을 갑니다. 전화를 받지 않고 메일에 회신을 못해 드리더라도 이해해 주십시오.  

ODROID @ KES

KES (Korea Electronic Show) has started yesterday. We have revealed our new products.

Our booth #1776

 

 

 

 

 

 

 

ODROID-E4
– ARM11 800MHz S5P6450
– 4inch multi touch Display
– Android / WinCE
– Available in November 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ODROID-PC
– ARM Cortex-A9 Dual Core Exynos4210
– 10/100 Mbps Ethernet
– 4Port USB Host
– Available in November 

 

 

 

 

 

 

 

AD Pannel using ODROID-PC
42inch IR type Multi Touch

 

 

 

 

 

 

 

ODROID-ADK
Added a Printer

 

 

 

 

 

 

 

There will be official update of our new products soon~~~