3.4 NAND GPMI Flash
3.4.1 Introduction
NAND Flash Memory Technology Devices (MTD) 드라이버는 i.MX 6 시리즈와 i.MX 7Dual에서 GPMI(Generic-Purpose Media Interface) 컨트롤러에서 사용된다.
NAND MTD 드라이버가 작동하려면, 특정 하드웨어 레이어만 구현되어야 한다.
Flash 읽기/쓰기/지우기와 같은 나머지 기능은 NAND 장치용 Linux MTD 서브시스템에서 제공하는 일반 레이어에서 자동으로 처리된다.
NAND MTD 드라이버는 UBIFS, CRAMFS, JFFS2UBI, UBIFSCRAMFS, JFFS2와 같은 파일 시스템을 지원하는 통합된 NAND 컨트롤러와 인터페이스한다. NAND Flash 기술은 블록 액세스만 지원하므로, 드라이버의 구현은 블록 읽기, 블록 쓰기, 블록 지우기와 같은 외부 NAND Flash Chip에서 가장 낮은 수준의 작업만 지원한다. NAND Flash 블록이 정상이라고 보장되지 않기 때문에, NAND MTD 드라이버는 배드 블록을 감지하고 해당 정보를 상위 레이어에 공급하여 배드 블록 관리에서 처리할 수도 있다.
3.4.2 Hardware Operation
NAND Flash는 임베디드 시스템에 사용되는 비휘발성 저장 디바이스이다.
드라이버는 RAM이나 NOR Flash와 같이 메모리에 임의의 액세스를 지원하지 않는다. NAND Flash에 대한 읽기나 쓰기는 GPMI를 통해 수행된다. NAND Flash는 대용량 저장(mass storage) 애플리케이션에 적합한 순차적인 액세스 디바이스이다. NAND Flash에 저장된 코드는 그곳에서 실행할 수 없다. 코드는 RAM 메모리에 로드한 다음 그곳에서 실행해야 한다. i.MX 6에는 하드웨어 오류 수정 블록이 포함되어 있다.
3.4.3 Software Operation
Linux의 MTD는 RAM, ROM, 그리고 다양한 종류의 NOR/NAND Flash와 같은 모든 메모리 디바이스를 포함한다.
MTD 서브시스템은 이러한 모든 디바이스에 대한 동일한 액세스를 제공한다. MTD 디바이스 상위에는 Flash 파일 시스템(JFFS2)나 UBI 레이어를 사용한 MTD 블록 디바이스 에뮬레이션이 있을 수 있다. 차례로 USB 레이어는 볼륨 위에 UBIFS를 가지거나 그 상위에 일반 파일 시스템(FAT, Ext2/3)이 있는 FTL(Flash Translation Layer)을 가질 수 있다. 특정 하드웨어는 i.MX 6의 GPMI 모듈과 인터페이스한다. 읽기, 쓰기, 지우기와 같은 가장 낮은 수준의 작업을 구현한다. 활성화된 경우, NAND 디바이스에서 파티션에 대한 정보도 제공한다. 이 정보는 플랫폼 코드에서 제공해야 한다.
가능한 경우, NAND 드라이버는 읽기/쓰기 오류를 복구할 수 있는 지점이다. 하드웨어 오류 수정은 BCH 블록에 의해 수행되며, NAND 드라이버 코드에 의해 구동된다.
NAND 드라이버 인터페이스에 대한 자세한 정보는 www.linux-mtd.infradead.org에서 찾을 수 있다.
3.4.4 Basic Operations: Read/Write
NAND 드라이버는 아래 callback을 내보낸다 :
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)
커널 4.1부터 GPMI 드라이버는 다음 callback을 내보내어 raw 읽기/쓰기 모드를 제공한다 :
- 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
사용자는 커널 4.1에서 커널 업그레이드시에 비호환성을 유발할 수 있는 GPMI NAND 드라이버의 몇 가지 주요 변경 사항을 알고 있어야 한다.
- debugfs를 통해 필요한 정보를 사용자 영역 애플리케이션(kobs-ng)으로 보내낸다.
- 새로운 BCH 레이아웃 알고리즘
- 새로운 raw 읽기/쓰기 모드
커널 4.1에서 NAND GPMI 드라이버는 debugfs를 통해 상위 레이어로 필요한 정보를 내보낸다. 가장 일반적인 경우는 NAND 굽기 툴인 kobs-ng이다. debugfs를 활성화하지 않으면, kobs-ng가 새로운 기능을 완전히 사용하지 못 하거나 부적절한 파라미터를 사용할 수 있다. 사용자 정의된 커널에서 debugfs가 활성화되지 않은 경우, 사용자는 kobs-ng에 대해 올바른 BCH geometry 정보와 raw 액세스 모드를 제공해야 한다.
이전 커널의 BCH 레이아웃은 NAND 칩에 대한 최소한의 ECC 요구 사항을 충족하지 않을 수 있다. Kernel 4.1부터, BCH 레이아웃 알고리즘은 기본으로 (접근이 가능한 경우) ONFI 파라미터에서 획득한 NAND 필수 ECC strength와 step size를 사용한다. 변경 사항은 이전 커널의 BCH 레이아웃 설정과 호환되지 않을 수 있다. 이전 버전과의 호환성을 위해서 Kernel과 U-boot는 레거시 BCH 레이아웃을 사용하는 스위치를 제공한다.
- Kernel의 경우, 디바이스 트리 파일에서 "fsl,legacy-bch-geometry"를 추가한다.
- U-Boot의 경우, 보드 구성 파일에서 "CONFIG_NAND_MXS_BCH_LEGACY_GEO"를 추가한다.
BCH 레거시 레이아웃 설정은 얼라이먼트(alignment)를 위해 Kernel과 U-Boot 모두에서 동시에 on/off 해야 한다.
kobs-ng는 debugfs에서 Kernel 버전이나 raw 모드 플래그를 확인하여, NAND 칩에 액세스하기 위한 새로운 raw 모드를 사용할지 여부를 결정한다. 새로운 kobs-ng는 이전 Kernel과 완전히 호환되지만, 이전 버전의 kobs-ng는 Kernel 4.1에서 작동하지 않는다.
3.4.6 Error Correction
Flash에서 데이터를 읽거나 쓸 때, 일부 비트가 flip(반전)될 수 있다. 이는 정상적인 동작이며, NAND 드라이버는 이를 수정하기 위해 다양한 오류 수정 처계를 사용한다. 소프트웨어나 하드웨어로 오류 수정을 해결할 수 있다. GPMI 드라이버는 하드웨어 accelerator-BCH의 도움으로 하드웨어 수정 체계만 사용한다.
BCH의 경우, 2K 페이지의 페이지 레이아웃은 (2k + 64)이고, 4K 페이지의 페이지 레이아웃은 (4k + 218), 8K 페이지의 페이지 레이아웃은 (8k + 448) 이다.
3.4.7 Boot Control Block Management
Startup하는 동안, NAND 드라이버는 NCB(NAND Control Block)가 있는지 첫 번째 블록을 스캔한다. NCB 존재는 매직 시그니처(magic signature)로 감지된다. 시그니처가 발견되면, 부트 블록 후보에 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
'NXP i.MX SoC Family > i.MX Linux Reference Manual' 카테고리의 다른 글
i.MX Linux Reference Manual - Storage - SATA (0) | 2022.07.18 |
---|---|
i.MX Linux Reference Manual - Storage - Quad Serial Peripheral Interface (QuadSPI) (0) | 2022.07.18 |
i.MX Linux Reference Manual - Storage - EIM NOR (0) | 2022.07.12 |
i.MX Linux Reference Manual - Storage - AHB-to-APBH Bridge with DMA (0) | 2022.07.12 |
i.MX Linux Reference Manual - Storage (0) | 2022.07.12 |