Pyon's Diary
2007-11-07 舊 平成拾玖年丁亥長月廿捌日乙巳 (水・雨) [長年日記]
KURO-BOX/PRO (No.29) NAS-Central の ARM9 用 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-Central の ARM9 用 2.6.20 カーネル・ソースは?。
處で NAS-Central の ARM9 用 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)
私を見て?。
404 Blog Not Found が以下の頁に言及してゐた。
其處で以下の項目が擧げられてゐた。
- 自分は「特別」ではない。
- バカはいかなる理由があらうと優遇されない。
- 情報はまずは疑へ。
- 言ひ譯・屁理屈は通じない。
- 大人が皆見習ふべき存在とは限らない。
- 法律を知りなさい。
- 本を讀みなさい。
當たり前の事が書いて有つた。なのに何で此に惹かれたかと云ふとけふの日經の夕刊に一番目の項目と似た樣な話が載つてゐた爲。けふの夕刊に同志社大學教授の佐伯順子といふ人が「「注目されたい」セレブブーム」と云ふ題で寄稿してゐた。
今の若い人の間では、人から注目されたいといふ感情が子供のころから育まれてゐると考へられる。少子化で大切にされ、(中略)自分はいつも畫面の中央にゐる存在だつた。しかし成長してみると、親以外の他人は自分に注目してくれるわけではないと氣附く。
[日本經濟新聞 2007年11月7日(夕刊) 第4版 第22面 「夕刊文化」より引用]
今の「若い人」がどれ位の年齢層を指すのかは不明だが、自分が子供の頃から既に「一人つ子は云々」と云はれてゐた。其れから廿數年經つてゐるが未だに人間と云ふのは進歩が無いらしい。