이 글 마지막 부분 업그레이드 해볼게요~
윗 파일 받아서 ubuntu에 넣기 위해 samba 폴더에 넣어주고
코드 분석해보면
396 ENTRY(kcci_led_test)
397 ldr r0,=0xFE200000 /*BCM2711 GPIO BASE*/
398 ldr r1,=0x09240000 /*gpio6~9 signal output*/
399 str r1,[r0,#0x00] /*GPFSEL0*/
400 ldr r1,=0x00012249 /*gpio10~13 signal output,txd rxd,gpio16~19 inpu t*/
401 str r1,[r0,#0x04] /*GPFSEL1*/
402 @ ldr r1,=0x00000000 /*gpio20~23 signal input*/
403 @ str r1,[r0,#0x08] /*GPFSEL2*/
404
405 ldr r1,=0x00000040 /*gpio6 set led0 on*/
406 mov r5, #0 /*shift mode :0 left*/
407 mov r2, #8 /*led count*/
408 ledloop:
409 str r1, [r0,#0x1C] /*GPSET0 ledX on*/
410 ldr r3,=0x100000 /*delay count*/
411 delay:
412 ldr r4,[r0,#0x34] /*GPLEV0*/
413 ands r4,#0x00800000 /*key7 on*/
414 bne testend
415
416 subs r3,r3, #1
417 bne delay
418 str r1,[r0,#0x28] /*GPCLR0 ledX off*/
419 teq r5, #0
420 moveq r1, r1, LSL #1
421 movne r1, r1, LSR #1
422
423 subs r2, r2, #1
424 bne ledloop
425 teq r5, #0
426 moveq r5, #1 /*shift mode :1 right*/
427 movne r5, #0 /*shift mode :0 left*/
428 mov r2, #8 /*led count*/
429 b ledloop
430
431 testend:
432 mov pc, lr
433 ENDPROC(kcci_led_test)
423 r2가 0이 될 때까지 돌리는거고
425~427 r5가 0이되면 shift mode를 right->left 혹은 left->right로 바꾸는거
399 r1에 있는 GPIO 명령값(GPIO6~9까지 Output mode)을 r0 주소에 저장
401 r1에 있는 GPIO 명령값(GPIO10~13까지 Output mode,tx1,rx1, gpio16~19 input)을 r0 주소에 저장
403 r1에 있는 GPIO 명령값(GPIO20~23까지 input mode)을 r0 주소에 저장
즉, 여기까진 GPIO 핀의 모드를 설정해 주는 부분인거고
그 아래부터 led를 켜고 끄는 코드들임.
406 r6에 0,1을 줘서 0이면 left mode 1은 right mode로 동작함.
407 r2에 8 들어간건 led 8개를 번갈아가면서 켜줘야 되니까 led의 갯수 저장한거임.
410 r3에 delay할 시간 넣어주는거임.
412 r4의 level 레지스터의 값을 읽어오는 거임. 0x34는 GPIO16~23까지의 값을 표현해놓은거임.(눌리면 1 안눌리면 0) level0 1개의 비트열이 1개의 비트를 나타냄
413 ands니까 and연산 및 상태 레지스터의 반영하겠다는거고, and를 통해 8번째 버튼이 눌린지를 체크하겠다는거임. 8번 째 버튼이 눌렸다면 1이 나오니까 상태 레지스터에 반영이 되는거임.
414 b 분기를 하긴하는데 ne(not equal=1)이라면 즉, 눌렸다면 testend로 go, 아님 말고~
416 subs니까 sub를 하긴하는데 상태를 상태레지스터에 저장, r3값을 1씩 계속 빼주는거임. 0이 되는 순간 상태레지스터 set되고
417 상태레지스터 값이 0이면 delay 아니면 말고~
419 test eq r5와 0을 xor 하는거임. r5가 1이면 1이되는거임.
teq(test bitwise equality) Rn Xor Op2 즉, XOR하는 명령어 인거임. 두개의 값이 같으면 0이고 다르면 1,
만약, 입력이 3개면 1의 갯수가 홀수면 1이되는거임.
opcode | 명령 | 동 작 | 설 명 |
1010 | CMN | CPSR flags := Rn + Op2 | Compare Negative |
1011 | CMP | CPSR flags := Rn-Op2 | Compare |
1000 | TEQ | CPSR flags := Rn EOR Op2 | Test bitwise equality |
1001 | TST | CPSR flags := Rn AND Op2 | Test bits |
424 b 분기를 하긴하는데 ne(not equal=0)이라면 즉, 안눌렸다면 led를 돌려라
425
왜 그런지 모르겠다 싶으면 아래 링크의 reference를 읽어보자
cp /srv/samba/start.S_v3_key8_left_right ./start.S
ubuntu@ubuntu8:~/pi_bsp/u-boot$ make clean
ubuntu@ubuntu8:~/pi_bsp/u-boot$ ./build.sh
ubuntu@ubuntu8:~/pi_bsp/u-boot$ ls -l u-boot.bin
-rw-rw-r-- 1 ubuntu ubuntu 609748 2월 13 11:29 u-boot.bin
ubuntu@ubuntu8:~/pi_bsp/u-boot$ cp u-boot.bin /srv/nfs/
ubuntu@ubuntu8:~/pi_bsp/u-boot$ ls -l /srv/nfs/u-boot.bin
-rw-rw-r-- 1 ubuntu ubuntu 609748 2월 13 11:32 /srv/nfs/u-boot.bin
라즈베리파이로 와서 nfs 폴더 들어가서 boot 폴더로 복사해주고
pi@pi08:/mnt/ubuntu_nfs$ ls -l u-boot.bin
-rw-rw-r-- 1 pi pi 609748 Feb 13 11:32 u-boot.bin
pi@pi08:/mnt/ubuntu_nfs$ sudo cp u-boot.bin /boot/firmware/u-boot.bin
pi@pi08:/mnt/ubuntu_nfs$ ls -l /boot/firmware/u-boot.bin
-rwxr-xr-x 1 root root 609748 Feb 13 11:33 /boot/firmware/u-boot.bin
좌우로 계속 led 하나씩 shift 해가면서 켜지고 0~7번 버튼 중 7번 버튼을 눌러서 led shift 꺼주고 부팅 진행하면 됨.
'Ubuntu' 카테고리의 다른 글
ubuntu와 ubuntu간 nfs 설정 (0) | 2024.02.19 |
---|---|
[Jetson Nano] 젯슨 나노 OS 이미지 올리기 (1) | 2024.02.16 |
[ubuntu] ssd에 rufus를 활용한 Ubuntu 설치 (1) | 2024.02.12 |
[Ubuntu] TCP/IP Socket 통신 클라이언트->서버 파일 전송 C언어로 구현하기 (0) | 2024.02.03 |
[Ubuntu] TCP/IP Socket 통신 클라이언트->서버 메시지 전송 C언어로 구현하기 (0) | 2024.02.03 |