1/12/2014

DRAM - SDRAM 과 DDR 비교

1. DRAM의 변화  



Micron에서 제공하는 그림을 보면 SDRAM->DDR->DDR2->DDR3 쉽게 이해를 할수가 있다
내부 Memory Core는 동일하지만, I/O Buffer 가 있어 동시 접근하여 Data를 얻어오는 방식으로 외부 Clock을 증가(Prefetch의 증가)하는 형태로 변해가고 있으며,
외부 Edge Timing에 Data를 전송한다.


SDRAM 과 DDR 차이점
  http://blog.naver.com/signal97/199835744

DDR2/DDR3 관련사항 
  https://en.wikipedia.org/wiki/DDR3_SDRAM
  https://en.wikipedia.org/wiki/DDR2_SDRAM

CAS latency (ns) = 1000 × CL (cycles) ÷ clock frequency (MHz)
CAS latency (ns) = 2000 × CL (cycles) ÷ transfer rate (MT/s)

2. DDR의 기본 데이타 전송방식


 DQS는 판독시에 DDR SDRAM에 의해 에지 정렬되어 전송되며, 메모리에 대 한 기록시에는 컨트롤러에 의해 중앙정렬 되어 전송된다.

http://www.eetkorea.com/ARTICLES/2006OCT/PDF/EEKOL_2006OCT16_INTD_STOR_TA_05.PDF?SOURCES=DOWNLOAD


3. DDR의 변화



     https://en.wikipedia.org/wiki/DDR_SDRAM










  • 그림출처

  New Features of DDR3 SDRAM : E1503E10.pdf
  https://www.micron.com/~/media/documents/products/technical-note/dram/e1503e10.pdf

1/05/2014

Bash Shell Script 기본작성

1. Bash Shell Script 기본

간단한 TEST Program을 만들거나, Service를 구동할때 자주 접하는것이 Bash Shell Script이며, 이를 이용하여 좀 더 복잡한 Program 도 작성가능하다.

이런 부분을 간략하게 정리하며, 관련된 TIP들을 정리한다.

  • Bash or Shell Script 기본 테스트 
Shell Script에 맨 위에 본인이 사용하는 Shell의 종류를 넣어주고 반드시 실행권한

$ sh -version  // 기본 Shell을 bash로 사용한다면 bash로 나옴 
// bin/sh 이 없다면, ->dash or bash Link로 기본 Shell 설정 
or
$ bash -version 

$ vi  test0.sh  // bin/sh ->dash or bash로 실행 (기본 Shell) 
#!/bin/sh
echo "Hello!! Shell Script"

$ vi  test1.sh  // /bin/bash로 실행
#!/bin/bash
echo "Hello!! Shell Script"

$ vi watch.sh  // /bin/bash로 실행 process 감시
#!/bin/bash
watch "ps aux | sort -nrk 3,3 | head -n 20"

watch
  https://linux.die.net/man/1/watch
sort
head

$ chmod +x test0.sh test1.sh  //실행권한 
$ sh ./test0.sh     // sh를 이용하여 new process 실행
$ bash ./test1.sh   // bash를 이용하여 new process 실행 
or 
$ ./test0.sh    // current process에서 실행 
$ ./test1.sh    // current process에서 실행 


Bash 시작부분
  https://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/sha-bang.html


  • 고급 Bash Shell Script Guide (반드시 숙지 및 참조)
각각의 세부 Bash Shell Script Guide는 아래의사이트를 참조하자
  https://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/


1.1 Bash Shell script 의 조건문 다양한 예제 

  • 일반적인 변수사용과 if문사용

$ vi iftest1.sh
#!/bin/sh
# 주석 
# bash가 지원되며 아래와 같이 맨위에 설정 
#!/bin/bash


STR1="Hello!!-ShellScript" 
STR2="Hello!!-Others"
TEST="OK"

#
# 변수의 사용법 
#
echo $STR1
echo ${STR2} 

#
## if 문 예제 STRING 
#
if [ $STR1 == $STR1 ]
then      
	echo "TEST IF ${TEST} "
elif [ $STR1 == $STR2 ]
then
	echo "TEST ELIF ${TEST}"
else
	echo "TEST ELSE ${TEST}"
fi
exit 0

  • 조건식 및 File 체크 

! EXPRESSION	The EXPRESSION is false.
-n STRING	The length of STRING is greater than zero.
-z STRING	The lengh of STRING is zero (ie it is empty).
STRING1 = STRING2	STRING1 is equal to STRING2
STRING1 != STRING2	STRING1 is not equal to STRING2
INTEGER1 -eq INTEGER2	INTEGER1 is numerically equal to INTEGER2
INTEGER1 -gt INTEGER2	INTEGER1 is numerically greater than INTEGER2
INTEGER1 -lt INTEGER2	INTEGER1 is numerically less than INTEGER2
-d FILE	FILE exists and is a directory.
-e FILE	FILE exists.
-r FILE	FILE exists and the read permission is granted.
-s FILE	FILE exists and it's size is greater than zero (ie. it is not empty).
-w FILE	FILE exists and the write permission is granted.
-x FILE	FILE exists and the execute permission is granted.

조건문 IF 문의 EXPRESSION

[ -z ${A} ] : A 문자열의 길이가 0이면 TRUE
[ -n ${A} ] : A 문자열의 길이가 0이 아니면 TRUE
[ ${A} -eq ${B} ] : A와 B값이 같으면 TRUE
[ ${A} -ne ${B} ] : A와 B값이 다르면 TRUE
[ ${A} -gt ${B} ] : A가 B보다 크면 TRUE
[ ${A} -ge ${B} ] : A가 B보다 크거나 같으면 TRUE
[ ${A} -lt ${B} ] : A가 B보다 작으면 TRUE
[ ${A} -le ${B} ] : A가 B보다 작거나 같으면 TRUE

[ 조건식A -a 조건식B ] : 조건식 A와 B가 모두 TRUE이면 TRUE (&& 와 동일)
[ 조건식A -o 조건식B ] : 조건식 A가 TRUE거나 조건식B가 TRUE면 TRUE (|| 와 동일)

조건문 IF 문의 FILE 관련 EXPRESSION A 
[ !${A}   ] : A 파일이 디렉토리면 TRUE
[ -d ${A} ] : A 파일이 디렉토리면 TRUE
[ -e ${A} ] : A 파일이(노드, 디렉토리, 소켓 등등 모두) 존재하면 TRUE
[ -L ${A} ] : A 파일이 심볼릭 링크면 TRUE
[ -r ${A} ] : A 파일이 읽기 가능하면 TRUE
[ -s ${A} ] : A 파일의 크기가 0 보다 크면 TRUE
[ -w ${A} ] : A 파일이 쓰기 가능하면 TRUE
[ -x ${A} ] : A 파일이 실행 가능하면 TRUE
[ -c ${A} ] : A 파일이 Special character file 이면 TRUE
[ -f ${A} ] : A 파일이 디렉토리가 아닌 일반 regular 파일이면 TRUE
[ -S ${A} ] : A 파일이 소켓이면 TRUE

[ ${A} -nt ${B} ] : A 파일 B 파일보다 최신파일이면 참
[ ${A} -ot ${B} ]  : A 파일이 B 파일보다 이전파일이면 참
[ ${A} -ef ${B} ] : A 파일과 B 파일이 같은 파일이면 참

IF문 다양한예제

내부변수

특수변수


  • if 문에 and 연산과 or 연산 추가 
$ vi iftest2.sh
#!/bin/sh
# Author: Jeonghun 

ETH0_OP=`ifconfig | grep eth0 | awk '{print $1}'`
ETH1_OP=`ifconfig | grep eth1 | awk '{print $1}'`

if [ $ETH0_OP == "eth0" ] && [ $ETH1_OP == "eth1" ]
then 
	echo -e "\x1b[1;93m Both of them $ETH0_OP ,$ETH1_OP   \x1b[0m" 
elif [ $ETH0_OP == "eth0" ] || [ $ETH1_OP == "eth1" ]
then 
	echo -e "\x1b[1;93m Either of them $ETH0_OP , $ETH1_OP   \x1b[0m"
else
	echo -e "\x1b[1;93m The other $ETH0_OP , $ETH1_OP   \x1b[0m"
fi

exit 0


expr 과 문자열 조작 예제
  https://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/string-manipulation.html

unary operator expected 문제 
쿼트문제 
  https://devstein.tistory.com/17


1.2 Bash 의 Function 구현 및 다양한 예제  

  • Count 증가시키는 Function 구현

$ vi test2.sh
#!/bin/bash
#   for function example 
#

count=$(( ${count}+1 ))

CNT=0

set_count()
{
     echo "CNT=$((CNT+1))"    
}

while [ $CNT -le 5 ]; do
   set_count
done


  • Sleep이용하여 Trigger Function 예제 (RANDOM사용)
$ cat sensoraging.sh 
#!/bin/bash
#
# for doing test by using GPIO,  not Senors  
# 
# $ vi ./sensorinit.sh
# echo "out" >  /sys/class/gpio/gpio388/direction
#
# $ vi /etc/rc.local 
# sudo -s /home/nvidia/deep_alpr/darknet/sensoraging.sh
#

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LOG_DIR=$HOME/deep_alpr/darknet
cd $LOG_DIR

## J21 Header 
#0 J21-PIN31 (GPIO9_MOTION) GPIO298 -> IRQ366  (FDV30IN FET, Level Shift)
#3 J21-PIN37 (GPIO26)       GPIO388 -> IRQ199  (FDV30IN FET, Level Shift) only test 

TSLEEP=0
FUNCNT=0
LOG=./log/sensoraging_$(date +%Y%m%d-%H%M-%S).log

set_trigger() {
   # for LOG
   TIME=$(date "+%Y-%m-%d %H:%M:%S")  
   echo "TIME=$TIME"   >> $1
   echo "ACTIVE HIGH"  >> $1
   echo "FUNCTION: $2 CNT $3 " >> $1
   echo "TOTAL SLEEP: $TSLEEP" >> $1
   echo "" >> $1
   
   TSLEEP=0

   # Active High
   echo 1 > /sys/class/gpio/gpio388/value
   # 1~4 second (sensor dealy)
   DELAY=`echo $(( RANDOM % (3 + 1 ) + 1 ))`
   sleep $DELAY
   echo 0 > /sys/class/gpio/gpio388/value

}

short_time() {
    # 1 ~ 9 , try count 
    FUNCNT=`echo $(( RANDOM % (8 + 1 ) + 1 ))`

    while [ $FUNCNT -gt 0 ]
       do 
          set_trigger $1 "short_time" $FUNCNT
    
          # 0 ~ 2 , try count 
          SET_SLP=`echo $(( RANDOM % (2 + 1 ) + 0 ))`

          if   [ $SET_SLP -eq 0 ]; then    
             # RANDOM 1~3 second
             RSLEEP=`echo $(( RANDOM % (2 + 1 ) + 1 ))`

          elif [ $SET_SLP -eq 1 ]; then
             # RANDOM 3~5
             RSLEEP=`echo $(( RANDOM % (2 + 1 ) + 3 ))`

          else
             # RANDOM 4~14
             RSLEEP=`echo $(( RANDOM % (10 + 1 ) + 4 ))`
          fi

          TSLEEP=$(($TSLEEP+$RSLEEP))
          sleep $RSLEEP
          FUNCNT=$(($FUNCNT-1))

       done

}


long_time() {
    # 1 ~ 4 , try count 
    FUNCNT=`echo $(( RANDOM % (3 + 1 ) + 1 ))`

    while [ $FUNCNT -gt 0 ]
       do
          set_trigger $1 "long_time" $FUNCNT

          # 0 ~ 2 , try count 
          SET_SLP=`echo $(( RANDOM % (2 + 1 ) + 0 ))`

          if   [ $SET_SLP -eq 0 ]; then
             # RANDOM 15~135 second
             RSLEEP=`echo $(( RANDOM % (120 + 1 ) + 15 ))`

          elif [ $SET_SLP -eq 1 ]; then
             # RANDOM 120~180
             RSLEEP=`echo $(( RANDOM % (60 + 1 ) + 120 ))`

          else
             # RANDOM 180~240
             RSLEEP=`echo $(( RANDOM % (60 + 1 ) + 180 ))`
          fi

          TSLEEP=$(($TSLEEP+$RSLEEP))
          sleep $RSLEEP
          FUNCNT=$(($FUNCNT-1))

       done

}

verylong_time() {
    # 1 ~ 3 , try count 
    FUNCNT=`echo $(( RANDOM % (2 + 1 ) + 1 ))`

    while [ $FUNCNT -gt 0 ]
       do
          set_trigger $1 "verylong_time" $FUNCNT

          # 0 ~ 2 , try count 
          SET_SLP=`echo $(( RANDOM % (2 + 1 ) + 0 ))`

          if   [ $SET_SLP -eq 0 ]; then
             # RANDOM 200~260 second
             RSLEEP=`echo $(( RANDOM % (60 + 1 ) + 200 ))`

          elif [ $SET_SLP -eq 1 ]; then
             # RANDOM 600~660
             RSLEEP=`echo $(( RANDOM % (60 + 1 ) + 600 ))`

          else
             # RANDOM 900~960
             RSLEEP=`echo $(( RANDOM % (60 + 1 ) + 900 ))`
          fi

          TSLEEP=$(($TSLEEP+$RSLEEP))
          sleep $RSLEEP
          FUNCNT=$(($FUNCNT-1))

       done

}

# Simple 
test_modeA() {

while [ 1 ]
  do
    set_trigger $LOG "simple" 0
    # RANDOM 1~6
    RSLEEP=`echo $(( RANDOM % (5 + 1 ) + 1 ))`
    sleep $RSLEEP
    TSLEEP=$(($TSLEEP+$RSLEEP))
  done
}


# Complex 
test_modeB() {

while [ 1 ]
  do
    # 0 ~ 2 select 
    FSEL=`echo $(( RANDOM % (2 + 1 ) + 0 ))`

    if [ $FSEL -eq 0 ]; then
       short_time $LOG 
    elif [ $FSEL -eq 1 ]; then
       long_time $LOG 
    else
       verylong_time $LOG
    fi

  done
} 

#SET 0 for ACTIVE HIGH
echo 0 > /sys/class/gpio/gpio388/value
sleep 1

#simple
test_modeA
#complex
#test_modeB


  • Interrupt 확인 후 Count 진행 

$ cat powercheck.sh
#!/bin/bash
# for checking Power Button and Power Monitor Chip 
#
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LOG_DIR=$HOME/deep_alpr/darknet
cd $LOG_DIR

check_time() {
   time=$(date "+%Y-%m-%d %H:%M:%S")
   echo $time >> $1
   echo "" >> $1   
   return 
} 

check_powerINT() {

   EX_PINT=$PINT   
   PINT=`cat /proc/irq/380/spurious | awk 'NR == 1 {print $2}'` 
   echo "- POWER_INT=$PINT" >> $1
   echo "" >> $1

   if [ $CNT -gt 1 ]; then
       if [ $PINT -ne $EX_PINT ]; then
            time=$(date "+%Y-%m-%d %H:%M:%S")
            echo " TIME = $time " >> $2
            echo " COUNT=$CNT" >> $2
            echo " - POWER_INT= $EX_PINT , $PINT" >> $2
       fi
   fi
}

CNT=0
LOG=./log/power_$(date +%Y%m%d-%H%M-%S).log
LOG_INT=./log/power_$(date +%Y%m%d-%H%M-%S)_int.log
LOG_CHG=./log/power_$(date +%Y%m%d-%H%M-%S)_chg.log

while [ 1 ]
  do 
    echo "COUNT=$CNT" >> $LOG       
    check_time  $LOG 
    check_powerINT $LOG $LOG_INT
    CNT=$(($CNT+1))
    sleep 1
  done



  • RANDOM 사용하는 예제 

$ cat sensoraging.sh
#!/bin/bash
#
# for doing test by using GPIO,  not Senors  
# 
# $RANDOM  Shell에서 RANDOM값 제공 
# if 

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LOG_DIR=$HOME/deep_alpr/darknet
cd $LOG_DIR

## J21 Header 
#0 J21-PIN31 (GPIO9_MOTION) GPIO298 -> IRQ366  (FDV30IN FET, Level Shift)
#3 J21-PIN37 (GPIO26)       GPIO388 -> IRQ199  (FDV30IN FET, Level Shift) only test 
TSLEEP=0
FUNCNT=0
LOG=./log/sensoraging_$(date +%Y%m%d-%H%M-%S).log

set_trigger() {
   # for LOG
   TIME=$(date "+%Y-%m-%d %H:%M:%S")  
   echo "TIME=$TIME"   >> $1
   echo "ACTIVE HIGH"  >> $1
   echo "FUNCTION: $2 CNT $3 " >> $1
   echo "TOTAL SLEEP: $TSLEEP" >> $1
   echo "" >> $1
   TSLEEP=0

   # Active High
   echo 1 > /sys/class/gpio/gpio388/value
   # 1~4 second (sensor dealy)

   DELAY=`echo $(( RANDOM % (3 + 1 ) + 1 ))`
   sleep $DELAY
   echo 0 > /sys/class/gpio/gpio388/value

}

short_time() {

    # 1 ~ 9 , try count 
    FUNCNT=`echo $(( RANDOM % (8 + 1 ) + 1 ))`

    while [ $FUNCNT -gt 0 ]
       do 
          set_trigger $1 "short_time" $FUNCNT
  
          # 0 ~ 2 , try count 
          SET_SLP=`echo $(( RANDOM % (2 + 1 ) + 0 ))`
          if   [ $SET_SLP -eq 0 ]; then    
             # RANDOM 1~3 second
             RSLEEP=`echo $(( RANDOM % (2 + 1 ) + 1 ))`
          elif [ $SET_SLP -eq 1 ]; then
             # RANDOM 3~5
             RSLEEP=`echo $(( RANDOM % (2 + 1 ) + 3 ))`
          else
             # RANDOM 4~14
             RSLEEP=`echo $(( RANDOM % (10 + 1 ) + 4 ))`
          fi
          TSLEEP=$(($TSLEEP+$RSLEEP))
          sleep $RSLEEP
          FUNCNT=$(($FUNCNT-1))
       done

}

long_time() {

    # 1 ~ 4 , try count 
    FUNCNT=`echo $(( RANDOM % (3 + 1 ) + 1 ))`

    while [ $FUNCNT -gt 0 ]

       do
          set_trigger $1 "long_time" $FUNCNT
          # 0 ~ 2 , try count 
          SET_SLP=`echo $(( RANDOM % (2 + 1 ) + 0 ))`

          if   [ $SET_SLP -eq 0 ]; then
             # RANDOM 15~135 second
             RSLEEP=`echo $(( RANDOM % (120 + 1 ) + 15 ))`
          elif [ $SET_SLP -eq 1 ]; then
             # RANDOM 120~180
             RSLEEP=`echo $(( RANDOM % (60 + 1 ) + 120 ))`
          else
             # RANDOM 180~240
             RSLEEP=`echo $(( RANDOM % (60 + 1 ) + 180 ))`
          fi

          TSLEEP=$(($TSLEEP+$RSLEEP))
          sleep $RSLEEP
          FUNCNT=$(($FUNCNT-1))
       done

}

verylong_time() {

    # 1 ~ 3 , try count 
    FUNCNT=`echo $(( RANDOM % (2 + 1 ) + 1 ))`

    while [ $FUNCNT -gt 0 ]
       do
          set_trigger $1 "verylong_time" $FUNCNT
          # 0 ~ 2 , try count 
          SET_SLP=`echo $(( RANDOM % (2 + 1 ) + 0 ))`

          if   [ $SET_SLP -eq 0 ]; then
             # RANDOM 200~260 second
             RSLEEP=`echo $(( RANDOM % (60 + 1 ) + 200 ))`
          elif [ $SET_SLP -eq 1 ]; then
             # RANDOM 600~660
             RSLEEP=`echo $(( RANDOM % (60 + 1 ) + 600 ))`
          else
             # RANDOM 900~960
             RSLEEP=`echo $(( RANDOM % (60 + 1 ) + 900 ))`
          fi
          TSLEEP=$(($TSLEEP+$RSLEEP))
          sleep $RSLEEP
          FUNCNT=$(($FUNCNT-1))
       done

}

# Simple 

test_modeA() {

while [ 1 ]
  do
    set_trigger $LOG "simple" 0
    # RANDOM 1~6
    RSLEEP=`echo $(( RANDOM % (5 + 1 ) + 1 ))`
    sleep $RSLEEP
    TSLEEP=$(($TSLEEP+$RSLEEP))
  done

}

test_modeB() {

while [ 1 ]
  do
    # 0 ~ 2 select 
    FSEL=`echo $(( RANDOM % (2 + 1 ) + 0 ))`
    if [ $FSEL -eq 0 ]; then
       short_time $LOG 
    elif [ $FSEL -eq 1 ]; then
       long_time $LOG 
    else
       verylong_time $LOG
    fi
  done

} 

#SET 0 for ACTIVE HIGH
echo 0 > /sys/class/gpio/gpio388/value
sleep 1

# select following one of two modes 
#Simple Mode
test_modeA

#Complex Mode
#test_modeB



  • awk 와 같이 사용하는 예제
awk를 이용하여 쉽게 각 proc와 sys의 정보를 얻어온 후 이 기반으로 이를 체크 
$ cat sensorcheck.sh
#!/bin/bash
#

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LOG_DIR=$HOME/deep_alpr/darknet
cd $LOG_DIR

check_sensorINT() {
   EX_SINT0=$SINT0   
   EX_SINT1=$SINT1  
   EX_SINT2=$SINT2  
   EX_SINT3=$SINT3  

## J21 Header 
#0 J21-PIN31 (GPIO9_MOTION) GPIO298 -> IRQ366  (FDV30IN FET , Level Shift)
#1 J21-PIN33 (GPIO11_AP)    GPIO389 -> IRQ200  (TXB0108 , Level Shift) 
#2 J21-PIN13 (GPIO_PE6)     GPIO397 -> IRQ208  (TXB0108 , Level Shift) 
#3 J21-PIN37 (GPIO26)       GPIO388 -> IRQ199  (FDV30IN FET, Level Shift) only test 

   SINT0=`cat /proc/irq/366/spurious | awk 'NR == 1 {print $2}'` 
   SINT1=`cat /proc/irq/200/spurious | awk 'NR == 1 {print $2}'` 
   SINT2=`cat /proc/irq/208/spurious | awk 'NR == 1 {print $2}'` 
   SINT3=`cat /proc/irq/199/spurious | awk 'NR == 1 {print $2}'` 
   PINVAL0=`cat /sys/class/gpio/gpio298/value`
   PINVAL1=`cat /sys/class/gpio/gpio389/value`
   PINVAL2=`cat /sys/class/gpio/gpio397/value`
   PINVAL3=`cat /sys/class/gpio/gpio388/value`

#   echo "- PIN31_INT=$SINT0" >> $1
#   echo "- PIN33_INT=$SINT1" >> $1
#   echo "- PIN13_INT=$SINT2" >> $1
#   echo "" >> $1

#### 
#$? 이전에 실행했던 return 값 
#$0 Shell Script name  
#$1 1st ARG
#$2 2nd ARG 
#$3 3rd ARG 
#

   if [ $CNT -gt 1 ]; then

       SINTDIFF0=$(($SINT0-$EX_SINT0))
       SINTDIFF1=$(($SINT1-$EX_SINT1))
       SINTDIFF2=$(($SINT2-$EX_SINT2))
       SINTDIFF3=$(($SINT3-$EX_SINT3))
       time=$(date "+%Y-%m-%d %H%M%S")

       if [ $SINT0 -ne $EX_SINT0 ]; then
            if [ $SINTCNT0 -gt 1 ]; then
               CNTDIFF0=$(($CNT-$EX_CNT0))  

            fi

            echo " TIME = $time " >> $2
            echo " PCNT31=$SINTCNT0  SEC_CNT=$CNT SEC_DIFF=$CNTDIFF0" >> $2
            echo " - PIN31_INT0= ($SINTDIFF0) $EX_SINT0 -> $SINT0" >> $2
            echo " - PIN31_VAL0= $PINVAL0" >> $2

            

            #J21-PIN31 active High

            if [ $PINVAL0 == "1"  ]; then

               echo " - INTERRUPT_PIN31=$PINTCNT0" >> $2
               echo " - TIME = $time " >> $3
               echo " - INTERRUPT_PIN31=$PINTCNT0" >> $3
               echo "" >> $3
               PINTCNT0=$(($PINTCNT0+1))
            fi

            echo "" >> $2
            SINTCNT0=$(($SINTCNT0+1))
            EX_CNT0=$CNT

       fi

       if [ $SINT1 -ne $EX_SINT1 ]; then

            if [ $SINTCNT1 -gt 1 ]; then
               CNTDIFF1=$(($CNT-$EX_CNT1))  
            fi
          
            echo " TIME = $time " >> $2
            echo " PCNT33=$SINTCNT1  SEC_CNT=$CNT SEC_DIFF=$CNTDIFF1 " >> $2
            echo " - PIN33_INT1= ($SINTDIFF1) $EX_SINT1 -> $SINT1" >> $2
            echo " - PIN33_VAL1= $PINVAL1" >> $2
            echo "" >> $2
            SINTCNT1=$(($SINTCNT1+1))
            EX_CNT1=$CNT

       fi

# 
# if -ne 
# 
       if [ $SINT2 -ne $EX_SINT2 ]; then
            if [ $SINTCNT2 -gt 1 ]; then
               CNTDIFF2=$(($CNT-$EX_CNT2))  
            fi
            echo " TIME = $time " >> $2
            echo " PCNT13=$SINTCNT2  SEC_CNT=$CNT SEC_DIFF=$CNTDIFF2 " >> $2
            echo " - PIN13_INT2= ($SINTDIFF2) $EX_SINT2 -> $SINT2" >> $2
            echo " - PIN13_VAL2= $PINVAL2" >> $2
            echo "" >> $2
            SINTCNT2=$(($SINTCNT2+1))
            EX_CNT2=$CNT

       fi

       if [ $SINT3 -ne $EX_SINT3 ]; then
            if [ $SINTCNT3 -gt 1 ]; then
               CNTDIFF3=$(($CNT-$EX_CNT3))
            fi
            echo " TIME = $time " >> $2
            echo " PCNT37=$SINTCNT3  SEC_CNT=$CNT SEC_DIFF=$CNTDIFF3 " >> $2
            echo " - PIN37_INT3= ($SINTDIFF3) $EX_SINT3 -> $SINT3" >> $2
            echo " - PIN37_VAL3= $PINVAL3" >> $2
            echo " - TIME = $time " >> $3
            echo " - 2ND_PIN37_VAL=$PINVAL3" >> $3
            echo "" >> $3

            if [ $PINVAL3 == "0"  ]; then
               echo " - INTERRUPT_PIN37=$PINTCNT3" >> $2
               PINTCNT3=$(($PINTCNT3+1))
            fi

            echo "" >> $2
            SINTCNT3=$(($SINTCNT3+1))
            EX_CNT3=$CNT

       fi

   fi

}

CNTDIFF0=0
CNTDIFF1=0
CNTDIFF2=0
CNTDIFF3=0
SINTCNT0=0
SINTCNT1=0
SINTCNT2=0
SINTCNT3=0
PINTCNT0=0
PINTCNT1=0
PINTCNT2=0
PINTCNT3=0
CNT=0
LOG=./log/sensor_$(date +%Y%m%d-%H%M-%S).log
LOG_INT=./log/sensor_$(date +%Y%m%d-%H%M-%S)_int.log
LOG_INT0=./log/sensor_$(date +%Y%m%d-%H%M-%S)_int0.log
time=$(date "+%Y-%m-%d %H:%M:%S")
echo $time >> $LOG

while [ 1 ]
  do 
    #echo "COUNT=$CNT" >> $LOG
    #time=$(date "+%Y-%m-%d %H:%M:%S")
    #echo $time >> $LOG
    #echo "" >> $LOG
    check_sensorINT $LOG $LOG_INT $LOG_INT0 
    CNT=$(($CNT+1))
    sleep 1
  done


1/04/2014

오드로이드 서버사용

http://www.wsgvet.com/bbs/board.php?bo_table=odroid&wr_id=52

Linux 소스 분석 Tools

1. Linux 소스 분석 Tools

linux에서 사용하는 편집기는 vim를 사용하며, 소스분석을 간편하게 도와 주는 것이
ctags이다. 그리고 이 부족한 부분을 메워주는 것이 cscope인데, 사실 cscope는 잘사용하지 않게되는 것 같다.


2. How To install tools 

 $ sudo apt-get install vim ctags cscope 

편집기 vim과 catag과 csope를 설치하자.


3. CTAGS 생성 및 CSCOPE 파일 생성


 $ cd ~/linux   // kernel 로 이동 
 $ ctags -R    // tags file 생성  
 $ ls -l tags  // tags 생성확인  


 $ cat./mkcscope.sh
#!/bin/sh
rm -rf cscope.files cscope.files
find . \( -name '*.c' -o -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.s' -o -name '*.S' \) -print>cscope.files
cscope -i cscope.files 

$ cd ~/linux        // kernel 로 이동 
$ ./mkcscope.sh     // cscope.file 생성 
$ ls cscope.files   // cscope.file 확인 


4. 관련설정 


$ vi ~/.vimrc
set tags=./tags 
set tags+=~/am437x/works/board-support/u-boot-2014.07+gitAUTOINC+fb6ab76dad-gfb6ab76/tags

set csprg=/usr/bin/cscope

set csto=0 “(숫자 0)
set cst
set nocsverb

if filereadable(“./cscope.out”)
cs add cscope.out
else
cs add /usr/src/linux/cscope.out
endif
set csverb


5. 사용법 

기본적으로 vim에서 연결하여 동작하도록 하며, 아래와 같이 명령을 주어 사용한다.

5.1 CTAGS 기본 사용법

 
Ctrl+]          :  커서에 위치한 정의된 함수로 이동 
Ctrl+t          :  이전위치로 이동 
:ts keyword     :  keyword와 일치하는 태그목록 출력하고 선택한다
:tj keyword     :  ts와 동일하지만 목록이 한개일 경우 해당태그로 이동, 두개 이상 출력
:sts keyword    : tj와 유사하나 새창에 관련정보 출력  
:ta /keyword    :  keyword가 포함된 태그를 검색

:tn             : 다음 태그 이동
:tp             : 이전 태그 이동
tags            : 이동한 태그 히스토리 출력 

5.2 CSCOPE 기본 사용법 

 
:cs help
:cs find c symbol

:cs help
syntax on  : 구문강조 기능 사용
cscope 명령:
add  : 새 데이터베이스 더하기         (사용법: add file|dir [pre-path] [flags])
find : Query for a pattern            (사용법: find c|d|e|f|g|i|s|t name)
       c: 이 함수를 부르는 함수들 찾기
       d: 이 함수에 의해 불려지는 함수들 찾기
       e: 이 egrep 패턴 찾기
       f: 이 파일 찾기
       g: 이 정의 찾기
       i: 이 파일을 포함하는 파일들 찾기
       s: 이 C 심볼 찾기
       t: 이 문자열 찾기
help : 이 메시지 보이기               (사용법: help)
kill : 연결 끊기                      (사용법: kill #)
reset: 모든 연결 다시 초기화          (사용법: reset)
show : 연결 보여주기                  (사용법: show)


https://ysoh.wordpress.com/2012/04/09/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%BB%A4%EB%84%90-%EA%B0%9C%EB%B0%9C%EC%9D%84-%EC%9C%84%ED%95%9C-vim-%EC%84%A4%EC%A0%95-vimrc/

http://treetale.iptime.org/wordpress/946

1/03/2014

kernel version

version 확인

http://jmnote.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EC%BB%A4%EB%84%90_%EB%B2%84%EC%A0%84_%ED%99%95%EC%9D%B8



http://www.morenice.kr/m/post/view/id/71

Android 의 envsetup.sh 기본사용법

1. Android Build 

Android 는 envsetup.sh이라는 shell script 이용하여, 전체빌드 및 부분빌드, 다양한 shell 기능을 제공한다.


1.1 Android 전체빌드의 예제 (ODROID X2 )

  1. envsetup을 설정
  2. lunch로 환경설정
  3. make 

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

  • lunch 시 설정 
  1. odroidx2-user : 최종제품으로 엑세스를 제한
  2. odroidx2-userdebug:  user 기능에 디버깅기능을 추가 및 root 액세스가 가능하여 디버깅용
  3. odroidx2-eng : 디버깅 추가 도구 

Google Android Build 


2. build/envsetup.sh 의 기능 

envsetup.sh는 android에서 제공하는 shell script로 안에 기본 function들을 제공하고 있으며, vendorsetup 관련부분도 봐야한다. 

  • source build/envsetup.sh 실행시 
odroidx2를 vendor를 등록한 것을 확인이 가능 (lollipop version)

$ . build/envsetup.sh
including device/lge/hammerhead/vendorsetup.sh
including device/lge/mako/vendorsetup.sh
including device/htc/flounder/vendorsetup.sh
including device/moto/shamu/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/hardkernel/odroidx2/vendorsetup.sh
including device/hardkernel/odroidu/vendorsetup.sh
including device/hardkernel/odroidx/vendorsetup.sh
including device/samsung/manta/vendorsetup.sh
including device/asus/fugu/vendorsetup.sh
including device/asus/flo/vendorsetup.sh
including device/asus/deb/vendorsetup.sh
including device/asus/tilapia/vendorsetup.sh
including device/asus/grouper/vendorsetup.sh
including sdk/bash_completion/adb.bash 

lunch에 등록시 odroidx2-userdebug 와 odroidx2-eng 설정등록다름

$ cat device/hardkernel/odroidx2/vendorsetup.sh 
add_lunch_combo odroidx2-userdebug
add_lunch_combo odroidx2-eng




1.1 빌드환경 설정 (choosecombo, lunch)

Android의 빌드환경을 설정해주는 도구로, choosecombo는 아직 사용못해봄.
등록된 vendor 정보로 나의 환경을 설정

$ lunch odroidx2-eng
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.1
TARGET_PRODUCT=odroidx2
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=cortex-a9
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.2.0-67-generic-x86_64-with-Ubuntu-12.04-precise
HOST_BUILD_TYPE=release
BUILD_ID=LMY47I
OUT_DIR=out
============================================ 

Android Device 의 Makefile과 환경설정설명 참고자료
  http://elinux.org/Android_Device   

cgrep/jgrep/lunch 등 관련부분 설명
  http://chlrbgh0.tistory.com/207

세부동작은  build/envsetup.sh 개별 function을 참고
  1. lunch function 참조
  2. choosecombo function 참조

1.2 build 방법  

부분빌드 사용법은 전체빌드와 동일하며,  build /envsetup 설정 한 후  각 function을 이용가능하다.
세부동작은  build/envsetup.sh 개별 function을 참고

  1. - 현재 경로를 기준으로 소스 트리의 최상위 경로로 이동한 후 make를 실행해준다.
  2. mm - 현재 경로를 기준으로 가장 가까운 단위 모듈을 찾아서 그 모듈만 build 해준다.
  3. mmm - 파라미터로 주어진 경로들에 대해 단위 모듈 build를 해준다. 마지막에 snod를 추가할 경우 System image 파일까지 새로 생성해준다 

  • hmm 으로 각 사용법 확인 

$ hmm
Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
- lunch:   lunch -
- tapas:   tapas [  ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user]
- croot:   Changes directory to the top of the tree.
- 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.
- 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.
- sgrep:   Greps on all local source files.
- godir:   Go to the directory containing a file.  


아래내용참조.
  http://www.kaisyu.com/notes/google-android/android-envsetupsh
  http://www.kaisyu.com/notes/google-android/android-partial-module-build

  • 부분빌드 적용예 (ODROID 적용)
  1. 먼저 관련 directory 이동  
  2. build/envsetup.sh 위치를 찾고 source envsetup.sh 설정 (source 대신 . 사용가능)
  3. 부분빌드 시도. (mm)

$ . ../../build/envsetup.sh
$ mm

make: *** No rule to make target `out/target/product/generic/obj/SHARED_LIBRARIES/libc_intermediates/export_includes', needed by `out/target/product/generic/obj/SHARED_LIBRARIES/libiw_intermediates/import_includes'.  Stop.

$ find  out  -name libc_intermediates

out/target/product/odroidx2/obj/SHARED_LIBRARIES/libc_intermediates
out/target/product/odroidx2/obj/STATIC_LIBRARIES/libc_intermediates


  • ODROID는 에러가 나서, Main root에서 아래와 같이 실행

$ source build/envsetup.sh
$ export TARGET_PRODUCT=odroidx2
$ mmm /external/wireless-tools

  http://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=freeboard&kind=&bid=104

Audio-ALSA OMAP Framework

1. OMAP 기본 ALSA 구성 

다음은 OMAP의 기본 ALSA  기본 Framewor이며, 기존 Audio Driver와 다른것이 있다면,HDMI와 확장형 Controler가 많다. 
사실 직접 일했을 때 Source를 분석을 했어야 했는데, 지금 간단히 정리한다.



아래 사이트에 가면 OMAP과 Codec의 설명이 잘 나오며, 기존 Davinchi Series와 차이점이라면, PMIC 사용 및 McPDM지원, HDMI 지원 등이다.
전에는 HDMI 때문에 SiliconImage사의 Chip도 사용을 하고 했는데, OMAP은 편해진것 같다.
OMAP에 대한 Audio관한  HW 정보 및 구성은 아래에서 확인하자.


  • OMAP Audio Framework 및 기본구성정보
http://omappedia.org/wiki/Audio_Drive_Arch


  • ALSA SOC 과 ALSA 부분 Link 
http://omappedia.org/wiki/Audio_Developers_Info


  • Pulse Audio 관련 (아직 사용못해봄)
  https://wiki.archlinux.org/index.php/PulseAudio
  http://omappedia.org/wiki/Ubuntu_PA
  https://www.freedesktop.org/wiki/Software/PulseAudio/

  • OMAP 관련 Audio 전체 설명 (상위 부분 Link)
  http://omappedia.org/wiki/Audio_Drivers_Domain_Wiki


2. OMAP Android Info


  • OMAP Ref
  http://www.ti.com/pdfs/wtbu/OMAP4430_4460_4470_PUBLIC_TRM_Addendum_ABE_HAL_vH.pdf
  http://omappedia.org/wiki/4AI.1.5_OMAP4_ICS_Blaze_AIC_AIC3262_SW_Release3c


  • Android HAL
  http://source.android.com/devices/audio_implement.html


3. OMAP 관련 LINK

  • OMAP 관련부분 Link
  http://omappedia.org/wiki/Linux_OMAP_Kernel_Main

  • OMAP Gstreamer
  http://omappedia.org/wiki/Gstreamer_Project_Main

1/02/2014

Fastboot 사용 및 Linux에서 Image Control

1. Fastboot  기본설명 

처음에 Fastboot 사용법을 정확히 숙지하지 못해, 좀  당황했는데  이제 좀 알겠다.
uboot에서 fastboot 모드로 진입을 하여, 윈도우에서 연결하여 이를 사용하는 방식이다.
그래서 uboot에서 fastboot를 제공하지 않으면 이를 실행할 수가 없다.

핸드폰 일 경우, 볼륨다운+전원버튼을 기기가 켜질때까지 누르고 있으면, 화면이
바뀐다고한다. 이를 bootloader모드라고 하며 이때 window에서 역시 접근이 가능하다.



2. U-BOOT에서 FASTBOOT MODE 설정 ( bootloader 모드)

아래와 같이 uboot에서 fastboot command를 입력 후 fastboot 모드로 진입이 되며,
Window의 fastboot 연결을 기다린다.

U-Boot 2010.12-svn (Nov 28 2012 - 11:35:59) for ODROID4412


CPU: S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9]
APLL = 1000MHz, MPLL = 880MHz
DRAM:  2 GiB

PMIC VERSION : 0x00, CHIP REV : 2

BL1 version: N/A (TrustZone Enabled BSP)


Checking Boot Mode ... SDMMC
MMC Device 0: 7695 MB
MMC Device 1 not found
*** Warning - using default environment

ModeKey Check... run normal_boot 
Net:   No ethernet found.
Hit any key to stop autoboot:  0 
ODROID4412 # 
ODROID4412 # fastboot
[Partition table on MoviNAND]
ptn 0 name='fwbl1' start=0x0 len=N/A (use hard-coded info. (cmd: movi))
ptn 1 name='bl2' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 2 name='bootloader' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 3 name='tzsw' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 4 name='kernel' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 5 name='ramdisk' start=N/A len=0x1000000(~16384KB) (use hard-coded info. (cmd: movi))
ptn 6 name='system' start=0x43D2200 len=0x380BDE00(~918263KB) 
ptn 7 name='userdata' start=0x3C490000 len=0x400D9000(~1049444KB) 
ptn 8 name='cache' start=0x7C569000 len=0x801B200(~131180KB) 
ptn 9 name='fat' start=0x84584200 len=0x4C87BE00(~1253871KB) 
Insert a OTG cable into the connector!




Fastboot 기본사용법
https://github.com/red-root/PortingARMLinux/wiki/Fastboot-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95
http://www.jinhaesi.com/bbs/skin/ggambo7002_board/print.php?id=jaewonquestion&no=62


3. Fastboot 기본 사용법

Android Device의 Flash를 Erase,Write 및 Reboot  조절이 가능하다.
  • fastboot --help  기본사용법

fastboot 

command :

  • flash [ ] :  해당파일을 partition에 write한다.
  • erase                      : partition 을 지운다.
  • format                     : partition을 format 한다.
  • boot [ ]     : 해당 kernel와 ramdisk를 download한 후 boot한다.  
  • devices                                    :  연결된 device list를 보여준다.

options:
  •  -w :   erase userdata and cache

기본예제들
 
기본이미지 write

   fastboot flash kernel arch/arm/boot/zIamge
   fastboot flash kernel arch/arm/boot/zImage
   fastboot flash ramdisk out/target/product/odroidx2/ramdisk-uboot.img
   fastboot flash system out/target/product/odroidx2/system.img


 
Ref.  (omap에서 사용하는 fastboot )
http://omappedia.org/wiki/Android_eMMC_Booting


Ref.
http://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=odroidx&kind=&bid=1564


4. Linux 에서 Image Control 


dd 명령어 사용

  • if         = input file
  • of        = output file 
  • iflag     = input flag, direct 와 dsync 있다.
  • oflag    = output flag 
  • seek    =  output file 시작 위치 기준으로 block 단위로 넘어간다. 
  • skip     =  input file 시작 위치   기준으로 block 단위로 넘어간다.   
  • bs       =  한번에 처리할 bytes, 이를 block   ( ibs , obs 개별 설정도 가능)
  • count  =  이를 몇번 처리할 총 횟수    ( bs * count  용량계산 512x32 =  16k bytes)
                   
# sudo dd iflag=dsync oflag=dsync if=./u-boot-bl1.bin of=/dev/sdb seek=1  
  // u-boot-bl1.bin 파일을 /dev/sdb 에 1부터 write

# sudo dd iflag=dsync oflag=dsync if=./u-boot.bin of=/dev/sdb seek=33 
  // u-boot.bin 파일을 /dev/sdb에 33block부터 write 

# sudo dd iflag=dsync oflag=dsync if=/dev/zero of=/dev/sdb bs=512 count=32 
 //  /dev/sdb를 16k (512 x 32 ) 만큼 지운다.                

# dd iflag=dsync oflag=dsync if=./dump-img.img of=/dev/sde bs=512 count=1024
 //512kbyt 만큼 /dev/sde에 dump-img.img write

# dd iflag=dsync oflag=dsync of=./dump-img.img if=/dev/sde bs=512 count=1024 
 //512kbyt 만큼 /dev/sde에 dump-img.img read

# dd if=/dev/mtd2 of=./default_env.img 
 // 기본적인 read

http://www.thomas-krenn.com/en/wiki/Linux_I/O_Performance_Tests_using_dd

http://www.mapoo.net/entry/dd-%EC%98%88%EB%A5%BC-%ED%86%B5%ED%95%9C-%EC%98%B5%EC%85%98%EC%9D%98-%EC%9D%98%EB%AF%B8

http://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=odroidq2&kind=&bid=2482


기타 명령어

  #  eraseall /dev/mtd3
  #  hexdump -C default_env.img | more


http://forum.falinux.com/zbxe/index.php?document_srl=561988&mid=lecture_tip

http://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=odroida&kind=9&bid=563

http://blog.naver.com/PostView.nhn?blogId=dong880510&logNo=140162582089
http://www.vim.org/vimscriptlinks.php







안드로이드 소스구조

1. Android Source구조 

Android File system의 구조

├── abi
├── bionic                  : bionic libc(BSD의 libc 수정)를 포함 (glibc, uclibc사용안함)
├── bootable                : bootloader, recovery mode 관련 코드
├── build                   : 빌드 관련 스크립트를 저장
│   ├── envsetup.sh        : 환경 정보 설정 파일, 제조사의 Flag들에 대한 설정을 함
│   ├── core
│   │   │
│   │   └── prelink-linux-arm.map : shared library들이 로딩되는 번지를 미리 지정한 파일
│   └── target
│     └── board
│           └── generic
│                 ├── AndroidBoard.mk    : 최상위 directive 파일, Android 최종 결과물
│                 │                          구성서 자동 포함 bin에 대한 install을 결정
│                 │                          init.rc, init%hw%.rc 들을 install
│                 └── BoardConfig.mk     : HAL의 en/disable 등을 결정
├── cts                     : Compatibility Test Suite, GMS를 탑재 위해 통과해야 하는 Test
├── dalvik                  : dalvik VM 관련 소스 코드
├── development             : 개발용 application을 저장
├── device                  : 칩 관련 설정 파일 및 디버깅을 위한 cmm 파일 등을 포함
├── external                : Android에서 사용되어지는 Library 및 Tools 관련 소스코드
│     
├── frameworks
│   ├── base               : Android Framework Source Code
│   ├── cmds               : binder 관련된 service manager 소스 코드 및 여러 가지 command
│   ├── libs               : Android baselibrary(AudioFlinger,SurfaceFlinger, util, binder 등)
│   ├── media              : media 관련 Client & Service 라이브러리
│   └── policies           : Android 시스템을 background에서 제어하는 최상위 application
│                               KeyGuard 관련, 화면 제어(rotation..), event 관리 등의 작업 처리
├── hardware                : Android에서 사용하는 h/w 관련 소스 코드 포함(HAL, include..)
│   ├── libhardware        : Board H/W 의존성이 높은 하드웨어 모듈 포함
│   └── libhardware_legacy : 일반적으로 Android에 반드시 있어야 하는 H/W 모듈(audio,wifi..)
├── packages                : Android 기본 Application 소스 코드를 포함
├── pdk
├── prebuilt                : 툴체인과 미리 빌드되어 들어가는 바이너리 파일 포함
├── system                  : Android의 기본 바이너리 소스 코드(init…)
│   ├── core
│   │    ├── init         : Android init 소스 코드
│   │    └── vold         : external storage 제어 모듈 (Éclair)
│   └── vold               : external storage 제어 모듈 (Froyo/Gingerbread)
└── vendor                  : vendor specific code(HAL, product list 관리…)



소스출처
  http://taehyo.egloos.com/4073971
  http://dplex.egloos.com/m/4268602


  • Android 관련 모든 소스 
Android의 관련 모든 Repository를 볼수 있으므로 가능하면 이곳에서 찾아 보자.


  • Android Platform 관련 Source  
상위 구조는 아래의 repository에서 볼수 있고 파악가능하지만, 전체를 보려면 역시 상위를 참조하자.

  https://android.googlesource.com/platform/
  https://android.googlesource.com/device/



  • Android Uboot/Kernel Source 
Android의 다양한 Version 때문에 Kernel의 소스와 Uboot 소스 위치는 다른 것 같으며, 개별소스에서 파악하자. 

  https://android.googlesource.com/kernel/

TI의 Beagle
  https://android.googlesource.com/device/ti/bootloader/uboot/
  https://android.googlesource.com/device/ti/beagle-x15-kernel/

NXP의 IMX
  https://android.googlesource.com/platform/hardware/bsp/bootloader/nxp/uboot-imx/


  • Android Trace32 CMM Script 관련사항 

상위에서 device에서 trace32의 cmm script를 언급하였는데, 이에 관련해서 사용법을 간단히 익혀보자.

  https://m.blog.naver.com/PostView.nhn?blogId=yyg1368&logNo=60119956109&proxyReferer=https%3A%2F%2Fwww.google.com%2F

Trace32의 CMM script 파일 관련사항
  http://trace32.com/wiki/index.php/%EB%94%94%EB%B2%84%EA%B9%85_%EC%8B%9C_%EC%9C%A0%EC%9A%A9%ED%95%9C_%EB%AA%85%EB%A0%B9




1.1 Build 후 OUT Directory 구조.



out/
|-- host/                    # (HOST PC) the directory containing all tools and libraries of build system
|                                     
 -- target/product/generic/         # (TARGET) the root of this product's out directory
    |-- data                        # the directory for creating data file system image
    |-- obj                         # the root directory of build process
    |   |-- APPS                    # android application
    |   |-- ETC
    |   |-- EXECUTABLES             # the root directory containing all native executable 
    |   |                             build output
    |   |-- include
    |   |-- JAVA_LIBRARIES
    |   |-- lib                     # the directory containing copies of stripped
    |   |                             shared libraries,
    |   |                           # other modules will search this directory 
    |   |                             for libraries to resolve linkage
    |   |-- PACKAGING
    |   |-- SHARED_LIBRARIES        # the root directory containing all native 
    |   |   |                          shared library build output
    |   |   |-- {LOCAL_MODULE_NAME}_intermediates    # the direcotry containing 
    |   |       |                     all build output for {LOCAL_MODULE_NAME} module.
    |   |       |                   #  this naming convention is followed by 
    |   |       |                      all subdirectories of module.
    |   |       + -- LINKED         # the directory containing the linked binary 
    |   |                             file, e.g, .so file
    |    -- STATIC_LIBRARIES        # the root directory containing all native 
    |                                 static library build output
    |-- root                        # the directory for creating root file system
    |   |                            ,ramdisk image
    |   |-- data
    |   |-- dev
    |   |-- proc
    |   |-- sbin
    |   |-- sys
    |    -- system
    |-- symbols                     # the directory contains all binary images that has 
    |   |                              debugging symbols
    |   |-- data
    |   |-- sbin
    |    -- system
     -- system                      # the directory for creating system.img, where most of
        |                            appications and libraries reside
        |-- app
        |-- bin
        |-- etc
        |-- fonts
        |-- framework
        |-- lib
        |-- media
        |-- tts
        |-- usr
         -- xbin

Ref.
  http://rxwen.blogspot.kr/2013/01/understanding-android-build-system-out.html


  • out/ 구조 
  1. host : Host Computer를 위한 것들 
  2. target : Target Device or Emulator를 위한 것들  



  • out/target/product/  의 Image 구조 
platform-name: armemus or x86emu or beaglebone 등 platform에 따라 달라지며, 최종 output image들 
  1. boot.img
  2. system.img
  3. ramdisk.img
  4. userdata.img
- out/target/product//obj

기본으로 /out 으로 생성이 되지만  아래처럼 변경이 가능

export OUT_DIR_COMMON_BASE=

Using a separate output directory 참조
  https://source.android.com/setup/build/initializing
  https://elinux.org/Android_Build_System


2. Android Version 정보


Android Version 별 정보 및 특징
  http://en.wikipedia.org/wiki/Android_version_history
  http://ko.wikipedia.org/wiki/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C_%EB%B2%84%EC%A0%84_%EC%97%AD%EC%82%AC

1/01/2014

ODROID Android Build 시 문제사항 및 해결

1. ODROID에서 개발환경설정 

  • Download
Odroid의 사이트의 BSP소스 에서  Download

  • Ubuntu 12.02 개발환경설정 
  https://ahyuo79.blogspot.com/2013/12/android-build-environment2.html


FOR HDMI OUT SEETING.
  http://dn.odroid.com/Android_Beta_1.6/resolution_set/

ODROID- U-BOOT 와 Kernel BUILD  설명 SITE
  http://dev.odroid.com/projects/ics/#s-6.4

ODROID-ANDROID BUILD
   http://dev.odroid.com/projects/howtobuild4

2.1 How To build UBOOT 

ODROID Uboot Build 및 문제사항 정리 

$ cd u-boot-odroid-v2010.12 
$ make distclean 
$ make smdk4412_config
$ make CROSS_COMPILE=arm-none-eabi-

  • Uboot Build 에러사항 및 해결방법
   {standard input}:85: Error: unknown pseudo-op: `.arch_extension'
   {standard input}:168: Error: unknown pseudo-op: `.arch_extension'
해결방법.
$ vi board/samsung/smdk4212/smc.c 
       ## .arch_extension 주석처리 

참고자료
  http://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=odroidq2&kind=&bid=3628


2.2 How To build Linux KERNEL 

ODROID Kernel Build 및 문제사항 정리 

  • Kernel Build 후 mkimage 사용을 위해 설치
$ sudo apt-get install uboot-mkimage 


$ cd kerenl_4412

$ make ARCH=arm odroidx2_android_sdmmc_defconfig   //====> ODROID-X2 (SD Boot)
or
$ make ARCH=arm odroidx2_android_emmc_defconfig   //====> ODROID-X2 (eMMC Boot)

$ make ARCH=arm CROSS_COMPILE=arm-none-eabi-


Ref. uboot, kernel,flash images.
  http://dev.odroid.com/projects/ics/#s-6.4


3. Android Build 

ODROID에서는 별도의 Shell Script을 지원을 해주고 있어서 아래와 같이 실행하며 Build가 정상적으로 동작이 된다.


== odroid - X2 ==
$ 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 

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


3.1 odroid recommend

odroid에서 JDK version 문제 에러 발생시, 우선 package index update 후

$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu/ jaunty multiverse"
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu/ jaunty-updates multiverse"
$ sudo apt-get update
$ sudo vi /etc/apt/sources.list


3.2  Android Build 중 문제사항 정리 

빌드 중 JDK문제로 인하여  여러 JDK를 설치 했으며, 이를 변경하며 테스트

  • Android Build 에러사항-1
make: *** [out/target/common/obj/APPS/Calculator_intermediates/classes-full-debug.jar] 오류 41
Android Build 해결방법-1
Open JDK 삭제 후 Sun사 JDK 설치후  JAR 설정 변경

$ sudo update-alternatives --config jar
*2번으로 변경

대체 항목 jar에 대해 (/usr/bin/jar 제공) 2개 선택이 있습니다.

  선택       경로                           우선순  상태
------------------------------------------------------------
* 0            /usr/bin/fastjar                  100       자동 모드
  1            /usr/bin/fastjar                  100       수동 모드
  2            /usr/lib/jvm/java-6-sun/bin/jar   63        수동 모드

  • Android Build 에러사항-2
상위와 같이 변경했지만, 해결되지 않고 아래의 다른 에러원인을 분석.
classpath에  문제발생하여 odroid를 보니 path가 나와 다르기에 이를 변경.

bad class file: android/app/Activity.class(android/app:Activity.class)

unable to access file: corrupted zip file

Please remove or make sure it appears in the correct subdirectory of the classpath.

import android.app.Activity;
Android Build 해결방법-2
$ mkdir ~/mydroid
$ cp -a android ~/mydroid/


Ref.
  http://blog.daum.net/cortex/269
  http://codewalkerster.blogspot.kr/2011/11/android-openjdk-vs-sun-jdk-build.html


  • Android Build 에러사항-3
/bin/bash: xsltproc: 명령어를 찾을 수 없음

Android Build 해결방법-3
$ sudo apt-get install xsltproc