stm32f05xx CRC

Embedded/펌웨어? 2019. 4. 16. 14:12

내부 CRC 사용

CRC32/MPEG-2 방식

 

소스)

 

- 함수

uint32_t crc_compute(uint32_t * start_addr, uint32_t size)

{

    uint32_t crc_code;

    uint32_t i = 0;

 

    // Enable CRC

    __HAL_RCC_CRC_CLK_ENABLE();

 

    CRC->CR |= CRC_CR_RESET;

 

    while(i < size)

    {

        CRC->DR = start_addr[i];

        i++;

    }

 

    crc_code = CRC->DR;

 

    // Disable CRC

    __HAL_RCC_CRC_CLK_DISABLE();

 

    return crc_code;

}

 

 

- 사용

    uint32_t tbuf[2] = {0x1A2B3C4D, 0x1A2B3C4D};

 

    tempp = crc_compute(&tbuf, 2);

 

 

    -->tempp = 0xF7461111

 

 

 

https://crccalc.com/

'Embedded > 펌웨어?' 카테고리의 다른 글

ST-link v2 readout protection (RDP) 설정  (0) 2022.12.05
USBISP-MK2 Manual  (0) 2020.06.16
C 예제) AES-128 ECB  (1) 2019.06.10

설정

트랙백

댓글

LED 저항 값 계산

Embedded/회로기초 2018. 7. 25. 10:59


회로에서 LED나 부저등등 전압이나 전류에 맞게 저항을 달게된다.


아래 예제를 통해 저항을 계산해본다.




직렬에서 전체 전류값은 동일, 전압값은 바뀜


D1 에 2V, 10mA가 흐른다고 치면

(통상 LED들은 2V에 5~20mA를 사용)


R1 에 3V, 10mA가 흘러야하니


V = I R 공식에 의해서


3 = 0.01 * R1


R1 = 3 / 0.01


R1 = 300 Ω



이렇게 저항 값을 구할 수 있다.


설정

트랙백

댓글

Nuvoton LED 켜기 및 다운로드 셋팅

Embedded/Nuvoton 2018. 6. 25. 19:48

저번 시간까지는 기본 소스 준비까지 했고


이번에는 연습용 보드에 LED를 켜고 꺼볼 것이다.



1. 소스 작성



GPIO1 이라고 적힌 LED를 제어할 것인데 P1.2 핀과 연결되어 있다.


아직 허접이라서 ATmega128 계열과 PIC16F.... 시리즈 몇 개만 만져보고


8bit MCU 별거 있겠나 하고 봤더니.... GG.


포스팅 끝내겠습니다. 감사합니다.




하고 싶었지만 LED 제어만 하고 접기로 마음을 다시 먹었다.ㅠㅠ


데이터시트에 Pin 배열과 I/O 제어를 보았다.



- Pin 배열


위 그림처럼 핀 배열이 되어 있고


저기 13번 Pin에 P1.2 가 보인다!!





- I/O Port Structure and Operation 파트



와우 쏼라쏼라~  나는 친절한 구글번역기를 좋아한다.


어라? Quasi-bidirectional 모드???? 뭔 처음 보는 모드이다.


밑에 설명을 보니 Input도 되고 Output도 되기도 하는 모드라고 한다.


자세한건 친절한 구글번역기에 복붙.....


우선 LED 제어에는 Push-pull 만 사용하면 되니, 통과ㅋㅋㅋㅋ






High, Low 신호는 P1 Register를 사용하면 된다.







P1M1 과 P1M2 에 위의 표를 참고하여 Register를 설정하면 된다.






이제 본 소스


#include "Include\N76E003.h"


void main()

{

volatile unsigned int vuiCount;        // 시간 지연용 변수

P1M1 = 0x00;

P1M2 = 0x04;

P12 = 0;

for(vuiCount=0; vuiCount<60000; vuiCount++);    // 시간 지연

while(1)

{

P12 = 1;

for(vuiCount=0; vuiCount<60000; vuiCount++);    // 시간 지연

P12 = 0;

for(vuiCount=0; vuiCount<60000; vuiCount++);    // 시간 지연

}

}



컴파일 후, 


다운로드를 해야하는데, 그 전에 설정을 해야한다.







전 포스팅에서 Keil 용 Driver를 설치 했다면 위와 같이 뜰 것이다.







다운로드 누르면 완료!!








LED 켰으면 게임 끝 아닙니까?ㅋㅋㅋㅋ


예제 소스도 제공해 주니 이제 마음껏 주물럭 주물럭 하자!!



'Embedded > Nuvoton' 카테고리의 다른 글

Nuvoton 시작(설치 및 셋팅)  (0) 2018.06.20

설정

트랙백

댓글

Nuvoton 시작(설치 및 셋팅)

Embedded/Nuvoton 2018. 6. 20. 21:54

이번에 Nuvoton을 다루게 되었다.


모델은 N76E003 으로 8051 계열이다.


처음으로 8051 계열을 접하게 되어서 할 수 있을랑가 모르것다...;;


모르니 그냥 맨땅에 헤딩이지ㅋㅋㅋㅋ


그럼 ㄱㄱ






--- 준비물



 - NuTiny-SDK-N76E003 V2.0 보드 1개

 - Nu-LINK-PRO 1개






1. 컴파일러 설치


Nuvoton에서 지원하는 컴파일러는 총 4가지로



- Keil  :  부분유료? Hex 파일이 2Kbyte? 까지만 무료로 사용 가능하다고 한다

           내가 검색 능력이 딸려서 그런가 정확하게는 못 찾았다.


- IAR  :  유료라고 한다.

- CooCox  : 무료다!! 그런데 사이트 접속이 안된다... 나만 안되나.. 서버 닫았나..?


- Rowley Associates  :  왠지 처음보는 이름이라 무료인줄 알고 설치 후, 사이트 여기저기를 휘젓다가

                              유료라고 적혀 있길래 지웠다.




--> 그래서 테스트용이니 Keil 설치.








위에 두개를 받아서 설치








2. uVision 실행 후, 새 프로젝트 생성










3. 적당한 위치에 프로젝트 저장










4. 타겟 디바이스 선택




 - Legacy Device Database 선택하고

 - N76E003 모델을 사용하니 이 모델 선택하고

 - Use Extended .... 이건 모르니 우선 패스ㅋㅋㅋㅋㅋ

 - OK 굿.






5. Ok ㄱㄱ



스타트 어셈 파일인듯...







6. main.c 생성







오 드뎌 소스 작성할 수 있다!!








7. 헤더파일 및 샘플 코드


www.nuvoton.com 사이트에 들어가서 해당 제품에 Resources를 들어가 보면 아래와 같이



뜬다. 위에 3개를 다 받자.


첫번째 것은 N76E003 데이터시트로 이 놈의 사용법이 다 적혀있지...


두번째 것은 헤더파일이랑 샘플이 있다.


세번째 것은 Keil에서 Nu-Link로 바로 연결되게하는 드라이버인 듯 하다.



(밑에 2개도 받아야되나.... 우선 패스ㅋㅋㅋ)




- N76E003_BSP_Keil_C51_V1.0.5 를 받아 압축을 풀면 아래와 같은 목록이 뜬다





Include만 복사해서 연습 프로젝트 폴더에 붙여 넣자!











8. 코딩 ㄱㄱ




좀 어렵겠지만 코딩을 하고 Build 를 하면 끝ㅋ


#include "Include\N76E003.h"


void main()

{

while(1)

{

}

}







다음은 LED 하나를 켜봐야겠다.







'Embedded > Nuvoton' 카테고리의 다른 글

Nuvoton LED 켜기 및 다운로드 셋팅  (0) 2018.06.25

설정

트랙백

댓글

arm 내장 함수

잡다 2015. 1. 19. 16:22

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0348bk/CIHEGGAJ.html

 

 

 

'잡다' 카테고리의 다른 글

전원 설계 관련 사이트  (0) 2019.09.09
stm32F10x Standard Peripherals Library  (0) 2015.01.12
PCB 설계/제작/조립 관련 사이트  (0) 2014.10.27
C++ Reference, Pointer  (0) 2014.10.13
microangel 마우스 커서, 아이콘 제작 툴  (0) 2014.09.16

설정

트랙백

댓글

gcc 라이브러리 옵션

Linux 2015. 1. 15. 11:32

표준 라이브러리에 존재하지 않는 함수들을 컴파일해야 할 때, (예로 쓰레드 관련 함수) 이럴 때에는 -l 옵션을 주면 된다. 아래의 명령은 쓰레드 관련 컴파일한다는 가정하의 명령이다.

 

#gcc -o thread thread.c -lpthread

 

쓰레드 생성시 pthread 라이브러리를 포함해야하므로 -lpthread 옵션을 추가했다. 시스템 라이브러리 이름 지정은 공통적인 이름인 lib 과 .a 확장자를 제외한 나머지만 지정한다. -lpthread 는 -llibpthread.a 와 같은 명령이다. 즉 lib과 .a를 생략해도 알아서 컴파일러에서 처리한다는 의미이다.

 

-l 명령을 주면 시스템 라이브러리 파일 저장 디렉토리 (/lib, /usr/lib, /usr/local/lib) 로부터 이름을 지정한 라이브러리 파일 (위의 경우 libpthread.a) 을 찾아서 링크한다. 만약, 링크하고자 하는 라이브러리가 다른 디렉토리에 존재한다면 별도의 경로를 지정해주어야 한다. 그 경우 주는 옵션은 -L 이다. 아래의 명령은 현재 경로(.)에 존재하는 라이브러리 파일 libmylibfile.a 를 지정해주는 명령이다.

 

#gcc -o libtest libtest.c -lmylibfile -L.

'Linux' 카테고리의 다른 글

Unix system programming  (0) 2014.09.01
ANSI Color Codes  (0) 2014.05.19

설정

트랙백

댓글

stm32F10x Standard Peripherals Library

잡다 2015. 1. 12. 17:21

http://stm32.kosyak.info/doc/index.html

'잡다' 카테고리의 다른 글

전원 설계 관련 사이트  (0) 2019.09.09
arm 내장 함수  (0) 2015.01.19
PCB 설계/제작/조립 관련 사이트  (0) 2014.10.27
C++ Reference, Pointer  (0) 2014.10.13
microangel 마우스 커서, 아이콘 제작 툴  (0) 2014.09.16

설정

트랙백

댓글

임시

Embedded/USB 2014. 12. 22. 19:09

ㄴㅇㅁㄴㅇ

 

USB 정리.zip

 

'Embedded > USB' 카테고리의 다른 글

usb 개발시 참고할 만한 사이트  (2) 2014.12.18
USB Descriptor 정의  (0) 2014.12.17
USB 관련 강좌  (0) 2014.12.11
USB Descriptor 종류  (0) 2014.12.11
다양한 시리얼 통신  (0) 2014.12.11

설정

트랙백

댓글

usb 개발시 참고할 만한 사이트

Embedded/USB 2014. 12. 18. 22:30

[ USB Speciation v1.1, v2.0 ]


USB ORG - USB 개발자라면 한번씩 가보고 관련자료를 찾아볼수 있음.

http://www.usb.org


USB 스펙 영문 사이트 - OTG나 유용한 자료가 많이 있으니 함 가보세요.

http://www.beyondlogic.org


USB 스펙 한글 사이트

http://www.surym.pe.kr/swiki/wiki.php/USBSPEC


 

[ USB 관련 개발자 및 회사 사이트 ]


한국 시스템 프로그래머 사이트라고 합니다. - 디바이스 드라이버 관련 세미나를 합니다.

http://www.kosr.org/


 

하제소프트 - 유명한 곳이죠, 이봉석 대표-요즘은 WinCE쪽으로 많이 하시는것 같네요.

http://www.hajesoft.co.kr/


 

데브구루 - PC측 디바이스 드라이버 전문회사라고 하네요.(제가 devpia랑 무슨 관련이 있냐고 물으니, 왈 "아무관련없슴다."^^;)

http://www.devguru.co.kr


 

디바이스 온라인 - 데브구루에서 운영하는 디바이스드라이버 개발자 커뮤니티

http://www.driveronline.org


 

허브넷 - 개발자 두분이 운영하시는 곳 같네요.

http://www.hybtech.co.kr/


샘플칩 - 이곳도 USB전문이라고 하여 오랫동안 했다고 하네요. AVR+PDIUSBD12 칩으로 EVM보드판매 및 교육도 합니다.

http://www.samplechip.co.kr



 

이하는 devguru사이트에 있는 참고사이트를 가져온 것입니다.

링크하면 언제 서버에서 사라질지 알지 못하는 관계로 이곳에 직접 실었습니다.

저작권(?)에 문제가 있다면 알려주세염. 그러나 대부분 PC측 디바이스 드라이버 관련 내용임.

USB 디바이스 드라이버 제작하려면 뭐, 알아둬야 되는데... 흠.. 넘 방대한 지식이 필요한가염?


 

MS 공식 드라이버 개발 사이트  - MSDN 참 방대한 데이타가 있습니다. 영어에 좀만 용기를 갖는다면, 내집드나들듯이 다녀야겠죠.^^;
http://www.microsoft.com/whdc


설명:  Windows Platform Development Window Device Driver 개발을 위한
공식 사이트.  Windows Device Driver 개발자들에게 필요한 자료가 많이 있음.


System Internals 
http://www.sysinternals.com
설명: Windows 9x 와 Windows NT/2K 내부에 관한 정보를 가진 사이트. Device Driver
관련 소스코드와 기술문서가 많고, Driver 관련 유틸리티도 무료로 배포한다.
 
NT Kernel Resources 
http://www.ntkernel.com
설명: Windows Kernel 에 대한 여러가지 문서및 유틸리티 프로그램이 제공
 
Windows Driver Developer’s Digest
http://www.WD-3.com
설명: Walter Oney 가 편집장으로 있고, Windows Driver Programming 에 관한
기사를 다룬다.
 
OSR Online
http://www.osronline.com
설명: OSR 에서 만드는 Windows Device Driver 개발 사이트
드라이버 개발에 관한 풍부한 자료가 있다. 


Windows Driver Development news group
http://msdn.microsoft.com/newsgroups/default.aspx?dg=microsoft.public.development.device.drivers
설명: 전반적인 Windows 드라이버 개발에 관한 뉴스 그룹
 
OSR Hosted Newsgroups
http://www.osronline.com/page.cfm?name=ListServer
설명: 일반적인 드라이버 개발, 파일 시스템 드라이버 개발, WinDbg 들에 관한 게시판 ,
회원 가입 후. 사용 가능함
 
Designed for Windows" Logo Program newsgroup
http://msdn.microsoft.com/newsgroups/default.aspx?dg=microsoft.public.windowsxp.winlogo
설명: Designed for Windows" Logo 인증에 관한 뉴스 그룹
 
Debug Tools for Windows newsgroup
http://msdn.microsoft.com/newsgroups/default.aspx?dg=microsoft.public.windbg
설명: WinDbg 디버깅 툴에 관한 뉴스 그룹
 
VxD Driver Development newsgroup
http://groups.google.co.kr/groups?hl=ko&lr=&ie=UTF-8&oe=UTF-8&newwindow=1&group=comp.os.ms-windows.programmer.vxd
설명: OSR 에서 만드는 Windows Device Driver 개발 사이트
드라이버 개발에 관한 풍부한 자료가 있다. 
 
NTFS.com
http://www.ntfs.com/
설명: Ntfs , FAT 등의 File System 관련 자료가 있음
 
Bo Branten's website
http://www.acc.umu.se/~bosse/
설명: Filte System Driver 개발에 필요한 여러가지 정보가 있는 사이트.
ntifs.h 도 있음
 
PCAUSA
http://www.pcausa.com/
설명:  Network driver 개발에 관한 풍부한 자료가 있는 사이트
 
Wincap
http://winpcap.polito.it/
설명: Windows 에서 network packet 를 캡쳐하거나 분석하기 위한 open source
라이브러리
 
Jan Axelson's Lakeview Research - USB Complete를 쓴 유명한 사람이죠.
http://www.lvr.com
설명: embedded systems, USB, parallel port, and RS-232 and RS-485 serial 에
관한 자료가 있음
 
PS/2 Mouse/Keyboard Interface
http://www.computer-engineering.org/
설명: PS/2 Mouse/Keyboard Interface 의 설명 및 Protocol 설명 


ATA (IDE/EIDE), Serial ATA (SATA), ATAPI
http://www.ata-atapi.com/
설명: ATA 와 ATAPI interfaces 에 관한 자료가 있는 사이트  Internals


http://www.internals.com/
설명: Windows 9x/NT/2K 내부의 Undocumented 한 내용이 있는 사이트
 
Iczelion's Win32 Assembly Homepage
http://spiff.tripnet.se/~iczelion
설명: Windows Assembly 자료가 풍부한 사이트
 
Microprocessor Resources
http://www.x86.org
설명: DDJ Magazine 의 Microprocessor 자료
 
ReactOS
http://www.reactos.com/
설명: Windows NT 계열의 O/S 와 호환성을 가지는 O/S 만드는 Open Source
개발사이트
 
Codeguru 사이트의 system 관련자료 - 제가 VC++ MFC 하면서 자주 다니며 도움을 얻는 곳입니당.
http://www.codeguru.com/system/
설명: 직접 사용할 수 있는 시스템 관련 소스 및 유틸리티

 

 

 

출처 : http://hasu0707.tistory.com/220

'Embedded > USB' 카테고리의 다른 글

임시  (0) 2014.12.22
USB Descriptor 정의  (0) 2014.12.17
USB 관련 강좌  (0) 2014.12.11
USB Descriptor 종류  (0) 2014.12.11
다양한 시리얼 통신  (0) 2014.12.11

설정

트랙백

댓글

윈도우즈 디바이스 드라이버 개발 방법

프로그래밍 언어/WinApi 2014. 12. 18. 21:52

윈도우즈 디바이스 드라이버 개발 방법

디바이스 드라이버 개발을 처음 시작하시는 분들이 가장 많이 하시는 질문은 “ 디바이스 드라이버를 개발하려면 무엇을 어떻게 공부해야 하나요 ? 라는 것이다 .

 

일반 애플리케이션 프로그램 개발을 시작하는 경우에는 자료도 많고 , 주변에 개발자들도 많아서 공부 방법이나 자료들을 쉽게 접할 수 있는데 , 디바이스 드라이버 분야는 개발자들이 많은 분야도 아니고 , 자료도 쉽게 찾을 수도 없다 보니 입문자들에게는 어디서부터 어떻게 시작해야 할지 막막해 한다 . 간혹, 디바이스 드라이버에 열정이 있으신 분들중에는 홀로 무수한 나날을 디버깅과 테스트를 통해 개발의 고수가 되는 경우도 있다.

하지만 , 일반 개발자들은 아직도 디바이스 드라이버 개발을 위해 어떻게 준비를 해야 할지 어려워하는게 현실이다. 그래서 이런 컬럼 에서는 필자가 그 동안 경험하고 느낀 것을 토대로 초보자들도 쉽게 접근할 수 있는  개발 방법들을 소개하려고 한다 .

우선 , 디바이스 드라이버 개발 방법의 내용을 언급하기 전에 여러분이 한 가지 알아두어야 할 사항이 있다 . 이전 1 부 컬럼 에서도 언급했듯이 디바이스 드라이버와 운영체제는 서로 밀접한 관계를 맺고 있다 . 그래서 이번 컬럼에서 다루는 윈도우 디바이스 드라이버 개발 방법이 다른 운영체제들에도 동일하게 적용되지 않을 수도 있다는 것을 참고해서 글의 내용을 이해했으면 한다 .

1. 무엇을 공부해야 하나 ?
응용프로그램 , 웹 프로그래밍 , 게임 등의 프로그램들처럼 디바이스 드라이버도 소프트웨어의 한 종류로 볼 수 있다 . 그래서 일반적인 대학교의 컴퓨터 학과들에서 배우는 알고리즘 , 운영체제 , 프로그래밍 언어 , 자료구조 , 컴파일러 등등의 다양한 지식들을 기본적으로 알고 있는 것은 디바이스 드라이버를 공부하는데 하는데 많은 도움이 된다 .

하지만 , 이런 기본적인 내용들 이외에 디바이스 드라이버를 개발하기 위해서 좀 더 알아야 할 지식들이 있다 . 그 내용들에 대해서 간략히 살펴보도록 하자 .

운영체제 아키텍처 : 다른 프로그램들도 마찬가지겠지만 , 프로그램이 동작하는 기반이 되는 운영체제를 이해하지 않고서는 제대로 된 프로그램을 개발 할 수가 없다 . 그 중에서도 디바이스 드라이버는 운영체제의 커널에서 동작 하므로, 운영체제 구조 및 개념들 ( 메모리 관리 , 스케줄링 , I/O 요청의 흐름 , 동기화 등등 ) 을 제대로 이해해야 개발하는데 문제가 없게 있게 된다 . 하지만 , 윈도우는 리눅스와 같은 Open Source 운영체제가 아니고, 내부 구조가  블랙박스처럼 베일에 싸여 있다보니,  O/S 내부 내용을 공부 하려해도 항상 정확한 자료들을 가지고 아니어서 이해하는데 많은 어려움이 있다. 그래서, 이런 경우엔  직접 디버깅을 통해 알아내야 하는데, 이런 부분은 윈도우 운영체제를 이해하는데 어렵게 하는 부분이 되고 있다.

Windows Shared Source programs

( http://www.microsoft.com/resources/sharedsource/Licensing/default.mspx )

Microsoft 에서는 윈도우 소스코드를 공유하는 “ Windows Shared Source programs 제도를 운영하고 있다 . 이 프로그램에 참여방법은 여러 가지 방법이 있는데, 그 중에 Microsoft MVP 자격으로 참여해 볼 수 있는 형태가 있다.  관심 있는 분들은 MVP 에 도전해 보길 바란다.  

•  컴퓨터 구조 및 CPU 아키텍처 : 운영체제 아키텍처를 이해하기 위해서는 먼저 컴퓨터 구조나 CPU 아키텍처의 이해가 필요하다 . 즉 , 넓은 의미로 운영체제도 CPU 및 컴퓨터 구조 기반 위에서 작동하는 프로그램이기 때문에 CPU 및 컴퓨터의 구조를 이해하는 것은 기본 중에 기본이다 . 그래서 기본적인 CPU 동작원리라던지 컴퓨터의 내부 구조에 대한 지식은 운영체제 및 드라이버를 이해하는데 필요하다.

•  C/C++ 언어 : 많이 질문하시는 내용 중에 “ 디바이스 드라이버는 어떤 언어로 개발하나요 ? ” 가 있다 . 윈도우 디바이스 드라이버 개발 시에는 C/C++ 언어 정도를 이해한다면 개발하는데 무리는 없다 . 그리고 , 가끔 디버깅 (Debugging) 이나 리버스 엔지니어링 (Reverse Engineering) 이 필요한 경우에 어셈블리 언어 (Assembly) 의 지식이 필요하다. 그렇다고 어셈블리 언어를 완벽한 이해해야 하는것은 아니다. 대신 남의 코드를 디버깅하는 경우 소스 코드가 어셈블리 코드로 보여 내용을 보고 분석할 줄 알아야 하는데 이때 간단히 코드를 보고 이해할 수 있을 정도의 지식이면 된다.

•  API 프로그래밍 : 디바이스 드라이버는 누군가의 요청에 의해 기능을 하게 된다 . 사용자가 GUI 를 가진 애플리케이션을 통해 I/O 요청을 하면 디바이스 드라이버가 해당 작업을 하게 되고 , 결과는 다시 애플리케이션에게 전달되는 구조를 가진다.  이처럼 디바이스 드라이버는 애플리케이션과 항상 상호작용을 한다.
그래서, API 프로그래밍을 공부할때는 단순 API 사용법의 내용이 아닌 디바이스 드라이버와 애플리케이션 사이의 통신 및 전체 I/O 구조에 대한 내용을 중심으로 공부하길 바라며 이 부분은 추후에 드라이버를 공부하는데도 많은 도움이 된다.

•  H/W 지식 : 디바이스 드라이버는 소프트웨어와 하드웨어 사이에 중간의 다리역할을 하는 프로그램이라 볼 수 있다 . 이러다 보니 디바이스 드라이버를 작성하기 위해서는 소프트웨어 지식 뿐만 아니라 , 하드웨어적인 지식도 필요로 하게 된다. 그렇다고 H/W 스펙의 전기적인 내용이나 물리적인 회로등의 이해를 요구하는 것은 아니다. 대신. 기본적인 H/W 스펙 문서에 나와있는 용어라던지 통신 프로토콜등에 대해 먼저 이해하기 바라며, 드라이버에서 사용되는 H/W 관련 개념들도 같이 공부하길 바란다.  

•  디바이스 드라이버 모델 : 윈도우에서는 디바이스 드라이버를 어떤 방식으로 개발하라는 드라이버 모델들을 제시하고 있으며, 이 모델들을 이용해 드라이버를 좀 더 쉽게 개발할 수 있게 해준다. 현재 윈도우에서 제공하는 드라이버 모델은 10 가지 이상의 방법들을 제시하고 있고 , 개발하려는 장치 및 드라이버 종류에 따라 추천하는 드라이버 모델들이 존재하고 있다 . 하지만 , 이런 다양한 드라이버 모델은 개발자들이 드라이버 종류에 따라 각각 새로운 모델들을 익히기 위해 시간과 노력을 배로 들게 하는 단점이 있다 . 그래서 Microsoft 에서는 이런 어려움을 해결하기 위해 새로운 드라이버 모델을 계속 발전시키고 , 통합하는 과정을 진행하고 있다 .

아래 표는 현재까지의 윈도우 운영체제의 종류에 따른 지원하는 드라이버 모델이다 .

Windows 종류

Driver Model

Windows 95/98/ME

VxD, WDM ( Windows 98/ME 에 해당 )

Windows NT

NT Kernel Mode Driver

Windows 2000/XP/2003/VISTA

NT Kernel Mode Driver, WDM, WDF


아래 표는 Microsoft 에서 디바이스 및 드라이버 종류에 따라 권장하는 드라이버 모델에 대한 설명이다 . ( http://www.microsoft.com/whdc/driver/foundation/DrvRoadmap.mspx# )

Device/Driver Class

Recommended Driver Model

1394 device

Depends on device class : KMDF or WDM

Auxiliary display (SideShow)

Windows Portable Devices (WPD),
which is UMDF-based

Bluetooth L2CAP

Depends on device class : KMDF or device-class-specific model such as AVStream

Bluetooth Radio Frequency Communication (RFCOMM)

UMDF

Cell phone, PDA, portable media player

WPD, which is UMDF-baased

Digital camera

Depends on device characterisitics :
Media Transfer Protocol (MTP)/UMDF or WIA

Display adapter

Windows Display Driver Model

File system filter

FS mini-filter

Generic filter driver

KMDF

Human input device (HID)

UMDF (except for mouse and keyboard) or KMDF

Keyboard/Mouse filter

KMDF

Modem, cable modem

KMDF, WDM, or NDIS-WDM

Network Transport Driver Interface (TDI) client

KMDF

Network-connected device

UMDF

Other

Depends on device class and characteristics : UMSF, KMDF, or WDM

Printer

UniDrv, PScript, XPS

Scanner

WIA

Secure digital (SD)

Depends on device class : KMDF or WDM

Serial and parallel devices (legacy)

UMDF or KMDF

Smart card device

WDM

USB device

Depends on device class : UMDF, KMDF, or WDM

Video capture

AVStream



Port/Adapter Class

Recommended Driver Model

Audio adapter

AVStream, PortCls

HID miniport

Microsoft-supplied or KMDF

Network adapter

NDIS-WDM

Network adapter (USB)

NDIS-KMDF

PC card

Microsoft-supplied or KMDF

PCI

Microsoft-supplied or KMDF

Serial, parallel port

Microsoft-supplied or KMDF

Storage adapter (SCSI and ATA)

Scsiport, Storport, ATA port

USB adapter

Microsoft-supplied or KMDF



VxD ( Virtual Device Driver ) : Windows 95/88/ME 에서 사용되는 드라이버 모델로 디바이스 드라이버를 가상화시킨다는 개념을 적용해 드라이버를 만든다 . 확장자는 vxd 로 만들어진다 .

NT Kernel Mode Driver : Windows NT 용 드라이버를 만들기 위한 드라이버 모델로 드라이버 개발을

WDM ( Windows Driver Model ) : 윈도우 디바이스 드라이버를 어떻게 만들어야 한다는 하나의 스펙이라고 볼 수 있다 . 하나의 드라이버 바이너리 파일을 가지고 다양한 윈도우 에서 사용 할 수 있는 드라이버를 만들기 위한 목적으로 만들어졌으며 , 현재 Windows 98/ME/2000/XP/2003/Vista 에서 사용할 수 있다 . 기본적인 개념은 NT Kernel Mode Driver 구조를 바탕으로 만들어 졌으며 , PnP, Power 관리 , WMI 등을 지원한다 .

WDF ( Windows Driver Foundation ) : Windows Vista 가 출시되면서 만들어진 드라이버모델로 WDM 모델에서 발전된 형태이다 . 윈도우 API 프로그래밍을 WDM 에 비유하면 , MFC 는 WDF 해당한다고 볼 수 있다 . WDF 는 크게 두 가지 종류로 나뉘는데 , KMDF ( Kernel-Mode Driver Framework ) 와 UMDF ( User-Mode Driver Framework ) 가 그에 해당된다 .

NDIS ( Network Driver Interface Specification ) : 윈도우에서 네트워크 관련 드라이버를 개발할 때 사용되는 드라이버 모델로 네트워크 드라이버를 좀 더 모듈화 시켜서 쉽게 만들 수 있는 방법을 제공해준다 .

그럼, 현 시점에서는 이렇게 "다양한 드라이버 모델중에 어떤 모델을 공부해야 하나?" 생각이 들것이다.
필자 생각에는 먼저 WDM 드라이버 모델을 공부하라고 말하고 싶다. 이유는 여러분들이 처음 애플리케이션 만들때를 생각해 보면, 처음엔 쉽게 개발을 하기 위해 라이브러리들이 많이 지원되는 MFC 나 비주얼 베이직, 델파이 등을 이용해 프로그램들을 만들었을 것이다. 하지만 이것의 내부 구조 및 원리들을 이해하기 위해서는 API 를 다시 공부 했어야 했다. 이것은 기본적인 원리를 이해하지 못하고는  발전된 개념들을 이해하기 어렵기 때문이다. 그래서 드라이버 모델에서도 API 와 같은 WDM 를 우선적으로 공부하면 드라이버의 기본적인 개념이나 구조를 이해하는데 많은 도움이 될 것이기 때문이다. 그리고나서, 필요에 따라 WDF 를 공부한다던지, 해당 Device Class에 따른 드라이버 모델들을 공부하는 방법을 권한다.

2. 어떻게 공부해야 하나 ?

프로그래밍을 배울 때 듣는 속담 중 하나가 “ 백문이 불여일견 , 백견이 불여일타 “ 라고 했다 . 그 만큼 실제 책으로 공부하고 눈으로 보는 것 보다는 직접 코딩을 하면서 프로그램을 작성하는 것이 백배 더 효과적이라고 한다 .

디바이스 드라이버도 이런 공부 방법대로 많이 만들어보는 것이 제일 중요하다고 생각한다 . 필자도 처음에는 디바이스 드라이버를 책으로만 볼 때는 무슨 내용들을 말고 있는지 , 어떻게 드라이버가 작동 되는지 이해가 잘 되지 않았지만 , 이것저것 개발을 하면서 조금씩 이해를 한 경험이 있다 .

그러나 , 처음 드라이버를 만들려고 해도 뭔가 이론적인 바탕이 있어야 하는데 이런 부분은 혼자 공부하기에는 어려운 부분이 많다 . 그래서 여러 명이서 스터디 그룹을 만들어 같이 공부하면서 서로 공부한 것들을 공유하는 방법을 생각해 볼 수 있을 것이다 . 그리고 , 개발자 저변은 넓지 않은 분야이다 보니 자료들을 찾아보는데도 한계가 있다 . 그렇기 때문에 다양한 세미나 및 개발자 모임 등에는 적극적으로 참여해서 정보를 얻어야 한다 . 그 다음에는 관심 있는 프로그램이나 분야 중에 디바이스 드라이버가 사용되는 것을 선정해 직접 만들어보면서 실제 이론 내용을 적용해 보는 형태로 공부를 하면 많은 도움이 될 것이다 .

그럼 , 여러분들이 개발하기 전에 몇 가지 고려해야 할 사항들을 소개하겠다 .

•  지원할 운영체제 : 제일 먼저 어떤 운영체제를 지원 할지를 결정해야 한다 . 그래야 지원하는 운영체제에 따른 H/W 지원 유무및 드라이버 모델이 정해지고 , 경우에 따라서는 디바이스 드라이버를 운영체제에서 기본적으로 지원하고 있어서 디바이스 드라이버 개발을 별도로 하지 않아도 되는 경우들이 있다 . 그렇기 때문에 우선 지원할 운영체제를 무엇으로 할지 선택해야 한다 .

•  Device 및 Driver Class : 개발하려는 디바이스 드라이버가 지원하는 장치 종류 및 드라이버가 어떤 종류인지 선택 해야 한다 . 다시 설명하면 , 장치관리자에 올라가는 장치 목록에 어떤 장치로 보이게 할 것인지를 선택해야 한다는 말이다 . 어떤 장치 종류이냐에 따라 앞에서도 언급한 드라이버 모델이 결정되어서 개발 방향이 결정이 되기 때문에 이 부분도 중요하게 결정되어야 한다 .

•  Windows Logo 인증 : 여러분들은 장치를 구매했을 때 박스나 PC 에 Windows Logo 스티커가 있는 걸 보거나 , 드라이버 설치시에 경고창이 나타나는 것을 본 경험이 있을 것이다 . 이 Logo 의 의미는 Microsoft 는 Windows 운영체제에서 하드웨어와 소프트웨어가 안정적으로 동작할 수 있도록 하드웨어와 소프트웨어의 완벽한 호환성에 관한 명확한 기준을 제공하고 있으며 , Microsoft 의 WHQL 에서는 제시한 기준에 적합한지를 시험해서 기준에 적합하면 Windows Logo 인증 마크를 사용할 수 있는 권한을 부여하는 제도 이다 . 이런 인증 제도는 비즈니스적인 측면과 관련된 부분이긴 하지만 , 여러분의 H/W 및 디바이스 드라이버 품질을 검증해 보길 원한다면 한번 인증을 진행해 보는 것도 좋은 방법이 될 거라 본다 . 대신 별도의 인증 비용이 들어가니 이점은 참고하기 바란다 .
( http://www.microsoft.com/whdc/winlogo/default.mspx )

디바이스 드라이버를 개발하기 위해 필요한 지식 및 방법에 대한 내용을 필자의 경험을 토대로 간략히 살펴봤다 . 공부에는 왕도가 없다라는 말이 있다 . 디바이스 드라이버를 공부하는 것도 특별한 비법이 있거나 빨리 실력이 느는 방법이 따로 있는것은 아니다. 특히나 드라이버나 시스템 프로그래밍쪽은 다른 분야보다 공부한 만큼 바로 바로 결과가 나오지 않아 쉽게 포기를 하기도 하는 분야다.  이럴수록 여러분들은 차근차근 기본기부터 다진다는 생각으로 공부을 했으면 한다. 
끝으로, 한 가지 더 부탁을 하자면, 인내와 끈기를 가지고 문제 해결를 끝까지 해결하려는 자세를 가졌으면 한다. 디바이스 드라이버를 개발하면서 느낀것은 쉽게 해결되는 문제가 없다는 것이다. 운영체제와 애플리케이션 , H/W 등의 다양한 구성 요소들 사이에서 동작을 하다 보니, 문제점을 파악하고 디버깅하고  테스트하는 과정은 정말 어려움 고난의 과정이다. 그래서 처음 생각과 달리 디버깅이나 테스트에서 많이들 힘들어하고 어려워한다. 하지만, 이런 과정은 여러분들이 고수로 가게 해주는 밑바탕이 될 것이며, 드라이버 개발을 재미를 느끼게 해주는 기폭제가 될것이라 본다.   

그럼, 이제 디바이스 드라이버 개발을 어렵게 느끼지 말고 바로 지금 공부를 시작해보자. 

 

출처 : http://driveronline.org/bbs/view.asp?tb=begin&no=5

설정

트랙백

댓글