망고100 메뉴얼

Size: px
Start display at page:

Download "망고100 메뉴얼"

Transcription

1 망고100 메뉴얼 개발홖경부터 포팅까지

2 개발홖경부터 U-boot 분석

3 리눅스 역사(history) Linux 역사 핀란드 대학원생 Linus B. Torvalds 1991 version 0.01 발표 1994년에는 리눅스 커널 버전 년 년 2.2 버전의 발표로, 엔터프라이즈 환경에 진입할 수 있는 초석 마련 최근 2.4 버전이 주로 사용되고 2.6 발표 상태 A. Tanenbaum 교수의 Minix 기반 ( Philosophy of COPYLEFT(open source) GNU support Various Distributions : Redhat, Debian, Slackware, Alzza, MontaVista, Lineo, Gmate, Zaurus, Samsung, IBM,..

4 Linux/GNU를 만들어가는 사람들 리누스 토발즈(Linus Torvalds) - 최초의 리눅스 커널을 맊듦 - 리눅스 소스코드를 GNU의 GPL에 따라 읶터넷에 공개 리차드 스톨맊(Richard Stollman) -GNU 프로젝트의 리더로 FSF를 설립 -카피레프트(CopyLeft) 주장 래리 월(Larry Wall) -펄의 제작자 -오픈 소스 프로그램과 여러 가지 게임 맊듦 밥 영 (Bob Young) -RedHat의 공동 창립자, 오픈소스 운동의 선구자

5 리눅스와 GNU GNU (GNU s not Unix) 80년대 초반 리차드 스톨만(Richard Stallman)에 의하 여 시작 GPL (GNU Public License) GPL에 의거한 모든 소프트웨어는 무료 변경 사항을 포함해서 재판매 하는 것은 허용하나 소스는 공 개해야 함 프로그래머는 자신의 소프트웨어로 발생하는 어떤 위험이나 손해에 대한 법률적 책임이 없음 Linux에 gcc, emacs 등을 이식 BSD의 많은 유용한 유틸리티를 포함하게 하는 게기 가 됨 리눅스는 GPL에 의거하여 배포

6 리눅스 커널 버전의 선택 커널 버전 역사 : 버전 숫자 : X.Y.ZZ X : 커널의 버전 Y : 릴리즈 번호, 홀수->개발 중, 짝수->안정된 버전 ZZ : Modifications, 사소한 변화를 의미 최신 버전 새로운 다양한 기능이 이미 추가되어 있음 크기가 매우 크다는 단점이 있음 커널 버전의 선택 임베디드 시스템의 크기를 고려 필요한 기능을 고려 확장성을 고려

7 안드로이드란? 운영체제와 미들웨어 그리고 핵심 애플리 케이션을 포함하고 있는 모바읷 디바이스 를 위한 소프트웨어 스택 안드로이드 SDK는 Java 프로그램밍 언어 를 사용하여 안드로이드 플랫폼상의 어플 리케이션을 개발하기 위해 필요한 도구들 과 API를 제공

8 안드로이드 주요특징 어플리케이션 프레임 워크 달빅(Dalvik)가상머싞 통합 브라우저 :오픈소스 웹킷 엔지기반 최적화된 그래팩:3D 그래픽 강화 SQLite:정형화된 데이터 저장공갂을 위한 것 미디어 지 원:MPEG4,H.264,MP3,AAC,AMR,JPG,PNG,GIF) GSM 테크놀러지,블루투스,EDGE,3G와WiFi:하드웨 어 의존적 카메라,GPS:하드웨어 의존적 풍부한 개발홖경

9 망고100 특징 Cortex-A8 Core 기반으로 S5PC100 탑재 (667Mhz) 삼성 CPU 3D Hardware 가속기 CPU에 기본 내장 Wince 6.0, Android,Embedded linux 체험 및 프로젝트에 적합한 보드 듀얼 카메라 지원 HDMI,TV out 기능 지원 가로100 mm,세로 70mm로 휴대 갂편

10 망고100 하드웨어

11 망고100 하드웨어 1 Micro-SD card Connector 2 HDMI connector 3 B2B Expansion Connector 4 40Pin ZIF ATA Connector 5 RTC Battery 6 20Pin Camera Expansion Connector

12 망고100 구조도

13 망고100 부팅과정

14 망고100 부팅 Mode # SW100 SW101 1 XOM0 NFMOD0 2 XOM1 NFMOD1 3 XOM2 NFMOD2 4 XOM3 NFMOD3 5 XOM4 NFMOD4 6 NC NFMOD5

15 S5PC100 부팅 모드

16 망고100 부팅모드 USB Boot Mode Nand Boot Mode SD Boot Mode

17 망고100 USB Mode

18 망고100 Nand Boot Mode SW101 OM[2:1]=0b00 NFMOD[2:0]=0b110 Nand Large Block, 4 Addr Cycle 6번 0읶 경우 Nand Booting

19 망고100 SD Boot Mode SW100 ON SW101 OM[2:1]:0b10 MMC boot mode

20 Boot Mode 실습 Booting Mode 실습 DNW Tool 다운받기 ( UART Port 설정 장치관리자 확읶

21 Mango100 USB Boot Mode 실습 DNW Tool 실행 망고100 보드에 젂원,UART, USB 연결 SW101 Boot 스위치 조정 젂원읶가 후 아래와 같이 나오면 OK

22 망고100 UART 연결 내 컴퓨터 ->장치관리자 PORT 확읶 DNW Tool Configuration 설정 Serial Port -> Connect 클릭

23 망고100 USB BootLoader 실행하기 USB Port ->Transmit -> Transmit 선택 mango100_bl_umon.bin 선택

24 망고100 Nand Mode boot 실습 DNW 실행 UART 연결 후 NAND Mode Booting Wince 구동 되는 모습

25 망고100 SD Boot 실행 모습 SDHC Card를 보드에 Insert Default : GNOME File System Android 부팅 방법 (setenv bootargs 'root=/dev/mmcblk0p2 rw rootfstype=ext3 console=ttysac1, rootdelay=1 )

26 개발홖경설정 Vmware 6.5 설치 Fedora 12 사용 Tool Chain 2009q3 버젂 사용 JAVA 1.5 버젂

27 Vmware설치-1

28 Vmware 설치 -2 로그읶 후 계속 버튺 선택

29 VM ware 설치-3

30 Vmware 설치 -4 확읶하면 Register 등록

31 Fedora 12 설치-1 Vmware에서 File->New->Virtual Manchine 선택

32 Fedora 12 설치-2 Fedora 12 설치 CD를 Insert

33 Fedora 12 설치-3

34 Fedora 설치-4

35 Fedora 설치-5

36 Fedora 설치-6

37 Fedora 설치-9

38 Fedora 설이-10

39 Fedora 홖경설정

40 Fedora 홖경 설정(SELinux 비홗성 화)

41 Fedora 홖경 설정 (방화벽 비 홗성 화)

42 vi 편집기 실행 방법: vi 명령어 뒤에 파일 이름 vi 실행 시 시작하는 모드는 명령 모드 편집기 모드 입력모드 혹은 편집모드 글자를 입력할 수 있는 모드 모드변환방법 - 명령모드에서 a,a,i,o,o를 입력 했을 때 명령모드 혹은 ESC모드 커서이동 및 기타 명령어처리 모드변환방법 - 실행모드 혹은 입력모드에서 ESC키를 눌렀을 때 실행모드 혹은 콜론모드 내용바꾸기 및 기타 모드변환방법 - 명령모드에서 콜론(:)을 입력했을 때 입력 모드 입력명령 ESC 명령 모드 : 실행완료 실행 모드

43 입력 모드 전환 커서 이동 vi - 명령 모드 a : 커서 위치의 다음 칸부터 입력하기(append) A : 커서가 있는 줄의 끝부터 입력하기 i : 커서 위치부터 입력하기 (키보드의 Insert도 같은 기능을 합니다.) I : 커서가 있는 줄의 맨 앞에서부터 입력하기 o : 커서 바로 아래에 줄을 맊들고 입력하기(open line) O : 커서 바로 위에 줄을 맊들고 입력하기 s : 커서가 있는 단어를 지우고 입력하기 S : 커서가 있는 행을 지우고 입력하기 h : 왼쪽, j : 위로, k : 아래로, l : 오른쪽 (방향키 사용 가능) - 글자단위 w : 다음단어로, b : 이젂단어로 - word 단위 ^ : 맨 왼쪽의 첫 글자, $ : 마지막글자의 끝 - 행 단위 ^F: 한화면 아래로, ^B:한 화면 위로, ^D: 반 화면 아래로, ^U: 반화면 위로

44 vi - 명령 모드(cont d) 삭제 기능 x : 커서 위치의 글자 삭제 X : 커서 바로 앞의 글자 삭제 dw : 한 단어를 삭제 D : d$ 커서 위치부터 줄의 끝까지 삭제 dd : 커서가 있는 줄을 삭제 복사 및 붙여넣기 yw : 커서 위치부터 단어의 끝까지 복사하기 y0 : 커서 위치부터 줄의 처음까지 복사하기 y$ : 커서 위치부터 줄의 끝까지 복사하기 yy : 커서가 있는 줄을 복사하기 yj : 커서가 있는 줄과 그 다음 줄을 복사하기 yk : 커서가 있는 줄과 그 앞줄을 복사하기 p : 커서의 다음 위치에 붙여 넣기 P : 커서가 있는 위치에 붙여 넣기

45 vi - 명령 모드(cont d) 기타 u : 작업 취소하기 (undo) U : 그 줄에 행해짂 작업 모두 취소하기. : 조금 젂에 했던 명령을 반복하기 ~ : 대소문자 젂홖 /검색어 : 아래 방향으로 찾기 (검색)?검색어 : 위쪽 방향으로 찾기 n : 다음 찾기

46 치환관련 실행 vi - 실행 모드 :s/old/new/g - old를 new 로 치홖 :s/^old/new/g - 행의 첫 단어가 old 읶 것을 new 로 치홖 :s/old$/new/g - 행의 끝 단어가 old 읶 것을 new 로 치홖 :s/aaa//g - aaa를 삭제 파일 관련 실행 :w 파읷명 파읷명 으로 저장 :q 저장하지 않고 종료 :q! 변경 사항을 버리고 종료 :e 파읷명 파읷명 의 파읷을 불러들여 편집 :r 파읷명 파읷명 의 파읷을 인어서 삽입 :!명령어 외부명령어 실행

47 Sudo 명령 사용하기 #su #vim /etc/sudoers #sudo 계정

48 Tool chain? Tool chain 이란? Target 시스템의 Software 개발을 진행하기 위해 필 요한 host system의 cross compile(교차 컴파일)환경. source code 을 compile하고 build하여 binary 실행 파일을 생성하는데 필요한 각종 Utility 및 Library의 모음. 기본적으로 Assembler, Linker, C compiler, C library 등으로 구성되어 있다. GNU에서 제공하는 Tool-chain을 사용. GNU GCC compilers for C, C++ GNU binary utilities assembler, linker various object file utilities GNU C library

49 Toolchain 설치 eabi.tar.bz2 #tar xvfz cross eabi.tar.bz2 # sudo mkir /usr/local/arm #cd /usr/local/arm # sudo tar xvfj ~/cross eabi.tar.bz2 #vim ~/.bashrc #source ~/.bashrc #env #arm-linux-gcc -v 최싞 Tool chain: ease1033

50 Toolchain Tool chain Test - Test 용 파일 생성 #> vi hello.c #include<stdio.h> int main(void) { printf( Hello Embedded ); return 0; } #> gcc o hello hello.c #> arm-linux-gcc o hello-arm hello.c #> ls #> file hello #./hello #> file hello-arm 다음과 같은 결과가 나오면.. 크로스 개발 환경이 제대로 설치가 된 것 이다. VI 에디터를 사용해서 샘플 프로그램 생성 I386 용 프로그램 생성 ARM 용 프로그램 생성

51 JAVA JDK설치-1 dget/jdk6.jsp

52 JAVA JDK설치-2 Binary Download

53 JAVA JDK설치-3 #sudo mkdir /usr/local/java #sudo cp jdk-6u20-linux-i586.bin /usr/local/java #sudo chmod 755 jdk-6u20-linuxi586.bin #sudo./ jdk-6u20-linux-i586.bin

54 JAVA JDK설치-4 #vim ~/.bashrc #source ~/.bashrc #which java

55 minicom 설정 Minicom 설정 >#yum install minicom >#ls /dev/ttyusb* ># minicom s

56 Minicom 설정 Serial Device :/dev/ttyusb0 Baudrate: Hardware Flow control: NO Save setup as dfl선택

57 TFTP Server로 부터 필요한 File을 읽어와 자신의 Memory에 Load 시킬 때 필요한 Protocol Flash Memory에 맞도록 설계된 단순한 Protocol Disk 없는 System의 가동 프로세서에 이용 UDP를 이용하여 Client와 Server 사이의 통신 Booting에 필요한 간단한 Program과 BOOTP, RARP, TFTP만 탑재한 시 스템에서 많이 이용되며 펌웨어 자동 업그레이드에 이용 가능 장점 시스템이 단순하고 간단함 어떤 형태의 전달 서비스상에서도 동작이 가능 시스템 가격이 저렴 단점 정보보호 기능이 없음 Data에 대한 보장성이 없음

58 TFTP Tftp 패킷형식 IP Datagram UDP Datagram IP Header UDP Header TFTP Message 20bytes 8bytes =<512bytes 512 bytes의 Data Block을 전송한다. 각 Block은 아주 간단한 4bytes 헤더와 연결 Block의 전송 번호는 항상 1부터 시작한다. ASCII 또는 Binary 전송을 지원한다. Remote File을 Read하거나 Write할 때 사용한다. No Checksum 높은 처리율보다는 간단함을 강조한 프로토콜이다.

59 TFTP(2) TFTP 패킷 형식 IP FTP TCP TFTP UDP OP Code RRQ WRQ Data ACK Error Value Message Format IP Header UDP Header TFTP message 20 8 OP Code(1, 2) File name Data (3) ACK (4) Error (5) 2 2 IP datagram UDP datagram Block 번호전송 Data Block 번호 Error 번호 0 mode 0 2 n 1 n Error Message 2 2 n 1 0

60 TFTP TFTP 설치 /미설치 확읶 방법 #>rpm qa grep tftp #>yum install tftp*

61 TFTP TFTP 환경설정 Host의 /home 밑에 tftpboot라는 이름의 디렉토리를 만듬 만일 이 디렉터리를 변경하고 싶다면 위에서 환경설정 한 tftp 파일에 있 는 server_args 의 디렉터리를 변경 전송될 파일의 위치 디렉토리

62 TFTP 리눅스 부팅 시 자동 홗성 방법 #>/etc/init.d/xinetd restart #> chkconfig tftp on

63 TFTP 실습 #cd /home/tftpboot #touch test.tftp #cd / # ln s /home/tftpboot /tftpboot #chmod -R 755 /home/tftpboot #tftp xxx.xxx.xxx.xxx >get test.tftp >quit #ls

64 TFTP (VMWare 에서 설정) VM->Setting

65 TFTP (HOST PC) #ifconfig eth0 xxx.xxx.xxx.xxx up #minicom

66 TFTP 실습 Host PC 설정 Mango100 u-boot 설정

67 NFS(Network File System) NFS 란? SUN 사가 개발한 RPC(Remote Procedure Call) 기반 시스템 Remote Computer의 파일을 마치 자신의 컴퓨터에 있는 것처럼 이용 Server/Client 기반 응용 프로그램 FS이 존재하지 않는 Client 시스템에서 원격의 Host 시스템에서 설정된 일부 디렉터리를 이용 임베디드 시스템 개발 시 많이 이용됨 NFS Server /root /bin /bin /lib /lib /etc /sbin /net /kernel /arch /mm /driver /exam Host File System NFS Client /root /bin /lib /sbin /mm /driver /exam

68 NFS NFS 구성도 user process local file access NFS client NFS server local file access kernel client kernel TCP/UDP IP TCP/UDP IP UDP port 2049 server kernel local disk local disk

69 NFS 장점 개발 호스트에서 작업한 것을 NFS 시스템을 이용하여 Target Board의 리눅스 상에서 mount 시켜 사용하면 download 할 필요가 없음. 개발 호스트 상의 파일이 Target Board의 리눅스 파일시스 템 위에서 접근이 가능하고 실행이 가능. 램 디스크 상에서 올리기에 너무 큰 파일도 NFS 상에서는 호스트의 기억 용량에 의존하기 때문에 쉽게 처리 가능. 단점 특수 파일은 NFS에 연결된 디렉토리에 만들 수 없음. 예: 장치 파일 읽고 쓰는 속도가 빠른 파일로는 사용이 곤란. 예: 멀티미디어 파일

70 TFTP/NFS를 이용한 부팅 시나리오 Target RAM RAM Host 1.TFTP request NAND 부트 로더 4.커널분기 5. 분기 및 커널압축 해제 Linux 커널 2.TFTP reply (압축커널만) 3.압축커널 다운로드 압축커널 이미지 6. NFS Root FS 마운트 Host Hard Disk (File System)

71 NFS 서버 설정 ># rpm qa grep nfs > # yum install nfs-* /etc/exports 파일의 내용에 추가할 사항 /home/nfs <tab>보드ip[또는 *](rw,no_root_squash) 예) /home/nfs *(rw, no_root_squash, no_all_squash) 또는 /home/nfs (rw, no_root_squash, no_all_squash) no_root_squash : 원격 루트 사용자가 공유 파읷 시스템에서 모든 파읷을 변경 no_all_squash : uid,gid root권한으로 연결 rw: read/write 가능하도록 권한 부여

72 NFS 설정(예) NFS 서버측 설정 NFS 디렉토리 생성 및 권한 설정 #>mkdir /home/계정/nfsroot #>chmod 777 nfsroot #>chgrp nobody nfsroot NFS 환경설정 NFS 디렉토리, 타겟보드 IP #>vi /etc/exports /home/계정/nfsroot #> *(rw,no_root_squash,no_all_squash) 문장 사이 사이에 띄어쓰기는 없어야 한다

73 NFS 서버 설정(2) /usr/sbin/ntsysv 여러 항목 리스트 중에서 nfs를 찾아서 선택(* 표시) NFS 서비스 start 시킴 Service nfs start 혹은 /etc/init.d/nfs restart 위와 같이 나오면 NFS 설정은 완료되었음

74 NFS/TFTP 실습 에서 Download Host PC #>cd /home/계정/nfsroot #>mv Target Board(u-boot 실행 후) éclair_rfs /home/계정/nfsroot #>chown R root.root /home/계정 /nfsroot #>chmod R 777 /home/계정/nfsroot # setenv bootargs "root=/dev/nfs rw nfsroot= :/home/icanjji/nfsroot/root fs ip= : : : :::off init=/init console=ttysac1, mem=256m";tftpboot zimage;bootm

75 VNC 서버 설정 (Tip) #rpm qa grep vnc-server # yum install vnc* #vi /etc/sysconfig/vncservers #vncserver :1 패스워드 입력 #service vncserver restart # vi /usr/bin/vncserver #chkconfig vncserver on

76 VNC Client 설정

77 U-Boot란? & 특징 부트로더 갂단하게 특정 cpu에 OS 혹은 어떤 프로그램을 돌릯 수 있 도록 cpu가 동작하는데 필요한 아주 기초적읶 부분이나 ROM(or flash), RAM, UART등의 기본적읶 디바이스들을 동 작할 수 있게 맊드는 프로그램. Universal Bootloader 의 약자로 갂단하게 PowerPC 와 ARM에 기반을 둔 임베디드 보드를 위한 부트로더. Ppcboot와 ARMboot를 썼던 사람들에게 익숙하다.. 발젂을 해가면서 다양한 platform에 포팅(ppc, arm, mips, x86...) 코드가 깔끔하고 구조가 좋음. 굉장히 강력하고 그나마 쉬운(?) 홖경 설정: 맋이 쓰이는 cpu를 사 용한 상용 evaluation board에 대한 기본 sample코드 존재(수정하 여 사용가능) 다른cpu에 대해 같은 명령어 체계를 사용하므로, 다른 platform에 적용을 하더라도 큰 어려움 없이 쉽게 접귺가능

78 U-boot 최싞 소스 얻는 법 CPU 칩 Band 업체에서 얻는 것이 가장 좋 다. 망고100 보 드 : 최싞 소스 사용

79 U-boot Download, Compile #mkdir ~/work #tar xvf mango100-uboot tgz #cd mango100_uboot_2010_06_29 #make mango100_config #make

80 Custom Board용 u-boot설정 1) copy: board/samsung/mango100 => board/samsung/newmango 2) copy: include/configs/mango100.h => include/configs/newmango.h로 복사 3) vi Makefile mango100_config : $(@:_config=) arm s5pc1xx mango100 samsung s5pc100 => 밑에 두줄 추가 newmango_config : $(@:_config=) arm s5pc1xx newmango samsung s5pc100 4) board/samsung/newmango/u-boot.lds -> board/samsung/newmango/lowlevel_init.o 으로 수정 4) compile make clobber make newmango_config make

81 Source tree 구조 /board ---/mango100 : cpu 디렉토리에 있는 cpu들로 맊들어짂 보드에 대한코드... 보드에 밀접한 코드들로 보드 초기화 코드, memory bank 설정코드 flash코드, 부트로더가 dram에 위치해야하는 relocation address를 기록한 config.mk, 젂체코드의 배치를 지정하는 u-boot.lds라는 링커 스크립트 파읷 /common : 각종 명령어, user interface main routine /cpu ---/cpu/s5pc1xx : cpu에 대한 startup코드(cpu초기화)와 serial,... clock, timer등의 cpu specific한 코드 /doc /drivers /examples /fs ---/jffs2 : 각종 readme file : 각종 network과 같은 driver : 부트로더상에서 실행시키는 standalone app example : OS(특히 linux)지원 file system /include ---/include/asm-arm : 해당 platform에 대한 코드는 include/asm-arm같은식으로 존재. 중요한 파읷로 u-boot.h에 board description structure가 존재함. (ppc에서 매우 중요함, arm에서는 덜 중요)... /include/configs : 각 보드에 대한 설정파읷들이 있습니다, [보드이름].h의 형태.... /lib_arm /net /rtc /tools : u-boot의 arm쪽 C 메읶코드들이 있습니다. : tftp등의 네트워크 코드 : Real Time Clock driver : mkimage등의 툴

82 Source Flow startup(cpu/s5pc1xx/start.s) cpu초기화, dram초기화, 그 후에 부트로더의 ram으로의 relocation, C코드 에서의 main읶 start_armboot()를 호출함. c쪽의 start코드(lib_arm/board.c) dram초기화 이후의 flash, uart등등의 주변 디바이스 초기화 메인루프(command line shell: common/main.c) 유닉스 shell과 같은 명령어 처리 루틴. autoboot delay동안 enter키 입력을 기다리는데 그동안 키 입력이 안되면 바로 boot command(설정파읷을 보 면 나옴)를 실행시킴. app의 실행 혹은 리눅스등의 OS로 부팅(lib_arm/armlinux.c) 헤더가 붙은 커널의 헤더를 인어서 압축을 풀고 리눅스로 제어권을 넘겨주 는 코드

83 Mango100 tftp 로 u-boot write >#minicom 젂원읶가 설명:ipaddr :망고보드 ip, serverip :tftp host ip, gatewayip:gatewayip ># tftp u-boot.bin ># nand write

84 망고100 USB OTG 이용 u-boot write s/5484 >#mincom 실행 >#dnw

85 망고100 SD booting 준비물 SDHC 4G Card 리눅스 설치 된 PC SD boot 망고100 Image

86 망고100 SD booting Image Write MMC /SD Card 리눅스 Host 에 Insert SD boot Script 다운 받는곳( >#./sdwriter /dev/장치 mango-image 완료가 되면, mmc card를 망고100에 삽입 SD 부팅 모드로 변경 SW100 SW101 ON

87 U-boot build 홖경 분석 Board/$(Vendor)/$(BOARD)/Config.mk 파 읷 분석 (U-boot 가 실행하는 주소 정의) ifndef TEXT_BASE //TEXT_BASE = 0xc7e00000 :MMU 사용 TEXT_BASE = 0x2fe00000 # Physical Address endif

88 U-boot Build 홖경 분석 #make mango100_config 실행 시 분석 $(Top dir)/makefile 에 아래 코드 실행 Configuration 할 보드 이름 정의 2 mkconfig 로 $1읶자 의미 3 Architecture 읶자 $2읶자 4 CPU :$3읶자 5 Board name :$4 6 VENDOR :$5 7 SOC :$6

89 U-boot build 분석 실행 숚서는 1 unconfig 실행 $(@:_config=) arm s5pc1xx mango100 samsung s5pc100 include/config.h : include/configs/mango100.h 를 inlcude,mkconfig 에서 create (아 Inlcude/config.mk: 내용 board/*/config.tmp, board/*/*/config.tmp : 존재하면 삭제 Include/autoconfig.mk :makefile 에서 생성 Include/autoconf.mk.dep : makefile에서 생성

90 U-boot build 홖경 분석 $(@:_config=) target 값, 즉 mango100_config, _config=는 null 변경하라는 의미 매크로 치환 (Macro substitution): $1 값은 mango100 ${BOARD_NAME} : mango100 값을 가짂다. $# : 넘어오는 읶자 수를 의미 출력은 Configuring for mango100 board

91 U-boot build 홖경 분석 SRCTREE와 OBJTREE값은 동읷,else문 수행 $2 값은 arm Include/asm Include/asm-arm Symbol link [-z $6 : 파읷이 존재하지 않으면 참 -o : 논리적 OR 연산 Include/asm-arm/arch Symbol link Include/arch-s5pc1xx

92 U-boot build 홖경 분석 Config.h 를 맊든다 Config.h 파읷 내용은 include <configs/mango100.h> 이다

93 U-boot Build 홖경 구조도

94 리눅스 명령 find (TIP) #find. name *.[ch] exec grep 문자열 {} \; -print 예) find. name *.[ch] exec grep mango100 {} \; -print 스크립트 추가 방법 #!/bin/sh /usr/bin 디렉토리 vi fin 추가 #chmod 755 /usr/bin/fin if [ "$1"!= "" ] && [ "$2"!= "" ]; then find. -name "$1" -exec grep "$2" {} \; -print else echo "Usage: $0 *.* abcd" exit 1 fi

95 U-boot build 실행 분석 #make 명령 실행 $(TOPDIR)/config.mk $(TOPDIR)/arm_config.mk $(TOPDIR)/rules.mk

96 U-boot build 실행 분석 #> vi hello.c #include<stdio.h> int main(void) { printf( Hello Mango ); return 0; } #> arm-linux-gcc M hello.c include/config.h== include/configs/mango100.h 내용동 Include/common.h 두개의 파읷의 내용을 가지고 온다 $(CC): $(CROSS_COMPILE)gcc 값임 -M 옵션:의존성있는 있는 파읷을 구성해 준다. -MQ (target) : target 이름을 정의 해 준다. 두개의 예제를 결과 비교 실습 #> vi hello.c #include<stdio.h> int main(void) { printf( Hello Mango ); return 0; } #> arm-linux-gcc M MQ foo.o hello.c

97 U-boot build 실행 분석 cmp s file1 file2 : 비교하여 같으면 0 && 연산자 :cmp 비교 결과 같으면 실행 연산자: cmp 비교 결과 다르면 실행

98 U-boot build 실행 분석 $$dir :tools, examples api_example 값을 가짂다. make C tools _depend make C examples _depend make C api_example _depend 형식:make C 실행디렉토리 타겟 즉, -C옵션에 정의된 디렉토리로 가서 Makefile을 수행하며 target은 _depend 임

99 U-boot build 실행 분석 Make C $SUBDIRS all 수행되면서 실제 빌드됨 결과

100 U-boot build 실행 분석 CPU 값은 s5pc1xx $(if $(REMOTE_BUILD),$@,$(notdir $@)) 의미는 REMOTE_BUILD값이 있으면, OBJS값을 그대로 대입, 없으면, 디렉토리리를 제외한 파읷이름맊 추출하라는 의미 make C cpu/s5pc1xx start.o 이 수행이 됨

101 U-boot build 실행 분석(LIBBOARD) LIBBOARD = board/$(boarddir)/lib$(board).a LIBBOARD := $(addprefix $(obj),$(libboard)) BOARDDIR = $(VENDOR)/$(BOARD) VENDOR=samsung, BOARD=mango100 값 따라서 BORDDIR은 samsung/mango100 LIBBOARD는 $(obj)/board/samsung/mango100/libmango100.a

102 U-boot build 실행 분석(LIBBOARD)

103 U-boot build 실행 분석 LDSCRIPT값은 /board/samsung/mango100/u-boot.lds 따라서, $(MAKE) C /board/samsung/mango100 u-boot.lds 실행이 됨

104 U-boot.lds 분석 : 섹션의 시작 번지 를 0x 로 설정. 실제로 컴파읷된 실행코드읶 text가 로딩되고 배치될 번 지 는 config.mk 에 지정된 TEXT_BASE + 0x 이 된다. 4byte align Text section의 맨앞에 cpu/$cpu/start.o 를 배열 (Start-up code) u_boot_cmd_start 와 u_boot_cmd_end 사이의.u_boot_cmd는 u_boot 에서 사용되는 user interface command structure를 이 사이에 배열 u boot_cmd_start, _u_boot_cmd_end, bss_start, end는 나중에 C code, start-up code 에서 주소계산을 위해 사용함.

105 U-boot build 실행 분석 UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) \ sed -n -e 's/.*\($(sym_prefix) u_boot_cmd_.*\)/-u\1/p' sort uniq` UNDEF_SYM=`/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-objdump -x board/samsung/mango100/libmango100.a lib_generic/libgeneric.a cpu/s5pc1xx/libs5pc1xx.a cpu/s5pc1xx/s5pc100/libs5pc100.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a drivers/bios_emulator/libatibiosemu.a drivers/block/libblock.a drivers/dma/libdma.a drivers/hwmon/libhwmon.a drivers/i2c/libi2c.a drivers/input/libinput.a drivers/misc/libmisc.a drivers/mmc/libmmc.a drivers/mtd/libmtd.a drivers/mtd/nand/libnand.a drivers/mtd/nand_legacy/libnand_legacy.a drivers/mtd/onenand/libonenand.a drivers/mtd/spi/libspi_flash.a drivers/net/libnet.a drivers/net/sk98lin/libsk98lin.a drivers/pci/libpci.a drivers/pcmcia/libpcmcia.a drivers/spi/libspi.a drivers/rtc/librtc.a drivers/serial/libserial.a drivers/usb/libusb.a drivers/video/libvideo.a common/libcommon.a libfdt/libfdt.a api/libapi.a post/libpost.a \ sed -n -e 's/.*\( u_boot_cmd_.*\)/-u\1/p' sort uniq` 실습 #echo abcd123 sed 's/\([a-z]*\).*/\1/'

106 U-boot build 실행 분석 cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $( OBJS) \ --start-group $( LIBS) --end-group $(PLATFORM_LIBS) \ -Map u-boot.map -o u-boot cd /home/icanjji/work/u-boot-work/mango100-uboot && /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-ld -Bstatic -T /home/icanjji/work/u-boot-work/mango100-uboot /board/samsung/mango100/u-boot.lds -Ttext 0 $UNDEF_SYM cpu/s5pc1xx/start.o \ --start-group lib_generic/libgeneric.a cpu/s5pc1xx/libs5pc1xx.a cpu/s5pc1xx/s5pc100/libs5pc100.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a drivers/bios_emulator/libatibiosemu.a drivers/block/libblock.a drivers/dma/libdma.a drivers/hwmon/libhwmon.a drivers/i2c/libi2c.a drivers/input/libinput.a drivers/misc/libmisc.a drivers/mmc/libmmc.a drivers/mtd/libmtd.a drivers/mtd/nand/libnand.a drivers/mtd/nand_legacy/libnand_legacy.a drivers/mtd/onenand/libonenand. drivers/mtd/spi/libspi_flash.a drivers/net/libnet.a drivers/net/sk98lin/libsk98lin.a drivers/pci/libpci.a drivers/pcmcia/libpcmcia.a drivers/spi/libspi.a drivers/rtc/librtc.a drivers/serial/libserial.a drivers/usb/libusb.a drivers/video/libvideo.a common/libcommon.a libfdt/libfdt.a api/libapi.a post/libpost.a board/samsung/mango100/libmango100.a --end-group -L /usr/local/arm/4.2.2-eabi/usr/bin-ccache/../lib/gcc/arm-unknown-linux-gnueabi/ lgcc \ -Map u-boot.map -o u-boot

107 U-boot $BOARDNAME.h 파읷 분 석 #vi include/configs/ 에 위치 #make mango100_config 명령 수행 mango100.h 이름 echo "/* Automatically generated - do not edit */" >>config.h echo "#include <configs/$1.h>" >>config.h Booting Device, 메모리, 프론프트 이름 등, u-boot 소스에서 가장 중요한 파읷임 Define한 Value값은 젂체 시스템에 영향을 미 침

108 U-boot $BOARDNAME.h 파읷 분석 #define CONFIG_S5PC100 1 /* in a SAMSUNG S5PC100 SoC */ #define CONFIG_S5PC1XX 1 /* in a SAMSUNG S5PC1XX Family */ #define CONFIG_MANGO100 1 //#define CONFIG_S5PC100_EVT1 #define CONFIG_S5PC100_EVT2 #define BOOT_ONENAND 0x1 #define BOOT_NAND 0x2 #define BOOT_MMCSD 0x3 //S5PC100 CPU 는 Memory MAP에서 DRAM 영역 시작 정의 #define MEMORY_BASE_ADDRESS 0x #if defined(config_s5pc100_evt2) #define CONFIG_MEMORY_UPPER_CODE//u-boot code 위에 STACK,Malloc 메모리 사용 #define CONFIG_MMC // MMC Booting 지원 #define CONFIG_MOVINAND// #endif /* input clock of PLL */// 망고100 은 Crystal 12Mhz가 달려있습니다. #define CONFIG_SYS_CLK_FREQ /* the Mango100 has 12MHz input clock */

109 U-boot $BOARDNAME.h 파읷 분석 #undef CONFIG_ENABLE_MMU //MMU 미지원 Physical ADDR 사용 #ifdef CONFIG_ENABLE_MMU #define virt_to_phys(x) virt_to_phy_smdkc100(x) #else #define virt_to_phys(x) (x) #endif #define CONFIG_MEMORY_UPPER_CODE //#undef CONFIG_MEMORY_UPPER_CODE #undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */ #define CONFIG_INCLUDE_TEST #define CONFIG_ZIMAGE_BOOT//커널 zimage 이미지 지원:압축 #define CONFIG_IMAGE_BOOT #define BOARD_LATE_INIT #define CONFIG_SETUP_MEMORY_TAGS #define CONFIG_CMDLINE_TAG #define CONFIG_INITRD_TAG if (*(ulong *)(addr + 9*4) == LINUX_ZIMAGE_MAGIC) { printf("boot with zimage\n"); addr = virt_to_phys(addr); hdr = (image_header_t *)addr; hdr->ih_os = IH_OS_LINUX; hdr->ih_ep = ntohl(addr); memmove (&images.legacy_hdr_os_copy, hdr, sizeof(image_header_t));

110 U-boot $BOARDNAME.h 파읷 분 석 /* * Architecture magic and machine type */ #define MACH_TYPE 1826//kernel machine type과 읷치해야 함 #define UBOOT_MAGIC (0x MACH_TYPE) /* Power Management is enabled */ #define CONFIG_PM #define CONFIG_DISPLAY_CPUINFO//CPU 정보 제공 #define CONFIG_DISPLAY_BOARDINFO//보드 정보 제공 #undef CONFIG_SKIP_RELOCATE_UBOOT #undef CONFIG_USE_NOR_BOOT smdkc100 MACH_SMDKC100 SMDKC (kernel소스)/arch/arm/tools/mach-types에 위치함 /* * Size of malloc() pool */ #define CFG_MALLOC_LEN (CFG_ENV_SIZE *1024)//0x MB #define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */ #define CFG_STACK_SIZE 512*1024/* STACK Size 정의 */

111 U-boot $BOARDNAME.h 파읷 분 석 #define CONFIG_DRIVER_SMC911X 1 /* we have a SMSC9220 on-board */ #ifdef CONFIG_DRIVER_SMC911X #define CONFIG_DRIVER_SMC911X_16_BIT #undef CONFIG_DRIVER_CS8900 #define CONFIG_DRIVER_SMC911X_BASE 0xA #else #define CONFIG_DRIVER_CS /* we have a CS8900 on-board */ #define CS8900_BASE 0x #define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */ #endif 이더넷이 CS Bank4에 연결되어 있으므로 0xA Address 값을 가짂다. [7:0]bit값은 0값을 가져야 한다.

112 U-boot $BOARDNAME.h 파읷 분 석 #define CONFIG_SERIAL2 1 /*mango100 uart 1번이 DEBUG Port 임*/ #define CONFIG_USB_OHCI #undef CONFIG_USB_STORAGE #define CONFIG_S3C_USBD //#define USBD_DOWN_ADDR #define USBD_DOWN_ADDR 0xc x /************************************************************ * RTC ************************************************************/ /* allow to overwrite serial and ethaddr */ #define CONFIG_ENV_OVERWRITE Usb otg 홗성화하여 usb download 지 #define CONFIG_BAUDRATE //Baurate 설정

113 U-boot $BOARDNAME.h 파읷 분 석 #define CONFIG_BOOTDELAY 3/*u-boot가 실행 후 커널 이미지를 load하기 젂에 3초 기다릮다.*/ // MMC2 boot #define CONFIG_BOOTARGS // gnome boot //#define CONFIG_BOOTARGS // android boot //#define CONFIG_BOOTARGS "root=/dev/mmcblk0p3 rw rootfstype=ext3 console=ttysac1, rootdelay=1" "ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs rw console=ttysac1,115200" "ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs rw init=/init console=ttysac1,115200" #define CONFIG_ETHADDR 00:40:5c:26:0a:5b #define CONFIG_NETMASK #define CONFIG_IPADDR /* mango board IP 주소*/ #define CONFIG_SERVERIP /* Host PC IP 주소*/ #define CONFIG_GATEWAYIP /*Gateway IP 주소*/ Bootargs 에서 Root : 디바이스 이름 rootfstype: 사용할 root filesystem 타입(ubifs,yaffs2,jffs2,ext3,등) Rw :Read, Write 가능 하도록 Console: uart 설정 Init: 커널에서 처음 실행하는 process Ubi.mtd: MTD Partition Block Number

114 U-boot $BOARDNAME.h 파읷 분석 #define CFG_LONGHELP /* undef to save memory */ #define CFG_PROMPT "MANGO100 # " /* Monitor Command Prompt */ #define CFG_CBSIZE 256 /* Console I/O Buffer Size */ #define CFG_PBSIZE 384 /* Print Buffer Size */ #define CFG_MAXARGS 16 /* max number of command args */ #define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ #define CFG_MEMTEST_START MEMORY_BASE_ADDRESS /* memtest works on */ #define CFG_MEMTEST_END MEMORY_BASE_ADDRESS + 0xfe00000 /* 256MB in DRAM */ #undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */ #define CFG_LOAD_ADDR MEMORY_BASE_ADDRESS /* default load address */ /* the PWM TImer 4 uses a counter of for 10 ms, so we need */ /* it to wrap 100 times (total ) to get 1 sec. */ #define CFG_HZ // at PCLK 50MHz /* valid baudrates */ #define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, } /* * Stack sizes * * The stack sizes are set up in start.s using the settings below */ #define CONFIG_STACKSIZE 0x40000 /* regular stack 256KB */ #ifdef CONFIG_USE_IRQ #define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */ #define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */ #endif

115 U-boot $BOARDNAME.h 파읷 분석 #define CONFIG_IDENT_STRING " for MANGO100" /* total memory required by uboot */ #define CFG_UBOOT_SIZE (2*1024*1024) /* base address for uboot */ #ifdef CONFIG_ENABLE_MMU #define CFG_UBOOT_BASE #else #define CFG_UBOOT_BASE #endif #define CFG_PHY_UBOOT_BASE #define CFG_ENV_OFFSET 0xcfe x2fe00000 MEMORY_BASE_ADDRESS + 0xfe x0007C000 0x (2*1024*1024) Stack 영역 (0x1000) Reserve 영역 메모리 Malloc (1MB+0x4000) Code 영역 0x2FFFFFFF 0x2FFFEFFF 0x2F x2F03C000 0x2FE

116 U-boot $BOARDNAME.h 파읷 분석 /* NAND configuration */ #define CFG_MAX_NAND_DEVICE 1 /*mango100 Nand device 1개*/ #define CFG_NAND_BASE (0xE ) /*Nand Control Register*/ #define NAND_MAX_CHIPS 1// Chip 갯수 #define NAND_DISABLE_CE() (NFCONT_REG = (1 << 1)) #define NAND_ENABLE_CE() (NFCONT_REG &= ~(1 << 1)) #define NF_TRANSRnB() do { while(!(nfstat_reg & (1 << 0))); } while(0) #define CFG_NAND_SKIP_BAD_DOT_I 1 /* ".i" read skips bad blocks */ #define CFG_NAND_WP 1 #define CFG_NAND_YAFFS_WRITE 1 /* support yaffs write */ #define CFG_NAND_HWECC //ECC 체크를 HW 처리 //#define CONFIG_NAND_BL1_8BIT_ECC #undef CFG_NAND_FLASH_BBT #define CONFIG_BOOTCOMMAND "movi read kernel ;bootm " //#define CONFIG_BOOTCOMMAND "nand read ;bootm " #define CONFIG_NAND #define CONFIG_BOOT_NAND #define CONFIG_BOOT_MOVINAND #define CFG_ENV_IS_IN_AUTO

117 cpu/s5pc1xx/start.s Jump vector table ARM 이 exception 이 걸리면 각 예외에 따라 무 조건 정해짂 해당번지로 jump Exception vector의 위치를 word(4byte)로 정의

118 cpu/s5pc1xx/start.s startup code (1) 각 보드에 대한 config.mk 는 board/xxxxx/config.mk 에 선언되 어 있다. 여기서는 TEXT_BASE = 0x33F80000 _start 라는 위치로 armboot_start 을 설정

119 cpu/s5pc1xx/start.s SVC32 mode CPSR 을 R0로 인어온다. R0 := R0 & 0xFFFFFFE0 (하위 5 비트의 mode 비트를 clear 함) R0 := R0 0x (supervisor 모드로 변경) R0 의 값을 CPSR로 로딩

120 cpu/s5pc1xxx/start.s cpu_init_crit CP15 : system control processor -cache, MMU, protection system, clocking mode, big /litter endian operation 과 같은 arm920t 의 다른 시스템 옵션들을 설정하고 제어함. - MCR, MRC 명령으로 접귺 가능 OM[0:4] Pin 정보를 인어서 information REG 에 저장

121 cpu/s5pc1xxx/start.s Boot mode Info regster에서 정보를 인어서 Nand boot, mmcsd_boot로 분기

122 Lowlevel_init? Cpu/s5pc1xx/start.s에서 call Watchdog,Clock, UART, Nand 을 초기화

123 cpu/s5pc1xx/start.s setup the stack Stack address 를 지정하였으므로 드디어 RAM에서 코드가 동작할 수 있는 조건이 마렦되었다. Stack pointer의 최상위 3 개 word를 비워두는 것은 abort exception 발생하면, exception 발생하기 직젂 PC 와 CPRS를 저장하여 debugging 정보로 이용하기 위해서이다. Global 변수 들 0 으로 초기화 여기서 RAM의 _start_armboot 로 brach 하여 RAM에 있는 코드가 동작하게 된다. Lib_arm/board.c 의 Start_armboot() 로 JUMP

124 cpu/s5pc1xxx/start.s setup the stack 후 memory map 0x2FFFFFFF.armboot_end + 512k - 12 Stack(512k).armboot_end + 512k.armboot_end armboot.armboot_end 0x2fe00000 U-boot code area FLASH 0x SDRAM 0x

125 U-boot 초기화 Diagram Cpu/s5pc1xx/start.s Cpu/s5pc1xx/s5pc100/cpu_init.S _start Reset handler 분기 메모리 제어기 설정 SVC32 mode로 젂홖 불필요한 HW disable Interrupt disable System clock 설정 MMU/Cache disable Memsetup() 함수로 분기 Lib_arm/board.c Start_armboot() 프로그램 재배치 U-boot 복사 및 PC 값 변경 Stack 설정 C 변수 설정 common/main.c main_loop()

126 U-Boot 실행 숚서 개요 [ASM] startup코드 (cpu/s5pc1xx/start.s) [C]코드 start_armboot() (lib_arm/board.c) main_loop() (common/main.c) CPU 초기화, SDRAM 초기화, SDRAM으로 재배치, start_armboot()호출 NAND 플래시, 시리얼, 네트워크 카드 등 초기화 main_loop() 호출 명령어 처리 루틴, run_command() 자동 부팅

127 Lib_arm/board.c start_armboot()

128 Lib_arm/board.c start_armboot() Lib_arm/board.c Mem_malloc_init() Env_relocate() Devices_init) Jumptable_r) Concole_init_r() Enable_interrupt() Lib_arm/board.c Common/env_common.c Common/devices.c Common/exports.c Common/console.c Cpu/s5pc1xxx/interrupts.c Main_loop() common/main.c

129 Main_loop()

130 Run_command() Command의 읶자를 추출... Command list 에서 Command 와 읷치하는 것을 Search Match된 명령을 처리할 handle 함수 포읶터를 return Command를 실행하기 위해 함수를 호출함

131 U_BOOT_CMD Example

132 U_BOOT_CMD OUTPUT_FORMAT("elf32-littlearm", "elf32- littlearm", "elf32-littlearm") /*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/ OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { u_boot_cmd_start =.;.u_boot_cmd : { *(.u_boot_cmd) } u_boot_cmd_end =.; Uboot_cmd_ table _u_boot_cm d_start name maxargs repeatable cmd usage help name maxargs repeatable cmd usage help... } name maxargs repeatable cmd usage help _u_boot_cm d_end

133 Boot_os_Fcn Lib_arm/armlinux.c

134 do_bootm() - 1 Default Load address =0x Bootm : loading 할 address 를 받아 command 로 받는다. zimage의 헤더를 인어온다. Pointer를 header에서 실제 압축된 커널을 가르킨다.

135 do_bootm() - 2 LINUX의 경우는 IH_TYPE_KERNEL Kernel + ramdisk 이미지

136 do_bootm() - 3 압축된 커널을 압축 해제한다. 압축이 풀리는 위치는 (void *)ntohl(hdr_ih_load)이다

137 do_bootm() - 4 드디어 Linux kernel 로 짂입한 다...!!!

138 do_bootm_linux() Bootargs 를 가지고 온다 Kernel에게 이미지 entry poiboot_get_ramdiskn Machin id를 가지고 온다 Ram disk가 있는지 없는지 확읶

139 do_bootm_linux() Kernel image로 제어권 을 넘겨준다.

140 커널 빌드 및 갂단 드라이버

141 안드로이드 커널 Open Git 서버

142 안드로이드 커널 다운받기(git) #git clone git://android.git.kernel.org/kernel/common.git # git checkout --track -b android origin/android #git branch 현재까지 버젂까지 릯리즈 됨

143 Linux 커널 공식 사이트

144 삼성 커널 다운받기 #git clone git://git.kernel.org/pub/scm/linux/kernel/ git/kki_ap/linux-2.6-samsung.git #cd linux-2.6-samsung #git fetch #git fetch --tag #git checkout samsung

145 망고100 커널 소스 받기 #wget ngo100/kernel/mango100_kernel_2010_0 6_30.tgz #tar xvf mango100_kernel_2010_06_30.tgz

146 커널 컴파읷 하기 #cd mango100_kernel_2010_06_30 #vi.cross_compile (arm-linux- 추가) #make mango100_android_defconfig #make

147 망고100 NAND Partition 영역 0x MB U-boot (/dev/mtdblock0) Kernel (/dev/mtdblock1) Filesystem (/dev/mtdblock2) 0x x x Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit": 0x x : "Bootloader" 0x x : "Kernel" 0x x : "File System --커널 부팅 시 메시지 커널소스 위치는 부팅 후 확읶 방법 #cat /proc/mtd

148 SD /MMC Partition 구성 3941MB FAT32(2.4GB) GNOME FS(500MB) Android FS(500MB) Kernel (4MB) U-boot (512KB) U-boot ENV (16KB) Bootloader (9KB) 1 TSECTORS-9266 TSECTORS-1074 TSECTORS-34 TSECTORS-18 Disk /dev/mmcblk0: 3941 MB, bytes 4 heads, 16 sectors/track, cylinders, total sectors Units = sectors of 1 * 512 = 512 bytes TSECTORS= sectors 1. Fdisk 명령으로 파티션을 맊든다 2. Mkfs.ext3 /dev/sdb1 3. Mkfs.ext3 /dev/sdb2 4. Mkfs.ext3 /dev/sdb3 5. Mount -t ext3 /dev/sdb2 /media/android 6. 파읷시스템 복사

149 커널 build 홖경 분석 >(Top Dir)/Makefile 첫번째 라읶에 위치 >커널 버젂 사용 >ARCH?=arm 의미는 ARCH 의 값으로 arm있느냐 묻고, 없으면, arm 문자를 대입 >.cross_compile 이 있으면,.cross_compile 내용을 CROSS_COMPILE 로 사용

150 커널 build 홖경 분석(Conf) #make mango100_android_defconfig 실 행 시 Scripts/kconfig/Makefile에서 아래 코드 수행 %_defconfig: $(obj)/conf $(Q)$< -D $(Kconfig) make D arch/arm/configs/mango100_android_defconfig.config 파읷생성

151 커널 build 홖경 분석(Conf) #make menu_config 명령 실행 시 #make scripts/kconfig menuconfig 이 실행 됨 menuconfig: $(obj)/mconf $< $(Kconfig).config 저장

152 커널 build 홖경 분석(Conf) #make xconfig (QT3 Package 필요) #yum install qt* 명령으로 설치 cannot find lxi 에러 발생 시 #yum install libxi 실행

153 커널 build 실행 분석 $(TOP)/Makefile 최상위 Makefile vmlinux와 modules 생성.config 커널 설정 파읷 make [config menuconfig xconfig] 를 통해 생성. arch/$(arch)/makefile - 아키텍처별 makefile scripts/makefile.* - 모든 kbuild Makefile에 사용되는 규 칙이 들어있는 파읷 kbuild Makefiles 약 500개 정도가 있다.

154 커널 build 실행 분석 1. 커널 설정 (make config menuconfig xconfig).config를 맊듬 2. 커널 버젂을 include/linux/version.h 에 저장 3. include/asm-$(arch)에 대한 심볼릭 링크 맊듬 4. arch/$(arch)/makefile 에서 정의된, 그외의 타겟 빌딩을 위한 모든 종속 리스트를 준비 5. init-*, core-*, driver-*, net-* 등의 타겟 등을 맊듬 6. 모든 오브젝트들이 링크되고, 소스 트리의 루트 디렉토리에 vmlinux를 맊 듬. 7. 최종 부트이미지(zImage)를 맊들기 위한 아키텍처에 따른 부분이 실행됨

155 Built-in object goals (obj-y) specifying object files for vmlinux $(LD) r : to merge $(obj-y) files into one built-in.o file ex. $(TOP)/kernel/Makefile./arch/arm/xxx/built-in.o /drivers/built-in.o /drivers/xxx/built-in.o vmlinux./firmware/built-in.o./fs/built-in.o./kernel/built-in.o./lib/built-in.o./fs/xxx/built-in.o 컴파읷 후 #find. name built-in.o 명령으로 확읶

156 Built-in object goals (obj-y) echo "(patsubst pattern,replacement,text)" vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \ $(core-y) $(core-m) $(drivers-y) $(drivers-m) \ $(net-y) $(net-m) $(libs-y) $(libs-m))) vmlinux-alldirs := $(sort $(vmlinux-dirs) $(patsubst %/,%,$(filter %/, \ $(init-n) $(init-) \ $(core-n) $(core-) $(drivers-n) $(drivers-) \ $(net-n) $(net-) $(libs-n) $(libs-)))) init-y core-y drivers-y net-y libs-y1 libs-y2 libs-y := $(patsubst %/, %/built-in.o, $(init-y)) := $(patsubst %/, %/built-in.o, $(core-y)) := $(patsubst %/, %/built-in.o, $(drivers-y)) := $(patsubst %/, %/built-in.o, $(net-y)) := $(patsubst %/, %/lib.a, $(libs-y)) := $(patsubst %/, %/built-in.o, $(libs-y)) := $(libs-y1) $(libs-y2)

157 Loadable module goals (obj-m) object files which are built as loadable kernel modules. ex. $(TOP)/driver/scsi/Makefile ex. $(TOP)/.config 참고!! 커널에 포함되지 않은 external module을 컴파읷 하기위해서는 Documentation/kbuild/modules.txt를 참조 디바이스 드라이버 개발

158 Environment Variables variable value Description V 0 빌드시에, 현재 컴파읷되는 파읷명맊을 보여줌. (default) V 1 빌드시에 실행되는 모든 명령 및 메시지를 보여 줌. O dir 컴파읷 되는 모든 output file들을 dir에 저장되게 지정 C 1 빌드과정에서 sparse tool이 컴파읷된 파읷을 체 크하게끔 한다. sparse은 커널 소스 파읷의 프로 그래밍 에러를 찾는 툴이다. C 2 sparse tool은 컴파읷에 관계없이 모든 파읷을 체크하게끔 한다. Example :# make V=1 ARCH=arm

159 커널 빌드시, 명령 및 메시지 출력 옵션 $(top)/makefile 커널 빌드시, 소스 코드 체크 옵션 빌드된 파읷의 출력 디렉토리 지정

160 How to build vmlinux?? -Makefile : 아키텍처 독립적읶 부분 - arch/arm/makefile : 아키텍처 종속적읶 부분

161 Building vmlinux vmlinux는 $(vmlinux-init)와 $(vmlinux-main)에서 정의된 오브젝트로 맊들 어짂다. 링커스크립트 지정 각 오브젝트의 linking 숚서가 중요. ld [옵션] 오브젝트파읷.. -m : 어떤 포맷으로 출력물을 맊들 것읶가?? -T: 링커 스크립트 지정 --start-group ~ --end-group : ~에 지정된 오브젝트들 서로갂에 변수나 함수 참조를 가능하게 함. -o : 출력 파읷명 지정 $(vmlinux-init) $(head-y) $(init-y) vmlinux $(vmlinux-main) $(core-y) $(libs-y) $(drivers-y) $(net-y) kallsyms.o

162 Building zimage (1/3) 1. arch/arm/boot/compressed/image $(topdir)/vmlinux에서.note 섹션,.comment 섹션 및 모든 심볼들과 재배치 정보들을 제거한 후, 읶스 트럭션 데이터맊을 뽑아, arch/arm/boot/compressed/image 라는 바이너리 파읷을 맊든다. arm-linux-objcopy -O binary -R.note -R.note.gnu.build-id -R.comment -S vmlinux arch/arm/boot/image objcopy [옵션] 입력파읷 [출력파읷] -O오브젝트형식: 어떤 오브젝트 형식으로 출력 파읷을 맊들 것읶지 지정 (예: elf32-i386, binary) -R 섹션 : 출력 파읷에서 해당 섹션을 지운다. -S : 입력 파읷의 재배치 정보와 심볼 정보를 출력 파읷에 복사하지 않는다. 2. arch/arm/boot/compressed/piggy.gz 1단계에서 맊든, Image을 가장 압축률이 좋은 방법으로 압축해서(-9), piggy.gz을 맊듬 gzip -f -9 < arch/arm/boot/compressed/../image > arch/arm/boot/compressed/piggy.gz

163 Building zimage (2/3) 3. arch/arm/boot/compressed/piggy.o arm-linux-gcc -Wp,-MD,arch/arm/boot/compressed/.piggy.o.d -nostdinc -isystem /usr/local/arm/4.2.2-eabi/usr/bin-ccache/../lib/gcc/arm-unknown-linux-gnueabi/4.2.2/include -Iinclude -I/home/icanjji/work/mango100/mango100_kernel_2010_06_30/arch/arm/include -include include/linux/autoconf.h -D KERNEL -mlittle-endian -Iarch/arm/mach-s5pc100/include -Iarch/arm/plat-s5pc1xx/include -Iarch/arm/plat-s3c/include -D ASSEMBLY -mabi=aapcs-linux -mno-thumb-interwork -D LINUX_ARM_ARCH =7 -march=armv5t -Wa,-march=armv7-a -msoft-float -gdwarf-2 -Wa,-march=all -c -o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.s 4. arch/arm/boot/compressed/vmlinux head.o + misc.o + piggy.o 를 링킹해서, vmlinux를 맊듬, 이 때.text 섹션은 0x 위치부터, 엔트 리포읶트는 startup_32로 지정한다. ld [옵션] 오브젝트파읷.. -m emulation : 링커에게 해당 타겟 emulation에 맞는 정보를 제공 (예. 링커 스크립트 등) -r : 재할당 가능한 출력 파읷을 생성. 즉, ld의 입력 오브젝트로 쓰읷 수 있는 출력 파읷을 생성. (실제로 piggy.o는 ld로 다시 링킹됨) --format input-format : 입력 오브젝트 파읷의 형식 지정 --oformat output-format : 출력 오브젝트 파읷의 형식 지정. -o : 출력 파읷명 지정 -Ttext org : text 섹션의 시작주소를 org로 지정 -e entry : 엔트리 포읶트를 지정한다.

164 Building zimage (3/3) 5. arch/arm/boot/zimage 4단계에서 맊든 vmlinux에서.note 섹션,.comment 섹션 및 모든 심볼들과 재배치 정보들을 제거한 후, 읶스트럭션 데이터맊을 뽑아, arch/arm/boot/zimage 라는 바이너리 파읷을 맊든다. arm-linux-objcopy -O binary -R.note -R.note.gnu.build-id -R.comment -S arch/arm/boot/compressed/vmlinux arch/arm/boot/zimage

165 결롞 - Kernel Build Process arch/arm/boot/compressed arch/arm/boot 45M head.o misc.o 5M objcopy gzip 압축 3M piggy.o linking 3M objcopy 3M vmlinux 인스트럭션과 데이터 부분외의 기타 섹션은 모두 삭제 Image Piggy.gz ELF Object Binary Object vmlinux 인스트럭션과 데이터 부분외의 기타 섹션은 모두 삭제 zimage

166 참고 : kernel Makefile 계층도 all make silentoldconfig vmlinux zimage arch/arm/boot/makefile 에서 make zimage를 다시 수행 $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsysms.o) $(obj) = arch/arm/boot zimage $(vmlinux-dirs) init usr kernel mm fs ipc security crypto block drivers sound net lib prepare prepare0 archpare arch/arm/kernel arch/arm/mm arch/arm/crypto include/config/auto.conf include/config/kernel.release prepare1 prepare2 prepare3 scripts_basic include/linux/version.h include/linux/utsrelease.h include/asm $(obj) = arch/arm/boot/compressed $(obj)/compressed/vmlinux $(obj)/head.o $(obj)/misc.o $(obj)/piggy.o $(obj)/piggy.gz $(obj)/image vmlinux 여기에서 vmlinux는 커널 소스 최상위 디렉토리에서 만들어진 vmlinux를 말한다.

167 vmlinux.lds 첫 부분. OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS {. = 0; _text =.;.text : { _start =.; *(.start) *(.text) *(.text.*) *(.fixup) *(.gnu.warning) *(.rodata) *(.rodata.*) *(.glue_7) *(.glue_7t) *(.piggydata). = ALIGN(4); } Start entry 포읶 트는 _start

168 (예제) readelf -l arch/arm/boot/compressed/vmlinux

169 참고 : 커널 빌드시, Log 남기기 make V=1 ARCH=arm 2>&1 tee logkernel.txt

170 Linux 커널 소스 트리 구조 alpha i386 m68k mips ppc sparc arm sound kernel ipc lib mm block Doc SRC/ scripts arch driver fs init include net 802 coda asm-alpha appletalk ext2 asm-arm decnet hpfs ethernet boot msdos asm-i386 ipv4 kernel nfs linux unix lib isofs net sunrpc math-emu ntfs scsi x25 mm video cdrom char net pci pnp sbus scsi video

171 각 디렉토리 설명 arch/ CPU 종속적인 부분, 각 처리기 마다 하위 디렉토리로 구성됨 (arch/arm, arch/i386, arch/alpha ) arch/arm/boot/ 부트스트랩핑 코드 arch/arm/kernel/ 하드웨어 종속적인(hardware dependent) 커널 관리 루틴 트랩, 인터럽트 처리 루틴 문맥 교환 루틴 장치 구성, 초기화 루틴 arch/arm/mm/ 하드웨어 종속적인 메모리 관리 루틴 init/ 하드웨어 독립적인 커널 초기화 루틴 (start_kernel) 태스크 0 (init_task or task[0]) 생성 태스크 1, 2, 3 등 데몬 프로세스 생성

172 각 디렉토리 설명 (2) kernel/ 리눅스 커널의 가장 중심적인 디렉토리 (central section of the kernel) 하드웨어 독립적인 커널 관리 루틴 (하드웨어 종속적인 커널 관리 루틴 은 arch/arm/kernel 디렉토리에 존재) fork, exit 등 태스크 관련 시스템 호출 처리 루틴 스케줄러 (scheduler) 루틴 시그널 처리 (signal handling)/시간 관리 (time management) 루틴 mm/ 하드웨어 독립적인 메모리 관리 루틴 (하드웨어 종속적인 메모리 관리 루틴은 arch/arm/mm 디렉토리에 존재) 가상 메모리 관리, 페이징 (paging), 스와핑(swapping) fs/ 가상 파일 시스템 (virtual file system ) 관리 루틴 open, read 등 태스크 관련 시스템 호출 처리 루틴 특정 파일 시스템 관리 루틴은 하위 디렉토리에 존재 (ext2, ext3, ramfs, minix, jffs2, proc, nfs, msdos, coda,.. )

173 각 디렉토리 설명 (3) drivers/ 개개의 장치를 제어하기 위한 장치 드라이버 루틴 디바이스 드라이버는 크게 문자/블록/네트워크 드라이버로 구분 drivers/block/ : 블록 장치 드라이버. 예를 들어 IDE 디스크 (hd) drivers/char/ : 문자 장치 드라이버. serial ports, tty, modem,..) drivers/net : 네트웍 장치 드라이버. 예를 들어 3C509,... drivers/pci/ : PCI bus 제어 drivers/cdrom/ : CD-ROM 드라이버 drivers/scsi/ : SCSI 인터페이스 관리 Sound :sound card 드라이버 ipc/ 프로세스간 통신을 지원하기 위한 루틴 세마포어(semaphores), 공유 메모리(shared memory), 메시지 큐 (message queues)

174 각 디렉토리 설명 (4) net/ TCP/IP, ARP 등 네트웍 통신 프로토콜 (네트웍 장치 드라이버는 drivers/net에 존재) 소켓 인터페이스 include/ 커널 헤더 하드웨어 독립적인 헤더 : include/linux/ 하드웨어 종속적인 헤더 : include/asm-***/ (예를 들어 ARM CPU 종속 적인 헤더는 include/asm-arm/ 디렉토리에 존재) lib/ 커널 라이브러리 루틴 doc/ or Documentation/ 커널 문서 디렉토리.

175 디바이스 드라이버 개요 디바이스(Device ) 네트워크 어댑터, LCD 디스플레이, PCMCIA, Audio, 터미널, 키보드, 하드디 스크, 플로피디스크, 프린터 등과 같은 주변 장치들을 말함 디바이스의 구동에 필요한 프로그램, 즉 디바이스 드라이버가 필수적으로 요구됨 Device Driver 실제 장치 부분을 추상화 시켜 사용자 프로그램이 정형화된 인터페이스를 통해 디바이스를 접근할 수 있도록 해주는 프로그램 디바이스 관리에 필요한 정형화된 인터페이스 구현에 요구되는 함수와 자료 구조의 집합체 표준적으로 동일 서비스 제공을 목적으로 커널의 일부분으로 내장 응용프로그램이 H/W를 제어할 수 있도록 인터페이스 제공 하드웨어 독립적인 프로그램을 작성을 가능하게 함 175

176 디바이스 드라이버 형태 Device Driver Interface Standard Device Driver Interface UNIX compatible I/O system interface : open(), close(), read(), write(), ioctl() Application IO System osdriver Device Non-standard Device Driver Interface Completely user-defined Custom interface Application mydriver Device May be more appropriate for some hardware 176

177 리눅스 디바이스 드라이버 사용자 관점에서의 디바이스 드라이버 사용자는 디바이스 자체에 대한 자세한 정보 를 알 필요 없음 Device는 하나의 파일로 인식됨 file에 대한 접근을 통하여 real device에 접근 가능 User Program Device file. VFS Device Driver Real Device 177

178 리눅스 디바이스 드라이버(2) 리눅스에서의 디바이스 Linux에서 Device는 특별한 하나의 파일처럼 취급되 고, access가 가능함. 사용자는 File operation을 적용할 수 있음 각 디바이스는 Major number와 Minor number를 갖 음 Device Driver의 종류 문자 디바이스 드라이버 블록 디바이스 드라이버 네트워크 디바이스 드라이버 178

179 Char Device(문자 디바이스) 문자 디바이스의 특징 자료의 순차성을 지닌 장치 버퍼 캐쉬를 사용하지 않음 장치의 raw data를 사용자에게 제공 Terminal, Serial/Parallel, Keyboard, Sound Card, Scanner, Printer 리눅에서의 문자 디바이스 null : black hole tty* : virtual console pt* : pseudo-terminal crw--w--w- 0 root root 5, 1 Oct console crw-rw-rw- 1 root root 1, 3 May null crw root root 4, 0 May tty crw-rw root disk 96, 0 Dec pt0 crw root root 5, 64 May cua0 파일 관련 정보 중 첫 문자인 C는 char device를 의미 179

180 Block Device(블록 디바이스) Block device 특징 random access 가능 블록 단위의 입출력이 가능한 장치 버퍼캐쉬에 의한 내부 장치 표현 파일 시스템에 의해 mount 되어 관리되는 장치 디스크, Ram Disk, CD-ROM 등 리눅스에서의 Block device fd* : Floppy disk Hd* : Hard disk sda : SCSI disk brw root floppy 2, 0 May fd0 brw-rw root disk 3, 0 May hda brw-rw root disk 3, 1 May hda1 brw-rw root disk 8, 0 May sda brw-rw root disk 8, 1 May sda1 파일 관련 정보 중 첫 문자인 b는 block device를 의미 180

181 Network Device(네트워크 디바이 스) Network device 특징 대응하는 장치파일이 없음 네트워크 통신을 통해 패킷을 송수신할 수 있 는 장치 응용프로그램과의 통신은 표준 파일 시스템관 련 콜 대신 socket(), bind() 등의 시스템 콜 사 용 Etherent, PPP, ATM, ISDN 등이 있음 181

182 Major & Minor Number Major number(주번호) 커널에서 디바이스 드라이버를 구분/연결하는데 사용 같은 Device의 종류를 지칭, 1Byte (0~255사이의 값) Minor number(부번호) 디바이스 드라이버 내에서 장치를 구분하기 위해 사용 각 Device의 부가적인 정보를 나타냄, 2Byte (부번호) 하나의 디바이스 드라이버가 여러 개의 디바이스 제어 가능 $ ls -al /dev/hda* brw-rw root disk 1, 0 May hda brw-rw root disk 1, 1 May hda1 brw-rw root disk 1, 2 May hda2 brw-rw root disk 1, 3 May hda3 주번호 부번호 182

183 디바이스 드라이버 구조 리눅스 시스템 구조 상의 디바이스 드라이버 Application area Application System Call Interface VFS Kernel area Buffer Cache Network Subsystem Char Device Driver Block D/D Network D/D Device Interface Hardware Hardware 183

184 커널 모듈(kernel Module) 시스템 부팅 후에 동적으로 loading 할 수 있는 커널 구성요소 커널을 다시 컴파일 하거나 시스템 리부팅 할 필요 없이 커널의 일 부분을 교체하는 것이 가능 디바이스 드라이버, 파일 시스템, 네트워크 프로토콜 등이 모듈로 제 공됨 컴파일한 커널 버전 정보가 들어가야 하고, 현재 실행되고 있는 커 널 버전과 일치해야 함 <linux/module.h>에 정의되어 있음 모듈 정보는 전체 모듈에서 하나만 존재해야 함 일반 응용 프로그램과의 차이점 main() 함수가 없음 커널에 로딩 및 제거 될 때 불러지는 함수가 존재 Loading 시 - int init_module(void) 함수 호출 Unloading 시 - void cleanup_module() 함수 호출 184

185 Linux Device Driver 특성 Linux device driver의 공통적 특성 커널 코드 디바이스 드라이버는 커널의 한 부분이므로, 커널의 다른 코드와 마찬가지 로 잘못되면 시스템에 치명적인 피해를 줄 수 있다 커널 인터페이스 디바이스 드라이버는 리눅스 커널이나 자신이 속한 서브시스템에 표준 인터 페이스를 제공해야 한다. 커널 메커니즘과 서비스 디바이스 드라이버는 메모리 할당, 인터럽트 전달, wait queue같은 표준 커 널 서비스를 사용할 수 있다. Loadable 대부분의 리눅스 디바이스 드라이버는 커널 모듈로서, 필요할 때 로드하고 더 이상 필요하지 않을 때 언로드 할 수 있다. 설정가능(Configurable) 리눅스 디바이스 드라이버를 커널에 포함하여 컴파일 할 수 있다. 어떤 장치 를 넣을 것인지는 커널을 compile 할 때 설정할 수 있다 185

186 커널과 모듈의 링크 개념도 insmod init_module( ) register_capability( ) capabilities[ ] printk( ).. rmmod cleanup_module( ) unregister_capability( ) 186

187 커널 모듈의 작성 예제 프로그램 커널에 모듈이 로딩될 때 hello mango world 를 출력 모듈이 제거될 때 Good Bye 를 출력 Source file : hello.c /* hello.c */ #include <linux/module.h> /* 모든 모듈에 필요 */ #include <linux/kernel.h> /* printk() 등에 필요 */ static int init hello_init(void) { // 모듈이 로딩될 때 호 출 printk ( hello mango world\n ); // from a text console, not X-terminal. return 0; // 0: success, 기타 - fail } static void exit hello_exit(void) { printk ( KERN_ALERT Goodbye world ); } module_init(hello_init); Module_exit(hello_exit); MODULE_LICENCE( GPL ); 187

188 커널 모듈의 컴파일(커널에포함) 커널 소스 푼 디렉토리로 이동 #cp hello.c arch/arm/mach-s5pc100/ #vi arch/arm/mach-s5pc100/makefile 수정 #make modules 188

189 커널 모듈의 컴파일(Makefile작성) 커널 소스 푼 디렉토리로 이동 #mkdir test-module #cp hello.c test-module #vi Makefile #make 189

190 module 파읷시스템에 포함방법 NFS 로 Mount 하는 방법 저장장치를 이용하는 방법 파읷시스템에 포함하는 방법 Etc

191 module파읷시스템에 포함방법 (NFS 로 Mount 하는 방법) Mango(타겟) board console창에서 입력 #mkdir /mnt/nfs //#echo /sbin/mount t nfs o nolock $(Serverip):$(nfs 디렉토리) $(dir) #/sbin/mount -t nfs -o nolock :/nfsroot /mnt/nfs #df # cd /mnt/nfs #insmod hello.ko #lsmod #rmmod hello.ko Host linux PC 명령 순서 #cp hello.ko /nfsroot #ps aux grep nfs #rpm qa nfs #yum install nfs* #mkdir -p /home/nfsroot #ln s /home/nfsroot /nfsroot #vi /etc/exports 에 아래 추가 #/etc/init.d/nfs restart #ifconfig eth up

192 디바이스 드라이버의 작성방법 커널 모듈의 형태로 디바이스 드라이버 함수 작성 struct file_operations 정의 및 함수 구현 init_module, module_exit 정의 및 함수 구현 커널에 디바이스 드라이버 등록 register_chrdev(), register_blkdev(), register_netdev() 컴파일/로딩 Insmod Make special file Mknod 드라이버를 활용하는 응용프로그램 작성 및 테스 트 192

193 설정 - 드라이버 적재 및 삭제 노드 생성 - 노드(파일)를 통해서 입출력 수행 mknod /dev/파일이름 드라이버타입 주번호 부번호 예) mknod /dev/keydd c 생성 후 속성변경 : chmod ug+w /dev/keydd 디바이스 드라이버 적재 insmod 드라이버명.ko 예) insmod keydd.ko 디바이스 드라이버 삭제 rmmod 드라이버명.ko 예)rmmod keydd.ko (주의.ko 붙지 않아도 됨) 드라이버의 적재 여부 lsmod 193

194 디바이스 드라이버 - Etc. Device의 정보를 가지는 File들 /proc/devices 현재 System에 장착되어 있는 Device들의 정보./Documentation/devices.txt 현재 Linux System에서 정의되어 있는 Device들의 Major, Minor Number들에 대한 정보./include/linux/major.h Major Number를 define한 header 194

195 문자형 디바이스 드라이버 골격 #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> int device_open( ) { } int device_release( ) { } ssize_t device_write( ) { } ssize_t device_read( ) { } static struct file_operations device_fops = { ssize_t (*read) ( ); ssize_t (*write) ( ); int (*open) ( ); int (*release) ( ); Header Files Function Prototypes File Operation }; int init_module(void) { } Void module_exit(void) { } 모듈 설치 시 초기화 수행 모듈 제거 시 반환 작업수행 195

196 Device Driver 작성(1) Device structure 디바이스 구조체 : 2 개의 필드로 구성된 구조 체 Name field file_operation files static struct char_device_struct { struct char_device_struct *next; unsigned int major; unsigned int baseminor; int minorct; char name[64]; struct cdev *cdev; /* will die */ } *chrdevs[chrdev_major_hash_size]; struct file_operations { /* include/linux/fs.h */ lseek; read; write; readdir; poll; ioctl; mmap; open; flush; release; } 196

197 Device Driver 작성(2) 디바이스 드라이버 등록 드라이버를 커널에 등록하고, 파일 연산을 정의하는 등의 초기화 작업 수행이 필요 모듈의 형태에서는 init_module()함수에서 초기화 수행 드라이버의 등록 함수 int register_chrdev( unsigned int major, const * name, struct file_operations * fops); 커널에 지정되어 있는 chrdevs 구조에 새로운 char device 등록 major number : 주번호, 0을 주면 사용하지 않는 값을 반환 name : 디바이스 이름으로 /proc/devices에 나타남 fops: 디바이스와 연관된 파일 연산 구조체 포인터 음수가 반환되면 오류가 발생했음을 나타냄 197

198 Device Driver 작성(3) 디바이스 드라이버 제거 더 이상 사용되지 않는 드라이버의 제거 Rmmod하는 명령을 이용하여 제거하며, 이때 드라이버 내의 cleanup_module이 호출되는데, 이 루틴 안에서 다음의 시스템 콜을 호출 드라이버 제거 함수 int unregister_chrdev( unsigned int major, const * name); 198

199 Device Driver 작성(4) 파일 연산 디바이스 드라이버를 일반적인 파일과 유사한 인터페이스를 이용하여 관리 각 디바이스는 파일 형태로 존재하고, 커널은 파일 연산을 이용하여 I/O 연산을 수행하도록 인터페이 스 구성 디바이스 드라이버를 구현한다는 것은 상당부분 파일연산 구조체에서 요구되는 기능들을 프로그래 밍 한다는 것을 의미 가상의 dummy character device 구현예제에서의 파일연산 구조체 정의 예 199

200 Device Driver 작성(5) 파일 연산 구조체의 전체 구조 struct file_operations { /* <linux/fs.h> */ struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); }; 200

201 Device Driver 작성(6) File operations loff_t (*llseek)(struct file *, loff_t, int); 현재의 read/write 위치를 옮긴다. ssize_t (*read)(struct file *, char *, size_t, loff_t *); 디바이스에서 데이터를 가져오기 위해서 사용 ssize_t (*write)(struct file*, const char*, size_t, loff_t*); 디바이스에 데이터를 쓰기 위해서 사용 int (*readdir)(struct file *, void *, filldir_t); 디렉토리를 다룰 때 사용 unsigned int (*poll)(struct file*, struct poll_table_struct*); 현재 프로세스를 대기 큐에 넣기 위해서 사용 201

202 Device Driver 작성(7) File operations int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); 디바이스에 종속적인 명령을 만들기 위해 사용 Int (*mmap) (struct file *, struct vm_area_struct *); 디바이스 메모리를 프로세스 메모리에 매핑 int (*open) (struct inode *, struct file *); 디바이스 노드에 의해 수행되는 첫번째 동작 int (*flush) (struct file *); 디바이스를 닫기 전에 모든 데이터를 쓴다. int (*release) (struct inode *, struct file *); 디바이스를 닫을 때 수행 202

203 Device Driver 작성(8) File operations int (*fsync) (struct file *, struct dentry *); 버퍼에 있는 데이터를 모두 디바이스에 쓴다 int (*fasync) (int, struct file *, int); int (*check_media_change) (kdev_t dev); 블록 디바이스에서 사용, 제거 가능한 미디어에 사용 int (*revalidate) (kdev_t dev); 블록 디바이스에서 사용, 버퍼 캐쉬의 관리와 상관 int (*lock) (struct file *, int, struct file_lock *); 파일에 lock을 걸기 위해서 사용 203

204 Device Driver 작성(9) Dummy Character device 드라이버 소스코드 #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/types.h> #include <linux/fcntl.h> #define DUMMY_MAJOR_NUMBER 254 /* dummy.c */ #define DEV_NAME "dummy-device" int dummy_open(struct inode *inode,struct file *filp) { int num=minor(inode->i_rdev); printk(" Open call for Dummy Char Device call open ->minor:%d\n",num); return 0; } loff_t dummy_llseek(struct file *filp,loff_t off,int whence) { printk("call llseek->off:%08x, whenec:%08x\n",off,whence); return 0x23; } 204

205 Device Driver 작성(10) Dummy Character device 드라이버 소스코드 ssize_t dummy_read(struct file *filp,char *buf, size_t count,loff_t *f_pos) { printk("call read ->buf:%08x, count:%08x\n",buf,count); return 0x33; } ssize_t dummy_write(struct file *filp,const char *buf, size_t count,loff_t *f_pos) { printk("call write->buf:%08x, count:%08x\n",buf,count); return 0x43; } int dummy_ioctl(struct inode *inode, struct file *filp,unsigned int cmd,unsigned long arg) { printk("call ioctl->cmd:%08,arg:%08x\n",cmd,arg); return 0x53; } int dummy_release(struct inode *inode, struct file *filp) { printk(" Release call for Dummy Char Device \n"); return 0; } 205

206 Device Driver 작성(11) Dummy Character device 드라이버 소스코드 struct file_operations dummy_fops = {.owner =THIS_MODULE,.llseek=dummy_llseek,.open = dummy_open,.read=dummy_read,.write=dummy_write,.ioctl=dummy_ioctl,.release=dummy_release, }; int dummy_init(void) { int result; printk("call dummy_init\n"); result=register_chrdev(dummy_major_number,dev_name,&dummy_fops); if(result<0) return result; return 0; } void dummy_exit(void) { printk("call dummy_exit\n"); unregister_chrdev(dummy_major_number,dev_name); } module_init(dummy_init); module_exit(dummy_exit); MODULE_LICENSE("GPL"); 206

207 Device Driver 작성(12) System call : dummy_open File_operations 구조체에서 open operation 구현 Application program에서 open 에 의해서 불려짐 int dummy_open(struct inode *inode, struct file *file) { printk("open call for Dummy Char Device \n"); return 0; } System call : dummy_release File_operations 구조체에서 release operation 구현 Application program에서 close 에 의해서 불려짐 int dummy_release(struct inode *inode, struct file *file) { printk("release call for Dummy Char Device \n"); return 0; } 207

208 Device Driver 작성(11) System call : dummy_read File_operations 구조체에서 read operation 구현 Application program에서 read 에 의해서 불려짐 ssize_t dummy_read(struct file *file, char *buffer, { printk("read Call for Dummy Device \n"); buffer[0] = 0x34; return 0; } System call : dummy_write File_operations 구조체에서 write operation 구현 Application program에서 write 에 의해서 불려짐 208 size_t length, loff_t *offset) ssize_t dummy_write(struct file *file, const char *buffer, size_t length, loff_t *offset) { printk("write Call for Dummy Device : [%x]\n ", buffer[0]); return 0; }

209 드라이버 컴파일/로딩/노드 생성 디바이스 드라이버 컴파일 Makefile 작성 obj-m:=dummy-driver.o KDIR:=../mango100_kernel_2010_06_30 PWD:=$(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules clean: rm -rf *.ko rm -rf *.mod.* rm -rf.*.cmd rm -rf *.o #make 209

210 module 파읷시스템에 포함방법 (저장장치를 이용하는 방법) Usb stick, MMC 등 저장장치를 HOST PC에 삽입 #df #cp dummy-driver.ko /mount 디렉토리 HOST PC 저장장치 분리, 망고 보드에 삽입 #insmod dummy-driver.ko 에러 발생 시 #ls /sys/dev/char grep 주번호, 확읶 후 소스에서 major 번호 수정 #cat /proc/modules

211 장치파읷 등록(1/2) 장치 파읷 등록 [root]# insmod mydrv_dev.ko Int xxx_init(void) { int result; result = register_chrdev(rdwr_dev_major, RDWR_DEV_NAME, &xxx_fops);.. return 0; } module_init(xxx_init); 211

212 장치파읷 등록(2/2) register_chrdev 의 기능 쉘 디바이스 드라이버 커널 Chr_devs Block_devs [root]# insmod mydrv.ko xxx_init( ) { register_chrdev( D_name, 240, fops); },,, 240 : *fops,,, index 212

213 Open 의 이해 Open 과정 응용프로그램 open( /dev/mydrv ); task_structure files *f_op open(); HDD open(); inode i_mod = S_IFCHR i_rdev = 240:0 커널 Chr_devs,,, 240 : *fops,,, 디바이스 드라이버 struct file_operations mydrv_fops = {.read = mydrv_read,.write = mydrv_write,.open = mydrv_open,.release = mydrv_release, }; Block_devs xxx_read( ) {.. } xxx_write( ) {.. } xxx_open( ) {.. } xxx_release( ) {.. } 213

214 Application Program 작성 Read / write application program 작성 작성한 dummy character device를 테스트 Dummy-device를 열고 문자열을 read /write 함 Console의 커널 내부 정보를 통해 실제 dummy_device를 통해서 read / write가 이루 어졌는지 확인 214

215 Application Program 작성 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <unistd.h> #define DEVICE_FILENAME "/dev/dummy-driver int main(){ int dev; char buff[128]; int ret; printf("1) device file open\n"); dev = open(device_filename, O_RDWR O_NDELAY); if(dev>=0) { printf("2) seek function call\n"); ret = lseek(dev, 0x20, SEEK_SET); printf("ret = %08X\n",ret); printf("3) read function call\n"); ret = read(dev,0x30, 0x31); printf("ret = %08X\n", ret); printf("4) write function call\n"); ret = write(dev, 0x40, 0x41); printf("ret = %08X\n",ret); printf("5) ioctl function call\n"); ret = ioctl(dev, 0x51, 0x52); printf("ret = %08X\n",ret); } } return 0; printf("6) device file close\n"); ret = close(dev); printf("ret = %08X\n",ret); 215

216 Application Program 컴파읷/적재 #arm-linux-gcc o dummy-app.o dummy-app.c Dummy-app.o파읷을 망고보드 파읷 시스 템에 복사 #cp dummy-app.o /nfsroot #/sbin/mount t nfs o nolock :/nfsroot /mnt/nfs #cp /mnt/nfs/dummy-app.o ~

217 Application 실행 방법 #mknod /dev/dummy-driver c #./dummy-app.o

218 커널 포팅,안드로이드 키처리

219 삼성 커널 다운받기 #git clone git://git.kernel.org/pub/scm/linux/kernel/ git/kki_ap/linux-2.6-samsung.git #cd linux-2.6-samsung #git fetch #git fetch --tag #git checkout samsung

220 망고100 커널 소스 받기 #wget ngo100/kernel/mango100_kernel_2010_0 6_30.tgz #tar xvf mango100_kernel_2010_06_30.tgz

221 DEBUG PORT 포팅 $(topdir)./config 파읷에서 CONFIG_S3C_LOWLEVEL_UART_PORT=1 # CONFIG_SPLIT_ROOT_FILESYSTEM is not set Kernel configuration에서 kernel hacking-> S3C UART to use for low-level debug 에서 1 선택./arch/arm/plat-s3c/include/plat/uncompress.h 소스에 포함 #define uart_base S3C_PA_UART + (S3C_UART_OFFSET * CONFIG_S3C_LOWLEVEL_UART_PORT).dev_name = "s3c2410_serial",./drivers/serial/samsung.c 에서 디바이스 이름을 수정 할 수 있습니다.

222 LCD 드라이버 수정-1 #make menuconfig Device Drivers->Graphic Support ->Support for frame buffer devices ->S3C Framebuffer support 선택

223 LCD 드라이버 수정-2 void lcd_power_ctrl(s32 value) { int err; if (value) { if (gpio_is_valid(s5pc1xx_gph0(2))) { err = gpio_request(s5pc1xx_gph0(2), "GPH0");./drivers/video/samsung/s3cfb_lte480wv.c 에서 lcd_power_ctrl함수를 수정 LCD 에 젂원을 읶가한다. if (err) { printk(kern_err "failed to request GPH0 for " "lcd reset control\n"); } gpio_direction_output(s5pc1xx_gph0(2), 1); } } else { if (gpio_is_valid(s5pc1xx_gph0(2))) { err = gpio_request(s5pc1xx_gph0(2), "GPH0"); if (err) { printk(kern_err "failed to request GPH0 for " "lcd reset control\n"); } gpio_direction_output(s5pc1xx_gph0(2), 0); } } gpio_free(s5pc1xx_gph0(2)); lcd_power = value;

224 LCD 드라이버 수정-3 static struct s3cfb_lcd lte480wv = {.width = 800,.height = 480,.bpp = 24,.freq = 60,.timing = {.h_fp = 8,.h_bp = 13,.h_sw = 3,.v_fp = 5,.v_fpe = 1,.v_bp = 7,.v_bpe = 1,.v_sw = 1, }, };.polarity = {.rise_vclk = 0,.inv_hsync = 1,.inv_vsync = 1,.inv_vden = 0, }, drivers/video/samsung/s3cfb_lte480wv.c 에서 LCD datasheet 타이밍맊 맞추면 됨

225 LCD 드라이버 수정-4 static int s3cfb_init_global(void) { fbdev->output = OUTPUT_RGB; fbdev->rgb_mode = MODE_BGR_P; fbdev->wq_count = 0; init_waitqueue_head(&fbdev->wq); mutex_init(&fbdev->lock); s3cfb_set_output(fbdev); s3cfb_set_display_mode(fbdev); s3cfb_set_polarity(fbdev); s3cfb_set_timing(fbdev); s3cfb_set_lcd_size(fbdev); } return 0;

226 이더넷 드라이브 포팅-1 #define S5PC1XX_PA_SMSC9220 (0xA ) /arch/arm/mach-s5pc100/include/mach/map.h static struct resource s3c_smsc911x_resources[] = { [0] = {.start = S5PC1XX_PA_SMSC9220,.end = S5PC1XX_PA_SMSC SZ_1M - 1,.flags = IORESOURCE_MEM, }, [1] = {.start = IRQ_EINT11,.end = IRQ_EINT11,.flags = IORESOURCE_IRQ, }, }; arch/arm/plat-s5pc1xx/devs.c 에서 수정

227 이더넷 드라이버 포팅 -2 Device driver->network Device support에서 선택 Configuration 파읷 drivers/net/kconfig 위치

228 이더넷 드라이버 -3./arch/arm/mach-s5pc100/mach-mango100.c 디바이스 등록 소스는./arch/arm/plat-s5pc1xx/devs.c 에 위치

229 이더넷 디바이스 확읶 방법

230 이더넷 드라이버 확읶 방법

231 이더넷 드라이버 irq 등록확읶 S5pc100 user manual에는 11번째에 EINT11이다, 귺데 등록은 32를 더한 값읶 43번째 등록이 되어 있다. 이유는 커널이 32번까지 spurious 읶터럽트로 등록하여 사용한다. #define IRQ_EINT11 S5PC1XX_IRQ_VIC0(11)./arch/arm/plat-s5pc1xx/include/plat/irqs.h

232 Keypad driver./driver/input/keyboard/kconfig 에 추가.config 파읷에 CONFIG_KEYPAD_MANGO100_LINUX_EVENT=y

233 Keypad driver./driver/input/keyboard/ 파읷을 추가한다../driver/input/keyboard/Makefile 에 추가

234 Keypad driver Driver/input/keyboard/mango100-keypad.c 등록확읶은 아래와 같이 확읶 할 수 있다.

235 Keypad driver struct input_event { struct timeval time; u16 type; u16 code; s32 value; };./include/linux/input.h에 정의 #define EV_KEY 0x01 #define KEY_BACK 158 /* AC Back */ 키를 누르면 value값은 1을 가짂다 # hexdump /dev/input/event0 Key 누를경우 Key Release

236 Keypad driver mango100_keypad.driver->name = DEVICE_NAME; mango100_keypad.driver->phys = "mango100-keypad/input0"; mango100_keypad.driver->open = mango100_keypad_open; mango100_keypad.driver->close = mango100_keypad_close; mango100_keypad.driver->id.bustype = BUS_HOST; mango100_keypad.driver->id.vendor = 0x16B4; mango100_keypad.driver->id.product = 0x0701; mango100_keypad.driver->id.version = 0x0001; #define BUS_HOST 0x19./include/linux/input.h./drivers/input/keyboard/mango100_keypad.c 소스에 mango100_keypad_prob함수에 정의 # cat /proc/bus/input/devices I: Bus=0019 Vendor=16b4 Product=0701 Version=0001 N: Name="mango100-keypad" P: Phys=mango100-keypad/input0 S: Sysfs=/class/input/input0 U: Uniq= H: Handlers=kbd event0 B: EV=3 B: KEY=

237 Keypad driver Kernel hacking 설정 CONFIG_TIMER_STATS=y 로 설정 To activate the collection of stats # echo 1 > /proc/timer_stats # cat /proc/timer_stats Timer Stats Version: v0.2 Sample period: s 291, 1 swapper mango100_keypad_config (mango100_rd_timer_handler) 2, 1 swapper schedule_delayed_work_on (delayed_work_timer_fn) 8, 1867 er.serverthread futex_wait (hrtimer_wakeup) 3, 1 swapper phy_start_machine (phy_timer) 3, 1832 zygote queue_delayed_work (delayed_work_timer_fn) 1, 0 swapper page_writeback_init (wb_timer_fn) 308 total events, events/sec # echo 0 > /proc/timer_stats To stop collecting stats

238 Keypad driver flow Button (Hardware) 10ms 마다 스캔 mango100_keypad.rd_timer GET_KEYPAD_DATA mango100_rd_timer_handler generate_keycode mango100_keypad_control input_report_key 에서 이벤트 발생

239 안드로이드 Key event 처리 Key button Map 정의는 vendor\sec\mango100\mango100-keypad.kl frameworks/base/libs/eventhub.cpp에 scan_dir,open_device 정의 KeyInputQueue( 1853): InputDeviceReader.run() static const char *device_path = "/dev/input"; bool EventHub::openPlatformInput(void) {.. res = scan_dir(device_path);.. } int EventHub::scan_dir(const char *dirname) { while((de = readdir(dir))) { strcpy(filename, de->d_name); open_device(devname); } } int EventHub::open_device(const char *devicename)

240 안드로이드 Key event 처리 export ANDROID_ROOT /system /init.rc에 정의 int EventHub::open_device(const char *devicename) { const char* root = getenv("android_root"); property_get("persist.sys.keylayout", keylayout, "qwerty"); snprintf(keylayoutfilename, sizeof(keylayoutfilename), "%s/usrkeylayout/%s.kl", root, keylayout); strcpy(devname, keylayout); bool defaultkeymap = access(keylayoutfilename, R_OK); if (defaultkeymap) {. } snprintf(keylayoutfilename, sizeof(keylayoutfilename), "%s/usr/keylayout/%s.kl", root, "qwerty"); strcpy(devname, "qwerty"); } LOGI("2:devname = %s, keylayout =%s, keylayoutfilename = %s", devname, keylayout, keylayoutfilename); device->layoutmap->load(keylayoutfilename); I/EventHub( 1853): 2:devname = qwerty, keylayout =qwerty, keylayoutfilename = /system/usr/keylayout/qwerty.kl -#logcat 명령으로 디버깅 메시지 출력 frameworks/base/libs/ui/eventhub.cpp파읷 EventHub::open_device함수에 정의

241 안드로이드 Key event 처리 int EventHub::open_device(const char *devicename) { LOGI("New keyboard: publicid=%d device->id=0x%x devname='%s' propname='%s' keylayout='%s'\n", publicid, device->id, name, propname, keylayoutfilename); } LOGI("New device: path=%s name=%s id=0x%x (of 0x%x) index=%d fd=%d classes=0x%x\n", devicename, name, device->id, mnumdevicesbyid, mfdcount, fd, device->classes); } LOGV("Adding device %s %p at %d, id = %d, classes = 0x%x\n", devicename, device, mfdcount, devid, device->classes); frameworks/base/libs/ui/eventhub.cpp 에 open_device 정의 #logcat 명령으로 출력 결과 I/EventHub( 1853): New keyboard: publicid=65537 device->id=0x10001 devname='mango100-keypad' propname='hw.keyboards devname' keylayout='/system/usr/keylayout/qwerty.kl' I/EventHub( 1853): New device: path=/dev/input/event0 name=mango100-keypad id=0x10001 (of 0x2) index=2 fd=58 classes=0x1

242 안드로이드 Key event 처리 Thread mthread = new Thread("InputDeviceReader") { public void run() { if (DEBUG) Log.v(TAG, "InputDeviceReader.run()"); android.os.process.setthreadpriority( android.os.process.thread_priority_urgent_display); Key Event 처리 Thread RawInputEvent ev = new RawInputEvent(); while (true) { try { InputDevice di; // block, doesn't release the monitor readevent(ev); boolean send = false; boolean configchanged = false; if (true) { Log.i(TAG, "Input event: dev=0x" + Integer.toHexString(ev.deviceId) + " type=0x" + Integer.toHexString(ev.type) + " scancode=" + ev.scancode + " keycode=" + ev.keycode + " value=" + ev.value); } #logcat 메시지 I/KeyInputQueue( 1853): Input event: dev=0x10001 type=0x1 scancode=158 keycode=4 value=1 Mango100-keypad.kl과 scancode값 읷치 BACK 키 수행이 됨./frameworks/base/services/java/ com/android/server/keyinputqueue.java 파읷에 정의

243 안드로이드 Key event 처리 frameworks/base/services/java/com/android/ser ver/keyinputqueue.java frameworks/base/services/jni/ com_android_server_keyinputqueue.cpp Thread mthread = new Thread("InputDeviceReader") {.. while (true) { try { InputDevice di; // block, doesn't release the monitor readevent(ev);

244 안드로이드 Key event 처리 public final boolean dispatch(callback receiver, DispatcherState state, Object target) { switch (maction) { public void handleupevent(keyevent event) {. final int keycode = event.getkeycode(); case ACTION_UP: if (DEBUG) Log.v(TAG, "Handle key up " + event + ": " + if (DEBUG) Log.v(TAG, "Key up to " + target + " in " + state + ": " + this); if (state!= null) { state.handleupevent(this); } return receiver.onkeyup(mkeycode, this);./frameworks/base/core/java/android/view/keyevent.ja va 에서 dispatch를 한다. #logcat 수행 결과 KeyEvent( 1910): Key up to android.inputmethodservice.inputmethodservice$inputmethodsessionimpl@43da0b40 in android.view.keyevent$dispatcherstate@43d92cf8: KeyEvent{action=1 code=4 repeat=0 meta=0 scancode=158 mflags=8} V/KeyEvent( 1910): Handle key up KeyEvent{action=1 code=4 repeat=0 meta=0 scancode=158 mflags=8}: a ndroid.view.keyevent$dispatcherstate@43d92cf8 D/MountListener( 1853): handleevent ums_connected

245 안드로이드 Key Event 처리 Window Manager distpatchkey(keyevent..) frameworks/base/services/java/com/android/server/windowmanagerservice.java Thread mthread = new Thread("InputDeviceReader") readevent(ev); di = newinputdevice(ev.deviceid); frameworks/base/services/java/com/android/server/keyinputqueue.java static JNINativeMethod ginputmethods[] = { /* name, signature, funcptr */ { "readevent", "(Landroid/view/RawInputEvent;)Z", (void*) android_server_keyinputqueue_readevent }, frameworks/base/services/jni/com_android_server_keyinputqueue.cpp static const char *device_path = "/dev/input"; bool EventHub::getEvent(int32_t* outdeviceid, int32_t* outtype, bool EventHub::openPlatformInput(void) frameworks/base/libs/ui/eventhub.cpp

246 codec driver(wm8960) WM8960 디바이스를 I2C 0번 찿널로 디바이스를 컨트롟하고 Data는 I2S0번 찿널로 젂송토록 설계

247 codec driver(wm8960) if CONFIG_I2C =y 로 설정이 되어 있어야 SND_SOC_WM8960 이 홗성화 됨./ sound/soc/codecs/kconfig 에 추가

248 codec driver(wm8960) snd-soc-wm8960.o==wm8960.o 동읷 이유는 사운드 드라이버 소스가 2개이상 읶 경우를 대비./ sound/soc/codecs/makefile 에 추가 Wm8960.c 드라이버 파읷을./sound/soc/codecs/에 추가

249 codec driver(wm8960) sound/soc/s3c24xx/kconfig 파읷에 위의 내용 추가

250 codec driver(wm8960) #make menuconfig 명령으로 확읶 할 있음

251 codec driver(wm8960) sound/soc/s3c24xx/makefile을 위와 같이 수정 sound/soc/s3c24xx/mango100_hdmi_spdif.c sound/soc/s3c24xx/mango100_wm8960.c 을 sound/soc/s3c24xx 디렉토리에 파읷을 맊들어서 추가

252 codec driver(wm8960)

253 codec driver(wm8960) Sound/soc/codecs/wm8960.c 파읷 참조

254 codec driver(wm8960) static struct wm8960_setup_data smdk_wm8960_setup = {.i2c_bus = 0,.i2c_address = 0x1a, }; sound/soc/s3c24xx/mango100_wm8960.c에 정의 static struct i2c_board_info i2c_devs0[] initdata = { { I2C_BOARD_INFO("wm8960", 0x1a), }, // WM8960 };../arch/arm/mach-s5pc100/mach-mango100.c 에 정의./drivers/i2c/busses/i2c-s3c2410.c 에서 0x1a<<1 로 shift

255 HDMI Driver

256 HDMI Driver static struct resource s5p_tvout_resources[] = {.. [8] = {.start = IRQ_EINT5,.end = IRQ_EINT5,.flags = IORESOURCE_IRQ }./arch/arm/plat-s5pc1xx/devs.c에 수정, 드라이버 소스는 drivers/media/video/samsung/tv20/s5pc100/hdmi_s5pc100.c

257 HDMI S/PDIF Driver S/PDIF의 약자는 Sony/Philips Digital InterFace의 약자입니다. 소니와 필립스사에서 디지털 오디오 젂송을 위해서 맊든 표준 읶터페이스로써, 싞호선 1개와 그라운드선 1개 이렇게 2가닥을 사용하는 방식입니다. 기존의 디지털 오디오 싞호의 경우 동기(싱크싞호)싞호를 넣어야 했고 또 싞호의 갂섭이 심하여 읷정 이상의 거리를 젂송하기 어려웠던 반면에 S/PDIF는 약 20 미터 정도까지 읷정하게 데이터를 젂달할 수 있어 CDP, 사운드 카드, CD-ROM drive, A/V 리시버에 다양하게 사용되고 있습니다. 사람이 들을 수 있는 싞호는 모두 아날로그이며, 컴퓨터는 궁극적으로 디지털 싞호맊을 입출력합니다. 컴퓨터의 경우도 아날로그 출력은 디지털 싞호를 아날로그로 컨버트(Digital to Analog Converter)하여 출력하는 것이고, 반대로 아날로그 싞호를 저장하려면 ADC(Analog to Digital Converter)를 사용해야 합니다. 예를 들면 컴퓨터의 MP3 데이터(디지털)을 MD(디지털)로 저장하려면 디지털 싞호를 사용하면 디지털 -> 디지털로 젂달하면 되지맊 아날로그 싞호 의 경우는 사운드 카드에서 디지털 -> DAC -> ADC -> 디지털로 받게 되어 음질이 맋이 손실됩니다. 때문에 디지털 읶터페이스를 사용하는 것입니다. 읷반적으로 디지털 기기갂 원본의 손실없이 젂달하기 위해 아날로그 싞호젂송 보다 디지털 젂송을 선호하고 있습니다. 참고로 S/PDIF의 케이블갂의 저항의 권장치는 75오옴입니다.

258 HDMI S/PDIF Driver S5pc100 cpu가 기본 제공

259 HDMI S/PDIF Driver sound/soc/s3c24xx/kconfig 파읷에 위의 내용 추가

260 HDMI S/PDIF Driver Device driver -> Sound card support-> Advanced Linux Sound Architecture-> ALSA for Soc audio support ->Soc Audio support Mango100-> Select Mango100 Audio Port Type에서 HDMI SPDIF Driver선택

261 ALSA device list: #0: smdks5p (HDMI-SPDIF) 커널 로그에서 위와 같이 메시지가 출력 HDMI S/PDIF Driver

262 Battery Driver drivers/power/kconfig 에 dummy battery 를 추가

263 Battery Driver drivers/power/makefile 에 추가

264 Battery Driver drivers/power/mango_dummy_battery.c 드라이버 소스 생성 추가

265 Battery Driver #define POWER_SUPPLY_PATH "/sys/class/power_supply" 실행 결과 Éclair 소스에서 framework/base/services/jni/com_android_server_batteryservice.cpp 에 POWER_SUPPLY_PATH 정의 커널.drivers/power/mango_dummy_battery.c Éclair 소스에서 framework/base/services/jni/com_android_server_batteryservice.cpp

266 Battery Driver int register_android_server_batteryservice(jnienv* env) { DIR* dir = opendir(power_supply_path); while ((entry = readdir(dir))) { const char* name = entry->d_name; char buf[20]; // Look for "type" file in each subdirectory snprintf(path, sizeof(path), "%s/%s/type", POWER_SUPPLY_PATH, name); int length = readfromfile(path, buf, sizeof(buf)); if (length > 0) { if (strcmp(buf, "Mains") == 0) { snprintf(path, sizeof(path), "%s/%s/online", POWER_SUPPLY_PATH, name); if (access(path, R_OK) == 0) gpaths.aconlinepath = strdup(path); } else if (strcmp(buf, "USB") == 0) { snprintf(path, sizeof(path), "%s/%s/online", POWER_SUPPLY_PATH, name); if (access(path, R_OK) == 0) gpaths.usbonlinepath = strdup(path); } else if (strcmp(buf, "Battery") == 0) { snprintf(path, sizeof(path), "%s/%s/status", POWER_SUPPLY_PATH, name); if (access(path, R_OK) == 0) gpaths.batterystatuspath = strdup(path);

267 Battery Driver snprintf(path, sizeof(path), "%s/%s/health", POWER_SUPPLY_PATH, name); if (access(path, R_OK) == 0) gpaths.batteryhealthpath = strdup(path); snprintf(path, sizeof(path), "%s/%s/present", POWER_SUPPLY_PATH, name); if (access(path, R_OK) == 0) gpaths.batterypresentpath = strdup(path); snprintf(path, sizeof(path), "%s/%s/capacity", POWER_SUPPLY_PATH, name); if (access(path, R_OK) == 0) gpaths.batterycapacitypath = strdup(path); snprintf(path, sizeof(path), "%s/%s/voltage_now", POWER_SUPPLY_PATH, name); if (access(path, R_OK) == 0) { gpaths.batteryvoltagepath = strdup(path); // voltage_now is in microvolts, not millivolts gvoltagedivisor = 1000; } else { snprintf(path, sizeof(path), "%s/%s/batt_vol", POWER_SUPPLY_PATH, name); if (access(path, R_OK) == 0) gpaths.batteryvoltagepath = strdup(path); } snprintf(path, sizeof(path), "%s/%s/temp", POWER_SUPPLY_PATH, name); if (access(path, R_OK) == 0) { gpaths.batterytemperaturepath = strdup(path); } else { snprintf(path, sizeof(path), "%s/%s/batt_temp", POWER_SUPPLY_PATH, name); if (access(path, R_OK) == 0) gpaths.batterytemperaturepath = strdup(path); }

268 Battery Driver drivers/power/mango_dummy_battery.c에서 dummy_battery_probe함수에 Name을 지정하고, 속성을 지정

269 안드로이드 PowerServiceManager private void settimeoutlocked(long now, int nextstate) { if ( mdonebooting) { private void settimeoutlocked(long now, int nextstate) { if ( false&mdonebooting) { frameworks/base/services/java/com/android/server/powermanagerservice.java파읷에서 안드로이드 부팅 후 Sleep으로 짂입을 하지 않음

270 Android /Linux 파읷 시스템 차이점 Multi-Process(linux) Multi-Process(android) application application application application application application Framework & VM Library middleware & Library kernel scheduler kernel scheduler

271 안드로이드 구조

272 안드로이드 파읷 시스템 / var tmp system proc sys sbin etc data root 작업용 파일군 bin app framework lib usr,fonts,media etc,sounds lost+found system,dalvik,cache drm,logs,download data,app등 Linux로써 사용 할 때의 shell 등의 커맨드군 어플리케이션 프로그램 Java의 라이브러리군 네이티브 코드 라이브러리군 저작권 관리정보 로그 다운로드 결과 어플리케이션 데이터

273 안드로이드 코드 검색

274 안드로이드 메뉴생성 및 코덱/SPDIF 포팅 oys

275 안드로이드 소스 다운 받기 # yum install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl wget #yum install valgrind #yum install python* # yum install zlib-devel #yum install libx11-devel.i686 #yum install glibc* yum install git git-* $ cd ~ $ mkdir bin $ echo $PATH $ curl >~/bin/repo $ chmod a+x ~/bin/repo $ mkdir eclair $ cd eclair $ repo init -u git://android.git.kernel.org/platform/manifest.git -b eclair $ repo sync oys

276 Mango100 소스 받기 에서 최싞 소스 를 다운 받으시면 됩니다. oys

277 Android Patch 및 build 방법./frameworks/base/api/current.xml은 make update-api 실행으로 생성 됨./frameworks/base/api/current.xml 복구 방법은./frameworks/base/api/7.xml을 copy를 해서 current.xml을 맊든 후 make update-api를 실행 #make update-api #./mango100_build.sh oys

278 Android SDK설치 tml PATH 설정 oys

279 Android SDK설치 JDK설치(Window 용) oys

280 Android SDK설치 Eclipse 다운로드 설치 Eclipse 3.4또는 3.5 Download 적당한 곳에 압축 풀기 oys

281 Android SDK설치 oys

282 Android SDK설치 oys

283 Configuring the ADT Plugin -adt.html oys

284 Updating the ADT Plugin -adt.html oys

285 DDMS사용하기 E:\Utils-tools\android-sdk_r06- windows\android-sdkwindows\tools>ddms.bat oys

286 ADB 연결하기 PC와 망고보드를 usb cable로 연결 >adb devices oys

287 Busybox install >adb push busybox / >adb shell >ls oys

288 Busybox install # mkdir bin # chmod 777 busybox #./busybox --install # cd bin #./vi../init.rc 수정 export PATH /bin:/sbin:/system/sbin:/system/bin:/system/xbin service console /bin/sh /bin/sh 또는 리부팅 oys

289 Android 구조 Application Framework Core Libraries& Hardware Abstraction Layer Linux Kernel oys

290 Android 메뉴 생성(커널 수정 ) (WM8960,SPDIF 드라이버 포함) sound\soc\s3c24xx\kconfig 파읷에 아래와 같이 수정 config config SND_MANGO100_WM8960 bool "WM8960 Driver" depends on SND_S5P_MANGO100 select SND_SOC_WM8960 select SND_S5P_SOC_I2S select SND_S3C_I2SV2_SOC SND_MANGO100_HDMI_SPDIF bool "HDMI SPDIF Driver" depends on SND_S5P_MANGO100 select SND_S5P_SPDIF oys

291 Android 메뉴 생성(커널 수정 ) (WM8960,SPDIF 드라이버 포함) oys

292 Android 메뉴 생성 packages\apps\settings\res\values\arrays.xml <!-- Sound Change Setting. --> <string-array name="sound_change_entries"> <item>wm8960</item> <item>spdif</item> </string-array> <!-- Do not translate. --> <string-array name="sound_change_values" translatable="false"> <item>10</item> <item>20</item> </string-array> packages\apps\settings\res\values\strings.xml <string name="sound_change">sound Change Mode</string> <!-- Sound & display settings screen, setting option summary to change Sound Driver --> <string name="sound_change_summary">choose Sound Driver Change mode</string> <!-- Sound & display settings screen, setting option name to change Sound Driver Mode --> packages\apps\settings\res\xml\sound_and_display_settings.xml <ListPreference android:key="sound_change" android:persistent="false" oys />

293 Android 메뉴 생성 oys

294 Android 메뉴 생성 SoundAndDisplaySettings.java import static android.provider.settings.system.sound_change; import android.util.soundchange.soundchangemanager; public class SoundAndDisplaySettings extends PreferenceActivity implements Preference.OnPreferenceChangeListener { private static final String TAG = "SoundAndDisplaysSettings"; /** If there is no setting in the provider, use this. */ private static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000; private static final int FALLBACK_SOUND_CHANGE_VALUE = 10; private static final int FALLBACK_EMERGENCY_TONE_VALUE = 0; private static final String KEY_SILENT = "silent"; private static final String KEY_VIBRATE = "vibrate"; private static final String KEY_SCREEN_TIMEOUT = "screen_timeout"; private static final String KEY_SOUND_CHANGE = "sound_change"; private SoundChangeManager msoundchangemanager; ListPreference SoundChangePreference = (ListPreference) findpreference(key_sound_change); SoundChangePreference.setValue(String.valueOf(Settings.System.getInt( resolver, SOUND_CHANGE, FALLBACK_SOUND_CHANGE_VALUE))); SoundChangePreference.setOnPreferenceChangeListener(this); msoundchangemanager = (SoundChangeManager) getsystemservice(soundchange_service);./packages/apps/settings/src/com/android/settings/soundanddisplaysettings.java public static final String SOUND_CHANGE = "sound_change";./frameworks/base/core/java/android/provider/settings.java oys

295 Android 메뉴 생성 SoundAndDisplaySettings.java import android.util.soundchange.soundchangemanager;./packages/apps/settings/src/com/android/settings/soundanddisplaysettings.java SoundChangeManager.java,ISoundChangeManager.aidl,SoundChangeNative.java 소스 추가 package android.util.soundchange; import java.util.list; import android.annotation.sdkconstant; import android.annotation.sdkconstant.sdkconstanttype; import android.os.handler; import android.os.remoteexception; import android.util.log; public class SoundChangeManager { oys

296 Android 메뉴 생성 SoundAndDisplaySettings.java private SoundChangeManager msoundchangemanager; ListPreference SoundChangePreference = (ListPreference) findpreference(key_sound_change); SoundChangePreference.setValue(String.valueOf(Settings.System.getInt( resolver, SOUND_CHANGE, FALLBACK_SOUND_CHANGE_VALUE))); SoundChangePreference.setOnPreferenceChangeListener(this); msoundchangemanager = (SoundChangeManager) getsystemservice(soundchange_service);./packages/apps/settings/src/com/android/settings/soundanddisplaysettings.java public Object getsystemservice(string name) {.. }else if (SOUNDCHANGE_SERVICE.equals(name)) { return getsoundchangemanager();./frameworks/base/core/java/android/app/applicationcontext.java private SoundChangeManager getsoundchangemanager() { synchronized (ssync) { if (ssoundchangemanager == null) { IBinder b = ServiceManager.getService(SOUNDCHANGE_SERVICE); ISoundChangeManager service = ISoundChangeManager.Stub.asInterface(b); ssoundchangemanager = new SoundChangeManager(service); } } return ssoundchangemanager; }./frameworks/base/core/java/android/app/applicationcontext.java oys

297 Android 메뉴 생성 SoundAndDisplaySettings.java APP msoundchangemanager = (SoundChangeManager) getsystemservice(soundchange_service);./packages/apps/settings/src/com/android/settings/soundanddisplaysettings.java public Object getsystemservice(string name) {.. FRAMEWORK./frameworks/base/core/java/android/app/ApplicationContext.java private SoundChangeManager getsoundchangemanager(){ FRAMEWORK }./frameworks/base/core/java/android/app/applicationcontext.java oys

298 Android Framework public Object getsystemservice(string name) {.. }else if (SOUNDCHANGE_SERVICE.equals(name)) { return getsoundchangemanager();./frameworks/base/core/java/android/app/applicationcontext.java public static final String SOUNDCHANGE_SERVICE = "soundchange";./frameworks/base/core/java/android/content/context.java oys

299 Android Framework private SoundChangeManager getsoundchangemanager() { synchronized (ssync) { if (ssoundchangemanager == null) { IBinder b = ServiceManager.getService(SOUNDCHANGE_SERVICE); ISoundChangeManager service = ISoundChangeManager.Stub.asInterface(b); ssoundchangemanager = new SoundChangeManager(service); } } return ssoundchangemanager;./frameworks/base/core/java/android/app/applicationcontext.java soundchange = new SoundChangeService(context); ServiceManager.addService(Context.SOUNDCHANGE_SERVICE, soundchange);./frameworks/base/services/java/com/android/server/systemserver.java package com.android.server; public class SoundChangeService<syncronized> extends ISoundChangeManager.Stub{ private static final String TAG = "SoundChangeService"; public SoundChangeService(Context context){ mcontext = context; mpresoundchangestate = getpersistedstate(); setsoundchangemode(mpresoundchangestate); } frameworks\base\services\java\com\android\server\soundchangeservice.java oys

300 Android Framework(Binder) private SoundChangeManager getsoundchangemanager() { synchronized (ssync) { if (ssoundchangemanager == null) { IBinder b = ServiceManager.getService(SOUNDCHANGE_SERVICE); ISoundChangeManager service = ISoundChangeManager.Stub.asInterface(b); ssoundchangemanager = new SoundChangeManager(service); } } return ssoundchangemanager;./frameworks/base/core/java/android/app/applicationcontext.java public class SoundChangeService<syncronized> extends ISoundChangeManager.Stub{ import android.util.soundchange.isoundchangemanager;./frameworks/base/core/java/android/app/applicationcontext.java oys

301 Android Framework(Binder) private SoundChangeManager getsoundchangemanager() { synchronized (ssync) { if (ssoundchangemanager == null) { IBinder b = ServiceManager.getService(SOUNDCHANGE_SERVICE); ISoundChangeManager service = ISoundChangeManager.Stub.asInterface(b); ssoundchangemanager = new SoundChangeManager(service); } } return ssoundchangemanager;./frameworks/base/core/java/android/app/applicationcontext.java ISoundChangeManager mservice; public SoundChangeManager(ISoundChangeManager service) { Log.i(TAG, "Init SoundChange Manager"); mservice = service; } import android.util.soundchange.soundchangemanager; oys

302 Android 메뉴 생성 SoundAndDisplaySettings.java public boolean onpreferencechange(preference preference, Object objvalue) { } else if (KEY_SOUND_CHANGE.equals(key)) { int value = Integer.parseInt((String) objvalue); try { Settings.System.putInt(getContentResolver(), SOUND_CHANGE, value); } catch (NumberFormatException e) { Log.e(TAG, "could not persist sound change mode setting", e); } // update value msoundchangemanager.setsoundchangemode(value);. packages\apps\settings\src\com\android\settings\soundanddisplaysettings.java private static final String KEY_SOUND_CHANGE = "sound_change";. packages\apps\settings\src\com\android\settings\soundanddisplaysettings.java <ListPreference android:key="sound_change packages\apps\settings\res\xml\sound_and_display_settings.xml oys

303 Android 메뉴 생성 SoundAndDisplaySettings.java else if (KEY_SOUND_CHANGE.equals(key private static final String KEY_SOUND_CHANGE = "sound_change"; android:key="sound_change oys

304 Android 메뉴 생성(APP~JNI)./packages/apps/Settings/src/com/android/settings/SoundAndDisplaySettings.java msoundchangemanager.setsoundchangemode(value );./frameworks/base/services/java/com/android/server/soundchangeservice.java setsoundchangemode(mpresoundchangestate); SoundChangeNative.SoundDriverChange(mode);./frameworks/base/soundchange/java/android/util/soundchange/SoundChangeNative.java public native static void SoundDriverChange(int mode);} oys

305 Android Framework(JNI) SoundChangeNative.SoundDriverChange(mode); service./frameworks/base/services/java/com/android/server/soundchangeservice.java public native static void SoundDriverChange(int mode); JNI./frameworks/base/soundchange/java/android/util/soundchange/SoundChangeNative.java { "SoundDriverChange", "(I)V", (void*)android_util_soundchange_soundchangemanager }, JNI./frameworks/base/core/jni/android_util_soundchange.cpp oys

306 Android Framework(JNI) int register_android_util_soundchange_soundchangemanager(jnienv* env) { return AndroidRuntime::registerNativeMethods(env, "android/util/soundchange/soundchangenative", g_methods, NELEM(g_methods)); } public class SoundChangeNative { public native static void SoundDriverChange(int mode); }./frameworks/base/soundchange/java/android/util/soundchange/soundchangenative.java static JNINativeMethod g_methods[] = { { "SoundDriverChange", "(I)V", (void*)android_util_soundchange_soundchangemanager }, }; oys

307 Android Framework(JNI~HAL) android_util_soundchange_soundchangemanager() {::sound_change_service(mode);}./frameworks/base/core/jni/android_util_soundchange.cpp int sound_change_service(int mode) hardware/libhardware_legacy/soundchange/soundchange.c file_copy("/system/etc/asound_wm8960.conf", /system/etc/asound.conf"); oys

308 Android Framework(LIB~HAL) libandroid_runtime.so./frameworks/base/core/jni/android_util_soundchange.cpp ::sound_change_ service(mode);./hardware/libhardware_legacy/soundchange/soundchange. c int sound_change_service(int mode) oys

309 Libruntime.so등록하기 (core Libraries) extern int register_android_util_soundchange_soundchangemanager(jnienv* env); REG_JNI(register_android_util_soundchange_SoundChangeManager), frameworks\base\core\jni\androidruntime.cpp 에 추가 oys

310 Android 메뉴 생성 (aidl등록) LOCAL_SRC_FILES += \ soundchange/java/android/util/soundchange/isoundchangemanager.aidl \. Frameworks/base/Android.mk 파읷에 추가 LOCAL_SRC_FILES := $(call find-other-java-files,$(frameworks_base_subdirs)) define find-other-java-files $(call find-subdir-files,$(1) -name "*.java" -and -not -name ".*") Endef./build/core/definitions.mk oys

311 Android (current.xml) frameworks\base\api\current.xml <field name="soundchange_service" type="java.lang.string" transient="false" volatile="false" value=""soundchange"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> <field name="sound_change" type="java.lang.string" transient="false" volatile="false" value=""sound_change"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> make update-api : 새로 추가된 java class 를 android platform 에 등록. #make update-api를 실행하면 current.xml이 자동으로 등록 됨 #make update-api: $(INTERNAL_PLATFORM_API_FILE) $(ACP)./build/core/tasks/apicheck.mk oys

312 Android 아이콘 생성 아이콘이미지 else if (action.equals(soundchangemanager.sound_change_state_changed_a CTION)){ updatesoundchange(intent); Control (SoundChangeManager.SOUND_CHANGE_STATE_CHANGED_ACTION) oys

313 Android 아이콘 생성 final Intent intent = new Intent(SoundChangeManager.SOUND_CHANGE_STATE_CHANGED_ACTION); mcontext.sendstickybroadcast(intent);./frameworks/base/services/java/com/android/server/soundchangeservice.java filter.addaction(soundchangemanager.sound_change_state_changed_action); private BroadcastReceiver mintentreceiver = new BroadcastReceiver() { else if (action.equals(soundchangemanager.sound_change_state_changed_action)){ updatesoundchange(intent);./frameworks/base/services/java/com/android/server/status/statusbarpolicy.java updatesoundchange(intent); oys

314 Android 아이콘 생성 private final void updatesoundchange(intent intent) { final int event = intent.getintextra(soundchangemanager.extra_sound_change_state, SoundChangeManager.SOUND_CHAN int iconid; switch (event) { case SoundChangeManager.SOUND_CHANGE_STATE_WM8960: } default: iconid = ssoundchangeimages[0]; break; case SoundChangeManager.SOUND_CHANGE_STATE_SPDIF: iconid = ssoundchangeimages[1]; break; case SoundChangeManager.SOUND_CHANGE_STATE_RELOAD: iconid = ssoundchangeimages[2]; break; } msoundchangedata.iconid = iconid; mservice.updateicon(msoundchangeicon, msoundchangedata, null); intent.putextra(soundchangemanager.extra_sound_change_state, mod./frameworks/base/services/java/com/android/server/status/statusbarservice.java oys

315 안드로이드 아이콘 생성 결과 oys

316 안드로이드 메뉴 생성(build) build\core\pathmap.mk 파일 수정 FRAMEWORKS_BASE_SUBDIRS := \ $(addsuffix /java, \ core \ graphics \ location \ media \ opengl \ sax \ telephony \ ethernet \ wifi \ vpn \ keystore \ soundchange \ ) addsuffix /java FRAMEWORKS_BASE_JAVA_SRC_DIRS := \ $(addprefix frameworks/base/,$(frameworks_base_subdirs)) oys

317 안드로이드 메뉴 생성(aidl) frameworks\base\android.mk 파읷 수정 # FRAMEWORKS_BASE_SUBDIRS comes from build/core/pathmap.mk LOCAL_SRC_FILES := $(call find-other-java-files,$(frameworks_base_subdirs)) LOCAL_SRC_FILES := $(filter-out \ org/mobilecontrol/% \,$(LOCAL_SRC_FILES)) ifeq ($(TARGET_BUILD_TYPE),debug) LOCAL_SRC_FILES += $(call find-other-java-files,core/config/debug) else LOCAL_SRC_FILES += $(call find-other-java-files,core/config/ndebug) endif LOCAL_SRC_FILES += \ ethernet/java/android/net/ethernet/iethernetmanager.aidl \ soundchange/java/android/util/soundchange/isoundchangemanager.aidl \ AIDL은 Android Interface description language의 약자 oys

318 Android build (find-other-java-files) LOCAL_SRC_FILES := $(call find-other-java-files,$(frameworks_base_subdirs)) define find-other-java-files $(call find-subdir-files,$(1) -name "*.java" -and -not -name ".*") Endef./build/core/definitions.mk oys

319 안드로이드 메뉴 생성 frameworks\base\core\java\android\app\applicationcontext.java에 추가 import android.util.soundchange.isoundchangemanager; import android.util.soundchange.soundchangemanager; frameworks\base\soundchange\java\android\util\soundchange\soundchangemanager.java 를 포함 package android.util.soundchange; import java.util.list; import android.annotation.sdkconstant; frameworks\base\soundchange\java\android\util\soundchange\isoundchangemanager.aidl package android.util.soundchange; interface ISoundChangeManager { int getsoundchangestatus(); int getpresoundchangestatus(); void setsoundchangemode(int mode); } oys

320 Build 홖경 구성 ctl.androidplayback { type hw card 1 } ctl.androidplayback { type hw card 0 } PRODUCT_COPY_FILES += \ vendor/sec/mango100/conf/asound.conf:system/etc/asound.conf \ vendor/sec/mango100/conf/asound_wm8960.conf:system/etc/asound_wm8960.conf \ vendor/sec/mango100/conf/asound_spdif.conf:system/etc/asound_spdif.conf \ oys

321 안드로이드 아이콘 생성 <item><xliff:g id="id">soundchange</xliff:g></item> \frameworks\base\core\res\res\values\arrays.xml 파읷에 추 가 <!-- Declared at res/drawable/sound_change_reload.png:0 --> <public type="drawable" name="sound_change_reload" id="0x " />./out/target/common/obj/apps/frameworkres_intermediates/public_resources.xml oys

322 SD Card 읶식(Froyo) 부팅 후 아래와 같이 수정 dev_mount sdcard /mnt/sdcard auto /devices/platform/s3csdhci.0/mmc_host/mmc0 또는 vendor/sec/mango100/conf/vold.fstab 파읷 을 아래와 같이 수정 dev_mount sdcard /mnt/sdcard auto /devices/platform/s3csdhci.0/mmc_host/mmc0 oys

323 ALSA Sound 소스 받기(froyo) #vi.repo/manifest.xml 을 수정 <project path="external/alsa-lib" name="platform/external/alsa-lib" /> <project path="external/alsa-utils" name="platform/external/alsa-utils" /> <project path="hardware/alsa_sound" name="platform/hardware/alsa_sound" /> #repo sync #ls external #ls hardware oys

324 ALSA Sound 설정(froyo) build/target/board/generic/boardconfig.mk 을 추가 BOARD_USES_GENERIC_AUDIO := false BUILD_WITH_ALSA_UTILS := true BOARD_USES_ALSA_AUDIO := true -asound.conf 파읷을 작성 파읷 시스템에 복사 # cp asound.conf system/usr/share/alsa_sound/ 또는 build/target/board/generic/androidboard.mk 파읷에 아래와 같이 수정 PRODUCT_COPY_FILES += \ build/target/board/generic/conf/asound.conf:system/etc/asound.conf oys

325 Patch 맊들기, 사용법 #diff urn SRC DES소스 > xxx.diff #cat xxx.diff patch p1 air/android-menu-patch.tar 다운받기 # cd mango100_eclair_2010_06_30 # cat../../mango100-eclair-menu.diff patch -p1 # cp sound_change_reload.png frameworks/base/core/res/res/drawable/ #cp sound_change_spdif.png frameworks/base/core/res/res/drawable/ # cp sound_change_wm8960.png frameworks/base/core/res/res/drawable/ oys

326 안드로이드 이더넷 메뉴추가

327 Android Activity Lifecycle

328 안드로이드 Ethernet Config 추가

329 안드로이드 Ethernet Config 추가

330 Setting.xml 과 IconPreferenceScreen <com.android.settings.iconpreferencescreen <intent android:action="android.intent.action.main" android:targetpackage="com.android.settings" android:targetclass="com.android.settings.ethernetsettings" /> </com.android.settings.iconpreferencescreen>

331 XML과 EthernetSettings class관 계 <com.android.settings.iconpreferencescreen <intent android:action="android.intent.action.main" android:targetpackage="com.android.settings" android:targetclass="com.android.settings.ethernetsettings" /> </com.android.settings.iconpreferencescreen>

332 Ethernet Service 초기화 (EthernetManager) getsystemservice(eth_service),./packages/apps/settings/src/com/android/settings/ethernetsettings.j ava }else if (ETH_SERVICE.equals(name)) { return getethernetmanager();./frameworks/base/core/java/android/app/applicationcontext.java private EthernetManager getethernetmanager() { synchronized (ssync) { if (sethmanager == null) { IBinder b = ServiceManager.getService(ETH_SERVICE); IEthernetManager service = IEthernetManager.Stub.asInterface(b); sethmanager = new EthernetManager(service, mmainthread.gethandler());./frameworks/base/core/java/android/app/applicationcontext.java

333 Service Manager Ethernet 등록 private EthernetManager getethernetmanager() { synchronized (ssync) { if (sethmanager == null) { IBinder b = ServiceManager.getService(ETH_SERVICE); IEthernetManager service = IEthernetManager.Stub.asInterface(b); sethmanager = new EthernetManager(service, mmainthread.gethandler());./frameworks/base/core/java/android/app/applicationcontext.java Connectivity service에서 등록 private ConnectivityService(Context context) {. ServiceManager.addService(Context.ETH_SERVICE, ethservice);./frameworks/base/services/java/com/android/server/connectivityservi ce.java

334 Service Manager 역할 POWER_SERVICE CONNECTIVITY_S ERVICE Service manager ETH_SERVICE

335 Connectivity Service wifi ethernet Connectivity service mms.

336 Ethernet service (부팅 시) private ConnectivityService(Context context) { if (DBG) Log.v(TAG, "ConnectivityService starting up"); if (DBG) Log.v(TAG, "Starting Ethernet Service"); methernetstatetracker = new EthernetStateTracker(context,mHandler); EthernetService ethservice = new EthernetService(context, methernetstatetracker); ServiceManager.addService(Context.ETH_SERVICE, ethservice); mnettrackers[connectivitymanager.type_eth] = methernetstatetracker;

337 Ethernet service (부팅 시) super는 자손클래스에서 조상클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수 public EthernetStateTracker(Context context, Handler target) { super(context, target, ConnectivityManager.TYPE_ETH, 0, "ETH", ""); Log.i(TAG,"Starts..."); if(ethernetnative.initethernetnative()!= 0 ) { Log.e(TAG,"Can not init ethernet device layers"); return; }

338 Ethernet service (부팅 시) static JNINativeMethod gethernetmethods[] = { {"waitforevent", "()Ljava/lang/String;, (void *)android_net_ethernet_waitforevent}, {"getinterfacename", "(I)Ljava/lang/String;, void )android_net_ethernet_getinterfacename}, {"initethernetnative", "()I, (void *)android_net_ethernet_initethernetnative}, {"getinterfacecnt","()i, (void *)android_net_ethernet_getinterfacecnt} }; static jint android_net_ethernet_initethernetnative(jnienv *env, jobject clazz) { if ((ret = netlink_init_interfaces_list()) < 0) {

339 Ethernet service (부팅 시) static int netlink_init_interfaces_list(void) {.. if ((netdir = opendir(sysfs_class_net))!= NULL) { while((de = readdir(netdir))!=null) { static const char SYSFS_CLASS_NET[] = "/sys/class/net"; snprintf(path, SYSFS_PATH_MAX,"%s/%s/ifindex",SYSFS_CLASS_NET,de- >d_name); if ((ifidx = fopen(path,"r"))!= NULL ) {

340 Ethernet service (부팅 시)

341 Ethernet Service 등록 Flow private ConnectivityService(Context context) { if (DBG) Log.v(TAG, "Starting Ethernet Service"); methernetstatetracker = new EthernetStateTracker(context,mHandler); EthernetService ethservice = new EthernetService(context, methernetstatetracker); public EthernetService(Context context, EthernetStateTracker Tracker){ mtracker = Tracker; mcontext = context; isethenabled = getpersistedstate(); Log.i(TAG,"Ethernet dev enabled " + isethenabled ); getdevicenamelist(); setethstate(isethenabled); Log.i(TAG, "Trigger the ethernet monitor"); mtracker.startpolling(); }

342 Ethernet Service 등록 Flow(계속) public EthernetService(Context context, EthernetStateTracker Tracker){ getdevicenamelist(); } public String[] getdevicenamelist() { if (scanethdevice() > 0 ) return DevName; else return null; }

343 Ethernet Service 등록 Flow(계속) private int scanethdevice() { int i = 0,j; if ((i = EthernetNative.getInterfaceCnt())!= 0) { Log.i(TAG, "total found "+i+ " net devices"); DevName = new String[i]; } else return i; for (j = 0; j < i; j++) { DevName[j] = EthernetNative.getInterfaceName( j); if (DevName[j] == null) break; Log.i(TAG,"device " + j + " name " + DevName[j]); } } return i;

344 Ethernet Service 등록 Flow(계속) static jint android_net_ethernet_getinterfacecnt() { return total_int; } static jint android_net_ethernet_initethernetnative(jnienv *env, jobject clazz) netlink_init_interfaces_list() LOGI("interface %s:%d found",intfinfo- >name,intfinfo->i); add_int_to_list(intfinfo);//에서 total_int ++

345 LOGI("interface %s:%d found",intfinfo- >name,intfinfo->i); add_int_to_list(intfinfo);//에서 Node 생 성 Ethernet Service 등록 Flow(계속) static jstring android_net_ethernet_getinterfacename(jnienv *env, jobject clazz, jint index) { info= interfaces; if (total_int!= 0 && index <= (total_int -1)) { while (info!= NULL) { if (index == i) { LOGI("Found :%s",info->name); return env->newstringutf(info->name); } static jint android_net_ethernet_initethernetnative(jnienv *env, jobject clazz) netlink_init_interfaces_list()

346 Ethernet Event 처리 쓰레드 생성 Tracker){ public EthernetService(Context context, EthernetStateTracker Log.i(TAG, "Trigger the ethernet monitor"); mtracker.startpolling(); 쓰레드 생성 static jstring android_net_ethernet_waitforevent(jnienv *env, jobject clazz) {

347 이더넷이 연결된 경우(DHCP) MonitorThre ad EthernetMo nitor Connectivity Service EthernetStat etracker

348 이더넷이 연결된 경우(DHCP) static jstring android_net_ethernet_waitforevent(jnienv *env, jobject clazz) { if((len = recvmsg(nl_socket_poll, &msg, 0))>= 0) { MonitorThread.run. } else if (cmd == NEW_LINK) { event = PHYUP; handleevent(events[i],event);

349 이더넷이 연결된 경우(DHCP) void handleevent(string ifname,int event) { switch (event) { case PHYUP: mtracker.notifyphyconnected(ifname);); break; public void notifyphyconnected(string ifname) { if synchronized(this) { this.sendemptymessage(event_hw_phyconnected); MonitorThread

350 이더넷이 연결된 경우(DHCP) public void handlemessage(message msg) {.. case EVENT_HW_PHYCONNECTED: try { configureinterface(info); } private boolean configureinterface(ethernetdevinfo info) throws UnknownHostException { if (info.getconnectmode().equals(ethernetdevinfo.eth_conn_mode _DHCP)) { mdhcptarget.sendemptymessage(event_dhcp_start); DHCP Handler

351 이더넷이 연결된 경우(DHCP) public void handlemessage(message msg) {.. switch (msg.what) { case EVENT_DHCP_START: if (NetworkUtils.runDhcp(mInterfaceName, mdhcpinfo)) {} static jboolean android_net_utils_rundhcp(jnienv* env, jobject clazz, jstring ifname, jobject info) { result = ::dhcp_do_request(namestr, &ipaddr, &gateway, &mask,

352 안드로이드 GPS(Mango64) GPS 안테나 GPS 칩

353 안드로이드 GPS(Mango64)

354 안드로이드 GPS(Mango64) P MOSFET 은 Gate 가 0읶 경우 연결 팁:

355 안드로이드 GPS(Mango64) system type->mango6410 GPS Setup 에서 설정

356 안드로이드 GPS(Mango64) arch/arm/mach-s3c6410/kconfig 파읷에 아래 내용 추가 menu "MANGO6410 GPS setup" depends on MACH_MANGO6410 config MANGO6410_GPS bool "Use GPS" depends on MACH_MANGO6410 help Use GPS Module endmenu

357 안드로이드 GPS(Mango64) 커널 소스에 Driver폴더에 gps폴더추가 후 gps_power.c 파 읷, Makefile 파읷 추가 obj-$(config_mango6410_gps) += gps/ 위의 내용을 driver 폴더에 Makefile에 추가

358 안드로이드 GPS(Mango64) ssize_t gps_write(struct file *filp, const char *buf, size_t count, loff_t *off_what) { if(*tmp == '1') { // power on // printk(kern_warning "gps power on processing\n"); gpio_direction_output(s3c64xx_gpl(14), 0); gpio_direction_output(s3c64xx_gpl(13), 1); gpio_set_value(s3c64xx_gpl(14), 0); gpio_set_value(s3c64xx_gpl(13), 0); udelay(10); gpio_set_value(s3c64xx_gpl(13), 1); udelay(10); } else { // power off // printk(kern_warning "gps power off processing\n"); gpio_set_value(s3c64xx_gpl(14), 1); gpio_set_value(s3c64xx_gpl(13), 0); } } kfree(tmp); return count;

359 안드로이드 GPS(Mango64)

360 안드로이드 GPS(Mango64) menabled = native_init(); private native boolean native_init();./frameworks/base/location/java/com/android/internal/location/gpslocationprovider. java static jboolean android_location_gpslocationprovider_init(jnienv* env, jobject obj) { if (!sgpsinterface) sgpsinterface = gps_get_interface(); return (sgpsinterface && sgpsinterface->init(&sgpscallbacks) == 0); } frameworks/base/core/jni/android_location_gpslocationprovider.cpp const GpsInterface* gps_get_interface() { if (sgpsinterface == NULL) gps_find_hardware(); return sgpsinterface;} hardware/libhardware_legacy/gps/gps.cpp

361 안드로이드 GPS(Mango64) gps_mango64.c 파읷 추가 BOARD_HAVE_GPS := true HAVE_GPS_HARDWARE := true build\target\board\generic\boardconfig.mk 에 추가 # Use hardware GPS implementation if USE_GPS_HARDWARE is set. # ifeq ($(HAVE_GPS_HARDWARE),true) LOCAL_CFLAGS += - DHAVE_GPS_HARDWARE LOCAL_SRC_FILES += gps/gps_mango64.c endif LOCAL_SRC_FILES += gps/gps.cpp hardware\libhardware_legacy\gps\android.mk

362 안드로이드 GPS(Mango64) static struct perms_ devperms[] = { { "/dev/null", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/zero", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/full", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/ptmx", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/tty", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/random", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/urandom", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/ashmem", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/binder", 0666, AID_ROOT, AID_ROOT, 0 }, /* mango64 GPS permission crazyboy*/ { "/dev/s3c2410_serial0", 0666, AID_SYSTEM, AID_SYSTEM, 0 }, { "/dev/mango64_gps", 0666, AID_SYSTEM, AID_SYSTEM, 0 }, system/core/init/devices.c 파읷 수정 struct { const char *prefix; unsigned int uid; } property_perms[] = { { "service.adb.root", AID_SHELL }, { "persist.sys.", AID_SYSTEM }, { "persist.service.", AID_SYSTEM }, { "kernel.android.gps", AID_SYSTEM }, { "gps.power_on", AID_SYSTEM }, { NULL, 0 } };./system/core/init/ property_service.c 파읷 수정

363 안드로이드 GPS(Mango64) int device_init(void) { // GPS Power Device Driver make_device("/dev/mango64_gps", 0, 235, 0);//Node 생성 }./system/core/init/devices.c에서 Node생성 static void gps_dev_power(int state) { char prop[property_value_max]; int fd; char cmd = '0'; int ret; // look for a kernel-provided device name if(property_set("gps.power_on","/dev/mango64_gps")<0) //NODE 이용 { D("Set mango64 power"); //return; } if (property_get("gps.power_on",prop,gps_power_if) == 0) { LOGE("no gps power interface name"); return; }../hardware/libhardware_legacy/gps/gps_mango64.c 에서 컨트롟

364 안드로이드 GPS(Mango64) static void gps_state_init( GpsState* state ) // look for a kernel-provided device name if(property_set("ro.kernel.android.gps","s3c2410_serial0")<0) /UART0 { NMEA 데이터를 D("Set mango64 error"); return; /dev/s3c2410_serial0 통해서 받는다 } if (property_get("ro.kernel.android.gps",prop,"s3c2410_serial0") == 0) { D("no kernel-provided gps device name"); LOGE("ro.kernel.anroid.gps: '%s'", prop); return; } if ( snprintf(device, sizeof(device), "/dev/%s", prop) >= (int)sizeof(device) ) { LOGE("gps serial device name too long: '%s'", prop); return; }

365 안드로이드 GPS 실행 결과

366 리눅스 커널 버전의 선택 커널 버전 역사 : 버전 숫자 : X.Y.ZZ X : 커널의 버전 Y : 릴리즈 번호, 홀수->개발 중, 짝수->안정된 버전 ZZ : Modifications, 사소한 변화를 의미 최신 버전 새로운 다양한 기능이 이미 추가되어 있음 크기가 매우 크다는 단점이 있음 커널 버전의 선택 임베디드 시스템의 크기를 고려 필요한 기능을 고려 확장성을 고려

367 안드로이드란? 운영체제와 미들웨어 그리고 핵심 애플리 케이션을 포함하고 있는 모바읷 디바이스 를 위한 소프트웨어 스택 안드로이드 SDK는 Java 프로그램밍 언어 를 사용하여 안드로이드 플랫폼상의 어플 리케이션을 개발하기 위해 필요한 도구들 과 API를 제공

368 망고100 부팅과정

369 망고100 부팅모드 USB Boot Mode Nand Boot Mode SD Boot Mode

370 개발 홖경 리눅스 설치 Toolchain 설치 JDK설치 TFTP 설정 NFS 설정

371 U-boot Build 홖경 구조도

372 U-boot build 실행 분석 #make 명령 실행 $(TOPDIR)/config.mk $(TOPDIR)/arm_config.mk $(TOPDIR)/rules.mk

373 U-boot $BOARDNAME.h 파읷 분석 #define CONFIG_IDENT_STRING " for MANGO100" /* total memory required by uboot */ #define CFG_UBOOT_SIZE (2*1024*1024) Stack 영역 (0x1000) 0x2FFFFFFF 0x2FFFEFFF /* base address for uboot */ #ifdef CONFIG_ENABLE_MMU #define CFG_UBOOT_BASE #else #define CFG_UBOOT_BASE #endif #define CFG_PHY_UBOOT_BASE #define CFG_ENV_OFFSET 0xcfe x2fe00000 MEMORY_BASE_ADDRESS + 0xfe x0007C000 0x (2*1024*1024) Reserve 영역 메모리 Malloc (1MB+0x4000) Code 영역 0x2F x2F03C000 0x2FE

374 안드로이드 커널 Open Git 서버

375 망고100 NAND Partition 영역 0x MB U-boot (/dev/mtdblock0) Kernel (/dev/mtdblock1) Filesystem (/dev/mtdblock2) 0x x x Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit": 0x x : "Bootloader" 0x x : "Kernel" 0x x : "File System --커널 부팅 시 메시지 커널소스 위치는 부팅 후 확읶 방법 #cat /proc/mtd

376 SD /MMC Partition 구성 3941MB FAT32(2.4GB) GNOME FS(500MB) Android FS(500MB) Reserved영역 Kernel (419304byte) U-boot (540672byte) Bootloader (9216byte) 1 TSECTORS-9266 TSECTORS-1074 TSECTORS-18 Disk /dev/mmcblk0: 3941 MB, bytes 4 heads, 16 sectors/track, cylinders, total sectors Units = sectors of 1 * 512 = 512 bytes TSECTORS= sectors 1. Fdisk 명령으로 파티션을 맊든다 2. Mkfs.ext3 /dev/sdb1 3. Mkfs.ext3 /dev/sdb2 4. Mkfs.ext3 /dev/sdb3 5. Mount -t ext3 /dev/sdb2 /media/android 6. 파읷시스템 복사

377 참고 : kernel Makefile 계층도 all make silentoldconfig vmlinux zimage arch/arm/boot/makefile 에서 make zimage를 다시 수행 $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsysms.o) $(obj) = arch/arm/boot zimage $(vmlinux-dirs) init usr kernel mm fs ipc security crypto block drivers sound net lib prepare prepare0 archpare arch/arm/kernel arch/arm/mm arch/arm/crypto include/config/auto.conf include/config/kernel.release prepare1 prepare2 prepare3 scripts_basic include/linux/version.h include/linux/utsrelease.h include/asm $(obj) = arch/arm/boot/compressed $(obj)/compressed/vmlinux $(obj)/head.o $(obj)/misc.o $(obj)/piggy.o $(obj)/piggy.gz $(obj)/image vmlinux 여기에서 vmlinux는 커널 소스 최상위 디렉토리에서 만들어진 vmlinux를 말한다.

378 Keypad driver flow Button (Hardware) 10ms 마다 스캔 mango100_keypad.rd_timer GET_KEYPAD_DATA mango100_rd_timer_handler generate_keycode mango100_keypad_control input_report_key 에서 이벤트 발생

379 안드로이드 Key event 처리 Key button Map 정의는 vendor\sec\mango100\mango100-keypad.kl frameworks/base/libs/eventhub.cpp에 scan_dir,open_device 정의 KeyInputQueue( 1853): InputDeviceReader.run() static const char *device_path = "/dev/input"; bool EventHub::openPlatformInput(void) {.. res = scan_dir(device_path);.. } int EventHub::scan_dir(const char *dirname) { while((de = readdir(dir))) { strcpy(filename, de->d_name); open_device(devname); } } int EventHub::open_device(const char *devicename)

380 안드로이드 구조

381 ADB 연결하기 PC와 망고보드를 usb cable로 연결 >adb devices oys

382 Android 구조 Application Framework Core Libraries& Hardware Abstraction Layer Linux Kernel oys

망고100 보드로 놀아보자-5

망고100 보드로 놀아보자-5 망고 100 보드로놀아보자 -6 U-boot build 환경분석 U-boot build 환경분석 Board/$(Vendor)/$(BOARD)/Config.mk 파일분석 (U-boot 가실행하는주소정의 ) ifndeftext_base //TEXT_BASE = 0xc7e00000 :MMU 사용 TEXT_BASE = 0x2fe00000 # Physical Address

More information

망고100 보드로 놀아보자 -10

망고100 보드로 놀아보자 -10 망고 100 보드로놀아보자 -10 Kernel build 분석 http:// http://www.mangoboard.com 커널 build 환경분석 >(Top Dir)/Makefile 첫번째라인에위치 > 커널 2.6.29 버전사용 >ARCH?=arm 의미는 ARCH 의값으로 arm 있느냐묻고, 없으면, arm 문자를대입 >.cross_compile 이있으면,.cross_compile

More information

망고100 보드로 놀아보자-4

망고100 보드로 놀아보자-4 망고 100 보드로놀아보자 -4 Minicom,tftp,nfs 설정,vnc 설정 minicom 설정 Minicom 설정 >#yum install minicom >#ls /dev/ttyusb* ># minicom s Minicom 설정 Serial Device :/dev/ttyusb0 Baudrate:115200 Hardware Flow control: NO

More information

망고100 보드로 놀아보자 -13

망고100 보드로 놀아보자 -13 리눅스디바이스드라이버개요 http://cafe.naver.com/embeddedcrazyboys http://www.mangoboard.com 디바이스드라이버개요 디바이스 (Device ) 네트워크어댑터, LCD 디스플레이, PCMCIA, Audio, 터미널, 키보드, 하드디스 크, 플로피디스크, 프린터등과같은주변장치들을말함 디바이스의구동에필요한프로그램, 즉디바이스드라이버가필수적으로요구

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 (Host) set up : Linux Backend RS-232, Ethernet, parallel(jtag) Host terminal Target terminal : monitor (Minicom) JTAG Cross compiler Boot loader Pentium Redhat 9.0 Serial port Serial cross cable Ethernet

More information

슬라이드 제목 없음

슬라이드 제목 없음 < > Target cross compiler Target code Target Software Development Kit (SDK) T-Appl T-Appl T-VM Cross downloader Cross debugger Case 1) Serial line Case 2) LAN line LAN line T-OS Target debugger Host System

More information

슬라이드 1

슬라이드 1 / 임베디드시스템개요 / 임베디드운영체제 / 디바이스드라이버 01 Linux System Architecture Application Area Application System Call Interface BSD Socket Virtual File System INET(AF_INET) Kernel Area Buffer Cache Network Subsystem

More information

Mango220 Android How to compile and Transfer image to Target

Mango220 Android How to compile and Transfer image to Target Mango220 Android How to compile and Transfer image to Target http://www.mangoboard.com/ http://cafe.naver.com/embeddedcrazyboys Crazy Embedded Laboratory www.mangoboard.com cafe.naver.com/embeddedcrazyboys

More information

untitled

untitled Step Motor Device Driver Embedded System Lab. II Step Motor Step Motor Step Motor source Embedded System Lab. II 2 open loop, : : Pulse, 1 Pulse,, -, 1 +5%, step Step Motor (2),, Embedded System Lab. II

More information

Microsoft PowerPoint - em8-리눅스설치.ppt

Microsoft PowerPoint - em8-리눅스설치.ppt 임베디드리눅스커널설치개요 임베디드리눅스설치 Linux Kernel* Root File System* jffs2.img 1 2 구성요소 리눅스커널 필수구성요소 하드웨어를초기화하고 kernel image를 에올려주어수행을넘겨주는역할을하는프로그램 OS Kernel OS 의핵심프로그램 Root File System Kernel 에서사용할 File System 임베디드리눅스에서는

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 BOOTLOADER Jo, Heeseung 부트로더컴파일 부트로더소스복사및압축해제 부트로더소스는웹페이지에서다운로드 /working 디렉터리로이동한후, wget으로다운로드 이후작업은모두 /working 디렉터리에서진행 root@ubuntu:# cp /media/sm5-linux-111031/source/platform/uboot-s4210.tar.bz2 /working

More information

Mango-AM335x LCD Type 커널 Module Parameter에서 변경하기

Mango-AM335x LCD Type 커널 Module Parameter에서 변경하기 Mango-AM335x LCD Type 커널 Module Parameter 에서 변경하기 http://www.mangoboard.com/ http://cafe.naver.com/embeddedcrazyboys Crazy Embedded Laboratory www.mangoboard.com cafe.naver.com/embeddedcrazyboys CRZ Technology

More information

6주차.key

6주차.key 6, Process concept A program in execution Program code PCB (process control block) Program counter, registers, etc. Stack Heap Data section => global variable Process in memory Process state New Running

More information

DE1-SoC Board

DE1-SoC Board 실습 1 개발환경 DE1-SoC Board Design Tools - Installation Download & Install Quartus Prime Lite Edition http://www.altera.com/ Quartus Prime (includes Nios II EDS) Nios II Embedded Design Suite (EDS) is automatically

More information

Microsoft PowerPoint - 03-Development-Environment-2.ppt

Microsoft PowerPoint - 03-Development-Environment-2.ppt 개발환경 2 임베디드시스템소프트웨어 I 차례 부트로더의기능, 컴파일방법 커널의기능, 컴파일방법 파일시스템의기능, 생성방법 Host-KIT 네트워크연결방법 (Bootp, TFTP, NFS) 개발환경 2 2 부트로더의기능 하드웨어초기화 CPU clock, Memory Timing, Interrupt, UART, GPIO 등을초기화 커널로드 커널이미지를 flash

More information

휠세미나3 ver0.4

휠세미나3 ver0.4 andromeda@sparcs:/$ ls -al dev/sda* brw-rw---- 1 root disk 8, 0 2014-06-09 18:43 dev/sda brw-rw---- 1 root disk 8, 1 2014-06-09 18:43 dev/sda1 brw-rw---- 1 root disk 8, 2 2014-06-09 18:43 dev/sda2 andromeda@sparcs:/$

More information

임베디드시스템설계강의자료 4 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

임베디드시스템설계강의자료 4 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 임베디드시스템설계강의자료 4 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 Outline n n n n n n 보드개요보드연결필수패키지, Tool-Chain 설치 Kernel, file system build Fastboot 및 Tera Term설치 Kernel, file system 이미지전송및설치 - 2 - Young-Jin Kim X-Hyper320TKU

More information

목차 개발환경 JTAG Bootp TFTP NFS 1

목차 개발환경 JTAG Bootp TFTP NFS 1 Chapter. 3 Development Environment Settings Professor. Jaeheung, Lee 목차 개발환경 JTAG Bootp TFTP NFS 1 개발환경 기본구성 JTAG RS-232 Ethernet Host System Target System 2 개발환경 개발환경구성요소 Host System Target System을개발하기위한환경을제공하는시스템교차개발환경제공

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 KeyPad Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 에는 16 개의 Tack Switch 를사용하여 4 행 4 열의 Keypad 가장착 4x4 Keypad 2 KeyPad 를제어하기위하여 FPGA 내부에 KeyPad controller 가구현 KeyPad controller 16bit 로구성된

More information

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D313939392D382E687770>

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D313939392D382E687770> i ii iii iv v vi 1 2 3 4 가상대학 시스템의 국내외 현황 조사 가상대학 플랫폼 개발 이상적인 가상대학시스템의 미래상 제안 5 웹-기반 가상대학 시스템 전통적인 교수 방법 시간/공간 제약을 극복한 학습동기 부여 교수의 일방적인 내용전달 교수와 학생간의 상호작용 동료 학생들 간의 상호작용 가상대학 운영 공지사항,강의록 자료실, 메모 질의응답,

More information

교육지원 IT시스템 선진화

교육지원 IT시스템 선진화 Module 7: Bootloader ESP30076 임베디드시스템프로그래밍 (Embedded System Programming) 조윤석 전산전자공학부 주차별목표 부트로더의기능이해하기 부트로더의주요소스이해하기 uboot 명령어알아보기 타겟보드에컴파일된부트로더이미지설치하기 부트로더에신규명령어추가하기 부트로더컴파일하기 2 Bootloader 임베디드시스템에서의부트로더

More information

Mango24R2 Auto Write

Mango24R2 Auto Write Mango24R2 Auto Write http://www.mangoboard.com/ http://cafe.naver.com/embeddedcrazyboys Crazy Embedded Laboratory www.mangoboard.com cafe.naver.com/embeddedcrazyboys CRZ Technology 1 Document History Revision

More information

1217 WebTrafMon II

1217 WebTrafMon II (1/28) (2/28) (10 Mbps ) Video, Audio. (3/28) 10 ~ 15 ( : telnet, ftp ),, (4/28) UDP/TCP (5/28) centralized environment packet header information analysis network traffic data, capture presentation network

More information

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 임베디드리눅스개발환경실습 Jo, Heeseung 타겟보드모니터링동작실습 호스트 PC 에서시리얼포트를통해서타겟보드를모니터링 타겟보드가프로그램을실행하는동안일어나는일을시리얼포트로메시지를출력하면호스트 PC 에서는시리얼포트를통해메시지를수신하여이를화면에출력 minicom 프로그램사용 - minicom 이정상적으로설정이되고, 타겟보드에최소한부트로더가올라간상태라면 minicom

More information

Microsoft PowerPoint - Cross Development Environment [호환 모드]

Microsoft PowerPoint - Cross Development Environment [호환 모드] 임베디드시스템개발환경 한국외국어대학교전자정보공학부이윤석 0 Outline 기본구성및용어 Cross Development ( 교차개발 ) Toolchain JTAG Bootp TFTP NFS 1 1 개발환경 기본구성 Host 시스템 임베디드소프트웨어를개발하는시스템 일반 PC에 Linux 운영체제를설치하여사용 Cross compile 환경필요 (toolchain

More information

SRC PLUS 제어기 MANUAL

SRC PLUS 제어기 MANUAL ,,,, DE FIN E I N T R E A L L O C E N D SU B E N D S U B M O TIO

More information

Microsoft PowerPoint - 02-Development-Environment-1.ppt

Microsoft PowerPoint - 02-Development-Environment-1.ppt 개발환경 1 임베디드시스템소프트웨어 I 차례 개발환경 Host와 Target의연결 Host 및 target 사양 Toolchain이란, 설치방법 시험 Cross Compile Minicom 설정및사용방법 JTAG 설치및사용방법 Bootloader, kernel, file system flash 방법 개발환경 1 2 개발환경 Host 시스템 임베디드소프트웨어를개발하는시스템

More information

Mango-IMX6Q mfgtool을 이용한 이미지 Write하기

Mango-IMX6Q mfgtool을 이용한 이미지 Write하기 Mango-IMX6Q mfgtool 을 이용한이미지 Write 하기 http://www.mangoboard.com/ http://cafe.naver.com/embeddedcrazyboys Crazy Embedded Laboratory www.mangoboard.com cafe.naver.com/embeddedcrazyboys CRZ Technology 1 Document

More information

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F > 10주차 문자 LCD 의인터페이스회로및구동함수 Next-Generation Networks Lab. 5. 16x2 CLCD 모듈 (HY-1602H-803) 그림 11-18 19 핀설명표 11-11 번호 분류 핀이름 레벨 (V) 기능 1 V SS or GND 0 GND 전원 2 V Power DD or V CC +5 CLCD 구동전원 3 V 0 - CLCD 명암조절

More information

Chapter. 5 Embedded System I Bootloader, Kernel, Ramdisk Professor. Jaeheung, Lee

Chapter. 5 Embedded System I Bootloader, Kernel, Ramdisk Professor. Jaeheung, Lee Chapter. 5 Bootloader, Kernel, Ramdisk Professor. Jaeheung, Lee 목차 Bootloader Kernel File System 1 Bootloader Bootloader 란? 리눅스커널부팅이전에미리실행되면서커널이올바르게부팅되기위해필요한모든관련작업을마무리하고최종적으로리눅스커널을부팅시키기위한목적으로짜여진프로그램 Bootloader

More information

Microsoft PowerPoint - 02_Linux_Fedora_Core_8_Vmware_Installation [호환 모드]

Microsoft PowerPoint - 02_Linux_Fedora_Core_8_Vmware_Installation [호환 모드] 리눅스 설치 Vmware를 이용한 Fedora Core 8 설치 소프트웨어실습 1 Contents 가상 머신 실습 환경 구축 Fedora Core 8 설치 가상 머신 가상 머신 가상 머신의 개념 VMware의 설치 VMware : 가상 머신 생성 VMware의 특징 실습 환경 구축 실습 환경 구축 Fedora Core 8 설치 가상 머신의 개념 가상 머신 (Virtual

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 임베디드리눅스개발환경구축 Jo, Heeseung 개발환경 HBE-SM5-S4210 개발환경 타겟보드와리눅스가설치된호스트컴퓨터가필요 임베디드리눅스개발환경 - 호스트컴퓨터환경설치 - 호스트와타겟연결 - 디버그환경 호스트컴퓨터는임베디드시스템의동작을모니터링하는디버깅환경으로서의역할도수행 임베디드시스템을위한소프트웨어를개발하기위해서호스트시스템에구축하는개발환경 교차개발환경

More information

PCServerMgmt7

PCServerMgmt7 Web Windows NT/2000 Server DP&NM Lab 1 Contents 2 Windows NT Service Provider Management Application Web UI 3 . PC,, Client/Server Network 4 (1),,, PC Mainframe PC Backbone Server TCP/IP DCS PLC Network

More information

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론 이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론 2. 관련연구 2.1 MQTT 프로토콜 Fig. 1. Topic-based Publish/Subscribe Communication Model. Table 1. Delivery and Guarantee by MQTT QoS Level 2.1 MQTT-SN 프로토콜 Fig. 2. MQTT-SN

More information

LXR 설치 및 사용법.doc

LXR 설치 및 사용법.doc Installation of LXR (Linux Cross-Reference) for Source Code Reference Code Reference LXR : 2002512( ), : 1/1 1 3 2 LXR 3 21 LXR 3 22 LXR 221 LXR 3 222 LXR 3 3 23 LXR lxrconf 4 24 241 httpdconf 6 242 htaccess

More information

Chap 5 루트파일시스템 (Root F/S)

Chap 5 루트파일시스템 (Root F/S) Chap 5 루트파일시스템 (Root F/S) Chap 5. 루트파일시스템 (Root F/S) 1. Root File System 1.1. Root File system Root file system이란 / 에마운트되는 file system을말한다. 리눅스시스템에서커널이기본적인운용환경을구성해주고난다음, 루트파일시스템이리눅스시스템에서사용하는유틸리티, 라이브러리등과같은부가적인요소들을제공한다.

More information

Sena Technologies, Inc. HelloDevice Super 1.1.0

Sena Technologies, Inc. HelloDevice Super 1.1.0 HelloDevice Super 110 Copyright 1998-2005, All rights reserved HelloDevice 210 ()137-130 Tel: (02) 573-5422 Fax: (02) 573-7710 E-Mail: support@senacom Website: http://wwwsenacom Revision history Revision

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 임베디드리눅스개발환경구축 Jo, Heeseung 개발환경 HBE-SM5-S4210 개발환경 타겟보드와리눅스가설치된호스트컴퓨터가필요 임베디드리눅스개발환경 - 호스트컴퓨터환경설치 - 호스트와타겟연결 - 디버그환경 호스트컴퓨터는임베디드시스템의동작을모니터링하는디버깅환경으로서의역할도수행 임베디드시스템을위한소프트웨어를개발하기위해서호스트시스템에구축하는개발환경 교차개발환경

More information

Getting Started 1 st Edition March 2004 Contents 1.EMPOS II QUICK START... 1 1.1. 1.2. 1.3. 1.4. 1.5. 1.6. 1.7. 1.8. 1.9....1...1...2 TextLcd...5 7 Segment...6 Led I/O...7 IP DEFAULT GATEWAY...8 WEB

More information

MAX+plus II Getting Started - 무작정따라하기

MAX+plus II Getting Started - 무작정따라하기 무작정 따라하기 2001 10 4 / Version 20-2 0 MAX+plus II Digital, Schematic Capture MAX+plus II, IC, CPLD FPGA (Logic) ALTERA PLD FLEX10K Series EPF10K10QC208-4 MAX+plus II Project, Schematic, Design Compilation,

More information

지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함. 한번은 intel CPU를위한 gcc로, 한번은 ARM CPU를위한 gcc로. AR

지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함. 한번은 intel CPU를위한 gcc로, 한번은 ARM CPU를위한 gcc로. AR Configure Kernel Build Environment And kernel & root file system Build 2018-09-27 VLSI Design Lab 1 지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함.

More information

bn2019_2

bn2019_2 arp -a Packet Logging/Editing Decode Buffer Capture Driver Logging: permanent storage of packets for offline analysis Decode: packets must be decoded to human readable form. Buffer: packets must temporarily

More information

untitled

untitled GUI Programming in Embedded Linux Embedded System Lab. II GUI 1:1 Embedded System Lab. II 2 Qt QT trolltech cross GUI QT ( ),, Mac, Linux, *nix C++ Qt X11 C++ GUI. (, ). Qt. Embedded System Lab. II 3 Qt/Embedded

More information

무시하고진행합니다. $ sudo rootstock -d precise --seed ubuntu-standard -x en_us.utf-8 -f ubuntu -l ubuntu -p ubuntu -i 2G I: Running on a x86_64 machine I: Cre

무시하고진행합니다. $ sudo rootstock -d precise --seed ubuntu-standard -x en_us.utf-8 -f ubuntu -l ubuntu -p ubuntu -i 2G I: Running on a x86_64 machine I: Cre ( 망고 220 ubuntu 포팅 ) $ wget http://launchpadlibrarian.net/52888742/rootstock_0.1.99.4-0ubuntu1_i386.deb --2014-09-23 18:02:26-- http://launchpadlibrarian.net/52888742/rootstock_0.1.99.4-0ubuntu1_i386.deb

More information

Copyright 2004 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A..,,. Sun. Sun. Berkeley BSD. UNIX X/Open Company, Ltd.. Sun, Su

Copyright 2004 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A..,,. Sun. Sun. Berkeley BSD. UNIX X/Open Company, Ltd.. Sun, Su Java Desktop System 2 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA 95054 U.S.A. : 817 7757 10 2004 9 Copyright 2004 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA 95054 U.S.A..,,.

More information

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D> 뻔뻔한 AVR 프로그래밍 The Last(8 th ) Lecture 유명환 ( yoo@netplug.co.kr) INDEX 1 I 2 C 통신이야기 2 ATmega128 TWI(I 2 C) 구조분석 4 ATmega128 TWI(I 2 C) 실습 : AT24C16 1 I 2 C 통신이야기 I 2 C Inter IC Bus 어떤 IC들간에도공통적으로통할수있는 ex)

More information

PRO1_04E [읽기 전용]

PRO1_04E [읽기 전용] Siemens AG 1999 All rights reserved File: PRO1_04E1 Information and S7-300 2 S7-400 3 EPROM / 4 5 6 HW Config 7 8 9 CPU 10 CPU : 11 CPU : 12 CPU : 13 CPU : / 14 CPU : 15 CPU : / 16 HW 17 HW PG 18 SIMATIC

More information

Adding a New Dev file

Adding a New Dev file Adding a New Dev file - 김성영, 이재혁, 김남현 - 발표자 : 김남현 목차 01 Progress 02 Device file 03 How create dev file 04 Example Progress 4 월 1 일 프로젝트방향설정 4 월 8 일 device file 추가방법조사 mem.c 파일분석 4 월 10 일 알고리즘제시필요한함수분석

More information

슬라이드 1

슬라이드 1 / 유닉스시스템개요 / 파일 / 프로세스 01 File Descriptor file file descriptor file type unix 에서의파일은단지바이트들의나열임 operating system 은파일에어떤포맷도부과하지않음 파일의내용은바이트단위로주소를줄수있음 file descriptor 는 0 이나양수임 file 은 open 이나 creat 로 file

More information

SMB_ICMP_UDP(huichang).PDF

SMB_ICMP_UDP(huichang).PDF SMB(Server Message Block) UDP(User Datagram Protocol) ICMP(Internet Control Message Protocol) SMB (Server Message Block) SMB? : Microsoft IBM, Intel,. Unix NFS. SMB client/server. Client server request

More information

K&R2 Reference Manual 번역본

K&R2 Reference Manual 번역본 typewriter structunion struct union if-else if if else if if else if if if if else else ; auto register static extern typedef void char short int long float double signed unsigned const volatile { } struct

More information

hd1300_k_v1r2_Final_.PDF

hd1300_k_v1r2_Final_.PDF Starter's Kit for HelloDevice 1300 Version 11 1 2 1 2 3 31 32 33 34 35 36 4 41 42 43 5 51 52 6 61 62 Appendix A (cross-over) IP 3 Starter's Kit for HelloDevice 1300 1 HelloDevice 1300 Starter's Kit HelloDevice

More information

Chap 10 안드로이드커널 (Kernel)

Chap 10 안드로이드커널 (Kernel) Chap 10 안드로이드커널 (Kernel) 1. Kernel Operating System에서 Kernel은운영체제의핵심부분이다. Bootloader에서하드웨어초기화를담당했다면, 커널은우리가사용해야할시스템자원을관리해주는기능을해준다. 아래는기본적인커널의역할을나열해보았다. 물론, 안드로이드가적용되면서기본적인커널에추가적인기능이포함되었다. 기본적인커널의역할을나열하면아래와같다.

More information

Microsoft PowerPoint - Building.pptx

Microsoft PowerPoint - Building.pptx Building Embedded Linux System Toolchains Bootloader Kernel Root File System 정의 Toolchain 소스를컴파일하여바이너리실행파일를생성하기위해필요한컴파일러및라이브러리, 바이너리유틸리티모음 구성요소 Toolchain GCC : 컴파일러 Binutils : 어셈블러및로더, 바이너리파일편집유틸리티 Glibc

More information

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수

More information

Adobe Flash 취약점 분석 (CVE-2012-0754)

Adobe Flash 취약점 분석 (CVE-2012-0754) 기술문서 14. 08. 13. 작성 GNU C library dynamic linker $ORIGIN expansion Vulnerability Author : E-Mail : 윤지환 131ackcon@gmail.com Abstract 2010 년 Tavis Ormandy 에 의해 발견된 취약점으로써 정확한 명칭은 GNU C library dynamic linker

More information

Assign an IP Address and Access the Video Stream - Installation Guide

Assign an IP Address and Access the Video Stream - Installation Guide 설치 안내서 IP 주소 할당 및 비디오 스트림에 액세스 책임 본 문서는 최대한 주의를 기울여 작성되었습니다. 잘못되거나 누락된 정보가 있는 경우 엑시스 지사로 알려 주시기 바랍니다. Axis Communications AB는 기술적 또는 인쇄상의 오류에 대해 책 임을 지지 않으며 사전 통지 없이 제품 및 설명서를 변경할 수 있습니다. Axis Communications

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 7-Segment Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 의 M3 Module 에는 6 자리를가지는 7-Segment 모듈이아래그림처럼실장 6 Digit 7-Segment 2 6-Digit 7-Segment LED Controller 16비트로구성된 2개의레지스터에의해제어 SEG_Sel_Reg(Segment

More information

Microsoft Word doc

Microsoft Word doc TCP/IP 구조 1. I.P 구조설명 2. ARP 구조설명 3. TCP 구조설명 4. UDT 구조설명 5. RIP 구조설명 6. BOOTP 구조설명 7. TFTP 구조설명 destination addr source addr type data CRC 6 6 2 46-1500 4 type 0X0800 IP datagram 2 46-1500 type 0X0806

More information

KEY 디바이스 드라이버

KEY 디바이스 드라이버 KEY 디바이스드라이버 임베디드시스템소프트웨어 I (http://et.smu.ac.kr et.smu.ac.kr) 차례 GPIO 및 Control Registers KEY 하드웨어구성 KEY Driver 프로그램 key-driver.c 시험응용프로그램 key-app.c KEY 디바이스드라이버 11-2 GPIO(General-Purpose Purpose I/O)

More information

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서 커알못의 커널 탐방기 2015.12 이 세상의 모든 커알못을 위해서 개정 이력 버전/릴리스 0.1 작성일자 2015년 11월 30일 개요 최초 작성 0.2 2015년 12월 1일 보고서 구성 순서 변경 0.3 2015년 12월 3일 오탈자 수정 및 글자 교정 1.0 2015년 12월 7일 내용 추가 1.1 2015년 12월 10일 POC 코드 삽입 및 코드

More information

Raspbian 설치 라즈비안 OS (Raspbian OS) 라즈베리파이 3 Model B USB 마우스 USB 키보드 마이크로 SD 카드 마이크로 SD 카드리더기 HDM I 케이블모니터

Raspbian 설치 라즈비안 OS (Raspbian OS) 라즈베리파이 3 Model B USB 마우스 USB 키보드 마이크로 SD 카드 마이크로 SD 카드리더기 HDM I 케이블모니터 운영체제실습 Raspbian 설치 2017. 3 표월성 wspyo74@naver.com cherub.sungkyul.ac.kr 목차 Ⅰ. 설치 1. 라즈비안 (Raspbian 설치 ) 2. 설치후, 설정 설정사항 Raspbian 설치 라즈비안 OS (Raspbian OS) 라즈베리파이 3 Model B USB 마우스 USB 키보드 마이크로 SD 카드 마이크로

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 7-Segment Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 의 M3 Module 에는 6 자리를가지는 7-Segment 모듈이아래그림처럼실장 6 Digit 7-Segment 2 6-Digit 7-Segment LED controller 16비트로구성된 2개의레지스터에의해제어 SEG_Sel_Reg(Segment

More information

Code Generation in Rapid

Code Generation in Rapid 임베디드시스템설계실습 (3) Embedded System Design Real-Time Computing and Communications Lab. Hanyang University 자료복사 USB 파일복사 파일및폴더리스트 PL2303_Prolific_DriverInstaller (Windows) toolchain-s5pc1xx.tar.gz u-boot-1.3.4.tar.gz

More information

GNU/Linux 1, GNU/Linux MS-DOS LOADLIN DOS-MBR LILO DOS-MBR LILO... 6

GNU/Linux 1, GNU/Linux MS-DOS LOADLIN DOS-MBR LILO DOS-MBR LILO... 6 GNU/ 1, qkim@pecetrirekr GNU/ 1 1 2 2 3 4 31 MS-DOS 5 32 LOADLIN 5 33 DOS- LILO 6 34 DOS- 6 35 LILO 6 4 7 41 BIOS 7 42 8 43 8 44 8 45 9 46 9 47 2 9 5 X86 GNU/LINUX 10 1 GNU/, GNU/ 2, 3, 1 : V 11, 2001

More information

소개 TeraStation 을 구입해 주셔서 감사합니다! 이 사용 설명서는 TeraStation 구성 정보를 제공합니다. 제품은 계속 업데이트되므로, 이 설명서의 이미지 및 텍스트는 사용자가 보유 중인 TeraStation 에 표시 된 이미지 및 텍스트와 약간 다를 수

소개 TeraStation 을 구입해 주셔서 감사합니다! 이 사용 설명서는 TeraStation 구성 정보를 제공합니다. 제품은 계속 업데이트되므로, 이 설명서의 이미지 및 텍스트는 사용자가 보유 중인 TeraStation 에 표시 된 이미지 및 텍스트와 약간 다를 수 사용 설명서 TeraStation Pro II TS-HTGL/R5 패키지 내용물: 본체 (TeraStation) 이더넷 케이블 전원 케이블 TeraNavigator 설치 CD 사용 설명서 (이 설명서) 제품 보증서 www.buffalotech.com 소개 TeraStation 을 구입해 주셔서 감사합니다! 이 사용 설명서는 TeraStation 구성 정보를

More information

°ø°³¼ÒÇÁÆ®-8È£

°ø°³¼ÒÇÁÆ®-8È£ 2007. 08 No.8 IT World 운영체제 미들웨어 데이터베이스 웹프로그래밍까지 표준화된공개SW 컴퓨팅환경이지원합니다. 글로벌표준의공개SW 환경은 핵심애플리케이션뿐만아니라다양한플랫폼에서도활용됩니다. 2 2007. 08No.8 Contents Special Editorial 04 Best Practice 08 12 16 20 24 26 Insight 32

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Text-LCD Device Control - Device driver Jo, Heeseung M3 모듈에장착되어있는 Tedxt LCD 장치를제어하는 App 을개발 TextLCD 는영문자와숫자일본어, 특수문자를표현하는데사용되는디바이스 HBE-SM5-S4210 의 TextLCD 는 16 문자 *2 라인을 Display 할수있으며, 이 TextLCD 를제어하기위하여

More information

목차 1. 제품 소개... 4 1.1 특징... 4 1.2 개요... 4 1.3 Function table... 5 2. 기능 소개... 6 2.1 Copy... 6 2.2 Compare... 6 2.3 Copy & Compare... 6 2.4 Erase... 6 2

목차 1. 제품 소개... 4 1.1 특징... 4 1.2 개요... 4 1.3 Function table... 5 2. 기능 소개... 6 2.1 Copy... 6 2.2 Compare... 6 2.3 Copy & Compare... 6 2.4 Erase... 6 2 유영테크닉스( 주) 사용자 설명서 HDD014/034 IDE & SATA Hard Drive Duplicator 유 영 테 크 닉 스 ( 주) (032)670-7880 www.yooyoung-tech.com 목차 1. 제품 소개... 4 1.1 특징... 4 1.2 개요... 4 1.3 Function table... 5 2. 기능 소개... 6 2.1 Copy...

More information

망고 M 카메라 포팅 가이드

망고 M 카메라 포팅 가이드 망고 220 1.3M 카메라포팅 가이드 http://www.mangoboard.com/ http://cafe.naver.com/embeddedcrazyboys Crazy Embedded Laboratory www.mangoboard.com cafe.naver.com/embeddedcrazyboys CRZ Technology 1 Document History

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Install the PDI on CentOS 2013.04 G L O B E P O I N T 1 Ⅰ linux 구성 II Pentaho Install 2013, Globepoint Inc. All Rights Reserved. 2 I. Linux 구성 2013, Globepoint Inc. All Rights Reserved. 3 IP 설정 1. 설정파일

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Web server porting 2 Jo, Heeseung Web 을이용한 LED 제어 Web 을이용한 LED 제어프로그램 web 에서데이터를전송받아타겟보드의 LED 를조작하는프로그램을작성하기위해다음과같은소스파일을생성 2 Web 을이용한 LED 제어 LED 제어프로그램작성 8bitled.html 파일을작성 root@ubuntu:/working/web# vi

More information

/chroot/lib/ /chroot/etc/

/chroot/lib/ /chroot/etc/ 구축 환경 VirtualBox - Fedora 15 (kernel : 2.6.40.4-5.fc15.i686.PAE) 작동 원리 chroot유저 ssh 접속 -> 접속유저의 홈디렉토리 밑.ssh의 rc 파일 실행 -> daemonstart실행 -> daemon 작동 -> 접속 유저만의 Jail 디렉토리 생성 -> 접속 유저의.bashrc 의 chroot 명령어

More information

강의10

강의10 Computer Programming gdb and awk 12 th Lecture 김현철컴퓨터공학부서울대학교 순서 C Compiler and Linker 보충 Static vs Shared Libraries ( 계속 ) gdb awk Q&A Shared vs Static Libraries ( 계속 ) Advantage of Using Libraries Reduced

More information

s SINUMERIK 840C Service and User Manual DATA SAVING & LOADING & & /

s SINUMERIK 840C Service and User Manual DATA SAVING & LOADING & & / SINUMERIK 840C Service and Uer Manual DATA SAVING & LOADING & & / / NC, RS232C /. NC NC / Computer link () Device ( )/PC / / Print erial Data input RS232C () Data output Data management FLOPPY DRIVE, FLOPPY

More information

Solaris Express Developer Edition

Solaris Express Developer Edition Solaris Express Developer Edition : 2008 1 Solaris TM Express Developer Edition Solaris OS. Sun / Solaris, Java, Web 2.0,,. Developer Solaris Express Developer Edition System Requirements. 768MB. SPARC

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Network Programming Jo, Heeseung Network 실습 네트워크프로그래밍 멀리떨어져있는호스트들이서로데이터를주고받을수있도록프로그램을구현하는것 파일과는달리데이터를주고받을대상이멀리떨어져있기때문에소프트웨어차원에서호스트들간에연결을해주는장치가필요 이러한기능을해주는장치로소켓이라는인터페이스를많이사용 소켓프로그래밍이란용어와네트워크프로그래밍이랑용어가같은의미로사용

More information

슬라이드 1

슬라이드 1 13 장실제타깃제작하기 시작하면서 2 목차 13.1 타깃개발개요 13.2 안드로이드모바일하드웨어플랫폼 13.3 실제타깃개발홖경구축 13.4 실제타깃커널제작 13.5 타깃으로이미지다운로드 13.6 파일시스템구성 13.7 부팅및실행 13.1 타깃개발개요 3 porting 어떻게안드로이드소프트웨어플랫폼을빌드하여포팅하는가? 계층구조의플랫폼을빌딩하는방법? 교차컴파일

More information

고급 프로그래밍 설계

고급 프로그래밍 설계 UNIT 13 라즈베리파이블루투스 광운대학교로봇 SW 교육원 최상훈 Bluetooth Module 2 Bluetooth Slave UART Board UART 인터페이스용블루투스모듈 slave/device mode 라즈베리파이 GPIO 3 < 라즈베리파이 B+ 의 P1 헤더핀 GPIO 배치도 > wiringpi 라이브러리 4 라즈베리파이 GPIO 라이브러리

More information

MySQL-Ch10

MySQL-Ch10 10 Chapter.,,.,, MySQL. MySQL mysqld MySQL.,. MySQL. MySQL....,.,..,,.,. UNIX, MySQL. mysqladm mysqlgrp. MySQL 608 MySQL(2/e) Chapter 10 MySQL. 10.1 (,, ). UNIX MySQL, /usr/local/mysql/var, /usr/local/mysql/data,

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 7-SEGMENT DEVICE CONTROL - DEVICE DRIVER Jo, Heeseung 디바이스드라이버구현 : 7-SEGMENT HBE-SM5-S4210 의 M3 Module 에는 6 자리를가지는 7-Segment 모듈이아래그림처럼실장 6 Digit 7-Segment 2 디바이스드라이버구현 : 7-SEGMENT 6-Digit 7-Segment LED

More information

PRO1_09E [읽기 전용]

PRO1_09E [읽기 전용] Siemens AG 1999 All rights reserved File: PRO1_09E1 Information and - ( ) 2 3 4 5 Monitor/Modify Variables" 6 7 8 9 10 11 CPU 12 Stop 13 (Forcing) 14 (1) 15 (2) 16 : 17 : Stop 18 : 19 : (Forcing) 20 :

More information

28 THE ASIAN JOURNAL OF TEX [2] ko.tex [5]

28 THE ASIAN JOURNAL OF TEX [2] ko.tex [5] The Asian Journal of TEX, Volume 3, No. 1, June 2009 Article revision 2009/5/7 KTS THE KOREAN TEX SOCIETY SINCE 2007 2008 ko.tex Installing TEX Live 2008 and ko.tex under Ubuntu Linux Kihwang Lee * kihwang.lee@ktug.or.kr

More information

untitled

untitled Push... 2 Push... 4 Push... 5 Push... 13 Push... 15 1 FORCS Co., LTD A Leader of Enterprise e-business Solution Push (Daemon ), Push Push Observer. Push., Observer. Session. Thread Thread. Observer ID.

More information

Interstage5 SOAP서비스 설정 가이드

Interstage5 SOAP서비스 설정 가이드 Interstage 5 Application Server ( Solaris ) SOAP Service Internet Sample Test SOAP Server Application SOAP Client Application CORBA/SOAP Server Gateway CORBA/SOAP Gateway Client INTERSTAGE SOAP Service

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 임베디드리눅스개발환경실습 Jo, Heeseung 타겟보드모니터링동작실습 호스트 PC 에서시리얼포트를통해서타겟보드를모니터링 타겟보드가프로그램을실행하는동안일어나는일을시리얼포트로메시지를출력하면호스트 PC 에서는시리얼포트를통해메시지를수신하여이를화면에출력 minicom 프로그램사용 - minicom 이정상적으로설정이되고, 타겟보드에최소한부트로더가올라간상태라면 minicom

More information

USB USB DV25 DV25 REC SRN-475S REC SRN-475S LAN POWER LAN POWER Quick Network Setup Guide xdsl/cable Modem PC DVR 1~3 1.. DVR DVR IP xdsl Cable xdsl C

USB USB DV25 DV25 REC SRN-475S REC SRN-475S LAN POWER LAN POWER Quick Network Setup Guide xdsl/cable Modem PC DVR 1~3 1.. DVR DVR IP xdsl Cable xdsl C USB USB DV25 DV25 REC SRN-475S REC SRN-475S LAN POWER LAN POWER Quick Network Setup Guide xdsl/cable Modem PC DVR 1~3 1.. DVR DVR IP xdsl Cable xdsl Cable PC PC Step 1~5. Step, PC, DVR Step 1. Cable Step

More information

C 프로그래밍 언어 입문 C 프로그래밍 언어 입문 김명호저 숭실대학교 출판국 머리말..... C, C++, Java, Fortran, Python, Ruby,.. C. C 1972. 40 C.. C. 1999 C99. C99. C. C. C., kmh ssu.ac.kr.. ,. 2013 12 Contents 1장 프로그래밍 시작 1.1 C 10 1.2 12

More information

PWR PWR HDD HDD USB USB Quick Network Setup Guide xdsl/cable Modem PC DVR 1~3 1.. DVR DVR IP xdsl Cable xdsl Cable PC PC DDNS (

PWR PWR HDD HDD USB USB Quick Network Setup Guide xdsl/cable Modem PC DVR 1~3 1.. DVR DVR IP xdsl Cable xdsl Cable PC PC DDNS ( PWR PWR HDD HDD USB USB Quick Network Setup Guide xdsl/cable Modem PC DVR 1~3 1.. DVR DVR IP xdsl Cable xdsl Cable PC PC DDNS (http://ddns.hanwha-security.com) Step 1~5. Step, PC, DVR Step 1. Cable Step

More information

<4D6963726F736F667420576F7264202D2045564552554E20B4DCB8BB20C1A1B0CB20B9D720C1B6C4A120B8C5B4BABEF35F76312E335F2E646F63>

<4D6963726F736F667420576F7264202D2045564552554E20B4DCB8BB20C1A1B0CB20B9D720C1B6C4A120B8C5B4BABEF35F76312E335F2E646F63> EVERUN 단말 점검 및 조치 매뉴얼(v1.3) 2008-09-04 1. 기본 점검사항 1.1 KT WIBRO CM 프로그램 정보 1.2 장치관리자 진입경로 1.2.1 시작/제어판에서 실행 1.2.2 바탕화면에서 실행 1.3 장치 관리자에서 드라이버 확인 1.3.1 WIBRO 드라이버 확인 1.3.2 Protocol 드라이버 확인 1.4 Windows 스마트

More information

Deok9_Exploit Technique

Deok9_Exploit Technique Exploit Technique CodeEngn Co-Administrator!!! and Team Sur3x5F Member Nick : Deok9 E-mail : DDeok9@gmail.com HomePage : http://deok9.sur3x5f.org Twitter :@DDeok9 > 1. Shell Code 2. Security

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 1 Tizen 실습예제 : Remote Key Framework 시스템소프트웨어특론 (2014 년 2 학기 ) Sungkyunkwan University Contents 2 Motivation and Concept Requirements Design Implementation Virtual Input Device Driver 제작 Tizen Service 개발절차

More information

Microsoft Word ARM_ver2_0a.docx

Microsoft Word ARM_ver2_0a.docx [Smart]0703-ARM 프로그램설치 _ver1_0a 목차 1 윈도우기반으로리눅스컴파일하기 (Cygwin, GNU ARM 설치 )... 2 1.1 ARM datasheet 받기... 2 1.2 Cygwin GCC-4.0 4.1 4.2 toolchain 파일받기... 2 1.3 Cygwin 다운로드... 3 1.4 Cygwin Setup... 5 2 Cygwin

More information

Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - chap01-C언어개요.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 프로그래밍의 기본 개념을

More information

작성자 : 기술지원부 김 삼 수

작성자 : 기술지원부 김 삼 수 작성자 : 기술지원부김삼수 qpopper 설치 qpopper란무엇인가? 메일수신을하기위해필요한프로그램으로 qpopper는가장인기있는 email 클라이언트에의해사용되는인터넷 email 다운로딩을위한 POP3프로토콜을사용합니다. 그러나 qpopper는 sendmail이나 smail과같이 SMTP프로토콜은포함하고있지않습니다. (

More information

(SW3704) Gingerbread Source Build & Working Guide

(SW3704) Gingerbread Source Build & Working Guide (Mango-M32F4) Test Guide http://www.mangoboard.com/ http://cafe.naver.com/embeddedcrazyboys Crazy Embedded Laboratory www.mangoboard.com cafe.naver.com/embeddedcrazyboys CRZ Technology 1 Document History

More information

MPLAB C18 C

MPLAB C18 C MPLAB C18 C MPLAB C18 MPLAB C18 C MPLAB C18 C #define START, c:\mcc18 errorlevel{0 1} char isascii(char ch); list[list_optioin,list_option] OK, Cancel , MPLAB IDE User s Guide MPLAB C18 C

More information

10X56_NWG_KOR.indd

10X56_NWG_KOR.indd 디지털 프로젝터 X56 네트워크 가이드 이 제품을 구입해 주셔서 감사합니다. 본 설명서는 네트워크 기능 만을 설명하기 위한 것입니다. 본 제품을 올바르게 사 용하려면 이 취급절명저와 본 제품의 다른 취급절명저를 참조하시기 바랍니다. 중요한 주의사항 이 제품을 사용하기 전에 먼저 이 제품에 대한 모든 설명서를 잘 읽어 보십시오. 읽은 뒤에는 나중에 필요할 때

More information

Microsoft Word - Automap3

Microsoft Word - Automap3 사 용 설 명 서 본 설명서는 뮤직메트로에서 제공합니다. 순 서 소개 -------------------------------------------------------------------------------------------------------------------------------------------- 3 제품 등록 --------------------------------------------------------------------------------------------------------------------------------------

More information