728x90

CPU 선정시 고려사항

- 몇 비트 인지

 -> 기준 : CPU가 처리하는 명령어 길이

 -> 명령어 길이는 성능에 큰 영향 -> 긴 비트 CPU 성능이 좋음

-CPU Core가 어떤것인가

 -> ARM, PowerPC, MIPS 인지

- CPU 동작 주파수

- ROM과 RAM은 어떻게 구성되어있는지

- 가격

- 컴파일러 등 개발환경

- 래퍼런스보드 평가키트는 무엇인고 가격이 얼마인가

 -> CPU 성능 검증 혹은 시재품 개발 전 소프트 웨어 개발시 사용

- 운영체제 필요 한지, RTOS는 어떤걸 지원하는가

=> 데이터 시트에서 자세히 설명함

 

(1) 데이터 시트 정의

1) 전자 부품 설명서

 데이터 시트

- 전자 부품 설명서

- 복잡한 전자부품의 설명법과 내부 구조를 자세히 설명

- 제조사에서 만들어 대부분 공개

- 비밀 유지를 위해 간단한 소개만함

 

2) 데이터 시트 내용

- 제조사

- 부품번호 : Part Number

- 부품 특징

- 응용 분야

- 핀 설명

- 전체적인 하드웨어 블록 설명

- 각 하드웨어 블록 설명

- 레지스터 설명

- 패키지 설명 : 전자 부품의 외형

- 전기적인 특성 : 부품의 동작

- 전원 관련 해설

- Errata : 전자 부품의 문제

 

1. 제조사 및 부품 번호

제조사

- 부품 만든 회사 이름

부품 번호

 - 제조사에서 관리하는 부품명

 - 제조사에서 작성하여 그 이름에 정보들을 담고있음

 - 부품 특성을 쉽게 이해할수있게 일정 규칙으로 만듦

 

ex) 미국 텍사스 인스투러먼트사의 7404 부품 데이터 시트

- 부품번호가 74로 시작 -> 74시리즈. 논리 회로 구성부품으로 널리 사용

- 7404는 인버터를 구현한 유명한 부품

- 첫페이지 오른쪽 상단 : 부품번호

- HEX INVERTERS : 칩의 기능 -> 16진수 인버터

텍사스 인스투르먼트사 7404 부품 데이터 시트

 

2. Description

- 부품의 개략적인 설명

- TI 74LS04의 Description : 6개의 독립적인 인버터

 

3. Ordering Information

- 구입/주문시 확인해야하는 사항

- 많은 부품 구입시 혼선을 없애기위해 확인해야할 사항 정리 -> 온도, 패키지, 포장 등

ex) ORDERABLE PART :SN7404N -> 동작온도 : 0 ~70도, PDIP-N 타입 패키지

- TOP-SIDE Marking : 부품 상단에 인쇄되어 있는 글씨. SN7404N이라 찍혀 나옴

Ordering Information
PDIP-N 타입 패키지

4. Logic Diagram

- 기능을 기호로 표시한 그림

- SN7404 : 6개의 인버터로 구성

- 1A라는 입력은 인버터를 거쳐 1Y가 되는것을 기호로 표시

로직 다이어그램

5. Schematic

- 부품 내부 회로도

- 04와 LS04, S04로 끝나는 부품들이 각기 다른 회로를 가지고 있어 이 회로를 해석해 어떤 기능을하는 부품인지 확인 가능

- Each gate : 6개의 게이트가 각각 다음 회로도 처럼 구성됨

Schematic

6. Absolute Maximum Rating

- 최대 전원 전압, 최대 입력 핀 전압, 보관할때 온도 범위

- 이 부품이 견딜수잇는 전압, 보관 온도 등 정보

 

Absolute Maximum Ratings

 

7. Recommended Operating Conditions

- 추천 동작 조건

- 최대, 최소, 조건밥

ex) SN7404의 Vcc(전원전압)

 - 최대 : 5.25V

 - 최소 : 4.75V

 - 표준 : 5V

 => 최대 전압을 5.25V 인가시 동작 보장 할수없음

Recommended Operation Conditions

8. Electrical Characteristics

- 전기적 특성

- 일정한 테스트 환경에서 측정되는 전압이나 전류값

- 제조사가 이 값들을 보장한다는걸 의미함

Electrical Characteristics

ATmega128 데이터 시트 분석

1) 데이트 시트 구성

1. 개요

데이터 시트

- 총 380페이지 -> 복잡함

- 제조사 : ATMEL

- 부품번호 : ATmega128A

- 설명 : 128K바이트 크기의 프로그래밍이 가능한 플래시 메모리를 가진 AVR 마이크로 컨트롤러

- 특징 Features

 -> ATmega 128 성능 특징 정리

 -> 총 133개 명령어를 갖는 RISC 구조 프로세서

 -> 128KB 플래시메모리, 4KB EEPROM, 4KB SRAM 등 가짐

 -> 디버깅할수있는 JTAG 지원, 주변장치 특징, 패키지 설명, 동작 전압과 동작 주파수 등 설명

ATmega 128 데이터 시트

2. 목차

- 필요한 부분위주로 찾아 쓰기

- CPU core부

- 메모리 부

- 내부 주요 블록 : 메모리, Clock, 파워 관리, 리셋, 인터럽트나 타이머 등

- 주변 장치 : SPI, UART, TWI 같은 직렬통신, ADC와 JTAG 등

- Electrical Characteristic

- Typical Chracteristic

- Register SUmmary

- Ordering Information

- Packagin Information

- Errata

데이터 시트 목차

2) 주요 블럭 분석

1. Pin Configuration

- ATmega128 ; 총 64개 핀

- 핀 번호 : 모서리 점 기준으로 반시계 방향

- 핀 이름 : 각 핀 기능 명시

ex) 63번 핀 - 핀 이름 : GND -> 접지 핀

    52번 핀 - 핀 이름 : VCC -> 전원 핀

    61번 핀 - 핀 이름 : PF0(GPIO핀) -> GPIO 중 F포트의 0번 핀

- 괄호 안 이름은 선택적 가능 기능

ex) PF0(ADC0) - ADC0 : 0번째 Analog To Digital Converter 핀

    * 선택할수 있는 Alternative Function

ATmega128 Pin Configuration

2. Block Diagram

- 칩 내부 구조 설명

- 외부로 나온 핀 종류

- 칩 내부 하드웨어 블록의 구성

- 칩 내부 하드웨어 블록의 연결

- 외부 핀 : PF0 ~ PF7 -> 이 핀들이 어떻게 연결되어있는지 볼 수 있음.

 PORTF DRIVER<->DATAREGISTER<->DATA DIR REGISTER

   -> PORTF DRIVER : GPIO로 동작하게하는 하드웨어 회로 자체

   -> DATA Register, DATA DIR Regiter : GPIO를 제어하는 레지스터

- ADC : 아날로그 - 디지털 변환 회로

  AVCC <-> AGND <-> AREF로 연결

- Program Counter, Stack Pointer, SRAM 등 칩 내부 레지스터나 메모리, ALU같은 중요한 하드웨어 블록이 어떻게 연결되어있는지 확인 가능

- 크리스탈 : Clock 공급하는 부품. XTAL1 핀 및 XTAL2핀과 연결

=> 칩의 전체적인 구성 연결에 대한 정보 제공

Block Diagram

 

3. AVR CPU Core

AVR CPU Core Block Diagram

- Data Bus 8-bit와 ALU, General Purpose Register가 연결

- ALU : 산술/논리 연산하는 CPU 핵심적인 부분

- ALU가 8비트 버스로 다른부분이 연결됨 -> CPU가 8비트 CPU

- Program Counter Register : 다음 명령어 주소를 가리킴

AVR CPU Core Block Diagram

4. 각 항목별 구성

I/O Ports(GPIO)

- 다루는 하드웨어 블록 제목

- 소개

- 하드웨어 블록에 대한 설명

- 추가 부분 설명

- 관련 레지스터 설명

I/O Ports(GPIO) 목차

5. 레지스터 보는법

CPU 제어 방법

- 레지스터를 통해 CPU 제어 가능

- 레지스터는 일반 메모리 처럼 어드레스 가지며 비트 별로 읽고 쓰기 가능

- 레지스터는 어떤 비트에 일정 값을 씀으로써 CPU 내부 하드웨어를 조정

- CPU 제어 = 레지스터 제어

 

포트A - 포트 A 데이터 레지스터

Register Summary

- 레지스터의 이름과 주소들을 알려줌

Register Summary

 

3) 기타 항목

1. Absolute Maximum Rating

- 부품이 견딜수 있는 최대 전압, 보관시 온도, 범위 등 명시

 

2. Instruction Set Summary

- ATmega 128 명령어 요약본

- 어셈블리 종류 : 산술/논리 연산 명령, 분기 명령, 데이터 전송 명령, 비트 연산 명령, 제어 명령

- nemonics : 명령어 구분하기 위한 짧은 이름

- Operand : 피연산자로 연산에 사용되는 값

- Description : 명령어 해설

- Operation : 명령 동작을 기호화한것

- Flags : 연산에 영향을 미치는 Status 레지스터 비트

- # Clock : 해당 명령에 수행되는 시간. 1이면 1개 클럭만 필요하다는 뜻

Instruction Set Summary

3. Ordering Information

ATmega128-16AU

- CPU 동작 주파수 : 16MHz

- 공급 전원 : 4.5 ~ 5.5V

- 패키지 : 64A

- 동작 가능 온도 : -40 ~ 85도

Ordering Information

패키지 종류

- 64A : 핀이 밖으로 나옴

- 64M1 : 아래로 패드가 나옴

300x250
728x90

반도체 발달

-> 집적회로의 칩 집적도 상승

- 복잡도를 가진 내장 기술 발달

- 칩의 소형화 -> 칩 핀 크기도 작고 많아지는 경향

- 반도체 칩 핀형태 = 패키지 -> 패키지 모양만으로 그 칩의 집적도를 알 수 있음

 

패키지 발달

1. DIP Dual In line Package 타입

2. TSOP Thin Small Outline Package 타입

3. PQFP Pastic Quad Flat Pack 타입

4. BGA 타입

 

 

회로도

- 전자, 전기 회로를 설계하고 분석하기 쉽게 그림으로 표현한것

- schematic, 전기 도면, 전자도면

- 보드 : 반도체 부품이나 저항, 콘덴서, 인덕터와 같은 수동 소자 부품,, 커넥터와 같은 부품들이 서로 연결된것

- 회로도 : 단순하게 표시한 표준 기호

 -> 회로의 부품을 나타내고 부품들간 연결 표시. 신호 연결을 표시

 

회로도 이용

- OrCAD 같은 툴로 작성

- 회로 설계, 인쇄 회로 기판 PCB 배치,  보드 유지 보수 등에 사용

- 실제 PCB의 실제 위치는 회로도에서 부품 연결 위치와 일치하지 않음

 

회로도 특징

- 핀과 핀의 연결 정보만 보유

- 보드상의 실제 위치나 연결 구조까지 나타내지는 않음

<-> 회로도를 바탕으로 실제 PCB 구현 가능

-> 이 작업을 "레이아웃", "아트웍"이라 부름

 

회로도 구성

1) 부품과 결선

전자 부품 내부

- 여러 전자부품과 PCB 인쇄 회로기판과 결합

 

회로도

- 여러 전자부품이 PCB 기판의 전류가 통하는 결선에 의해 어떻게 연결되는지 알려주는 지도

-> 기호를 이용하여 부품 단순화, 어떤 부품인지 한 눈에 알아보게 해줌

 

2) 부품 종류

전자 부품

- 전원부 : 전원 공급 및 접지 연결하는 부분

- 수동 소자 : 전력을 소비하거나 축적하거나 감쇠

- 능동 소자 : 작은 신호(전력,전압,전류 중 하나)를 입력하여 큰 신호를 출력

- 진동 소자 : 압전 효과를 이용한 수동 소자로 고주파 생성 혹은 필터로 사용

- 디지털 논리 게이트 : AND, NOR, NAND 등 조합하여 디지털 논리 회로 설계

- 집적 회로 칩 : AVR이나 ARM 과 같은 CPU를 포함한 여러 종류 소자들

 

커넥터

- 전원 커넥터

- 보드 커넥더

- 헤더핀

스위치

 

3) 회로도 기호

1. 전원 부

- DC 전원 : 회로 상에 VCC, VDD 이름으로 나타냄. 

전원

- 접지 : 다음 기호 중 하나 사용

접지

2.. 수동 소자

- 이름 시작 문자에 따라 구분 가능. 저항 R, 인덕터 L, 캐패시터 C로 시작

- 어래이 저항 : 여러 저항이 같은 값으로 여러개 붙은 소자

어래이 저항

- 가변 저항 : 저항을 바꿀수있음

가변 저항

-인덕터

인덕터

- 캐패시터 

캐패시터

3) 진동 소자

- 크리스탈

크리스탈

- 오실레이터 : 크리스탈과 진동에 필요한 소자를 내장하여 전원과 접지를 추가한 부품

오실레이터

4) 능동 소자

- 다이오드

다이오드

- 트랜지스터 : BJT와 MOSFET으로 나뉨. BJT는 화살표 방향에 따라 구분

BJT 트랜지스터

- 연산 증폭기 : 4개 핀을 가짐. 하나나 여러 연산증폭기가 들어가 하나의 온전한 칩을 형성

연산 증폭기

5) 디지털 논리 게이트

 

6) 집적 회로 칩 : CPU, MCU

- 집적회로 칩 : CPU 처럼 독립된 칩

- 내부는 능동소자와 수동소자의 조합으로 구성

- 핀수나 배열들이 다양함

집적회로 칩

- U1-A, U1-B 처럼 하나의 칩을 나눠서 표현하기도 함

하나의 칩을 나눈 표현

7) 헤더와 커넥터

- J나 CON으로 시작

1열 10행짜리 헤더
2열 5행짜리 헤더
실제 보드 상 2열 5행 헤더

8) 스위치

- SW 이름으로 시작

 

4. 부품 연결

1) 와이어로 연결

- 부품 연결 -> 하나의 모듈 완성

* 연결선 : 와이어

- 수동 소자들은 서로 자유롭게 연결 가능

- 직접회로 칩들의 핀들은 특정 기능을 수행하기 위해 설계됨 -> 핀 기능은 데이터 시트에 설명됨

회로도 일부

- VCC 핀 : 전원 공급해야하는 핀. 전원부와 연결해야함

- GND 핀 : 접지와 연결해야함.

 

AVR CPU 해석

(1) 전체 회로 구성 분석

1. 주요 부품확인

 - 대개 U라는 이름으로 시작하여 배치

  -> U1, U2 부터 찾아서 확인

 - AVR CPU 회로도의 예시로 분석

   -> 주요 부품으로 AVR의 배치위치를 확인

2. 전원부 구성 파악

  - 전원 볼트값

  - 전원부 소자들의 부품 종류

  - 최대 전류 값 파악

  - 전원 커넥터 종류 파악

3. 진동 소자부 구성

  - CPU가 장착된 회루에는 32.768kHz의 RTC용 크리스탈, CPU를 동작시키는 메인 진동소자가 장착

4. 메모리부

 - CPU에 따라 내부에 ROM과 RAM을 모두 가지는 경우 외부에 메모리가 장착되지 않을 수 있음

 - 대부분 경우 RAM이나 ROM이 CPU 외부에 존재

5. 기타 주변장치 파악

 - 몇개 핀이 GPIO로 할당되어있는지

 - LED나 LCD 같은 출력 장치의 연결방법 파악

 - 버튼이나 스위치 연결 방법 파악

 

(2) 각 모듈 분석

1) 주요 부품

1. U1, ATmega128, 주요 MCU

2. U2, 74HC573 

     - 기본적인 MCU 구성에 많이 사용. MCU 외부에 RAM 장착시 사용

     - 외부 어드레스와 데이터를 분리시켜주는 역활. ALE 신호를 통해 데이터 신호와 어드레스 신호 구분

          * ALE가 low이면 어드레스 신호 출력, high 이면 데이터 신호로 간주

3. U3, K6X0808CID-GF70

      - 32K바이트 용량의 SRAM

4. U4, MAX232

      - UART 트랜시버, 시스템간 통신 위한 +12V ~ -12V의 UART 신호(거리를 멀리가기 위해 전압래밸이 높음)

      - 이 신호를 MCU가 인식할수 있도록 5V레벨 신호로 바꿔주는 역활

 

ATmega128
74HC573
K6X0808CID-GF70
MAX232

2) 전원부 구성 파악

- 전원이 어디서 공급되는지 파악

- 전원은 커낵터로부터 들어오므로 J로 시작하는 부품들 탐색

- USB로 전원 받는 경우가 많으므로 USB 회로 부분 조사

커넥터와 전원부

- 접지 : 회로 전체에 분포

 * 수동 소자를 제외한 거의 모든 부품 -> 접지와 연결 필요

- AVCC : 아날로그 전원

 

3) 진동 소자부

- 진동 소자 : Y로 시작하는 부품

- 16MHz(메인 클럭) -> ATmega128의 최대 동작 주파수, MCU 동작의 주요 클럭

- 32.768kHz(RTC 클럭) : 초단위 속도에 맞는 주파수 크리스탈

=> 메인 클럭과 RTC 클럭이 일반적인 구성

- 23, 24핀이 제대로 크리스탈과 연결되었는지 확인 -> MCU 레지스터 셋팅 등 미치는영향파악

- 외부 RTC 클럭이 잘 사용되려면 MCU 레지스터를 알맞게 세팅해야함 -> 데이터 시트에 존재

 * 외부 클럭 대신 내부 클럭 사용하는 경우도 있음

ATmega128과 진동 소자부

 

4) 메모리부

- 32K 바이트 크기의 외부 SRAM을 가지고 있음

- CPU들은 핀수가 많으므로 메모리를 읽고 쓰기 위한 데이터 버스와 어드레스 버스를 별도로 갖고 있음

- MCU는 핀수가 부족하므로 데이터 버스와 어드레스 버스를 공유하여 설계되어있음

  -> 한 핀이 어쩔때는 데이터버스/어드레스 버스역활을 함.

메모리부

 

74HC573 래치칩

- 메모리는 데이터와 어드레스가 다른 핀으로 할당되어 있음 -> MCU는 핀이 부족하여 버스를 공유해야함

- 래치칩(74HC573) :  MCU 외부 램을 추가할때 어드레스와 데이터 핀을 공유해서 쓰기 위해 사용하는 부품

- D1~D8 입력핀과 Q1 ~ Q8 출력 핀으로 구성

- OC -> Low : 출력을 입력핀값 출력. High : 출력핀의 출력 끊음

- C -> High : 입력값이 그대로 통과, Low : 입력 핀들의 연결을 끊음

- ALE

  -> 어드레스 사용시 : ALE 신호를 Low로 하여 D0 ~ D7의 데이터 버스를 끊어버림

  -> 데이터라인 사용시 : High 신호를 주어 D0 ~ D7 신혹 ㅏ들어갈수있도록 함

74HC573

(2) STM32F103 CPU 회로도 분석

1) 전체 회로 구성 분석

1. 주요 부품 확인

 - U라는 이름으로 시작. U1, U2 부터 시작

 - STM32F103 CPU 배치 위치를 실제 배치에서 확인 후 회도로에서 확인

2. 전원부 구성 파악

 - 사용 전원 볼트 파악

 - 전원부 소자들의 사용 부품 종류 파악

 - 최대 전류값 파악

 - 연력하는 전원 커넥터 종류 파악

 - USB 회로도 파악

3. 진동 소자부 구성

 - CPU가 장착된 회로에는 CPU 동작용 메인 크리스탈과 RTC용 32.768KHz RTC용 크리스탈이 장착

4. 메모리 부

 - CPU에 따라 내부에 ROM과 RAM을 가지고 있는경우 외부에 메모리가 없을수있으나

 - 많은 경우 RAM or ROM 이 외부에 장착

5. 기타 주변장치 파악

 - 몇개의 핀이 GPIO로 할당되어있는지

 - LED나 LCD같은 출력장치의 연결방법파악

 - 버튼이나 스위치의 연결방법 파악

 - JTAG 인터페이스 등 연결여부 파악

STM32F103 CPU 전체 회로도

(2) 각 모듈 분석

1) 주요 부품

1. U1, STM32F103 - 주요 MCU

2. U2, YDSR-1031AM - 7segment LED

3. U3, AME8805AEETZ-3.3

   - 5V를 3.3V로 변환하는 레귤레이터

   - STM32F103은 저전력으로 구동하므로 USB 전원을 사용해도 문제 없음

   -> USB 볼트 전원을 레귤레이터를 통해 5V를 3.3V로 전환하여 사용

4. U4, SP3232C - UART 트랜시버. +12V ~ -12V의 UART신호를 3.3V 레벨 신호로 변환

 

STM32F103
YDSR-1031AM

 

AME8805AEETZ-3.3
SP3232C

 

2) 전원 구성부 파악

- USB_5V에서 전원을 가져와 AME8805AEETZ 레귤레이터 구동 -> 5V를 3.3V로 전환하여 메인 전원으로 사용

  -> R28 연결 : USB 전원 이용

  -> 미연결 : 커넥터 등에서 바로 3.3V를 연결해 사용

전원부 구성

- LD4 :3.3V가 인가되면 켜지는 파워 인디케이터 LED

  -> VDD_3v3  이란 전원은 주요 부품에 모두 인가되어 보드를 동작시킴

  -> 회로의 어디에 사용되는지 확인

- STM32F103의 전원 핀과 접지핀 연결 여부 확인

 -> 전원핀 32, 48, 64, 19 등 모두 VDD_3v3에 연결됨. 접지 핀도 연결됨

STM32F103과 전원 연결

- VDDA 핀 : 아날로그 전원핀

 -> VDD_3v3전원이 연결됨. 디지털 노이즈가 아날로그 쪽으로 전파되지 않도록 BEAD 칩을 연결/

 -> VSSA : 아날로그 그라운드

아날로그 전원부

 

3) 진동 소자부

- 진동 소자 : X로 시작

- X1 : 12MHz 크리스탈 -> STM32F103 CPU 메인 클럭

- X2 : 32.768KHZ 크리스탈 ->초단위에 맞는 주파수. RTC 클럭

진동 소자부

- STM32F103은 외부 진동 소자 없이 구동 가능하나 몇가지 단점으로 외부 진동소자 사용

진동 소자부의 STM32F103 연결

300x250
728x90

ROM

- Read Only Memory

- 일반 인은 쓰지 못하고 읽기만 가능한 메모리

- 제조사에서 한번은 원하는 값을 써야함

 

ROM 의 발전

- Mask ROM : 최초의 롬. 사진을 현상하듯 같은값만 찍는 방식

- PROM programmable ROM : 사용자가 1회 한해서 새 내용을기록가능한 롬.

                                       높은 전압을 가해 롬 내부 퓨즈를 끊는 방식으로 한번 수정 가능

- EPROM Erasable PROM : 여러번 수정 가능한 롬으로 투명한 창이 있어 자외선을 쏘여 자우는 방식

                                   지우려면 3~40분 정도 시간 소요. 지울수있는 횟수도 20회 전후

- EEPROM Electrically Erasable PROM : 전기적으로 지울수 있는 롬으로 12V 높은 전압 필요. 소켓형태로 롬을부착가능

- Flash : 보드 상에서 바로 지우고 쓸수있는 롬

 

ATmega128

- 총 53개 GPIO 핀

- Pxn(x 는 X~G, n은 0~7)

- 각 핀은 입,출력 설정 레지스터를 통해 소프트웨어로 선택가능

- DDRx 레지스터가 입력, 출력 선택 레지스터(Data Direction Register)

- 설정을 위해 각 핀은 DDRx, PORTx, PINx 세 종류 레지스터 사용

ATmega128 GPIO

DDR 레지스터

- 입력과 출력 핀 설정

  ex) PA0핀을 입력으로 할시 -> DDRA 레지스터의 0번 비트를 0으로 하면 됨

PORT 레지스터

- GPIO를 출력한다면 PORT 레지스터를 통해 해당 핀 전압레벨을 0이나 1로 하면됨

 ex) PA0핀을 1로 출력 -> PORTA레지스터의 0번 비트를 1로 하면됨

PIN 레지스터

- 입력으로 된 핀 레벨을 읽으려 한다면 PIN 레지스터의 값을 읽으면 됨

 ex) PA0핀의 입력값을 알고싶다 -> PIN A레지스터의 0번 비트를 읽으면됨

 

DDR, PORT, PIN 레지스터 구조

PA0 핀을 출력으로 설정하고, 레벨을 high로 설정하는 C 코드

#include <avr/io.h>

int main(void)
{
	DDRA = 0b00000001;
	PORTA = 0b00000001;
	return 0;
}

 

ATmega128과 LED 연결 제어 실습

PE1에 LED 회로 연결

- LED 제어 펌웨어 소스

#include <avr/io.h>
#define F_CPU 16000000L
#include <util/delay.h>

int main()
{
	DDRE = 0x01;
    //E1핀만 출력 설정
    while (1){
    	PORTE = 0x01;
        //E!핀에 1출력, 나머지 핀 0 -> 불켜짐
        _delay_ms(1000);
        PORTE = 0x00;
        //E 전체 핀 0 -> 불 꺼짐
        _delay_ms(1000);
    }
}
300x250
728x90

1. ISP

- 한쪽이 USB포트

- USB to UART 변환 칩이 있어 USB 단자를 PC에 꽃으면 COM으로 인식

- 처음 연결 시 USB to UART 변환 칩의 디바이스 드라이버를 찾음

 

ATmega128의 인터페이스

J8 : ISP 포트 <-에 연결

J5 : JATG 포트

ATmega128 인터페이스 회로도

 

JTAG 연결

- JTAG 장비의 빨간선이 보드 1번 핀에 맞도록 연결

 

 

AVR JTAGICE Mk II

 

STM32F103

- ARM Cortex-M3 코어 내장 CPU

- ARM Cortex-M 지원하는 JTAG 장비 사용 -> ST-Link V2가 가장많이 사용

- ARM Cortex-M 시리즈는 JTAG20핀 사용

STM32 시리즈 CPU만 지원

 

ARM Cortex-M 시리즈 JTAG 핀

 

STM32CubeMX 툴

- 기본적인 펌웨어 코드 생성

-> IAR Workbench, Keil MDK 등 다양한 개발환경 선택해서 사용 가능

300x250
728x90

AVR용 교차 개발환경

- Atmel 사의 AVR Studio

- IAR System 사의 IAR Embeded Workbench

- 코드 편집, 컴파일, 디버깅 등이 가능한 통합 개발환경

 

AVR Studio

- GNU에서 배포하는 GCC 사용

- 타 컴파일러들은 자체 제작 컴파일러로 라이센스 제한이 있음

- AVR Studio는 GNU 라이센스를 따르므로 무료 배포 가능 -> GPL 라이센스

- GNU General Public License 자유 소프트웨어 재단에서 만든 라이센스

 

STM32F103용 교차 개발환경

- 레조넌스사의 RIDE7

- IAR system사의 IAR Embeded Workbench

- Keil사의 MDK-ARM 등

 

Exynos 4412 개발환경

- 가상화 소프트웨어, 호스트 머신 리눅스, GNU ARM Toolchain 필요

- 윈도우가 필요할 수 있으므로 윈도우 환경에서 가상 머신 리눅스 사용이 좋음

 

리눅스 설치 판 존류

- 툴체인 종류 : Sourcery CodeBench, Linaro

- 레드햇 계열 : 페도라, 센토스

- 데비안 : 우분투

- 모두 리눅스 커널 사용

- 설치 명령어 : 래드햇 계열 RPM 또는 Yum, 데비안 계열은 Apt

 

데미안 계열

- Apt = Advanced Packaging Tool

- Apt-get 명령어로 패키지 업데이트

- /etc/apt/sources.list 파일에서 저장소 정보 관리

300x250
728x90

프로그래밍 

- edit -> build -> download -> debug

 

1) 디버깅

- 프로그램이나 하드웨어 장치의 문제점을 찾아 해결하는 것

- 일반 범용 PC의 디버깅 환경 -> IDE 내에 디버깅 내장 -> 문제 프로그램의 소스를 보면서 변수나 메모리 값 확인

 

임베디드 시스템 디버깅 환경

-  호스트 컴퓨터 - IDE <-> 디버거 장비 <--> AVR 타겟보드 - 디버깅할 프로그램

- 중간에 디버거 장비가 필요. 타겟 보드에 따라 디버거 장비가 결정

- AVR 타겟보드 디버깅 시 AVR용 디버거 사용

 

2) 소스레벨 디버깅

소스레벨 디버깅

- 프로그램 소스 코드 보면서 디버깅 하는 것

- 프린트 문으로 변수, 메모리 값 확인 시 : 문제가 되는 코드 위치와 CPU 내부 값 확인이 힘듬

-> 소스 레벨 디버깅 : 프로그램 진행을 멈추어 확인하고싶은 변수나 메모리, 어셈블리 값, CPU 상태도 확인 가능

 

3) JTAG

디버거

- 에뮬레이터라는 용어와 혼용해서 많이 사용

- JTAG이라는 디버깅 방식 개발전에 에뮬레이터 방식으로 제작됨

 

에뮬레이터

- CPU나 메모리 동작을 흉내내어주는 디버깅에 사용되는 장비나 소프트웨어

- 종류 : CPU 에뮬레이터, ROM 에뮬레이터

- 고가, CPU 100Mhz 이상인 경우 잡음이 심해 잡음이 어려움, CPU 모든 핀 연결해야하나 핀수가 많고 소형화되어 힘듬

 

JTAG

- Joint Test Action Group

- IEEE 1148.1 아이트리플이

- 조립된 PCB 테스트 목적으로 연구

- 디바이스 패키지, 고집적화로 물리적 접촉 방식으로 테스트가 힘듬 -> JTAG 탄색

- 외부로 나온 핀을 직접 접촉하지 않고, 테스트 목적의 셀을 칩 내부에 장착하여 전용 데이터 입력 핀인 데이터 입력으로, 입력시 데이터 아웃으로 출력하게 하여 칩이나 보드에 이상유무를 확인

-> Boundary Scan Architecture

- PCB 보드 검증 뿐만 아니라 디버거 만드는데서도 활용 가능 -> 에뮬레이터 방식의 대안이 됨

JTAG 방식

JTAG 디버거

- JTAG 단자라고 하는 편개의 신호만 연결하면 디버깅이 가능한 장비

- 보드에 존재했던 모듈들이 하나의 칩안으로 들어감(SoC), RAM, ROM, IO 등 칩안에 들어감

-> JTAG이 현실적인 대안이 됨

JTAG 인퍼테이스

- TDI : Test Data Input

- TDO : Test Data Output

- TMS : Test Mode Select

- TCK : Test clock

- nTRST : Test Rest

- 디버그 목적으로 몇개 신호선 추가 : nRESET, Vtref, DBGRQ

-> 타겟 시스템 자원을 소모하지 않아 디버깅으로 인한 타겟 소모나 영향이 없음

 

IEEE1149.1 디바이스 구조

- 시리얼 방식 사용 - 데이터라인이 TDO 한개 뿐이므로

- TAP 컨트롤러 : 스테이트 머신 방식, TMS 신호에 의해 Test Mode 전환 과정

  -> TAP 상태에 따라 TDI가 명령이거나 데이터 일 수 있음. TDO 값도 어드레스 이거나 데이터일수있음

- JTAG 이용 -> TAP 컨트롤러를 제어하여 필요한 명령어나 데이터를 읽고 쓰는 방식

- 동작 주파수가 10~100MHz인 TCK핀이 일반적으로 사용됨.

IEEE1149.1 디바이스 구조

 

JTAG Pin 배치

- CPU 코어나 종류, 버전에 따라 다양한 핀배치를 가짐

AVR JTAG

- AVR : 총 10개의 핀으로 구성

- nTRST : TAP 컨트롤러를 리셋하기 위한 신호

- nSRST : CPU 코어를 리셋하기 위한신호

AVR의 JTAG

ARM JTAG

- ARM 코어는 버전에 따라 핀맵이 달라짐

- ARM7 : 총 14개 핀

- ARM9 : 총 20개 핀

ARM코어 JTAG 핀

TMS (Test Mode Select)

- 디버깅 상태에서 Scan Chain을 결정하고 Bypass와 같은 디버깅 모드 선택에 사용

 

TCK Test Clock

- JTAG을 구동하는 Clock으로 보틍 10MHz

 

nTRST test rest

- JTAG의 Tap 컨트롤러 리셋

 

VTref Test Voltage reference

- JTAG 인터페이스의 입출력 전압 레벨을 설정. 전원 공급용이 아님

- JTAG Logic이 들어있는 프로세서 전압은 따로 공급이 필요

 

nSRST = nRESET

- Target CPU를 리셋하거나 리셋을 검출하는데 사용

 

DBGRQ

- 외부 트리거 신호로 프로그램 신호를 멈춤

 

DBGACK

- 정확한 시간 측정

- 프로그램 실행 정지 시 다른 디바이스를 정확하게 트리거 할수있도록 해줌

 

1) ISP 방식

ISP 장비

- CPU 내부 플래시 메모리, EEPROM을 지우거나 프로그래밍만 가능

JTAG

- 프로그래밍 + 소스레벨 디버깅이 가능

 

기존의 EPROM 형태 개발

- ISP 개발 이전 방식

- 외부의 EPROM을 사용하거나 EPROM과 CPU가 내장된 단일 칩을 땟따 붙여 롬라이터로 프로그래밍하고 디버깅하는 방식

- EPROM CPU를 ROM eraser에 넣어 삭제(1시간 이상걸림) 후 ROM Writer로 쓰기함.

 

ISP in system programming

- 플래시 메모리와 CPU가 단일칩이 되면서 등장

- 보드상 플래시 메모리 프로그래밍 가능

- 프로그래밍 시간이 수분 내로 획기적으로 축소

- AVR의 플래쉬 메모리에 직렬통신으로 실행 프로그램을 다운로드함

-> ISP를 사용하기 위해 ISP 프로그래머가 필요

 

PC와 연결 방식

- 병렬포트, 직렬포트, USB 포트

-> 근래는 USB포르를 대부부분 사용

 

AVR ISP방식 하드웨어 연결

- 6핀 방식과 10핀 방식 연결 방법 존재

  실제 사용하는 신호선 종류와 기능은 동일

  타겟 보드의 ISP 인터페이스를 보고 선택

- ISP 프로그래머는 둘다 지원

  ISP 프로그래머는 SPI인터페이스를 사용하여 연결

 SPI 인터페이스는 직렬통신 한 종류 -> 이 인터페이스로 ISP 사용

ISP 핀맵

 

SPI Serial Peripheral Interface

- 마스터와 슬레이 개념을 이용한 통신

- 사용 신호선 : MOSI, MIOS, SCLK, SS 등

- MISO : Master Input Slave Output

- MOSI : Master Output Slave Input

- SCK : Serial Clock

- SS : Slave Select (여러개 슬레이브가 존재시 선택하는 신호)

SPI 인터페이스

AVR의 ISP 신호

- 슬레이브가 AVR CPU 한 개이므로 SS는 사용하지 않음

- VCC라는 전원 신호와 /RES(AVR Reset)라는 리셋 신호를 추가하여 AVR ISP 신호선 완성

- 마스터 : ISP 프로그래머가 됨

- 슬레이브 : AVR CPU가 되어 PC 코드를 AVR의 플래쉬메모리나 EEPROM에 프로그래밍하게됨.

 

 

상용 JTAG 디버거 특징

- 다양하지만 대부분 고가

- 특정 CPU 코어만 지원하는경우가 대부분

 -> 다양한 CPU를 지원해도 라이센스 구매가 필요할수있음

 

TRACE32

- 거의 모든 코어 지원

- JTAG 장비 중 가장 비쌈

 

 

 

300x250
728x90

오실로스코프

- 회로 신호 검증 및 테스트 장비

- 신호의 상승 하강, 주파수 엣지사이 경과시간 정교하게 측정. 

- 동시 측정 가능한 입력 신호 갯수 4개

 

로직 애널라이저

- 32/64비트 데이터 버스 등 동시에 많은 신호 측정에 사용

- 채널 수 : 34 ~ 136개

- 오실로스코프처럼 아날로그적 특성은 측정 x. 0,1 디지털로직신호만 측정

- 디지털 설계 검증 디버깅에 도움됨

- 디시털 신호 동시 추적 및 상관관계 설정에 이용

 

1. 데이터 시트와 레퍼런스보드

데이터시트

- 부품, 하부 시스템, 소프트웨어 등 성능 특성등을 모아든 문서, 일반적으로 제조사에서 만듬

- 제조사 이름, 제품 형번, 이름, 제품특성, 기능 설명, 핀접속 다이어그램, 추천동작환경

- 직류/교류 특성, 입/출력 파형표, 검증 회로, 정오표

 

래퍼런스 보드

- CPU올려 테스트 가능한 보드의 회로도와 OS 관련 자료들

- 래패런스 보드 = 평가 보드 = 개발 보드

- ATmega128  래퍼런스 보드 : STK500

- STM32F103 래퍼런스 보드 : STM32 Nucleo

- Exynos4412 래퍼런스 보드 : Odriod-X

 

부품 배치도 component placement

-  PCB 보드상 부품이 놓여진 위치 소개

 

 

3. AVR 용 디버거

디버거 debugger

- 프로그램 테스트

- 프로그램 정확성이나 오류 찾아냄

 

AVR 용 디버거 장비

- Atmel-ICE, JATGICE : ARM Coretex-M 코어 CPU용 장비

- AVR ISP mk2, AVR Dragon :  AVR용 디버거 장비

- ISP 다운로드, ISP 다운로드 및 소스레벨 디버깅 가능 장비로 나뉨

 

ISP in system programming

- 보드에 장착된 CPU 내부 플래시 메모리를 지우고 프로그램하는 장비

- 이게 없을때 보드에서 CPU를 분리하여 롬라이터를 이용해 메모리를 지우거나 프로그래밍 함

 

ISP 다운로드

- 플래시 메모리에 펌웨어 다운로드

 

소스레벨 디버깅

- 펌웨어 소스를 화면으로 보면서 CPU 실행을 멈추고, CPU 메모리상태를 볼 수 있음

- JTAG 인터페이스를 통해 사용 가능

 

4. 계측 장비

1) 오실로 스코프

2) 멀티 테스터기

 

1) 오실로스코프

- 특정 시간 간격의 전압 변화를 볼수있는 장비

- 주기적으로 반복되는 전자신호 표시

- 시간에 따라 변하는 신호를 주기적이고 반복적인 하나의 전압 형태로 파악

- ex) 테트로닉스 사의 오실로스포크, 에질런트사의 오실로스코프

- 대역폭, 샘플링 속도, 채널 개수에 따라 다양

- 대역폭이 클수록 아날로그 신호 정확하게 측정 가능

- 최대 동작 주파수의 2배 이상 샘플링 가능해야만 신호 측정 가능

 -> ex) ATmega128 = 16Mhz 클럭 -> 샘플링 속도 32Mhz 이상

 

2) 멀티테스터기 multimeter

- 전압, 전류, 전기 저항 측정

- 보드 전원 체크 및 전원 사용량 등 측정시 멀티테스터기 사용

 

거버 파일 gerber file

- PCB 작업 결과 파일

- 부품, 핀 정보를 가짐 ->부품배치도

 

BOM 리스트

- 보드에 장착된 부품을 정리한 부품 리스트 파일

- 부품 구매 및 관리에 이용

- 설계 확정 후 최종 출력

 

ST-LINK

 

데이터 시트와 사용자 설명서 차이

- 데이터 시트 : 전기적/하드웨어적 특성 언급

- 사용자 설명서 : 레지스터 메모리맵과 같이 소프트웨어 관련 내용 언급

 

300x250
728x90

펌웨어 구현 준비물

1. CPU 보드

- 래퍼런스 보드, 평가보드 evaluation board, 개발보드 development board 라고도 부름

- AVR CPU, STK600 -> cpu 성능 평가, 재품 개발 기간 단축

써드 파티 <- 고가 보드를 본따 저가 보드 제조 판매

 

2. CPU 회로도

- 회로도 : 보드에 장차고딘 IC칩들간 연결을 그려놓은 설계도

- OrCAD나 PADS로 그림..

- CPU 판매사에서 제공. CPU 내부핀과 외부침 연결을 알수잇음

AVR  CPU 호로도

 

3. 데이터 시트

- IC칩 제조사가 만든 IC칩 사용 설명서

- 방대하고 어려운 문서. but 알아야 할부분은 제한적이므로 다 이해할필요는 없음

- 칩 부품번호, 번호 의미

- 일반적인 사항, 특징, 응용분야

- 온도/전압 범위

- 핀배치

- 전기/시간적 특성

AVR CPU 핀 배열

 

CPU 데이터시트

- CPU 내부 레지스터 구조

- 메모리맵

 -> CPU가 외부 디바이스나 내부모듈 제어를위해 필요한 레지스터들의 주소지도

 -> 펌웨어 구현에 반드시 필요

 

4.. 교차 개발 환경

- CPU가 실행할수있는 실행 파일을 만들고 타겟 보드에 다운로드 하기 위한 환경

- 타겟 보드는 성능이 부족해 실행파일 만들기 힘듬

- 호스트 PC에 에서 만듬

- 시리얼 케이블, 이더넷 케이블, USB 케이블 등으로 타겟 보드에 다운로드

 

터미널 프로그램

- 시리얼 케이블을 통해 타겟 보드와 호스트 PC가 통신하는데 사용

 

5. 디버거 장비

- 디버깅 및 기타 용도로 사용

- CPU의 내부 레지스터나 메모리값 등 확인 가능

 -> 소스 레벨 디버깅이 가능하도록 해줌. 소프트웨어를 멈추고 메모리 값을 확인할수있음

- 플래쉬 메모리에 펌웨어를 넣음

 -> 롬라이터 없으 온보드되어있는 플래쉬 메모리에 원하는값 써줌

 

6. 계측장비

오실로 스코프

- 하드웨어 개발을 위해 필요하며, 개발한 펌웨어가 제대로 동작하는지 확인

- 전기 신호를 시간 변화에 따라 화면에 그래프를 보여주는 장비

 -> 입력 신호 시간에 대한 전압 크기, 주기적인 신호 주파수, 성능에 따라 다양하게 측정 가능

* CPU나 메모리 동작상태나 신호 출력상태 확인에 필요

 

멀티 테스터기

- 개발한 펌웨어가 제대로 동작하는지 확인하는데 사용

- 저항값, 전압레벨, 전류값 등 확인 가능 

 

 

1) 자료 확보

ATmega128, STM32F103 -> 데이터 시트, 회로도 등 홈페이지에서 다운로드 가능

스냅드래곤 시리즈 -> 일반에 공개하지 않음

 

2) 펌웨어 개발에 필요한 소프트웨어

 1. 교차 개발환경

 2. 래퍼런스 펌웨어 소스

   개발자들이 자사의 CPU를 올바르게 사용할수있도록 제공

 3. 부트로더

   다운로더와 장비없이 펌웨어 업데이트가 가능, 실시간 운영체제를 올리는데 사용

 4. 실시간 운영체제

   네트워크 프로그램 같은 고차원 펌웨어 사용에 필요

 5. 디버거 장비용 소프트웨어

 

1. 교차 개발환경

- Atmel사의 AVR Studio

- Hp InfoTech 사의 CodeVision

- IAR System 사의 IAR Embedded Workbench

 

2. 래퍼런스 펌웨어 소스 

 avr soure 검색 -> 재조사나 깃헙 등으로 획득 가능

 

3. 부트로더

ATmega128(8비트 CPU)

- 운영체제 없이 쓰거나 부트로더없이 운영체제를 올리는 구조

-> 보통 부트로더를 필요로 하지 않음

- 디버거 장비없이 시리얼 만으로 호스트의 펌웨어를 가져와 업데이트 할때 부트로더를 사용할수있음

- 무선통신 : 지그비, RF4CE로 펌웨어 업데이트 가능

- OTAU(Over The Air Upgrade) : OTA 부트로더

 

4. 실시간 운영체제

- 멀티 태스크 환경을 구현하여 복잡한 프로그래밍을 세분화하여 쉽게구현가능한 환경

- 8비트 MCU에는 거의 사용되지 않았었음

- 8비트 CPU 발전과 복잡한 로직 구현 필요로 많이 채용되고 있음

 

FreeRTOS

- 무료로 제공

- 핵심 모듈 기본 제공

- 파일시스템이나 TCP/IP 스택은 필요에 따라 추가 가능

 

5. 디버거 장비용 소프트웨어

ISP 다운로더 장비 : CPU 내부에 접속하여 내부 플래시 메모리, 퓨즈, EEPROM 등을 지우거나 프로그래밍 하는 장비

JTAG 장비 : AVR CPU용 디버거 장비. AVR Dragon, JTAG ICE, JTAGICE mkII 등 다양함

* ISP는 다운로드만, JTAG 은 다운로드와 디버거 지원

 

 

300x250
728x90

BIOS

- Basic Input Output system

- 하드웨어 초기화 담당

- ROM에 저장 -> 하드디스크 준비 전 BIOS 실행 되어야 하기 때문

 

펌웨어 용어 시작

- 자연 시계 -> 기계식 시계 -> 전자식 쿼츠 시계 -> 디지털 시계

- 하드웨어로만 구현 : 복잡

- 마이크로 프로세서로 구현 (하드웨어 + 소프트웨어) : 하드웨어로 구현한것보단 간단. but SW없이 구동불가

  -> 하드웨어를 구동시키는 소프트웨어라는 의미  "펌웨어"

 

마이크로 프로세서와 펌웨어

- 프로그래밍 : 하드웨어로 구현한 기능을 소프트웨어로 구현

 -> 하드웨어는 수정 불가하나 프로그램은 추후 수정 가능

 

임베디드 시스템

- 마이크로 프로세서 혹은 CPU가 내장된 시스템

- 전기 사용되는 대부분 전자제품

 

펌웨어

- 임베디드 시스템의 HW/SW 연결

- 부트로더, 운영체제 커널, 디바이스 드라이버

 

스마트 폰 예시

- 터치 스크린 장치

- LCD - 터치센서 - 터치 컨트롤러

- 터치센서는 x/y축 좌표를 터치 컨트롤러에 전달.

- 터치 컨트롤러는 CPU에 좌표 전달 -> 디바이스 드라이버 이용

 

I2C 인터페이스

- 터치 컨트롤러의 인터페이스로 I2C 버스인터페이스사용

- 2개의 선으로 칩 간 통신 가능

- I2C 디바이스 드라이버 필요 -> CPU 내부 I2C 컨트롤러 블록 동작시키기 위해

-> CPU 특정 하드웨어 동작을위해 그에 맞는 펌웨어가 필요

 

I2C 컨트롤러 블록 동작 방법

- 특정 어드레스에 특정 값을 쓰면 하드웨어 블록들이 해당 동작을 수행

- status 레지스터, control 레지스터 보유

 

삼성 Exynos4412 CPU 구성

- 8개의 I2C 인터페이스와 컨트롤러

- 각각 32비트인 5개의 레지스터

- 어드레스 테이블을 매모리 맵이라 부름

 

부트로더

- 임베디드 시스템에 운영체제를 올림 + 하드웨어 초기화 작업

- 범용 컴퓨터 PC의 BIOS와 동일한 역활

- 임베디드 시스템에서는 RTOS라고 하는 작은 운영체제를 많이 사용했었음

 -> 근래 성능 향상으로 리눅스를 많이 사용

 

부트로더 저장 위치

- 가장 먼저 동작해야하므로 CPU의 리셋벡터 혹은 ROM의 시작 번지

-> CPU가 리셋되면 기계적으로 최초 어드레스에서 코드를 읽어오는 동작 수행(reset 벡터)

-> ROM에서 코드를 읽어와 순차적으로  실행 한 후 RAM에 복사하여 부팅 진행

 

부트로더 기능

1. CPU 초기화

 - 인터럽트 비활성화

 - watchdog 비활성화

 - clock, timer 셋팅

  * 부팅 관련 부분만 활성화 하고 나머지는 비활성화하거나 초기화

2. 메모리 컨트롤러 초기화

 - DRAM 컨트롤러 셋팅

3. 주변장치 초기화

 - 직렬 포트(UART) 초기화

 - 네트워크 장치 초기화

4. 커널 적재 및 램디스크 설치

 - 커널 - 운영체제의 핵심. 스케쥴러나 디바이스 드라이버 등이 포함됨

5. 커널 부팅

 

부트로더 종류

- 지원 CPU : ARM, Power PC, MIPS 등

- U-boot(Universal bootloader) : 가장 널리 쓰임. 다양한 CPU 지원

- FastBoot : 안드로이드 플랫폼에서 기본적으로 장착된 부트로더

- Redboot : 레드햇사 자사 RTOS인 리눅스 eCos의 부트로더로 사용하기 위해 제작

300x250
728x90

디바이스 드라이버 작성

-> 디바이스 드라이버 작성 및 테스트 필요

- 처음부터 개발 <-> 개발 시간 절약을 위해 기존 다비이스 드라이버 참고 or 유사 기능 디바이스 드라이버 참고

- 커널 소스트리 driver 디렉토리 밑에있는 디바이스 드라이버 참고 or 공개된 디바이스드라이버 참고

-> 기능 검증으로 사용시 에러가 발생되지 않고, 사용자가 쉽게 써야함

 

(1) 디바이스 드라이버 개요

1) 디바이스 드라이버 제어

2) 디바이스 유형

3) 디바이스 드라이버

4) 주번호, 부번호

 

1) 디바이스 드라이버 제어

디바이스 제어 방법

1. /dev/mem 디바이스 파일 사용

 - memory mapped io인경우 메모리 어드레스를 사용한 장치접근

 - 디바이스 상태 진단을위해 주기적으로 상태점검해야하는 폴링방식 사용

    -> 디바이스로부터 인터럽트 요구에 대한 핸들러 구현이 복잡

2. 디바이스 드라이버 사용 

 

리눅스에서 디바이스 접근

- 사용자 프로그램 : 디바이스 파일을 사용해 접근

- 커널 : 디바이스 식별자(주번호, 부번호) 사용

- 주번호 : 디바이스 드라이버 식별

- 부번호: 같은 디바이스드라이버를 사용하는 여러개 드라이버 식별하기위해 사용

 

디바이스 파일

- 디바이스 드라이버에 대한 파일형태 인터페이스

- 디바이스 드라이버에 대한 접근과 일반 파일에 대한 접근이 동일

- 커널에서 사용하는 디바이스 파일은 /dev 디렉토리에 저장

 

디바이스 파일 생성

- 디바이스 파일 생성 : mknde [디바이스 파일이름] [디바이스 유형] [주번호] [부번호]

 ex) mknod /dev/mydevice c 240 1

    -> mydevice 라는 문자형 디바이스 파일을 /dev/디렉토리 밑에 만들고 주번호 240, 부번호 1로 설정

- 디바이스파일처리 : 저수준 파일입출력함수사용

 

저수준 파일입출력함수

- open 열기

- close 닫기

- read 읽기

- write 쓰기

- lseek 이동

- ioctl(제어)

- fsync(동기)

- 저수준 입출력함수는 버퍼를 사용하지 않고 직접 시스템 콜 호출

- 스트림 파일 입출력 함수 : 중간처리용 버퍼를 사용해 형식화된 입출력가능, 함수이름앞에 접두사 "f" 붙음

 

디바이스 드라이버 소스

- /usr/src/linux/drivers : 에 있는 소스들을 참고/변형하여 새로운 디바이스 드라이버 제작

- 모듈 형태로 디바이스 드라이버 개발시 -> 커널 재구성때 Loadable module support 옵션 선택해야함

 

2) 디바이스 유형

리눅스 디바이스 유형

1. 문자 디바이스

2. 블록 디바이스

3. 네트워크 디바이스

 

문자 디바이스

- 자료의 순차성을 지닌 디바이스

- 버퍼 캐시를 사용하지 않음

- 장치의 raw 데이터를 사용자에게 제공

 ex) 터미널, 시리얼포트, 병렬포트, 키보드, 사운드카드, 스캐너

- 리눅스에서 문자 디바이스 : 디바이스 유형이 'c'로 표시

 

블록 디바이스

- 랜덤 액세스 가능

- 버퍼캐시를 사용한 블록단위 입출력

- 파일시스템에 의해 마운트 되어 관리되는 디바이스

 ex) 디스크, RAM-DISK, CD-ROM

- 리눅스에서 블록 디바이스 : 디바이스 유형이 'b'로 표시

 

네트워크 디바이스

- 대응되는 디바이스 파일이 없음

- 네트워크를 통해 패킷을 송수신할수있는 디바이스

- 응용프로그램과의 통신은 socket(), bind() 등 전용 시스템 콜함수사용

 ex) 이더넷, PPP, ATM

 

3) 디바이스 드라이버

개요

- 커널은 디바이스 드라이버를 통해 입출력 디바이스 액세스

- 디바이스를 제어하는데 사용되는 데이터 구조체와 함수들로 구성

- 사용자 : /dev 디렉토리에 저장된 특수 파일의 파일명을 사용해 액세스

- 커널 : 디바이스 드라이버와 디바이스 주번호, 부번호로 액세스

user program <-> device file <-> VFS <-> device driver <-> real device

* 사용자 프로그램과 디바이스 드라이버 인터페이스는 가상 파일 시스템 상에 구현된 디바이스 드라이버를 통해 됨

 

사용자 관점에서 디바이스 드라이버

- 사용자는 디바이스 자체 자세한 정보 알필요없음

 ->디바이스는 하나의 파일로 인식

- 디바이스 파일 접근을 통해 실제 디바이스에 접근 가능

 

4) 주번호, 부번호

주번호 major number

- 리눅스 커널에서 사용할 디바이스 드라이버의 식별자로 0~255 숫자할당

- 2.4 커널 8비트 할당, 2.6커널 12비트 할당

 ex) 21: SCSI, 3 : IDE HDD

- 커널에서 사용하는 주번호 정보 : include/linux/major.h

 

부번호 minor number

- 동일한 디바이스 드라이버를 사용하는 서로 다른 장치 구분

- 2.4 커널 8비트

- 2.6 커널 20비트 할당

 ex) IDE 하드디스크 드라이버의 주번호=3인경우 첫번째 하드디스크 부번호 0, 두번째 하드디스크 번호는 1

 

 

 

 

(2) 디바이스 드라이버 작성

1) 디바이스 드라이버 작성 절차

2) 디바이스 드라이버 등록과 삭제

3) 파일 처리 함수

4) 디바이스 드라이버 컴파일

 

1) 디바이스 드라이버 작성 절차

작성 절차

1. 디바이스 드라이버 모듈 프로그램 작성 및 컴파일

2. insmod 유틸리티를 통해 디바이스 드라이버 모듈 적재 (커널에서 디바이스 드라이버 주번호 할당)

3. mknod 를 이용해 할당된 주번호로 디바이스 파일 생성

4. lsmod 유틸리티로 디바이스 드라이버 정상 등록 유무 확인

5. 디바이스 사용

6. 사용끝나면 rmmod 유틸리티를 사용하여 디바이스 드라이버 모듈 해제

 

기본 함수

- init_module() : 디바이스 드라이버 등록, 메모리 할당, 초기화

- cleanup_module() : 디바이스 드라이버 제거, 할당된 IO memory 영역 변환

- 함수 : read(), ioctl(), write(), open(), release()

-> 사용자 공간과 커널 공간의 데이터 전송, 메모리에 값을 읽거나 씀

 

디바이스 드라이버 원형

- 파일 처리 함수 데이터 구조체 생성 및 구조체 맴버변수에 제작한 함수 매핑

#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 =
{
	read:device_read,
    write:device_write,
    open:device_open,
    release:device_release
};
// 파일 처리 함수

int init_module(void){} // 모듈 설치시 초기화 수행
void cleanup_module(void){} // 모듈 제거시 반환 작업 수행

/*
디바이스 드라이버는 모듈 프로그램 사용
-> 모듈 프로그램 원형에 디바이스 드라이버에 필요한 파일 처리 함수부분 추가
*/

 

 

2) 디바이스 드라이버 등록과 삭제

디바이스 드라이버 등록

- 디바이스 드라이버를 커널에 등록하는 함수

- 문자형 디바이스 : int device_chrdev(unsigned int major, const char *name, struct file_operations *fops);

- 블록형 함수 : int register_blkdev(unsigned int major, const char *name, struct file_operations *fops);

- 파라미터

  주번호 : 0을 주면 사용하지 않는 값반환

  이름 : /proc/devices에 표시 

  fops : 디바이스와 연관된 파일 연선 구조체 포인터 

- 음수가 반환시 오류가 발생한것. 디바이스 드라이버의 init_module()에서 호출

 

디바이스 드라이버 제거

커널에 등록되어있는 디바이스 드라이버 제거

- 문자형 디바이스 : int unregister_chrdev(unsigned int major, const char *name);

- 블록형 디바이스 : int unregister_blkdev(unsigend int major, const char *name);

- 디바이스 드라이버내 cleanup_module 루틴 안에서 호출

 

3) 파일 처리 함수

개요

- 디바이스 드라이버를 일반적인 파일과 유사한 인터페이스를 이용해 관리

- 디바이스는 파일 형태로 존재

- 커널은 파일 연산을 이용해 IO 연산수행하도록 인터페이스 구성

- 디바이스 드라이버 구현? -> 파일 연산 구조체에서 요구되는 기능들을 프로그래밍

ex) "mydev" character device의 파일 연산 구조체 예시

static struct file_operations mydev_fops = {
	write:mydev_put,
    read:mydev_get,
    ioctl:mydev_ioctl,
    open:mydev_open,
    release:mydev_release,
};

void mydev_put(){};
void mydev_get(){};
void mydev_ioctl(){};
void mydev_open(){};
void mydev_release(){};

 

file_operations 구조체

- 디바이스에 따라 선택적으로 사용

- 디바이스 연고나 연산은 함수를 직접구현하여 이 구조체의 해당함수로 매핑

 

파일 연산 구조체의 맴버 연선

- lseek() : 파일 액세스 지점 이동

- read() : 디바이스로 부터 데이트 입력받음

- write() : 디바이스로부터 데이터를 출력받음

- readdir() : 디렉토리 엔트리읽음

- poll() : 디바이스로부터 이벤트를 대기하므로 현재 프로세스를 대기큐에 넣음

- ioctl() : 디바이스 파일을 제어하며, read/write 함수로 처리할수없는 입출력 데이터 처리에 사용.

- mmap() : 파일이나 디바이스를 현재 프로세스의 메모리공간에 매핑

- open(),release()  : 디바이스 열기 닫기

- fsync() ; 버퍼에 남은 데이터를 모두 디바이스에 사용

 

4) 디바이스 드라이버 컴파일

- 일반 어플리케이션 컴파일 방법에도 별도 옵션 추가

-> 디바이스 드라이버는 모듈로 되어잇어 모듈프로그램 컴파일과 동일

ex) arm-linux-gcc -c -Wall -D__KERNEL__ -DMODULE -O2 driver.c

-> arm 용 크로스컴파일러를 사용한 예시

 

디바이스 드라이버 컴파일 옵션

- -c : 목적 파일이 insmod 명령을 통해 커널과 동적으로 링크 -> 링커를 호출하지 않고 컴파일만 진행

- -D__KERNEL__ : 소스의 선택적 컴파일

- -DMODULE : 소스의 선택적 컴파일을 위해 심볼 정의필요, 모듈 프로그램인 경우 커널과 모듈 심볼은 반드시 정의

- -O2 : 컴파일 최적화 레벨을 2로 설정. 컴파일러는 실행코드가 너무커지지 않는범위서

        실행속도를 빠르게하는 최적화 작업 수행

 

디바이스 드라이버 컴파일

- makefile을 작성해 make

CFLAGS=-D__KERNEL__ -DMODULE -Wall -O2
MODULE_OBJS=hello.o
$(MODULE_OBJS):
	arm-linux-gcc $(CFLAGS) -c hello.c
clean:
	rm -f *.o

 

 

 

(3) 디바이스 드라이버 사용 및 분석

1) 디바이스 드라이버 사용 절차

2) 디바이스 드라이버 작성 예시

3) 디바이스 드라이버 분석

 

 

1) 디바이스 드라이버 사용 절차

디바이스 드라이버 사용절차

1. 디바이스 드라이버 로딩

 - 컴파일한 모듈을 insmod 명령어로 로등

 - mknod 명령어로 디바이스 파일 생성

2. 응용프로그램 작성

 - open 함수로 디바이스 파일 열기

 - 디바이스 드라이버에서 제공하는 함수를 이용해 디바이스 제어

 - close()함수로 디바이스 파일 닫기

3. 디바이스 드라이버 제거

 - rmmod 명령어로 모듈 제거

 

2) 디바이스 드라이버 작성 예시

모듈 프로그램 소스

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void){
	printk("Start pf module!!\n");
}

void cleanup_module(void){
	printk("end of module!!\n");
}

Makefile

CC=arm-linux-gcc
KEERNELDIR=/working/kernel/linux-2.4.20
INCLUDEDIR=-I$(KERNELDIR)/include -I./

CFLAGS=-D__KERNEL__ -DMODULE -Wall -O2 -I$(INCLUDEDIR)

MODULE_OBJS=mymod.o
MODULE_SRCS=mymod.c

$(MODULE_OBJS):
	$(CC) $(CFLAGS) -c $(MODULE_SRCS)

clean:
	rm -f *.o

 

드라이버 적재 및 삭제

# insmod mymod.o // 모듈을 커널에 로딩
Using mymod.o
Start of Module !! //init_module 함수가 실행되어 printk함수에 의해 출력

# lsmod
Module	size	Usedby
mymod	247		0(unused)

# rmmod mymod //cleanup_module 함수 실행
End of Module !!

 

3) 디바이스 드라이버 분석

디바이스 드라이버

- ARM 프로세서 기반 하드웨어 플랫폼에서 ARM의 GPIO에 연결된 LED를 제어하는 LED 디바이스 드라이버소스

#include <linux/ioport.h>
#include <asm/uaccess.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/io.h>

#define LED_MAJOR 0
#define LED_NAME "LED PORT"
#define LED_MODULE_VERSION "v1.0"
#define LED_ADDR 0xf1600000
#define LED_ADDR_RANGE 1
// LED 디바이스 주번호, 디바이스이름, 버전번호, 가상어드레스 주소, 어드레스 범위

static int led_usage = 0;
static int led_major = 0;
//LED 사용 여부 표시하는변수, 주번호 저장하는 변수

int led_open(struct inode *minode, struct file *mfile);
int led_release(struct inode *minode, struct file *mfile);
ssize_t led_writeb(struct inode *minode, const char *gdata, size_t length, loff_t *off_what);

static struct file_operations_led_fops = {
	write:led_writeb,
    open:led_open,
    release:led_release,
};

int init_module(void){
	int result;
    
    result = register_chrdev(LED_MAJOR, LED_NAME, &led_fops);
    if (resulr <0){
    	printk(KERN_WARNING "can't get any major\n");
    	return result;
    }
    led_major =result;
    //커널에 등록된 IO자원중 지정된 주소로부터 일정 크기 영역사용가능한지 여부 확인
    if(!check_region(LED_ADDR, LED_ADDR_RANGE))
    	request_region(LED_ADDR, LED_ADDR_RANGE,LED_NAME); //시용영역확부
    else
    	printk("Can't get IO region");
    printf("init module, led major number : %d\n",result);
    return 0;
}

void cleanup_module(void){
	release_region(LED_ADDR, LED_ADDR_RANGE);
    if (unregister_chrdev(led_major, LED_NAME))
    	printk(KERNEL_WARNING "%s driver cleanup failed \n",LED_NAME);
}

int led_open(struct inode *mindoe, struct file *mfile){
	if (led_usage !=0) return -EBUSY;
    MOD_INC_USE_COUNT;
    led_usage=1;
    return 0;
}

int led_open(struct inode *mindoe, struct file *mfile){
    MOD_INC_USE_COUNT;
    led_usage=0;
    return 0;
}

//디바이스에 데이터를 써넣는 함수
ssize_t led_Writeb(struct file *inode, const char *gdata, size_t length, loff_t *off_what){
	unsigned char *addr;
    unsigned char c;
    
    //사용자 영역변수인 gdata로부터 커널영역인 c변수로 데이터 전달받음
    get_user(c, gdata);
    addr=(unsigned char*)(LED_ADDR);
    *addr=c;
    return length;
}

 

 

응용 프로그램

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char **argv){
	int dev;
    char buff;
    
    if (argc <= 1) return -1;
    dev = open("/dev/led", O_WRONLY);
    if (dev != -1){
    	buff =atoi(argv[1]);
        write(dev, &buff, 1);
        close(dev);
    }
    else {
    	printf("Device open Error\n");
        exit(-1);
    }
    return 0;
}

 

300x250

+ Recent posts