[Intel AI SW 아카데미] Disassembly 분석, 어셈블리어로 LED 제어하기

Jimeaning·2024년 2월 13일
0

Intel AIoT

목록 보기
33/38

2024.02.13 (화)

Disassembly 분석

$ arm-linux-gnueabihf-objdump -S start.o > start.txt
$ vi start.txt

32비트 ARM 명령어의 구조

0xe3a02008
11100011101000000010000000001000

001은 Data Processing만 가능하므로 Data Processing / PSR Transfer 역할임.

OpCode 부분은 1101이므로 MOV인 것을 추론할 수 있음


start.S에서 127번 째 줄 주석 처리하기

$ vi Makefile

8번 줄에서 shift + o누르고 코드 한 줄 추가하기

$ vi cmd_kcci_led.c
#include <common.h>
#include <command.h>
#include <asm/io.h>

#define BCM2711_GPIO_GPFSEL0 0xFE200000
#define BCM2711_GPIO_GPFSEL1 0xFE200004
#define BCM2711_GPIO_GPFSEL2 0xFE200008
#define BCM2711_GPIO_GPSET0 0xFE20001C
#define BCM2711_GPIO_GPCLR0 0xFE200028
#define BCM2711_GPIO_GPLEV0 0xFE200034

#define GPIO6_9_SIG_OUTPUT 0x09240000
#define GPIO10_13_SIG_OUTPUT 0x00012249

void led_init(void)
{
    writel(GPIO6_9_SIG_OUTPUT, BCM2711_GPIO_GPFSEL0);
    writel(GPIO10_13_SIG_OUTPUT, BCM2711_GPIO_GPFSEL1);
}
void led_write(unsigned long led_data)
{
	writel(0x3fc0, BCM2711_GPIO_GPCLR0);
    led_data = led_data << 6;
    writel(led_data, BCM2711_GPIO_GPSET0);
}
static int do_KCCI_LED(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[])
{
	unsigned long led_data;
    if(argc != 2)
    {
    	cmd_usage(cmdtp);
        return 1;
    }
    printf("*LED TEST START\n");
    led_init();
    led_data = simple_strtoul(argv[1], NULL, 16);
    led_write(led_data);
    printf("*LED TEST END(%s : %#04x)\n\n", argv[0], (unsigned int)led_data);
    
    return 0;
}
U_BOOT_CMD(
	led, 2, 0, do_KCCI_LED,
    "led - kcci LED Test.",
    "number - Input argument is only one. (led [0x00~0xff])\n");

빌드하기

$ ./build.sh

$ cp u-boot.bin /srv/nfs/

라즈베리파이에서 진행하기

$ cp /mnt/ubuntu_nfs/u-boot.bin /boot/firmware/.
$ sync

라즈베리 파이 껐다가 킬 때 U-Boot로 접속한다

U-Boot
help를 치면 추가한 led 명령어가 있는 걸 확인할 수 있다

U-Boot> led 0x55


LED가 핑퐁핑퐁으로 켜진 것을 볼 수 있다
(0xff : 다 켜짐, 0x00 : 다 꺼짐)

profile
I mean

0개의 댓글