i.MX28 SOC DMA 읽기 NAND 플래시 메모리 시간 초과

i.MX28 SOC DMA 읽기 NAND 플래시 메모리 시간 초과

Freescale의 i.MX28 EVK 키트 및 Karo TX28 보드와 같은 기존의 기존 하드웨어에 최신 Linux 커널을 이식하려고 합니다. NAND FLASH(NAND의 "userfs 파티션")에서 파일 시스템의 일부를 사용하고 싶습니다.

첫 번째 단계는 ubiattach /dev/ubi_ctrl -m 6을 사용하는 것입니다. 이 작업은 일부 gpmi_read_page 작업을 수행하여 볼륨 테이블을 조회하고 NAND 칩을 읽으려고 시도합니다. 이로 인해 start_dma_without_bch_irq(gpmi-nand.c)에서 DMA 시간 초과가 발생합니다. 이상하게도 첫 번째 read_page 작업이 성공합니다. 그런 다음 일시 중지합니다.

첫인상은 시간 문제입니다. NAND 타이밍을 변경해도 관찰된 동작은 변경되지 않았습니다. 주로 GPMI, GPIO 및 인터럽트 컬렉터 레지스터의 값에 초점을 맞춘 광범위한 디버깅은 아무것도 드러내지 않습니다.

i.MX28 EVK 보드에 있는 NAND 칩의 제어 라인에 몇 가지 측정 연결을 만들었습니다. Saleae(가짜) 로직 분석기를 사용하면 올바른 트랜잭션(20, 40 등 범위)을 많이 볼 수 있습니다. 그런 다음 읽기를 설정하면 NAND 신호가 올바르게 준비되어 GPMI에 데이터 읽기를 요청하고 GPMI는 NAND에서 데이터를 출력하지만실패하다칩 활성화 라인(액티브 로우)을 설정합니다. GPMI 내부가 더 이상 제대로 작동하지 않는 것 같습니다. 이제 읽기 작업의 끝을 알리는 데 사용되는 ISR이 아직 입력되지 않았습니다. (나는 이를 알리기 위해 두 번째 칩 활성화 라인을 사용했고 디버그 출력도 같은 내용을 알려줍니다.) 따라서 시간 초과가 발생합니다. GPMI 내에 "혼돈"이 있는 것 같습니다.

타임아웃 후에도 칩 활성화 라인의 핀 멀티플렉서가 여전히 올바른지 확인했습니다. 디버그 출력을 판단할 때 Karo TX 28에서도 동일한 일이 발생합니다(핀에 대한 측정이 없고 연결할 수 없습니다).

i.MX23 문제 및 GPMI를 두 번(U-boot 및 Linux 커널) 재설정하여 GPMI가 중단되는 것과 관련된 이전 게시물을 본 적이 있습니다. 이번 수정으로 변경된 사항은 없습니다. 이 문제는 Linux 커널 5.0.8 및 4.20.7에서 발생합니다. 내가 아는 한, NAND는 U-Boot에서 사용할 때 잘 작동합니다. U-Boot가 사용하는 것과 동일한 타이밍 설정을 시도했지만 성공하지 못했습니다.

또한 Karo 보드에는 Samsung NAND가 사용되고 i.MX28 EVK에는 Spansion 부품이 사용됩니다. 따라서 이는 특정 NAND 칩과 관련이 없는 것 같습니다. 또한 U-boot의 Linux 부팅 명령줄에서 NAND 파티션을 연결할 때도 동일한 동작이 관찰됩니다.

문제는 근본 원인과 가능한 해결책을 찾는 방법입니다.

답변1

처음에는 디버깅을 많이 했지만 해결책을 찾지 못했습니다. 그러다가 이전 Linux 버전(몇 년 전에 다른 회사에서 준비한 버전)에서 작업하고 있다는 것을 깨달았습니다. 이는 하드웨어 문제가 아님을 증명합니다. 또한 두 개의 서로 다른 하드웨어 보드에서 동일한 문제가 나타난다는 사실은 하드웨어 문제가 아니라는 것을 의미합니다. 어느 시점에서 나는 기존의 작업 솔루션에 최대한 가까워지기 위해 이전 Linux 버전을 사용해 보기로 결정했습니다. 이는 커널 3.16.68이 자체 빌드를 사용하여 제대로 작동하고 있음을 보여줍니다. 내 5.1.5 및 4.20.7 버전에서는 NAND 플래시 문제가 나타납니다. 더 많은 실험에 따르면 마지막으로 작동하는 커널은 4.16.18이었고 문제는 4.17.1 이상부터 나타나기 시작했습니다. Freescale의 GPMI 주변 장치에 대한 NAND FLASH 지원이 재구성된 것으로 보입니다. 저는 이것이 최신 프로세서/SOC를 수용하기 위해 Freescale에서 수행한 것이라고 생각합니다. 오래된 하드웨어에 대한 지원이 중단된 것 같습니다. Freescale이 이 사실을 알고 있는지는 모르겠습니다. Freescale이 더 이상 이전 i.MX28을 지원하지 않는다는 표시가 있습니다. 어쨌든 이제 차이점을 분석할 차례입니다. 주요 차이점은 GPMI 주변 장치 클럭 주파수를 조정하기 위해 추가된 함수 호출입니다. 어떤 이유로든 GPMI 주변 장치는 이 단일 호출을 주석 처리한 후 NAND 플래시에서 제대로 작동하는 것 같습니다. 코드는 "drivers/mtd/nand/raw/gpminand/gpmi-lib.c" 파일, "gpmi_nfc_apply_timings" 함수에 있습니다. "clk_set_rate" 호출을 주석 처리하세요. 적어도 나에게는 이것이 효과가 있다. 나는 나중에 프로세서가 i.MX28인 경우에만 호출하지 않는 것이 향후 칩에서 작동할 수 있도록 하는 것이 더 낫다는 것을 깨달았습니다.

나는 clk_set_rate가 정확히 무엇을 하는지, 모든 프로세서에서 작동하도록 호출하는 방법을 분석하지 않았습니다. 다른 하드웨어가 없어서 확인할 수 없습니다.

관련 정보