3.4 NAND GPMI Flash
3.4.1 Introduction
NAND Flash Memory Technology Devices (MTD) 드라이버는 i.MX 6 시리즈와 i.MX 7Dual의 Generic-Purpose Media Interface(GPMI) 컨트롤러에서 사용되고 있다.
NAND MTD 드라이버가 작동하려면, 하드웨어별 레이어만 구현되어 있으면 된다.
Flash 읽기/쓰기/삭제와 같은 나머지 기능은 NAND 디바이스를 위한 Linux MTD 서브시스템에서 제공하는 제너릭 레이어에서 자동으로 처리되고 있다.
UBIFS, CRAMFS 및 JFFS2UBI 및 UBIFSCRAMFS 및 JFFS2와 같은 파일 시스템을 지원하는 통합된 NAND 컨트롤러와 NAND MTD 드라이버는 인터페이스한다. NAND Flash 기술이 블록 액세스만 지원하므로 블록 읽기, 블록 쓰기, 블록 삭제와 같은, 외부 NAND Flash 칩에 대해 가장 낮은 레벨의 작업을 드라이버 구현은 지원한다. NAND Flash의 블록은 양호하다고 보장되지 않기 때문에, NAND MTD 드라이버는 배드 블록을 감지하고 배드 블록 관리를 처리하는 상위 레이어에 해당 정보를 전달할 수 있어야 한다..
3.4.2 Hardware Operation
NAND Flash는 임베디드 시스템에 사용되는 비휘발성 저장 디바이스이다.
RAM이나 NOR Flash 경우와 같이, 드라이버는 메모리의 임의 액세스를 지원하지 않는다. NAND Flash에 대한 읽기나 쓰기는 GPMI로 수행되어야 한다. NAND Flash는 대용량 저장 애플리케이션에 적합한 순차 액세스 디바이스이다. NAND Flash에 저장되어 있는 코드는 거기에서 실행할 수 없다. 코드는 RAM 메모리에 로드되고 거기에서 실행되어야 한다. i.MX 6에는 하드웨어 오류 수정 블록이 포함되어 있다.
3.4.3 Software Operation
Linux의 MTD는 RAM, ROM과 다양한 종류의 NOR/NAND Flash와 같은 모든 메모리 디바이스를 다룬다.
MTD 서브시스템은 이러한 모든 디바이스에 대한 균일한 액세스를 제공한다. MTD 디바이스 위에는 Flash 파일 시스템(JFFS2)을 사용한 MTD 블록 디바이스 에뮬레이션이나 UBI 레이어가 있을 수 있다. UBI 레이어는 차례로, 볼륨 위에 UBIFS를 두거나 그 위에 일반 파일 시스템(FAT, Ext2/3)이 있는 FTL(Flash Translation Layer)을 가질 수 있다. 하드웨어별 드라이버는 i.MX 6의 GPMI 모듈과 인터페이스한다. 읽기, 쓰기, 삭제와 같은 가장 낮은 레벨의 작업을 구현한다. 활성화된 경우, NAND 디바이스의 파티션에 대한 정보도 제공한다. 이 정보는 플랫폼 코드에서 제공해야 한다.
가능한 경우, NAND 드라이버는 읽기/쓰기 오류를 복구할 수 있는 지점이다. 하드웨어 오류 정정은 BCH 블록에 의해 수행되며, NAND 드라이버 코드에 의해 구동된다.
NAND 드라이버 인터페이스에 대한 자세한 정보는 www.linuxmtd.infradead.org에서 찾을 수 있다.
3.4.4 Basic Operations: Read/Write
NAND 드라이버는 다음 콜백을 노출한다:
gpmi_ecc_read_page (with ECC)
gpmi_ecc_write_page (with ECC)
gpmi_read_byte (without ECC)
gpmi_read_buf (without ECC)
gpmi_write_buf (without ECC)
gpmi_ecc_read_oob (with ECC)
gpmi_ecc_write_oob (with ECC)
Kernel 4.1부터 GPMI 드라이버는 다음 콜백을 노출하는 로우 read/write 모드를 제공한다:
- gpmi_ecc_read_page_raw (without ECC)
- gpmi_ecc_write_page_raw (without ECC)
- gpmi_ecc_read_oob_raw (without ECC)
- gpmi_ecc_write_oob_raw (without ECC)
이러한 함수는 오류 수정 여부와 관계없이 요청된 데이터 양을 읽는다. 읽기의 경우, gpmi_read_page() 함수가 호출되어 DMA 체인을 생성하고, 실행을 위해 제출하고 완료를 기다린다. 쓰기 경우는 좀 더 복잡하다. 쓸 데이터는 gpmi_send_page()를 호출하여 매핑되고 플러시된다.
3.4.5 Backward Compatibility
Kernel 업그레이드에서 비호환성을 유발할 수 있는 Kernel 4.1의 몇 가지 주요 GPMI NAND 드라이버 변경 사항을 사용자는 알고 있어야 한다.
- debugfs로 필요한 정보를 사용자 공간 애플리케이션(kobs-ng)으로 노출한다.
- 새로운 BCH 레이아웃 알고리즘
- 새로운 로우 read/write 모드
Kernel 4.1에서, NAND GPMI 드라이버는 debugfs로 필요한 정보를 상위 레이어로 노출한다. 가장 일반적인 경우는 NAND 굽기 도구인 kobs-ng이다. debugfs를 활성화하지 않으면, kobs-ng는 새로운 기능을 완전히 사용하지 못하거나 부적절한 파라미터를 사용할 수 있다. debugfs가 사용자 지정 커널에서 활성화되지 않은 경우, 사용자는 올바른 BCH 구조(geometry) 정보와 로우 액세스 모드를 kobs-ng에 제공해야 한다.
이전 커널의 BCH 레이아웃은 NAND 칩의 ECC 최소 요구 사항을 충족하지 못할 수 있다. Kernel 4.1부터, BCH 레이아웃 알고리즘은 기본적으로 액세스 가능한 경우 ONFI 파라미터에서 얻은 NAND 요구되는 ECC 강도와 단계 크기를 사용한다. 변경 사항은 이전 커널의 BCH 레이아웃 설정과 호환되지 않을 수 있다. 이전 버전과 호환성을 위해, Kernel과 U-Boot는 레거시 BCH 레이아웃을 사용하는 스위치를 제공한다.
- Kernel의 경우, 디바이스 트리 파일에 "fsl,legacy-bch-geometry"를 추가한다.
- U-Boot의 경우, 보드 구성 파일에 "CONFIG_NAND_MXS_BCH_LEGACY_GEO"를 추가한다.
BCH 레거시 레이아웃 설정은 정렬을 위해 Kernel과 Uboot 모두에서 동시에 on/off 해야 한다.
Kobs-ng는 debugfs에서 Kernel 버전이나 로우 모드 플래그를 확인하여, NAND 칩에 액세스하기 위해 새로운 로우 모드를 사용할지 여부를 결정한다. 새로운 kobs-ng는 이전 Kernel과 완전히 역호환되는 반면, 이전 버전의 kobs-ng는 Kernel 4.1에서 작동할 수 없다.
3.4.6 Error Correction
Flash에서 데이터를 읽거나 쓸 때, 일부 비트가 뒤집힐 수 있다. 이는 정상적인 동작이며, NAND 드라이버는 이를 수정하기 위해 다양한 오류 수정 체계를 활용한다. 이것은 소프트웨어나 하드웨어 오류 수정으로 해결할 수 있다. GPMI 드라이버는 하드웨어 가속기 BCH의 도움을 받아 하드웨어 수정 체계만 사용한다.
BCH의 경우, 2K 페이지의 페이지 레이아웃은 (2k + 64), 4K 페이지의 페이지 레이아웃은 (4k + 218), 8K 페이지의 페이지 레이아웃은 (8k + 448)이다.
3.4.7 Boot Control Block Management
스타트업하는 동안, NAND 드라이버는 NAND Control Block(NCB)이 존재하는지 첫 번재 블록을 스캔한다. 그 존재는 매직 시그니처로 감지된다. 시그니처가 발견되면, 해밍(Hamming) 코드를 사용하여 부트 블록 후보에 오류가 있는지 확인한다. 오류가 발견되면, 가능한 경우 수정한다. NCB가 발견되면, NAND 칩의 타이밍을 검색하기 위해 분석된다.
사용자 공간 애플리케이션인 kobs-ng를 사용하여 매체를 포맷할 때, 모든 부트 컨트롤 블록이 생성된다.
3.4.8 Bad Block Handling
드라이버가 시작되면, 기본적으로 배드 블록 테이블을 만든다. 블록의 불량 여부를 동적으로 확인할 수 있지만, 성능 향상을 위해 부팅 시 수행된다. 삭제한 블록의 불량 여부는 블록의 각 페이지에 있는 스페어 영역의 시작 부분에 있는 패턴을 확인하여 결정한다. 그러나 칩이 하드웨어 오류 수정을 사용하는 경우, 불량 마크는 ECC 바이트 영역으로 밀려난다. 따라서 하드웨어 오류 수정을 사용하는 경우, 배드 블록 마크를 이동해야 한다.
3.4.9 Source Code Structure
NAND 드라이버는 drivers/mtd/nand/gpmi-nand에 있다.
아래 테이블에는 NAND 드라이버의 소스 파일이 나열되어 있다.
Table 28. NAND Driver Files
File | Description |
---|---|
|
함수 선언 |
|
GPMI NAND 함수 |
3.4.10 Menu Configuration Options
NAND 드라이버를 활성화하려면, 아래 옵션을 설정해야 한다:
- Device Drivers > Memory Technology Device (MTD) support > GPMI NAND Flash Controller driver
또한, 다음 MTD 옵션을 활성화해야 한다:
- CONFIG_MTD_NAND = [y | m]
- CONFIG_MTD = y
- CONFIG_MTD_BLOCK = y
또한, 다음 UBI 옵션을 활성화해야 한다:
- CONFIG_MTD_UBI=y
- CONFIG_UBIFS_FS=y