Regulus Ev kit SPI 동작 문의

안녕하세요, Regulus EV Kit에 구성된 SPI 동작 관련하여 문의드립니다.

(SOM : Regulus_SOM_Rev.02 / Base : Regulus_Base_Rev.02

현재 첨부 베이스보드 회로 이미지와 같이 MIPI Rx1 채널에 구성된 GPIO2_IO16 ~ 19 핀을 활용하여 SPI를 구동하고자 합니다.

내부적으로 SPI 4번 채널+Slave로 할당되어 있는 것 같은데, 활성화 후 테스트한 결과 동작하지 않는 것 같아 문의드립니다.

Regulus AP를 SPI Master로 사용하고자 합니다. SPI 4 채널을 Master 설정할 수 있는지 확인 부탁드립니다.

또는 SPI 설정 관련하여 참고할 만한 문서 등이 있다면 전달 부탁드립니다.

안녕하세요.

모빌린트 박상형입니다.

현재 사용하시려는 핀은 SPI Slave 전용 핀이라 Master로는 사용이 어렵습니다.

SPI Master로 사용하시려면 Master를 지원하는 핀(GPIO0_17~30, GPIO1_07~13)을 사용하셔야 하는데,

현재 EVK에서는 SPI Master용 포트 3개가 모두 사용 중이어서 추가로 할당이 어려운 상황입니다.

대안으로, SPI_S1 핀이 현재 GPIO로 설정되어 있으므로 GPIO 제어(bit-banging) 방식으로 SPI Master를 구현하는 방법을 고려해 볼 수 있습니다.

다만 이 경우 통신 속도에 제약이 있을 수 있어, 연휴가 끝난 뒤 내부적으로 논의하여 다시 회신드리겠습니다.

그럼, 감사합니다.

문의하신 SPI Master 사용 방법에 대해 내부 검토한 내용 안내드립니다.

현재 사용하시려는 GPIO2_IO16~19는 SPI Slave 전용 핀으로, SPI Master로 전환하여 사용할 수 없습니다.

따라서 하드웨어 SPI Master가 필요한 경우, 커스텀 베이스보드를 제작하여 아래 포트를 활용하시는 방안을 권장드립니다.

SPI_M0: GPIO0_17~23

SPI_M1: GPIO0_24~30

note: SPI_M2(GPIO1_07~13)는 현재 Regulus-ra SoM에서 XIP 부팅용 NOR Flash에 연결되어 있으므로, 외부 장치 연결용으로 사용하기 어렵습니다.

설계 시 해당 핀의 다른 기능(PWM/UART 등)과의 중복 사용 여부를 확인해 주시기 바랍니다. 핀별 기능은 아래 자료를 참고 부탁드립니다.
(dl.mobilint.com → REGULUS → ra → H/W → MRH001-03-001_REGULUS_Datasheet_v1.0 → 1.2 Multi-Function Pin)

기존 Regulus EV Kit을 그대로 사용하시는 경우에는 앞서 박상형님께서 안내드린 방식을 고려할 수 있습니다.
Linux 커널의 CONFIG_SPI_GPIO 옵션을 활용하는 방법이 있으나, 실제 적용 가능 여부는 사용 환경에서 별도 확인이 필요합니다.

다만 이 방식은 동작 및 성능을 보증해 드리기 어려우므로 직접 적용 및 검증해 주셔야 하는 점 양해 부탁드립니다.

감사합니다.

SDT 이윤호 입니다. 확인해 주셔서 감사합니다.

우선 bit-banging 의 경우 현재 검토 중인 상황에선 사용하기 어려울 듯 합니다. (7 MHz 이상 필요)

추가적으로 Base 보드에 연결된 SPI M0 채널의 경우 QSPI 플래시가 연결되어 있습니다. (U7)

QSPI 플래시의 용도가 무엇인지, SoM에 실장된 경우와 같이 필수인 경우가 아니라면 해당 QSPI 플래시 연결을 해제하여 SPI 마스터로 사용해 보고자 합니다.

확인 가능하실까요 ?!

@sanghyung @youngkyoun

베이스 보드에 실장된 NOR Flash는 테스트용도라 보시면 되겠습니다.
제품 동작에 필수적인 요소가 아니므로, 연결을 해제하신 후 SPI Master 용도로 사용하셔도 무방합니다.

추가로 궁금하신 사항이 있으시면 언제든 편하게 문의 부탁드립니다.

감사합니다.

1 Like

안녕하세요, 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를 정상적으로 사용하기 위해 추가로 설정해야 하는 부분이 있을지 문의드립니다.
감사합니다.

안녕하세요. 박동진님
모빌린트 임영균 입니다.

문의하신 Regulus EV Kit의 SPI_M0 동작과 관련하여 확인 결과를 안내드립니다.
Regulus_Base_Rev.02 보드에서 하드웨어 연결 문제가 확인되었습니다.

해당 보드에서는 SPI_M0_RXDS 신호가 SDIO0_PWR_SEL에 연결되어 있습니다. SPI_M0_RXDS를 실제 SPI 통신에 사용하지 않더라도, 이 연결 자체가 SPI_M0 동작에 영향을 주는 것으로 파악하고 있습니다.

우회 방안으로는 해당 연결을 분리하기 위한 저항 제거와 Device Tree 설정 변경을 검토할 수 있습니다.

초기 안내에서 충분히 설명드리지 못해 혼선을 드린 점 죄송합니다.

위 수정 사항을 적용한 뒤 SPI_M0 동작 확인을 부탁 드립니다.
적용 후에도 문제가 있으시다면 말씀주세요.

감사합니다.

안녕하세요. 박동진님

추가로 한 가지 확인 부탁드립니다.
말씀해 주신 PDMA 사용 불가 내용과 관련하여, 현재 사용 중이신 SDK 버전을 확인해 주실 수 있을까요?
SDK v3.4.0에는 v3.3.0 대비 SPI 관련 수정 사항이 다수 반영되어 있으며, PDMA도 기본 활성화되어 있습니다.

감사합니다.

안녕하세요 SDT 박동진입니다. 확인해주셔서 감사합니다.
SDK 와 SPI 드라이버 버전 업데이트 이후 문제가 해결되는 것을 확인했습니다.
추가로 궁금한 사항이 생기면 문의드리도록 하겠습니다.
감사합니다.

1 Like