2024.02.13 (화)
$ arm-linux-gnueabihf-objdump -S start.o > start.txt
$ vi start.txt
0x | e | 3 | a | 0 | 2 | 0 | 0 | 8 |
---|---|---|---|---|---|---|---|---|
1110 | 0011 | 1010 | 0000 | 0010 | 0000 | 0000 | 1000 |
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 : 다 꺼짐)