프린트물 p17 참고
pc는 조립을 하면서 어떤 장치를 셋업할지 알 수 없다
운영체제는 드라이브가 픽스되어 커널 안에 넣으면
사용하지 않을 것인데 부팅 때 마다 적재되고
할당된 메모리, 코드 사이즈만큼 사용된다
임베디드 최적 시스템에는 디바이스 드라이버가 픽스된다
pc는 장치를 추가한다던지 등이 가능하다
주변장치가 바뀔 소지가 없기 때문
Kconfig, source, Makefile 세 파일이 있어야 커널 빌드 시스템을 이용해서 빌트인, 모듈로 컴파일 가능하다
~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
device drivers - character drivers - 하단부 help
우리는 broadcom 대신 다른 디렉토리를 만들어서 위 세 파일을 넣을 것이다
다시 아얘 빠져나간다
~/pi_bsp/kernel/linux/drivers/char$ vi Kconfig
8 source "drivers/char/kcci_ledkey/Kconfig"
Kconfig 파일을 수정해주고
~/pi_bsp/kernel/linux/drivers/char$ vi Makefile
6 obj-$(CONFIG_KCCI_LEDKEY) += kcci_ledkey/ // 폴더 내부의 Makefile을 참고하라는 뜻
y - zimage에 포함(커널빌드)
$() - m으로 바뀜(module, 가변)
Makefile 파일도 수정해주고
~/pi_bsp/kernel/linux/drivers/char$ mkdir kcci_ledkey
~/pi_bsp/kernel/linux/drivers/char$ cd kcci_ledkey
폴더를 만들어준다
~/pi_bsp/kernel/linux/drivers/char/kcci_ledkey$ cp /home/ubuntu/pi_bsp/drivers/p432_ledkey_poll/*dev.c .
dev 파일을 가져온다
이제 키면 자동으로 insmod, 끄면 자동으로 rmmod 하게 바꿔볼 것이다
시작하면 __init에 모여있는 것들을 실행하고 끄면 __exit에 모여있는 것들을 실행한다
Kconfig를 만들고
~/pi_bsp/kernel/linux/drivers/char/kcci_ledkey$ vi Kconfig
menu "kcci gpio test device driver"
depends on ARM #특정한 아키텍처에 연관되어있으면 입력
config KCCI_LEDKEY
tristate "kcci ledkey device driver" #메뉴에 세가지 옵션을 준다
help
sample driver for ledkey device
endmenu
Makefile을 만든다
~/pi_bsp/kernel/linux/drivers/char/kcci_ledkey$ vi Makefile
obj-$(CONFIG_KCCI_LEDKEY) += ledkey_dev.o
~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
다시 들어가면 보인다
tristate는 <> bool은 []가 나온다
<M> modularizes features
[*] built-in
< >
이렇게 세개이다
빌트인으로 만들어놓고 나온다
그러면 ~/pi_bsp/kernel/linux$ vi .config 여기에서 볼 수 있다
그리고 build.sh를 실행한다
~/pi_bsp/kernel/linux$ ./build.sh
~/pi_bsp/kernel/linux$ cp arch/arm/boot/zImage /srv/nfs/
빌드된 zImage를 파이로 가져간다
잘 왔다
/mnt/ubuntu_nfs $ sudo cp /boot/firmware/kernel7l.img /boot/firmware/kernel7l.img_backup
/mnt/ubuntu_nfs $ sudo cp zImage /boot/firmware/kernel7l.img
/mnt/ubuntu_nfs $ sudo cat /proc/devices
재부팅만 했는데 insmod를 안해도 정상적으로 built-in 되어서 적재했다
~/pi_bsp/drivers/p432_ledkey_poll$ make
근데 app 파일이 있어야 하기 때문에 make하고 pi에서 mknod를 했다
/mnt/ubuntu_nfs $ sudo mknod /dev/ledkey_dev c 230 0
/mnt/ubuntu_nfs $ sudo chmod 666 /dev/ledkey_dev
/mnt/ubuntu_nfs $ ./ledkey_app 0x0f
led도 잘 들어오고, 스위치도 1~8번 눌러서 led 제어, 키보드로 0~255 입력이 가능하다
대신 키보드는 decimal로 입력해야한다 strtoul(string to unsigned long)이 안되기 때문이다
헥사값에 익숙하기 때문에 app.c를 수정한다
69 buff = (char)strtoul(keyStr, 0, 16);
70 // buff = (char)atoi(keyStr);
이렇게 수정했다
다시 make하고 실행한다
이미 올라가있고, app 파일이 변경되었기 때문에 바로 실행해도 문제없다
헥사값으로 잘 입력되는 모습을 확인할 수 있다
하지만 lsmod에 안나오는데, insmod로 직접 올린 것이 아니라 그렇다
이제 모듈을 이용해서 해볼 것이다
~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
모듈로 선택을 하면
.config에 m으로 표기된다
이미 16개의 gpio가 리퀘스트에 의해 등록되어있어서, 주번호를 바꾼다고 해도 등록이 안된다
이제 모듈로 빌드를 한다
~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules
좀 오래 한다 - 의존성 때문
~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules -j4
똑같이 nfs에 복사한다
~/pi_bsp/kernel/linux$ cp drivers/char/kcci_ledkey/ledkey_dev.ko /srv/nfs/
우분투에서 설치하고 타겟보드는 파이이다
/lib/modules/6.1.0-rpi7-rpi-v7l/kernel/drivers/char$ sudo mkdir kcci_ledkey ; cd kcci_ledkey
/lib/modules/6.1.0-rpi7-rpi-v7l/kernel/drivers/char/kcci_ledkey$ sudo cp /mnt/ubuntu_nfs/ledkey_dev.ko .
근데 커널을 잘못 들어와서 다시 만들었다
/lib/modules/6.1.77-v7l+/kernel/drivers/char$ sudo cp -r /lib/modules/6.1.0-rpi7-rpi-v7l/kernel/drivers/char .
/lib/modules/6.1.77-v7l+$ sudo depmod -a
/lib/modules/6.1.77-v7l+$ cat modules.dep | grep ledkey_dev
/lib/modules/6.1.77-v7l+$ cd
~$ sudo modprobe ledkey_dev
~$ cd /mnt/ubuntu_nfs/
/mnt/ubuntu_nfs$ sudo mknod /dev/ledkey_dev c 230 0
/mnt/ubuntu_nfs$ sudo ./ledkey_app 0x0f
적재되어 사용할 수 있다
키보드 및 스위치 정상작동 확인
make clean 하면 .config가 사라지니까 백업을 받아야한다
~/pi_bsp/kernel/linux$ cp .config arch/arm/configs/bcm2711_kcci_defconfig
~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean mrproper
du -dh로 용량 확인 가능
clean만 하면 오브젝트 파일을 다 지우고
mrproper 하면 menuconfig 유틸 파일이나 .config 파일을 없앤다(반드시 백업 필수)
이렇게 실행하면 커널을 처음 배포했을 때가 된다
그리고 tags, .git도 지워야한다
~/pi_bsp/kernel$ tar cvfj linux.tar.bz2 linux
압축한다
~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_kcci_defconfig
~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4
컴파일 하는 동안
다른 우분투 창에서 복사해서 make한다
~/pi_bsp/drivers$ cp -r /mnt/lect_nfs/drivers/p527_ledkey_proc/ .
~/pi_bsp/drivers$ cd p527_ledkey_proc/
~/pi_bsp/drivers/p527_ledkey_proc$ make
pi로 들고와서
/mnt/ubuntu_nfs$ sudo insmod p527_ledkey_dev.ko
/mnt/ubuntu_nfs$ sudo mknod /dev/ledkey_proc c 230 0
/mnt/ubuntu_nfs$ sudo chmod 666 /dev/ledkey_proc
/mnt/ubuntu_nfs$ ./p527_ledkey_app
정상작동하고,
~$ sudo echo "255" > /proc/ledkey/led
데이터를 읽어서 led를 키게 함
기존의 실행을 멈추고 스위치를 누른 상태에서
~ $ cat /proc/ledkey/key
키 값을 바꿈
이렇게 표시된다
강사공유 삼바에서
Qt 설치파일을 가져온다
실행해서 바로 설치한다
테트리스 해보겠다
윈도우 qt 완료
이제 리눅스에서 해보겠다
run파일을 옮겨와서
================ 윈도우 qt 5.14.2 설치================
다운로드
https://download.qt.io/archive/qt/5.14/5.14.2/
윈도우 설치
qt-opensource-windows-x86-5.14.2.exe 실행
계정 생성 후 계정/패스워드 로그인 후 설치
컴파일 설정 : MinGW 64-bit, Sources 및 QtCharts , webengine
Developer and Designer Tools : Qt Creator , MinGW 64-bit 선택
위에 해당하는 설정으로 한다
우분투 터미네이터에서 실행할 것
~$ mkdir Qt ; cd Qt
~/Qt$ mv ../qt-opensource-linux-x64-5.14.2.run .
~/Qt$ ./qt-opensource-linux-x64-5.14.2.run
경로를 중간에 /Qt 넣어준다
체크는 안드로이드만 제외하고 다 체크한다
이제 라즈베리파이에서 해보겠다
================Raspberry Pi qt 5.15.8 설치================
$ sudo apt install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools
$ sudo apt install qtcreator //생략
$ sudo apt install clang //생략
~/Qt$ cd Qt5.14.2/Examples/Qt-5.14.2/widgets/widgets/tetrix/
우분투의 이곳에 있는 것을 arm용으로 컴파일해서 가져갈 것이다
~/Qt/Qt5.14.2/Examples/Qt-5.14.2/widgets/widgets$ cp -r tetrix /srv/nfs/
그런데 pro(project)파일이 이상하므로 다시 만들 것이다
경로 등 다시 설정해야한다
/mnt/ubuntu_nfs/tetrix $ rm tetrix.pro
/mnt/ubuntu_nfs/tetrix $ rm tetrix.pro.user
qt 크리에이터에서 쓰는 파일도 지워준다
/mnt/ubuntu_nfs/tetrix $ qmake -project
/mnt/ubuntu_nfs/tetrix $ vi *.pro
9 QT += widgets
저장하고 나간다
/mnt/ubuntu_nfs/tetrix $ qmake
한번 더 qmake하면
Makefile이 생성되고 make만 하면 된다
만약 make 오류가 나면 make clean 해본다
테트리스가 만들어진다
VNC에서 클릭은 되지만 방향 전환이나 빠르게 내리는 등이 안된다
그것들은 버튼을 추가로 만들어서 해야한다(시간이 되면)
~/Qt$ cp /mnt/lect_nfs/tetrixPi.tar .
mknod해서 만들고
insmod로 올리고
이거 풀어서 sudo로 실행하면 스위치로 조절 가능하다
new로 설정하면 heap영역에 저장된다
java에서는
멤버함수를 메서드
멤버변수를 필드
사용자 정의 시그널 발생시킬 때 emit 사용
~/Qt/tetrixPi$ qmake
~$ vi .profile
Path를 추가할 것이다
31 export PATH=/home/ubuntu/Qt/Qt5.14.2/5.14.2/gcc_64/bin:$PATH
추가해주고
실행하게 환경을 세팅한다
ubuntu@ubuntu11:~/Qt/tetrixPi$ source ~/.profile
ubuntu@ubuntu11:~/Qt/tetrixPi$ echo $PATH
ubuntu@ubuntu11:~/Qt/tetrixPi$ qmake
ubuntu@ubuntu11:~/Qt/tetrixPi$ make
debug 선택 후 진행하며 다 된다
위젯함수의 매개변수에 행, 열이 나와있다
오른쪽, 왼쪽 버튼을 만드려고 한다
이 두개를 복사한다
버튼 2개가 생겼다