0xFF
Radxa Dragon Q6A 리눅스 커널에 ath9k_htc 드라이버 활성화하기 본문

퀄컴 QCS6490을 탑재한 Radxa사의 Dragon Q6A보드를 들여왔다.
개인 프로젝트를 위해 적당한 성능의 SBC를 찾던 중 BCM2712와 RK3588의 상위호환이라는 평이 많아 구매한 것인데
제조사에서 제공하는 OS 이미지에 AR9271의 드라이버인 ath9k_htc 모듈이 포함되어 있지 않다는 사실을 알게 되었다.
그리고 혹시나 하는 생각에 설치해본 캐노니컬의 QCS6490 전용 우분투 이미지마저 동일하다는 것을 알게 되었다.
나름대로 추측을 해 본 결과 퀄컴에서 배포하는 커널 소스 트리의 menuconfig 기본값을 건드리지 않고 빌드하여 그런 것이 아닐까 싶었다.
평소였으면 이쯤에서 귀찮음에 순정 커널에서 지원되는 다른 모듈을 구매하지 않았을까 싶지만
갑자기 생긴 오기에 커널 빌드까지 해서 드라이버를 직접 활성화 해보고자 노력했던.. 과정을 기록해보고자 한다.(결국은 실패함)
모든 내용은 퀄컴 공식 커널 빌드 가이드를 참고하였으며
타겟 보드는 부팅에 SD카드를 사용했으며 Radxa에서 배포하는 우분투 이미지를 기준으로 한다.
먼저 공식 가이드에 따라 커널 빌드를 수행할 호스트 PC에 Ubuntu 24.04를 준비해놓는 것으로 시작한다.
환경 세팅이 귀찮다면 공식 우분투 이미지를 구동 중인 Radxa Q6A위에서 그대로 따라하는 것도 괜찮을 것 같다.
호스트 PC에서 /etc/apt/sources.list.d/ubuntu.sources 파일의 최하단에 다음 내용을 추가한다.
Types: deb-src
URIs: http://ports.ubuntu.com/ubuntu-ports
Suites: noble
Components: main restricted
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg저장한 다음 sudo apt update를 실행하여 변경사항을 반영한다.
빌드에 필요한 패키지를 설치한다.
sudo apt build-dep -y linux
sudo apt install build-essential dpkg-cross libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf fakeroot libncurses-dev dh-make llvm dwarves libtraceevent-dev libtracefs-dev gcc-aarch64-linux-gnu debhelper crossbuild-essential-amd64 dwarfdump
sudo snap install rustup --classic
rustup install stable
커널 소스코드를 clone 한다.
git clone https://git.launchpad.net/~canonical-kernel/ubuntu/+source/linux-qcom/+git/noble && cd noble
타겟 시스템(arm64)과 빌드 시스템(x86_64)의 CPU 아키텍처가 다르므로 크로스컴파일을 위한 환경변수를 설정해 준다.
export ARCH=arm64
export $(dpkg-architecture -aarm64)
export CROSS_COMPILE=aarch64-linux-gnu-
fakeroot를 사용하여 makefile 스크립트를 아래와 같은 순서로 실행한다.
fakeroot debian/rules clean
fakeroot debian/rules editconfigs # 커널 빌드 옵션(장치 드라이버 등)
fakeroot debian/rules updateconfigs # 옵션 변동사항 반영
fakeroot debian/rules binary # 빌드 시작
두번째 줄의 fakeroot debian/rules editconfigs를 실행하면 TUI 창이 뜰 것인데,
Device Drivers > Network device support > Wireless LAN > Atheros Wireless Cards
의 순서로 이동하여 Atheros HTC based wireless cards support가 <M>으로 표시되도록 한다.
이는 드라이버를 커널 모듈(.ko) 형식으로 빌드하도록 하는 것이다.

그런 다음 Save를 눌러 위와 같이 저장하면 된다.

마지막으로 fakeroot debian/rules binary를 실행하면 커널 빌드가 시작된다.

빌드가 완료되면 커널 이미지와 커널 모듈(*.ko)등 산출물들이 .deb 패키지로 소스 트리의 상위 디렉터리에 저장된다.
생성된 deb 패키지의 목록은 아래와 같다.
$ ls -alh | grep deb
-rw-r--r-- 1 ubuntu ubuntu 798K Jan 20 19:45 linux-buildinfo-6.8.0-1012-qcom_6.8.0-1012.12_arm64.deb
-rw-r--r-- 1 ubuntu ubuntu 3.2M Jan 20 19:45 linux-headers-6.8.0-1012-qcom_6.8.0-1012.12_arm64.deb
-rw-r--r-- 1 ubuntu ubuntu 17M Jan 20 19:43 linux-image-unsigned-6.8.0-1012-qcom_6.8.0-1012.12_arm64.deb
-rw-r--r-- 1 ubuntu ubuntu 398K Jan 20 19:45 linux-libc-dev-qcom_6.8.0-1012.12_all.deb
-rw-r--r-- 1 ubuntu ubuntu 91M Jan 20 19:45 linux-modules-6.8.0-1012-qcom_6.8.0-1012.12_arm64.deb
-rw-r--r-- 1 ubuntu ubuntu 14M Jan 20 19:45 linux-qcom-headers-6.8.0-1012_6.8.0-1012.12_all.deb
-rw-r--r-- 1 ubuntu ubuntu 327K Jan 20 19:45 linux-qcom-tools-common_6.8.0-1012.12_all.deb
-rw-r--r-- 1 ubuntu ubuntu 327K Jan 20 19:45 linux-source-6.8.0_6.8.0-1012.12_all.deb
여러 패키지들이 생성되었지만 최종 목표인 AR9271 활성화를 위해서는 커널 이미지와 드라이버만 있으면 된다.
linux-image-unsigned-6.8.0-1012-qcom_6.8.0-1012.12_arm64.deb
linux-modules-6.8.0-1012-qcom_6.8.0-1012.12_arm64.deb
바로 위의 두 패키지가 그것인데, 바로 설치해 보자.
설치할 커널의 이름(버전)은 6.8.0-1012-qcom인 것을 확인할 수 있다.
sudo dpkg -i \
linux-modules-6.8.0-1012-qcom_6.8.0-1012.12_arm64.deb \
linux-image-unsigned-6.8.0-1012-qcom_6.8.0-1012.12_arm64.deb이 때, 커널 이미지 패키지는 커널 모듈 패키지에 의존성을 갖기 때문에 modules 패키지를 먼저 설치하여야 함에 유의한다.
$ uname -r
6.15.7+이제 커널을 변경하기 전 현재 커널(변경 전) 이름을 확인해 본다.
이후 커널 이미지를 변경하기 위해 vim /etc/default/grub 설정을 변경하는 방법을 시도해 보았으나
분명히 update-grub에서 문제가 없었음에도 변경한 커널이 적용되지 않는 문제를 확인했다.
그러다 문득 efi 파티션은 있는지 궁금해져 df를 실행해 보고는 efi 파티션이 없다는 것을 깨달았다.
결론부터 말하자면 Radxa의 우분투 이미지는 grub가 설치는 되어 있지만 실제로는 사용되지 않고
퀄컴 칩의 부트 펌웨어에 의해 직접 커널 이미지가 로드된다는 것이다.
이러한 환경에서의 커널 이미지 교체 방법은 다음과 같다.
$ sudo mount /dev/mmcblk2p1 /mnt먼저 부트 파티션을 /mnt에 마운트한다.
$ file /mnt/Image
/mnt/Image: Linux kernel ARM64 boot executable Image, little-endian, 4K pages
해당 파티션에 비압축 포맷의 커널 이미지가 존재한다는 것을 확인할 수 있다.
이 커널 이미지를 덮어쓰면 될 것 같다.
# file /boot/vmlinuz-6.8.0-1012-qcom
/boot/vmlinuz-6.8.0-1012-qcom: gzip compressed data, max compression, from Unix, original size modulo 2^32 53766656새로 설치한 커널 이미지는 /boot 디렉터리에 위치하고 있는데,
동일하게 file 명령어로 확인해 보았더니 압축된 상태임을 알 수 있다.
# cd /mnt
# zcat /boot/vmlinuz-6.8.0-1012-qcom > ./Image
따라서 압축을 해제하여 순수한 비압축 커널 이미지를 얻는다.
gzip 대신 zcat의 출력을 파일로 보내는 형식을 취하는 것은 커널 이미지가 일반적인 파일 아카이브가 아닌 바이너리이기 때문이다.
여기까지 진행하게 되면 /mnt 디렉터리에 기존 커널 이미지가 새로 빌드한 커널 이미지로 대체가 완료된다.
---추가---
하지만 이렇게까지 해봐도 부팅이 되질 않아서 Armbian 직접 빌드까지 시도해 보았지만 차도가 없어 결국 온보드된 AIC8800 칩셋에 u.fl to rp-sma 변환 케이블을 달아 사용하기로 결정했습니다. ㅠㅠ
--- 2026. 02. 01. 추가 ---
Armbian 빌드를 재시도하여 결국 성공했습니다.

