Part2. 커널 개발시 꼭 알아야할 몇가지

원문 : http://kkamagui.springnote.com/pages/339543

 

들어가기 전에...

 

0.시작하면서...

 커널 개발 시에 알아야할 것이 프레임워크를 사용하면 많이 줄어든다고 이야기 했었다. 그렇다면 프레임워크를 사용해서 개발하면 정말 콜백(Callback)만 구현하는 방식으로 커널 개발을 완료할 수 있을까?

 글쎄... 이건 한번 생각해볼 문제인 것 같다. 초보라면 콜백과 API를 사용하는 것 만으로 충분하다. 하지만 프레임워크의 API는 시스템 또는 CPU Architecture의 특수한 기능을 수행하는 명령어를 사용하기 쉽도록 Wrapping 해놓은 것이기 때문에 시스템에 대한 어느정도 지식이 있으면 API를 '더욱 잘' 사용할 수 있다. 프레임워크(Framework)의 기능을 수정하거나 새로운 기능을 추가하려면 역시 시스템에 대한 지식이 필요하다.

 

 

1.권장 지식

 그럼 '꼭' 알아야 하는 것은 과연 무엇일까??
 내가 생각하는 꼭 알아야하는 것은 아래와 같다.

 

1. 기본적인 어셈블리어 명령 몇가지
2. C 언어의 호출 규약(Calling Convention)
3. OS의 역할 및 간단한 동작 원리
4. 인터럽트(Interrupt) 종류 및 처리 방법

 

 적어도 이 정도는 빠삭(??) 하게 알고 있는 편이 커널 제작에 도움이 된다. 위 항목은 시스템 프로그래밍에 기초가 되는 부분이기도 하니, 저 정도의 지식은 갖추고 있는 사람이 꽤 될 것이다.

 적어놓고 나니, 아까 몰라도 된다고 했던 어셈블러는 갑자기 1번으로 등극해있고... CPU Architecture도 몰라도 된다면서 Interrupt 처리에 대한 내용이 나와있는건 또... ㅜ_ㅜ

 뭐.. 어디까지나 중급자를 위한 코스~!!! 라는 점을 강조하면서 마무리해야 겠다. 초급자는 프레임워크를 돌려 실행하기도 빠듯할 터이니 그냥 읽고만 넘어가자.
 그럼 고급자는?? 고급자는 이 글을 보지 않아도 이미 커널을 만들 수 있는 실력을 갖추고 있을 터이니 더더욱 패스...(왜 이걸 보고있을까.. ㅡ_ㅡa...)

 여튼 각설하고 중급자로 올라가려면 저정도의 지직은 갖추도록 하자.

 

 

이 글은 스프링노트에서 작성되었습니다.

이 글은 스프링노트에서 작성되었습니다.

OS 프레임워크 전체글 보기

Part1. 커널 개발이 힘든 이유

들어가기 전에...

0.시작하면서...

프로그래머라면 누구나 자기가 만든 OS에서 프로그램을 실행시키는 꿈을 꿔본 적 있을 것이다.
OS... 그것은 프로그래머의 로망(??)이라고도 말 할 수 있는데....

문제는 OS 구현이 아니라 커널 개발도 힘들다는 것...
커널 개발에 시도했던 많은 초보 프로그래머들이 격는 수많은 벽....

Assembler, CPU Architecture, Device Control, C Language Skill... 등등...

난관은 아주 많다. 부트로더까지는 어셈블리어를 대충 공부해서 어찌 어찌 해본 사람들이 꽤나 많을 것인데, 보호모드로 진입하여 32bit 커널을 구동시키고 유저레벨과 커널레벨을 구분하여 응용프로그램을 생성하고 이후 기타 등등 까지 해본 사람은 크게 많지 않다고 생각한다. (왜?? 여기서 부터는 CPU Architecture를 이해해야하고 C 언어의 약간 고급 스킬이 필요하기 때문이다. 물론 요즘은 좋은 책이 많이 나와있어서 앵무새 처럼 치기만 하면 되지만, 이 또한 커널 디버깅이 필요한 상황이 닥치면 쉽게 포기하고 만다... ㅡ_ㅡ;;;; )

1. OS 제작... 그 높은 벽

나도 대학교 1학년 말에 아는 것 없이 개발을 시도했다가 어셈블리어의 장벽과 CPU Architecture에 대한 장벽에 부딪혀서 한번 좌절을 했었다. 그뒤 소스가 오픈되어있다는 리눅스를 깔아서 미친듯이 코딩을 하고 커널 코드를 뒤져보고해서 벽을 넘어보려했지만 역시 무리....
결국은 기초가 문제라는 것을 깨닫고 체계적으로 어셈블리어 공부를 시작했고 IBM 호환 PC의 구성에 대해서 공부했다. 그렇게 시간이 흐르고나니 자연스레 부트코드, CPU Architecture에 대해서 이해가 되었다.

이것이 2002년도 말쯤이었던 걸로 기억된다.

그 뒤로 커널을 만들고 유저레벨/커널레벨로 분리하고, 어플리케이션을 위한 시스템 콜(System Call)과 라이브러리(Library)를 만들면서 OS라고 부르기에는 많이 부족하지만 간단한 OS를 만들 수 있었다.
<궁금하신 분들은 여기 참조.. http://kkamagui.egloos.com/3071201 >

2. OS 포팅(Porting)의 어려움

운이 좋아서 ARM 보드(ARM7TMDI 코어 사용)를 구하여 Kernel을 제작할 수 있었는데, 기존 소스를 포팅해보려했지만 워낙 INTEL Architecture에 의존해서 구현했기 때문에 실패하였다. Kernel 코드가 너무 CPU Architecture와 긴밀하게 연결되어 분리가 거의 불가능한 지경이었다. 결국 Kernel을 처음부터 다시 구현하기 시작했는데, OS까지도 못가보고 도중 포기(사실 중단이란 표현이 더 맞을 것 같다. 삽질을 다시 하려니 죽을것 같은 귀차니즘이 몰려와서... ㅡ_ㅡ;;; )

3. OS 제작과 프레임워크(Framework)의 시작

ARM 커널을 마지막으로 3년이라는 시간이 흘렀다. OS 제작은 점점 기억에서 멀어져가던 차에 어느날 갑자기 NDS(Nintendo Dual Screen, 게임기)에 OS를 올려보면 좋겠다는 생각이 들었다. 하지만 다시 처음부터할 생각을 하니 아득하고... 그러다 문득 든 생각이 있었다.

"왜?? OS를 만들려고 시작하면 알아야 하는게 이렇게 많은 걸까?"
"좀 더 쉽게 시작하거나 간단하게 테스트할 수 있는 그런 방법은 없나?"

그래서 생각한 것이 프레임워크(Framework) 였다. CPU Architecture에 관련된 부분이나 Hardware에 관련된 부분은 wrapping하여 CallBack과 API 형태로 만들고 CallBack을 어느정도 구현하고 API를 사용하면 간단히 Kernel을 제작할 수 있는 프레임워크... 당장 시작해야겠다는 생각이 들었다.

이것이 OS 프레임워크 프로젝트의 시작이었다.

00 KKAMA OS

들어가기 전에...

옛날 kkamagui.osx86.org를 운영할 때 썼던 글을 옮겨왔습니다. ^^;;; 사실 이제는 64비트 멀티코어 OS 구조와 원리를 만들 때 개발한 MINT64로 발전해서 KKAMA OS는 더이상 볼 수 없지만... MINT64를 KKAMA OS라고 생각해주시면 좋겠습니다. ^^;;;

1.소개

KKAMA OS는 KKAMAGUI가 만든 OS란 뜻입니다.

프로젝트를 시작한건 작년 10월이나 11월쯤 되겠군요. (글고보니 이놈 정확한 생일도 모르고 있네요. 쩝쩝.. -_-a..)

처음엔 부트로더로 시작했던 녀석이 어느새 시간이 지나 32Bit 허접 Kernel로 진화를했습니다. 제가 주로 쓰는 Nic Name이 까마귀(KKAMAGUI)인지라 이녀석의 이름 또한 제 별명을 따라 지었습니다.

왜 KKAMAGUI OS가 아니라 KKAMA OS인지 궁금해 하실 분이 있으신지 모르겠으나 (-_-a.. 없으려나...) 어느날 녀석의 이름을 KKAMAGUI라고 지었을때, 어느분이

'어?? 그거 새로나온 GUI냐??' 라고 물으시던데...

이때 머리를 스치는 생각 'CUI(console user interface)를 가진 녀석은 KKAMA OS로 짓고 GUI를 갖추면 그때 KKAMAGUI OS로 만들자!!'

그래서 일단은 KKAMA OS로 지었습니다. 지금 어느정도 GUI도 있으니까 KKAMAGUI OS가 맞겠네요. ^-^

KKAMA OS의 이상은 Simplist, Light, Easy Implementation 입니다. 이중에서 Simplist와 Easy Implementation을 가장 중요하게 생각하고 있는데, 간단하고 쉬운 알고리즘이 가장 좋다고 생각하기 때문입s니다. 사실.. 생각만 그리하고, 실제로 실천 하고 있는지는 저도 알 수 없죠. 쿨럭..;;;

2.기능

2.1 동작 환경

KKAMA OS는 아래의 환경에서 동작합니다.

  • Intel 386 이상 Protected Mode 동작 가능 CPU
  • 하나 이상의 Floppy Disk ( Kernel이 Floppy를 통해 부팅되기 때문이죠 )
  • PS/2 방식의 Keyboard 및 Mouse
  • Vesa방식이 지원되는 Video Card ( 제건 3년 전 모델인데 지원하더라구요.. 앵간하면 다 될듯 GUI시 필수 CUI시 옵션 )
  • FAT32 또는 16방식으로 포멧된 HDD ( 옵션 )

2.2 지원 기능

KKAMA OS가 지원하는 기능은 아래와 같습니다.

*1. FAT32 또는 16방식으로 포멧된 HDD Read/Write
( 파일 읽기쓰기, 디렉토리 읽기쓰기 가능 )
2. Serial 제어
( Serial을 통한 파일 송/수신 )
3. Floppy Disk 제어
( 섹터 읽기쓰기 지원, FAT12는 아직 미지원 )
4. Mouse 제어
( PS/2 방식만 가능, GUI때는 필수 )
5. 간단한 kernel shell
( Kernel 테스트를 위한 Shell, 그리 큰 기능은 없음 )
6. 응용프로그램 Loader
( djgpp를 통해 컴파일 링크된 Binary또는 djgpp-coff파일 실행가능,
단 djgpp-coff는 특별히 제작된 프로그램을 한번 통해 실행해야 됨 )
7. 약간의 GUI
( 최근에 구현된 허접한 GUI, 윈도우 겹침 처리 및 마우스 처리 외에 별다른
기능 없음 )
8. RAM Disk Drive
( 2004/03/23에 개발 1차 완료, 4Mbyte의 크기 )
9. IPC 중 파이프, 공유메모리 지원
( 파이프는 2004/04/11에 개발 1차 완료 ) *

 기존에 소스세이프를 사용하고 있었는데, 이게 문제가 좀 많아서 서브버전으로 옮겼습니다. 소스세이프에 기존 소스를 다 올리는데 한참 걸렸는데... 역시나 소스세이프에서 서브버전으로 소스를 다 옮기는 시간도 만만치 않군요. 특히나 초기에 파일을 올릴때 그 속도는 가히 압권.... ㅜ_ㅜ...

그래도 한 3일 고생해서 옮기긴 다 옮겼습니다. 이제 열심히 코딩하는 일만 남았군요. ㅎㅎ 다시 열 코딩을....

ps) 요즘 쓸데없는 것에 시간을 많이 할애하는 듯.... ㅡ_ㅡa...
ACM 대회 준비도 해야하는데... 왠지 할일이 점점 늘어나는 듯한....


이글루스의 여러가지 제약때문에 티스토리에 블로그를 하나 생성했습니다. ^^;;;;
이글루스와 인터페이스가 달라서 약간 당황스럽긴하지만... ㅎㅎ
뭐 이정도면 괜찮은듯~!!

티스토리 화이팅~~ >ㅁ<)/~

이전 블로그로 가려면 http://kkamagui.egloos.com 으로 가세요 >ㅁ<)/~
이런게 있네... ㅡ_ㅡ;;;

83a8: e3a00006 mov r0, #6 ; 0x6
83ac: eaffffff b 83b0
83b0: e91ba800 ldmdb fp, {fp, sp, pc}

내가 C 소스 코드에서 무엇을 했는고 하니.. ㅡ_ㅡ;;;

return 6;

했더랬다. 저 어셈코드를 보면, 사실 mov r0, #6를 하고 ldmdb fp, {fp, sp, pc} 하면
될것을 return 을 했다고 폴짝 바로 아랫줄로 뛰어들고 있음을
"확인"
할 수 있다. 얼래.. ㅡ_ㅡ;;; 머지.. 저런식으로 코드를 생성하면 먼가 이득이 있나??
아님 내가 멀 잘못알고 있는건가??
설마 brench 명령으로 CPU Cache를 Flush하는 그런 말도안되는.. ㅡ_ㅡ;;;;;
내가 써놓고도 좀 말이 안되는거 같네. 만약 Flush를 위함이라하면 brench가 도배되
어야 정상이지......
O1을 줘서 약간의 Optimizing을 하면.. 아래와 같은 결과가 나온다.

8310: e3a00001 mov r0, #6 ; 0x6
8314: e91ba800 ldmdb fp, {fp, sp, pc}

컥.. brench가 온데간데 없다. @0@/~
이.. 이럴수가..





??
감상평은... 뭐랄까... 중간에 좀 지겹달까??

그리고 로봇의 싸움 보다는 사연(??) 쪽에 더 중점을 둔듯....

중간은 지겹지만 끝으로 갈수록 꽤나 흥미진진한....

"나름 볼만하다" 정도 ㅎㅎㅎ

심심하면 강추~
지난번에 발견한 문쉘의 리부팅 플러그인 (reset.mse) 소스를 뒤지다가

혹시나 실행이 되지 않으면 어쩌나 걱정스러운 마음에 소스를 좀 수정해서

적당히 만든 다음 컴파일 하니 _BOOT_MP.NDS 파일이 나왔다.

약간 걱정이 되었지만 테스트 결과는 대성공 @0@)/~~

다만 약간 문제는 구버전의 fat 라이브러리를 사용하는데,

이것이 FAT Raw 데이터를 이용하는 부분이어서 현재 쓰고있는 fat 라이브러리로는 힘들꺼 같았다.

그렇다고 중복으로 fat 라이브러리를 다 링크하자니 쓸데없이 코드가 커지는 문제가 생기고... ㅡ_ㅡa...

결국 libfat에서 FAT Raw 데이터를 뽑기로 결심했는데, 얼래...

구버전의 데이터가 거의 그대로 libfat에 살아있었다.

얼쑤~!!! @0@)/~~

이런 대박이~!!!

쫌만 손보면 간단히 라이브러리 정도는 만들 수 있겠다.

앗싸~ 좋구나~ >ㅁ<)/~!!!!
아침(??)에 일어나니 두통이 와서... 학교를 갈까 말까 고민하다가...

결국 개보린 한알을 먹고 학교로 출발했는데....

학교 쪽문에 도착하니, 후배가 전화가 와서... 수업이 끝났다더라... ㅡ_ㅡa....

그래서 그대로 환승해서 다시 돌아왔다는... ㅜ_ㅜ...

크윽... 좋구로... ㅋㅋㅋ
쿨럭..;;; 처음에 후배가 준 라이브러리를 그냥 사용했다가 접속이 안되는 낭패를 겪고...

혹시나 해서 새로 컴파일한 후 사용하니 나름 괜찮게 동작했다.

하지만 역시나... 약간 불안정하고 간혹 먹통이 되는 상황이 생겨서 이거 원.... ㅡ_ㅡ;;;;;

한참을 테스트 하다보니

얼래??

이번에는 AP 쪽에서 내 접속을 막았나 보다.

AP 관리자 한테 가서 다시 열어달라 그래야지... ㅜ_ㅜ

아아... 역시나 아직 동작이 좀 불안하구나... ㅜ_ㅜ...
NDS 과제를 하는 후배가 발견했던데, 지난달(9월)에 릴리즈된 버전이란다.

후배 말로는 AP 랑 접속해서 통신이 잘된다 그러던데...

정말 그렇다면 완전 감동이 아닐 수 없다. @0@)/~~

시간나면 테스트를 한번 해봐야 할듯...

앗싸~ 좋구나~ >ㅁ<)/~

dswifi-src-0.3.3.zip
요즘 MP3 Decoder에 열을 올리고 있는지라...... 오늘도 어김없이 포기 못하고 소스를 뒤지고 있었다.

Helix 라는 녀석이 자꾸 눈이가길래... 이걸로 해보자 싶어서 삽질을 계속하다가 결국 올렸다.

이제 실제로 사용해서 Play가 되는지 확인하는 길만 남았는데....

학교를 가야하는 관계로 갔다와서 해야겠다...

아놔... thumb 모드로 코드가 컴파일 되게 해놨더니만 arm 모드 명령에서 자꾸 에러가 발생하는 걸 제대로 이해 못해서... ㅜ_ㅜ...

또 하루종일 삽질했다는... ㅜ_ㅜ...

내가 미쵸.... ㅜ_ㅜ...
크아~ 오늘까지 약 4일간의 노력으로 윈도우 라이브러리 및 윈도우 프로토타입, 그리고 목표로 했던 File Explorer까지 대충 완성했다.

어제 디렉토리 네비게이션을 제대로 못해서 한참을 삽질했는데... diropen() 이란 이름으로 되어있을줄은... ㅡ_ㅡ;;;;

덕분에 libfat를 제대로 뒤져가면서 분석했다. 나름 깔끔하게 잘 만들었두만...

윈도우 라이브러리는 좀더 정리한 다음 lib 파일로 공개해야겠다.

아래는 덤으로 만든 텍스트 뷰어 클래스와 리스트 클래스를 이용한 텍스트 뷰어 윈도우와와 File Explorer 이다.

각자가 윈도우로 구성되어있다.
사용자 삽입 이미지 사용자 삽입 이미지 사용자 삽입 이미지

오늘도 역시나 열심히 NDS용 그래픽 라이브러리를 손보다가 문득 지난번에 만들어 놓은 고속 복사 함수를 적용시켜보면 어떨까 하는 생각이 들어서 LDMIA, STMIA 함수를 이용해서 메모리를 전송하는 소스를 넣어봤다.

LCD의 해상도고 256 * 192 이고 한 점이 2Byte로 구성되므로 총 98304 Byte, 즉 96 KByte가 되는데 이것을 memcpy()로 복사하니 대략 7 ~ 8 ms 정도가 걸렸다.

이것을 내가 만든 함수로 교체하니 4 ms 로 줄어들었다. @0@)/~

덕분에 약간의 속도 향상이... ㅜ_ㅜ...

아아~ 아직 죽지 않았어.. ㅜ_ㅜ....

오늘 어찌하다가 집에 가지 못해서... 어제 하던 윈도우 시스템이나 마저 손볼려고 코드를 열었다.

그때가 11시쯤이었던가... 지금이 7시니까 대충 8시간쯤 삽질했네...

뭐 그래도 소득은 있으니까... ㅎㅎ

BitBlt 기능을 DC에 추가해서 윈도우에 스킨 입히는 작업과 NDS에서 사용하기위한 그래픽 포맷(Kkamagui Nds Graphic - KNG)을 대충 만들고 변환해주는 프로그램을 만들었다.

그리고 윈도우가 많아져서 깜빡임이 심해지는 걸 느끼고 내친김에 더블 버퍼링까지...

하드코어로 작업했기 때문에 속도가 그리 빠른 편은 아니지만... 그래도 얼추 쓸만은 하다.

아래는 스크린 샷...

사용자 삽입 이미지


ps) 아까 아는 형이 좀 쉬라고 하던데... 이것도 병이라고... ㅡ_ㅡ;;;

정말 그런듯... 왠지 허접한 기기만 보면 기능 확장하고 싶은 충동이... ㅜ_ㅜ...

프로그래머가 천직인가....

NDS에 쉘을 만들어보려고 고민하던중에, KKAMAGUI Notepad 프로그램을 만들면서 썼던 허접 윈도우 라이브러리를 사용하면 쉽게 개발할 수 있을 듯한 생각이 들었다.

어디까지 구현한지 가물가물해서 소스를 뒤지고 있는데...

얼래... ㅡ_ㅡ;;; 거의 구현 안되어있는 것과 마찬가지....

노트패드 기능 구현한다고 윈도우 껍데기나 겨우 만들어 놓은 상태랄까...

클립핑 처리는 전혀 안되있고.... ㅡ_ㅡ;;;

그래서 일단 클립핑부터 시작했는데, 이게 장난이 아니더라....

구글링해서 찾은 알고리즘은 제대로 동작안해서 또 삽질하고... ㅜ_ㅜ...

우의곡절끝에 겨우 0.1 버전을 완성할 수 있었다.

기능은 클립핑 처리 + 윈도우 Z Order 지원 + 터치스크린을 이용한 윈도우 이동 및 종료 등등이다.

내일은 좀더 손봐서 PNG 파일 포맷을 읽어 표시할 수 있도록 해야겠다.

사용자 삽입 이미지
NDS의 윈도우 라이브러리를 손보려고 코드를 고치다가...

얼래... 잘되던 코드가 안되는 문제를 발견했다.

한참을 디버깅하다가... 코드의 순서를 살짝 바꾸니 이상한 데이터가 덤프되는 것을 발견하고...

Optimazation 할때 스택쪽에 문제가 생기거나 Register를 잘못 사용하고 있는 것이 아닌가 추측...

옵션을 O2에서 O1으로 낮춘 다음 전부 다시 컴파일하여 실행하니....

아무 문제 없이 실행되었다 @0@)/!!!!!

이런... ㅜ_ㅜ... 내 시간 돌려도.. ㅜ_ㅜ
여자친구가 생일선물을 해준다고 하길래 PSP를 중고로 사달라고 할까 고민하다가 이미 NDS를 가지고 있는지라 쓰지 않을 것 같은 생각이 들었다.

그래서 그냥 NDS에 메모리나 더 꼽을까 하고 G 마켓을 뒤졌는데...

어라? 왠 확장팩이 나왔다. 3 in 1 Expansion Pack for EZ-Flash라는 물건인데, 진동 + 메모리 확장 + GBA 팩 기능까지 하는 모양이다.

좀더 확실히 알기위해서 구글 형께 부탁했더니 아래와 같은 사이트를 보여줬다.

http://wiki.gbatemp.net/index.php?title=3_in_1_Expansion_Pack_for_EZ-Flash_V

사용자 삽입 이미지

뭐 진동이나 GBA를 할 수 있다는 그런건 별로 안땡기고... 램을 확장할 수 있는 점이 홈브루를 개발하는 나에게 가장 큰 장점인듯....

과연 얼마나 확장될까? 위의 사이트에 따르면...
  • 256 Mb (32 MB) of NOR Flash Memory. This type of memory is able to retain data without requiring uninterrupted power. Depending on data size, writing may take up to several minutes. One typical use includes copying over a GBA ROM, thereby allowing the 3-in-1 to act like a real GBA cartridge.
  • 128 Mb (16 MB) of PSRAM. This memory does not retain data when the power is turned off. However it can be written at speeds much faster than NOR memory.
  • 4 Mb (512 KB) of battery backed SRAM for save data. The battery is necessary to retain data.
  • Programmable embedded "rumble pak" (haptic feedback) device

무려 16MByte @0@)/~!!!

NDS 자체의 램이 4MByte 정도니까 합이 20MByte @0@)/~!!!!!

두둥... PSP가 32MByte인 것을 감안할 때 굉장한 붐업이다...

ㅜ_ㅜ... 당장 질러서 테스트 프로그램이나 하나 만들어봐야겠다...

다들 기대하시라 ㅎㅎ

>ㅁ<)/~!!!

이럴수가... 다시 재발했다.. @0@)/~

예전보다야 나아졌지만 화면 우측에 필기를 하면 튀는 현상이 생긴다.

이렇게 되면 결국 Z 축(누르는 압력)을 이용해서 계산하는 수 밖에 없는데....

결국 쓰긴 써야하나....


터치 스크린에 어중간한 압력이 들어갔을 때, 엄한 값이 나오는듯 한데...

세게 눌러서 필기를 하면 괜찮은 것 보니....

아우... 머리야... 또 수정해야겠군....
크윽... 얼마전까지 Vendor Request를 통해 데이터를 주고받는게 가장 간단하다고 생각하고 있었다.

그래서 드라이버를 뚝딱뚝딱 만들고 펌웨어 올리고 이렇게 작업해서 갔더니만... 오늘 선배가 HID Firmware하고 Report 패킷을 이용해서 데이터를 주고받는 프로그램을 만들었고.. ㅜ_ㅜ

어흑... 이런이런... 낭패...
난 왜 그생각을 못했을까....

이런 삽질.. ㅜ_ㅜ
LCD와 Graphic에 관련된 Power는 ARM 9에서도 건드릴 수 있었는데...

전체적인 System의 Power 관리(LED 포함)는 SPI를 이용해서 Power Management Device로 전송해야 한다...

아래는 SPI에 관한 내용... ARM 7을 통해서만 가능...

http://nocash.emubase.de/gbatek.htm#dsserialperipheralinterfacebusspi


아래는 Power Device에 관한 내용...
LED 색깔 바꾸는거, 깜박이는거... Shutdown 하는거 등등 가능...
http://nocash.emubase.de/gbatek.htm#dspowermanagement

시간나면 해봐야 겠다.

basicARM7 코드가 굉장히 간단하게 되어있던데...
소스를 얼핏 보니까 LCD의 HSync Interrupt를 받아서 Touch의 값을 읽도록 되어있었다.
혹시 이것때문에 LCD의 값이 튀는게 아닐까?
Touch의 Interrupt를 받아서 값을 읽으면 더 나을수도.... ㅡ_ㅡa...

일단 생각해 보자...
한 4일 뚝딱뚝딱했더니 Vendor request 명령을 통해 보드와 데이터를
주고받을 수 있는 드라이버/펌웨어 세트가 완성됬다.

@0@)/~ 뭐 DDK의 Bulk 드라이버와 FX2LP의 BulkLoop 예제를 기반으로
Vendor Request를 살짝 추가했더니

별 무리없이 실행되고.. ㅜ_ㅜ...

크윽... 이거 너무 감동이잖아... ㅜ_ㅜ
크윽... 진짜 안습이다...

펌웨어 코드를 조금 이해하고 드라이버를 짤려고 봤더니...
이게 훨~~씬 더 복잡하다.... ㅡ_ㅡa...

난 그냥 Vendor Request만 주고 받으면 되는데...
뭔가 기절할듯하게 복잡한.....

bulkdriver를 수정해서 그냥 Device Io Control만 수정해 버릴까....
아님.. 그냥 다 삭제하고 Device Io Control만 넣을까....

크윽.. 참으로 고민된다... 아따 기절하긋네... ㅜ_ㅜ

아우... 천지.. 꼽으니까 DVB-T 어쩌구 장치로 인식하고... ㅠ_ㅠ

결국 !!!

Registry에서 VID_04B4에 해당하는 모든 키 삭제
DVB-T에 관련된 모든 INF 파일 삭제


다시 드라이버 설정할때 관련 드라이버있음으로 설치해서
겨우 잡았다.

아우 눈물나네.. ㅠ_ㅠ
아놔... 뭔가 했더니 천지... Endian 문제로 장치의 VID하고 PID가 잘못 인식된거였고...

결국 소스에서 descriptor를 고쳐서 다시 올렸는데...
이상하게 계속 인식된 VID와 PID는 옛날껄로 고정.... ㅡ_ㅡa..

어디엔가 기록이 남아있는거 같다...
그래서 결국 INF 파일을 수정하는걸로 대체....

해냈다.. @0@)/~
아놔.. 왜이렇게 해매는것이 많아.. ㅡ_ㅡa...
쿠옷~!! 그렇다는 말은 EndPoint 0만 가지고도 간단한 통신을 할 수 있다는 말 @0@)/~~

이거 상당히 괜찮은데... 어차피 지금 할 것이
전화번호 정보랑 약간의 데이터를 주고 받으면 되는거라서...

이렇게 되면 이정도 데이터는 그냥 EndPoint 0를 이용하면 되겠다.

@0@)/~~ 크옷~!! 이것 참 멋진데 ㅎㅎㅎ >ㅁ<)/~~~
http://muosys.egloos.com

구매한 보드에 대한 레퍼런스 사이트
대단하다... 이미지 돌리기부터 해서 확대... 축소 같은 기능도 구현되어있다.. @0@)/~

이거라면 데이터 시트 같은 것도 NDS에 넣어 다니면서 볼 수 있겠던데....

크윽... 너무 좋은거 아냐.. ㅜ_ㅜ...
크아... libfat Library에 버그를 발견했다.

첫번째 버그는 파일을 열자마자 fseek()로 제일 처음으로 이동한다음, 다시 fseek()로
제일 마지막으로 옮겨간 후, write를 하면 정상적으로 write가 되지 않는 버그이고...

다른 한가지는 파일 끝에서 데이터를 쓰면 파일이 커지긴 하는데 쓰레기 데이터가
채워져서 커지는 버그이다.

일단 이 릴리즈 전버전으로 해서 다시 테스트 해보고 소스를 수정하던지...
아님 짜던지 해야겠다. ㅜ_ㅜ

아놔... 오늘도 하루를 다 날렸네.. ㅜ_ㅜ

+ Recent posts