디바이스 드라이버 - 수업준비

kenGwon·2024년 2월 21일
0

[Embedded Linux] BSP

목록 보기
22/36

디바이스 드라이버는 5-6일정도 수업이 진행될 예정이다.
다시 옛날에 교차개발환경이 셋팅되어있는 백업이미지로 돌아가겠다.

사전 준비1 - 이미지 백업본으로 회귀

디바이스드라이버의 전제조건이 있다.
디바이스드라이버는 커널이 준비되어있어야 한다.
타겟보드에 맞는 커널이 준비되어 있어야 한다는 것이다.

옛날 백업 이미지 쓰기

우리는 직전에 yocto로 이것저것 미니멀한 파일시스템을 설치해놔서 교차개발환경이 셋팅되어 있지 않은 상태이다. 그래서 다시 이전에 교차개발환경이 셋팅되어있던 상태로 돌아가겠다. 그러기 위해서 "samba, nfs, ssh, comport serial까지 셋팅되어 있던 최초의 sdimage.img 이미지"를 SD카드에 써주겠다.

// 우분투에서 저번에 백업받아놨더던 이미지 찾기
ubuntu@ubuntu14:~/raspi4_backup_image$ sudo updatedb
ubuntu@ubuntu14:~/raspi4_backup_image$ locate sdimage.img
/home/ubuntu/raspi4_backup_image/sdimage.img

// 1. 우분투 GUI로 sd카드를 인식시키자.
// 2. 그리고 다시 umount하자.
ubuntu@ubuntu14:~/raspi4_backup_image$ sudo umount /dev/sdb?

// 8기가의 sdimage.img를 sd카드에 write하자
ubuntu@ubuntu14:~/raspi4_backup_image$ ls
sdimage.img
ubuntu@ubuntu14:~/raspi4_backup_image$ sudo dd if=sdimage.img of=/dev/sdb bs=1M status=progress
8054112256 bytes (8.1 GB, 7.5 GiB) copied, 1433 s, 5.6 MB/s[[C^[[C
7684+0 레코드 들어옴
7684+0 레코드 나감
8057257984 bytes (8.1 GB, 7.5 GiB) copied, 1637.72 s, 4.9 MB/s

우리가 최초에 백업 받을 때 /dev/sdb1, /dev/sdb2를 통째로 백업받았기 때문에, 다시 쓸 때도 of=/dev/sdb으로 통째로 주면서 써줘야한다.

파티션 크기 8기가에서 32기가로 늘려주기

위의 명령을 모두 마쳐서 커널을 써주면 우리 SD카드의 파티션이 8기가로 잡힌다.(왜냐하면 우리가 애초에 백업 이미지를 만들어놓고 그걸 8기가로 짤라놨기 때문이다.)
df로 파일시스템을 확인해보면, /dev/mmcblk0p2 7149700 4658416 2107904 69% / 이렇게 루트파일시스템의 파티션이 8기가로 잡혀있는 것을 알 수 있다.

pi@pi14:~ $ df
파일 시스템            1K-블록     사용     가용 사용% 마운트위치
udev                    687300        0   687300    0% /dev
tmpfs                   191672     2264   189408    2% /run
/dev/mmcblk0p2         7149700  4658416  2107904   69% /
tmpfs                   958360      140   958220    1% /dev/shm
tmpfs                     5120       16     5104    1% /run/lock
/dev/mmcblk0p1          522232   123420   398812   24% /boot/firmware
tmpfs                   191672       44   191628    1% /run/user/1000
10.10.15.84:/srv/nfs 153189376 94135296 51200000   65% /mnt/ubuntu_nfs

이걸 원래 SD카드의 용량에 맞게 32기가로 파티션을 확장해주겠다.
첫번째 방법은 gpartd로 하는 것이고(이전에 GUI에서 했던 방법),
두번째 방법은 raspi-config로 늘리는 것이다.
라즈베리파이에서 자체적으로 지원하는 기능을 이용해서 확장해보겠다. 아래 명령어로 라즈베리파이 설정 cmd에 진입한다.

pi@pi14:~ $ sudo raspi-config
  1. 설정cmd창이 켜진다.
  2. 6 Advanced Options Configure advanced settings 옵션에 들어간다.
  3. A1 Expand Filesystem Ensures that all of the SD card is available 옵션을 선택한다.
  4. <확인>을 여러번 누르고, <finish>를 누르면, 재부팅하겠냐고 물어본다. 재부팅해준다.

재부팅 후 df를 쳐보면 정상적으로 파티션이 확장된 것을 확인할 수 있다.

pi@pi14:~ $ df
파일 시스템            1K-블록     사용     가용 사용% 마운트위치
udev                    687300        0   687300    0% /dev
tmpfs                   191672     2268   189404    2% /run
/dev/mmcblk0p2        30082132  4664636 24102200   17% /
tmpfs                   958360      140   958220    1% /dev/shm
tmpfs                     5120       16     5104    1% /run/lock
/dev/mmcblk0p1          522232   123420   398812   24% /boot/firmware
tmpfs                   191672       44   191628    1% /run/user/1000
10.10.15.84:/srv/nfs 153189376 94135296 51200000   65% /mnt/ubuntu_nfs

사전준비2 - 라즈베리파이 커널 업그레이드

커널 소스를 업그레이드 하고 커스텀 시스템 콜을 추가했던 커널을 라즈베리파이에 올려야 한다.

현재 라즈베리파이 커널 확인

pi@pi14:~ $ uname -a
Linux pi14 6.1.0-rpi7-rpi-v8 #1 SMP PREEMPT Debian 1:6.1.63-1+rpt1 (2023-11-24) aarch64 GNU/Linux

우분투에서 빌드되어 있는 커널 소스가 타겟보드에 올라가 있어야 한다. 교차개발환경에서는 양쪽의 커널 소스가 동일해야 한다.
백업된 이미지는 아주 옛날 버전이기 때문에, 시스템 콜 함수를 코딩해놨던 부트이미지(zImage)가 올라가 있지 않다.


커널 옮겨쓰기 (via ubuntu 직접연결)

우리는 디바이스 드라이버를 만들기 위해 우리가 이전에 만들었던 시스템 콜 함수를 사용해야 하기 때문에, 다시 ~/pi_bsp/kernel/linux 경로로 들어가서 ./build.sh (make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j4 ) 명령을 날려서 우선 시스템콜을 포함한 커널을 다시 빌드해준다.(확인차 다시 빌드하는 것이다.)

그리고 나서 아래 명령어를 해당 경로에서 입력해준다. 그러면 디바이스 드라이버가 싹다 SD카드에 복사된다.

~/pi_bsp/kernel/linux$ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/ubuntu/rootfs modules_install

그리고 혹시 부팅이 안될수도 있으니까 기존에 있던 커널을 백업받아 놓겠다.

~/pi_bsp/kernel/linux$ sudo cp /media/ubuntu/bootfs/kernel7l.img /media/ubuntu/bootfs/kernel7l-backup.img

그리고 위에서 빌드한 이미지와 기타 파일들을 SD카드에 써주겠다.

~/pi_bsp/kernel/linux$ sudo cp arch/arm/boot/zImage /media/ubuntu/bootfs/kernel7l.img
~/pi_bsp/kernel/linux$ sudo cp arch/arm/boot/dts/*.dtb /media/ubuntu/bootfs/
~/pi_bsp/kernel/linux$ sudo cp arch/arm/boot/dts/overlays/*.dtb* /media/ubuntu/bootfs/overlays/
~/pi_bsp/kernel/linux$ sudo cp arch/arm/boot/dts/overlays/README /media/ubuntu/bootfs/overlays/

그리고 아래 경로의 부트 컨피그 파일을 열어서 맨 아래다가 arm_64bit=0을 추가해준다.

~/pi_bsp/kernel/linux$ sudo vi /media/ubuntu/bootfs/config.txt

바뀐 커널 확인

이것으로 커널 옮겨쓰기가 끝났다. SD카드를 다시 라즈베리파이에 껴서 커널이 제대로 올라갔는지 확인한다. 커널버전이 6.1.77로 올라갔다.

pi@pi14:~ $ uname -a
Linux pi14 6.1.77-v7l+ #20 SMP Wed Feb 21 10:24:07 KST 2024 armv7l GNU/Linux

디바이스 드라이버가 제대로 적재되었는지 확인

이제부터 우리는 디바이스 드라이버를 만들어야 한다. 그렇기 때문에 우선 커널을 빌드할 때 같이 빌드했던 디바이스 드라이버가 라즈베리파이에 잘 적재되어있는지 아래의 명령어를 통해 확인한다.

pi@pi14:~ $ lsmod  // 부팅하면서 로드된 모듈을 확인한다.
profile
스펀지맨

0개의 댓글