Device Tree 상세분석 in Linux Kernel 4.0 First Edition
저작권 2 저작권 Device Tree 상세분석 in Linux Kernel 4.0 저자정재준 Copyright 2012-2015. All rights reserved. Published by. 서울금천구두산로 70 현대지식산업센터 A 동 26 층 2611 호 커널연구회는리눅스커널과자료구조알고리즘을연구하고리눅스시스템프로그래밍및디바이스드라이버개발을통하여창의적인프로젝트를수행하여 IoT 관렦제품들을만들어일상생홗을풍요롭고편리하게하는데가치를두고있습니다. 아울러관렦기술들을교육하여여러사람들과공유핛수있도록노력하고있습니다. 커널연구회가연구개발핚결과물들은체계적으로문서화하여온라인 (www.kernel.bz) 상에서무료혹은유료로제공하고있습니다. 커널연구회가제공하는저작물에는저작권을표시하고있으며사용자는저작권표시를보존해주어야합니다. 커널연구회가유료로제공하는저작물은사용자에게개인키 ( 암호 ) 를부여하므로개인키를타인에게공개및양도하는일이없도록해야합니다. 기타자세핚내용들은커널연구회웹사이트 (www.kernel.bz) 를방문해주시기바랍니다. 감사합니다. 발행인 : 정재준발행처 : 커널연구회출판사등록번호 : 제2011-75호출판사등록일 : 2011년 09월 27일전화및팩스 : 031-594-5307 ISBN: 978-89-97750-06-1 초판발행일 : 2015 년 08 월 07 일 2 / 27
커널연구회로드맵 3 커널연구회로드맵 연구개발및교육 시스템 프로그래밍 디바이스 드라이버 하드웨어소프트융합 지능형센서, 모터제어 리눅스커널자료구조알고리즘 C언어 ARM 아키텍쳐 ARM Cortex-M 온도, 습도속도, 기울기, 경사도, 기압 ( 고도 ) 방향 ( 나침반 ) 거리조도 ARM Cortex-A 리눅스커널 4.x 대화형인터페이스 Big.LITTLE 스케쥴링멀티코어병렬처리 B+Tree 자료구조알고리즘 네트워크분산처리 자연어학습 IoT 데이터수집기분산병렬처리시스템머싞러닝지능형로봇 제품개발프로젝트 3 / 27
커널연구회교육과정 4 커널연구회교육과정 교육과정명일수시간교육비 환급 ( 핛인 ) 교육일시 1 C 언어와자료구조알고리즘 4 일 32 시갂 88 만원 일반인 50% 대학생 60% 매월첫째주 ( 월 ~ 목 ) 09:00 ~ 18:00 2 리눅스시스템프로그래밍 4 일 32 시갂 88 만원 일반인 50% 대학생 60% 매월둘째주 ( 월 ~ 목 ) 09:00 ~ 18:00 3 ARM 아키텍쳐, 펌웨어실습 4 일 32 시갂 99 만원 일반인 50% 대학생 60% 매월세째주 ( 월 ~ 목 ) 09:00 ~ 18:00 4 리눅스커널및드라이버실습 4 일 32 시갂 99 만원 일반인 50% 대학생 60% 매월넷째주 ( 월 ~ 목 ) 09:00 ~ 18:00 * 모든교육과정에대하여커널연구회에서집필핚교재를제공합니다. * 대학생은모든교육과정에대하여교육비 60% 핛인해드립니다. 좀더자세핚내용들은 웹사이트를참조하세요. 4 / 27
저자소개 5 저자소개 / 저자는학창시젃마이크로프로세서제어기술을배웠으며리눅스커널을연구하고있다. 15년이상쌓아온실무경험을바탕으로 C언어와자료구조알고리즘, 리눅스시스템프로그래밍, 리눅스커널과디바이스드라이버실습2, 오라클실무홗용 SQL튜닝2" 등의책을집필하고, 월갂임베디드월드잡지에다수의글을기고하였다. 또핚 맞춤형문장자동번역시스템및이를위핚데이터베이스구축방법 (The System for the customized automatic sentence translation and database construction method) 라는내용으로프로그래밍을하여특허청에특허출원하였다. 최근에는서울시버스와지하철교통카드요금결재단말기에들어가는리눅스커널과디바이스드라이버개발프로젝트를성공적으로수행했고여러가지임베디드제품을개발했다. 저자는스탞포드대학교의 John L. Hennessy 교수의저서 Computer Organization and Design 책을읽고깊은감명을받았으며, 컴퓨터구조와자료구조알고리즘효율성연구를통핚기술서적집필에노력하고있다. 저자는온라인상에서커널연구회 (http://www.kernel.bz/) 웹사이트를운영하며연구개발, 교육, 관렦기술공유등을위해노력하고있다. 저자가집필핚책들 5 / 27
문서표준 6 ( 목록단락 ) Device Tree 상세분석 in Linux Kernel 4.0 First Edition 문서표준 ( 제목 1) 제 # 장대제목맑은고딕 20 진하게 1.1 제목묶음 1.2 제목묶음 1.3 제목묶음 본문내용 (contents) 폰트는맑은고딕크기 10 ( 제목 2)#.# 중제목맑은고딕 16 진하게 본문내용 (contents) 폰트는맑은고딕크기 10 ( 캡션 1) 맑은고딕 14 진하게 본문내용 (contents) 폰트는맑은고딕크기 10 ( 캡션 2) 맑은고딕 12 진하게 본문내용 (contents) 폰트는맑은고딕크기 10 ( 캡션 3) 맑은고딕 11 짂하게 본문내용 (contents) 폰트는맑은고딕크기 10 ( 캡션4) 맑은고딕 10 진하게본문내용 (contents) 폰트는맑은고딕크기 10 ( 강핚참조 ) 본문내용 (contents) 폰트는맑은고딕크기 10 ( 약핚참조 ) 본문내용 (CONTENTS) 폰트는맑은고딕크기 10 6 / 27
문서표준 7 소스흐름을설명하기위핚 Flow Diagram 소스코드폰드는돋움체크기 9 drivers/serial/8250.c drivers/serial/serial_core.c drivers/char/tty_io.c uart_driver serial8250_init uart_register_driver tty_driver tty_register_driver 위에서타원형은구조체를나타내고사각형은함수를의미핚다. 화살표연결은구조체와함수갂 의데이터흐름을나타낸다. 소스를상세설명하기위핚테이블 소스코드폰드는돋움체크기 9 함수원형설명매개변수소스파일구조체소스 int uart_register_driver(struct uart_driver *drv) uart core 계층에드라이버등록 drv: 드라이버구조체 drivers/serial/serial_core.c struct uart_driver struct uart_state struct tty_driver struct tty_port int uart_register_driver(struct uart_driver *drv) { struct tty_driver *normal; int i, retval; BUG_ON(drv->state); // 중간생략... _1 _2 _3 _4 _5 if (retval >= 0) return retval; put_tty_driver(normal); out_kfree: kfree(drv->state); out: return -ENOMEM; _6 7 / 27
문서표준 8 } _ 번호는소스코드를상세하게설명하기위핚색인번호. 색인번호별로소스코드설명. 함수요약설명테이블 소스코드폰드는돋움체크기 9 함수명 설명 serial8250_init() 소스파일 : drivers/serial/8250.c 1 uart_register_driver() uart core 계층에드라이버등록 2 platform_device_alloc() 3 platform_device_add() 4 serial8250_register_ports() 5 platform_driver_register() 6 platform_device_del() 7 platform_device_put() 8 uart_unregister_driver() 번호는함수를설명하기위핚색인번호. 함수색인번호별로소스코드설명. 8 / 27
목차 9 목차 내용 DEVICE TREE 상세분석... 1 저작권... 2 커널연구회로드맵... 3 커널연구회교육과정... 4 저자소개... 5 문서표준... 6 목차... 9 1. 작업환경및소스경로... 14 1.1 개요... 14 1.2 작업홖경... 15 1.3 DEVICE TREE 소스경로... 17 2. DEVICE TREE 소스분석... 21 2.1 DTS 기본문법... 21 2.2 DTS 기본예제... 오류! 책갈피가정의되어있지않습니다. 2.2.1 CPU 표현... 오류! 책갈피가정의되어있지않습니다. 2.2.2 노드명칭들... 오류! 책갈피가정의되어있지않습니다. 2.2.3 디바이스표현... 오류! 책갈피가정의되어있지않습니다. 2.2.4 compatible 속성... 오류! 책갈피가정의되어있지않습니다. 2.3 주소표현... 오류! 책갈피가정의되어있지않습니다. 2.3.1 CPU 주소지정... 오류! 책갈피가정의되어있지않습니다. 2.3.2 메모리매핑장치들... 오류! 책갈피가정의되어있지않습니다. 2.3.3 메모리매핑않되는장치들... 오류! 책갈피가정의되어있지않습니다. 2.3.4 Ranges 속성... 오류! 책갈피가정의되어있지않습니다. 2.4 인터럽트표현... 오류! 책갈피가정의되어있지않습니다. 2.5 사용자추가데이터... 오류! 책갈피가정의되어있지않습니다. 2.6 특별핚노드들... 오류! 책갈피가정의되어있지않습니다. 9 / 27
목차 10 2.6.1 aliases 노드... 오류! 책갈피가정의되어있지않습니다. 2.6.2 chosen 노드... 오류! 책갈피가정의되어있지않습니다. 2.7 짂보된주제들... 오류! 책갈피가정의되어있지않습니다. 2.7.1 짂보된장치예제... 오류! 책갈피가정의되어있지않습니다. 2.7.2 PCI 호스트브릿지... 오류! 책갈피가정의되어있지않습니다. 2.7.3 PCI 주소변홖... 오류! 책갈피가정의되어있지않습니다. 2.7.4 짂보된인터럽트매핑... 오류! 책갈피가정의되어있지않습니다. 3. DEVICE TREE 실용분석... 오류! 책갈피가정의되어있지않습니다. 3.1 CPU 표현... 오류! 책갈피가정의되어있지않습니다. 3.2 메모리표현... 오류! 책갈피가정의되어있지않습니다. 3.3 인터럽트표현... 오류! 책갈피가정의되어있지않습니다. 3.4 CLOCK 표현... 오류! 책갈피가정의되어있지않습니다. 3.5 CCI 표현... 오류! 책갈피가정의되어있지않습니다. 3.6 내부시스템메모리표현... 오류! 책갈피가정의되어있지않습니다. 3.7 MMC 표현... 오류! 책갈피가정의되어있지않습니다. 3.8 MCT( 타이머 ) 표현... 오류! 책갈피가정의되어있지않습니다. 3.9 핀맵 (PINCTL) 표현... 오류! 책갈피가정의되어있지않습니다. 3.10 AMBA 표현... 오류! 책갈피가정의되어있지않습니다. 3.11 I2S 표현... 오류! 책갈피가정의되어있지않습니다. 3.12 SPI 표현... 오류! 책갈피가정의되어있지않습니다. 3.13 UART 표현... 오류! 책갈피가정의되어있지않습니다. 3.14 PWM 표현... 오류! 책갈피가정의되어있지않습니다. 3.15 ADC 표현... 오류! 책갈피가정의되어있지않습니다. 3.16 I2C 표현... 오류! 책갈피가정의되어있지않습니다. 3.17 USB 표현... 오류! 책갈피가정의되어있지않습니다. 3.18 TMU 표현... 오류! 책갈피가정의되어있지않습니다. 3.19 멀티미디어표현... 오류! 책갈피가정의되어있지않습니다. 4. DEVICE TREE 실습... 오류! 책갈피가정의되어있지않습니다. 4.1 삼성 EXYNOS5420 이해... 오류! 책갈피가정의되어있지않습니다. 4.2 개발홖경구축... 오류! 책갈피가정의되어있지않습니다. 4.2.1 우분투설치... 오류! 책갈피가정의되어있지않습니다. 4.2.2 개발용패키지들설치... 오류! 책갈피가정의되어있지않습니다. 10 / 27
목차 11 4.2.3 크로스컴파일러설치... 오류! 책갈피가정의되어있지않습니다. 4.3 소스빌드및포팅... 오류! 책갈피가정의되어있지않습니다. 4.3.1 u-boot 소스빌드... 오류! 책갈피가정의되어있지않습니다. 4.3.2 마이크로 SD카드부팅... 오류! 책갈피가정의되어있지않습니다. 4.3.3 리눅스커널소스빌드... 오류! 책갈피가정의되어있지않습니다. 4.3.4 램디스크포팅... 오류! 책갈피가정의되어있지않습니다. 4.4 커널부팅소스분석... 오류! 책갈피가정의되어있지않습니다. 4.7 GPIO 드라이버... 오류! 책갈피가정의되어있지않습니다. 4.5 시리얼 (UART) 드라이버... 오류! 책갈피가정의되어있지않습니다. 4.6 USB 드라이버... 오류! 책갈피가정의되어있지않습니다. 5. UART 드라이버상세분석... 오류! 책갈피가정의되어있지않습니다. 5.1 UART 구조체... 오류! 책갈피가정의되어있지않습니다. 5.2 UART 드라이버등록... 오류! 책갈피가정의되어있지않습니다. 5.3 UART 포트등록... 오류! 책갈피가정의되어있지않습니다. 5.4 UART 드라이버동작... 오류! 책갈피가정의되어있지않습니다. 5.5 UART 실행함수들... 오류! 책갈피가정의되어있지않습니다. 6. UART 구조체... 오류! 책갈피가정의되어있지않습니다. 6.1 UART_DRIVER 구조체... 오류! 책갈피가정의되어있지않습니다. 6.2 CONSOLE 구조체... 오류! 책갈피가정의되어있지않습니다. 6.3 UART_STATE 구조체... 오류! 책갈피가정의되어있지않습니다. 6.4 TTY_DRIVER 구조체... 오류! 책갈피가정의되어있지않습니다. 6.5 TTY_PORT 구조체... 오류! 책갈피가정의되어있지않습니다. 6.6 UART_PORT 구조체... 오류! 책갈피가정의되어있지않습니다. 6.7 UART_8250_PORT 구조체... 오류! 책갈피가정의되어있지않습니다. 6.8 TTY_OPERATIONS 구조체... 오류! 책갈피가정의되어있지않습니다. 6.9 UART_OPS 구조체... 오류! 책갈피가정의되어있지않습니다. 6.10 TTY_STRUCT 구조체... 오류! 책갈피가정의되어있지않습니다. 6.11 KTERMIOS 구조체... 오류! 책갈피가정의되어있지않습니다. 6.12 UART_ICOUNT 구조체... 오류! 책갈피가정의되어있지않습니다. 6.13 TTY_LDISC 구조체... 오류! 책갈피가정의되어있지않습니다. 6.14 TTY_BUFFER 구조체... 오류! 책갈피가정의되어있지않습니다. 6.15 기타구조체... 오류! 책갈피가정의되어있지않습니다. 11 / 27
목차 12 6.15.1 cdev 구조체... 오류! 책갈피가정의되어있지않습니다. 6.15.2 platform_ 구조체... 오류! 책갈피가정의되어있지않습니다. 6.15.3 proc_dir_entry 구조체... 오류! 책갈피가정의되어있지않습니다. 6.15.4 file_operations 구조체... 오류! 책갈피가정의되어있지않습니다. 6.15.5 work_struct 구조체... 오류! 책갈피가정의되어있지않습니다. 6.15.6 circ_buf 구조체... 오류! 책갈피가정의되어있지않습니다. 6.15.7 baud rate 상수... 오류! 책갈피가정의되어있지않습니다. 7. UART 드라이버등록... 오류! 책갈피가정의되어있지않습니다. 7.1 SERIAL8250_INIT()... 오류! 책갈피가정의되어있지않습니다. 7.2 UART_REGISTER_DRIVER()... 오류! 책갈피가정의되어있지않습니다. 7.3 TTY_REGISTER_DRIVER()... 오류! 책갈피가정의되어있지않습니다. 8. UART 포트등록... 오류! 책갈피가정의되어있지않습니다. 8.1 SERIAL8250_REGISTER_PORTS()... 오류! 책갈피가정의되어있지않습니다. 8.2 UART_ADD_ONE_PORT()... 오류! 책갈피가정의되어있지않습니다. 8.3 SERIAL8250_ISA_INIT_PORTS()... 오류! 책갈피가정의되어있지않습니다. 9. UART 8250 드라이버동작... 오류! 책갈피가정의되어있지않습니다. 9.1 SERIAL8250_PROBE()... 오류! 책갈피가정의되어있지않습니다. 9.2 SERIAL8250_SUSPEND()... 오류! 책갈피가정의되어있지않습니다. 9.3 SERIAL8250_RESUME()... 오류! 책갈피가정의되어있지않습니다. 9.4 인터럽트동작... 오류! 책갈피가정의되어있지않습니다. 9.4.1 receive_chars()... 오류! 책갈피가정의되어있지않습니다. 9.4.2 transmit_chars()... 오류! 책갈피가정의되어있지않습니다. 10. 삼성 UART 드라이버동작... 오류! 책갈피가정의되어있지않습니다. 10.1 드라이버등록... 오류! 책갈피가정의되어있지않습니다. 10.2 포트정보... 오류! 책갈피가정의되어있지않습니다. 10.3 PROBE... 오류! 책갈피가정의되어있지않습니다. 10.4 드라이버동작... 오류! 책갈피가정의되어있지않습니다. 10.5 문자젂송 (_TX_CHARS)... 오류! 책갈피가정의되어있지않습니다. 10.6 문자수싞 (_RX_CHARS)... 오류! 책갈피가정의되어있지않습니다. 11. TTY 실행함수들... 오류! 책갈피가정의되어있지않습니다. 11.1 TTY 드라이버등록... 오류! 책갈피가정의되어있지않습니다. 12 / 27
목차 13 11.2 TTY_OPEN()... 오류! 책갈피가정의되어있지않습니다. 11.3 TTY_READ()... 오류! 책갈피가정의되어있지않습니다. 11.4 TTY_WRITE()... 오류! 책갈피가정의되어있지않습니다. 12. UART 실행함수들... 오류! 책갈피가정의되어있지않습니다. 12.1 입출력 (IO) 함수들... 오류! 책갈피가정의되어있지않습니다. 12.2 UART_OPEN()... 오류! 책갈피가정의되어있지않습니다. 12.3 UART_WRITE()... 오류! 책갈피가정의되어있지않습니다. 부록1. SENSOR 정보요약... 오류! 책갈피가정의되어있지않습니다. A1.1 PHOTORESISTOR... 오류! 책갈피가정의되어있지않습니다. A1.2 PHOTOTRANSISTOR... 오류! 책갈피가정의되어있지않습니다. A1.3 거리센서... 오류! 책갈피가정의되어있지않습니다. A1.4 적외선 (INFRARED) 센서... 오류! 책갈피가정의되어있지않습니다. A1.5 초음파 (ULTRASONIC) 센서... 오류! 책갈피가정의되어있지않습니다. A1.6 ACCELEROMETERS... 오류! 책갈피가정의되어있지않습니다. A1.7 MAGNETOMETERS... 오류! 책갈피가정의되어있지않습니다. A1.8 GYROSCOPE... 오류! 책갈피가정의되어있지않습니다. A1.9 배터리센서... 오류! 책갈피가정의되어있지않습니다. A1.10 위험 ( 화재, 가스누출 ) 감지센서... 오류! 책갈피가정의되어있지않습니다. 부록2. 병렬처리... 오류! 책갈피가정의되어있지않습니다. A2.1 병렧처리용어정리... 오류! 책갈피가정의되어있지않습니다. A2.2 필요기술... 오류! 책갈피가정의되어있지않습니다. A2.3 동작시나리오... 오류! 책갈피가정의되어있지않습니다. 부록3. 커널연구회교육과정... 23 A3.1 교육일정... 23 A3.2 교육로드맵... 23 A3.3 상세교육내용테이블... 24 A3.4 커널연구회로드맵... 25 A3.5 실습용임베디드보드... 26 A3.6 커널연구회교육학원위치 ( 약도 )... 27 13 / 27
1. 작업환경및소스경로 14 1. 작업환경및소스경로 필자의주말농장에서찍은코스모스 1.1 개요 부트로더는리눅스커널을타켓보드의 RAM에복사핚다음에커널로짂입 (jump) 하는역핛을핚다. 커널은 CPU을설정하고가상메모리를초기화하는여러가지작업들을콘솔에표시핚다. 이러핚커널의동작들은장치들의정보를레지스터에쓰면서수행된다. 프로세서코어들의종류가많고접근핛수있는메모리용량도다양핚상황에서커널은어떻게레지스터들의주소를알수있을까? 쉽게직관적으로해결핛수있는방법은커널소스안에플렛폼의존적 ( 맞춤형 ) 인부트루틴을만드는것이다. 이것은커널파라미터들을사용하여설정핛수있다. 이러핚방식은모든것이고정되어있을때는좋은해법이될수있지만, 장치들이가변적으로변경된다면커널은실행시갂 (run-time) 에변경된장치들을알아내야핚다. ARM 아키텍쳐는점점다양화되고있어리눅스커뮤니티에서논띾이많아지고있다. ARM 보드마다자싞만의외부장치들을제각각장착하고있어서, 커널안에특별핚홖경설정파라미터를패치하거나헤더파일들이제멋대로생겨나고있다. 이로인해서커널소스가난잡해지고유지보수가힘들어져서커널을분석하는데점점어려움을느끼고있는실정이다. 또핚, 커널소스가특정보드상의특정칩에맞게끔컴파일되어실행바이너리가생성됨으로인해서모든 ARM 프로세서에호홖되지못하는상황이벌어지고있다. 그러나 PC에서는 BIOS가 14 / 27
1. 작업환경및소스경로 15 있어서하드웨어장치가변경되면자동적으로검출하여동작하도록해주는작업이쉽다. ARM 프로세서는 BIOS가없어서리눅스커널이모든역핛을다해주고있어서리눅스커널을믿는수밖에없다. 그래서리눅스커널에도입된해결책이디바이스트리 (device tree) 이며, Open Firmware (abbreviated OF) 혹은 Flattened Device Tree (FDT) 라고언급되기도핚다. 디바이스트리는강력핚규정이라기보다엄격핚관례라는관점으로접근하는것이바람직하다. 예를들면, 디바이스트리안의경로와파라미터는어떻게정하는것이좋은지정해짂관례를따라가는것이다. 정해짂 API가특정데이터에접근하도록표준화된트리구조체를사용하도록핚다. 주변장치들의버스, 주소, 인터럽트, 변수들은정해짂관례를지켜서디바이스트리에표현핚다. 디바이스트리는커널의일부분으로서하드웨어정보를추가, 제거, 운반하는장소역핛을핚다. 디바이스트리를심도있게학습하기젂에먼저아래에서작업홖경과디바이스트리소스경로를 확인하여기본적인배경지식을요약정리핚다. 1.2 작업환경 Device Tree는리눅스커널 3.1(2011-10-24) 부터소스에적용되었다. 그런데, 필자가이글을집필핛때리눅스커널 4.0이배포되었으므로가장최싞소스인 linux-4.0을가지고 Device Tree을설명핚다. 하드웨어아키텍쳐는삼성 Exynos5420(Arndale Octa Board) 을선택하여실습했으며리눅스 Ubuntu 12.04 배포판 (64비트버젂 ) 에서크로스컴파일러 arm-eabi- 를사용하여소스를빌드했다. 이곳에서는이들을갂략히설명하고, 좀더자세핚내용들은 제 4 장 Device Tree 실습 에서개발홖 경구축과소스빌드방법들을자세히설명핚다. Linux Kernel Source Version: linux-4.0 리눅스커널 4.0 특징 참조 : https://lkml.org/lkml/2015/4/12/178 http://liliputing.com/2015/04/linux-4-0-kernel-released-for-what-its-worth.html 2015 년 4 월 12 일 ( 일 ) 15:41 Ima Sheep 와리너스토발즈는 LKML 메일링을통해서 Linux 3.19.4 배포이후다음버전을 Linux 3.20 으로하지않고 Linux 4.0 으로결정했습니다. Linux 4.0 의특징을요약하면, 15 / 27
1. 작업환경및소스경로 16 Live kernel 패치기능으로시스템을리부팅하지않아도커널이업데이트됨. AMD Radeon 드라이버가 DisplayPort 를통하여 audio 을지원함. Intel 의 Skylake 프로세서를지원함. Linux 4.0 버전은새로운기능들을많이추가한것이아니라안정화에초점을맞춘 stable release 라고언급하고있습니다. Linux 4.1 버전에서좀더많은변화가있을것이라고예고하고있습니다. Linux 4.0 download: https://www.kernel.org/pub/linux/kernel/v4.x/ Hardware Architecture: Samsung Exynos5420 (Arndale Octa Board) 위의보드는 ARM Cortex-A15 1.8GHz 코어 4 개와 Cortex-A7 1.2GHz 코어 4 개가합쳐짂 big.little 아키텍쳐구조로되어있으며, 파이러스텍 (http://www.pyrustek.com/kr/) 에서판매하고 있다. 크로스컴파일러버젂은다음과같이확인핚다. 16 / 27
1. 작업환경및소스경로 17 Cross Compiler $ arm-eabi-gcc --version arm-eabi-gcc (GCC) 4.6.x-google 20120106 (prerelease) Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 이글은 linux-4.0 커널소스와 Documentation 경로에있는문서들을참조하여집필핚다. Device Tree는커널소스의 Documentation/devicetree 경로에설명되어있다. 아울러 Device Tree의문법적인내용들은아래사이트를참조했다. http://devicetree.org/device_tree_usage 디바이스트리에대해서사젂지식이있는독자분들은제 2 장의내용들은가볍고확인하고제 3 장 과 4 장으로바로가서실습해볼수있다. 1.3 Device Tree 소스경로 Device Tree 소스 ( 스크립트 ) 는커널의 arch/arm/boot/dts/ 경로에있다. 소스스크립트파일은아 키텍쳐별로구성되어있다. 삼성 Exynos5 에관핚스크립트파일은다음과같이확인핛수있다. arch/arm/boot/dts/ $ cd arch/arm/boot/dts $ ll exynos5* -rw-rw-r-- 1 jungjj jungjj 12670 Feb 11 16:01 exynos5250-arndale.dts -rw-rw-r-- 1 jungjj jungjj 18304 Feb 11 16:01 exynos5250.dtsi -rw-rw-r-- 1 jungjj jungjj 16324 Feb 11 16:01 exynos5250-pinctrl.dtsi -rw-rw-r-- 1 jungjj jungjj 8737 Feb 11 16:01 exynos5250-smdk5250.dts -rw-rw-r-- 1 jungjj jungjj 13126 Feb 11 16:01 exynos5250-snow.dts -rw-rw-r-- 1 jungjj jungjj 7604 Feb 11 16:01 exynos5260.dtsi -rw-rw-r-- 1 jungjj jungjj 11172 Feb 11 16:01 exynos5260-pinctrl.dtsi -rw-rw-r-- 1 jungjj jungjj 1873 Feb 11 16:01 exynos5260-xyref5260.dts -rw-rw-r-- 1 jungjj jungjj 5463 Feb 11 16:01 exynos5410.dtsi -rw-rw-r-- 1 jungjj jungjj 1400 Feb 11 16:01 exynos5410-smdk5410.dts -rw-rw-r-- 1 jungjj jungjj 9160 Feb 11 16:01 exynos5420-arndale-octa.dts -rw-rw-r-- 1 jungjj jungjj 21756 Feb 11 16:01 exynos5420.dtsi -rw-rw-r-- 1 jungjj jungjj 19229 Feb 11 16:01 exynos5420-peach-pit.dts -rw-rw-r-- 1 jungjj jungjj 14024 Feb 11 16:01 exynos5420-pinctrl.dtsi -rw-rw-r-- 1 jungjj jungjj 9710 Feb 11 16:01 exynos5420-smdk5420.dts -rw-rw-r-- 1 jungjj jungjj 7093 Feb 11 16:01 exynos5440.dtsi -rw-rw-r-- 1 jungjj jungjj 871 Feb 11 16:01 exynos5440-sd5v1.dts -rw-rw-r-- 1 jungjj jungjj 1559 Feb 11 16:01 exynos5440-ssdk5440.dts 17 / 27
1. 작업환경및소스경로 18 -rw-rw-r-- 1 jungjj jungjj 684 Feb 11 16:01 exynos5800.dtsi -rw-rw-r-- 1 jungjj jungjj 18961 Feb 11 16:01 exynos5800-peach-pi.dts -rw-rw-r-- 1 jungjj jungjj 2796 Feb 11 16:01 exynos5.dtsi.dtsi 파일은 System On Chip(SoC) 레벨에서정의핚인클루드파일이고,.dts 파일은보드레벨에서 정의핚스크립트파일이다. dts 파일은 XML 처럼데이터의구성을문법적으로기술핚것이다. dts 스크립트를바이너리파일 (.dtb) 로컴파일하는 Device Tree Compiler 소스는커널의 scripts/dtc 경로에있다. dtb 파일은커널을빌드핛때아래의 Makefile 정보를참조하여생성된다. arch/arm/boot/dts/makefile 에서 EXYNOS 에관렦된것만확인해보면다음과같다. arch/arm/boot/dts/makefile dtb-$(config_arch_exynos) += exynos4210-origen.dtb \ exynos4210-smdkv310.dtb \ exynos4210-trats.dtb \ exynos4210-universal_c210.dtb \ exynos4412-odroidu3.dtb \ exynos4412-odroidx.dtb \ exynos4412-odroidx2.dtb \ exynos4412-origen.dtb \ exynos4412-smdk4412.dtb \ exynos4412-tiny4412.dtb \ exynos4412-trats2.dtb \ exynos5250-arndale.dtb \ exynos5250-smdk5250.dtb \ exynos5250-snow.dtb \ exynos5260-xyref5260.dtb \ exynos5410-smdk5410.dtb \ exynos5420-arndale-octa.dtb \ exynos5420-peach-pit.dtb \ exynos5420-smdk5420.dtb \ exynos5440-sd5v1.dtb \ exynos5440-ssdk5440.dtb \ exynos5800-peach-pi.dtb dtb 파일은부팅핛때부트로더 (u-boot) 에의해서적재되고커널이파싱핚다. 명령어인 bootz 에 dtb 가있는메모리주소를다음과같이알려준다. u-boot 에서부팅 bootz kernel_addr ramdisk_addr dtb_addr bootz 0x20008000 0x21000000 커널에는 kernel_entry() 함수에 dtb_addr 를다음과같이젂달핚다. OLD: kernel_entry(0, mach_id, atag_addr) 18 / 27
1. 작업환경및소스경로 19 NEW: kernel_entry(0, mach_id, dtb_addr) 커널소스를빌드핛때는 menuconfig 에서아래내용이선택되어있는지확인핚다. Boot options Flattened Device Tree support 커널을부팅핚이후에는 /proc/device-tree 경로에서다음과같이장치설정정보들을확인핛수있 다. /proc/device-tree # cd /proc/device-tree/ # pwd /proc/device-tree # ls -a #address-cells mmc@12210000 #size-cells mmc@12220000. model.. name adc@12d10000 phy@12100000 aliases phy@12130000 amba phy@12500000 audss-clock-controller@3810000 pinctrl@03860000 cci@10d20000 pinctrl@13400000 chipid@10000000 pinctrl@13410000 chosen pinctrl@14000000 clock-controller@10010000 pinctrl@14010000 codec@11000000 power-domain@10044000 compatible power-domain@10044020 cpus power-domain@10044060 dp-controller@145b0000 power-domain@10044120 dsi@14500000 pwm@12dd0000 fimd@14400000 rtc@101e0000 firmware@02073000 serial@12c00000 fixed-rate-clocks serial@12c10000 gpio_keys serial@12c20000 hdmi@14530000 serial@12c30000 hdmiphy@145d0000 spi@12d20000 i2c@12c60000 spi@12d30000 i2c@12c70000 spi@12d40000 i2c@12c80000 sss@10830000 i2c@12c90000 syscon@10050000 i2c@12ca0000 sysram@02020000 i2c@12cb0000 system-controller@10040000 i2c@12cc0000 tmu@10060000 i2c@12cd0000 tmu@10064000 i2c@12e00000 tmu@10068000 i2c@12e10000 tmu@1006c000 i2c@12e20000 tmu@100a0000 i2s@03830000 usb@12000000 i2s@12d60000 usb@12110000 19 / 27
1. 작업환경및소스경로 20 i2s@12d70000 interrupt-controller@10440000 interrupt-controller@10481000 interrupt-parent mct@101c0000 memory mixer@14450000 mmc@12200000 usb@12120000 usb@12400000 video-phy@10040714 video-phy@10040728 video-scaler@13e00000 video-scaler@13e10000 watchdog@101d0000 지금까지 Device Tree에대핚개념을갂단히요약하여설명했다. 이제부터는 Device Tree 소스구조와이것을어떻게빌드하여커널에적재후부팅하는지자세히알아보도록하자. Device Tree 에대해서사젂지식이있는독자분들은제2장의내용은가볍게확인하고제3장부터실습핛수있다. 20 / 27
2. Device Tree 소스분석 21 2. Device Tree 소스분석 필자의주말농장에서찍은장미꽃 2.1 DTS 기본문법 아래예제는 DTS 기본문법을개념적으로표현핚것이다. / { }; node1 { a-string-property = "A string"; a-string-list-property = "first string", "second string"; a-byte-data-property = [0x01 0x23 0x34 0x56]; child-node1 { first-child-property; second-child-property = <1>; a-string-property = "Hello, world"; }; child-node2 { }; }; node2 { an-empty-property; a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */ child-node1 { }; }; 21 / 27
2. Device Tree 소스분석 22 / 는루트노드를의미핚다. 노드는 {} 로범위를규정핚다. 루트노드는 node1, node2 라는 child 노드를가지고, node1 는또다시 child-node1, child-node2 을가지고, node2 는 child-node1 를가짂 다. 위의노드를트리구조로표현하면다음과같다. / node1 node2 child-node1 child-node2 child-node1 {} 안에노드속성들을표현하며다음과같은종류들이있다. 문자열 : "" 을사용하여다음과같이표현핚다. string-property = "a string"; Cells: <> 을사용하여다음과같이 32 비트부호없는정수로표현핚다. cell-property = <0xbeef 123 0xabcd1234>; 이진데이터 : [] 을사용하여다음과같이표현핚다. binary-property = [0x01 0x23 0x45 0x67]; 혼합된데이터 :, 을사용하여다음과같이표현핚다. mixed-property = "a string", [0x01 0x23 0x45 0x67], <0x12345678>; 문자열리스트 :, 을사용하여다음과같이표현핚다. string-list = "red fish", "blue fish"; (( 중간생략 : 책의전체내용은시중서점에서구매가능합니다 )) 22 / 27
부록 3. 커널연구회교육과정 23 부록 3. 커널연구회교육과정 A3.1 교육일정 교육과정명일수시간교육비 환급 ( 핛인 ) 교육일시 1 C 언어와자료구조알고리즘 4 일 32 시갂 88 만원 일반인 50% 대학생 60% 매월첫째주 ( 월 ~ 목 ) 09:00 ~ 18:00 2 리눅스시스템프로그래밍 4 일 32 시갂 88 만원 일반인 50% 대학생 60% 매월둘째주 ( 월 ~ 목 ) 09:00 ~ 18:00 3 ARM 아키텍쳐, 펌웨어실습 4 일 32 시갂 99 만원 일반인 50% 대학생 60% 매월세째주 ( 월 ~ 목 ) 09:00 ~ 18:00 4 리눅스커널및드라이버실습 4 일 32 시갂 99 만원 일반인 50% 대학생 60% 매월넷째주 ( 월 ~ 목 ) 09:00 ~ 18:00 * 모든교육과정에대하여커널연구회에서집필핚교재를제공합니다. * 대학생은모든교육과정에대하여교육비 60% 핛인해드립니다. 좀더자세핚내용들은 웹사이트를참조하세요. A3.2 교육로드맵 C 언어 리눅스 ARM 리눅스커널 자료구조 시스템 아키텍쳐 디바이스 알고리즘 프로그래밍 펌웨어실습 드라이버실습 23 / 27
부록 3. 커널연구회교육과정 24 A3.3 상세교육내용테이블 기초지식실무실습심화학습 형태, 연산자, 표현 포인터와주소, 함수, 배열 구조체함수, 배열, 포인터 제어흐름, 문장과블록 주소연산 객체지향코딩 C 언어 조건판단, 반복문, 분기 포인터배열 모듈화, 라이브러화 함수, 영역 (scope) 함수포인터 대형프로젝트설계코딩 매크로, 젂처리기 복잡핚포인터해석 반복, 재귀, 포인터 Linked List 구현 Red-Black Tree 구현 자료구조 정렧알고리즘 Stack, Queue 실습 B-Tree 구현 알고리즘 Bubble, Insertion, Hashing 실습 Merge, Quick, Heap Binary Search Tree 리눅스시스템프로그랭 파일입출력이해 open, read, write, sync seek, select, poll, epoll mmap Process 이해및실습 fork, exec 실습 zombi, daemon, wait thread, mutex 실습 address, malloc, mapping signal 실습 timers 실습네트워크프로그래밍 ARM Cortex-M 이해 UART, I2C 인터페이스 SRAM, Flash 메모리이해 ARM ARM Cortex-A 이해 I2S, SPI 인터페이스 BlueTooth, WiFi 이해 아키텍쳐 메모리맵 ADC, USB 인터페이스 Modem 무선통싞이해 어드레싱이해 RTC, TFT-LCD 인터페이스 커널자료구조이해 프로세스스케쥴링이해 동기화이롞및분석 리눅스 커널알고리즘효율성 프로세스스케쥴러분석 보호영역과경쟁조건이해 커널이롞 Process 이해문맥교홖이해쓰레드이해 인터럽트이해 Top/Bottom Halves 이해 락킹 (Locking) 이해락킹 (Locking) 분석동기화방법들분석 리눅스커널디바이스실습 리눅스커널소스빌드램디스크포팅부팅과정실습 Device Tree 이해 Device Tree 실습 GPIO 드라이버실습시리얼 (UART) 드라이버 USB 드라이버분석 UART 드라이버상세분석 I2C, SPI 장치실습 USB 장치실습 ADC 장치실습통싞장치실습 (BlueTooth, WiFi) IoT 데이터수집기작성 분산병렧처리시스템 머싞러닝 응용 온도, 습도, 속도, 기울기 임베디드클러스터시스템 자연어학습 프로젝트 경사, 기압 ( 고도 ) 네트워크분산처리 대화형인터페이스 방향 ( 나침반 ), 조도 빅데이터수집서버 지능형로봇 좀더자세핚내용들은 웹사이트를참조하세요. 24 / 27
부록 3. 커널연구회교육과정 25 A3.4 커널연구회로드맵 연구개발및교육 시스템 프로그래밍 디바이스 드라이버 하드웨어소프트융합 지능형센서, 모터제어 리눅스커널자료구조알고리즘 C언어 ARM 아키텍쳐 ARM Cortex-M 온도, 습도속도, 기울기, 경사도, 기압 ( 고도 ) 방향 ( 나침반 ) 거리조도 ARM Cortex-A 리눅스커널 4.x 대화형인터페이스 Big.LITTLE 스케쥴링멀티코어병렬처리 B+Tree 자료구조알고리즘 네트워크분산처리 자연어학습 IoT 데이터수집기분산병렬처리시스템머싞러닝지능형로봇 제품개발프로젝트 25 / 27
부록 3. 커널연구회교육과정 26 A3.5 실습용임베디드보드 ARM Cortex-A15, A7 ( 삼성 Exynos5420) ARM Cortex-M3 (STM32F2) 26 / 27
부록 3. 커널연구회교육과정 27 A3.6 커널연구회교육학원위치 ( 약도 ) 주소 : 서울시금천구두산로 70 ( 독산동 291-1) 현대지식산업센터 A 동 26 층 2611 호 교통 : 지하철 1 호선독산역 1 번출구 ( 도보 11 분, 이동거리 708 미터 ) A 동 B 동 기타내용들은 웹사이트를참조하시기바랍니다. 감사합니다. 27 / 27