디바이스 드라이버는 5-6일정도 수업이 진행될 예정이다.
다시 옛날에 교차개발환경이 셋팅되어있는 백업이미지로 돌아가겠다.
디바이스드라이버의 전제조건이 있다.
디바이스드라이버는 커널이 준비되어있어야 한다.
타겟보드에 맞는 커널이 준비되어 있어야 한다는 것이다.
우리는 직전에 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
으로 통째로 주면서 써줘야한다.
위의 명령을 모두 마쳐서 커널을 써주면 우리 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
6 Advanced Options Configure advanced settings
옵션에 들어간다.A1 Expand Filesystem Ensures that all of the SD card is available
옵션을 선택한다.재부팅 후 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
커널 소스를 업그레이드 하고 커스텀 시스템 콜을 추가했던 커널을 라즈베리파이에 올려야 한다.
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)가 올라가 있지 않다.
우리는 디바이스 드라이버를 만들기 위해 우리가 이전에 만들었던 시스템 콜 함수를 사용해야 하기 때문에, 다시 ~/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 // 부팅하면서 로드된 모듈을 확인한다.