vmware에 ubuntu 운영체제에 안드로이드 소스 설치후에 소스를 볼라면, vi와 cscope의 달인이 아니면 보기가 너무 힘들다.  그래서, 삼바 서버를 설치해두면 두고 두고 쓰기 편하다.

삼바를 설치후, 소스 보는 것이 편해진다.



삼바 설치

$ sudo apt-get install samba smbfs

삼바 환경설정

$ sudo gedit /etc/samba/smb.conf
#   security = user
-> (수정)
   security = user

 

# By default, the home directories are exported read-only. Change the
# next parameter to 'no' if you want to be able to write to them.
;   read only = yes
-> (추가)
# By default, the home directories are exported read-only. Change the
# next parameter to 'no' if you want to be able to write to them.
;   read only = yes
writable = yes


;   create mask = 0700
-> (수정)
   create mask = 0700

;   directory mask = 0700
-> (수정)
   directory mask = 0700

;   valid users = %S
-> (수정)
   valid users = %S



#======================= Share Definitions =======================
바로 밑에 추가


[root]
comment = Root
path = /
browable = yes
writable = yes





환경 설정 확인
root 계정 접근을 확인한다.

$ sudo testparm


....
[root]
 comment = Root Directory
 path = /
 valid users = %S
 read only = No
 create mask = 0700
 directory mask = 0700

......


패스워드 설정

$ sudo smbpasswd -a root
New SMB password:
Retype new SMB password:
Added user root.


ip 확인

$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0c:29:ff:fb:0a 
          inet addr:192.168.150.128


리눅스에서 나와 윈도우 탐색기에서 접근
패스워드는 smbpasswd에서 입력한 계정 paswd 가능하다.





repo로 받은 안드로이드 소스 보기가 편하다..




* 예전(7,8년 전)에는 삼바 설정 파일 수정후에 삼바 데몬을 재시작했는데..
ubuntu 에서 설치후에는 samba 설정 파일만 수정하면, 알아서 자동으로 읽는다.. 완전 신기.
그리고, 속도도 빨라졌다. 삼바가 이렇게 좋아질 줄이야!!!



그리고, 이클립스를 이용해서 소스를 확인할 때 볼 수 있는 소스를 복사해서 사용한다.
framework/base/core/java 밑에 있는 파일을 로컬로 복사한다. 그리고, 이클립스에서 안드로이드 소스에 해당되는 곳에 F3를 눌러 복사한 folder 로 지정하서 소스를 보면 끝..

\\ip\안드로이드소스받은위치\frameworks\base\core\java


네트웍 드라이드 연결을 할 수 도 있다.
윈도우 탐색기->도구->네트웍드라이브 연결

드라이브이름과 , \\192.168.158.128\root\work 각각 넣어주고 엔터하면 접근된다.

Posted by '김용환'
,

android 타겟이 arm이라서 x86도 포팅하면 재미있겠다하는 생각이 들었는데. 이미 그런게 있었다. 흘~

android-x86 (http://www.android-x86.org)이라는 싸이트에서 참조해서 진저 브레드용 안드로이드를 올려보았다. 아직 싸이트에서는 2.3 진저브레드 iso 파일이 없어서 직접 소스 컴파일을 해보았다. 


$ mkdir android-x86
$ cd android-x86
$ ~/bin/repo init -u git://git.android-x86.org/manifest.git -b gingerbread-x86
$ ~/bin/repo sync 
$ make iso_img TARGET_PRODUCT=generic_x86

(컴파일시간은 엄청 걸림)

$ ls  out/target/product/generic_x86/generic_x86.iso 
out/target/product/generic_x86/generic_x86.iso




generic_x86 을 파일을 vmware를 이용해서 읽게 한다.

 







특징적인 것은 일부 구글 앺인 market이 없다는 게 (정확히는 몰라서..  정책때문에 그런가?? 싶기도 하고) App store 같은게 있기는 한데, 활성화는 안되었다. 

2.3 진저브레드는 좀 불안한거 같다. App Store에 받은 어플리케이션이 실행이 안되고 crash되는 부분이 조금 있다. 

2.2가 그나마 안정적인듯 하다. 

일반 어플리케이션이 동작이 안되는 이유를 발견했는데. 그것은 어플리케이션이 arm library에 dependent (/lib/armeabi/libW2A-jni.so) 한 부분이 있다. 그래서 x86에서는 동작이 되지 않된 것 같다. 



Posted by '김용환'
,

ubuntu 11.04 (내가 제일 좋아하는 ubuntu 버전)에서 android gingerbread(진저브레드)  소스 컴파일에 대한 정보이다.
 인터넷에서 검색하면 예전 버전들이 많았다. git repository 위치도 달라서 그냥 다 될 것이라는 기대는 하면 안된다. 공식싸이트(http://source.android.com/source/downloading.html)가 그나마 가장 신뢰해야한다는 생각을 다시 하게 되었다. 

구글에 올라온 정보가 약간 틀려서, 조금 수정했다. 

$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

$ sudo apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev  ant gcc-multilib g++-multilib

$ mkdir ~/bin
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo

$ chmod a+x ~/bin/repo

$mkdir my-android

$ cd my-android

나는 진저 브레드 브랜치로 다운받음
$  ~/bin/repo init -u https://android.googlesource.com/platform/manifest -b  gingerbread
($ ~/bin/repo init -u https://android.googlesource.com/platform/manifest 이렇게 해서 받을 수도 있지만, 

$ ~/bin/repo sync
check out 받는 거라 시간이 많이 소요됨

$  source build/envsetup.sh

$  lunch full-eng


빌드과정이라 시간이 많이 소요됨. 4cpu를 다쓸 수 있게 설정함.
$ make -j4

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.3.7
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=GINGERBREAD
============================================

 

디폴트는 타겟이 arm 기반이라서 안드로이드를 ubuntu에서 돌릴 수 없으나, 잘 바꾸면 돌아갈 수도 있을 것 같다. 





ramdisk.img,  system.img, userdata.img  파일이 빌드 결과물에 있다.
ramdisk.img 는 개발할때 root fs를 ram에서 실행하기 위해서 필요하다.
system.img는 안드로이드 플랫폼용 이미지이다.
userdata.img는 임베디드 어플단 이미지이다.

이렇게 이미지를 나누어서 flash에 구워진다.

이외,  root.img가 만들 수 있는데. 이는 root 디렉토리를 이미지화한 것으로 '/'를 의미한다. 즉 부팅에 대한 초기화 내용이 들어가 있다.
시스템에서는 root/init.rc에 정보를 읽을 것이다.


/system 은 system.img, /data는 userdata.img, 나머지 /는 root.img 을 의미한다.
그래서 안드로이드 파일 시스템 구조는 이렇게 구성이 된다.




(http://blog.naver.com/PostView.nhn?blogId=limpe&logNo=20115813026&redirect=Dlog&widgetTypeCall=true 그림만 참조)


재미있는 것은  root/init.goldfish.rc 파일도 볼 수 있는데, 이는 가상의 하드웨어의 이름이다. init.xxx.rc 파일은 하드웨어 vendor에 따른 초기화를 의미한다 .

arm9기반에서 동작되는 것처럼 지원하는 초기화 이름을 goldfish 라고 해서 사용되고 있는데, 이 파일이 init.goldfish.rc 파일이다.


Posted by '김용환'
,


EMF Dectector 라고 검색하면 나오는 동영상을 보면서 나도 이런 측정기가 있으면 좋겠다고 생각했는데, 이번에 함 만들어보았다.
http://www.youtube.com/watch?v=y1Bke3750WE


아두이노를 가지고, 아주 간단하게 만든 전자파(전자기파) 측정기(emf detector)를 만들었고,
내가 속한 환경에서 전자파가 얼마나 나오는지를 알고 싶었다. 결과는 상당히 충격적이었다.

모니터, pc, 선풍기, 전화기, 핸드폰(iphone), 갤탭 7인치에서는 검출되지 않았다.
일부 충전중인 아이폰에서는 전자파가 나왔다.

충전하는 노트북과 전원 연결, 어댑터에서는 조금 전자파가 나오는지 확인할 수 있었다. 1/10~3/10 정도였다. 또한, 휴텍스의 이온파크 송풍기에서 검출되었다. 
 
충전하는 노트북을 이 전자파 측정기로 살펴보았더니, 델, HP, 애플 최신 노트북, acer/eeepc 구형 노트북에서 발생되는 것을 확인했다. 특히 애플은 알루미늄때문에 그런지 아주 잘 잡힌다.

구형 소니 바이오 노트북, 신형 레노보 노트북, 신형 삼성, 신형  LG 노트북에서는 전자파가 발생되지 않았다.
(노트북이 진열된 곳에서 검사해봤다. 정확한 모델명은 잘 모르겠음..ㅎ )


전자기파를 0~1023까지의 숫자로 표현한다면 10~20% 정도가 근처에서 나왔다고 보면 된다.
애기와 산모등은 최대한 전원 어댑터와 노트북으로부터 피하는 것이 좋은 것 같다는 생각을 하게 되었다. 


실제로 만든 간단한 detetor이다.




아이폰 동영상을 반대로 해서 찍었지만, 대충. 이렇게 쓰일 수 있다는 의미로 보면 될 것이다.





소스를 공유한다.

fritzing 소스는 (아두이노 설계 프로그램 정도로 보면 된다. http://fritzing.org/ 참조 )
설계 파일은 아래 링크에서 다운받으면 된다.



 




아두이노 소스는 다음과 같다.

#define NUMREADINGS 10 // raise this number to increase data smoothing

int senseLimit = 10; // raise this number to decrease sensitivity (up to 1023 max)
int probePin = 5;
int val = 0;

int readings[NUMREADINGS];                // the readings from the analog input
int index = 0;                            // the index of the current reading
int total = 0;                            // the running total
int average = 0;                          // final average of the probe reading

int updateTime = 50;

byte seven_seg_digits[10][7] = { { 0,0,0,0,0,0,1 },  // = 0
                                 { 1,0,0,1,1,1,1 },  // = 1
                                { 0,0,1,0,0,1,0 },  // = 2
                                { 0,0,0,0,1,1,0 },  // = 3
                                 { 1,0,0,1,1,0,0 },  // = 4
                                 { 0,1,0,0,1,0,0 },  // = 5
                                 { 0,1,0,0,0,0,0 },  // = 6
                                 { 0,0,0,1,1,1,1 },  // = 7
                                 { 0,0,0,0,0,0,0 },  // = 8
                                 { 0,0,0,1,1,0,0 }   // = 9
 };

void setup() {               
  pinMode(2, OUTPUT);  
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  writeDot(0);  // start with the "dot" off
//  intro();
   Serial.begin(9600); 


}

void writeDot(byte dot) {
  digitalWrite(9, dot);
}
   
void sevenSegWrite(byte digit) {
  byte pin = 2;
  for (byte segCount = 0; segCount < 7; ++segCount) {
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
  }
}

void loop() {
  
   val = analogRead(probePin);  // take a reading from the probe

  if(val >= 1){                // if the reading isn't zero, proceed
    val = constrain(val, 1, senseLimit);  // turn any reading higher than the senseLimit value into the senseLimit value
    //val = map(val, 1, senseLimit, 1, 1023);  // remap the constrained value within a 1 to 1023 range
    val = map(val, 1, senseLimit, 1, 1023);  // remap the constrained value within a 1 to 1023 range
   
    total -= readings[index];               // subtract the last reading
    readings[index] = val; // read from the sensor
    total += readings[index];               // add the reading to the total
    index = (index + 1);                    // advance to the next index

    if (index >= NUMREADINGS)               // if we're at the end of the array...
      index = 0;                            // ...wrap around to the beginning

    average = total / NUMREADINGS;          // calculate the average


    if (average > 950){
        sevenSegWrite(0);
    } else if (average > 850){
        sevenSegWrite(1);
    } else if (average > 750){
         sevenSegWrite(2);
    } else  if (average > 650){
         sevenSegWrite(3);
    } else if (average > 550){
         sevenSegWrite(4);
    } else if (average > 450){
        sevenSegWrite(5);
    } else if (average > 350){
          sevenSegWrite(6);
    } else if (average > 250){
        sevenSegWrite(7);
    } else if (average > 150){             
         sevenSegWrite(8);  
    } else if (average > 50){
         sevenSegWrite(9);
    }
   
    Serial.println(average);
    delay(updateTime);
  }

  
}

void intro() {
   for (byte count = 10; count > 0; --count) {
   delay(1000);
   sevenSegWrite(count - 1);
  }
  delay(100);
}





아래 싸이트에서 일부 내용을 참조하여 사용했다. `

http://arduino-projects-here.blogspot.com/2010/10/arduino-emf-electromagnetic-field.html

Posted by '김용환'
,