지금까지 분석하고 만들어 봤던 FAT32 파일 시스템 프로젝트를 VS1003 프로젝트에 적용 시켜 문제 없이 제대로 동작하는지 확인해 보도록 하겠다. void setup(void) { sysclock_init(BD_CLKSRC, BD_PLLMUL, BD_AHBPRE, BD_APB1PRE, BD_APB2PRE, BD_ADCPRE); uart_init(); spi_init(BAUD_PRE256); printf(CLEAR_SCRN"Coarse MP3 Player. %s - %s\n\n", __DATE__, __TIME__); init_command(); vs1003_init(); vs1003_write_reg(SCI_CLOCKF, 0xD000); vs1003_chg_volume(40); microsd_init..
이번에는 SD 메모리 카드에 기록되어 있는 파일들 중 하나를 선택하여 끝까지 읽어 오는 방법에 대해서 설명하도록 하겠다.파일을 읽어 오기 위해서는 먼저 어떤 파일을 읽어 올것인지 지정해 주어야 하는데, 이를 위하여 fat32_openfile() 함수를 이용한다. int fat32_openfile(const char *path) { struct fat32_info *fat = &cur_file; struct dir_entry cur_dir; char tmp_buf[BD_ARG_BUF_SZ]; char *delimit = "/"; char *token; fat->dir.clst_index = fat->disk.root_clst; fat->dir.sect_index = 0; fat->dir.entry_inde..
이번 글에서는 root directory에서 출발하여 특정 디렉토리에 어떤 하위디렉토리와 파일들이 있는지 알아보는 방법에 대해서 설명하도록 하겠다.이를 위하여 두개의 API를 만들어볼 예정이다.먼저 특정 디렉토리를 선택하기 위한 fat32_opendir()과 선택된 디렉토리에서 차례차례로 directory entry를 가져오기 위한 fat32_readdir() 함수이다.먼저, FAT32 파일 시스템의 기본 파라미터와 디렉토리 관리를 위한 구조체를 만들어 보도록 하겠다.struct disk_info { uint32_t sect_size; uint32_t clst_size; uint32_t root_clst; uint32_t bpb_start; uint32_t fat_start; uint32_t data_s..
이번 글에서는 FAT 영역에 어떤 정보가 들어가는지에 대하여 설명하도록 하겠다.FAT영역에 저장되는 FAT entry는 한마디로 파일이나 디렉토리가 Data 영역의 몇번째 클러스터에서 시작되는지 알려주기 위하여 cluster index를 저장하는 table이라고 할 수 있겠다.앞에서 설명했듯이 FAT32의 경우 root directory가 Data 영역 어디에도 위치할 수 있는데, 실제로는 어디에 있는지 클러스터 index를 boot sector에서 알려주었기 때문에 클러스터 index에 해당되는 위치에서 root directory 내용을 읽을수 있었다.위의 그림은 FAT#0 영역을 dump 해 본 것인데, 초록색박스로 표시된 부분이 FAT32에서 예약된 cluster#0, cluster#1이고, 빨간색..
이번 글에서는 디렉토리와 파일들에 대한 메타 정보를 담고 있는 directory entry에 대해서 알아보도록 하겠다.첫번째로 할 일은, 디렉토리 정보를 분석하기에 앞서 FAT32에 있는 주요한 세개의 영역이 어디에서 시작하는지 그 정보를 따로 저장해 두는것이 좋다.예를 들어 앞의 글에서 설명한 내용중에 다음 그림을 볼 수 있는데,BPB는 2048에서 시작되고, FAT영역은 3466에서, Data 영역은 18432에서 시작되는 것으로 확인 되었다. 이 값들은 SD 메모리 카드마다 다를수 있음을 주의하여야 한다.이 영역들의 시작 위치는 다음과 같은 코드로 알아낼 수 있다. bpb.bpb_start = bs; bpb.fat_start = bs + bpb.rsvd_sec_cnt; bpb.data_start =..
이번 글에서는 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 메모리 카드에 데..