1. 다운
$wget http://forum.falinux.com/_zdownload/data/ezboot.x5.v18.tar.gz
2. 압축 해제
tar -xvf ezboot.x5.v18.tar.gz
3. 내용물 확인
jisu@ubuntu:~$ cd v18.org
jisu@ubuntu:~/v18.org$ ls
eztiny image include main Makefile start
image - 이지부트의 최종 이미지 파일이 들어감.
include - 이지부트 소스가 사용하는 헤더 파일이 있음.
main - C언어로 작성된 코드가 있음.
start - 어셈블리어로 작성된 보드 초기화 관련 코드들이 있음.
이지부트는 어셈블리 코드들이 컴파일 되어 한부분, main 이렉터리에 있는 C코드들이 컴파일되어 한부분을 이룹니다.
프로그램이 시작되면 맨처음 0번지에는 start에 있는 코드들이 실행(초기화라고 생각해라)된다. 그리고 실행이 끝나면 PC(Program Counter)에 main() 함수주소가 들어갑니다.(PC <- main() 주소)
4. 홈 디렉토리에 작업폴더 만들기!
jisu@ubuntu:~/v18.org/main$ cd ..
jisu@ubuntu:~/v18.org$ mkdir ~/navilnux
jisu@ubuntu:~/v18.org$ cp main ~/navilnux/chap2 -r
jisu@ubuntu:~/v18.org$ cp include ~/navilnux/chap2 -r
5. chap2폴더로 들어와 작업해봅시다
jisu@ubuntu:~/v18.org$ cd ~/navilnux
jisu@ubuntu:~/navilnux$ ls
chap2
jisu@ubuntu:~/navilnux$ cd chap2
jisu@ubuntu:~/navilnux/chap2$ ls
arp_cmd.c flash_cmd.c lib1funcs.S net.o time.c
arp_cmd.o flash_cmd.o main.c printf.c time.o
config.c go_cmd.c main-elf32 printf.o vscanf.c
config.o go_cmd.o main-ld-script ram_cmd.c vscanf.o
cs8900.c gpio.c main.o ram_cmd.o vsprintf.c
cs8900.o gpio.o main_org serial.c vsprintf.o
defaultlibs help.c Makefile serial.o zmodem.c
entry.o help.o Makefile.bak string.c zmodem_cmd.c
entry.S include nand.c string.o zmodem_cmd.o
flash_29lvx.c info_cmd.c nand.o tftp_cmd.c zmodem.o
flash_29lvx.o lib1funcs.o net.c tftp_cmd.o
6. serial.c 파일을 수정합니다
- 헤더 파일에 있는 #include <config.h> 지움
-> 이지부트 설정을 담고 있는 파일 - extern TConfig Cfg;를 지움
-> 이지부트 설정 담음 - void SerialInit( eBauds baudrate ) 함수를 다 지움
-> 이지부트 설정 담음 - static volatitle Word *UART = (volatile Word *) STUART;
=>>>#ifdef IN_GUMSTIX static volatitle Word *UART = (volatile Word *) FFUART;
#else static volatitl
#endif
-> UART : 컴퓨터 간에 통신 기능을 제공하는 기법
-> 나빌눅스에서는 FULL FUNCTION UART를 사용
==> UART를 버퍼 주소로 변경해 준다
-> volatile 는 컴파일러로부터 최적화를 막아주는 키워드
6. main.c를 그냥 다 지우고
navilux.c를 만들어서 하자
$rm main.c
$gedit navilnux.c
#include <pxa255.h>
#include <time.h>
#include <gpio.h>
#include <stido.h>
#include <string.h>
int main(void){
while(1){
printf("hello world\n");
msleep(1000);
}
}
//나빌눅스 c코드 / 1초마다 hello world를 출력
7.권한 주기
$chmod +x navilnux.c
8. 지워야할 항목 temp 폴더 만들어서 옮기기
jisu@ubuntu:~/navilnux/chap2$ chmod +x navilnux.c
jisu@ubuntu:~/navilnux/chap2$ mkdir temp
jisu@ubuntu:~/navilnux/chap2$ mv entry.S temp
jisu@ubuntu:~/navilnux/chap2$ mv gpio.c temp
jisu@ubuntu:~/navilnux/chap2$ mv lib1funcs.S temp
jisu@ubuntu:~/navilnux/chap2$ mv main-ld-script temp
jisu@ubuntu:~/navilnux/chap2$ mv navilnux.c temp
jisu@ubuntu:~/navilnux/chap2$ mv printf.c temp
jisu@ubuntu:~/navilnux/chap2$ mv serial.c temp
jisu@ubuntu:~/navilnux/chap2$ mv string.c temp
jisu@ubuntu:~/navilnux/chap2$ mv time.c temp
jisu@ubuntu:~/navilnux/chap2$ mv vsprintf.c temp
9. c 파일을 지움 삭제후 폴더에 보관했던 파일들을 꺼내오고 폴더를 삭제
$rm *.c
$cp temp/* .
$rm -r temp
10.헤더파일 정리
$cd include
$mkdir temp
$mv gpio.h temp
$mv pxa255.h temp
$mv serial.h temp
$mv stdarg.h temp
$mv stdio.h temp
$mv string.h temp
$mv time.h temp
$rm *.h
$rm 1
$cp temp/* .
$rm -r temp
11. Makefile 지웠다가 다시 만듬
CC = arm-linux-gcc
LD = arm-linux-ld
OC = arm-linux-objcopy
CFLAGS = -nostdinc -I. -I./include
CFLAGS += -Wall -Wstrict-prototypes -Wno-trigraphs -O2
CFLAGS += -fno-strict-aliasing -fno-common -pipe -mapcs-32
CFLAGS += -mcpu=xscale -mshort-load-bytes -msoft-float -fno-builtin
LDFLAGS = -static -nostdlib -nostartfiles -nodefaultlibs -p -X -T ./main-ld-script
OCFLAGS = -O binary -R .note -R .comment -S
all: navilnux.c
$(CC) -c $(CFLAGS) -o entry.o entry.S
$(CC) -c $(CFLAGS) -o gpio.o gpio.c
$(CC) -c $(CFLAGS) -o time.o time.c
$(CC) -c $(CFLAGS) -o vsprintf.o vsprintf.c
$(CC) -c $(CFLAGS) -o printf.o printf.c
$(CC) -c $(CFLAGS) -o string.o string.c
$(CC) -c $(CFLAGS) -o serial.o serial.c
$(CC) -c $(CFLAGS) -o lib1funcs.o lib1funcs.S
$(CC) -c $(CFLAGS) -o navilnux.o navilnux.c
$(LD) $(LDFLAGS) -o navilnux_elf entry.o gpio.o time.o vsprintf.o printf.o string.o serial.o lib1funcs.o navilnux.o
$(OC) $(OCFLAGS) navilnux_elf navilnux_img
$(CC) -c $(CFLAGS) -o serial.o serial.c -D IN_GUMSTIX
$(LD) $(LDFLAGS) -o navilnux_gum_elf entry.o gpio.o time.o vsprintf.o printf.o string.o serial.o lib1funcs.o navilnux.o
$(OC) $(OCFLAGS) navilnux_gum_elf navilnux_gum_img
clean:
rm *.o
rm navilnux_elf
rm navilnux_img
rm navilnux_gum_elf
rm navilnux_gum_img
12.
v18.org/ main / main.c 의 gokernel 확인
if ( getc_timed( Cfg.BootMenuKey, Cfg.AutoBootWaitTime*1000 ) )
{
//printf( "\r \n");
printf( "\n");
CopyImage();
GoKernel( 1, NULL );
// ¿©±â·Î ¿òÁ÷ÀÌÁö ŸÊŽÂŽÙ.
// ---
}
break;
13.v18.org/main/go_cmd.c 안의 함수 주소 확인
int GoKernelSingle( void )
{
char buff[] = { 0,0,0,0,0 }; // ží·É Ä¿žÇµå œÃÇè¿ëÀÓ
void (*theKernel)(int zero, int arch);
char kcmd[2048];
int len;
// Ä¿³Î Ä¿žÇµå ¹®ÀÚ¿À» ŸòŸî¿ÂŽÙ.
memset( kcmd, 0, 2048 );
len = GetKCmdStr( kcmd );
printf( "Starting kernel [MARCH %d]...\n", Cfg.Kernel_ArchNumber );
memcpy( (char *) DEFAULT_RAM_KERNEL_ZERO_PAGE, kcmd, 2048 );
theKernel = (void (*)(int, int))DEFAULT_RAM_KERNEL_START;
theKernel( ( long ) 0 , (long) Cfg.Kernel_ArchNumber );
return 0;
}
14.v18.org/include/mem_map.h 확인
#define DEFAULT_RAM_KERNEL_START 0xA0008000 // ·¥¿¡Œ Ä¿³Î œÃÀÛ Ÿîµå·¹œº
#define DEFAULT_RAM_RAMDISK_START 0xA0800000 // ·¥¿¡Œ ·¥µðœºÅ© œÃÀÛ Ÿîµå·¹œº
#define DEFAULT_RAM_WORK_START 0xA1000000 // ÀϹÝÀûÀÎ ºÎÆ® ·ÎŽõ ÀÛŸ÷ ¿µ¿ª
#define DEFAULT_RAM_KERNEL_ZERO_PAGE 0xA0000000 // ºÎÆ®·ÎŽõ¿¡Œ Ä¿³Î·Î ÀüŽÞÇÏŽÂ ¿µ¿ª œÃÀÛ Ÿîµå·¹œº
#define DEFAULT_RAM_KERNEL_START 0xA0008000
이라고 되어있습니다.
메모리 주소가 하나의 헤더파일에 정의되어 있는 것입니다.
이지부트가 실행이 끝나면, 즉. 커널이 실행되어야 할 주소입니다.
15.v18.org/main/main-ld-script 수정
change 0xA0F00800 to 0xA0008000.
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_ram_entry)
SECTIONS
{
. = 0xA0008000;
. = ALIGN(4);
.text : { *(.text) }
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = ALIGN(4);
.bss : { *(.bss) }
}
make해서 이지부트 이미지 만들려고하는데 에러 나옴ㅎㅎ 울고싶다
include/pxa255.h:46:1: warning: this is the location of the previous definition
serial.c:41: error: syntax error before "Word"
serial.c:41: warning: initialization discards qualifiers from pointer target type
make: *** [all] Error 1
'Web > web dev' 카테고리의 다른 글
LDAP , AD (0) | 2021.05.31 |
---|---|
TCP / IP (2) | 2020.12.15 |
임베디드 OS 만들기 환경설정 - (4)U-BOOT 설치 (0) | 2019.09.14 |
임베디드 OS 만들기 환경설정 - (3)qemu 설치 (0) | 2019.09.13 |
임베디드 OS 만들기 환경설정 - (2)ARM 크로스 컴파일 구축 (0) | 2019.09.13 |