· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
CNU Android Mobicon


1. CNU 시스템 소프트웨어 설계 I - 텀 프로젝트

1.1. 소개

팀명 : Synergy

조원 : 강원호, 이동석

2. Android Porting

포팅관련 사항들

2.1. LDS2000

CPU : XScale(core ARMv5TE) PXA255

32KB/32KB, MMU

400 BogoMips @ 400 MHz; 371-533 MIPS @ 400 MHz

Gumstix basix & connex, Palm Tungsten E2, Zaurus SL-C860, Mentor Ranger & Stryder, iRex ILiad

2.3. Ubuntu 환경 설정


2.3.1. Ubuntu Linux (32-bit x86)

To set up your Linux development environment, make sure you have the following:

  • Required Packages:
    • Git 1.5.4 or newer and the GNU Privacy Guard.
    • JDK 5.0, update 12 or higher. Java 6 is not supported, because of incompatibilities with @Override.
    • flex, bison, gperf, libsdl-dev, libesd0-dev, libwxgtk2.6-dev (optional), build-essential, zip, curl.
      $ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
      
  • You might also want Valgrind, a tool that will help you find memory leaks, stack corruption, array bounds overflows, etc.
    $ sudo apt-get install valgrind
    
  • Intrepid (8.10) users may need a newer version of libreadline: $ sudo apt-get install lib32readline5-dev

2.3.2. Installing Repo


Repo is a tool that makes it easier to work with Git in the context of Android. For more information about Repo, see Using Repo and Git. To install, initialize, and configure Repo, follow these steps:
  1. Make sure you have a ~/bin directory in your home directory, and check to be sure that this bin directory is in your path:
    $ cd ~
    $ mkdir bin
    $ echo $PATH
    
  2. Download the repo script and make sure it is executable:
    $ curl http://android.git.kernel.org/repo >~/bin/repo
    $ chmod a+x ~/bin/repo
    

2.3.3. Initializing a Repo client

  1. Create an empty directory to hold your working files:
    $ mkdir mydroid
    $ cd mydroid
    
  2. Run repo init to bring down the latest version of Repo with all its most recent bug fixes. You must specify a URL for the manifest:
    $ repo init -u git://android.git.kernel.org/platform/manifest.git
    
    • If you would like to check out a branch other than "master", specify it with -b, like:
      $ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake
      
  3. When prompted, configure Repo with your real name and email address. If you plan to submit code, use an email address that is associated with a Google account.
A successful initialization will end with a message such as
repo initialized in /mydroid
Your client directory should now contain a .repo directory where files such as the manifest will be kept.

What will my name and email be used for?

To use the Gerrit code-review tool, you will need an email address that is connected with a registered Google account (which does not have to be a Gmail address). Make sure this is a live address at which you can receive messages. The real name that you provide here will show up in attributions for your code submissions.

What is a manifest file?

The Android source files are divided among a number of different repositories. A manifest file contains a mapping of where the files from these repositories will be placed within your working directory when you synchronize your files.

2.3.4. Getting the files

To pull down files to your working directory from the repositories as specified in the default manifest, run
$ repo sync 
For more about repo sync and other Repo commands, see Using Repo and Git.

The Android source files will be located in your working directory under their project names.

2.4. Code Sourcery 툴체인 설치

2.4.2. 설치

다운로드 받은 .bin파일은 실행 속성이 없음으로 실행속성을 준다. 그리고 실행을 시킨다.
$chmod +x arm-2008q3-66-arm-none-eabi.bin
$./arm-2008q3-66-arm-none-eabi.bin

"The installer has detected that your system uses the dash shell as /bin/sh. This shell is not supported by the installer. You can work around this problem by changing /bin/sh to be a symbolic link to a supported shell such as bash. Please refer to the Getting Started guide, or contact CodeSourcery Support for assistance."라고 나온다면 아래 수행
$mv /bin/sh /bin/sh.dash
$mv /bin/sh.distrib /bin/sh

2.4.3. 빌드하고자하는 소스의 Makefile의 수정

$vi Makefile
그리고 ARCH의 내용을 다음과 같이 수정하여 크로스 컴파일러의 위치를 설정하여 준다.
ARCH            := arm
CROSS_COMPILE   := /home/zeka/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-eabi-

2.5. Android 포함 ARM EABI 툴체인으로 빌드

  • 이미지 압축 해재 후 동작안하던 문제를 해결...
    $ make uImage ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
    

2.6. zImage VS uImage

zImage와 uImage의 차이점 LDS2000에서는 uImage를 만들어야지 bootm을 사용하여 부팅가능 하다. zImgae는 go 명령을 사용한다.

2.6.1. zImage

압축된 Kernel의 image이다. 1M가 넘어가면 Big zImage라는 뜻으로 bzImage 라는 파일이름으로 명명한다. zImage 앞부분에는 zImage의 압축을 푸는 코드들이 들어있다. 이 코드들의 커널 소스내 위치는 arch/arm/boot/compressed/ 이고 이 디렉토리 안에서 주로 head.S, head-xscale.S 파일을 보면 된다.

2.6.2. uImage

uImage이란 u-boot에서 사용하는 압축된 커널 이미지이다. 단순히 u-boot 의 tools/mkimage(u-boot source를 컴파일을 해야 생성된다)라는 툴을 이용해 zImage에 64byte 헤더를 추가시킨 이미지이다. 이 64byte 헤더에는 target architecture, operating system, image type, compression method, entry points, time stamp, CRC32 checksums 등과 같은 정보들이 들어간다.

  • uImage 만드는 방법
    $./mkimage -A arm(우리가 쓰는 임베디드 종류) -O linux -T kernel -C gzip -a 0xa0000000(ram address 올릴 주소) -e 0xa0000000(entry point) -n(name) "Linux Kernel Image" -d linux.bin.gz uImage
    
    혹은 (PATH에 mkimage가 있을 경우)
    $make uImage
    
    명령을 통해서 한번에 uImage를 만들 수 있다. 위에서 명령행 인자들이 그대로 uImage의 header가 된다.

  • 예제
    $mkimage -A arm -O linux -T kernel -C none -a 0xa2000000 -e 0xa2000000 -n 'Linux-2.6.21.1' -d arch/arm/boot/zImage arch/arm/boot/uImage
    
    uImage를 사용하는 경우 메모리의 어느 주소에 로드를 하더라도 커널에서 uImage를 만들때 설정한 주소로 압축이 풀린다.

2.7. LDS2000보드 Specific 메모리 맵핑 설정

  • 2.4버젼의 arch/arm/mach-pxa/lds2000.c 파일을 참고하여 2.6용으로 수정해야 한다. 러벅보드의 2.6버젼을 베이스로 하여서 수정하면 쉽게 할 수 있다. pfn필드는 __phys_to_pfn를 사용하여 물리 주소를 변환한다.
    // lubbock2lds.c
    static struct map_desc lubbock_io_desc[] __initdata = {
            {       /* Intel Strata Flash 32M */
                    .virtual        = 0xE8000000,
                    .pfn            = __phys_to_pfn(0x00000000),
                    .length         = 0x02000000,
                    .type           = MT_DEVICE
            },
    
            {       /* CS8900a eth0*/
                    .virtual        = 0xF0000000,
                    .pfn            = __phys_to_pfn(0x04000000),
                    .length         = 0x00100000,
                    .type           = MT_DEVICE
            },
    
            {       /* CS8900a eth1*/
                    .virtual        = 0xF2000000,
                    .pfn            = __phys_to_pfn(0x06000000),
                    .length         = 0x00100000,
                    .type           = MT_DEVICE
            },
    #if 0 //추가하면 커널 부팅 불가 ㅜ.ㅜ
            {       /* ADS7843 Touch Screen */
                    .virtual        = 0xF0190000,
                    .pfn            = __phys_to_pfn(0x08080000),
                    .length         = 0x00080000,
                    .type           = MT_DEVICE
            },
    #endif
    };
    
  • smc91x 관련 함수 변수는 없어도 된다. 주석 처리.

2.8. CS8900A의 드라이버 포팅 cs89x0.c 수정

  • eth0 베이스 어드레스 설정 0xF0000000+0x300 IRQ 0
    //확실치 않음...
    static unsigned int netcard_portlist[] __used __initdata = {0xF0000000+0x300, 0xF2000000+0x300, 0, 0};
    static unsigned int cs8900_irq_map[] = { IRQ_GPIO(0), IRQ_GPIO(13), 0, 0};
    //static unsigned int cs8900_irq_map[] = { 0, 13, 0, 0}; //어떤거???
    #define request_region(a, s, n)         request_mem_region(a, s, n)
    #define release_region(a, s)            release_mem_region(a, s)
    
  • MAC Address 강제 지정 & 피지컬 링크 타입 강제 지정 10base-T
  • 현재 IRQ conflict ? 오류 송수신 불가

2.9. Root FS 이미지 만들기

파일 시스템을 원하는 폴더로 복사
  1. $ cd ~/android_build/out/target/product/generic
  2. $ mkdir ~/Android_RFS
  3. $ cp -a root/* ~/Android_RFS
  4. $ cp -a data/* ~/Android_RFS/data/
  5. $ cp -a system/* ~/ Android_RFS/system/

Ownership & Permissions 수정
  1. $ cd ~/Android_RFS
  2. $ sudo chown -R root.root *
  3. $ sudo chmod -R 777 data system

Booting Android on board from MMC/SD
  • Create two partitions on MMC/SD 1.FAT 2.ext3
  • Create device nodes to boot from MMC/SD second partition
    1. $ cd <Android_Build>/dev
    2. $ mknod mmcblk0 b 179 0
    3. $ mknod mmcblk0p1 b 179 1
    4. $ mknod mmcblk0p2 b 179 2
    5. Kernel Arguments
  • console=ttyS1,9600n8 noinitrd root=/dev/mmcblk0p2 init=/init rootfstype=ext3 rw rootdelay=1 nohz=off

USB 저장장치 노드 생성
  • $ mknod sda /dev/sda b 8 0
  • $ mknod sda /dev/sda1 b 8 1
  • $ mount -t vfat /dev/sda1 /mnt/usb/

2.10. BusyBox

The toolbox that is provided on the Android environment is pretty limited. I wanted something more useful and familiar. Busybox to the rescue!

I have a busybox binary available for those who are interested.

To use it simply do # mkdir /data/busybox, on your emulated console. Then copy the busybox binary across: $ adb push busybox /data/busybox/busybox. Once you do this you can install the necessary hardlinks by doing: # cd /data/busybox; ./busybox --install. Once doing this you should have links to all the applets in the /data/busybox directory. To make this useful you probably want to put this into your PATH: # export PATH=/data/busybox:$PATH.

You should now be able to get access to all the useful busybox applets.

binary available를 클릭하면 busybox binary파일 바로 다운 [http]클릭

  1. binary파일 다운로드.
  2. emulator 실행.
  3. HOST$> adb shell
  4. Target#>mount -o remount,rw rootfs / (파일 시스템을 읽고 쓸수있도록 리마운트)
  5. Target#>exit
  6. HOST$>adb push busybox /sbin
  7. HOST$>adb shell
  8. Target#>cd sbin
  9. Target#>busybox --help ( 사용가능 명령어 확인 )
  10. ln -s busybox <명령어> (사용하고자 하는 명령어 링크)

  11. 참고

2.11. 에뮬레이터에서 rootfs 추출하기

  1. 커멘드라인으로 윈도우의 안드로이드 SDK dir/tools 에서 작업한다.
  2. cmd prompt is >, linux prompt is $
  3. sd card image 생성
    > makesdcard 128M sd.img
    
  4. 에뮬레이터 실행 & SD인식
    > emulator --sdcard sd.img 
    menu --> Dev Tools --> Media Scanner  ( sd.img 인식)
    
  5. 에뮬레이터에 busybox 를 넣고 쉘로 접속
    > adb push busybox  /data/
    > adb shell
    
  6. 쉘 접속 후 busybox 퍼미션 수정
    $ chmod 777 /data/busybox
    $ chown root /data/busybox
    
  7. data, system 을 sdcard로 복사
    $ /sdcard/busybox tar -cf /sdcard/system.tar /system                
    $ /sdcard/busybox tar -cf /sdcard/data.tar /data
    $  exit 
    
  8. 만들어진 sd.img와 기본 ramdisk.img를 우분투로 가져옴
  9. ramdisk 통합
    $ mkdir sd
    $ mount -o loop sd.img sd 
    
    $ mkdir root_disk
    $ gzip -cd ramdisk.img > ramdisk
    $ cp ramdisk root_disk
    $ cpio -iv -F ramdksk
    $ rm ramdisk
    $ cd ..
    
    $ tar xvf sd\system.tar -C root_disk
    $ tar xvf sd\data.tar  -C root_disk
    $ tar xvf sd\dev.tar  -C root_disk
    
  10. init.rc 수정
    loglevel 3  -->   loglevel 6
    
    //아래사항 주석처리
    #mount yaffs2 mtd@system /system
    #mount yaffs2 mtd@system /system ro remount
    #mount yaffs2 mtd@userdata /data nosuid nodev
    #mount yaffs2 mtd@cache /cache nosuid nodev
    


2.12. boot cmd

  • root=/dev/ram rw initrd=0xa100000,4M ramdisk=4096 mem=64M console=ttyS0,9600

2.13. Linux 2.6 GPIO 관련 평션

커널 2.6 의 gpio 인터페이스들이 표준화 되었습니다.

필요한 헤더파일 #include
  • GPIO 입력설정 gpio_direction_input( gp_nr );
  • GPIO 출력설정 gpio_direction_ouput( gp_nr, init_val ); // init_val 는 초기값이다.
  • GPIO 출력 gpio_set_value( gp_nr, val ); // val 는 0, 1 값이다.
  • GPIO 입력 gpio_get_value( gp_nr );
  • GPIO 인터럽트 활성화 set_irq_type( irq_nr, irq_type );
    • irq_nr : GPIO 번호가 아니고 irq 번호이다.
    • IRQ_GPIO(gp_nr) 함수로 알수있다.
    • irq_type : IRQT_RISING, IRQT_FALLING, IRQT_BOTHEDGE, IRQT_LOW, IRQT_HIGH

2.14. 네트워크 드라이버..

현재 2.4에서는 eth0의 irq가 1인대 반해 2.6에서는 5로 잡히고 있다. 1로 어떻게 바꿀는가..

2.15. kernel 2.4 정보들..

bash-2.05b# cat proc/interrupts
  1:       2499   eth0
  3:        165   GPIO 2-80
  4:          0   PXA USB core
  7:         43   AC97
 15:         89   serial
 18:          0   DMA
 19:       3978   timer
 28:          0   ads7843
 35:        180   SL811
Err:          0
bash-2.05b#
bash-2.05b# cat proc/iomem
a0000000-a3ffffff : System RAM
  a0065000-a01ea1ef : Kernel code
  a01ea1f0-a0237ab3 : Kernel data
f4000000-f4002000 : SA1111
  f4001600-f40017ff : irqs
bash-2.05b# cat proc/ioports
00000000-0000000f : eth0
f1800000-f1800000 : SL811
f1810000-f1810000 : SL811
bash-2.05b# cat proc/kmsg
<4>Linux version 2.4.19-rmk7-pxa2 (root@zeka-ubuntu) (gcc version 3.2.1) #280 20
09. 05. 18. (▒) 01:53:45 KST
<4>CPU: XScale-PXA255 revision 6
<4>Machine: LDS2000
<6>Memory clock: 99.53MHz (*27)
<6>Run Mode clock: 199.07MHz (*2)
<6>Turbo Mode clock: 199.07MHz (*1.0, inactive)
<4>Security risk: creating user accessible mapping for 0x14400000 at 0xf1800000
<6>=> MCS0 = 0x7ff87ff0
<6>=> MCS1 = 0x5aa85aa0
<6>=> MCS2 = 0x7ffc7ff0
<4>On node 0 totalpages: 16384
<4>zone(0): 16384 pages.
<4>zone(1): 0 pages.
<4>zone(2): 0 pages.
<4>Kernel command line: root=/dev/nfs rw nfsroot=192.168.1.2:/home/LDS/LDS2000/N
FS nfsaddrs=192.168.1.3:192.168.1.2
<7>Relocating machine vectors to 0xffff0000
<4>Console: colour dummy device 80x30
<4>Calibrating delay loop... 198.65 BogoMIPS
<6>Memory: 64MB = 64MB total
<5>Memory: 62532KB available (1556K code, 310K data, 372K init)
<6>Dentry cache hash table entries: 8192 (order: 4, 65536 bytes)
<6>Inode cache hash table entries: 4096 (order: 3, 32768 bytes)
<4>Mount-cache hash table entries: 1024 (order: 1, 8192 bytes)
<4>Buffer-cache hash table entries: 4096 (order: 2, 16384 bytes)
<4>Page-cache hash table entries: 16384 (order: 4, 65536 bytes)
<4>POSIX conformance testing by UNIFIX
<6>Linux NET4.0 for Linux 2.4
<6>Based upon Swansea University Computer Society NET3.039
<4>Initializing RT netlink socket
<6>SA1111 Microprocessor Companion Chip: silicon revision 1, metal revision 1
<3>SA1111: unable to claim IRQ25: -22
<4>PXA USB Controller Core Initialized
<5>get_random_bytes called before random driver initialization
<6>USB Function Ethernet Driver Interface
<4>Starting kswapd
<4>Console: switching to colour frame buffer device 80x30
<4>pty: 256 Unix98 ptys configured
<6>Serial driver version 5.05c (2001-07-08) with no serial options enabled
<6>ttyS00 at 0x0000 (irq = 15) is a PXA UART
<6>ttyS01 at 0x0000 (irq = 14) is a PXA UART
<6>ttyS02 at 0x0000 (irq = 13) is a PXA UART
<4> ADS7843 Touch Screen driver initialized
<6>loop: loaded (max 8 devices)
<6>eth0: CS8900A rev E at 0xf0000300 irq=1, no eeprom , addr: 00: A:D4: 0:30: 0
<6>Linux video capture interface: v1.00
<6>SCSI subsystem driver Revision: 1.00
<3>kmod: failed to exec /sbin/modprobe -s -k scsi_hostadapter, errno = 2
<3>kmod: failed to exec /sbin/modprobe -s -k scsi_hostadapter, errno = 2
<3>kmod: failed to exec /sbin/modprobe -s -k scsi_hostadapter, errno = 2
<3>kmod: failed to exec /sbin/modprobe -s -k scsi_hostadapter, errno = 2
<6>ac97_codec: AC97 Audio codec, id: 0x4352:0x5913 (Cirrus Logic CS4297A rev A)
<6>Linux Kernel Card Services 3.1.22
<6>  options:  none
<6>Intel PXA250/210 PCMCIA (CS release 3.1.22)
<3>This hardware is not supported by the PXA250/210 Card Service driver
<6>usb.c: registered new driver hub
<6>host/sl811.c: v0.30 : Sl811 USB Host Controller Alternate Driver
<6>usb.c: new USB bus registered, assigned bus number 1
<6>host/sl811.c: USB SL811 at f1800000,f1810000, IRQ 35
<6>host/sl811.c: [sl811_hc_reset:2517] Full speed Device attached
<6>hub.c: USB hub found
<6>hub.c: 1 port detected
<6>usb.c: registered new driver ov511
<6>ov511.c: v1.63 for Linux 2.4 : ov511 USB Camera Driver
<6>Initializing USB Mass Storage driver...
<6>usb.c: registered new driver usb-storage
<6>USB Mass Storage support registered.
<6>NET4: Linux TCP/IP 1.0 for NET4.0
<6>IP Protocols: ICMP, UDP, TCP
<6>IP: routing cache hash table of 512 buckets, 4Kbytes
<6>TCP: Hash tables configured (established 4096 bind 8192)
<4>IP-Config: Guessing netmask 255.255.255.0
<4>IP-Config: Complete:
<4>      device=eth0, addr=192.168.1.3, mask=255.255.255.0, gw=255.255.255.255,
<4>     host=192.168.1.3, domain=, nis-domain=(none),
<4>     bootserver=192.168.1.2, rootserver=192.168.1.2, rootpath=
<6>NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
<6>NET4: Ethernet Bridge 008 for NET4.0
<4>NetWinder Floating Point Emulator V0.95 (c) 1998-1999 Rebel.com
<5>ds: no socket drivers loaded!
<5>Looking up port of RPC 100003/2 on 192.168.1.2
<5>Looking up port of RPC 100005/1 on 192.168.1.2
<4>VFS: Mounted root (nfs filesystem).
<6>Freeing init memory: 372K
<6>hub.c: USB new device connect on bus1/1, assigned device number 2
<6>scsi0 : SCSI emulation for USB Mass Storage devices
<4>  Vendor: Apple     Model: iPod              Rev: 2.70
<4>  Type:   Direct-Access                      ANSI SCSI revision: 02
<4>Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
<4>SCSI device sda: 1010432 512-byte hdwr sectors (517 MB)
<4>sda: Write Protect is off
<6>Partition check:
<6> sda: sda1
<7>WARNING: USB Mass Storage data integrity not assured
<7>USB Mass Storage device found at 2

3. Mobicon

Android용 Remocon 프로그램

3.1. 안드로이드 개발 환경 설정

  1. Android SDK 다운로드 & 설치
    1. [http]여기서 다운로드한다.
    2. 원하는 곳에 압축을 풀어준다.
    3. 환경 변수 설정 : 안드로이드가 설치된 경로/tools 를 Path에 추가한다.
  2. JAVA SDK 다운로드 & 설치
  3. Eclipse 다운로드 & 설치
    • Ganymede Packages (based on Eclipse 3.4.1)를 추천한다. [http]여기서 다운로드한다.
    • Help의 Software Updates를 선택한다. Available Software탭을 선택한다.
    • Add Site를 선택하고 http://dl-ssl.google.com/android/eclipse/ 를 넣는다.
    • 추가된 안드로이드 사이트를 모두 체크하여 Install 버튼을 누른다.
    • Window -> Preferences를 선택한다. SDK Location에 Android SDK의 경로를 선택하여 준다.
    • Eclipse를 재시작한다.

3.2. 동작 플로우 설명

안드로이드 스마트폰과 제어하고자하는 PC는 인터넷을 사용할 수 있는 상태이다. 두 기기에는 Mobicon프로그램이 설치가 되어있다. 스마트폰에서는 제어하고자하는 PC의 IP주소를 설정한다. 그러면 스마트폰에서는 해당 IP로 UDP를 사용하여 Hello Msg를 1초당 한번씩 전송을 하게 된다. Hello Msg를 받은 PC는 목록에 Hello Msg를 통하여 얻은 정보를 표시하여 준다. 목록에서 제어를 하도록 허락하는 스마트폰을 선택하면 해당 스마트폰의 Key Msg를 사용하여 PC에 키 이벤트를 발생시킨다. 허락 되지 않은 스마트폰의 Key Msg는 무시된다. (수정 중)

3.3. Protocol

  • UDP사용
  • Hello Msg (1초에 한번)
    [Type:Hello(1바이트)][Timestemp(4바이트)][MobiconName:가변]
    
  • Key Msg
    [Type:Key(1바이트)][키#(1바이트)]
    
  • Ack Msg
    [Type:Ack(1바이트)]
    

3.4. Android APP

  • 1초에 한번씩 Hello Msg 송신

3.5. PC APP

  • [http]BOOST Lib를 사용하여 네트워크 부분 구성
  • IP를 통하여 수신할 모비콘 프로그램을 선택
  • UDP를 사용하여 입력만을 받음
  • 트레이를 사용한 UI
  • 기본 디자인
    Mobicon.png
    [PNG image (23.72 KB)]


3.6. DroidDraw

안드로이드 UI 디자인 툴

3.7. 일정




sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2013-01-02 15:11:34
Processing time 0.0233 sec