4/12/2015

Define 및 코딩스타일 정리

1. 기본 주석 스타일 정리

/*****************************************************************************************************
                                                                            
 * Author      : Lee,xxxxx                                                                         
 * Mailto      :                                                              
 * OS Name     : Linux                                                                                
 * OS Ver.     : x.x.x                                                                             
 * Writen date : 20xx/06/28                                                                           
 * API.ver     : 0.0.1                                                                                
 
 * Purpose     :   
 * Description :   
                   
*****************************************************************************************************/ 


2. struct & enum rules

 typedef struct _JitterInfo {
  u32  nTotalElmt;  //number
  u32 *pData;   //pointer
  u32  szTotalElmt;  //size
  JitterInfo symJitterInfo; //struct
  JitterInfo *psymJitter;  //struct pointer
 }JitterInfo;  //첫문자는 소문자 나머지는 대문자.

 typedef enum {
  EN_JITTER_NOTSET=0,  //EN Enum의 약자.
  EN_JITTER_FIRSTWORKING,
  EN_JITTER_WORKING,
  EN_JITTER_NOTWORK,
 }JitterStatus; //첫문자는 대문자 나머지는 소문자 

3. Functions rules & variables rules

 #define IN //input variables 
 #define OUT //output variables
 #define BO //return variables 

  //첫워드의 첫문자는 소문자, 두번째 첫워드부터는 대문자로 통일.
 audioJitterInit(int IN nArgs,int OUT  ) 
 {
  JitterInfo symJitter
  JitterInfo *psymJitter;
   
 } 

3. header file rules

 #ifndef _H323_JITTERS_H_
 #define _H323_JITTERS_H_

 #endif //_H323_JITTERS_H_ 

4. debug macro rules

 type 1
 #define H323_DL1             ON     /* be used, if function failed */  
 #define H323_DL2             OFF     /* be used, if this shows a consol function's informations */
 #define H323_DL3             OFF     /* be used, if you will testfy basic'src  */

 /********************************************/
 /*  Application Debugger MACRO              */
 /********************************************/

 /* H.323 Library debug */
 #if H323_DL1 // Fuction Error
  #define H323DL1(x,args...) printf("h323:%s:(%d) "x,__FUNCTION__,__LINE__,##args);
 #else 
  #define H323DL1(x,args...)
 #endif

 #if H323_DL2 // Function Information
  #define H323DL2(x,args...) printf("h323:%s:(%d) "x,__FUNCTION__,__LINE__,##args);
 #else 
  #define H323DL2(x,args...)
 #endif
 
 #if H323_DL3 // Only Test
  #define H323DL3(x,args...) printf("h323:%s:(%d) "x,__FUNCTION__,__LINE__,##args);
 #else 
  #define H323DL3(x,args...) 
 #endif

type 2
 #define DEBUG    1
 #undef DEBUG
 
 #ifdef DEBUG
  #define DBG(stuff...)        printk(KERN_DEBUG "dm320: " stuff)
 #else
  #define DBG(stuff...)        do{}while(0)
 #endif
 
 #define NEW_DEBUG
 
 #ifdef NEW_DEBUG
  #define N_DBG(stuff...)           printk(stuff)
 #else
  #define N_DBG(stuff...)           do{}while(0)
 #endif

 #ifdef VERBOSE
  #    define VDBG        DBG
 #else
  #    define VDBG(stuff...)    do{}while(0)
 #endif

 #ifdef PACKET_TRACE
  #    define PACKET        VDBG
 #else
  #    define PACKET(stuff...)    do{}while(0)
 #endif

 #define ERR(stuff...)       printk(KERN_ERR "dm320: " stuff)
 #define WARN(stuff...)      printk(KERN_WARNING "dm320: " stuff)
 #define INFO(stuff...)      printk(KERN_INFO "dm320: " stuff)




#define err(format, arg...)  printk(KERN_ERR     "bcm3510: " format "\n" , ## arg)
#undef info
#define info(format, arg...) printk(KERN_INFO    "bcm3510: " format "\n" , ## arg)
#undef warn
#define warn(format, arg...) printk(KERN_WARNING "bcm3510: " format "\n" , ## arg)


#define DEBUG(dbg, format, args...) \
  {if(DEBUG_##dbg) \
  printk(KERN_DEBUG "irnet: %s(): " format, __FUNCTION__ , ##args);}


 
H323DL3("Could not set sample rate (%d)\n", samplerate); 

4/10/2015

Device.mk의 PRODUCT Flags 의 종류와 기능들

1. Android 기본 Build 방법

  • STEP1 - Android Build 준비를 위해 기본설정 
lunch/m/mm/mmm/cgrep/jgrep 등 기본명령어들 사용가능 
$ source build/envsetup.sh    // 설정시 vendor와 관련된 shell script 확장 및 build의 기본명령어 실행가능
including device/fsl/imx6dq/vendorsetup.sh
including device/fsl/imx6sl/vendorsetup.sh
including device/fsl/imx6sx/vendorsetup.sh
......

상위 Shell Script를 보면, 지원되는 기능을 쉽게 알수 있으며, 분석도 쉽다. 

  • STEP2 - Android Board 관련설정 
lunch를 이용하여, boardname 과 Build Type를 선택 (ProductName-BuildMode)
$ lunch 
or
$ lunch board-user/userdebug/eng   //3개 중 선택하여 설정  

  • STEP3 - Android Build 
상위에서 설정한 Build Type과 Board 설정으로 Android를 전체 Build 진행 
$ make 2>&1 | tee build-log.txt   //전체 Build 하며, 에러가 발생시 이를 멈추지 말고 진행하고 로그를 남김 

Android Build 구조 

Android Build 방법

Android Source 구조 



$ hmm    // 상위 source build/envsetup.sh  이후 가능하며, envsetup.sh shellscript
...
Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
- lunch:      lunch <product_name>-<build_variant>
              Selects <product_name> as the product to build, and <build_variant> as the variant to
              build, and stores those selections in the environment to be read by subsequent
              invocations of 'm' etc.
- tapas:      tapas [<App1> <App2> ...] [arm|x86|mips|arm64|x86_64|mips64] [eng|userdebug|user]
- croot:      Changes directory to the top of the tree, or a subdirectory thereof.
- m:          Makes from the top of the tree.
- mm:         Builds all of the modules in the current directory, but not their dependencies.
- mmm:        Builds all of the modules in the supplied directories, but not their dependencies.
              To limit the modules being built use the syntax: mmm dir/:target1,target2.
- mma:        Builds all of the modules in the current directory, and their dependencies.
- mmma:       Builds all of the modules in the supplied directories, and their dependencies.
- provision:  Flash device with all required partitions. Options will be passed on to fastboot.
- cgrep:      Greps on all local C/C++ files.
- ggrep:      Greps on all local Gradle files.
- jgrep:      Greps on all local Java files.
- resgrep:    Greps on all local res/*.xml files.
- mangrep:    Greps on all local AndroidManifest.xml files.
- mgrep:      Greps on all local Makefiles files.
- sepgrep:    Greps on all local sepolicy files.
- sgrep:      Greps on all local source files.
- godir:      Go to the directory containing a file.
- allmod:     List all modules.
- gomod:      Go to the directory containing a module.
- pathmod:    Get the directory containing a module.
- refreshmod: Refresh list of modules for allmod/gomod.

Environment options:
- SANITIZE_HOST: Set to 'true' to use ASAN for all host modules. Note that
                 ASAN_OPTIONS=detect_leaks=0 will be set by default until the
                 build is leak-check clean.
- ANDROID_QUIET_BUILD: set to 'true' to display only the essential messages.



1.2 Vendor Shell Script 

각 Vendor Shell Script에서 board name 과 Build Type를 쉽게 추가되는 것을 확인되며, 아래의 이름으로 lunch로 실행

$ cat device/fsl/imx6sx/vendorsetup.sh //boardname 과 user/userdebug 확인 (lunch에서 설정가능)
add_lunch_combo sabresd_6sx-user
add_lunch_combo sabresd_6sx-userdebug
add_lunch_combo sabreauto_6sx-user
add_lunch_combo sabreauto_6sx-userdebug 

상위 STEP2에서 여기서 등록된 lunch로 설정 i.MX6 의 경우 아래와 같다.  

$ lunch sabresd_6sx-userdebug
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=9
TARGET_PRODUCT=sabresd_6sx
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=cortex-a9
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.15.0-128-generic-x86_64-Ubuntu-16.04.3-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=2.2.0-ga-rc3
OUT_DIR=out
============================================

i.MX6의 경우 별도의 DSP가 존재하지 않으며, ARM의 neon mode를 이용하여 DSP역할을 해주는 것으로 보인다. 

$ lunch sabresd_6sx-eng

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=9
TARGET_PRODUCT=sabresd_6sx
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=cortex-a9
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.15.0-128-generic-x86_64-Ubuntu-16.04.3-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=2.2.0-ga-rc3
OUT_DIR=out
============================================

1.2 Android PRODUCT 와 BUILD_VARIANT

 lunch에서 boardname 과 build type를 설정  
  1. TARGET_PRODUCT : 상위 Board Name 
  2. TARGET_BUILD_VARIANT : Build Type 이며, eng/user/userdebug

PRODUCT_PACKAGES
LOCAL_MODULE_TAGS 

$ find . -name default.prop
$ cat ./development/vndk/tools/definition-tool/tests/testdata/test_vndk_lib_dir/vndk_versioned_multiple/vendor/default.prop 
ro.vndk.version=29
각 LOCAL_MODULE_TAGS 의 설정으로 기본은 optional 

default.prop (default.property 의 약어로 상위와 같이 설정확인)

개발자 버전으로 enginerring build로 개발자들이 가장 많이 사용 
• eng: development configuration with additional debugging tools
— Installs modules tagged with: eng and/or debug.
— Installs modules according to the product definition files, in addition to tagged modules.
— ro.secure=0
— ro.debuggable=1
— ro.kernel.android.checkjni=1
— adb is enabled by default. //adb 사용가능

• user: limited access; suited for production
— Installs modules tagged with user.
— Installs modules according to the product definition files, in addition to tagged modules.
— ro.secure=1
— ro.debuggable=0
— adb is disabled by default.//adb 사용불가능

• userdebug: like user but with root access and debuggability; preferred for debugging
— Installs modules tagged with debug.
— ro.debuggable=1
— adb is enabled by default. // adb 사용가능 

Build-variants 


2. build/core/main.mk 

상위 전체 make를 하면, 상위 main.mk가 호출되면서 Build가 진행된다. 

Android Makefile과 환경설정설명
  http://elinux.org/Android_Device

Android Kernel 구성 


2.1 Boardconfig.mk 분석 

Android의 Build할 경우 Board의 전체 Config이며, 가장중요한 파일이며, 이파일 기반으로 분석을 시작해야한다. 
복잡한 경우에는 추가되는 부수적인 BoardCommonConfig.mk 이던지 추가하여 공통사항들을 설정한다. 

$ find . -name BoardConfig.mk  // 기본위치파악 
device/Vendor/ARCH/BoardName/BoardConfig.mk   
....  
상위와 같이 device/Vendor/ARCH/BoardName/BoardConfig.mk에 존재하며 이곳에 manifest.xml를 비롯하여 각종중요파일들이 같이 존재한다.
  1. init.rc/init%hardware$.rc:  init 후 script 기능
  2. ueventd.%hardware%.rc:  udev 기능 설정 
  3. 이외 파일 아래 설명 

BoardConfig.mk 가 있는 곳에 모든 관련설정이 포함하고 있으며, 이곳에 없다면, 같은 디렉토리의 다른 Makefile를 참조하자 

  • BoardConfig.mk 분석 (i.MX6)
가장먼저 분석해야할 각 Board의 세부 Config 내용이며, Device Tree를 비롯하여 세부 설정사항들을 알수 있음 
$ vi ./device/fsl/imx6sx/sabresd_6sx/BoardConfig.mk 
#
# 주석 
#

IMX_DEVICE_PATH := device/fsl/imx6sx/sabresd_6sx

#
# include로 확장 
# 
include $(IMX_DEVICE_PATH)/build_id.mk
include device/fsl/imx6sx/BoardConfigCommon.mk

ifeq ($(PREBUILT_FSL_IMX_CODEC),true)
-include $(FSL_CODEC_PATH)/fsl-codec/fsl-codec.mk
endif
.....
BOARD_PREBUILT_DTBOIMAGE := out/target/product/sabresd_6sx/dtbo-imx6sx.img
TARGET_BOOTLOADER_CONFIG := imx6sx:imx6sxsabresdandroid_defconfig

# imx6sx default dts
TARGET_BOARD_DTS_CONFIG := imx6sx:imx6sx-sdb.dtb
TARGET_KERNEL_DEFCONFIG := imx_v7_android_defconfig

  • AndroidBoard.mk
BoardConfig.mk 와 같은위치에 존재하는 AndroidBoard.mk 있으며, Build되는 전체구조와 순서를 쉽게 파악 알수 있다 

$ vi ./device/fsl/imx6sx/sabresd_6sx/AndroidBoard.mk 
include device/fsl/common/build/dtbo.mk
include device/fsl/common/build/imx-recovery.mk
include device/fsl/common/build/gpt.mk
include $(FSL_PROPRIETARY_PATH)/fsl-proprietary/media-profile/media-profile.mk
ifneq ($(PRODUCT_IMX_CAR),true)
include $(FSL_PROPRIETARY_PATH)/fsl-proprietary/sensor/fsl-sensor.mk
endif

ifneq ($(BOARD_OTA_BOOTLOADERIMAGE),)
  INSTALLED_RADIOIMAGE_TARGET += $(PRODUCT_OUT)/bootloader.img
  BOARD_PACK_RADIOIMAGES += bootloader.img
endif

  • AndroidProducts.mk
상위와 같은 위치에 존재하며, 상위 LUNCH 설정하며, PRODUCT_MAKEFILES을 분석을 하면 쉽게 제품의 구조를 파악가능 
build/target/product/AndroidProducts.mk 와 같이 보자.

$ vi ./device/fsl/imx6sx/sabredsd_6sx/AndroidProducts.mk
# Copied from build/target/product/AndroidProducts.mk

PRODUCT_MAKEFILES := \
  $(LOCAL_DIR)/evk_6sl/evk_6sl.mk

COMMON_LUNCH_CHOICES := \
  evk_6sl-user \
  evk_6sl-userdebug




2.2 Device.mk 와 device_xxx.mk

Android에서 사용되어지는 Device의 빌드할 경우 관련 설정 및 Build 파일로 만약 새로운 Device를 추가한다면, 이 Makefile도 추가해야한다.

Device.mk를 분석을 해보면, 아래와 같이
PRODUCT라는 FLAG들이 많다는 것을 알며, 이것의 종류가 좀 있다고 느껴진다.


2.3  AndroidProduct.mk 의 PRODUCT_MAKEFILES

상위에서 설명한 AndroidProduct.mk에 PRODUCT_MAKEFILES들을 분석하면 다음과 같이 구조가 나온다.
  1. PRODUCT_PACKAGES 
  2. PRODUCT_COPY_FILES
  3. PRODUCT_PROPERTY_OVERRIDES
  4. PRODUCT_DEFAULT_PROPERTY_OVERRIDES
  5. PRODUCT_CHARACTERISTICS
  6. PRODUCT_AAPT_CONFIG
  7. PRODUCT_AAPT_PREF_CONFIG
  8. PRODUCT_TAGS

2.4 NDK의 Android.mk 와 Application.mk 

상위 Android.mk에 LOCAL_MODULE_TAGS에 

여러 *.mk에 있다고 하니, 여러군데를 일단 분석을 해보았고, 기본이 되는
device/hardkernel/odroidx2/device.mk 이 부분 기반을 보니,


NDK와 Android.mk와 Application.mk 

  • Build 구조이해 
구글문서로 new Device를 추가하는 법인데, 쉽게 빌드구조를 이해가능 

Android Song 빌드구조 

Android USB 

Bash Shell 예제들

  
반드시 참조 아래사이트 
  https://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/
  https://ahyuo79.blogspot.com/2014/01/awk.html

$ cat reset_lte.sh
#!/bin/sh
#
# Usage examples:
#       ./reset_lte.sh stop
#       ./reset_lte.sh start



VER=1.6

LTE_PWR=160
LTE_EN=161

WAIT_100MS() {
    sleep 0.1
}

WAIT_10MS() {
    sleep 0.01
}

WAIT_1S() {
    sleep 1
}

enable_lte() {
    echo "ENABLE/RESET LTE  (LTE_PWR:$LTE_PWR, LTE_EN:$LTE_EN)"
    # write output (Power)
    echo "0" > /sys/class/gpio/gpio$LTE_EN/value; WAIT_100MS
    echo "1" > /sys/class/gpio/gpio$LTE_EN/value
    # Reset (LTE_IGT)
    echo "1" > /sys/class/gpio/gpio$LTE_PWR/value
}

disable_lte() {
    echo "DISABLE/RESET LTE  (LTE_PWR:$LTE_PWR, LTE_EN:$LTE_EN)"
    # write output (Power)
    echo "0" > /sys/class/gpio/gpio$LTE_EN/value; WAIT_100MS  
    # off (LTE_IGT) 
    echo "0" > /sys/class/gpio/gpio$LTE_PWR/value    
}

case "$1" in
    start)
    enable_lte
    ;;
    stop)    
    disable_lte
    ;;
    *)
    echo "Usage: $0 {start|stop} "
    exit 1
    ;;
esac

exit 0


$ cat reset_lte.sh
#!/bin/sh
# Setup LDO/RESET Service (systemd) 
# 


WAIT_100MS() {
    sleep 0.1
}

echo "   " | logger -t pwr_setup -p local0.notice
echo "   " | logger -t pwr_setup -p local0.notice
echo "   " | logger -t pwr_setup -p local0.notice
echo "Setup ALL POWER SYSTEM (LDO/RESET) Start !!!!! " | logger -t pwr_setup -p local0.notice

/usr/bin/setup_gpio.sh enable | logger -t pwr_setup -p local0.notice

if [ $? -eq 0 ]
then
  echo "Success: setup_gpio.sh enable (Setup GPIO about LDO/RESET)" | logger -t pwr_setup -p local0.notice
else
  echo "Failure: setup_gpio.sh enable (Setup GPIO about LDO/RESET)" >&2 | logger -t pwr_setup -p local0.notice
  exit 1
fi

/usr/bin/reset_gps.sh start | logger -t gps_reset -p local0.notice

if [ $? -eq 0 ]
then
  echo "Success: reset_gps.sh start (GPS RESET OK)" | logger -t gps_reset -p local0.notice
else
  echo "Failure: reset_gps.sh start (GPS RESET Failed) " >&2 | logger -t gps_reset -p local0.notice
  exit 1
fi


/usr/bin/reset_lte.sh start | logger -t lte_reset -p local0.notice

if [ $? -eq 0 ]
then
  echo "Success: reset_lte.sh start (LTE RESET OK)" | logger -t lte_reset -p local0.notice
else
  echo "Failure: reset_lte.sh start (LTE RESET Failed)" >&2 | logger -t lte_reset -p local0.notice
  exit 1
fi


exit 0


$ cat /etc/syslog.conf
#  /etc/syslog.conf     Configuration file for busybox's syslogd utility
#
#  Author: Jeonghun lee


local0.notice       /var/log/test1

local1.notice       /var/log/test2

# others  /var/log/message






ODOID Lollipop Porting-2 (이 부분을 끝내지를 못함)- 추후 삭제

수정부분요약 (회사일로 바뻐서 이 일을 멈추기로함)


device/hardkernel/odroidx2


   1. Makefile

        Android.mk             :  기본 Makefile, TAGET_PRODUCT= odroidx2 일 경우 동작
        AndroidProducts.mk  :  odroidx2.mk wrap Makefile
        BoardConfig.mk     :  Board기본 설정   on/off 제어
        CleanSpec.mk
        device.mk               :                                    아래내용 수정
              * PRODUCT_COPY_FILES 중 (Ultra_Explorer.apk,DicePlayer.apk 복사방지 막음)
        odroidx2.mk            :  PRODUCT INFO


   2. vendorsetup.sh    : odroidx lunch 항목에 등록   3. drivers              :  driver's ko (wifi ,snd,기타)
   4. conf                 :  초기화 설정

Memory 관련 문제

vi hardware/libhardware/include/hardware/gralloc.h:  
    GRALLOC_USAGE_YUV_ADDR        = 0x04000000,   //새로추가

vi hardware/samsung_slsi/exynos4/libgralloc_ump/gralloc_module.cpp
   //  getphys: gralloc_getphys,               //not used,  489    getphys 안쓰도록 수정

https://source.android.com/devices/halref/structgralloc__module__t.html
https://source.android.com/devices/graphics/index.html


Audio 관련문제

https://source.android.com/devices/audio/implement.html
http://blog.eairship.kr/175


hardware/hardkernel/libaudio/AudioHardware.cpp: In function 'android_audio_legacy::AudioHardwareInterface* android_audio_legacy::createAudioHardware()':
hardware/hardkernel/libaudio/AudioHardware.cpp:2324:30: error: cannot allocate an object of abstract type 'android_audio_legacy::AudioHardware'
     return new AudioHardware();

vi device/hardkernel/odroidx2/BoardConfig.mk
BOARD_USES_ALSA_AUDIO := true
BUILD_WITH_ALSA_UTILS := true

ref. 
https://groups.google.com/forum/#!topic/android-porting/w487bZaVzxA


*Android Porting Forum
https://groups.google.com/forum/#!forum/android-porting


vi hardware/hardkernel/libcamera_webcame/Android.mk

LOCAL_C_INCLUDES += \
        $(TOP)/system/media/camera/include \   // 새로운 include 추가
        $(TOP)/frameworks/base/include/android_runtime \


참조
  hardware/libhardware_legacy/audio/audio_hw_hal.cpp
  hardware/libhardware_legacy/include/hardware_legacy/AudioHardwareInterface.h
  external/tinyalsa/include/tinyalsa/asoundlib.h


vi hardware/hardkernel/libcamera_webcame/V4L2Camera.h 
//#include linux/videodev.h
#include linux/videodev2.h
http://w3facility.org/question/flashcam-doesnt-compile-videodev-h-not-found/

4/09/2015

pushd 와 popd로 반복 directory 이동

1. pushd 와 popd의 기능

Linux에서 cd 를 이용하여 잦은 directory를 이동하면 사실 귀찮으며, 이동한 기록을 이용하여 이동을 하면 편할 때가 많다.

  • pushd 
stack 구조로 history를 저장하고 cd 명령처럼 이동을 하며, 본인의 옵션에따라 써클큐처럼 동작하여 순환이동이 가능하다.

  1. pushd path : 해당 path를 pushd에 Stack으로 기록과 동시에 이동후 Stack 기록
  2. pushd        : stack에 있는 이전 path로만 이동, 반복이동가능 (Stack Size 동일)
  3. pushd +1   : stack을 써클큐로 이용하여 현재주소 n번째 path로이동 (Stack Size 동일)


  • popd 
popd는 pushd로 기록된 history 중에 필요없는 기록을 지우는 기능으로 사용된다.

  1. popd     :   stack의 이전주소 이동후 stack 이전주소삭제
  2. popd -n  :  현재기준으로 1번째주소만 삭제 (현재주소 유지)
  3. popd +3 :  현재기준으로 3번째 주소만 삭제 (현재주소 유지)


가능하다면 -n 옵션과 -N 옵션은 사용하지 말자.
+N 옵션만 직접번호 넣고해야 사용해야 기억하기 쉽다. 

1.1 pushd를 이용하여 stack 정보생성

$ pushd /var/log/                       // pushd 입력과 동시에 이동 
/var/log ~                              // Stack 정보표시 1개 (좌측 왼쪽은 현재위치)

$ pushd /etc                            // pushd 입력과 동시에 이동                        
/etc /var/log ~                         // Stack 정보표시  2개 (좌측 왼쪽은 현재위치) 

$ pushd /opt                            // pushd 입력과 동시에 이동
/opt /etc /var/log ~                    // Stack 정보표시 3개 (좌측 왼쪽은 현재위치) 

$ pushd /bin                             // pushd 입력과 동시에 이동
/bin /opt /etc /var/log ~                // Stack 정보표시 4개 (좌측 왼쪽은 현재위치) 

$ pushd /mnt                             // pushd 입력과 동시에 이동
/mnt /bin /opt /etc /var/log ~           // Stack 정보표시 5개 (좌측 왼쪽은 현재위치) 

$ pushd /proc                             // pushd 입력과 동시에 이동
/proc /mnt /bin /opt /etc /var/log ~      // Stack 정보표시 6개 (좌측 왼쪽은 현재위치) 

   Stack 정보는 현재위치도 포함

1.2 두 주소만 반복이동

  • 기존기록 
$ pushd                                      // 상위의 마지막 Stack 정보    
/proc /mnt /bin /opt /etc /var/log ~         // 이전주소 (/proc) 이동됨 (좌측 왼쪽은 현재위치)


  • pushd 이용 사용예 
        현재위치기준으로 +1번째만 이동 (반복이동)

$ pushd                                      // 입력과 동시에 이전주소이동 (Stack Size동일)   
/mnt /proc /bin /opt /etc /var/log ~         // 이전주소 (/mnt) 이동된 (좌측 왼쪽은 현재위치)   

$ pushd                                      // 입력과 동시에 이전주소이동 (Stack Size동일)   
/proc /mnt /bin /opt /etc /var/log ~         // 이전주소 (/proc) 이동됨 (좌측 왼쪽은 현재위치)

$ pushd                                      // 입력과 동시에 이전주소이동 (Stack Size동일)   
/mnt /proc /bin /opt /etc /var/log ~         // 이전주소 (/mnt) 이동된 (좌측 왼쪽은 현재위치)   

$ pushd                                      // 입력과 동시에 이전주소이동 (Stack Size동일)   
/proc /mnt /bin /opt /etc /var/log ~         // 이전주소 (/proc) 이동됨 (좌측 왼쪽은 현재위치)


1.3 Stack 정보를 써클큐로 순환이동 

  • 기존기록 
$ pushd                                      // 상위의 마지막 Stack 정보    
/proc /mnt /bin /opt /etc /var/log ~         // 이전주소 (/proc) 이동됨 (좌측 왼쪽은 현재위치)


  • push +N 이용  
       현재위치기준으로 +N 번째  (순환이동)

$ pushd +1                                   // 1번째 전주소(/mnt)이동과 써클큐로 동작 (Stack Size동일)   
/mnt /bin /opt /etc /var/log ~ /proc         // 1번째 전주소(/mnt) 이동된 (좌측 왼쪽은 현재위치)   

$ pushd +1                                   // 1번째 전주소(/bin)이동과 써클큐로 동작 (Stack Size동일)   
/bin /opt /etc /var/log ~ /proc /mnt         // 1번째 전주소(/bin) 이동된 (좌측 왼쪽은 현재위치)   

$ pushd +1                                   // 1번째 전주소(/opt) 이동과 써클큐로 동작 (Stack Size동일)   
/opt /etc /var/log ~ /proc /mnt /bin         // 1번째 전주소(/opt) 이동된 (좌측 왼쪽은 현재위치)   

$ pushd +1                                   // 1번째 전주소(/etc) 이동과 써클큐로 동작 (Stack Size동일)   
/etc /var/log ~ /proc /mnt /bin /opt         // 1번째 전주소(/etc) 이동된 (좌측 왼쪽은 현재위치)  

$ pushd +2                                   // 2번째 전주소(/~)이동과 동시에 써클큐로 동작 (Stack Size동일)     
~ /proc /mnt /bin /opt /etc /var/log         // 2번째 전주소(/~) 이동됨 (좌측 왼쪽은 현재위치)

$ pushd +2                                   // 2번째 전주소(/mnt)이동과 동시에 써클큐로 동작 (Stack Size동일)     
/mnt /bin /opt /etc /var/log ~ /proc         // 2번째 전주소(/mnt) 이동됨 (좌측 왼쪽은 현재위치)

$ pushd +2                                   // 2번째 전주소(/opt)이동과 동시에 써클큐로 동작 (Stack Size동일)     
/opt /etc /var/log ~ /proc /mnt /bin         // 2번째 전주소(/opt) 이동됨 (좌측 왼쪽은 현재위치)

$ pushd +5                                   // 5번째 전주소(/mnt)이동과 동시에 써클큐로 동작 (Stack Size동일)    
/mnt /bin /opt /etc /var/log ~ /proc         // 이전주소 (/mnt) 이동된 (좌측 왼쪽은 현재위치)   

1.4 필요없는 Stack 정보 삭제 


  • 기존기록 
$ pushd                                      // 상위의 마지막 Stack 정보    
/proc /mnt /bin /opt /etc /var/log ~         // 이전주소 (/proc) 이동됨 (좌측 왼쪽은 현재위치)

  • popd 이용하여 삭제  
        현재위치기준으로 +N 번째 Stack 정보삭제

$ popd                              // 이전주소로 이동동시에 마지막현재주소 삭제 (/opt로 이동)
/mnt /bin /opt /etc /var/log ~      // 이전주소 이동됨 (좌측 왼쪽은 현재위치)

$ popd -n                           // popd로 현재기준으로 1번째주소만 삭제 (위치그대로) 
/mnt /opt /etc /var/log ~            // 현재주소 유지 (좌측 왼쪽은 현재위치)

$ popd +3                            // popd로 현재기준으로 3번째주소만 삭제 (위치그대로) 
/mnt /opt /etc ~                     // 현재주소 유지 (좌측 왼쪽은 현재위치)


  http://en.wikipedia.org/wiki/Pushd_and_popd
  http://devanix.tistory.com/231

4/08/2015

ODROID-X2 Lollipop Porting-1 - 추후 삭제

1. How To Download Android Source ( Lollipop)

A. 설정 
 $ mkdir lollipop
 $ cd lollipop 

B. 개발자 version 혹은 release version으로 download하자
*develop version init
 $ repo init -u https://android.googlesource.com/platform/manifest -b lollipop-dev 
*release version init
 $ repo init -u https://android.googlesource.com/platform/manifest -b android-5.1.0_r3 

*download
 $ repo sync -qc -j4

C. download 후 확인
 $ ls
    abi     bootable   dalvik       device    frameworks  libnativehelper  packages   sdk
    art     build      developers   docs      hardware    Makefile         pdk        system
    bionic  cts        development  external  libcore     ndk              prebuilts  tools


1.1 repo 설정

repo는 git를 관리는 하는 linux tool로 아래에서 간단히 사용방법을 숙지하자.
처음 사용한다면, 아래의 사이트를 참조하여, download를 받고 기본설정하자.

https://ahyuo79.blogspot.com/search/label/SCM-GIT


1.2 repo와 git 기본사용법

android source를 수정을 한 후, repo status를 보면 아래와 같이 수정 및 새로추가한 것을 알수있다.
-m  :  수정
-     : new file

$ repo status
project build/                                  (*** NO BRANCH ***)
 -m     envsetup.sh
project hardware/libhardware/                   (*** NO BRANCH ***)
 -m     include/hardware/gralloc.h
project hardware/libhardware_legacy/            (*** NO BRANCH ***)
 --     audio/audio_hw_hal.kitkat.cpp
 --     audio/audio_hw_hal.lollipop.cpp


세세한 download 혹은 상태를 보고 싶다면 git status를 사용하자.
아래와 같이 File 삭제 새로 추가 및 수정 했다면  아래와 같이
git status로 보면 확인하고, 다른명령으로 복구하자.

  • 삭제:  deleted:
  • 수정:  modified: 
  • 새로추가:  Untracked files:
$ git status
# Not currently on any branch.
# Changes not staged for commit:
#   (use "git add/rm file..." to update what will be committed)
#   (use "git checkout -- file..." to discard changes in working directory)
#
# deleted:    Android.mk              // 지워진 파일 
#
# Untracked files:
#   (use "git add file..." to include in what will be committed)
#
# audio_hw_hal.kitkat.cpp            // 새로 추가한 파일
# audio_hw_hal.lollipop.cpp          // 새로 추가한 파일

git checkout으로 Android.mk 복구

$ git checkout Android.mk            // Android.mk 삭제되어있기에, 이를 복구
$ git status                         // 복구 후 상태확인 
# Not currently on any branch.
# Untracked files:
#   (use "git add file..." to include in what will be committed)
#
# audio_hw_hal.kitkat.cpp
# audio_hw_hal.lollipop.cpp



*아래사이트에서 위의 branch 주소가 변경이 될 수 있으므로 확인하자. 
How to download source
http://source.android.com/source/downloading.html ( how to download )
https://android.googlesource.com/platform/manifest/+refs  ( how to check branch ,tags)
http://source.android.com/source/build-numbers.html#source-code-tags-and-builds
(* how to check  branch, tags)

2. 기존 odroid 분석 

odroid에서 제공하는 shell을 분석하여 Build 구성을 파악.

2.1 odroid build shell 분석 

$ vi build_android.sh 

    odroidx2)
                . build/envsetup.sh     // source build/envsetup.sh 
                lunch odroidx2-eng      // lunch 설정 
                build_android           // build android platform
        copy_root_2_system              // filesystem 수정 및 만들기 
        make_update_zip                 // image 작업 
                if [[ $2 = "otapackage" ]]
                then
                    ./build_otapackage.sh
                fi
                ;;

기본구성은 다음과 같다.
  1. source build/envsetup.sh을 하고 나면 device의 내의 vendor를 include 함.
  2. lunch로 등록된 이 부분을 설정을 시도를 한다.
  3. platform을 빌드를 시작

이부분은 다른 Android에도 동일

* lunch 관련부분 설명
http://chlrbgh0.tistory.com/207

* envsetup.sh 설명
http://www.kaisyu.com/notes/google-android/android-envsetupsh

http://itmir.tistory.com/450

* 기본 Build 방법
http://source.android.com/source/building-running.html
http://elinux.org/Android_Build_System


2.2 How To build Android 

$ . build/envsetup.sh  or $ source build/envsetup.sh
$ lunch odroidx2-eng
$ make -j4 

ref. http://ahyuo79.blogspot.com/2014/01/blog-post_7416.html

2.3 odroid 의 포팅된 부분 파악 

$ find . -name '*.mk' -o -name 'Makefile' | xargs grep odroid 

아래의 결과물로 쉽게 관련 Makefile들을 찾을 수 있다.
쉽게 결과물을 얻으며, 포팅된 부분은 devicehardware 두 directory 부분


3. android-5.1.0_r3 구조파악 및 적용

  •  device와 hardware의 hardkernel을  복사       ( Hard Kernel에서 Porting 부분)
  •  device의 rockchip 부분도 복사                    ( Dummy Ril) 
  •  hardware/samsung_slsi/exynos4 부분도 복사  ( Exynos4 관련 library ) 

필요한 부분만 고쳐서 적용하기로 함.


  * 수정된 부분  
├─ abi     
├─ bootable   
├─ dalvik       
├─ device    
│    ├─hardkernel               :기존에 있던 hardkernel 존재하던 부분 복사 - 2   
│    │    ├─ odroidx2          : odroid-x2 설정
│    │    │      │ 
│    │    │      ├─ BoardConfig.mk     : BoardConfig.mk 와 동일 ( on/off 제어)
│    │    │      ├─ device.mk          : 
│    │    │      ├─ AndroidProducts.mk : odroidx2.mk wrapping Makefile 
│    │    │      ├─ odroidx2.mk        : PRODUCT 정보, product_config.mk 와 동일 
│    │    │      └─ vendorsetup.sh     : lunch 등록 shell 
│    │    │  
│    │    ├─ ...                        : 기타 다른보드설정     
│    │    │  
│    │    └─ proprietary     : 공통사항 , uboot 및 library 보관 (자산, library로 보관 중)
│    │ 
│    │ 
│    ├─ rockchip                  
│    │     └─ common             : 전부 rockchip 부분을 복사-4 
│    │           └─ phone
│    │ 
│    ├─ common                    : 수정안함   
│    ...
│ 
│    
├─ frameworks  
├─ libnativehelper  
├─ packages   
├─ sdk
├─ art     
├─ build
│    ├─ buildspec.mk.default  
│    ├─ CleanSpec.mk  
│    ├─ core  
│    ├─ envsetup.sh  
│    ├─ libs  
│    ├─ target  
│    └─ tools  
│
│
├─ developers   
├─ docs      
├─ hardware 
│    ├─ hardkernel             : 기존에 있던 hardkernel 존재하던 부분 복사-1
│    │      ├─ _Android.mk          : Hal 관련 부분 
│    │      ├─ libaudio             : Audio Hal 
│    │      ├─ libcamera_mipi        
│    │      ├─ libcamera_webcame    : Camera Hal
│    │      └─ libodroid-gps
│    │
│    │
│    ├─ samsung_slsi 
│    │      ├─ exynos4         : exynos4 부분이 존재하지 않아 복사-3 
│    │      └─ exynos5
│    ...
│ 
├─ Makefile         
├─ pdk        
├─ system
├─ bionic  
├─ cts        
├─ development  
├─ external  
├─ libcore     
├─ ndk              
├─ prebuilts  
└─ tools


Ref. http://ahyuo79.blogspot.com/2014/01/blog-post.html?zx=1016342afcd2910e

4. Build 도중 발생 하는 문제 

Build를 하다보면, Java version 문제 , oracle version 문제 등 문제가 발생할 경우
java version을 변경해 보자.

현재 나의 java를 보니, openjdk가 없음으로, 이를 설치
$ java -version  

$ echo $JAVA_HOME 
/usr/lib/jvm/java-7-oracle

$ ls /usr/lib/jvm/
java-6-oracle/        .java-6-oracle.jinfo  java-7-oracle/       
.java-7-oracle.jinfo  java-8-oracle/        .java-8-oracle.jinfo  

http://source.android.com/source/initializing.html

* kikat은 oracle 6을 lolipop은 openjdk 7이 필요 한다고 한다.
* version 이 정확이 맞이 않으면 에러가 발생.

아래와 같이 사용

$ . ./jdk_switch.sh jdk7
$ . ./jdk_switch.sh jdk6  

jdk_swich.sh

vi jdk_switch.sh // shell script 작성 
#!/bin/bash
case $1 in
    jdk6)
 export JAVA_HOME=/usr/lib/jvm/java-6-oracle/
 ;;
    jdk7)
 export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/
 ;;
    *)
 export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/
 ;;
esac

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

java -version

* Java 관련부분 error
http://stackoverflow.com/questions/27955851/android-5-0-build-errors-with-java-version-issue