반응형

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

 

반응형

+ Recent posts