이번 글에서는 FAT 파일 시스템의 가장 중요한 시작점이라 할 수 있는 BPB 혹은 boot record에 대해서 알아보도록 하겠다.Boot record가 무엇인지 간단히 설명하자면, FAT 파일 시스템이 어떻게 구성되어 있는지 알려주기 위한 주요한 파라미터들이 들어있는 영역이라고 보면 될 것이다.이러한 파라미터를 분석하여 FAT 파일시스템이 FAT12, FAT16, FAT32 중에 어떤 것인지 알 수 있고, 그에 따라 FAT 영역이 어디에서 시작하는지, 그리고 실제 파일과 디렉토리가 저장되는 데이터 영역은 어디에 있는지 찾을 수 있게 되는 것이다.Boot record는 FAT12/FAT16/FAT32 모두 사용하는 공통 파라미터 영역이 있고, FAT32의 경우 별도로 몇개의 파라미터가 추가되는 형식으로..
Microsoft FAT Specification 문서에는 다음과 같은 FAT 파일 시스템의 간단한 메모리 구조를 설명하는 그림이 있다.FAT 파일 시스템은 위의 그림에서처럼 크게 네개의 영역으로 나누어져 있다.BPB는 BIOS Parameter Block의 머리글자이며 흔히 boot sector 혹은 boot record라고 한다. BPB안에 FAT에 대한 세부 정보가 들어 있으므로 이 정보를 가지고 다른 영역의 위치를 찾아낼 수 있다.FAT은 File Allocation Table의 약자이며 디렉토리와 파일들이 Data 영역의 어디에 위치하고 있는지 그 정보를 알기 위하여 사용된다.Root Directory는 최상위 디렉토리에 대한 정보가 들어 있다.Data 영역에는 디렉토리와 파일들이 실재하는 영역..
앞에서 설명 했던 SD memory card 프로젝트를 통하여 데이터를 SD 메모리에 쓰고 다시 읽어 오는 방법을 알아보았다.읽기와 쓰기 기능이 제대로 동작되는것을 확인하였으므로 이 기능들을 이용하면 SD 메모리에 원하는 데이터를 저장했다가 필요할 때 다시 읽어 올 수 있게 되었다.데이터 쓰기 동작에서 주의할 점이 있는데 SD 메모리 카드에 데이터가 기록되어 있는 상태에서 새로운 데이터를 저장 하려면, 이미 저장 되어 있는 데이터가 손상되지 않도록 기존 데이터가 기록되어 있는 영역을 피해서 새로운 데이터를 써 주어야 한다. 그리고, 시간이 흐른뒤에 SD메모리에 기록되어 있는 많은 데이터들 중에서 필요한 데이터를 쉽게 찾아서 읽어 올 수 있는 방법도 고려하여야 한다.이런 저런 이유로 SD 메모리 카드에 데..
이번 글에서는 SD 메모리 카드와 관련된 마지막 기능으로 SD 메모리 쓰기 동작에 대하여 설명하도록 하겠다.쓰기 동작은 앞에서 설명한 읽기 동작의 정 반대로 구현 하면 된다.SD 메모리 카드 규격 문서에는 위와 같은 표에 대한 설명이 들어 있다. 하나의 메모리 블럭 쓰기 동작을 위해서는 CMD24를 사용하면 되고, 여러 블럭에 대하여 연속 쓰기를 위해서는 CMD25를 사용하면 된다. UART 콘솔 창에서의 명령으로 특정 SD 메모리 블럭에 대한 쓰기 동작을 위한 코드는 다음과 같이 만들 수 있다.static void write_mem(int argc, char **argv) { uint32_t num_blk = 0; uint32_t blk_count = 1; if (argc>1) num_blk = str..
이번 글에서는 SD 메모리 카드 안에 저장 되어 있는 데이터를 읽어 오는 방법에 대해서 설명하도록 하겠다.SD 메모리 카드에서 데이터를 읽어 올때는 block 단위로 읽어 올 수 있는데, 한번에 하나의 블럭을 읽어 오는 방법과 하나의 명령으로 여러 블럭의 데이터를 읽어 오는 방법이 있다.위의 표에서 볼 수 있듯이, 하나의 블럭단위로 읽어 오기 위한 명령어는 CMD17이고, 여러 블럭을 한꺼번에 읽어 오기 위한 명령은 CMD18이다.명령어를 수행할 때에는 데이터를 어디에서 읽어 올지 그 주소를 알려주어야 하는데, 메모리 용량에 따라 주소의 의미가 달라진다. 위의 그림에서 보는것처럼 SDHC나 SDXC type의 메모리의 경우 block address를 의미하는것이지만, SDSC의 경우에는 byte addr..
이번 글은 SD 메모리 카드 내부에 있는 레지스터 중 CSD(Card Specific Data) 레지스터의 값을 읽어보는 방법에 대해서 설명하도록 하겠다.주의할 점은 메모리 카드 용량이 standard 인지 아니면 SDHC나 SDXC에 따라 다른 CSD 레지스터 구조를 가진다는 것이다.CSD 레지스터를 읽어 오기 위한 command는 CMD9이다. CMD_SEND_CSD 명령어에 해당된다.CSD 레지스터는 CID 레지스터와 마찬가지로 128비트로 이루어져 있다.다음과 같은 코드를 이용하여 CSD 레지스터의 값을 읽어 오면 된다.static void read_csd(int argc, char **argv) { struct sd_cmd cmd; uint32_t csd_structure; printf("\n\..
위의 그림은 SD memory card의 내부 구조를 간단히 보여주고 있는 것이다. SD 메모리 안에는 8개의 레지스터가 있는데, OCR은 이미 앞의 글에서 읽어 보았고, 이번 글에서는 CID 레지스터를 읽어 보는 방법에 대해서 설명하도록 하겠다.다음 글에서는 CSD 레지스터를 읽어 보아서 어떤 내용이 들어 있는지 알아볼 예정이다.CID 레지스터는 위의 그림과 같이 128비트의 정보를 가지고 있다. 위의 그림을 보면 알겠지만 SD 메모리 카드 자체를 구별하기 위한 정보를 제공하고 있다. 제조할 당시에 들어가는 내용들이 많이 있음을 알 수 있다.CID 레지스터를 읽기 위해서는 CMD10(SD_CMD_SEND_CID) 명령을 이용하면 된다.User Interface - CLI2에서 설명한 방법을 이용하여 U..
MCU와 SD 메모리 카드가 제대로 연결되었는지 확인하는 차원에서 메모리 초기화 과정부터 진행해 보도록 하겠다.메모리 카드에 전원이 들어간 이후에 수행하여야 할 절차에 대한 설명을 볼 수 있다.중요한 것은 첫번째 command를 받기 전에 74 clock이 필요하다는 것과, 초록색 박스에 보이는 것처럼 초기화에 필요한 command와 그 순서를 알아야 한다.모든 동작은 Host에서 SD 메모리 카드로 command를 이용하여 이루어진다. 메모리 카드에서 command를 받으면 반드시 command 종류에 따른 몇가지 response 데이터를 보내주도록 되어 있다.Command는 48비트(6바이트) 크기를 가진다. 처음 2비트 값은 반드시 '01'로 시작 되어야 한다. 그 다음 6비트가 어떤 동작을 할 것..
이번에 만들어 볼 프로젝트는 임베디드 시스템에서 저장 장치로 널리 사용되고 있는 SD memory card를 제어해 보는 것이다.SD memory card는 위의 그림과 같이 세가지 모양으로 만들어진다. 크기는 모두 다르지만 동작은 동일하다. 이 프로젝트를 진행 하기 위해서는 "SD Specifications Part 1 Physical Layer Simplified Specification"라는 긴 이름의 문서를 참고하여야 한다.SD 메모리 카드는 임베디드 뿐만 아니라 스마트 단말기등 거의 대부분의 분야에서 워낙 널리 쓰이기 때문에 많은 SoC에 SD 메모리 카드를 지원하기 위한 하드웨어 블럭이 내장되어 있다. 위에 소개한 문서에도 자세히 설명되어 있지만, SD 메모리 카드는 기본적으로 SD mode로..
앞의 글에서 설명한 CLI 구현 방식에는 조금 불편한 내용이 있다.새로운 명령을 추가하거나 삭제하기 위해서는 cli_command[] 배열을 수정해야 된다는 것이다. 이것이 크게 문제 되지 않기는 하겠지만 때로는 상당히 번거로운 일이 되기도 한다.이번 글에서는 좀 더 쉬운 방법을 통해서 CLI 처리 부분에 대한 소스 코드 수정없이 새로운 명령을 추가 하는 방법에 대해서 설명 하도록 하겠다.이 방법은 링커 프로그램을 이용하는 방법이다.따라서 이 기능을 위해서 링커 스크립트 파일을 수정하도록 하겠다. .text : { KEEP(*(.vectors.table)) KEEP(*(.vectors.code)) *(.text .text.*) __cli_start = .; KEEP(*(SORT(.cli.*))) __cl..