NAND FLASH 읽기 시 i.MX28 SOC DMA 시간 초과

NAND FLASH 읽기 시 i.MX28 SOC DMA 시간 초과

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

첫 번째 단계는 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 버전이 있다는 것을 깨달았습니다(몇 년 전에 다른 회사에서 준비한 버전입니다). 이는 하드웨어 문제가 아니라는 증거입니다. 또한 2개의 서로 다른 하드웨어 보드에서 동일한 문제가 나타난다는 사실은 하드웨어 문제가 아님을 나타냅니다. 어느 시점에서 나는 이전 작업 솔루션에 최대한 가까운 이전 Linux 버전을 사용해 보기로 결정했습니다. 이는 커널 3.16.68이 자체 빌드를 사용하여 제대로 작동하고 있음을 보여줍니다. 내 5.1.5 및 4.20.7 빌드에는 NAND FLASH 문제가 표시됩니다. 더 많은 실험에서 마지막으로 작동하는 커널은 4.16.18이고 4.17.1 이상에서는 문제가 있는 것으로 나타났습니다. Freescale GPMI 주변 장치에 대한 NAND FLASH 지원이 재구성된 것으로 보입니다. 나는 이것이 최신 프로세서/SOC를 수용하기 위해 프리스케일로 수행되었다고 가정합니다. 오래된 하드웨어에 대한 지원이 중단된 것 같습니다. 이것이 Freescale에 알려져 있는지 여부는 알 수 없습니다. Freescale이 더 이상 이전 i.MX28을 지원하지 않는다는 징후가 있습니다. 어쨌든 이제 차이점을 분석해 볼 차례였습니다. 결정적인 차이점은 추가된 GPMI 주변 장치의 클럭 주파수를 조정하는 함수 호출에 나타납니다. 어떤 이유로든 이 단일 호출을 주석 처리한 후 GPMI 주변 장치는 NAND FLASH에서 올바르게 작동하는 것 같습니다. 이 코드는 "drivers/mtd/nand/raw/gpminand/gpmi-lib.c" 파일, "gpmi_nfc_apply_timings" 함수에 있습니다. "clk_set_rate" 호출을 주석 처리하세요. 적어도 나에게는 이것이 효과가 있다. 나중에 나는 프로세서가 i.MX28인 경우에만 호출을 피하여 최신 칩에서 작동할 수 있도록 하는 것이 더 낫다는 것을 깨달았습니다.

나는 clk_set_rate가 정확히 무엇을 하는지, 그리고 모든 프로세서에서 작동하기 위해 어떻게 호출되어야 하는지 분석하지 않았습니다. 다른 하드웨어가 없어서 확인할 수 없습니다.

관련 정보