240229

Yonggeun Park·2024년 2월 29일
0

프린트물 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 설치파일을 가져온다
실행해서 바로 설치한다




테트리스 해보겠다

윈도우 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개가 생겼다

profile
Dragon_muscle

0개의 댓글

관련 채용 정보