Buildroot 드라이버 모듈 작성하기

Buildroot 드라이버 모듈 작성하기

Buildroot는 SSH를 지원하지 않으므로 ADB를 이용하여 디버깅한다.

ADB 연결

기기 목록 확인

adb devices

adb devices 실행 결과

기기 연결

adb shell

adb shell 실행 결과

드라이버 모듈 컴파일(크로스 컴파일)

드라이버 모듈 소스 코드

#include <linux/module.h>     /* 모듈 관련 매크로 및 함수 */
#include <linux/kernel.h>     /* printk 로그 함수 */

/* 로드 함수(드라이버 진입점) - insmod로 드라이버를 로드할 때 자동 실행 */
static int __init hello_drv_init(void)
{
    printk(KERN_INFO "hello_drv_init: driver loaded\r\n");
    return 0; // 0을 반환하면 로드 성공
}

/* 언로드 함수(드라이버 종료점) - rmmod로 드라이버를 언로드할 때 자동 실행 */
static void __exit hello_drv_exit(void)
{
    printk(KERN_INFO "hello_drv_exit: driver unloaded\r\n");
}

/* 커널에 진입점과 종료점 함수를 등록 */
module_init(hello_drv_init);
module_exit(hello_drv_exit);

/* 모듈 정보 선언 */
MODULE_LICENSE("GPL v2");               /* 모듈 라이선스 */
MODULE_VERSION("1.0");                  /* 모듈 버전(선택) */
MODULE_DESCRIPTION("Hello Driver");     /* 모듈 설명(선택), lsmod 시 표시됨 */

기능을 간단히 설명하면 다음과 같다.

드라이버 로드: hello_drv_init 로그 출력

드라이버 언로드: hello_drv_exit 로그 출력

크로스 컴파일 도구 경로 찾기

find prebuilts -name "*gcc" -type f

크로스 컴파일러 경로 검색 결과

보통 SDK 경로에서 찾을 수 있다.

Makefile 설정

# 타겟 아키텍처
# RK3566은 ARM64 아키텍처
ARCH ?= arm64

# 크로스 컴파일러 툴체인 접두사
# 최종적으로 aarch64-linux-gnu-gcc / ld / objcopy 등이 사용됨
CROSS_COMPILE ?= aarch64-linux-gnu-

# Linux 커널 소스 디렉터리
# 반드시 configure 및 prepare/modules_prepare가 완료된 커널이어야 함
# 용도: 어떤 커널 버전의 소스와 헤더로 컴파일/링크할지 결정
KERN_DIR := $(HOME)/Desktop/SDK/kernel

# 현재 외부 모듈 소스 디렉터리
# 커널은 이 디렉터리에서 obj-m으로 지정된 모듈 소스를 찾음
MOD_DIR  := $(shell pwd)

# 컴파일할 외부 커널 모듈
# hello_drv.c  →  hello_drv.ko
obj-m += hello_drv.o

# 기본 타겟: 커널 모듈 컴파일
all:
	# 커널 소스 디렉터리의 Makefile 호출
	# M=$(MOD_DIR)은 "외부 모듈"임을 의미
	# ARCH / CROSS_COMPILE은 타겟 아키텍처와 크로스 컴파일러 지정
	$(MAKE) -C $(KERN_DIR) M=$(MOD_DIR) \
		ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules

# 컴파일 시 생성된 중간 파일 정리
clean:
	$(MAKE) -C $(KERN_DIR) M=$(MOD_DIR) clean

PS: 핵심 설정 항목

크로스 컴파일러 툴체인 접두사: aarch64-linux-gnu-

Linux 커널 소스 디렉터리 경로: $(HOME)/Desktop/SDK/kernel

컴파일

make

모듈 출력 경로

컴파일 결과 모듈 출력

드라이버 테스트

드라이버를 RK3566 보드로 복사

ADB 사용

ADB가 이미 보드에 연결되어 있다면 먼저 연결을 해제한다.

exit

보드 기기 확인

adb devices

ADB 기기 목록 확인

로컬의 드라이버 모듈 파일을 보드로 전송한다.

adb -s 0123456789abcdef push hello_drv.ko /data/local/tmp/hello_drv.ko

adb push 전송 결과

드라이버 모듈 로드

insmod hello_drv.ko

드라이버 관련 로그 확인

dmesg | grep -E 'hello'

insmod 후 dmesg 로그

드라이버 모듈 언로드

rmmod hello_drv.ko

드라이버 관련 로그 확인

dmesg | grep -E 'hello'

rmmod 후 dmesg 로그

태그: buildroot linux-kernel-module cross-compilation ADB RK3566

8월 31일 13:50에 게시됨