[Armadillo:04669] [a500][hermit][patch] setenv できない文字列がある問題について

URATAN Shigenobu email@hidden
2009年 10月 15日 (木) 15:42:46 JST


うらたんと申すものです。

以下の環境で、Armadillo-500 のあたりをとっております。

  ・Armadillo-500 + 開発ボード
  ・atmark-dist-20090318.tar.gz
  ・linux-2.6.26-at6.tar.gz
  ・atde2-20090403.zip


さて、hermit bootloader の setenv コマンドにて、設定できない
文字列があることを以下の例で発見してしまいまして、
  +----------------------------------
  |Hermit-At v1.1.21 (Armadillo-500) compiled at 18:40:00, Mar 25 2009
  |hermit> setenv video=mxcfb:CRT-VGA,16bpp
  |hermit> setenv
  |1:                              <--- NG
  |hermit> setenv
  |hermit> setenv video=mxcfb:CRT-VGA,8bpp
  |hermit> setenv
  |1: video=mxcfb:CRT-VGA,8bpp     <--- OK
  |hermit>
  +----------------------------------

詳細を追いかけたところ以下のような挙動でありました。

  ・書き込むべきデータがなにやら FLASH に対するコマンドとして
    効いてしまっている感じ。
        (文字列末の "p\0" が 16bit boundary で 0x0070 になる場合が問題)
  ・書き間違いではなくて 読み間違いのようだ。

確認したところ、予想通り以下の症状となりました。

  修正前の操作ログ
  +----------------------------------
  |Hermit-At v1.1.21 (Armadillo-500) compiled at 18:40:00, Mar 25 2009
  |hermit> clearenv
  |hermit> setenv
  |hermit> setenv p            ... 0x0070: Read Status Register
  |hermit> setenv
  |1:                          <--- NG
  |hermit> setenv
  |hermit> setenv
  |hermit> setenv P            ... 0x0050: Clear Status Register
  |hermit> setenv
  |1: P                        <--- OK
  |hermit> setenv @            ... 0x0040: Word Program
  |hermit> setenv
  |1:                          <--- NG
  |hermit> setenv
  |hermit> setenv
  |hermit> setenv `            ... 0x0060: Lock/Unlock/...
  |hermit> setenv
  |1:                          <--- NG
  |hermit> setenv
  |error status: 000000b0
  |hermit> setenv
  |hermit> setenv pp
  |hermit> setenv
  |1: pp                       <--- OK
  |hermit> setenv ppp
  |hermit> setenv
  |1:                          <--- NG
  |hermit> setenv
  |hermit> setenv
  |hermit>
  +----------------------------------

ソースを見まして、明らかにクサイ、ところを修正した結果、
直ったように思います。

  修正後の操作ログ
  +----------------------------------
  |Hermit-At v1.1.21u (Armadillo-500) compiled at 15:59:06, Oct 14 2009
  |hermit> clearenv
  |hermit> setenv
  |hermit> setenv p
  |hermit> setenv
  |1: p                        <--- OK
  |hermit> setenv P
  |hermit> setenv P
  |1: P                        <--- OK
  |hermit> setenv @
  |hermit> setenv              <--- OK (@で始まるものは隠しパラメータらしい)
  |hermit> setenv
  |hermit> setenv `
  |hermit> setenv
  |1: `                        <--- OK
  |hermit> setenv pp
  |hermit> setenv
  |1: pp                       <--- OK
  |hermit> setenv ppp
  |hermit> setenv
  |1: ppp                      <--- OK
  |hermit>
  +----------------------------------

末尾にパッチを添付します。(command.c のパッチはおまけです)
# この param.c は たいへんいい教材ですね。

以上ですが、よろしくお願いいたします。
-- 
  email@hidden


------------ 8< ------- patch ここから ------- >8 ------------
diff -c -r hermit-at-1.1.21/src/target/common/command.c hermit-at-1.1.21u/src/target/common/command.c
*** hermit-at-1.1.21/src/target/common/command.c	Wed Mar 25 18:31:52 2009
--- hermit-at-1.1.21u/src/target/common/command.c	Wed Oct 14 15:54:08 2009
***************
*** 47,58 ****
  			char c = hgetchar();
  			if (c == BS || c == DEL) {
  				/* backspace and rubout */
! 				if (interactive) {
! 					hputchar(BS);
! 					hputchar(' ');
! 					hputchar(BS);
  				}
- 				if (n > 0) --n;
  			} else if (c == CR || c == LF) {
  				/* end of command line */
  				break;
--- 47,60 ----
  			char c = hgetchar();
  			if (c == BS || c == DEL) {
  				/* backspace and rubout */
! 				if (n > 0) {
! 					--n;
! 					if (interactive) {
! 						hputchar(BS);
! 						hputchar(' ');
! 						hputchar(BS);
! 					}
  				}
  			} else if (c == CR || c == LF) {
  				/* end of command line */
  				break;
diff -c -r hermit-at-1.1.21/src/target/flash/param.c hermit-at-1.1.21u/src/target/flash/param.c
*** hermit-at-1.1.21/src/target/flash/param.c	Wed Mar 25 18:31:52 2009
--- hermit-at-1.1.21u/src/target/flash/param.c	Wed Oct 14 15:42:44 2009
***************
*** 76,82 ****
  	for (i=0; i<count; i++) {
  		param[i] = ptr;
  		ptr += strlen(ptr);
! 		*(ptr++) = 0x00;/* NULL */
  	}
  }
  
--- 76,83 ----
  	for (i=0; i<count; i++) {
  		param[i] = ptr;
  		ptr += strlen(ptr);
! //		*(ptr++) = 0x00;/* NULL */
! 		ptr++;		/* also skip '\0', no sense to write flash here */
  	}
  }
  
------------ 8< ------- patch ここまで ------- >8 ------------



armadillo メーリングリストの案内