0xFF
Dragon Q6A Armbian에서 spidev 활성화 본문
퀄컴 SoC는 QUP(Qualcomm Universal Peripheral)이라는 프로그래밍 가능한 범용 하드웨어 IO 모듈을 여러 개 내장하고 있다.
여기서 범용이라는 것은 여러 인터페이스(SPI, I2C, UART 등)를 지원한다는 것이고,
프로그래밍 가능하다는 것은 소프트웨어 레벨에서 하나의 QUP 블록이 어떤 인터페이스로 기능할지 변경이 가능하다는 의미이다.
Dragon Q6A 보드에 탑재된 QCS6490도 퀄컴 SoC여서 spi를 활성화하려면 칩에 내장된 여러 QUP 모듈 중 하나를 SPI 버스로 작동하도록 설정해야 한다.

먼저 Dragon Q6A의 핀아웃을 보고 원하는 위치의 SPI 버스를 하나 고른다.
작성자는 6번 SPI를 사용하기로 했다.
dtc -I dtb -O dts -o ~/my.dts /boot/armbian-dtb-6.18.8-edge-qcs6490
어느 핀을 쓸지 결정했다면 위와 같은 명령어로 /boot 디렉터리에 있는 디바이스 트리 blob(dtb)을 평문 디바이스 트리(dts)로 디컴파일한다.
이렇게 하면 홈 디렉터리에 my.dts 라는 이름으로 평문 형태의 디바이스 트리 파일이 생성된다.
생성된 my.dts를 열어 보면 상단에서 몇 줄 지나지 않아 alias 노드가 보이는데,
여기서 사용하기로 했던 spi6의 정의를 확인해 보면..
aliases {
...
spi6 = "/soc@0/geniqup@9c0000/spi@998000";
...
}
CPU에서 해당 SPI 버스에 접근하기 위해 사용하는 주소는 @998000임을 알 수 있다.
spi@998000 {
compatible = "qcom,geni-spi";
reg = <0x00 0x998000 0x00 0x4000>;
clocks = <0x39 0x52>;
clock-names = "se";
pinctrl-names = "default";
pinctrl-0 = <0x74 0x75>;
interrupts = <0x00 0x25f 0x04>;
#address-cells = <0x01>;
#size-cells = <0x00>;
power-domains = <0x38 0x00>;
operating-points-v2 = <0x4d>;
interconnects = <0x49 0x00 0x00 0x49 0x02 0x00 0x06 0x02 0x00 0x44 0x1d 0x00>;
interconnect-names = "qup-core", "qup-config";
dmas = <0x4a 0x00 0x06 0x01 0x4a 0x01 0x06 0x01>;
dma-names = "tx", "rx";
status = "disabled";
};
‘spi@998000’로 Ctrl+F를 해보면 위와 같이 해당 버스에 대한 정의도 확인할 수 있다.
spi@998000 {
...
status = "okay";
lcd@0 {
compatible = "rohm,dh2228fv";
reg = <0>;
spi-max-frequency = <40000000>;
};
};
먼저 status 속성을 disabled에서 okay로 변경한 다음,
여기에 lcd@0 이라는 하위 노드를 추가하였다.
통신 속도는 40MHz(40000000Hz)로 지정하였다.
sudo dtc -I dts -O dtb -o /boot/armbian-dtb-6.18.8-edge-qcs6490 ~/my.dts
dts 수정이 완료된 후 위 명령어를 실행하여 dtb로 컴파일 후 실제 부팅 시 참조하는 원본 디바이스 트리를 덮어쓴다.
$ modprobe spidev
$ reboot
적용이 완료되면 spidev 커널 모듈을 활성화하고 재부팅한다.
$ ls /dev | grep spi
spidev6.0
이제 spi 버스가 /dev 디렉터리에서 표시되는 것을 확인할 수 있다!
'LINUX' 카테고리의 다른 글
| QCS6490 Linux Host에서 LLM 구동 실험 (0) | 2026.02.05 |
|---|---|
| 터미널 폰트 추천 - Neo둥근모 (0) | 2020.01.05 |
