본문 바로가기
Ubuntu

[Linux BSP] Ubuntu에서 RaspberryPi U-Boot 어셈블리 코드 추가

by TYB 2024. 2. 13.
반응형
 

[Linux BSP] Ubuntu에서 RaspberryPi U-Boot 코드 환경 분석

3dw 3칸 삭제하겠다 . 아까전에 했던 명령어 다시 실행하겠다. ubuntu@ubuntu8:~/pi_bsp/u-boot$ vi build.sh make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all ubuntu@ubuntu8:~/pi_bsp/u-boot$ chmod u+x build.sh ubuntu@ubuntu8:~/pi_bsp/u-b

program-developers-story.tistory.com

이 글 마지막 부분 업그레이드 해볼게요~

 

 

 


start.S_v3_key8_left_right
0.01MB

 

 

 

 

 

윗 파일 받아서 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를 읽어보자

 

[Linux BSP] U-Boot 메모리 read/write로 led on/off 하기

data sheet를 보면 gpio의 주소 및 입출력 주소가 모두 나옴. 아래 주소에서 라즈베리파이4를 찾아서 data sheet를 받으면 됨. https://datasheets.raspberrypi.com/ Raspberry Pi Datasheets datasheets.raspberrypi.com 매뉴얼 65

program-developers-story.tistory.com

 

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 꺼주고 부팅 진행하면 됨.

 

 

반응형