공대생의 일기/2010年2010. 12. 22. 16:54
2010년 6월 7일

실습 제목

6. 부트로더 기능 수정 및 명령어 추가

실습 자

 

실습 목적

- 부트로더 구성 및 동작의 이해
- 프로그램 수정 및 추가 방법 숙지

기초지식 및 자료

- 부트로더의 소스 파일의 이미지 생성
- 각 파일의 기능 이해

설비 및 준비물

-호스트 컴퓨터 : 실습용 노트북 (리눅스 시스템)
- 타깃 컴퓨터 : EMPOS Ⅱ 실습 장비
- RS-232C 케이블, UTP 케이블, Jtag dongle 및 케이블

주의 사항

작업 디렉터리 설정 확인

 

실습 절차 기술

 

led와 segment를 설정하는 방법을 익히고

main.c 와 command.c 를 수정하여, 원하는 결과를 얻는다.

 

실습 결과

 

main.c

  command.c

 

 

unsigned int Getsegcode(int x) {

unsigned int code;

 

switch(x) {

case 0x0: code = 0x3f; break;
case 0x1: code = 0x06; break;
case 0x2: code = 0x5b; break;
case 0x3: code = 0x4f; break;
case 0x4: code = 0x66; break;
case 0x5: code = 0x6d; break;
case 0x6: code = 0x7d; break; 
case 0x7: code = 0x07; break;
case 0x8: code = 0x7f; break;
case 0x9: code = 0x6f; break;
case 0xA: code = 0x77; break;
case 0xB: code = 0x7c; break; 
case 0xC: code = 0x39; break;
case 0xD: code = 0x5e; break;
case 0xE: code = 0x79; break;
case 0xF: code = 0x71; break;

default : code = 0; break;

}

return code;

}

 

bool DoBtn(int argc, char **argv)
{

volatile unsigned char * addr_button = 0x10500000;
volatile u16 *addr_led = 0x10600000;

 

unsigned char go;

bool count = 0;

 

*addr_led = 0x00;

while(1) {

if((go = ~(*addr_button))==0x1){

//__REG8(0x10600000) = 0xff;

 

if(count == 1)count = 0;

elsecount = 1;

 

//delay(10000);

}

 

if(count == 1)

*addr_led = 0xff;

else

*addr_led = 0x00;

 

}

}

 

bool DoMinjung(int argc, char **argv)

{

volatile u16 * addr16_low = 0x10300000;
volatile u16 * addr16_high = 0x10400000;

 

unsigned int v0, v1, v2, v3;

u16 val;

 

if (!HexToInt(argv[1], &val, 16)){

return false;

}

 

v0 = Getsegcode(val &0xF); 
v1 = Getsegcode((val>>4) &0xF);
v2 = Getsegcode((val>>8) &0xF);
v3 = Getsegcode((val>>12) &0xF);

 

*addr16_low = (v1 <<8)|v0;

*addr16_high = (v3 <<8)|v2;

__REG8(0x10600000) = val;

return true;

}

 

bool DoTest(int argc, char **argv)
{

bool count=0;

int i=0, j=0;

 

if(StrCmp(argv[1], "led") ==0){

volatile u16 * addr16_low = 0x10300000;
volatile u16 * addr16_high = 0x10400000;
volatile u16 * addr16_led = 0x10600000;

 

unsigned int v0, v1, v2, v3;

u16 val;

 

if (!HexToInt(argv[2], &val, 16)){

return false;

}

 

v0 = Getsegcode(val &0xF);
v1 = Getsegcode((val>>4) &0xF);
v2 = Getsegcode((val>>8) &0xF);
v3 = Getsegcode((val>>12) &0xF);

 

*addr16_low = (v1 <<8)|v0;
*addr16_high = (v3 <<8)|v2;

 

while(1) {

 

__REG8(0x10600000) = val;

user_wait(10000000);

__REG8(0x10600000) = 0x00; 

user_wait(10000000); 

}

else if (StrCmp(argv[1], "text") ==0){

printLCD(1, "Kim");

}

return true;

}

 

검토 및 고찰

 

※ 소스 수정시 make를 꼭 해주어야 한다.

 

Posted by 검지발가락♡