8/24/2014

IPTIME n150ua Android WIFI HAL 기본설정

나의 장난감 ODROID위에 IPTIME n150ua의 기본 Linux Driver를  Porting 한 후 에기본적인 TEST가 진행된 후에 이일을 진행해야한다.

아래와 같이 Android의 HAL Interface의 설정을 수정해주면 Android에서도 문제없이 WIFI를 사용 할 수 있다. 
현재 이 부분은 기본적인 TEST를 마친 상황이다.

Odroid에서 IPTIME n150ua Porting 
  https://ahyuo79.blogspot.com/2014/08/android.html
Odroid  WIFI 관련 설정 및 테스트
  https://ahyuo79.blogspot.com/2014/03/dlna-upnp.html

  • vi device/hardkernel/odroidx2/BoardConfig.mk
새로 WIFI_DRIVER_MODULE를 추가하여 아래와 같이 넣어 모듈형태로 넣음 
BOARD_WIFI_VENDOR       := realtek
BOARD_WLAN_DEVICE       := rtl819xxu

WPA_SUPPLICANT_VERSION              := VER_0_8_X
BOARD_WPA_SUPPLICANT_DRIVER         := WEXT
BOARD_WPA_SUPPLICANT_PRIVATE_LIB    := lib_driver_cmd_rtl
WIFI_DRIVER_MODULE_NAME                 := "rtl8191su"
WIFI_DRIVER_MODULE_PATH             := "/system/lib/modules/rtl8191su.ko"
WIFI_DRIVER_MODULE_NAME2                := "rtl8192cu"
WIFI_DRIVER_MODULE_PATH2            := "/system/lib/modules/rtl8192cu.ko"
WIFI_DRIVER_MODULE_NAME3                    := "rt5370sta"
WIFI_DRIVER_MODULE_PATH3            := "/system/lib/modules/rt5370sta.ko"
WIFI_DRIVER_MODULE_NAME4                := "rt3070sta"
WIFI_DRIVER_MODULE_PATH4            := "/system/lib/modules/rt3070sta.ko" 

  • vi hardware/libhardware_legacy/wifi/wifi.c  
추가된 WIFI 모듈을 Load하기 위해서 HAL를 수정 
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 */

        char node[50] = {'\0',};
    char buf[5] = {'\0',};
        DIR *dir = opendir("/sys/bus/usb/devices/");
        struct dirent *dent;
        if (dir != NULL) {
                while ((dent = readdir(dir)) != NULL) {
            memset(node, '\0', 50);
                        sprintf(node, "/sys/bus/usb/devices/%s/idVendor", dent->d_name);
                        int vid_fd = open(node, O_RDONLY);
            memset(buf, '\0', 5);
            .... 

                                                } else if (strcmp(buf, "3070") == 0) { 
                                                        ALOGE("rt3070 Wi-Fi Module 4");
                                                        //wifi module 4 rt3070
                                                        strcpy(DRIVER_MODULE_NAME, WIFI_DRIVER_MODULE_NAME4);
                                                        strcpy(DRIVER_MODULE_TAG, WIFI_DRIVER_MODULE_NAME4 " ");
                                                        strcpy(DRIVER_MODULE_PATH, WIFI_DRIVER_MODULE_PATH4);
                                                        close(pid_fd);
                                                        close(vid_fd);
                                                        break;
                                                 }

  • vi hardware/libhardware_legacy/wifi/Android.mk
Build할 경우 동일하게 설정 
ifdef WIFI_DRIVER_MODULE_PATH
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_PATH=\"$(WIFI_DRIVER_MODULE_PATH)\"
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_PATH2=\"$(WIFI_DRIVER_MODULE_PATH2)\"
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_PATH3=\"$(WIFI_DRIVER_MODULE_PATH3)\"
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_PATH4=\"$(WIFI_DRIVER_MODULE_PATH4)\"
endif
...
ifdef WIFI_DRIVER_MODULE_NAME
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_NAME=\"$(WIFI_DRIVER_MODULE_NAME)\"
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_NAME2=\"$(WIFI_DRIVER_MODULE_NAME2)\"
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_NAME3=\"$(WIFI_DRIVER_MODULE_NAME3)\"
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_NAME4=\"$(WIFI_DRIVER_MODULE_NAME4)\"
endif


  • vi ./device/hardkernel/odroidx2/conf/init.odroidx2.rc
HAL 공유 Library만 변경
                libhardware_legacy.so

out/target/product/odroidx2/obj/SHARED_LIBRARIES/libhardware_legacy_intermediates/wifi/wifi.o


./out/target/product/odroidx2/root/init.odroidx2.rc
./out/target/product/odroidx2/system/init.odroidx2.rc

cp rt3070sta.ko  to  device/hardkernel/odroidx2/drivers/

8/23/2014

IPTIMEn150ua on ODROID (기본동작확인)

1. IPTIME n150ua Porting


1.1 개요

ODROID X2 보드 위에 다른 USB LAN을 사용하기 위해서 남은 USB LAN을 집에서 찾기 시작했지만,
내집에서는 찾지를 못하고 때마침 대전 집에서 우연히 발견된 IPTIME n150ua을 가지고 이를 시작하게됨.

  • 모델명: IPTIME n150ua
  • USB device로 동작이되는 WLAN Card 

우선 IPTIME n150ua 사의 이 칩명이 알아야 할 것 같아  아래와 같이 IPTIME 사이트에서 질문을 했더니  정확한 칩명과 관련 Driver를 제공을 해주셨다.
집에서 심심해서 우연히 시작한일인데, 정보를 제공해주신 IPTIME에 감사할 뿐이다,


1.2  IPTIME n150ua 정보 및 관련 사이트 
  1. 모델명:  RT3070  
  2. Device Driver : 2011_0107_RT3070.tar

  • IPTIME 사용되는 CHIP이름알기 
IPTIME에 아래와 같이 직접 물어보았더니, 친절하게 답변을 해주셨다.
감사할 뿐이다. 그래서 위와 같이 Linux Driver를 구하고 이 일을 시작하게됨      

오랜만에 다시 링크하니, 내가 질문한 것이 없어져서, 다른 것으로 대체, 
  http://www.iptime.co.kr/~iptime/bbs/view.php?id=qna&no=292133


  • 기능설명, WPS란?
  http://iptime.co.kr/bbs/view.php?id=faq_setup&no=266

  • Download Linux Driver
  http://www.mediatek.com/en/downloads/


2. WLAN Linux Driver 구성 


2.1 기본숙지문서

  • README_STA_usb
  • iwpriv_usage.txt 

  Driver Build 방법 및 Test 하는 방법은 인터넷 및 책에  설명이 너무 잘 나와있다
  Linux Driver의 상위 두 문서를 제대로 읽는다면, 기본 Build 및 Test 진행에 어려움이 없다.

   1.  Build  사항 및  How to install
   2.  RT2870STA.dat 설정 파일 설명


2.2 Makefile 기본구성  


Makefile                               // Main 구성 (PLATFORM 설정 및 기본 TEST)
       ./os/linux/config.mk            // 각 설정
       ./os/linux/Makefile.4 or 6      // kernel version 에 따라 설정되며, 실제 빌드

  
3. WLAN Linux Driver 환경설정 및 빌드 

수정은 아래와 같이 순서대로 하고 빌드는 make를 하면 원하는 모듈을 얻을 수 있을 것이다.
  • rt3070sta.ko

3.1 Makefile 수정

아래의 변수 PLATFORMTARGET PLATFORM은 기존의 것을 가지고 수정하여 만들면된다.
어차피 Linux Kernel source path 문제로 인하여 아래와 같이 수정해야한다.
PLATFORM을 새로 만들어서 하면, 이상하게도 내 환경변수들이 제대로 설정이 안되어서,
기존 에 존재하던 것을 수정하여 Build를 시도.
  • PLATFORM : 5VT로 선정하여 수정
  • LINUX_SRCCROSS_COMPILE  환경설정 

ifeq ($(PLATFORM),5VT)
LINUX_SRC = /home/jhlee/mywork/kernel/linux
CROSS_COMPILE = arm-none-eabi-
endif

LINUX:                                         // TARGET LINUX에서  변수 TEST  
        echo ">>> PLATFORM  $(PLATFORM)"       // 각종 변수 TEST 
        echo ">>> TEST_INC  $(TEST_INC)"
        echo ">>> LINUX_SRC  $(LINUX_SRC)"
        ....  
        echo " TEST my plaform LINUX_SRC=$(LINUX_SRC) CROSS_COMPILE=$(CROSS_COMPILE) ARCH=$(ARCH)  "  // 변수 TEST , 처음에 제대로 안들어옴
        $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules


3.2 vi os/linux/config.mk  수정

    WPA_SUPPLICANT 기능 지원을 위해 아래와 같은 기능을 추가.
    (주의: HAS_WPA_SUPPLICANT=y 바로 옆에 주석을 달았더니, 환경변수가 미설정됨)

    # Support Wpa_Supplicant
    HAS_WPA_SUPPLICANT=y                              
    
    # Support Native WpaSupplicant for Network Maganger
    HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y  
    
    ifeq ($(PLATFORM),5VT)
    EXTRA_CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common   -DMODULE $(WFLAGS)
    endif


    3.3 vi os/linux/usb_main_dev.c 수정

      #include "rt_config.h"
      
      ......
      MODULE_AUTHOR("Paul Lin ");
      MODULE_DESCRIPTION("RT2870 Wireless Lan Linux Driver");
      MODULE_LICENSE("GPL");

      참조사항 
        http://www.linuxforums.org/forum/wireless-internet/161550-rt3070sta-module-license-unspecified-taints-kernel-solved.html

      참고사항  A. 
                    
                    CFLAG를 사용할 경우 에러,  CFLAGS -> EXTRA_CFLAGS 변경해줌

      scripts/Makefile.build:49: *** CFLAGS was changed in "/home/jhlee/mywork/2011_0107_RT3070_RT3370_Linux_STA_v2.5.0.1_DPO/os/linux/Makefile". Fix it to use EXTRA_CFLAGS.  Stop.
      

      참고사항 B.

                    WLAGS 값이 제대로 동작이 안되어 이를 Debugging.
      • vi os/linux/Makefile.6   (맨 아래에 추가, 각 변수확인 후 지움)

      %.o:
              echo "WLAGS=$(WLAGS)"
              echo "EXTRA_CFLAGS=$(EXTRA_CFLAGS)"

      참고사항 C.

                        아래와 같이  insmod시 에러시 MODULE_LICESE("GPL") 추가

      # insmod  /lib/modules/rt3070sta.ko                            
      [ 2152.229076] rt3070sta: Unknown symbol usb_alloc_urb (err 0)
      [ 2152.229239] rt3070sta: Unknown symbol usb_free_urb (err 0)
      [ 2152.234685] rt3070sta: Unknown symbol usb_alloc_coherent (err 0)
      [ 2152.240690] rt3070sta: Unknown symbol usb_register_driver (err 0)
      [ 2152.246849] rt3070sta: Unknown symbol usb_put_dev (err 0)
      [ 2152.252033] rt3070sta: Unknown symbol usb_get_dev (err 0)
      [ 2152.257417] rt3070sta: Unknown symbol usb_submit_urb (err 0)
      [ 2152.263094] rt3070sta: Unknown symbol usb_free_coherent (err 0)
      [ 2152.269011] rt3070sta: Unknown symbol usb_control_msg (err 0)
      [ 2152.274745] rt3070sta: Unknown symbol usb_deregister (err 0)
      [ 2152.280535] rt3070sta: Unknown symbol usb_kill_urb (err 0)


      3.4 Android 관련수정 

      Android 수정관련사항 
       http://ac100.wikispaces.com/Android+rt3070+or+rt2x00


      4. 기본 TEST on the ODROID

      RT3070이 기본이 STA로 설정이 되어있게 되어있어서, 기본 네트워크 동작을 확인을 했으며, AP는 설명했지만 Test를 하지 못했다.

      RT2870STA.dat 파일을 Loading 하는 시점은 ifconfig ra0 up 이다.그리고, 이와 관련된 설정은 iwpriv로 변경이 가능하다.
      WPS설정 iwpriv에서 command 형식으로 지원을 하는데, 이부분도 Test 못함.
      급히 다른 회사일 때문에 모든것을 마무리 했으며, 추후에 더 시간이 있다면 그때 하도록하자. 

      4.1 copy rt3070sta.ko to odroid

      on serial or adb shell
       # su
       # mount -o rw,remount -t ext4 /dev/block/mmcblk0p2 /system
       # mount -o rw,remount -t ext4 /dev/root / 

      Send the driver & data to the device on Window
      Y:\WORKS\LINUX\SHARED> adb push rt3070sta.ko     /system/lib/modules
      Y:\WORKS\LINUX\SHARED> adb push RT2870STA.dat /etc/Wireless/RT2870STA


      4.2  USB 연결확인 및 기본설정확인. 

      on serial or adb shell
      root@odroidx2:/etc/Wireless/RT3070STA # lsusb      // 연결확인                                 
      Bus 001 Device 001: ID 1d6b:0002
      Bus 002 Device 001: ID 1d6b:0001
      Bus 001 Device 002: ID 0424:3503
      Bus 001 Device 003: ID 0424:9514
      Bus 001 Device 004: ID 0424:ec00
      Bus 001 Device 006: ID 148f:3070
      
      # vi RT2870STA.dat 
      AuthMode OPEN ->WPA2
      
      # cat /data/misc/wifi/wpa_supplicant.conf  
      ctrl_interface=/data/misc/wifi/sockets
      update_config=1
      device_name=odroidx2
      manufacturer=HARDKERNEL Co., Ltd.
      model_name=ODROID-X2
      model_number=ODROID-X2
      serial_number=
      device_type=10-0050F204-5
      config_methods=physical_display virtual_push_button
      
      network={
              ssid="CWPW"
              key_mgmt=NONE
              priority=1
      }
      
      network={
              ssid="U+Net6AFB"
              psk="5000050330"
              key_mgmt=WPA-PSK
              priority=2
      }
      

      4.3  connect to AP with wpa_suppicant  

      on serial or adb shell
      # su
      # insmod  /lib/modules/rt3070sta.ko
      # ifconfig ra0 up
      
      # wpa_supplicant -Dwext -ira0 -c/data/misc/wifi/wpa_supplicant.conf -dd &
      # wpa_cli -p/data/misc/wifi/sockets   -ira0
      .....
      Interactive mode
      
      > scan
      OK
      > scan_result
      bssid / frequency / signal level / flags / ssid
      00:40:5a:9c:6a:f8 2422 -51 [WPA-PSK-TKIP][ESS] 
      00:40:5a:9c:6a:fa 2422 -55 [WPA2-EAP-CCMP][ESS] U+zone
      00:40:5a:9c:6a:f9 2422 -55 [WPA2-PSK-CCMP][ESS] U+Net6AFB
      00:26:66:a0:35:ba 2432 -73 [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS] iptime89
      6c:fd:b9:30:ba:82 2457 -69 [WEP][ESS] SAMSUNG
      00:24:a5:34:2f:b3 2462 -81 [WPS][ESS] 0024A5342FB3
      
      > list_network                     // wpa_supplicant.conf 의 list 
      network id / ssid / bssid / flags
      0 CWPW any 
      1 U+Net6AFB any [CURRENT]
      
      
      > select_network 1                //  list 중 선택 
      OK
      > add_network                        //  아래와 같이 WPA-PSK로 추가 가능 
      2
      > set_network 2 ssid "U+NetE3CD"  
      OK
      > set_network 2 key_mgmt WPA-PSK
      OK
      > set_network 2 psk "1122333353"     //
      OK
      > select_network 1                   // 추가했으나, 기존것으로 연결
      OK
      > status 
      bssid=00:40:5a:9c:6a:f9
      ssid=U+Net6AFB
      id=1
      mode=station
      pairwise_cipher=CCMP
      group_cipher=CCMP
      key_mgmt=WPA2-PSK
      wpa_state=COMPLETED
      address=00:26:66:41:26:12 

      관련사항
        http://sirlagz.net/2012/08/27/how-to-use-wpa_cli-to-connect-to-a-wireless-network/
        http://lists.shmoo.com/pipermail/hostap/2009-December/020817.html


      4.4 connect to AP without wpa_suppicant  

      # ifconfig ra0 up
      # iwconfig ra0 essid "U+NetE3CD"       //  iwpriv ra0 set SSID="U+NetE3CD" 동일
      # iwpriv ra0 set AuthMode=WPA2PSK  .
      # iwpriv ra0 set EncrypType=AES
      # iwpriv ra0 set WPAPSK="1000003353"
      
      # iwconfig ra0   // 확인
      ra0       Ralink STA  ESSID:"U+NetE3CD"  Nickname:"RT2870STA"
                Mode:Managed  Frequency=2.412 GHz  Access Point: 00:27:1C:CC:E3:CB 
                Bit Rate=135 Mb/s 
                RTS thr:off   Fragment thr:off
                Encryption key:533A-C4F7-1FC2-8647-DE03-0301-329D-606C [2]   Security mode:open
                Link Quality=100/100  Signal level:-29 dBm  Noise level:-32 dBm
                Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
                Tx excessive retries:0  Invalid misc:0   Missed beacon:
      
      # dhcpcd -n ra0
      dhcpcd[3816]: sending signal 14 to pid 3736
      dhcpcd[3816]: version 5.5.6 starting
      dhcpcd[3816]: ra0: sending IPv6 Router Solicitation
      dhcpcd[3816]: ra0: rebinding lease of 192.168.219.109
      dhcpcd[3816]: ra0: acknowledged 192.168.219.109 from 192.168.219.1
      dhcpcd[3816]: ra0: checking for 192.168.219.109
      dhcpcd[3816]: ra0: sending IPv6 Router Solicitation
      dhcpcd[3816]: ra0: leased 192.168.219.109 for 86400 seconds
      dhcpcd[3816]: forked to background, child pid 3850
      
      # ping 192.168.219.1
      64 bytes from 192.168.219.1: icmp_seq=1 ttl=64 time=8.91 ms
      64 bytes from 192.168.219.1: icmp_seq=2 ttl=64 time=1.93 ms
      64 bytes from 192.168.219.1: icmp_seq=3 ttl=64 time=1.92 ms
      


      4.5  관련 기타사항 기록  

      dhcpd Manual 
       http://www.daemon-systems.org/man/dhcpcd.8.html
       # iwpriv ra0 set EthConvertMode=clone
       # iwpriv ra0 set EthCloneMac="00:00:00:00:00:00"
       AuthMode=OPEN  -> WPA2

      Odroid 관련이슈 
       https://code.google.com/p/0xdroid/issues/detail?id=160

      # cat /proc/net/dev                                         
      Inter-|   Receive                                                |  Transmit
       face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
          lo:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
        sit0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
      ip6tnl0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
        eth0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
         ra0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
      
      
      
       # cat /proc/net/wireless                                     
      Inter-| sta-|   Quality        |   Discarded packets               | Missed | WE
       face | tus | link level noise |  nwid  crypt   frag  retry   misc | beacon | 22
         ra0: 0000   10.  -256   -256        0      0      0      0      0        0
      
      root@odroidx2:/ # netcfg
      lo       UP                                   127.0.0.1/8   0x00000049 00:00:00:00:00:00
      sit0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
      ip6tnl0  DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
      eth0     UP                                     0.0.0.0/0   0x00001003 1a:35:8f:c5:6e:b0
      ra0      UP                                     0.0.0.0/0   0x00001043 00:26:66:41:26:12
      
      
      
      255|root@odroidx2:/ # ifconfig ra0 up                                         
      [ 5851.355400] (Efuse for 3062/3562/3572) Size=0x2d [2d0-2fc]
      [ 5851.867774] -->RTUSBVenderReset
      [ 5851.868026] <--rtusbvenderreset p="">[ 5852.410959] RtmpOSFileOpen(): Error 2 opening /etc/Wireless/RT2870STA/RT2870STA.dat
      [ 5852.412997] Open file "/etc/Wireless/RT2870STA/RT2870STA.dat" failed!
      [ 5852.419480] 1. Phy Mode = 0
      [ 5852.422330] ERROR!!! RTMPReadParametersHook failed, Status[=0x00000001]
      [ 5852.486133] !!! rt28xx Initialized fail !!!
      error: SIOCSIFFLAGS (Operation not permitted)

      관련사항
        http://forum.samygo.tv/viewtopic.php?f=4&t=3979
        http://www.korenixembedded.com/images/support/faq/JetBox_UM_Sparklan%20WPER-150GN%20wifi_v0.0.1.pdf
        https://forums.gentoo.org/viewtopic-p-7290276.html
        http://rhdxmr.tistory.com/48


      8/16/2014

      ODROID UBOOT 와 BOOT PART 관련부분링크

      Uboot Build
        http://linux-exynos.org/wiki/ODROID/u-boot

      Uboot 소스
        https://github.com/hardkernel/u-boot/tree/odroid-v2010.12

      How to write zImage via dd command. (fastboot 참고)
        http://codewalkerster.blogspot.kr/2014/03/how-to-write-zimage-via-dd-command.html

      DD 명령어로 Image Backup
        http://major.io/2010/12/14/mounting-a-raw-partition-file-made-with-dd-or-dd_rescue-in-linux/

      BL2/BL1 정보 (Bootloader1/2)
        http://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=odroidx&bid=3944

      Uboot Build 및 Toolchain
        https://wiki.odroid.com/old_product/odroid-x_u_q/odroid_u3/u3_building_u-boot



      DD 명령어
        http://forum.falinux.com/zbxe/index.php?document_srl=561988&mid=lecture_tip
        https://en.wikipedia.org/wiki/Dd_(Unix)
        https://linoxide.com/linux-command/linux-dd-command-create-1gb-file/


      • ODROID-U3 Partition Table 구성 
        https://wiki.odroid.com/old_product/odroid-x_u_q/odroid_u3/u3_partition_table

      • Partition 관련설정부분 
      관련소스
        https://github.com/hardkernel/u-boot/blob/odroid-v2010.12/arch/arm/include/asm/arch-exynos/movi_partition.h

      $ vi arch/arm/include/asm/arch-exynos/movi_partition.h
      #define PART_SIZE_FWBL1      (15 * 1024)
      #define PART_SIZE_BL1           (16 * 1024)
      #define PART_SIZE_UBOOT     (1024 * 1024)
      #define PART_SIZE_TZSW       (156 * 1024)
      #define PART_SIZE_KERNEL    (8 * 1024 * 1024)
      #define PART_SIZE_ROOTFS   (24 * 1024 * 1024)

      SD Card Fusing Shell Script 
        https://github.com/hardkernel/u-boot/tree/odroid-v2010.12/sd_fuse
        https://github.com/hardkernel/u-boot/blob/odroid-v2010.12/sd_fuse/sd_fusing.sh

      • dd를 이용하여 직접 Image 구성방법

      //각 binary file을 mmcblk0에 직접 write  
      $ dd if=sd_fuse/bl1.HardKernel of=/dev/mmcblk0 seek=1   //seek= 1x512 bytes (default 512byte) 
      $ dd if=sd_fuse/bl2.HardKernel of=/dev/mmcblk0 seek=31  //seek= 31x512 bytes (default 512byte) 
      $ dd if=u-boot.bin of=/dev/mmcblk0 seek=63
      $ dd if=sd_fuse/tzsw.HardKernel of=/dev/mmcblk0 seek=2111
      
      $ dd conv=notrunc seek=2455 bs=512 if=zImage of=/dev/block/mmcblk0
      
      $ dd if=zImage of=/dev/mmcblk0 seek=1 //seek= 1x512 bytes (default 512byte) 
      $ dd if= of=/dev/mmcblk0 seek=31
      $ dd if=u-boot.bin of=/dev/mmcblk0 seek=63
      $ dd if=sd_fuse/tzsw.HardKernel of=/dev/mmcblk0 seek=2111
      
      $ fdisk -l /media/sf_SHARED/images/sd_self_installer.img
      
      Disk /media/sf_SHARED/images/sd_self_installer.img: 524 MB, 524288000 bytes
      
      189 heads, 61 sectors/track, 88 cylinders, total 1024000 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: 0x00008403
      
      
      
                                              Device Boot      Start         End      Blocks   Id  System
      
      /media/sf_SHARED/images/sd_self_installer.img1          204800     1023999      409600    b  W95 FAT32
      
      $ mount -o loop,offset=104857600 /media/sf_SHARED/images/sd_self_installer.img        //204800 x512 = 104857600   

      8/06/2014

      ODROID Android- BUILD2

      1. 개발환경설정 

      repo 설치
        https://ahyuo79.blogspot.com/search/label/SCM-Repo

      $ vi .bash_profile  or .bashrc // 매번 export로 설정하기 귀찮아서 직접설정
      ARCH=arm 
      CROSS_COMPILE=arm-none-eabi- 


      2. Build Android

      Android Source Build 와 fastboot를 이용하여 Image 굽기 

      download site
        http://dn.odroid.com/

      $ repo init -u https://github.com/hardkernel/android.git -b 4412_4.4.4_master
      Your Name  [xxxx]:        // 이름 확인
      Your Email [xxxxx]:       // E-Mail 확인
      Your identity is: xxxxxxxxxxxxx // 이름과 E-Mail 확인
      is this correct [y/N]? y
      repo has been initialized in /home/xxxxxxx     // 초기화 된후 .repo 생성 
      
      $ repo sync -j 16
      $ repo start 4412_4.4.4_master --all
      

      2.1 Setting 및 Build

      $ cd android
      $ vi device/hardkernel/odroidx2/BoardConfig.mk   // 최신소스 수정필요없음 (아래항목없음)
           BOARD_USES_EMMC = true -> Use eMMC        
           BOARD_USES_EMMC = false -> Use SD Card
      $ chmod u+x ./build_android.sh
      
      $ ./build_android.sh odroidx2     // Build 


      Ref.
        http://dev.odroid.com/projects/howtobuild4


      2.2 Fastboot Flash Image

      • Host 에서 Android Flash 방법 
      fastboot를 이용하여 flash 진행 
      #fastboot flash system system.img   //fastboot flash  partition 이름  file 이름 
      #fastboot flash userdata userdata.img       
      #fastboot flash cache cache.img
      #fastboot reboot 

      Google Fastboot 사용법
        https://source.android.com/setup/build/running
        https://blog.dasomoli.org/381/

      Android Partition Table
        https://android.stackexchange.com/questions/5232/how-can-i-view-the-android-internal-partition-table

      • 참고사항 A
      각 Makefile 및 drivers 체크

      $ ls device/hardkernel/odroidx2/BoardConfig.mk             // Board 관련된 정보 확인.
      $ ls device/hardkernel/odroidx2/drivers/                   // X2 kernel module 위치확인

      • 참고사항 B
      Sun JDK 사용시에는 문제가 없었는데, OpenJDK 사용하니 문제가 발생해서 , 다시변경 .
      ============================================
      Checking build tools versions...
      ************************************************************
      You are attempting to build with an unsupported JDK.
      
      
      You use OpenJDK but only Sun/Oracle JDK is supported.
      Please follow the machine setup instructions at
          https://source.android.com/source/download.html
      ************************************************************
      


      2. Download & Build  Linux Kernel

      ODROID 의 Linux Kernel Download 및 Build 후 Image write 

      $ git clone https://github.com/hardkernel/linux.git -b odroid-3.0.y-android
      $ cd linux
      $ ls arch/arm/configs/odroidx2*                         // 확인후 설정
      $ make  odroidx2_android_442_defconfig   
      $ make zImage   or make                                // make는 moudles도 함께,           
      $ ls arch/arm/boot/
      $ make modules -j4      
      $ make modules_install  INSTALL_MOD_PATH=~/tmp          // 임시설정, 위의 Android에 복사


      2.1 Flash Image

      # fastboot flash kernel arch/arm/boot/zIamge
      # fastboot reboot


      3. Download & Build  Uboot

      ODROID 의 Uboot Download 및 Build 후 Image write 

      $ git clone https://github.com/hardkernel/u-boot.git
      $ cd u-boot
      $ ls board/samsung/smdk4212/     // 소스 확인
      $ make distclean
      $ make smdk4412_config
      $ make
          ( 위 make 시 아래 파일 생성 ./mkbl2 u-boot.bin bl2.bin 14336 (bl2.bin n파일 생성)
      
      $ cd sd_fuse                    // 난 아래와 같이 사용.    
      $ ./sd_fusing_4412.sh /dev/sdb  // Flash Image 
        (/dev/sdb는 현재 SD카드가 마운트되어 있는 장치파일로 지정 : sudo fdisk -l 명령어로 확인가능)
      $ sync
      


      4. Build  SD Image

      SD Image의 구성은 두 부분으로 구성
      1. 0M~100M의 Booting image
      2. 100M~500M FAT32로 구성된 kernel image 와 andoid filesystem 
      현재 GPT구성이 아니며, FDISK 기반으로 구성 (MBR)


      4.1 Main Image 구성

      • dd 와 fdisk 기반으로 Main Image 구성 

      $ dd if=/dev/zero of=my_sd_self_installer.img bs=1k count=500k  // 500M image 설정
      
      $ fdisk ./my_sd_self_installer.img   // fdisk를 사용하여 아래와 같이 설정  
      
      Command (m for help): n
      Partition type:
         p   primary (0 primary, 0 extended, 4 free)
         e   extended
      Select (default p): p
      Partition number (1-4, default 1):
      Using default value 1
      First sector (2048-1023999, default 2048): 204800
      Last sector, +sectors or +size{K,M,G} (204800-1023999, default 1023999):
      
      
      $ fdisk -l ./my_sd_self_installer.img
      
      Units = sectors of 1 * 512 = 512 bytes
      
                           Device Boot      Start         End      Blocks   Id  System
      ./my_sd_self_installer.img1          204800     1023999      409600   83  Linux
      
      
      // 204800 x 512 = 104857600  약 100M 부터설정 
      

      4.2 Make Boot Image 구성

      uboot Image 및 기타 bootloader를 삽입
      $ sudo losetup -o0 /dev/loop0 ./my_sd_self_installer.img     //attach device offset=0 
      $ cd u-boot/sd_fuse/
      $ sd_fusing.sh /dev/loop0
      $ sudo losetup -d /dev/loop0   //detach device
      


      4.3 Make FAT32 Image

      100M 이후 부터는 FAT32 Filesystem 생성 
      $ sudo losetup -o104857600 /dev/loop0 ./my_sd_self_installer.img  //attach device offset= 204800 x 512 = 104857600 
      $ sudo mkdosfs -F32 /dev/loop0
      $ sudo losetup -d /dev/loop0   //detach device
      


      4.4 Build FAT32 Image

      기존에 존재하던 Image 및 boot.scr 들을  FAT32 Image에 mount 하여 복사한다.
      $ sudo mount -o loop,offset=104857600 ./my_sd_self_installer.img ~/tmp //mount offset= 204800 x 512 = 104857600 
      $ sudo cp -a ~/file/*      ~/tmp/
      $ umount ~/tmp
      


      ODROID Build 관련내용 
        http://odroid.com/dokuwiki/doku.php?id=en:androidplatformbuildguideforexynos4412

      Loopback Device (dd 와 losetup) 기본사용법
        http://wiki.osdev.org/Loopback_Device

      sd_fusing.sh 관련내용 
        http://chiccoder.tistory.com/40

      8/02/2014

      repo 내부의 manifest.xml 구성 및 분석

      1. manifest.xml 이란? 

      repo를 이용하여 repo init하여 설정할 경우, .repo 구조가 생성이되면서 안에  manifest.xml이 안에 존재하는데, 이 xml 기반으로 소스를 가져온다.
      이는 repo의 한 구성이며 이를 기반으로 git를 사용하기에 사용방법을 정확히 인지해야한다.


      1.1 manifest.xml 기본구조

      manifest.xml은 기본적으로 default.xml로 링크되어 있으며, 기본구성은 XML형태의 구조이며,
      아래와 같이 XML이 구성이 되므로, 각 구조의 의미를 알아야한다.

      • manifest.xml 전체기본구조
         
       <!DOCTYPE manifest [
      
      /*
              * ELEMENT : XML 내부의 각 element로 이런식으로 구성 <element >
              * ATTLIST : 각 ELEMENT의 속성리스트로 ELEMENT 내에 설정값 
              * REQUIRED : 필수로 들어가야 하는 값 
              * IMPLIED : 옵션이라고 생각하면 되겠음.
      */
      
      /*
       <manifest > 로 시작한 후 아래의 element들로 구성되며 그 속성설정을 이해하자.
        세부내용은 각 ELEMENT에서 설명
      */
      
          <!ELEMENT manifest (notice?,
                              remote*,    
                              default?,   
                              manifest-server?,
                              remove-project*, 
                              project*,    
                              extend-project*,
                              repo-hooks?,
                              include*)> //다른 manifest.xml 포함가능하지만 .repo/local_manifests/*.xml`로 쉽게추가
      
          <!ELEMENT notice (#PCDATA)>
      
      // <remote >  구성되며, 보통 Google의 AOSP와 더불어 다른 것들과 같이 구성 ATTLIST로 각 설정가능
      
          <!ELEMENT remote EMPTY>
          <!ATTLIST remote name       ID    #REQUIRED> //각 project의 .git/config remote 이름로 사용 (git fetch/push 가능)
          <!ATTLIST remote alias        CDATA #IMPLIED>
          <!ATTLIST remote fetch      CDATA #REQUIRED> // ./repo/projects or ./repo/project-object 안에 git로 구성됨 
          <!ATTLIST remote pushurl      CDATA #IMPLIED>   //remote "push" 가능 
          <!ATTLIST remote review      CDATA #IMPLIED>   // review 으로 Gerrit server 설정시 'repo upload' 가능 
          <!ATTLIST remote revision    CDATA #IMPLIED>   // Git 의 tag 와 branch name 
      
      // <default >  거의 1개만 구성되며, ATTLIST 중 remote 와 revision은 각 default 값 설정
      
          <!ELEMENT default EMPTY> 
          <!ATTLIST default remote      IDREF #IMPLIED> // 상위 remote element 의 name 중 1개 적용(보통 Google)
          <!ATTLIST default revision    CDATA #IMPLIED> // Git branch/tag , 이 값은 모든 project elelement의 기본값설정
          <!ATTLIST default dest-branch CDATA #IMPLIED> // Name of a Git branch (e.g. `master`), 설정하지 않으면, revision과 동일주소
          <!ATTLIST default upstream    CDATA #IMPLIED>
          <!ATTLIST default sync-j      CDATA #IMPLIED> // 보통 병렬작업을 하기 위해 Job 갯수 
          <!ATTLIST default sync-c      CDATA #IMPLIED> // 받은 Git Branch Sync 설정 true  (revision 속성)
          <!ATTLIST default sync-s      CDATA #IMPLIED> // Sub Project Sync 설정 true
          <!ATTLIST default sync-tags   CDATA #IMPLIED> // 받은 Git Branch Sync 설정 false (revision 속성)
      
          <!ELEMENT manifest-server EMPTY>
          <!ATTLIST manifest-server url CDATA #REQUIRED>
      
      // 상위의 remote 안에 존재하는 모든 project git을 download 후 < project >  구성되며, ATTLIST 설정가능  
      
          <!ELEMENT project (annotation*,   
                             project*,                 
                             copyfile*,
                             linkfile*)>
          <!ATTLIST project name        CDATA #REQUIRED> // 실제 상위 remote 중  Git 의 project name이며 unique 해야함                                                         
          <!ATTLIST project path        CDATA #IMPLIED>  // 상위 Git Project을 download 하면 실제 Local PATH 
          <!ATTLIST project remote     IDREF #IMPLIED> // 상위 remote element 의 name에 적용
          <!ATTLIST project revision    CDATA #IMPLIED> // 설정이 없다면 상위 default element 값
          <!ATTLIST project dest-branch  CDATA #IMPLIED>
          <!ATTLIST project groups       CDATA #IMPLIED> // Project가 속한 그룹 , 설정을 안하면, name과 동일
          <!ATTLIST project sync-c       CDATA #IMPLIED> // Number of parallel jobs (git sync)
          <!ATTLIST project sync-s       CDATA #IMPLIED> // Sub Project Sync 설정 true
          <!ATTLIST default sync-tags    CDATA #IMPLIED>
          <!ATTLIST project upstream     CDATA #IMPLIED>
          <!ATTLIST project clone-depth  CDATA #IMPLIED>
          <!ATTLIST project force-path   CDATA #IMPLIED>
      
      /*
      < project > 의 Sub 작업으로 동작하며 각 Git Project를 세부 Control 작업 
             < annotation >     
             < copyfile >       파일복사
             < linkfile >       링크파일생성
             < extend-project >     확장
      */
      
            <!ELEMENT annotation EMPTY> 
            <!ATTLIST annotation name  CDATA #REQUIRED>
            <!ATTLIST annotation value CDATA #REQUIRED>
            <!ATTLIST annotation keep  CDATA "true">
      
            <!ELEMENT copyfile EMPTY> 
            <!ATTLIST copyfile src  CDATA #REQUIRED>
            <!ATTLIST copyfile dest CDATA #REQUIRED>
      
            <!ELEMENT linkfile EMPTY>  
            <!ATTLIST linkfile src CDATA #REQUIRED>
            <!ATTLIST linkfile dest CDATA #REQUIRED>
      
            <!ELEMENT extend-project EMPTY>
            <!ATTLIST extend-project name CDATA #REQUIRED>
            <!ATTLIST extend-project path CDATA #IMPLIED>
            <!ATTLIST extend-project groups CDATA #IMPLIED>
            <!ATTLIST extend-project revision CDATA #IMPLIED>
      
      /*
             ELEMENT-project 제거기능으로 
              - 이름이 중복될때 사용될경우 필요 할 것 같음
              - 불필요한 project 제거할 것 같음 (remote에서 전체 project를 받기때문에 필요 없는 것은제거)
      */
      
          <!ELEMENT remove-project EMPTY> 
          <!ATTLIST remove-project name  CDATA #REQUIRED>
      
          <!ELEMENT repo-hooks EMPTY>
          <!ATTLIST repo-hooks in-project CDATA #REQUIRED>
          <!ATTLIST repo-hooks enabled-list CDATA #REQUIRED>
      
      /* 
        다른 manifest.xml을 include가능하여 확장기능 
        이외 localmanifest 도 존재
       */ 
      
          <!ELEMENT include EMPTY> 
          <!ATTLIST include name CDATA #REQUIRED>
        ]>
      


      • manifest.xml 에 local_manifests.xml 추가방법
      `$TOP_DIR/.repo/local_manifests/*.xml`  추가적으로 element project 와 remote를 확장하기 위해서 local_manifest.xml를 별도로 확장

      // element remote 와 project 관련 사항만 가능한것 같음 (remove-project도 확인) 
      $ ls .repo/manifests  //다양한 manifests.xml로 구성  
      ....xml
      
      $ ls .repo/manifests.xml   //manifests.xml (MAIN) include 사용하여 .repo/manifests 중 선택가능 
      
      $ ls .repo/local_manifests
      local_manifest.xml         // 2nd 추가됨 (알파벳 순서)  
      another_local_manifest.xml // 1st 추가됨 (알파벳 순서)  
      
      $ cat .repo/local_manifests/local_manifest.xml // local_manifest.xml 예제 (remote or project를 추가) 
        <?xml version="1.0" encoding="UTF-8"?>
        <manifest>
          <project path="manifest"
                   name="tools/manifest" />
          <project path="platform-manifest"
                   name="platform/manifest" />
        </manifest>
      

      더이상 $TOP_DIR/.repo/local_manifest.xml 는 미지원한다고 한다. 

              name   : remote의  unique한 ID설정, 다른곳에서 이 ID를 참조하여 적용
              fetch     : source를  받아올 주소 (git fetch )
              review   : review site로 이전 odroid version에는 존재했음. (repo upload 가능)
              revision  : git branch/tag 의 이름  (e.g. master , 'refs/heads/master')
              push     : git push 

           일단 Git 기반으로 하는 것이며, ./repo 안에 download를 하면, name으로 검색가능 

              remote:   이전에 선언된 remote name 중 설정 (기본값 설정)
              revision:  git branch or tag로 element project의 revision의 기본설정값 
              syn-j:  repo sync시 동시에 여러 작업있는 갯수 설정.
              syn-c:  true 이면, 오직 전체를 sync하는 것이 아니라, git branch만 sync 한다고한다.
                       효율적면에서 사용하는것 같다.
              syn-s: true이면 sub-project와 sync를 한다고 한다.

         *element default는 project의 attribute가 remote가 선언이 되지 않았다면, default사용 

      • element project
      • path:  repo sync후 Local의 PATH 구성 
        name:  unique한 이름, remote의 fetch의 Git repository name 
        remote: remote의 설정하며, 만약없다면, element default 정보사용.
        group: group의 list를 말하며, 선언이 되어 있지 않다면 "notdefault" 설정
            모든 project 선언시는  "all"  각 개별 project group 선택시에는 "pdk" or "pdk,linux"
            repo sync -g로 sync 여부를 결정가능하다.
        revision:  sync가 된후, git의 branch 이름,만약없다면, element default 정보사용.
          기본적으로 repo로 download되어 있으면, local path 기반    


      Google의 Repo 관련 세부 Manual 
        https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md


      • Google의 remote 기본구조
      기본 remote Google의 AOSP 는 https://android.googlesource.com 구성은 다음과 같이 구성이 되어지며, 각 슬래시로 구분되어진다.
      이는 repo sync를 할 경우 ,  ./repo/projects or ./repo/project-object 로 가는데 거의 ./repo/projects 로 안에 존재한다.

      일반 Github일 경우는 그냥 project name으로만 찾으면된다. 

      {remote_fetch}/${project_name}.git 

      아래의 설정이 특히해서 링크 
        https://stackoverflow.com/questions/18251358/repo-manifest-xml-what-does-the-fetch-mean

      ODROID manifest.xml 분석