레이블이 Android인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Android인 게시물을 표시합니다. 모든 게시물 표시

2009년 6월 25일 목요일

android kernel porting try #6

uart에서 막혀서 몇일 동안 밤낮을 전패하며

어디가 잘못됬나 알아봤지만 답을 알 수 없었다.

처음에는 uart쪽에 문제가 있는 것으로 생각을 하여 /drivers/serial/serial_core.c, pxa.c 파일을 체크해보고 수정을 해보려고 했다.

그리고 빌드 순서와 커널 올라가는 순서가 같은 줄 알고 그 부분에 대해 디버깅을 위해

printk문을 써가면 노가다 성으로 알아보려고 했으나 큰 성과가 없었다.

그러다가 빌드할때 컴파일되는 파일들을 일일히 찾아 살펴보았다.

그러다가 원래 올라가 있었던 2.6.15버전의 커널과 비교해 볼것을 생각해내었고

/arch/arm/mach-pxa/mainstone.c 파일을 비교해보니 그 파일에 device들에 대해 설정을 해준것이 보였고 현재 빌드 시도 중인 안드로이드 커널과 비교를 하여 수정을 해주었다.

두 파일의 내용은 비슷한듯 하지만 버전이 차이가 많이 나서 그런지 차이점도 많았다.

그래서 조금씩 비슷하게 수정을 해보았다. 수정을 한 후 다시 빌드를 하여 보드에 올려보았다.



이와 같이 uart는 통과가 되었으나 다시 멈추었는데 이번에는 커널패닉이라는 에러 메시지를 출력하고 멈춰버렸다.

이 에러가 처음에는 메모리 관련 에러라고 생각을 잘못하였다가 프레임버퍼 문제인지 파악하여 세븐코아 안드로이드 포팅 문서에 있는 /drivers/video/pxafb.c, pxafb.h 프레임버퍼 파일 수정을 적용해 주었다.

바로 적용을 해주었으나 컴파일시 에러가 발생하였고 확인해보니 그 문서에 있는 것은 2.6.27버전에서의 수정이어서 2.6.29버전은 바로 적용을 해줄수는 없고 수정을 해줘야했다.

그 구문의 위치를 파악하여 구문을 조금씩 수정해서 파일을 수정해 주었고 에러메시지가 나오지 않게 모든 에러들을 잡아 주었다.

그 후 다시 빌드를 하여 보드에 zImage를 올려보았으나 조금 변화가 있었으나 커널 패닉이 발생하였다.

2009년 6월 22일 월요일

android kernel porting try #5

전에 막히는 부분에 대한 전임님의 조언으로 수정을 실시하였다.

/arch/arm/tools/mach-types

파일에서 16진수로 196을 10진수로 바꾼 406번지에 가보니 mainstone의 머신 ID가 적혀있었고

이것을 16진수 130을 10진수로 바꾼 304로 수정해주고 원래 304번지는 주석처리를 해주었다.

그 후 빌드를 해서 보드에 올리니 전에 막히는 부분은 통과가 되었다.

커널이 실행되고 역시나 중간에 막혀버렸다.



쉽지 않을꺼란 예상은 했지만 솔직히 맨땅에 헤딩하는 기분이다.

이 분야에대해서 처음 배우는 것이고 지식이 없다보니 어디를 어떻게 수정해야하고 어디가 잘못된 것인지 감도 안잡힌다.

지금까지 진행해 온것도 보면 막히는 부분마다 전임님에게 조언을 구해 해결책을 얻어 진행해 나간것에 불과하다.

지금 에러도 없이 그냥 멈춰버렸는데 UART부분이 잘못된 것이라는것만알지 다른 정보가 하나도 없다.

어디서 부터 어떻게 접근을 해야하는지 감이 안잡힌다.

인터넷을 검색해보아도 딱떨어지는 답은 커녕 비슷한것도 잘 나오질 않는다.

menuconfig 설정에도 UART에 대한 설정은 많이있고, 뭐가 STUART에 대한건지도 잘 모르겠다.

무식하게 설정을 하나씩 바꿔볼 생각을 했지만 생각해보니 이처럼 무식한 방법도 없다.


하지만 나만 애가 닳아 있는 것 같다.

시간은 촉박해오고...

점점 힘이 든다...

2009년 6월 14일 일요일

android porting try #1

전부터 안드로이드를 빌드할려고 했는데

4시간씩해도 빌드가 완성되지 않아서 빌드를 하지 못하고 있다가

어제는 집에 가는 길에 아예 빌드를 시켜놓았다.

그렇게하니 빌드가 완성되어 있었다.

드디어 안드로이드도 빌드했다~

커널 올리고 셋팅한다음 안드로이드를 올리면 되겠네~ ㅡㅡ;

2009년 6월 13일 토요일

android kernel porting try #4

전의 커널 문제를 해결하기위해 세븐코아의 전임님께 질문을 하였더니

보드에 올려진 부트로더의 머신 ID와 빌드한 커널의 머신 ID가 같지 않아서 그런것이라는 답변과 함께 해결책을 알려주셨다.

역시나 머신 ID를 설정해주는 파일이 있었고 그 부분을 수정하면 해결이 가능하다고 하셨다.

그 경로는 다음과 같다.

/arch/arm/tools/mach-types

이것을 수정하고 바로 커널이 정상 작동했으면 좋겠지만 그건 희망사항이겠지... ㅋㅋ

2009년 6월 9일 화요일

android kernel porting try #3

- 현재 보드가 mainstone 기반으로 만들어졌다는 소스를 얻어서 설정을 바꾸어 주었다.
$make mainstone_defconfig

- android가 들어간 설정을 모두 enable 해주기 위해 menuconfig 상에서 '/android' 로 어느 부분을 설정해 주어야 할지 확인한 후 모두 enable 해 주었다.

- 커널을 빌드하고 하이퍼 터미널에서 보드를 연결하여 커널을 다운로드하여 flash에 저장하고 재부팅하여 kernel이 잘 실행되는지 확인을 해보았다.

- 조금 기대하였지만 어느 부분의 설정이 잘못되었는지 아래와 같이 커널이 실행되지 않았다.


- 커널 설정에 대해 좀 더 알아보고 설정을 계속 바꾸어가면서 빌드하여 보드에 올려보면서 확인을 해가야하는 노가다성 작업을 해야할 것 같다.

2009년 6월 7일 일요일

프로젝트 진행사항

- 설정이 안된 바닐라 커널 2.6.27로 진행을 하고자 하였지만 설정 할 것이 너무 많아 프로젝트 진행이 원할하지 못할 것 같아 안드로이드에서 배포하는 안드로이드-리눅스 커널 2.6.29를 사용하기로 하였습니다.

1. 우선 android kernel을 받습니다. (이 버전은 2.6.27입니다.) $ git clone git://android.git.kernel.org/kernel/common.git kernel
2. 2.6.29로 업데이트 하기 위해서 $ cd kernel $ git checkout --track -b android-2.6.29 origin/android-2.6.29
하면 update가 됩니다.
$ git branch해 보시면 android-2.6.27 버전과 android-2.6.29 버전이 보입니다. * 표시가 있는 게 현재 버전입니다


- 원활한 작업을 위해 개발툴들을 설치해 줍니다.
· Git (버전 1.5.4 이상)와 GNU Privacy Guard
$ sudo apt-get install git-core gnupg

· JDK 5.0, update 12 또는 그 이상
$ sudo apt-get install sun-java6-jdk

· Flex, bison, gperf, libsdk-dev, libesd0-dev, libwxgtk2.6-dev(optional), build-essential, zip ,curl
$ sudo apt-get install flex bison gperf libsdk-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev

· Valgrind, memory leaks, stack corruption, array bounds overflows 등을 찾는데 사용한다.
$ sudo apt-get install valgrind

· Intrepid(8.10) 사용자는 새로운 버전의 libreadline이 필요할 수도 있다.
$ sudo apt-get install lib32readline5-dev

· Repo 스크립트를 다운로드하고 실행 파일로 속성을 변경한다.
$ curl http://android.git.kernel.org/repo > ~/bin/repo

- 안드로이드 소스를 다운받고 빌드합니다.
· 최신 버전의 repo를 다운 받기 위해 repo init을 실행한다.
$ repo init –u git://android.git.kernel.org/platform/manifest.git

· 안드로이드 소스를 다운로드할 디렉토리로 이동하여 다음 명령을 실행한다.
$ repo sync

· 안드로이드 소스 트리의 최상위 디렉토리에서 make를 실행하므로 소스코드 전체(커널 제외)를
빌드할 수 있다.
$ make

- 위에 안드로이드 소스 빌드는 커널을 제외하고 실행됩니다. 커널을 포팅할 보드에 맞춰서 설정 및 수정한 수 따로 빌드해야 합니다.

- 먼저 ‘$make allnoconfig’ 명령어를 이용하여 설정 사항을 모두 없애고 보드에 맞는 설정을 하나씩 추가하여 커널을 설정하기로 하였습니다.

- 보드 매뉴얼을 보고 각각의 장비에 대한 설정을 enable 시켜주고 android와 관련된 설정사항을 enable 해줍니다.

- 크로스컴파일을 하기 위해 다운받은 안드로이드 커널 안에서 ‘arm-eabi-gcc’가 있는 폴더를 찾아 경로설정을 해줍니다.

- ‘$make ARCH=arm CROSS_COMPILE=arm-eabi-‘ 명령어로 kernel을 빌드합니다. 여기서 몇 번 에러가 발생하였지만 설정을 수정하여 리빌드하여 커널 이미지인 zImage 파일을 만듭니다.

- 보드에 minicom을 이용하여 커널을 다운로드 합니다. 이때 보드에 있는 부트로더는 blob으로 호스트에서 보드로 다운로드 할 수 있는 명령으로 xdownload가 있는데 이것은 xmodem 프롬프트를 이용하여 시리얼로 다운로드를 할 수 있는 명령어입니다.

- 여기서 작업이 중단되었는데 xmodem은 시리얼포트 다운로드 프로토콜인데 우리는 ‘USB to 시리얼’ 케이블을 사용하여 다운로드가 실행되지 않았습니다. 그래서 노트북이 아닌 PC에서 시리얼 포트를 연결하고 실행을 시켜보니 다운로드가 실행 되었습니다.

- 커널을 다운로드하고 보드의 Flashmemory에 저장을 하고 재부팅을 해보았지만 커널이 실행되지 않았습니다.

- 커널의 루트파일시스템 설정 및 세부적인 설정이 잘못되어 커널이 작동하지 않는 것으로 예상이 되어 현재 이 부분 설정을 작업 중에 있습니다.

- 이 후의 예상되는 작업으로 커널이 정상 작동되게 하고, 거기에 먼저 빌드한 안드로이드를 포팅하고, 몇 가지 디바이스 드라이버를 module로 커널에 올리는 작업을 진행해야 할 것입니다.

안드로이드 (ANDROID)

1. 안드로이드란?


30여개 이상의 기술 및 모바일 회사가 모여 만든 OHA(Open Handset Alliance)에서 개발한 최초의 완전하고 개방된 무료 모바일 플랫폼이다. OS, Middleware, Key Application을 포함하는 모바일기기의 소프트웨어 집합체로 리눅스 기반의 S/W 개발 플랫폼 및 도구로서 차세대 휴대폰을 개발하기 위해 사용될 것입니다.


※ OHA란? – 오픈 핸드셋 얼라이언스(OHA)는 휴대폰, 이동통신, 반도체, 소프트웨어 분야 34개 업체로 구성된 개방형 모바일 기술개발 연합으로 삼성전자, LG전자, 모토로라, 인텔, 퀄컴, 차이나모바일, 스프린트넥스텔, NTT도코모, 이베이 등 세계적인 기업들이 참여한다. 이들 기업은 구글의 모바일 OS 플랫폼 ‘안드로이드'를 이용한 휴대폰과 각종 서비스들을 공동으로 개발하게 된다. ( OHA 홈페이지 : http://www.openhandsetalliance.com/ )


2. 안드로이드의 차별점

가장 큰 차이점은 개방성입니다. 기존의 Windows Mobile, Symbian, RIM 플랫폼 등을 사용하기 위해서는 라이센스가 필요하며 또한, S/W 역시 코드가 개방되어 있지는 않습니다.휴대폰에서 PC보다 더 편리한 사용환경을 제공하는 것이 목표입니다.


3. 안드로이드 Architecture

· 빨간색은 리눅스 커널 영역
· 녹색은 이미 개발 되어진 오픈 소스 기반의 솔루션
· 파란색 컴포넌트들은 구글에서 만든 핵심적인 부분
· 노란색은 자바 Virtual Machine

- Application : E-mail Client, SMS Program, Calendar, Maps, Browser, Contacts 등 핵심 응용프로그램을 탑재한다.
- Application Framework : 개발자는 핵심 응용프로그램에서 사용된 것과 같은 프레임워크 API에 모두 접근 가능하다. 이 같은 메카니즘은 컴포넌트를 사용자에 의해 교체 할 수 있도록 한다.
- Libraries : 시스템에서 다양하게 사용되는 C/C++ 라이브러리
- Android Runtime : 자바 프로그래밍 언어의 핵심 라이브러리 기능 대부분을 제공하도록 핵심 라이브러리를 제공 및 Dalvik 버추얼 머신을 포함.
- Linux Kernel : 보안, 메모리 관리, 프로세스 관리, 네트워크 스택, 드라이버 모델과 같은 리눅스 버전 2.6의 핵심 시스템 서비스를 이용하며 커널은 하드웨어와 소프트웨어간 추상계층으로 동작한다.
- 그 외의 기능 : Bluetooth, EDGE, 3G, WiFi 지원, 카메라, GPS, Compass(나침반), Accelerometer(가속도계) 지원 등


4. 관련 산업에 미칠 영향은?


모바일 OS 시장에서 개방형 OS와 폐쇄형 OS의 구도를 재편하였고, 윈도우 모바일과 심비안, MacOS와의 본격적인 힘겨루기를 시작하였다. 리눅스가 앞으로 모바일 산업에서 가장 중요한 기술이 될 것이라고 예측되고 관련 전문가의 예상으로는 2012년에 모바일 플랫폼의 약 31%정도가 리눅스를 사용할 것이라고 합니다.

프로젝트 제안서

1. 제목

- Android 포팅과 장치 연동


2. 동기

- 임베디드 시스템 수업 중 교수님의 제안으로 한이음 프로젝트를 시작하게 되어 졸업 프로젝트와 연계하여 진행하고자 하였다.
- 요즘 주목을 받고 있는 구글의 무료 모바일 플랫폼인 Android를 포팅 해보고, 스마트폰 플랫폼 보드 등을 다루어 보는 경험을 할 수 있을 것 같아 선택하게 되었다.


3. 목표

- 구글의 무료 모바일 플랫폼인 Android를 PXA270 board에 포팅을 해보고 LCD 터치, 무선랜, 오디오 디바이스들을 작성하고 이 장치들을 상호 연동 시킨다.


4. 예상 결과물

- PXA270 타겟보드에 LCD 터치, 무선랜, 오디오 장치가 연동되는 Android 플랫폼을 구현한다.


5. H/W, S/W 환경





















- Target : PXA270 board
- Host OS : Ubuntu 9.04


6. 순서

- PXA270 타겟보드에 리눅스 커널 2.6.24 이상의 버전을 포팅한다.
- Android 버전 1.0을 포팅한다.
- LCD 터치, 무선랜, 오디오 디바이스 드라이버를 작성한다.
- Android에서 상기 장치들을 사용할 수 있도록 상호 연동 시킨다.


7. 주별 계획서












8. 참고 자료

- PXA270을 이용한 임베디드 시스템 구조 및 응용 : 상학당
- 세븐코아 안드로이드 포팅
- 리눅스 커널의 이해 : 한빛미디어