안녕하세요, SDT 박동진입니다. Regulus EV Kit SPI 동작 관련하여 문의드립니다.
(SOM : Regulus_SOM_Rev.02 / Base : Regulus_Base_Rev.02)
말씀해주신 내용에 따라 QSPI Flash 연결을 해제하고 SPI_M0를 Master 용도로 사용하도록 구성하였습니다. SPI_M0 활성화를 위해 커널 디바이스트리와 U-Boot 소스에서 아래 3가지를 수정하였습니다.
1.M0 핀 그룹 — SD카드 GPIO와 먹스 충돌
SoC의 M0 핀 그룹이 공유 먹스(mux) 비트를 사용하는데, 보드의 SD카드 전원 제어 GPIO와 겹쳐 SPI_M0가 비활성화되고 있어, 아래와 같이 SD카드 관련 노드 2곳을 비활성화하였습니다 (regulus-base-b.dts).
&usdhci0 { // SD카드 컨트롤러
…
status = “disabled”; // 기존 “okay”
};
vdd3v3_sd: vdd3v3-sd { // SD 전원 레귤레이터
…
status = “disabled”; // 신규 추가 (속성 없으면 기본 okay)
};
2.U-Boot가 부팅 시 SPI_M0 status를 강제로 덮어쓰던 코드 제거
board/mobilint/regulus_evk/regulus_evk.c의 ft_board_setup()이 보드 버전 스트랩(B_VER0~3, GPIO0_24/25/26/29)을 읽어, rev01이 아닌 경우 /soc/spi@130015000의 status를 무조건 “disabled”로 재패치하고 있었습니다. 해당 패치 코드 3줄을 주석 처리한 후 U-Boot를 재빌드·재플래싱하였습니다.
} else {
fdt_find_and_setprop(blob, “/usb-hub”, “status”, “disabled”, 9, 1);
offs = fdt_path_offset(blob, “/soc/usb3-0”);
if (offs >= 0) fdt_delprop(blob, offs, “phys”);
// fdt_find_and_setprop(blob, "/soc/spi@130015000",
// "status", "disabled", 9, 1); // <- 이 3줄 주석 처리
}
3.flash@0 ↔ spidev@0 전환 매크로 변경
regulus-base-b.dts에 #if 1 / #else / #endif 전처리기로 QSPI 플래시(flash@0)와 spidev 마스터(spidev@0)를 토글하도록 구성되어 있었습니다. #if 1을 #if 0으로 변경하여 spidev@0 블록을 활성화하였습니다 (status는 이미 okay로 설정되어 있어 추가 수정은 하지 않았습니다).
#if 0 // 변경 전: #if 1 (flash@0 사용)
mt25qu256aba0: flash@0 { … };
#else // 변경 후 이 블록이 활성화됨
spidev@0 {
compatible = “spidev”;
reg = <0>;
status = “okay”;
};
#endif
이렇게 수정한 이후 SPI_M0를 통해 FPGA(Efinix T20F169)와 SPI 슬레이브 통신(연속 프레임 폴링 방식)이 정상적으로 동작하는 것을 확인하였습니다. 다만 통신 중 매우 간헐적으로(수백~수천 트랜잭션에 1회 수준) 오실로스코프로 직접 확인해보니, CS가 다른 무언가에게 주도권을 뺏기는 듯한(전송 도중 CS가 짧게 풀려났다가 다시 잡히는) 현상이 있었습니다 (사진 1, 2 참고). 전송은 64바이트 단위(chunk_bytes=64)로 쪼개어 보내고 있으며, SPI 클럭은 1~5MHz 범위에서 테스트하였으나 클럭 속도와 무관하게 재현되고 있습니다.
[사진 1] 정상적으로 완료된 SPI 트랜잭션 파형입니다 (CH1=CS, 20µs/div). CS가 한 번 Low로 떨어진 뒤 약 30.4µs 동안 끊김 없이 유지되다가 정상적으로 High로 복귀하는 것을 확인할 수 있습니다.
[사진 2] 위와 같은 구간을 5µs/div로 확대 캡처한 화면입니다. 정상이라면 CS가 사진 1처럼 끊김 없이 Low를 유지해야 하는데, 이번 캡처에서는 전송 도중 CS가 순간적으로 두 차례 연속 완전히 High까지 솟았다가(화면 중앙 부근) 다시 Low로 돌아와 전송이 이어지는 것이 관측되었습니다. 저희가 간헐적으로 겪고 있는, CS가 주도권을 뺏기는 듯한 현상이 바로 이 모습입니다.
혹시 SPI_M0 활성화를 위해 위 3가지 외에 추가로 수정해야 하는 사항이 있는지, 혹은 잘못 수정한 부분이 있는지 확인 부탁드립니다.
추가로 한 가지 더 문의드리고 싶은 부분이 있습니다. 현재는 PIO(인터럽트 기반) 모드로 64바이트씩 전송하고 있는데, 이를 DMA 방식으로 전환해보고자 디바이스트리에 설정된 DMA를 활성화해보았으나,
dw_spi_mmio 130015000.spi: DMA init failed
위와 같은 메시지와 함께 DMA 초기화가 실패하여 PIO 모드로 동작하고 있습니다. 디바이스트리에는 dmas/dma-names 프로퍼티가 정상적으로 설정되어 있는 것으로 확인하였는데, DMA를 정상적으로 사용하기 위해 추가로 설정해야 하는 부분이 있을지 문의드립니다.
감사합니다.