내 손 안의 강의실, <그림 2> 의 시스템 구성도 <그림 3> VGA 출력 회로도 러 장의 보드를 사용해 부피가 커지는 것을 피해야 했다. 결론은 <화 <그림 4> TFT LCD 신호 인터넷 공유기 면 4>와 같이 터치 스크린 기능을 지원하는 TFT LCD와, 메인-



Similar documents
PowerPoint 프레젠테이션

슬라이드 1

10.

K&R2 Reference Manual 번역본

Microsoft PowerPoint - lab14.pptx

PowerPoint 프레젠테이션

untitled

PowerPoint 프레젠테이션

제1장 Unix란 무엇인가?

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

제12장 파일 입출력

6주차.key

PowerPoint 프레젠테이션

chap7.key

[8051] 강의자료.PDF

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

2009년 상반기 사업계획

<4D F736F F F696E74202D FB8DEB8F0B8AE20B8C5C7CE205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - chap12 [호환 모드]

Microsoft PowerPoint - lab15.pptx

교육실습 소감문

ActFax 4.31 Local Privilege Escalation Exploit

Microsoft PowerPoint - IOControl [호환 모드]

교육지원 IT시스템 선진화

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

PowerPoint 프레젠테이션

슬라이드 제목 없음

로봇SW교육원 강의자료

Microsoft PowerPoint - 알고리즘_4주차_1차시.pptx

강의10


Chapter #01 Subject


Microsoft PowerPoint - chap2

제1장 Unix란 무엇인가?

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

<B5B6BCADC7C1B7CEB1D7B7A52DC0DBBEF7C1DF E687770>

Microsoft PowerPoint APUE(File InO)

PowerPoint 프레젠테이션

11장 포인터

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

BMP 파일 처리

Microsoft Word - Network Programming_NewVersion_01_.docx

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft PowerPoint APUE(File InO).ppt

3232 편집본(5.15).hwp

<B0ADC8ADC7D0C6C428C3D6C1BE292E687770>

로봇SW교육원 강의자료

Microsoft Word doc

歯superimp.PDF

PowerPoint 프레젠테이션

교육지원 IT시스템 선진화

1장. 유닉스 시스템 프로그래밍 개요

0429bodo.hwp

時 習 說 ) 5), 원호설( 元 昊 說 ) 6) 등이 있다. 7) 이 가운데 임제설에 동의하는바, 상세한 논의는 황패강의 논의로 미루나 그의 논의에 논거로서 빠져 있는 부분을 보강하여 임제설에 대한 변증( 辨 證 )을 덧붙이고자 한다. 우선, 다음의 인용문을 보도록

伐)이라고 하였는데, 라자(羅字)는 나자(那字)로 쓰기도 하고 야자(耶字)로 쓰기도 한다. 또 서벌(徐伐)이라고도 한다. 세속에서 경자(京字)를 새겨 서벌(徐伐)이라고 한다. 이 때문에 또 사라(斯羅)라고 하기도 하고, 또 사로(斯盧)라고 하기도 한다. 재위 기간은 6

최우석.hwp

E1-정답및풀이(1~24)ok

교사용지도서_쓰기.hwp

< BDC3BAB8C1A4B1D4C6C75BC8A3BFDC D2E687770>

cls46-06(심우영).hwp

<C1B6BCB1B4EBBCBCBDC3B1E2342DC3D6C1BE2E687770>


untitled

민주장정-노동운동(분권).indd

<C0CEBCE2BABB2D33C2F7BCF6C1A420B1B9BFAAC3D1BCAD203130B1C72E687770>

과 위 가 오는 경우에는 앞말 받침을 대표음으로 바꾼 [다가페]와 [흐귀 에]가 올바른 발음이 [안자서], [할튼], [업쓰므로], [절믐] 풀이 자음으로 끝나는 말인 앉- 과 핥-, 없-, 젊- 에 각각 모음으로 시작하는 형식형태소인 -아서, -은, -으므로, -음

6±Ç¸ñÂ÷

<C3D6C1BE5FBBF5B1B9BEEEBBFDC8B0B0DCBFEFC8A C3D6C1BEBABB292E687770>

초등국어에서 관용표현 지도 방안 연구

177

제주어 교육자료(중등)-작업.hwp

¸é¸ñ¼Ò½ÄÁö 63È£_³»Áö ÃÖÁ¾

01Report_210-4.hwp

<C3D1BCB15FC0CCC8C45FBFECB8AE5FB1B3C0B0C0C75FB9E6C7E D352D32315FC5E4292E687770>



교육 과 학기 술부 고 시 제 호 초 중등교육법 제23조 제2항에 의거하여 초 중등학교 교육과정을 다음과 같이 고시합니다. 2011년 8월 9일 교육과학기술부장관 1. 초 중등학교 교육과정 총론은 별책 1 과 같습니다. 2. 초등학교 교육과정은 별책

시험지 출제 양식

우리나라의 전통문화에는 무엇이 있는지 알아봅시다. 우리나라의 전통문화를 체험합시다. 우리나라의 전통문화를 소중히 여기는 마음을 가집시다. 5. 우리 옷 한복의 특징 자료 3 참고 남자와 여자가 입는 한복의 종류 가 달랐다는 것을 알려 준다. 85쪽 문제 8, 9 자료

상품 전단지

::: 해당사항이 없을 경우 무 표시하시기 바랍니다. 검토항목 검 토 여 부 ( 표시) 시 민 : 유 ( ) 무 시 민 참 여 고 려 사 항 이 해 당 사 자 : 유 ( ) 무 전 문 가 : 유 ( ) 무 옴 브 즈 만 : 유 ( ) 무 법 령 규 정 : 교통 환경 재

2

DBPIA-NURIMEDIA

화이련(華以戀) hwp

ÆòÈ�´©¸® 94È£ ³»Áö_ÃÖÁ¾

歯1##01.PDF

<5BC1F8C7E0C1DF2D31B1C75D2DBCF6C1A4BABB2E687770>

120229(00)(1~3).indd

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

untitled

hd1300_k_v1r2_Final_.PDF

<BFBEBEC6C0CCB5E9C0C720B3EEC0CC2E20B3EBB7A120C0CCBEDFB1E220C7D0B1B3202D20C0DAB7E1322E687770>

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Embeddedsystem(8).PDF


歯9장.PDF

KEY 디바이스 드라이버

Transcription:

내 손 안의 강의실, 연 + 재 + 가 + 이 + 드 운영체제 윈도우, 리눅스 개발도구 GCC, 비주얼 C++ 6.0, 윈도우 DDK, Soft ice 기초지식 C/C++, 임베디드 리눅스 응용분야 강의 생성, 재생, 배포 김광학, 강경문, 이상민, 김기석 bykgh@paran.com 부산 동의대학교 전자통신컴퓨터 공학부에서 전자공학을 전공하 고 있다. 흔히 임베디드 리눅스의 세계를 태산을 삽질해서 없애 는것 과 같다고 하는데, 아직 작은 언덕 하나도 옮기지 못한 것 같 아 아쉽기만 한 풋내기 개발자다. 현재 삼성소프트웨어멤버십에 서 태산을 옮기기 위해 노력중이다. 드, 컨피그레이션 모드로 구성돼 있다. 프리젠테이션 모드를 선택하 면 발표용 파일과 음성이 재생되고, 하단 버튼 가운데 녹음 버튼을 눌 러 강의를 생성할 수 있다. <화면 3>은 을 이용해 작성한 강의 파일을 실행 한 화면이다. LCD에 나타나는 내용은 빔 프로젝터를 통해 화면에 뿌 릴 수도 있는데, 이때는 TFT LCD에 입력되는 디지털 신호를 <그림 1> 전체 시스템 PC 빔 프로젝터 마소와 삼성SW맴버십이 함께 하는 개발자 육성 프로젝트 내 손 안의 강의실, D/A(Digital to Analog) 칩을 사용해 VGA 신호로 변환한 후 빔 프 로젝터에 전송하는 방식이다. 정지 버튼을 누르면 만들고 있던 강의 파일의 생성이 중단된다. 한번 생성된 강의 파일은 PC에 옮겨 EZP 뷰어로 재생할 수 있으며, 나레이션 모드를 이용하면 임베디드 시스 템에서 직접 재생해 발표자 없이도 프리젠테이션을 할 수 있다. 하드웨어 뜯어보기 임베디드 리눅스를 이용해 시스템을 개발하기 위 해서는 우선 적당한 시스템을 마련해야 한다. 임베디드 장비는 네이 티브(native) 컴파일을 할 수 없으므로, 개발 호스트를 구축해 호스트 리모트 컨트롤러 스크린 <화면 1> 매니저 프로그램 에서 컴파일한 후 임베디드 장비에 다운로드해야 한다. 이런 컴파일 을 크로스 컴파일 이라고 하는데, 임베디드 시스템을 개발하는 데는 시작은 아주 사소한 아이디어였다. 필자의 학교에는 수업 진도 빠르기로 유명한 교수님이 계시 는데 그 속도가 얼마나 빠른지 잠시 딴 생각을 하거나 전날 밤 무리를 해 잠시 졸기라도 하면 필수적이다. 구체적으로 필요한 사항을 나열하면 다음과 같다. 크로스 개발환경 구축 진도는 어느덧 수십 페이지가 넘어가 있곤 했다. 이런 심각한(?) 상황들을 만회해 보고자 MP3 플레 시리얼 에뮬레이터 minicom 같은 내용을 여러번 반복해야 하는 발표자들에게 있어 그 프리젠테이션은 단순 작업이 될 가능성이 크다. 오히려 이어로 수업을 녹음했지만 목소리만으로는 잘 이해가 되지 않았다. 그렇다면 다른 방법이 없을까. 만약 교수님이 사용하시는 노트북 대신 프리젠테이션 전용 임베디드 시스템이 있어서 교수님의 강 의 내용을 그대로 녹음해 언제든 필기 자료와 함께 볼 수 있다면 어떨까. 쇠뿔도 단김에 빼라 고 실제 구현할 수 있는지 검토 작업에 들어 갔다. 그러나 찾은 자료들은 대 Bootp tftp 서버 nfs 서버 커널소스 <화면 2> 에 탑재된 타겟 애플리케이션 강의 연구에 더 시간을 할애할 수 있는 부분 어마어마한 시스템이었다. 절대 개인적으로는 직접 만들어 볼 수 있는 것이 아니었다. 이제 남 램디스크 이미지 제작 방법을 찾는 것이 좋을 것이다. 청취자 은 방안은 직접 만드는 것뿐! 하지만 어디서부터 어떻게 시작해야 할까. 돌이켜 보면 참 우여곡절도 vi 에디터 입장에서는 순식간에 지나가는 많았지만 결국 실력있는 친구들의 도움을 받으며 (Easy Presentation) 이라는 삼바환경 프리젠테이션 자료와 강좌가 야속하기만 프로젝트가 시작됐다. 이 강좌는 을 완성하기까지 수많은 불면의 밤을 보냈던 흔 하다. 필기하랴 강의에 집중하랴, MP3 적을 정리한 것이다. 보통 임베디드 시스템은 다음 세 가지 형태로 구축된다. 플레이어를 이용해 보기도 하지만 역시 음성만으로는 부족하다. 누구나 한번쯤 겪어 봤음직한 이런 어려움의 대안으로 시작된 것이 바로 이지 의 전체 구조 의 전체 시스템은 <그림 1>과 같다. PC에서 파워포인트를 이용해 강의 내용이 담 긴 프리젠테이션 파일을 만들고, <화면 1>과 같은 매니저 프로그램을 이용해 EZP 파일로 변환한 후 리눅스 개발 호스트 - 시리얼만 사용 리눅스 개발 호스트 - 이더넷 랜 네트워크 구축 리눅스 개발 호스트 - 윈도우 작업 환경 - 이더넷 랜 네트워크 구축 <화면 3> 으로 강의 파일을 실행시킨 화면 프로젠테이션 이다. 임베디드 시스템에 다운로드한다. 다운로드가 완료되면 시스템은 PC와 연결하 지 않고도 독립적으로 작동한다. 사용자는 TFT LCD에 표시된 아이콘을 클릭해 강의 파일을 만들 이 가운데 많은 사람들이 추천하는 방식이 바로 세 번째다. 아직 윈 이 + 달 + 의 + 디 + 스 + 켓 easypt.zip www.imaso.co.kr 거나 재생해 반복 학습할 수 있다. 강의실에서 파워포인트 파일을 보면서 녹음을 하면 언제 어디서 든 같은 강의를 듣고 볼 수 있게 되는 것이다. 실제 사용자가 조작하는 애플리케이션 화면은 <화면 2>와 같이 프리젠테이션 모드, 나레이션 모 도우 환경의 편집기와 환경이 손에 더 익숙하기 때문이다. 이지 프리 젠테이션 역시 세 번째 방식으로 구현했다. 그러나 리눅스가 더 익숙 한 사람이라면 두 번째 방식으로 도전해 보는 것도 좋다. 244 2 0 0 5. 3 마 이 크 로 소 프 트 웨 어 245

내 손 안의 강의실, <그림 2> 의 시스템 구성도 <그림 3> VGA 출력 회로도 러 장의 보드를 사용해 부피가 커지는 것을 피해야 했다. 결론은 <화 <그림 4> TFT LCD 신호 인터넷 공유기 면 4>와 같이 터치 스크린 기능을 지원하는 TFT LCD와, 메인-서브 보드를 결합한 한 장의 보드로 하드웨어를 만들었다. TFTP NFS 한편 이번 프로젝트는 직접 프리젠테이션을 지원해야 했기 때문에 이를 위해 VGA(Video Graphics Adapter) 출력이 필수적이었다. 삼바 VGA 신호는 TFT LCD 신호를 D/A 컨버터인 TDA8771A를 통해서 JTAG 케이블 얻을 수 있는데, 이를 구현한 회로도는 <그림 3>과 같다. RS-232C MNICOM ZMODEM 작업 PC(윈도우) 개발 호스트(리눅스) D/A 변환은 VDEN 신호에 동기돼 비디오 신호가 있을 때만 신호 를 출력해야 한다. 그러나 TDA8771A에는 chip enable pin이 별도로 없어 신호가 없는 구간에도 임의의 값을 출력한다. 문제는 이 때문에 화면의 좌우 경계 값이 늘어져서 보인다는 것인데, 이런 부작용을 막 기 위해 4hc245 3 state buffer를 이용, VDEN 신호가 low일 때는 버 퍼 출력도 low 상태가 돼 출력 신호를 건너뛰도록 했다. 이러한 과정은 <그림 4>의 TFT LCD 신호를 통해 확인할 수 있다. VSYNC 신호는 프레임 클럭(clock)으로 한 클럭에 한 화면을 나타낸 다. 예를 들어 이 신호의 주파수가 60Hz라면 1초에 60번 화면이 갱신 <리스트2> 애플리케이션에서 디바이스 드라이버에 접근해 제어하는 방법 #include <stdio.h> #include <stdlib.h> /* for exit */ #include <unistd.h> /* for open/close.. */ fbvar.bits_per_pixel = 16; #include <fcntl.h> /* for O_RDONLY */ 하드웨어는 크게 세 부분으로 구성된다. <화면 #include <sys/ioctl.h> /* for ioctl */ #include <linux/fb.h> /* for fb_var_screeninfo, FBIOGET_VSCREENINFO */ fbvar.xres = 640; fbvar.yres = 480; <화면 4> 메인보드와 서브 보드, TFT LCD 등 하드웨어 주요 부품 <리스트 1> 커널을 수정해 제어 신호를 표준 주파수에 맞추기 4>는 프로세서인 Xscale의 주변 회로가 구성돼 있는 메인 보드로, 임 베디드 리눅스 개발업체인 FALINUX가 판매중인 EZ-X5를 사용했 다. 다소 가격이 부담되지만 ARM 프로세서를 이용하면 보드를 직접 제작할 수 없기 때문에 EZ-X5와 보드를 구입해 사용하는 것이 효율 #define FBDEVFILE /dev/fb int main(void) int fbfd; fbvar.left_margin =20; /* time from sync to picture */ fbvar.right_margin=20; /* time from picture to sync */ fbvar.upper_margin=20; /* time from sync to picture */ fbvar.lower_margin=20; fbvar.hsync_len =0; /* length of horizontal sync */ #if defined (CONFIG_VGA_EZ_X5) // 640?480?65535 ============================== #define LCD_PIXCLOCK 150000 #define LCD_BPP PXAFB_BPP #define LCD_XRES 640 #define LCD_YRES 480 #define LCD_HORIZONTAL_SYNC_PULSE_WIDTH 0x0a #define LCD_VERTICAL_SYNC_PULSE_WIDTH 0x85 #define LCD_BEGIN_OF_LINE_WAIT_COUNT 0x4c #define LCD_BEGIN_FRAME_WAIT_COUNT 0x09 #define LCD_END_OF_LINE_WAIT_COUNT 0x0c #define LCD_END_OF_FRAME_WAIT_COUNT 0x1f #define LCD_SYNC (FB_SYNC_HOR_HIGH_ACT FB_SYNC_VERT_HIGH_ACT) #define LCD_LCCR0 0x003008F8 #define LCD_LCCR3 (0x0040FF01 (PXAFB_BPP_BITS << 24) (0x3 << 20)) 적이다. 더구나 32비트 이상의 프로세서를 사용한다는 것은 곧 임베 디드 운영체제(OS)를 사용한다는 말과 같은 의미다. 이번 프로젝트 의 경우 아직 임베디드 리눅스를 공부하는 입장이었기 때문에 기술지 원이 가능한 이 보드를 선택했다. 메인 보드에는 Xscale이 동작할 수 있는 최소한의 환경, 즉 RAM, ROM, LAN, UART와 TFT LCD 커넥터 등의 핵심 장치만 배치돼 있을 뿐 외부 장치가 없기 때문에 이번 프로젝트에서는 필요한 외부 장치를 장착한 서브 보드를 직접 제작해 사용했다. 여기에는 MMC 카드를 이용할 수 있는 확장 저장공간, VGA 신호를 입출력하는 D/A 컨버터인 TDA8771AH, 사운드 입출력용 CS4202, LCD에 전원을 공급하는 백 라이트 등이 탑재됐다. 물론 FALINUX도 이런 하드웨 어를 지원한다. 하지만 은 이동성이 필수이므로 여 int ret; struct fb_var_screeninfo fbvar; fbfd = open(fbdevfile, O_RDWR); if(fbfd < 0) perror( fbdev open ); ret = ioctl(fbfd, FBIOGET_VSCREENINFO, &fbvar); if(ret < 0) perror( fbdev ioctl(get) ); fbvar.vsync_len=0; /* length of vertical sync */ ret = ioctl(fbfd, FBIOPUT_VSCREENINFO, &fbvar); if(ret < 0) perror( fbdev ioctl(put) ); close(fbfd); exit(0); return 0; 246 2 0 0 5. 3 마 이 크 로 소 프 트 웨 어 247

내 손 안의 강의실, 되는 셈이다. HSYNC 신호는 라인 클럭으로, 한 클럭에 한 라인을 표 는 보통 두 가지 방법이 사용되는데, 커널 소스($(KER NELTOP)\ 소프트웨어 뜯어보기 타겟 애플리케이션 개발 시한다. VCLK 신호는 픽셀 클럭으로 화면 상의 한 점을 나타낸다. drivers\video\pxafb.h)를 직접 수정하는 방법과 애플리케이션에서 에서 사용되는 애플리케이션은 타겟 애플리케이션 프리젠테이션 모드에서는 매니저 프로그램으로부터 다운로드한 EZP VD는 레드 5비트, 그린 6비트, 블루 5비트 신호이다. VDEN은 비디 디바이스 드라이버에 접근해서 제어하는 방법이다. 과 호스트 애플리케이션으로 구분된다. 타겟 애플리케이션은 <화면 파일 리스트를 화면에 보여주며 사용자가 리스트에서 EZP 파일을 선 오 Enable 신호로, HSYNC의 low 구간에서 실제 화면의 출력 구간 먼저 커널 소스를 수정하는 방법은 <리스트 1>과 같다. H sync 2>와 같이 프리젠테이션 모드, 나레이션 모드, 컨피그레이션 모드로 택하면 프리젠테이션을 재생하는 기능을 지원한다. 이 때 녹음 버튼 을 나타낸다. high 상태의 길이와 V sync high 상태의 길이를 정의한후각 구성돼 있다. 을 누르면 강의가 생성되는 것이다. 이 기능에서 가장 고민됐던 부분 640 480 해상도에서 산업표준 주파수는 VCLK=25.175MHz, 라인 시작의 wait count 값과 각 프레임 시작의 wait count 값 은 화면을 캡처할 것인지 아니면 시간과 터치 스크린에서 발생하는 HSYNC=31469Hz, VSYNC=59.94Hz이다. 각 제어 신호들은 산업 각 라인의 마지막 wait count 값 각 프레임 마지막의 wait count 표준 주파수가 아니어도 TFT-LCD 화면은 영향을 받지 않지만 이를 빔 프로젝터로 출력하면 화면이 일그러지는 현상이 나타나므로, 처음 부터 각 제어 신호들을 표준 주파수에 맞추는 것이 좋다. 이를 위해서 값 등을 설정한다(~은 화면을 모니터의 중앙에 위치하기 위한 설정이다). 애플리케이션에서 디바이스 드라이버에 접근해 제어하는 방법은 <리스트 2>와 같다. <리스트 4> 시간과 좌표 값을 저장하는 루틴 typedef struct _LinkInf struct _LinkInf * prev; struct _LinkInf * next; int DrsReleaseEvent(unsigned short int x, unsigned short int y) <리스트 3> 프리젠테이션 모드 구현하기 unsigned long starttime; unsigned long endtime; struct tms tms_t; #include <stdio.h> #include <stdlib.h> // for exit #include <unistd.h> // for open/close #include <fcntl.h> // for 0_RDWR #include <sys/ioctl.h> // for ioctl #include <linux/fb.h> // for fb_var_screeninfo, FBIOGET_VSCREENINFO #include <sys/mman.h> /* for mmap */ #define FBDEVFILE /dev/fb unsigned long FRAME_SAVE_SIZE; int main(char argc, char ** argv) int fbfd; pmmap = (unsigned short *)mmap(0, // 커널에서 알아서 할당 요청 FRAME_SAVE_SIZE, // 할당 크기 PROT_READ PROT_WRITE, MAP_SHARED, // 할당 속성 fbfd, // 파일 핸들 0); // 맵핑 대상의 물리 주소 if(pmmap < 0) perror( mmap ); FrameBuffSave(fbfd, pmmap, argv[1]); unsigned long deltime; unsigned long datasize; /* 실제적인 좌표 값의 데이터 수 */ unsigned long mallocsize; /* buf용으로 할당받은 힙 메모리 */ unsigned char *buf; char color; /* 1바이트이나 구조체 정렬에 의해 4바이트로 취급된다. */ LinkInf; int DrsPressEvent(unsigned short int x, unsigned short int y) LinkInf * list; struct tms tms_t; clock_t presstime; int ret = 1; clock_t endtime; int ret = 1; endtime = times(&tms_t); lastlink->endtime = endtime - recinf.time_now; /* 현재는 10msec 단위의 time stemp 사용 */ ret = DrsPositInst(x, y); return ret; // 마우스 이벤트가 발생해 scrinf.buf에 좌표 값을 추가한다. static int DrsPositInst(unsigned short int x, unsigned short int y) unsigned long * tmp; int ret; struct fb_var_screeninfo fbvar; unsigned short * pmmap; char filename[] = /mnt/nfs/frambuffer/test.fbf ; munmap(pmmap, FRAME_SAVE_SIZE); close(fbfd); return 0; presstime = times(&tms_t); DrsAddList(lastLink, &list); /*lastlink는 자동 갱신되고 메모리는 자동 할당된다.*/ ++scrinf.update; /* linked list에 추가된 리스트 개수를 카운트한다. */ list->color = scrinf.color; /* 현재 펜 색을 설정 */ list->starttime = presstime - recinf.time_now; /* 현재는 10msec 단위의 time stemp 사용 */ // 현재 링크의 할당된 버퍼 메모리가 작다면 2배 증가시킨다. if(lastlink->datasize >= lastlink->mallocsize) lastlink->mallocsize = lastlink->mallocsize<<1; // 2배증가 lastlink->buf = (unsigned char *)realloc(lastlink->buf, lastlink- >mallocsize); if(argc!=2) printf( usage :./fbread.o test.fbf\n ); if((fbfd = open(fbdevfile, O_RDWR)) < 0 ) perror( fbdev open ); int FrameBuffSave(int fbfd, unsigned short * pmmap, char * filename) int fd; unsigned long realrecv, size=0; if((fd = open(filename, O_WRONLY O_CREAT O_TRUNC, 0777 )) < 0) printf( FrameBuffSave() Error- image File Creat error \n ); while(1) PDEBUG( list->starttime = %ld, scrinf.update = %d \n,list->starttime, scrinf.update); DrsListCnt(); ret = DrsPositInst(x, y); /* lastlist에좌표값을추가한다. */ return ret; int DrsMoveEvent(unsigned short int x, unsigned short int y) return DrsPositInst(x, y); if(lastlink < 0) printf( DrsMoveEvent() - realloc() Error\n ); tmp = (unsigned long *)&(lastlink->buf[lastlink->datasize]); (*tmp) = (x<<16) y; lastlink->datasize +=4; realrecv = write(fd, &((char *)pmmap)[size], FRAME_SAVE_SIZE- size); if(ioctl(fbfd, FBIOGET_VSCREENINFO, &fbvar) <0 ) // 파일의 데이터를 전송한다. size += realrecv; perror( fbdev ioctl(fscreeninfo) ); if(frame_save_size <= size)break; FRAME_SAVE_SIZE = fbvar.xres * fbvar.yres *2; close(fd); 용 + 어 + 정 + 리 네이티브 컴파일과 크로스 컴파일 일반적으로 컴파일러는 개별 시스템에 맞는 바이너리 코드를 생성하는 역할을 한다. 예를 들어 x86 시스템에서 gcc를 이용해 컴파일하면 x86의 바이너리가 생성된다. 타겟 보드에서 gcc를 이용해 응 용 프로그램을 컴파일하면 타켓의 바이너리가 생긴다. 이런 컴파일을 네이티브(native) 컴파일이라 고 한다. 하지만 타겟 보드는 저장할 수 있는 디스크 공간이 매우 부족하기 때문에 직접 응용 프로그램이나 리눅스 커널을 컴파일할 수 없다. 따라서 타겟용 리눅스 커널과 응용 프로그램을 개발하기 위해서는 호스트 시스템에 타켓 바이너리 코드를 생성할 수 있는 컴파일 환경을 구성해 작업하는데 이를 크로 스(cross) 컴파일이라고 한다. 248 2 0 0 5. 3 마 이 크 로 소 프 트 웨 어 249

내 손 안의 강의실, 좌표 값을 저장할 것이냐 하는 결정이었다. 테스트 결과 임베디드 플 DrsMoveEvent를 호출하고, 펜을 터치 스크린에서 떼면 DrsRelease 는 기능과 EZP 파일을 임베디드 시스템으로 다운로드하거나 생성된 랫폼에서는 시간과 좌표 값만을 저장하는 것이 더 효율적이라고 결론 Event를 호출한다. 강의 파일을 업로드하는 역할을 맡는다. 앞서 살펴 본 <화면 1>이 바 내리고 이를 구현하는 작업을 시작했다. 나레이션 모드는 프리젠테이션 모드에서 생성한 강의 파일을 재생 로 매니저 프로그램인데, 이번 프로젝트의 경우 팀원들이 UI를 구성 <리스트 3>은 프레임 버퍼에서 값을 직접 읽어 파일에 저장하는 코 하는 기능을 지원한다. PageEventInfo 전역 구조체에서 현재 열린 해 본 경험이 없고 포토샵과 같은 그래픽 유틸리티를 능숙하게 다루 드이다. fb_var_screeninfo는 리눅스 시스템에서 그래픽을 표현하는 페이지의 정보를 얻는다. xxx.scr 파일을 인수로 넘기면 파일을 검색 지 못해 무척이나 애를 먹었다. 매니저 프로그램의 각 메뉴는 다음과 프레임 버퍼의 정보를 갖고 있다. 실제 프로젝트에서는 x_res, y_res 해 해당 파일이 있는지 여부를 판단하고 정상적으로 존재하면 draw, 같은 기능을 담당한다. 만을 참고해 프레임 버퍼 크기를 계산했으며, 애플리케이션에서 프레 del linked를 이용해 playlinked를 생성한다(<리스트 5>). 임 버퍼에 직접 접근할 때는 mmap 함수를 사용했다. Convert : 파워포인트 파일을 EZP 파일로 변환 <리스트 4>은 시간과 좌표 값을 저장하는 루틴이다. DrsPress 호스트 애플리케이션 개발 Send : EZP 파일을 임베디드 시스템으로 다운로드 Event는 터치 스크린에 사용자가 글을 쓰기 시작했을 때 발생하는 함 호스트 애플리케이션은 매니저 프로그램과 뷰어 프로그램으로 구성 Receive : 임베디드 시스템의 파일을 업로드 수로 사용자가 글을 쓰기 위해 압력을 가한 상태에서 움직이면 돼 있다. 매니저 프로그램은 파워포인트 파일을 EZP 파일로 변환하 Delete : 임베디드 시스템에 저장된 프로젝트를 삭제 Refresh : 임베디드 시스템의 목록을 갱신 <리스트5> 나레이션 모드 static int PlyLinkedCreate(void) /* 눌러진 시간이 페이지보다 이전이고 지워진 리스트가 아니라면 drawlink에 추가한다. */ <화면 5> EZP 뷰어 실행 화면 int fd; LinkInf * tmphead; PlayList * listhead; char flag, dellistflag; if((pageeventinfo.starttime > listhead->pt->starttime)&&(listhead->pt->deltime!= 0)) PlyDrwAddListNoMalloc(drwLastLink, listhead->pt); /*이전 그림에 대한 link 작성 */ free(listhead); else if(pageeventinfo.endtime < listhead->pt->starttime) ) /* 이후라면 무조건 삭제 */ <리스트 6> 파워포인트 파일을 EZP 파일로 변환하는 코드 #include msppt.h UINT Convert_Thread(LPVOID pparam) _Slide _slide(slides.item(slidenumber)); route.format( %s%03d. +pwnd->format,folder,i+1); // _slide.export((lpcstr)route,pwnd->format,pwnd->x_value,pwnd->y_value); // char playlistflag = PLAY_LIST_DRW_LIST; fd = open(pageeventinfo.filename, O_RDONLY); if(fd < 0) printf( PlyLinkedCreate() - open() Error\n ); lseek(fd, listhead->pt->datasize, SEEK_CUR ); /*파일 이름 만큼의 파일 포인터 이동 */ free(listhead->pt); free(listhead); else PlyAddListNoMalloc(lastLink, listhead); /* lastlink는 자동으로 갱신된다. */ listhead->flag = playlistflag; /*draw, dellinked의 리스트를 flag로 구분한다. */ CEasy_PPTDlg *pwnd =(CEasy_PPTDlg *)pparam; TCHAR pbuf[bufmax]; CoInitialize(NULL); // // (생략) PPT 파일을 지정해 파워포인트로 연다. PPT_FileName=FileDlg.GetFileTitle(); // CFile jpgfile ((int)jpg_file); tmpseek = ezpfile.getposition(); // ezpfile.seek(((i+1)*4), CFile::begin ); filesize = jpgfile.getlength(); ezpfile.write(((char *)&filesize), sizeof(filesize));// ezpfile.seek( tmpseek, CFile::begin );// read(fd, &dellistflag, 1); /* delet list의 유무를 알아내 전체 리스트를 구성한다. */ if(dellistflag == 1 )flag = 2; else flag =1; while(flag!= 0) listhead = (PlayList *)malloc(sizeof(playlist)); /* 메모리 할당 */ if(listhead < 0) listhead->pt->buf = (unsigned char*)malloc(listhead->pt->datasize); /* 메모리 할당 */ if(listhead->pt->buf < 0) printf( PlyLinkedCreate() -malloc() buf Error\n ); presentations=app.getpresentations(); // _presentation=presentations.open(strfilename,1,1,0); // Slides slides(_presentation.getslides()); // total=slides.getcount(); // // (중략) EZP 확장자의 파일을 생성한다. 파일명은 파워포인트 파일과 동일하다. while(2) UINT nbytesread = jpgfile.read(pbuf,bufmax); ezpfile.write(pbuf, nbytesread); if(nbytesread!= BUFMAX)break; // printf( PlyLinkedCreate() -malloc() list Error\n ); if(read(fd, (char *)listhead->pt->buf, listhead->pt->datasize) < listhead- >pt->datasize) printf( PlyLinkedCreate() -read() Error\n ); CFile ezpfile((int)ezp_file); LONG loffset=(total+1)*4; ezpfile.write(((char *)&total), sizeof(total)); // CloseHandle(jpg_File); DeleteFile((LPCSTR)fdata); //FOR listhead->pt = (LinkInf *)malloc(sizeof(linkinf)); /* 메모리 할당 */ if(listhead->pt < 0) printf( PlyLinkedCreate() -malloc() list Error\n ); /*while(1)*/ lactual = ezpfile.seek(loffset, CFile::begin); // for(long i=0;i<total;i++) CloseHandle(ezp_File); App.Quit(); if(tmphead == 0) /* linked의 마지막 리스트라면 flag 값이 1씩 감소한다.*/ flag--; playlistflag = PLAY_LIST_DEL_LIST; if(read(fd, (char *)listhead->pt, sizeof(linkinf)) < sizeof(linkinf)) printf( PlyLinkedCreate() -read() Error\n ); tmphead = (LinkInf *)listhead->pt->next; /* playlist용 메모리를 해제하므로 임시로 저장 */ close(fd); 용 + 어 + 정 + 리 프레임 버퍼 예전에는 그래픽 라이브러리나 윈도우 시스템이 하드웨어를 직접 제어할 수 있었지만 최근에는 가 속기와 특수 명령 집합으로 하드웨어를 직접 제어할 수 없게 됐다. 따라서 하드웨어를 제어하는 추상 적인 계층을 두는데 바로 이것을 프레임 버퍼(frame buffer) 라고 한다. 리눅스 커널 내부 문서에서는 프레임 버퍼를 다음과 같이 정의한다. 프레임 버퍼 장치는 그래픽 하 드웨어를 위한 추상화를 제공한다. 즉 비디오 하드웨어의 프레임 버퍼를 대표하며 응용 프로그램이 그래픽 하드웨어를 잘 정의한 인터페이스를 통해 접근하도록 허용해 소프트웨어가 저수준(하드웨 어 레지스터) 내역에 대해 어떠한 사실도 알 필요가 없게 한다. 250 2 0 0 5. 3 마 이 크 로 소 프 트 웨 어 251

<그림 5 > EZP 뷰어 플로우 차트 Voice Play Play Start Screen Play Play Linked 시스템에서 생성한 파일을 디코딩해 재생할 수 있는 애플리케이션이 다. EZP 뷰어의 시스템 실행 순서는 <그림 5>와 같다. 프로젝트 파일 을 선택해 이미지를 로드한 후 재생버튼을 눌러 플레이어가 시작되면 voice play 프로세스와 screen play 프로세스가 실행된다. 이때 voice 프로세스는 타겟 애플리케이션으로 녹음한 강의 WAV 파일을 디코딩 해 출력 디바이스에 데이터를 전송한 후 재생하는 방식이며, screen play 프로세스는 Linked List 구조로 만들어진 스크린 파일을 디코딩 해 화면에 출력하는 과정을 통한다. NO YES Signal Exit Sync. cfg Draw Screen 파워포인트 파일을 EZP 파일로 변환하는 것은 파워포인트 오토메 이션 기반에서 이루어진다. MFC 클레스 위자드 환경에서 오토메이 션 탭을 클릭, ADD 클래스한 후 from type library 을 선택해 파워 포인트 디렉토리에서 MSPPT.OLB를 열기 를 클릭하면 된다. 선택 할 파일은 _Application, _Presentation, _Slide, Presentation, Slide 등5개다. <리스트 6>은 이와 같은 파워포인트 파일 변환 과정을 구현한 주요 코드이다. 먼저 파워포인트를 사용하기 위해 COM을 초기화하고 파워포인트 파일의 이름을 가져온다. 선택한 파워포인트 파일 을 로드한 후 파일을 오픈해 슬라이드를 가져 온다. 슬라이 드의 총 개수(타겟 애플리케이션에서 EZP 파일을 디코딩할 때 필요 하다)와 이미지 파일의 크기 정보를 파악한다. 데이터 삽입 지 점을 찾아 슬라이드를 캡처한 이미지의 경로를 나타낸다. 생성 될 경로, 변환할 파일 형식, 해상도 값 형식으로 구성된 함수인자로, JPG, BMP, HTML 등 다양한 형식으로 변환할 수 있다. x와 y값은 이미지 해상도를 결정한다(여기서는 LCD가 640 480 정해져 있으 므로 x=640, y=480으로 고정된다). 이제 현재의 파일 포인터 값 을 리턴받는다. EZP 파일에 현 이미지의 크기를 기록해야 타겟 애 플리케이션에서 디코딩을 할 수 있다. 가져온 파일 포인터부터 다 음 기록을 위한 지점으로 접근한다. 마지막으로 이미지 데이터를 버퍼에 로드해 EZP 파일에 기록한다. <화면 5>는 EZP 뷰어를 실행시킨 화면이다. EZP 뷰어는 임베디드 End Exit YES Screen File NO, 이것이 아쉽다 이번 프로젝트의 총 기간은 2개월 반 정도였다. 비교적 짧은 프로젝트 여서 처음에 기획했던 많은 기능들을 다 구현하지는 못했다. 특히 강 의를 하다 보면 그림을 다시 그리거나 지워야 하는 경우가 많은데, 실 제 프로젝트에서는 이 지우는 기능을 구현하는 데까지 성공했으나 반 대로 지워진 내용을 재생할 때 어떻게 처리해야 할지 방법을 찾지 못 해 최종 완성품에서는 이 기능을 삭제하고 마무리해야 했다. 팀원들 사이에 우여곡절도 많았다. 대회 1주일을 앞두고는 윈도우 프로그램을 담당했던 팀원이 맹장염으로 수술을 받았다. 그러나 프로 젝트를 마무리하는 단계였기 때문에 수술 후 충분히 쉬지도 못하고 바로 다시 프로그램 개발 현장에 복귀해야 했다. 천신만고 끝에 개발한 은 어떻게 활용할 수 있을 까. 최근 들어 PDA 사용자가 많이 늘어나고 있다. 시스템은 LCD가 크다는 점을 제외하면 전체적인 하드웨어가 PDA와 유사하기 때문에 PDA로 본격 포팅을 하면 저렴한 비용으로도 강의를 생성해 강의자 없이도 빔 프로젝트를 통해 동일한 내용의 강의를 보여 줄 수 있다. 물론 필자와 같은 학생 입장이라면 진도 빠르기로 유명한 교수님이 몇 분씩 계셔도 걱정할 필요가 없을 것이다. 참 + 고 + 자 + 료 FALINUX 사이트 www.falinux.co.kr Clabsys 사이트 www.clabsys.co.kr Korea Embedded Linux Project kelp.or.kr Frame buffer 이야기 kelp.or.kr/korweblog/stories.php?story=02/11/09/8557035 응용프로그램에서 하드웨어 레지스터 접근하기 falinux.com/board/tip.html 리눅스 애플리케이션 개발, Eric Harlow, 정보문화사 Visual C++ Programming Bible, 이상엽, 영진출판사 Linux Programming Bible, 권수호, 글로벌출판사 임베디드 리눅스, 박재호, 한빛미디어 m a s o 정리 박상훈 nanugi@imaso.co.kr 252 2 0 0 5. 3