denx.de에 나온 메시지는 아래와는 좀 다른데,

GUNZIP ERROR - must RESET board to recover
에러가 발생할경우, 메모리가 부족해서 겹쳐서 제대로 압축을 해제하지 못했을 가능성이 있다고 한다.
그것도 아니라면.. 도대체 머가 문제일까?

   Verifying Checksum ... OK
   Uncompressing Kernel Image ... Error: Bad gzipped data
GUNZIP ERROR - must RESET board to recover

[링크 : http://www.denx.de/wiki/view/DULG/Manual]
    [링크 : http://www.denx.de/wiki/view/DULG/HowCanILoadAndUncompressACompressedImage]
    [링크 : http://www.denx.de/wiki/view/DULG/LinuxHangsAfterUncompressingKernel]
    [링크 : http://www.denx.de/wiki/view/DULG/LinuxUncompressingError]
신고
Posted by 구차니

댓글을 달아 주세요

당연한것 일수도 있지만, u-boot에서 kernel로 argument를 날려주고
그 인자들 중, NIC 관련 변수들을 파싱하여 자동으로 네트워크를 설정하게 되는데
인자를 ' '(홀따옴표)로 감싸주어 커널에서 파싱하도록 할 수 있다.

물론, bootargs에 한번에 넣어서는 불가능하며,
run 명령어를 통해서 인자를 생성후 넘겨주는 방식을 취한다.

We can use U-Boot environment variables to store all necessary configuration parameters:

=> setenv ipaddr 192.168.100.6
=> setenv serverip 192.168.1.1
=> setenv netmask 255.255.0.0
=> setenv hostname canyonlands
=> setenv rootpath /opt/eldk-4.2/ppc_4xx
=> saveenv

Then you can use these variables to build the boot arguments to be passed to the Linux kernel:

=> setenv nfsargs 'root=/dev/nfs rw nfsroot=${serverip}:${rootpath}'


Note: You cannot use this method directly to define for example the "bootargs" environment variable, as the implicit usage of this variable by the "bootm" command will not trigger variable expansion - this happens only when using the "setenv" command.

[링크 : http://www.denx.de/wiki/DULG/LinuxBootArgs]


사용예
setenv nfsargs 'setenv bootargs console=ttyAS0,115200 root=/dev/mtdblock2 rootfstype=cramfs'
setenv addip 'setenv bootargs ${bootargs} nwhwconf=device:eth0,hwaddr:${ethaddr}
                    ip=${ipaddr}::${gateway}:${netmask}:${histname}::off'
setenv bootcmd 'run nfsargs addip\; tftp 0x84400000 uImage\; bootm'

아무튼, bootcmd 에 'run' 을 통해서 bootargs를 생성후 임시 변수를 커널로 넘겨주는 방식이다.
(실제로 bootargs 변수는 uboot에 존재하지 않는다.)
신고
Posted by 구차니

댓글을 달아 주세요

이번에 닥친일은 ethaddr 중 특정 부분을 추출하는 일인데
sed를 써야 하나? shell에서 해야 하나? 이래저래 테스트 하는데..

sh 에서는.. busybox의 ash 라서 그런지 $(string:n:m) 방식의 추출이 되지 않았고
유일하게 되는게 $(string#substr) 로 일치하는 스트링을 삭제하는 것 뿐이었다.
그리고 sed는 .. 라인단위로 하다 보니. 일치하는 문자만을 삭제하려니.. OTL

그런 이유로 tr이라는 녀석이 걸려 나오게 되었다.
tr은 translate or delete characters 라는데.. 도대체 r은 어디서 튀어 나온 녀석일까 ㄱ-




아무튼, uboot 에서 사용하는 예약어인 ethaddr 에서 MAC 부분을 추출하려고 하면
fw_printenv 와 쉘 그리고 tr을 조합하면 된다.

일단 fw_printenv의 값은
 ethaddr=00:00:00:00:00:00
으로 출력되고 이 값을 변수에 넣어준다.

ETH_TEMP=`fw_printenv ethaddr`
ETH_ADDR=echo ${ETH_TEMP#ethaddr=} | tr -d :

그러면 간단하게 ethaddr= 뒤의 MAC 어드레스가 : 없이 나오게 된다.


[링크 : http://k.daum.net/qna/view.html?qid=2f8nN&l_cid=Q&l_st=1] tr
[링크 : http://linux.die.net/man/1/tr] tr man page
[링크 : http://www.faqs.org/docs/abs/HTML/string-manipulation.html]  sh 에서 스트링
[링크 : http://www.ibm.com/developerworks/kr/library/l-sed1.html]      sed 사용법
신고
Posted by 구차니

댓글을 달아 주세요

fw_printenv는 uboot에 포함된 tool이다
uboot/tool/env 에 존재하는 녀석인데
ethaddr을 값을 변경하려고 하니 에러가 발생하였다.

fw_setenv()의 리턴값은 30인데 아마도 EROFS가 30인듯 하다(errno.h에서는 발견하지 못한 변수이다.)
눈에 들어온 부분은 아래의 strcmp() 이다.
	/*
	 * Delete any existing definition
	 */
	if (oldval) {
		/*
		 * Ethernet Address and serial# can be set only once
		 */
		if ((strcmp (name, "ethaddr") == 0) ||
			(strcmp (name, "serial#") == 0)) {
			fprintf (stderr, "Can't overwrite \"%s\"\n", name);
			return (EROFS);
		}

		if (*++nxt == '\0') {
			*env = '\0';
		} else {
			for (;;) {
				*env = *nxt++;
				if ((*env == '\0') && (*nxt == '\0'))
					break;
				++env;
			}
		}
		*++env = '\0';
	}

아무튼, uboot에서 기본적으로 ethaddr과 serial#을 지원하고
이값들은, 한번만 write되고 수정되서는 안되기 때문에 제약사항으로 묶어놓은 듯 하다.
신고
Posted by 구차니

댓글을 달아 주세요

  1. Hmm. Syntax Highligher was upgraded to 2.0.320.
    http://alexgorbatchev.com/wiki/SyntaxHighlighter

    In Germany, I cannot type Korean!!!

    2009.08.19 23:36 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 영어로 된 글을 스팸으로 처리 고고싱! ㅋㅋ
      독일에서 수고가 많으세요 ㅠ.ㅠ

      2009.08.20 09:21 신고 [ ADDR : EDIT/ DEL ]
  2. 안녕하세요~ 구차니님~~~~^^
    임베리눅스 하면서 구차니님 참 많이 찾아 오고 있습니다..ㅠ ㅠ
    여기 저기 막 알아 보다가 질문이 하나 있어서..ㅠ ㅠ
    tftp 를 위하여 mac 을 그떄 그때 생성하려고 하는데...
    srand rand 이 녀석들은 쓸 수 없는 건가요..ㅠ ㅠ
    ㅎㅎㅎ 막연히 구글 세상 돌아다니다가...
    오늘은 여쭈어 보려고 왔습니다 ^^

    2011.09.22 12:45 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • MAC은 48비트로 이루어져서 6번만 256 으로 % 연산해서 값을 만들면 충분히 가능은 하지만 음.. 매번 맥을 생성하시려는 의도를 모르니 적용을 해도 될지는 잘 모르겠네요 ^^;

      2011.09.22 12:52 신고 [ ADDR : EDIT/ DEL ]
  3. 아.. 여기로 계속 여쭈어도 될런지요 ^^;;;
    기본 xx:xx:xx:00:00:01 로 ethaddr 은 code 로 설정을 하였습니다...
    kernel 부팅 후 어플에서는 MAC 을 eeprom 에 저장을 하고 쓰고 있죠...
    단지 복구용으로 tftp 를 사용하여고 하는데..
    eeprom 접근은 일이 커질 것 같고...
    하여 간단하게 mac 뒷자리 00:00:00 부분에 필요 할떄 생성을 하려고 합니다..
    그런데 mac 과 ip 가 같으면 tftp 접근이 안되어서...
    ip gate 등은 고정을 하고 mac 만 고때고때 접속을 시키려고 합니다..
    2대 이상의 board 가 tftp 접속을 위해서요..ㅠ ㅠ
    하여 난수를 발생 시키려고 하는데...
    srand rand 등 표준 함수?? 는 사용이 안되는 것 같아서 ㅎㅎㅎ
    tools/gen_eth_addr.c 이녀석을 찾아서 사용해 보려고 하였으나...
    이녀석은 단지 pc 용 프로그램인가요? ㅠ ㅠ
    uboot 소스 main.c 에서 srand 는 쓸수가 없기에..ㅠ ㅠ
    구글 찾아보니 표준 라이브러리 사용을 안한다고 ㅠ ㅠ
    잘 몰라서 막 돌아 다니다 결국은 구차니님 구찮게 해드리네요 ^^;;;

    그런데 댓글이 이렇게 길어도 되나요.. 죄송합니다..ㅠ ㅠ

    2011.09.22 13:12 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 일반적으로 rand()나 srand()는 표준라이브러리(stdlib) 사용하는데 u-boot나 busybox의 경우 용량을 줄이는게 목적이다 보니 표준라이브러리를 사용하지 않고 이런 이유로 인해 발생하는 것으로 알고 있습니다. 실제로 MAC이 부여된 녀석이라면 정식으로 EEPROM을 읽어 오는게 정석이죠 ^^:

      tools 의 녀석들은 말그대로 유틸리티이기 때문에
      부팅이 된후 u-boot의 저장역영을 함께 건드리는 프로그램들입니다.

      2011.09.22 13:48 신고 [ ADDR : EDIT/ DEL ]
  4. 아.. 두서가 없었는데요...ㅠㅠ
    결론적 요지는 ㅎㅎㅎ
    srand 와 rand 를 uboot source 의 어딘가에서 쓸수가 있을까...
    아니면 다른 난수를 만들 수 있는 방법이 있는가... 해서 여쭈어 봅니다 ^^*

    2011.09.22 13:20 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 일반적인 알고리즘이 시간정보를 받아와서 그걸 기준으로 랜덤값을 생성하는데 이러한 경우 대부분 동일한 값을 만들어 내는 문제가 있습니다. 그래서 입력전압을 시드값을 준다거나 하지만 만약 유일하게 들어가는 값이 uboot 상에 있다면(시리얼) 그 값을 사용하여 랜덤생성 알고리즘을 구해서 u-boot에 같이 넣고 컴파일 후 사용하시면 될것으로 생각됩니다.

      2011.09.22 13:50 신고 [ ADDR : EDIT/ DEL ]
    • http://www.daniweb.com/software-development/c/code/216329 이런 c code가 보이는데 도움이 되실진 잘 모르겠네요 ^^;

      2011.09.22 13:52 신고 [ ADDR : EDIT/ DEL ]
  5. 아...
    두서 없는 질문에 답해 주셔서 감사 합니다 ^^
    역시 삽질과 구글링은 진리 군요 ~
    앞으로도 열심히 찾아보고 질문도 드릴께요~*

    2011.09.22 13:53 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 저의 경우에는 USB 바코드 리더로 u-boot에 박아버렸기 때문에 ^^;
      이런 고생을 하진 않아서 잘 모르겠습니다 ㅠ.ㅠ

      2011.09.22 13:54 신고 [ ADDR : EDIT/ DEL ]
  6. 오홋...
    uboot 에서 USB 바코드를 이용하여서 환경변수 설정 하신건가요? ^^
    아.. 제가 진행하고 있는 플젝은 그게 안되네요 어흑...
    위에 링크 완젼 감사 합니다~
    매번 표준 함수를 편하게 가져다 쓰다보니...
    직접 구현하려니 머리가 둥~ 하네요 ^^;;

    2011.09.22 14:00 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • u-boot에서 바로 한건 아니고 PC 에서 시리얼 번호에 맞추어서
      MAC을 생성하고 그걸 부팅이 완료된 셋트로 전송하여
      fw_setenv 를 통해 macaddr을 넣어 준거랍니다.
      물론 uboot에서 macaddr은 변수를 수정할수 없게 되어 있어서 그걸 풀어주어야 했구요 ^^

      2011.09.22 14:08 신고 [ ADDR : EDIT/ DEL ]
  7. 헛...
    fw_setenv...
    이녀석 make 하고 어디에 생성되는 녀석인가요? ^^
    제가 생각하는 것에서 가장 이상적으로 해결되는 것인것 같내요...

    너무 많은걸 여쭈어서 죄송합니다.
    그런데 진작 여쭈어 볼껄 그럴껄 하는 생각도 마구 듭니다..ㅠ ㅠ

    2011.09.22 16:59 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • uboot/tool/env 에 있었는데 uboot 한게 작년이니.. 어디에 짱박혔을수도 있고...

      아무튼 예전에는 make가 잘안되서 억지로 gcc로 링크걸고 해서 컴파일을 했던 기억이 나는군요 ^^;

      2011.09.22 17:06 신고 [ ADDR : EDIT/ DEL ]
  8. ㅎㅎㅎ 감사합니다^^
    어플에서 mac 넣을때...
    uboot 환경 변수 flash 에서 읽어다가 때려 박아야 겠네요 ㅋㅋ
    진즉 이런 아이디어가 왜 안떠올랐을까요 ㅎㅎ

    2011.09.22 17:16 신고 [ ADDR : EDIT/ DEL : REPLY ]