[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 メーリングリストの案内