'혼자서 놀기...'에 해당되는 글 26건

  1. 2009.12.26 STM32 보드에 펌웨어 퓨징
  2. 2009.12.26 STM32 개발 환경
  3. 2009.12.24 STM32 Memory Map 1
  4. 2009.11.29 VMware - keyboard hook timeout... error 해결책 1
  5. 2009.10.06 Little Endian 과 Big Endian
  6. 2009.10.06 Cortex-M3(STM32) System Architecture
  7. 2009.10.05 STM32F103C6T6
  8. 2009.09.29 Cortex M3 - Bit Banding
  9. 2009.09.23 STM32F103C6
  10. 2009.09.02 순대보드 Kernel Image
2009. 12. 26. 14:19

STM32 보드에 펌웨어 퓨징



ST 홈페이지에서 다운로드 한 Flash Loader를 이용해 펌웨어 바이너리 파일을 실제 STM32 개발 보드에 퓨징하는 방법이다.

먼저 STM32 보드를 개발용 PC에 연결을 해야 한다.
  • RS232 시리얼 케이블을 연결한다.
  • 전원을 인가하기 위해 USB 케이블을 연결한다.(USB로 전원을 받아옴..)

차후에 봐야 할 부분이지만, STM32 Cortex M3에서 System boot에 대한 mode가 두 가지가 있다.
  • FLASH mode - 올려진 펌웨어를 실행하는 모드 정도로 보면 될듯 하다.
  • SYSTEM mode - 보드에 펌웨어를 올리기 위한 모드..

mode 스위치를 SYSTEM mode로 위치시킨 후 Flash Loader 프로그램을 실행한다.

Next 버튼을 클릭한다.
Flash Loader에서 타겟보드를 인식하게 되면 위와 같이 신호등 아이콘에 녹색 불이 들어온다.
위와 같이 나오지 않는다면, System Boot Mode를 한 번 더 확인하고 리셋 후에 Flash Loader 프로그램을 재실행 시켜보면 될 것이다.
Flash에 32Kb 가 잡혀있다. 현재 사용하는 타겟보드가 Cortex M3 Low-Density임을 알 수 있다.

Next 버튼을 클릭해 다음으로 넘어가자.
Target에 자동으로 STM32_Low-density_32K 로 잡힌다.
Flash 란에 내부의 Flash 메모리에 대한 Page 내용을 알 수 있다. 시작 위치는 아무래도 Page0번의 0x08000000인 듯 하다. 이 위치에 퓨징하고자 하는 펌웨어가 올라가는 듯 하다.

Next 버튼을 클릭해 다음으로 넘어간다.
실제 타겟보드로 다운로드 할 펌웨어의 경로를 찾아서 올려야 한다.
Download to device 란의 ... 버튼을 클릭해 다운로드 할 펌웨어 바이너리 파일을 선택한다.
필요에 따라 기존의 데이터를 지워고 퓨징하기 위해 Erase necessary pages를 선택한다.
퓨징하려는 address가 8000000인지 확인을 한다.

Next 버튼을 클릭해 다음으로 넘어간다.
정상적으로 퓨징이 이루어진 화면이다.

Finish를 클릭해 Flash Loader를 종료한다.

정상적을 퓨징이 되었는지 확인을 하려면, 타겟보드의 System Boot Mode를 FLASH의 위치에 스위치를 옮기고, 리셋버튼을 살 짝 눌려주면 된다.


'혼자서 놀기... > STM32' 카테고리의 다른 글

STM32 개발 환경  (0) 2009.12.26
STM32 Memory Map  (1) 2009.12.24
Cortex-M3(STM32) System Architecture  (0) 2009.10.06
STM32F103C6T6  (0) 2009.10.05
Cortex M3 - Bit Banding  (0) 2009.09.29
2009. 12. 26. 11:00

STM32 개발 환경



STM32 개발 환경을 위해선 크게 펌웨어 소스코드를 컴파일 할 수 있는  컴파일러와 STM32  보드에 컴파일된 바이너리 코드를 퓨징하기 위한 퓨징 프로그램이 필요하다.


컴파일러

STM32 를 위한 컴파일러로는 Keil, Ride7, IAR 등이 있다.
본인이 가진 STM32F103C6T6 보드의 회사에서 추천하는 IAR 이라는 컴파일러를 사용하려 한다.
IAR 컴파일러는 IAR Systems(www.iar.com) 에서 다운로드 받을 수 있고, 현재 무료로 사용할 수 있는 버전은 최대 32KByte의 Binary를 만들어낼 수 있다. 그 이상은 유료 버전을 사용해야 하는 듯..

먼저 www.iar.com에 접속을 한 뒤 Downloads를 클릭한다.

Downloads 항목 중 ARM의 Kickstart edition을 클릭한다.

Continue... 를 클릭한다.

Product Registration and Download 의 항목들을 적절히 채워 넣고, submit registration 을 클릭한다.

입력한 E-mail을 통해 다운 받을 수 있는 링크와 시리얼 넘버를 얻을 수 있다.
다른 프로그램과 같이 설치하면 STM32 용 IAR 컴파일러를 설치할 수 있다.


퓨징 프로그램

펌웨어 바이너리 파일을 STM32 보드에 퓨징하기 위한 프로그램은 CPU 제조회사인 ST에서 제공을 한다.
ST의 STM32 다운로드 사이트(http://www.st.com/mcu/familiesdocs-110.html#Software for Tools) 에 접속을 해서 Software - PC 항목의 Flash loader demonstrator 를 다운로드 받는다.
압축을 풀고 Setup 프로그램을 실행하여 설치한다.

이상으로 STM32 펌웨어를 개발하기 위한 환경 설정은 끝났다.

뭐든 처음은 생각보다 초 간단해서 좋긴 한데..


'혼자서 놀기... > STM32' 카테고리의 다른 글

STM32 보드에 펌웨어 퓨징  (0) 2009.12.26
STM32 Memory Map  (1) 2009.12.24
Cortex-M3(STM32) System Architecture  (0) 2009.10.06
STM32F103C6T6  (0) 2009.10.05
Cortex M3 - Bit Banding  (0) 2009.09.29
2009. 12. 24. 14:16

STM32 Memory Map



STM32는 총 4G의 메모리 공간을 갖고, 각각은 512 MB로 된 8개의 블록으로 이루어져 있다.

다음은 4G의 메모리 영역이 각각 어떻게 사용되고 있는지를 보여준다.

코드 영역(0x00000000 ~ 0x1FFFFFFF)은 I-Code bus와 D-Code bus를 사용해 명령어 패치와 데이터 접근을 수행한다.
코드 영역은 프로그램 코드를 실행할 수 있고, 데이터를 저장 할 수 도 있는 영역으로 사용된다. 이 영역에서 캐시 속성은 WT(Write Through)인 쓰기 버퍼 영역이다. 이 곳은 on-chip Flahs memory 가 사용되고 있으며, 현재 본인이 사용하고 있는 보드에는 32KBytes 크기의 Flash memory가 장착되어 있다.
일반적으로 프로그램 코드는  이 코드 영역, SRAM 영역, 또는 외부 RAM(External RAM)영역에 위치할 수 있는데, 일반적으로 코드 영역에 위치시키면 두 개의 분리된 버스 인터페이스(I-Code, D-Code)를 통해 명령어 페치와 데이터 접근을 동시에 수행할 수 있어 좋다고 한다.

SRAM 메모리 영역(0x20000000 ~ 0x3FFFFFFF) 내부 SRAM과 연결하기 위해 존재한다.
이 영역은 쓰기 버퍼 영역이고, 캐시 속성은 WB-WA(Write Back, Write Allocated)이다. 프로그램 코드는 코드 영역과 마찬가지로 SRAM 영역에서도 실행 될 수 있다. 하지만, 코드 영역에서 실행하는 것보다는 느리다고 한다. 그래서, 프로그램 실행코드는 코드 영역에 위치시키고 실행시키기를 권고(?)한다.
이 영역은 on-chip RAM을 사용하기 위한 공간이고 현재 사용하고 있는 보드에는 10 KBytes SRAM이 장착되어 있다. 이 영역은 System bus(시스템 버스)를 통해 접근을 하게 된다. 이 영역에는 32 MB의 Bit Band Alias 영역이 존재한다. Bit Banding에 관한 내용은 여기를 참고하면 될 듯 하다.

주변장치(Peripheral) 영역(0x40000000 ~ 0x5FFFFFFF)은 시스템에 장착되어 있는 주변장치(RTC, I2C, ADC, GPIO, USART 등) 에 대해 접근을 하는 용도로 사용된다. ARM의 경우, 이 영역에 데이터를 쓰고 읽는 방법을 통해 장치를 제어할 수 있다. 예를 들어 LED를 켤 때에는 LED 장치가 물려 있는 GPIO의 핀에 1 혹은 0의 값을 쓰는 것을 통해 LDE를 끄고 켤 수 있다. 이 영역 또한 SRAM 메모리 영역과 마찬가지로 32 MB 의 Bit Band Alias 영역이 존재한다. 주변정치 영역은 System bus(시스템 버스)를 통해 접근을 하게 된다.
이 영역은 캐시 불가능 영역이고, 명령어 코드를 실행할 수 없다(Excute Never).

외부 RAM(External RAM) 영역(0x60000000 ~0x9FFFFFFF)은 외부 RAM을 위해 할당된 1G의 메모리 영역이다.
이 영역 중(0x60000000 ~ 0x7FFFFFFF)은 이 영역은 on-chip 또는 off-chip 메모리를 위한 공간이다. 캐시가능 영역(WB-WA)이고, 코드를 실행할 수 있다.
나머지 영역(0x80000000 ~ 0x9FFFFFFF)은 on-chip 또는 off-chip 메모리를 위한 공간이다. 캐시가능 영역(WT) 이고, 이 영역에서는 코드를 실행할 수 있다.

외부 장치(External Device) 영역(0xA0000000 ~ 0xDFFFFFFF)은 외부 장치를 위해 할당된 1G의 메모리 공간이다. 이 영역은 순차적이면서 버퍼 기능이 없는 접근을 요구하는 외부 장치들과 공유 메모리를 위해 만들어졌다. 코드 실행 불가한 메모리 영역이다.

마지막 0.5 GB의 메모리 공간(0xE0000000 ~ 0xFFFFFFFF)은 시스템 레벨 컴포넌트들과 내부의 주변장치 버스들, 외부의 주변장치 버스, 그리고 벤더의 특화된 시스템 주변장치들을 위한 메모리 공간이다.
이 영역은 캐시/버퍼 불가능한 영역이고, 전용 주변장치 버스 메모리 범위하에서 순차적으로 접근이 이루어 진다.





'혼자서 놀기... > STM32' 카테고리의 다른 글

STM32 보드에 펌웨어 퓨징  (0) 2009.12.26
STM32 개발 환경  (0) 2009.12.26
Cortex-M3(STM32) System Architecture  (0) 2009.10.06
STM32F103C6T6  (0) 2009.10.05
Cortex M3 - Bit Banding  (0) 2009.09.29
2009. 11. 29. 22:42

VMware - keyboard hook timeout... error 해결책



Windows 7 에서 VMware를 사용하다가 발생한 메시지 중 아래와 같은것이 발생했다.

그냥 지나가도 크게 상관은 없을 듯 한데..
눈에 거슬려서..

구글에서 검색한 결과 아래의 사이트에 문제점 및 해결책이 잘 나있다.
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009409

regedit 파일을 열어서
"\HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout" 를 생성하고, 값으로 10진수 5000을 넣어준다.

그리고 나서 VMware를 실행하면 위의 메시지 창이 사라진 것을 볼 수 있다.

'혼자서 놀기...' 카테고리의 다른 글

Little Endian 과 Big Endian  (0) 2009.10.06
메모리 단위  (0) 2009.09.01
VMware http://vmware.com/info?id=97. 오류 해결 방법  (0) 2009.08.05
Ubuntu 에서 리눅스 개발환경 설정  (0) 2009.06.22
Ubuntu에서 NFS setting  (0) 2009.06.19
2009. 10. 6. 17:36

Little Endian 과 Big Endian



엔디안(Endian)이라는 단어 솔직히 컴퓨터 관련 업종에 있다보면 수없이 들어봤음직한 단어이다.
그런데도 갑자기 Endian 이 뭐냐고 물어보면... 뭐라고 해야하나?? -_-;;

간단히 말하면..
Endian이란 녀석.. 메모리란 1차원적인 공간의 데이터를 처리하기 위한 접근 방식이라고 하면 될려나??

일단 컴퓨터를 통해 무엇인가를 하려 한다면 메인 메모리에 접근을 해야만한다. 그런데 이 메인 메모리에 접근하는 데에도 방식이 있단다.
바로 Endian!!
이것이 헷갈리는 이유는 Endian이 하나가 아니고 두개라서(?) ㅋ

먼저 Big Endian 이란 녀석을 보자.
구글에서 검색을 하니 이런 사진이 검색이 되던데.. 설명하기에 좋은 사진인 듯 하다.
한 워드의 데이터가 메인 메모리 공간에 접근할 때, 데이터의 가장 상위 바이트가 메모리의 가장 낮은 주소로 접근하는 방식이다. 물론 데이터의 가장 하위 바이트는 메모리의 가장 큰 주소로 접근할 것이다.
이것이 Big Endian 이란 녀석이다.

Big Endian은 표현되는 순서가 사람이 보는 관점과 동일하다. 그렇기 때문에 디버깅이라든지 다른 작업시 메모리 값을 확인하기가 편하다.
예를 들어 0x12345678 이라는 값이 있다면, 각 메모리 주소에는 0x12, 0x34, 0x56, 0x78 이 들어있게 되는 것이다.

다음은 Little Endian..
Little Endian 은 Big Endian 과 정 반대의 접근 방식이라고 보면 된다.
한 워드의 데이터가 메인 메모리 공간에 접근을 한다면, 데이터의 가장 상위 바이트는 메모리의 가장 상위의 주소로 접근을 하고, 데이터의 가장 하위 바이트는 메모리의 가장 낮은 주소로 접근을 하게 된다.
위에서 예를 든 0x12345678을 Little Endian 식으로 표현을 하면 메모리 주소에는  0x79, 0x56, 0x34, 0x12 가 들어있게 된다.

Little Endian 이든 Big Engian 이든 한 바이트 단위로 접근을 한다면 아무런 문제 없이 사용할 수 있다. 하지만, 그 이상의 단위로 접근을 하게 될 때에 이를 잘못 사용한다면.. 뭐 정상적인 동작을 하지 않을 것이다.
컴퓨터란 녀석한테는 무지 중요한 개념(?) 중 하나인 것이다. 개념 컴퓨터... ㅋㅋ

뭐 당연한 이야기인가?? -_-;;

2009. 10. 6. 17:21

Cortex-M3(STM32) System Architecture



Cortex-M3(STM32) System Architecture

'Low-, Medium-, High-density devices'
는 4 개의 Master, 4 개의 Slaves로 이루어져 있다.
  • 4 개의 Masters
    • Cortex-M3 core DCode bus(D-bus), System bus(S-bus)
    • GP-DMA1 , 2 (General-Purpose DMA)
  • 4 개의 Slaves
    • Internal SRAM
    • Internal Flash Memory
    • FSMC
    • AHB to APB bridges(AHB2APBx)

Low-, Medium-, High-density System Architecture

ICode bus
Cortex-M3 core와 메인 메모리(Flash Memory)간의 Instruction Interface 정도로 생각하면 될듯 하다.

DCode bus
Cortex-M3 core와 메인 메모리(Flash Memory)간의 Data Interface 정도로 생각하면 될듯 하다.

System bus
Cortex-M3 core에서 peripherals bus와 관련있는 system bus와 Bus Matrix 사이의 Interface 이다.

DMA bus
DMA의 AHB master interface와 Bus Matrix 간의 Interface 이다.

Bus Matrix
BusMatrix는 Cortex-M3의 core system bus와  DMA master bus 사이의 접근 중재에 관한 관리를 한다.
이는 위의 그림에서 보는 것 처럼 CPU DCode bus, DMA, SRAM, Flash memory 그리고 Peripherals 등의 접근에 관한 중재 관리를 의미한다.
Low-, Medium-, High-density device의 경우 BusMatrix는 4개의 masters와 4개의 slaves로 구성되어 있고, 이에대한 접근을 관리한다.

AHB to APB bridges (APB)
하나의 AHB 와 두 개의 APB 에 대한 Full Synchronous connections를 제공하는 인터페이스 이다.
APB1은 36 MHz로 동작을 하고, APB2는 full speed인 72 MHz로 동작을 한다.

'혼자서 놀기... > STM32' 카테고리의 다른 글

STM32 개발 환경  (0) 2009.12.26
STM32 Memory Map  (1) 2009.12.24
STM32F103C6T6  (0) 2009.10.05
Cortex M3 - Bit Banding  (0) 2009.09.29
STM32F103C6  (0) 2009.09.23
2009. 10. 5. 11:37

STM32F103C6T6



현재 가지고 있는 STM32 보드에 대해서 알아보았다.
푸우님의 블로그를 참고하여 이것 저것을 하다 보니깐.. 흐름이 그 비슷하게 가고 있는 것 같다.

현재 사용하고 있는 STM32 칩의 ID는 STM32F103C6T6 이다.
이 ID가 무엇을 의미하는지 살펴보자.
From Datasheet STM32F103x6(15060)

현재 살펴볼 부분은 위 그림 중 붉은색 박스로 된 부분일 것이다. STM32F103은 동일하게 적용되는 부분이고, 나머지 부분들은 칩의 기능/성능에 따라 변경 되는 부분이다.

C는 48 핀을 의미하고,
6는 내부 Flash Memory 가 32 Kbyte라는 것을 의미하고,
T는 칩의 Package type이 LQFP라는 것을 의미하고,
6은 온도 범위의 정도를 나타낸다. 산업용으로 사용되는 칩이고, 6의 경우 -40 ~ 85 도 에서 정확한 동작유무 보장이 된다는 것을 의미하는 듯 하다.

다른 형식으로 표현된 그림이다.
Flash, SRAM, 가용한 각 device의 개수, CPU frequency ... 등에 대해 알 수 있다.
From Datasheet STM32F103x6(15060)

마지막 그림..
현재 사용하고자 하는 칩이 Low-density devices에 속하는 칩임을 알 수 있다.
From Datasheet STM32F103x6(15060)

이 문서는 일단 사용하는 칩이 어떤 녀석인지 알고자 하는 목적으로 작성했다.

'혼자서 놀기... > STM32' 카테고리의 다른 글

STM32 개발 환경  (0) 2009.12.26
STM32 Memory Map  (1) 2009.12.24
Cortex-M3(STM32) System Architecture  (0) 2009.10.06
Cortex M3 - Bit Banding  (0) 2009.09.29
STM32F103C6  (0) 2009.09.23
2009. 9. 29. 11:47

Cortex M3 - Bit Banding



Bit BandingCortex M3 에서 제공하는 Bit 연산을 쉽게(간단하게) 할 수 있도록 제공하는 하나의 방법이다.
Writing to a word in the alias region has the same effect as a read-modify-write operation on the targeted bit in the bit-band region. (하나의 워드를 bit band에 alias된 영역에 프로그래밍 하는 것으로 원하는 bit band 영역의 bit 를 프로그래밍 할 수 있다.)
말이 참 어렵다... -_-;;

Cortex M3의 메모리 맵을 보면 다음과 같이 되어있다. (from Cortex M3 Technical Reference Manual)

위 그림에서 붉은 박스로 된 부분, 즉 SRAM과 Peripheral의 하위 0x03FFFFFF 영역을 보면 1MB의 Bit Band region32MB의 Bit Band alias로 되어있다.

Cortex M3 이전의 ARM7, ARM9 등의 CPU에서 SRAM이나 Peripheral Memory 영역에 bit 연산을 하기 위해서는 AND 나 OR 연산을 사용해서 프로그래밍을 했다. 이러한 방법은 읽기, 수정, 쓰기 작업을 하는데 있어서 set, clear 등의 작업을 통한 많은 작업이 필요했다.
하지만, Cortex M3에서는 bit banding를 사용함으로 alias된 영역의 한 바이트에 값을 넣어주는 방식으로 원하는 bit에 접근을 할 수 있다.

왼쪽은 기존의 ARM7, ARM9에서 사용하던 bit 연산이고, 오른쪽이 Cortex M3에서 사용하는 Bit Banding 방식이다.

기존의 bit 연산을 보면 01001011 이라는 값에서 하위 세번 째 비트를 1로 세팅하기 위해 11111111 과 or 연산을 한다. 이렇듯 bit 연산을 하기 위새 AND 혹은 OR 연산을 통해 Mask를 하거나 다른 작업을 하게 된다. 이는 생각보다 많은 CPU 타임을 잡아먹는다고 한다.

Cortex M3에서의 bit banding를 보면..
실제 수정을 가할 32bit의 메모리 공간(0x20000000 ~ 0x200FFFFF)이 있고, 이 영역에 alias 된 가상의 메모리 공간(0x22000000 ~ 0x23FFFFFF)가 존재한다. 오른쪽 그림을 보면 왠지 감이 올듯도 한데.. alias 된 메모리 공간의 각 바이트들은 실제 bit banding 영역의 한 비트와 매칭된다. alias 된 가상의 메모리 공간의 한 바이트에 값을 넣게 되면 이와 매칭되는 실제 bit banding 메모리 공간(한 비트)에 프로그래밍 한 것과 동일한 효과를 갖는 것이다.
AND 나 OR 연산을 하지 않고 SRAM이나 Peripheral의 특정 메모리 영역에 별다른 instruction 없이 원하는 값을 쓰거나 읽기만 하면 되는 것이다. 이를 Cortex M3에서는 H/W 적으로 구현이 되어있다.

아래의 그림을 보면서 생각을 해보면 이해가 잘 된다. ^^; (from Cortex M3 Technical Reference Manual)


예를 들어 설명을 해보자.
실제 bit banding 영역의 0x20000000 번지의 0번 비트는 alias 된 가상의 영역 0x22000000 번지(한 바이트)와 매칭된다. 0x22000000 번지에 1을 넣게 되면, 0x20000000 번지의 0번 비트가 1이 된다는 말이다. 또 0x22000004 번지에 1을 넣게 되면, 0x20000000 번지의 1번 비트가 1이 되는 것이다.


데이터 시트를 보면 이를 수식화 해놓은 것이 있다.
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number x 4)
bit_word_addr = bit_band_base + bit_word_offset

수식에 맞추어 위의 예제를 풀어보자.
bit banding 영역의 0x20000000 번지의 비트 1번을 처리할 수 있는 alias 주소값은??
bit_word_addr : X
bit_band_base : 0x22000000
byte_offset : 0 byte
bit_number : 1 bit
0x22000000 + (0x00 x 32) + (0x01 x 4) = 0x22000004

데이터 시트에 있는 예제를 가지고 실제 어떠한 방식으로 사용을 할 수 있는지 살펴보자.
(from Insider's Guide STM32)
bit banding을 사용하여 GPIO의 PortB의 output register(0x40010C0C)를 다루는 예제이다.

Word address(GPIOB_ODR) = 0x40010C0C
Peripheral bit band base = 0x40000000
Peripheral bit band Alias base = 0x42000000
Byte offset from bit band base = 0x40010c0c – 0x40000000 = 10c0c
Bit word offset = (0x10c0c x 0x20) +(8x4) = 0x2181A0
Bit Alias address = 0x42000000 + 0x2181A0 = 0x422181A0

bit banding 식에 의해 나온 alias 주소값을 PortBbit8에 매핑한다.
#define PortBbit8 (*((volatile unsigned long *) 0x422181A0 ))

단지 데이터를 쓰는 것만으로도 해당 비트에 접근을 해 LED를 켤 수 있다.
PB8 = 1; //led on

또 다음과 같이 LED를 끌 수도 있다.
PB8 = 0; //led off

우리(프로그래머)는 위와 같이 간단하게 프로그래밍을 하면 된다.
Bit Banding이라는 것 참 좋은 아이디어인 듯 하다.

참고문서 :
푸우님 블로그(http://blog.naver.com/yhoh)
Insider's Guide STM32
Cortex M3 Technical Reference Manual
Reference Manual(RM0008)


'혼자서 놀기... > STM32' 카테고리의 다른 글

STM32 개발 환경  (0) 2009.12.26
STM32 Memory Map  (1) 2009.12.24
Cortex-M3(STM32) System Architecture  (0) 2009.10.06
STM32F103C6T6  (0) 2009.10.05
STM32F103C6  (0) 2009.09.23
2009. 9. 23. 15:26

STM32F103C6



SPEC.
Core
 - ARM 32-bit Cortex-M3 (72MHz)
 - performance at 0 wait state memory access
 - Single cycle multiplication and hardware division

Memory
 - 32Kbyte Flash memory / 10 Kbyte SDRAM

Up to 51 fast I/O ports
 - 26 / 37 / 51 I/Os, all mappable on 16 external interrupt vectors

Low power
 - Sleep, Stop, Standby modes
 - V(BAT) supply for RTC and backup registers

Clock, reset and supply management
 - 2.0 to 3.6 V application supply and I/Os
 - POR, PDR, programmable voltage detector(PVD)
 - 4 to 16 MHz crystal oscillator
 - Internal 8 MHz factory-trimmed RC
 - Internal 40 kHz RC
 - PLL for CPU clock
 - 32 kHz oscillator for RTC with calibration

12 bit A/D converters * 2
 - Conversion range( 0 to 3.6V)
 - up to 16 channels
 - Dual-sample and hold capability
 - Temperature sensor

DMA
 - 7 channel DMA controller
 - Peripherals supported timers, ADC, SPIs, I2C, USARTs
Debug mode
 - Serial wire debug(SWD), JTAG interfaces

Timer (6 개)
 - 2 * 16 bit timers
 - 16 bit motor control PWM
 - 2 * watchdog timers
 - 24 bit downcounter

Communication interfaces (6개)
 - I2C (SMBus/PMBus)
 - USART * 2 (ISO 7816 interface, LIN, IrDA capability, modem control)
 - SPI (18Mbit/s)
 - CAN interface (2.0B Active)
 - USB 2.0 Full-Speed

CRC calculation unit (96 bit unique ID)


'혼자서 놀기... > STM32' 카테고리의 다른 글

STM32 개발 환경  (0) 2009.12.26
STM32 Memory Map  (1) 2009.12.24
Cortex-M3(STM32) System Architecture  (0) 2009.10.06
STM32F103C6T6  (0) 2009.10.05
Cortex M3 - Bit Banding  (0) 2009.09.29
2009. 9. 2. 16:00

순대보드 Kernel Image



저번 시간까지 해서 'uboot 포팅'까지 완료되었다. uboot를 통해서 리눅스, WinCE와 같은 운영체제를 올릴 수 있는 기반이 준비된 것이다.

이번에 할 일은.. AHAV9302 순대보드에 올릴 리눅스 커널을 만들것이다.

일단 순대국밥님 강좌에 있는대로 Linux Kernel 2.6.22.8 을 올릴 것이고, ftp://ftp.kernel.org에 들어가서 해당 버전의 리눅스 커널을 /opt/arm9sbc/ahav/backup 디렉토리에 다운로드 받는다.
$ wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.8.tar.bz

커널 작업을 하기 위해서 아래와 같이 /opt/arm9sbc/ahav/kernel 디렉토리에 압축을 푼다.
$ cd ${AHAV_KERNEL_DIR}
$ tar -C ${AHAV_KERNEL_DIR} -xjf ${AHAV_BACKUP_DIR}/linux-${AHAV_KERNEL_VER}.tar.bz2

AHAV9302의 리눅스 커널과 네트웍 포팅을 위해 디렉토리 하나를 추가 생성한다. 나중에 파일시스템 관련해서 꼭 필요한 부분이란다. 미리 만들어 준다.
$ mkdir -p ${AHAV_HOST_DIR}/${AHAV_KERNEL_VER}
$ ln -s ${AHAV_KERNEL_DIR}/linux-${AHAV_KERNEL_VER}/include
          ${AHAV_HOST_DIR}/${AHAV_KERNEL_VER}/include

압축을 해제한 리눅스 커널에서 수정하거나 새로 생성해야하는 파일에는 다음과 같은것들이 있다.
[U] 는 기존의 파일을 수정할 것이고, [N] 은 새로 생성해 주어야 하는 파일을 명시한 것이다.
    [U] arch/arm/mach-ep93xx/Kconfig
    [U] arch/arm/mach-ep93xx/Makefile
    [U] arch/arm/mach-ep93xx/Makefile.boot
    [N] arch/arm/mach-ep93xx/ahav9302.c
    [U] arch/arm/tools/mach-types
    [U] include/asm-arm/arch-ep93xx/hardware.h
    [U] include/asm-arm/arch-ep93xx/memory.h
    [N] include/asm-arm/arch-ep93xx/ahav9302.h
    [U] arch/arm/kernel/setup.c
    [U] arch/arm/boot/Makefile

커널 머신(kernel machine) 선택메뉴(arch/arm/mach-ep93xx/Kconfig)에 AHAV를 선택할 수 있는 메뉴를 추가한다.
$ vi arch/arm/mach-ep93xx/Konfig

Makefile에도 새로운 커널 머신이 추가 되었다는 것을 알려주어야 한다. arch/arm/mach-ep93xx/Makefile 파일을 열어 마지막 부분에 아래와 같이 한줄을 추가한다.
$ vi arch/arm/mach-ep93xx/Makefile

다음은 AHAV9302의 SDRAM 연결을 참조하여 arch/arm/mach-ep93xx/Makefile.boot 의 커널 시작주소를 수정한다. 앞서 말한 적이 있지만 AHAV9302 보드에서 SDRAM의 메모리 맵 주소는 0xC0000000이다.
$ vi arch/arm/mach-ep93xx/Makefile.boot


이제부터는 타겟보드인 AHAV9302에 관련된 파일을 생성해서 작업을 할것이다. 무작정 처음부터 새로 생성해서 하는 것보다 기존에 있는 동일한 혹은 비슷한 칩에대한 파일을 구해서 수정을 하는 것이 정신건강에 좋다고 한다.
"arch/arm/mach-ep93xx/"
디렉토리의 "edb9302.c" 파일을 복사해 "ahav9302.c" 를 만들어 수정하면 된다.
순대국밥님이 미리 수정해 놓은 파일을 사용해도 된다. edb9302.c를 ahav9302.c에 맞게 수정한 파일인데, 두 파일을 비교해보는 것도 좋을 듯 하다. 얼핏 봐서는 이더넷 관련 부분이 추가된듯 하다.

다음은 uboot에서도 살펴본듯한 머신타입(arch/arm/tools/mach-types) 파일에 ahav9302 관련된 부분을 넣어준다.
$ vi arch/arm/tools/mach-types

"include/asm-arm/arch-ep93xx/hardware.h"의 마지막에 새로 생성할 ahav9302.h를 포함시킨다.
$ vi include/asm-arm/arch-ep93xx/hardware.h

SDRAM의 시작주소가 0xC0000000 부터 시작되고 있으니 "include/asm-arm/arch-ep93xx/memory.h" 의 PHYS_OFFSET을 아래와 같이 0xC0000000으로 변경한다.
$ vi include/asm-arm/arch-ep93xx/memory.h

"include/asm-arm/arch-ep9302xx/ahav9302.h" 파일은 현재로썬 별 내용이 없기에 그냥 빈 파일로 만들어 두면 된다. 후에 하드웨어를 구현하면서 필요한 선언들을 넣어주는 용도로 사용하면 된다.

AHAV9302 가 64MB 이므로, "arch/arm/kernel/setup.c" 파일의 42번째 줄에서 MEM_SIZE를 (16*1024*1024)에서 (64*1024*1024)로 변경을 해주어야 한다.
$ vi arch/arm/kernel/setup.c

"arch/arm/boot/Makefile"
의 64 번째 줄에 있는 부분을 아래와 같이 변경한다.
이전의 uboot 포팅에서 만들어진 /usr/bin/mkimage가 여기서 사용된다. 커널이 적재되어야 할 주소를  미리 지정해 놓고, 압축이 풀리는 곳의 지정을 다르게 하여 좀 더 효율적으로 한다는데.. 아직 이해 부족.. -_-
$ vi arch/arm/boot/Makefile


자!! 이제부터 커널 컴파일이다.

컴파일 하기 위해서 커널의 설정을 해주어야 하는데.. 음.. 아직 잘 모르겠어.. ㅡ.ㅜ
다행히 순대국밥님이 커널 설정에 대한 컨피그 파일을 미리 준비해 주셨다. 그 놈을 사용해서 커널 컴파일을 하면 될 듯 하다.
위의 파일을 받아서 linux-2.6.22.8 디렉토리로 복사하고, 파일 이름을 .config 라는 이름으로 바꾸어 준다.
아래의 명령을 사용해서 생성하려는 커널의 설정에 대해 확인할 수 있다.
$ cd ${AHAV_KERNEL_DIR}/linux-${AHAV_KERNEL_VER}
$ make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

아래의 명령을 사용해 AHAV9302의 리눅스 커널을 컴파일 하자!!
clean은 기존의 것들을 지우고 모두 새로 컴파일을 하겠다는 것이고, uImage는 /usr/bin/mkimage를 이용해서 커널을 uboot Image로 만들겠다는 뜻이다.
$ make ARCH=arm CROSS_COMPILE=arm-linux- clean
$ make ARCH=arm CROSS_COMPILE=arm-linux- uImage

한참을 컴파일을 할 것이다.
정상적으로 컴파일이 되었다면 "arch/arm/boot/"에 커널이미지(uImage)가 생성되었을 것이다.

이 녀석을 다음 작업을 하기위한 경로로 이동을 시키자!!
$ cp ${AHAV_KERNEL_DIR}/linux-${AHAV_KERNEL_VER}/arch/arm/boot/uImage  
       ${AHAV_KERNEL_DIR}/.post/.
$ cp ${AHAV_KERNEL_DIR}/.post/uImage ${AHAV_IMAGES_DIR}/${AHAV_PROJECT_NAME}/.

이렇게 해서 AHAV9302 순대보드를 위한 리눅스 커널은 준비가 된 것이다.

이해 못할 부분들이 많이 있는데.. 일단 따라해보며 순대보드에 리눅스를 올리는 것까지 한 번 해보고, 필요한 부분들을 찾아가며 다시 공부를 해봐야 할 듯 하다.
무작정 하면 첨부터 완전 질려버려 아무것도 못할 듯... -_-;


'혼자서 놀기... > 순대보드(AHAV9302)' 카테고리의 다른 글

순대보드 u-boot - 4  (0) 2009.09.02
순대보드 u-boot - 3  (0) 2009.08.11
순대보드 u-boot - 2  (0) 2009.08.11
순대보드 u-boot - 1  (4) 2009.04.02
순대보드 CrossCompile 환경 - 2  (0) 2009.04.01