ISP 프로젝트를 위한 회로 구성은 다음과 같은 모양으로 할것이다. 입문과정의 SPI 설명글에서는 target CPU를 ATmega328P를 연결하였지만, 이번 프로젝트에서는 ATtiny85를 연결하도록 하겠다. ISP 프로젝트를 진행하기에 앞서 taget CPU의 동작을 먼저 검증해보는 코드를 만들어 보도록 하겠다. ATtiny85의 2번 핀에 LED 하나를 연결하고, 일정한 주기로 점멸하는 코드를 만들어 보기로 하겠다. #define F_CPU1000000 #include #include #define LED0x08 int main(void) { DDRB = LED; PORTB= LED; /* Replace with your application code */ while (1) { PORTB ^= L..
Bootloader 프로젝트에서 별도의 장비없이 UART를 통해서 application 프로그램을 AVR의 Flash memory에 프로그램하는 방법에 대해서 설명하였다. 하지만 bootloader 프로그램 자체는 ISP 장치를 이용하여 프로그램하였다. 이처럼 임베디드 시스템을 처음 만들었을때의 시점에는 이 장치에서 돌아가는 프로그램은 아무것도 없는 상태이다. 즉, bootloader 프로그램조차도 없는 완전한 백지 상태인 것이다. 이러한 백지상태의 시스템에서 동작되어야 하는 첫번째 실행파일을 넣어주기 위해서는 어떠한 형태이든지 장비를 이용할 수 밖에 없게 된다. 대량의 양산 단계에서는 ROM writer 장비를 이용하여 Flash 메모리에 image 파일을 프로그램하겠지만, 임베디드 시스템의 개발 단계..
이번에는 Bootloader 프로그램을 이용하여 현재 application 메모리 영역에 어떤 프로그램이 쓰여져 있는지 읽어 오는 기능을 구현해 보기로 하겠다. 이 기능을 위해서 Bootloader 프로그램에 추가로 구현해 줄 내용은 없다. 이미 앞의 글에서 다루었던 verify 기능을 그대로 이용하면 되기 때문이다. Read 기능을 수행하여 새로운 Hex 파일로 만드는 것은 순전히 PC 프로그램의 기능일 뿐이다. Read 기능이 수행된 모습은 다음과 같다. PC 프로그램을 실행하여 AVR bootloader 프로그램과 커넥션을 맺은 다음, Get ID버튼을 눌러 AVR 정보를 읽어 온다.그 다음 AVR의 application 메모리 영역에서 읽어온 데이터를 어떤 파일로 생성할지 파일을 정한 다음 'Re..
Bootloader 프로그램이 동작되는 CPU의 상세정보를 알아내었고, 이 CPU에서 동작되는 application 프로그램의 Hex 파일로부터 데이터를 문제없이 추출하였으므로, 이제 다음 단계로 Hex 파일에서 추출한 데이터를 실제 CPU 내부 flash memory에 write 하는 기능을 구현해 보도록 하겠다. 이미 앞에서도 설명하였듯이 Flash 메모리에 데이터를 쓰기 위해서는 해당 영역을 지우는(Erase) 동작이 선행되어야 한다.Erase에 대한 명령은 'e'를 사용한다. Flash 메모리의 erase는 page 단위로 이루어지므로 page의 크기와 몇개의 page를 지워야 하는지 알려주어야 한다.Bootloader 프로그램은 위의 정보를 이용하여 필요한 크기만큼만 Flash 메모리를 지우는 ..
앞에서 설명한 내용처럼 bootloader 프로그램이 실행되는 CPU의 종류와 상세정보를 획득하였으면, 그 CPU에 맞게 만들어진 실행파일을 UART를 통하여 전달하는 단계를 수행하는 것이 다음 순서이다.이때 사용되는 파일이 intel사에서 만든 규격인 hex 파일 포맷이다.Hex 파일은 다음과 같은 모양으로 만들어져 있다. :100000000C9434000C943E000C943E000C943E0082 :100010000C943E000C943E000C943E000C943E0068 :100020000C943E000C943E000C943E000C943E0058 :100030000C943E000C943E000C943E000C943E0048 :100040000C943E000C943E000C943E000C943E..
이제 본격적으로 Bootloader 기능을 하나씩 하나씩 만들어 가보도록 하겠다. 가장 먼저 할 일은 bootloader가 동작하는 AVR이 어떤 종류의 CPU인지 정확한 정보를 컴퓨터에서 알아오는 것이다. 입문과정 블로그 글 중에서 SPI를 설명할 때 SPI를 통해서 Slave AVR의 Signature byte(Device ID) 정보를 읽어 오는것을 실습하였다. Bootloader 프로그램에서도 boot_signature_byte_get() 함수를 이용하면 Signature 정보를 얻어 올 수 있다. 이 signature 정보를 가지고 해당 디바이스가 어떤 구조를 가지고 있는지 bootloader 기능을 구현하는데 필요한 내용을 읽어올 수가 있다. AVR bootloader 프로그램과 커넥션이 연결..
앞의 글에서 AVR이 시작될 때 조건에 따라 bootloader 모드로 진입하는지, 아니면 normal(application) 모드로 진입할 것인지 결정하는 프로그램을 만들어 보았다. 이 프로그램은 지금은 application flash section에서 동작된다. 이번 글에서는 이 프로그램이 bootloader flash section에서 바로 실행이 되도록 하는 방법에 대해서 설명하도록 하겠다. 위의 그림은 AVR data sheet 문서에 나오는 그림이다. Fuse register에 있는 BOOTSZ의 값에 따라 Bootloader flash section의 크기를 조정할 수 있다는 것을 설명하고 있다. 위의 표에서 BOOTSZ값에 따른 bootloader flash section의 크기와 주소 범..
Bootloader 프로젝트는 UART를 이용하여 진행되므로 UART 연결 회로를 구성하여야 되고, 디버깅 목적으로 LED 하나를 연결하는 회로를 추가하면 된다. 위의 회로가 정상적으로 연결되었는지 확인하는것으로부터 프로젝트를 시작하도록 하겠다. uint8_t uart_poll(void) { uint8_t data = 0; if (uart->ucsr_a & RXC) data = uart->udr; return data; } uart.c 파일은 심화 과정중에서 패킷통신 글에서 사용하였던 파일을 그대로 사용하도록 하겠다. 그리고 위에 보이는 uart_poll() 이라는 함수를 추가하였다. 이미 기존에 사용하였던 uart_rx()함수는 UART로 어떤 데이터가 수신될 때까지 무한히 기다리는 함수이다. 다시 말..
일반적인 의미에서 bootloader라고 하는 것은 컴퓨터나 임베디스 시스템이 처음 기동할 때 기본적인 하드웨어의 동작을 검사 한 후, 이상이 없으면 하드디스크나 플래쉬메모리에서 OS 커널을 RAM으로 복사하여 OS가 시작되도록 하는 작은 프로그램을 의미한다. 하지만, AVR에서 말하는 bootloader는 위에서 설명한 의미 보다는 아이폰이나 안드로이드폰과 같은 단말기의 OS를 업데이트하는 개념과 비슷하다.즉, 특별한 장비없이 ROM 파일을 변경할 수 있는 셀프 프로그램이라고 보면된다. AVR의 bootloader 프로그램을 개발하기 위해서는 몇가지 읽어야 할 문서들이 있다. AVR(ATmega328) datasheet 문서중에 "Boot Loader Support – Read-While-Write S..
앞의 글에서 구현했던 패킷 통신 프로젝트는 수신측에서 데이터를 수신 하든지 말든지 관계없이 송신측에서 일방적으로 데이터를 내보내는 구조를 가지고 있다. 즉, broadcast 방식인 셈이다. 이렇게 만든 통신 방식은 송신측에서는 단순하게 기능을 구현할 수 있는 장점이 있는 반면, 쓸데없는 자원을 낭비하는 것이라고 생각할 수 있다. 누군가가 데이터가 필요할 때 어떤 데이터가 필요한지 요청하고, 그 요청에 따른 결과를 되돌려주면 좀더 효율적인 통신이 이루어진다. 따라서, 이번 글에서 다룰 프로젝트는 Request/Reply 방식의 패킷 통신을 구현해 보는것이다. 컴퓨터 프로그램에서 특정 데이터를 요구하는 request message를 AVR로 보내면, AVR은 요청에 맞는 데이터를 reply 해 주는 것이다..