디바이스 드라이버를 모듈로 컴파일해서 타겟보드에서 실행시키기

kenGwon·2024년 2월 29일
0

[Embedded Linux] BSP

목록 보기
35/36

우선 앞전 실습에서 설정한 빌트인 메뉴를 해제해 줘야 한다.

이 메뉴를 *에서 M(모듈)로 수정한다. 그러면 이제 우리의 디바이스 드라이버 소스가 빌트인이 아닌 모듈로 컴파일 되는 것이다.

리눅스 커널의 모듈로 컴파일 하기

ubuntu@ubuntu14:~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules -j4

모듈을 컴파일 하고 싶으면 build할 때 modules를 줘야한다.
원래는 모듈만 컴파일 하면 되는데, 빌트인 옵션을 해제한 버전으로 커널을 다시 빌드해야 하기 때문에 zImage 옵션도 넣어서 커널을 한번 더 빌드해주겠다.
다시한번 말하지만 모듈만 컴파일 할 수 있다.

이렇게 해서 .ko(kernel object) 파일을 생성하는게 목표이다.
원래 디바이스 드라이버 폴더에 보면 .ko파일이 없다.

ubuntu@ubuntu14:~/pi_bsp/kernel/linux/drivers/char/kcci_ledkey$ ls -l
합계 44
-rw-rw-r-- 1 ubuntu ubuntu   157  2월 29 09:53 Kconfig
-rw-rw-r-- 1 ubuntu ubuntu    42  2월 29 10:12 Makefile
-rw-rw-r-- 1 ubuntu ubuntu   142  2월 29 10:04 built-in.a
-rw-rw-r-- 1 ubuntu ubuntu 11458  2월 29 09:46 ledkey_dev.c
-rw-rw-r-- 1 ubuntu ubuntu    38  2월 29 10:43 ledkey_dev.mod
-rw-rw-r-- 1 ubuntu ubuntu 11124  2월 29 10:43 ledkey_dev.o
-rw-rw-r-- 1 ubuntu ubuntu    39  2월 29 10:43 modules.order

하지만 위의 모듈 컴파일 과정을 마치고 다시 커널 내 디바이스 드라이버 폴더를 보면 .ko 커널 오브젝프 파일이 생성된 것을 확인할 수 있다.

ubuntu@ubuntu14:~/pi_bsp/kernel/linux/drivers/char/kcci_ledkey$ ls -l
합계 72
-rw-rw-r-- 1 ubuntu ubuntu   157  2월 29 09:53 Kconfig
-rw-rw-r-- 1 ubuntu ubuntu    42  2월 29 10:12 Makefile
-rw-rw-r-- 1 ubuntu ubuntu   142  2월 29 10:04 built-in.a
-rw-rw-r-- 1 ubuntu ubuntu 11458  2월 29 09:46 ledkey_dev.c
-rw-rw-r-- 1 ubuntu ubuntu 12904  2월 29 10:51 ledkey_dev.ko
-rw-rw-r-- 1 ubuntu ubuntu    38  2월 29 10:43 ledkey_dev.mod
-rw-rw-r-- 1 ubuntu ubuntu  1860  2월 29 10:50 ledkey_dev.mod.c
-rw-rw-r-- 1 ubuntu ubuntu  4288  2월 29 10:51 ledkey_dev.mod.o
-rw-rw-r-- 1 ubuntu ubuntu 11124  2월 29 10:43 ledkey_dev.o
-rw-rw-r-- 1 ubuntu ubuntu    39  2월 29 10:43 modules.order

커널 이미지를 다시 라즈베리파이에 옮기고 실행해보기

// 새로 빌드된 커널 이미지 라즈베리파이로 옮겨서 다시 부팅하기
(생략)

// 커널 오브젝트 파일 옮기기
ubuntu@ubuntu14:~/pi_bsp/kernel/linux$ ls -l drivers/char/kcci_ledkey/ledkey_dev.ko
ubuntu@ubuntu14:~/pi_bsp/kernel/linux$ cp drivers/char/kcci_ledkey/ledkey_dev.ko /srv/nfs/

라즈베리파이에서 모듈 버전 확인

pi@pi14:/lib/modules $ ls -l
합계 20
drwxr-xr-x 3 root root 4096 12월  5일  10:07 6.1.0-rpi7-rpi-v6
drwxr-xr-x 3 root root 4096 12월  5일  10:06 6.1.0-rpi7-rpi-v7
drwxr-xr-x 3 root root 4096 12월  5일  10:06 6.1.0-rpi7-rpi-v7l
drwxr-xr-x 3 root root 4096 12월  5일  10:06 6.1.0-rpi7-rpi-v8
drwxr-xr-x 3 root root 4096  2월 21일  10:31 6.1.77-v7l+
pi@pi14:~ $ uname -a
Linux pi14 6.1.77-v7l+ #22 SMP Thu Feb 29 10:50:56 KST 2024 armv7l GNU/Linux

우리가 쓰는 커널 버전이 6.1.77-v7l+이기 때문에 /lib/modules/경로에 6.1.77-v7l+ 폴더 안에다가 디바이스 드라이버 커널 오브젝트를 넣어줘야 한다.

// 경로 확인
pi@pi14:/lib/modules/6.1.77-v7l+/kernel/drivers/char $ pwd
/lib/modules/6.1.77-v7l+/kernel/drivers/char

// 디바이스 드라이버를 담을 폴더 추가
pi@pi14:/lib/modules/6.1.77-v7l+/kernel/drivers/char $ mkdir kcci_ledkey
pi@pi14:/lib/modules/6.1.77-v7l+/kernel/drivers/char $ cp /mnt/ubuntu_nfs/ledkey_dev.ko . 

모듈.dep 의존성 업데이트

// 업데이트 전 모듈 의존성 확인
pi@pi14:/lib/modules/6.1.77-v7l+ $ vi modules.dep
// 모듈 의존성 업데이트
pi@pi14:/lib/modules/6.1.77-v7l+ $ sudo depmod -a
// 업데이트 후 모듈 의존성 확인
pi@pi14:/lib/modules/6.1.77-v7l+ $ vi modules.dep


맨 아래에 아무것도 없었는데 아래를 보면 새로 한줄이 추가되었다.

모듈 로드 해보고 확인하기

// 모듈 로드
pi@pi14:/lib/modules/6.1.77-v7l+ $ sudo modprobe ledkey_dev

// 모듈 적재 확인
pi@pi14:~ $ sudo cat /proc/devices
...
230 ledkey_dev
...

어플리케이션 실행해서 확인해보기

잘 실행되는 것을 확인할 수 있다.

profile
스펀지맨

0개의 댓글