トップ «前の日記(2007-11-06) 最新 次の日記(2007-11-08)» 編集

Pyon's Diary

[はてなブックマーク登録数] [Google に登録] [RSS フィード] Gourmet Hardware Programming Society Software
Amazon
成る可くJIS X 0213:2004對應MSフォント(5.0)、IPAフォント(003.02)で御覽下さい

2007-11-07 舊 平成拾玖年丁亥長月廿捌日乙巳 (水・雨) [長年日記]

[節] KURO-BOX/PRO (No.29) NAS-CentralARM9 用 2.6.20 カーネル・ソースではハードウェアの MAC を讀み取つてゐ無いのでは、と云ふ疑問。

(2007-11-09 2.6.23 カーネルのコンパイル・起動に成功した。)

(2008-02-17 2.6.25-rc1 に於いて shutdown -hP で電源が落とせる樣に成つた)

KURO-BOX/PRO 附屬の CD-ROM に入つてゐるカーネル・ソース(linux-2.6.12_lsp.1.10.3.src.tar.gz)で調べた事の備忘録。

  • include/asm-arm/setup.h

の 145 行目で ATAG_MV_UBOOT が以下の樣に定義されてゐる。

145 /* Marvell uboot parameters */
146 #define ATAG_MV_UBOOT   0x41000403

其乃直後(148 行目)で構造體 tag_mv_uboot が、

148 struct tag_mv_uboot {
149     u32 uboot_version;
150     u32 tclk;
151     u32 sysclk;
152     u32 isUsbHost;
153     u32 overEthAddr;
154     u8  macAddr[6];
155 };

更に 157 行目で構造體 tag が、

157 struct tag {
158     struct tag_header hdr;
159     union {
160         struct tag_core     core;
161         struct tag_mem32    mem;
162         struct tag_videotext    videotext;
163         struct tag_ramdisk  ramdisk;
164         struct tag_initrd   initrd;
165         struct tag_serialnr serialnr;
166         struct tag_revision revision;
167         struct tag_videolfb videolfb;
168         struct tag_cmdline  cmdline;
169
170         /*
171          * Acorn specific
172          */
173         struct tag_acorn    acorn;
174
175         /*
176          * DC21285 specific
177          */
178         struct tag_memclk   memclk;
179
180         /*
181          * Marvell specific
182          */
183         struct tag_mv_uboot     mv_uboot;
184     } u;
185 };

が定義されてゐる。

亦同じファイルの 193 行目ではマクロ __tagtable が定義されてゐる。

193 #define __tagtable(tag, fn) \
194 static struct tagtable __tagtable_##fn __tag = { tag, fn }

此乃マクロを使用して ATAG_MV_UBOOT が示すアドレスからデータを讀込んで(夛分)構造體 tag, tag_mv_uboot のインスタンスを作成してゐるのが

  • arch/arm/mach-mv88fxx81/LSP/core.c

の 80 〜 154 行目。

142 行目附近で U-Boot の版が 1.4.2 以降(mvUbootVer > 0x01040100)で有れば廣域變數 overEthAddr が設定されてゐる。

140     if( mvUbootVer > 0x01040100 )  /* releases after 1.4.2 */
141     {
142         overEthAddr = tag->u.mv_uboot.overEthAddr;
143 #if defined (MV_88W8660)
144         /*U-boot version => 1.9.2*/
145         if (mvUbootVer >= 0x01090200)
146         {
147             memcpy(mvMacAddr, tag->u.mv_uboot.macAddr, 6);
148         }
149 #endif
150     }

其れで此乃廣域變數 overEthAddr の値に據つて MAC アドレスを設定してゐるのが、

  • arch/arm/mach-mv88fxx81/LSP/egiga/mv_e_main.c

の 502 〜 512 行目。

502     /* init device mac addr */
503     if(!overEthAddr)
504     {
505         mvEthMacAddrGet(port, dev->dev_addr);
506         BUF_DEBUG(printk("%s (Debug): dev->dev_addr = %s (by mvEthMacAddrGet)\n", __FUNCTION__, dev->dev_addr));
507     }
508     else
509     {
510         egiga_convert_str_to_mac( mac_addr, dev->dev_addr );
511         BUF_DEBUG(printk("%s (Debug): dev->dev_addr = %s (by egiga_convert_str_to_mac)\n", __FUNCTION__, dev->dev_addr));
512     }

此處で overEthAddr の値が僞の時、

  • arch/arm/mach-mv88fxx81/Soc/eth/mvEth.c

の 1794 〜 1815 行目で定義されてゐる凾數 mvEthMacAddrGet() でハードウェアから MAC アドレスを讀み取つてゐる。

1794 MV_STATUS   mvEthMacAddrGet(int portNo, unsigned char *pAddr)
1795 {
1796     unsigned int    macH;
1797     unsigned int    macL;
1798
1799     if(pAddr == NULL)
1800     {
1801         mvOsPrintf("mvEthMacAddrGet: NULL pointer.\n");
1802         return MV_BAD_PARAM;
1803     }
1804
1805     macH = MV_REG_READ(ETH_MAC_ADDR_HIGH_REG(portNo));
1806     macL = MV_REG_READ(ETH_MAC_ADDR_LOW_REG(portNo));
1807     pAddr[0] = (macH >> 24) & 0xff;
1808     pAddr[1] = (macH >> 16) & 0xff;
1809     pAddr[2] = (macH >> 8) & 0xff;
1810     pAddr[3] = macH  & 0xff;
1811     pAddr[4] = (macL >> 8) & 0xff;
1812     pAddr[5] = macL  & 0xff;
1813
1814     return MV_OK;
1815 }

此に據つてオリジナルのカーネルを使用してゐる KURO-BOX/PRO (今は HDD 起動環境)はハードウェアから MAC アドレスを讀み取れてゐると思はれる。

NAS-CentralARM9 用 2.6.20 カーネル・ソースは?。

處で NAS-CentralARM9 用 2.6.20 カーネル・ソースでは上と同樣に、

  • arch/arm/mach-mv88fxx81/Soc/eth/mvEth.c

の 1794 〜 1815 行目に凾數 mvEthMacAddrGet() が定義されてゐる

1794 MV_STATUS   mvEthMacAddrGet(int portNo, unsigned char *pAddr)
1795 {
1796     unsigned int    macH;
1797     unsigned int    macL;
1798
1799     if(pAddr == NULL)
1800     {
1801         mvOsPrintf("mvEthMacAddrGet: NULL pointer.\n");
1802         return MV_BAD_PARAM;
1803     }
1804
1805     macH = MV_REG_READ(ETH_MAC_ADDR_HIGH_REG(portNo));
1806     macL = MV_REG_READ(ETH_MAC_ADDR_LOW_REG(portNo));
1807     pAddr[0] = (macH >> 24) & 0xff;
1808     pAddr[1] = (macH >> 16) & 0xff;
1809     pAddr[2] = (macH >> 8) & 0xff;
1810     pAddr[3] = macH  & 0xff;
1811     pAddr[4] = (macL >> 8) & 0xff;
1812     pAddr[5] = macL  & 0xff;
1813
1814     return MV_OK;
1815 }

が find & grep した結果、此乃凾數は使用されてゐ無い。

% cd ${WORL}/linux-2.6.20
% find ./ -type f | grep -v '\.svn' | xargs grep 'mvEthMacAddrGet'
バイナリー・ファイル./arch/arm/mach-mv88fxx81/mv88f5181/built-in.oは一致しました
バイナリー・ファイル./arch/arm/mach-mv88fxx81/mv88f5181/mv88f5181.oは一致しました
./arch/arm/mach-mv88fxx81/Soc/eth/mvEth.h:MV_STATUS   mvEthMacAddrGet(int portNo, unsigned char *pAddr);
./arch/arm/mach-mv88fxx81/Soc/eth/mvEth.c:* mvEthMacAddrGet - This function returns the port Unicast address.
./arch/arm/mach-mv88fxx81/Soc/eth/mvEth.c:MV_STATUS   mvEthMacAddrGet(int portNo, unsigned char *pAddr)
./arch/arm/mach-mv88fxx81/Soc/eth/mvEth.c:        mvOsPrintf("mvEthMacAddrGet: NULL pointer.\n");
バイナリー・ファイル./arch/arm/mach-mv88fxx81/Soc/eth/mvEth.oは一致しました
バイナリー・ファイル./arch/arm/boot/Imageは一致しました
バイナリー・ファイル./.tmp_vmlinux2は一致しました
バイナリー・ファイル./.tmp_vmlinux1は一致しました
./.tmp_System.map:c003fe3c T mvEthMacAddrGet
./System.map:c003fe3c T mvEthMacAddrGet
バイナリー・ファイル./vmlinuxは一致しました

と云ふ事は此乃カーネル・ソースではハードウェアから MAC アドレスを讀み取る機會が無いのでは無かろうか。

だから .config で指定された「000000000051」と云ふ變な値に成つて了つてゐるのでは無かろうか。

追記: 變更してみた。

其處で NAS-Central に在る ARM9 用 2.6.20 カーネル・ソース

  • drivers/net/egiga/mv_e_main.c

を以下の樣に變更した。

@@ -248,6 +248,8 @@

 u32 egiga_stat =  EGIGA_DBG_LOAD | EGIGA_DBG_INT | EGIGA_DBG_TX | EGIGA_DBG_TX_DONE | EGIGA_DBG_RX | EGIGA_DBG_RX_FILL | EGIGA_DBG_STATS;

+extern u32 overEthAddr;
+
 #ifdef CONFIG_BUFFALO_PLATFORM
 // only 1 device
 static struct {
@@ -774,7 +776,14 @@
     memset( priv , 0, sizeof(egiga_priv) );

     /* init device mac addr */
+    if(!overEthAddr)
+    {
+	    mvEthMacAddrGet(port, dev->dev_addr);
+    }
+    else
+    {
     	egiga_convert_str_to_mac( mac_addr, dev->dev_addr );
+    }

     /* init device methods */
     strcpy( dev->name, name );

斯うして置いて .config の CONFIG_ETH_0_MACADDR の値を

CONFIG_ETH_0_MACADDR="000000000051"

に戻してコンパイルした。

カーネル・イメージ・ファイルとモジュール・ファイルとを KURO-BOX/PRO に持つて行き再起動した。

MAC アドレスが筐體の其處に書かれてゐるものと同じに成つた。

追記: 2.6.23 カーネルのコンパイルに成功した。(2007-11-09)

2.6.23 カーネルのコンパイル・起動に成功した。

Tags: Hardware | del.icio.usに追加 | はてなブックマークに追加 | livedoor クリップに追加 | Yahoo! ブックマークに追加 | Google ブックマークに追加 | Permalink

[節] 晩御飯。

  • 押麥飯。
  • 鹽豚ポトフ。
Tags: None | del.icio.usに追加 | はてなブックマークに追加 | livedoor クリップに追加 | Yahoo! ブックマークに追加 | Google ブックマークに追加 | Permalink

[節] 私を見て?。

404 Blog Not Found が以下の頁に言及してゐた。

其處で以下の項目が擧げられてゐた。

  • 自分は「特別」ではない。
  • バカはいかなる理由があらうと優遇されない。
  • 情報はまずは疑へ。
  • 言ひ譯・屁理屈は通じない。
  • 大人が皆見習ふべき存在とは限らない。
  • 法律を知りなさい。
  • 本を讀みなさい。

當たり前の事が書いて有つた。なのに何で此に惹かれたかと云ふとけふの日經の夕刊に一番目の項目と似た樣な話が載つてゐた爲。けふの夕刊に同志社大學教授の佐伯順子といふ人が「「注目されたい」セレブブーム」と云ふ題で寄稿してゐた。

今の若い人の間では、人から注目されたいといふ感情が子供のころから育まれてゐると考へられる。少子化で大切にされ、(中略)自分はいつも畫面の中央にゐる存在だつた。しかし成長してみると、親以外の他人は自分に注目してくれるわけではないと氣附く。

[日本經濟新聞 2007年11月7日(夕刊) 第4版 第22面 「夕刊文化」より引用]

今の「若い人」がどれ位の年齢層を指すのかは不明だが、自分が子供の頃から既に「一人つ子は云々」と云はれてゐた。其れから廿數年經つてゐるが未だに人間と云ふのは進歩が無いらしい。

Tags: Society | del.icio.usに追加 | はてなブックマークに追加 | livedoor クリップに追加 | Yahoo! ブックマークに追加 | Google ブックマークに追加 | Permalink
[]

正當なXHTML1.1です! 正當なCSSです! BlogScouter Pyon's Land (MyMiniCity)
© pyon