(3)IMX6Qに基づいて、U-ブート2017.11移植 - >イーサネットMAC(ENET)移植


最後の観測uboot移植シリアル出力:
U-ブート2017.11(2018年1月7日- 11時50分48秒0800)

CPU:AT 792 MHzのフリースケールi.MX6Qのrev1.5
POR:原因はリセット
ボード:MX6Q-Armadillo2
DRAM: 2ジブ
MMC:FSL_SDHC:0、FSL_SDHC :. 1
では:シリアル
アウト:シリアル
エラー:シリアル
ネット:FEC
エラー:. FECアドレスが設定されていない

自動ブートを停止するには任意のキーをヒット:0
=>
エラー:FECのアドレスではないエラーメッセージがあります設定します。
このエラーは、我々はネットワークドライブを移植していないので、理にかなっています。


移植に以下のような変形相対:
エラー検索に応じます。grep「SETに対処していない」./* -rn
./net/eth_legacy.c:163:のprintf(「\ nエラー:%Sのn \ SETに対処していない」、
で見つかりましたこの文書でubootにコンパイル我々は出力を持って、我々は、ファイルを開く:VIM ./net/eth_legacy.c 163は、
出力内の次の関数では、このエラーメッセージを見つけました。
INT eth_write_hwaddr(構造体eth_device * DEV、CONSTするchar * BASE_NAME、
int型eth_number)
{
unsigned char型のenv_enetaddr [ARP_HLEN]。
int型RET = 0;
eth_env_get_enetaddr_by_index(BASE_NAME、eth_number、env_enetaddr)。
(!is_zero_ethaddr(env_enetaddr))の場合{
場合(!is_zero_ethaddr(DEV-> enetaddr)&&
memcmp(DEV-> enetaddr、env_enetaddr、ARP_HLEN)){
のprintf( "\ n警告:%sのMACアドレスが一致しません:\ nは」、
DEV->名);
printf( "SROMのアドレスが%午後の\ nは"
DEV-> enetaddr);
printf(「環境でのアドレスは%午後の\ nは」
env_enetaddr)。
}
のmemcpy(DEV-> enetaddr、env_enetaddr、ARP_HLEN)。
}それ以外の場合(is_valid_ethaddr(DEV->
eth_env_set_enetaddr_by_index(BASE_NAME、eth_number、
DEV-> enetaddr)。
}そうであれば(is_zero_ethaddr(DEV-> enetaddr)){
#ifdefのCONFIG_NET_RANDOM_ETHADDR
net_random_ethaddr(DEV-> enetaddr)。
printf( "\ n警告:%S(ETH%D)ランダムMACアドレスを使用して、 - %pMでの\ n"を、
DEV->名、eth_number、DEV-> enetaddr)。
#else
のprintf( "\ nエラー:%sのアドレスが設定されていません\ nは。"、
DEV->名);
-EINVALを返します。
#endifの
}
IF(DEV-> write_hwaddr && eth_mac_skip(eth_number)!){
IF(is_valid_ethaddr(DEV-> enetaddr)!){
のprintf( "\のnエラー:%sのアドレス%PMの不正値を\ n"、
DEV->名前、DEV-> enetaddr)。
-EINVALを返します。


(RET)IF
のprintf(「\ n警告:%Sは、MACアドレスの\ N-設定に失敗しました」、
DEV->名);
}
戻りRETは;
}
マクロが定義されている場合、エラーメッセージは、出力マクロCONFIG_NET_RANDOM_ETHADDRである機能を有します実装net_random_ethaddr(DEV-> enetaddr);
net_random_ethaddrこの機能はDEV-> enetaddr内のランダムなアドレスを生成します。だからのヘッダファイル構成で適切な場所を見つけるために
、このマクロを追加します。
VimのVimの/のconfigs / mx6qarm2.h含める
追加/での#define CONFIG_NET_RANDOM_ETHADDR / * * XCLを
コンパイルします。make
プロンプトエラー:
/ in.o NET、作りつけ:では機能net_random_ethaddr `「:
/ホーム/ XCL / imx6q / uboot / U- :ブート2017.11 / / net.h含ま 818: `rand_r」への未定義の参照
の調査結果を、この機能が実装されていないrand_r示唆しています。
変更機能を検索します。grep "rand_rは" -rn
のlib / rand.c:見つかりました15:符号なしのint rand_r(unsigned int型* seedp)
ビュー:. Lsとのlib /ランド*
唯一のlib / rand.c、rand.cは、コンパイルされていないことが判明し
たMakefileを表示:VIMのlib / Makefileが
見つかりましたOBJ - $(CONFIG_LIB_RAND)+ = rand.o
説明CONFIG_LIB_RANDはそう、コンパイルされるためにこのマクロrand.cを定義する必要がありますヘッダファイル構成の適切な場所を見つける
、このマクロを追加します。
Vimのvimの/のconfigs / mx6qarm2.h含める
追加/での#define CONFIG_LIB_RAND / * * XCLを
コンパイラのダウンロードシリアル出力再起動:
U-ブート2017.11(2018年1月8日-午後9時22分25秒0800)

CPU:Freescale社i.MX6Q REV1を。 5 MHzの792 AT
原因をリセットさ:POR
ボード:MX6Q-Armadillo2
DRAM:2ジブ
MMC:FSL_SDHC:0、FSL_SDHC :. 1
において:シリアル
アウト:シリアル
エラー:シリアル
ネット:FEC
警告:FEC(eth0の)を使用してランダムなMACアドレス- 5A。 :B7:8B:DF:73 :. 11で

自動ブートへのSTOPキーを押す:0
この発見生成されたランダムな時間MACアドレス、コマンドを入力し、使用しないようにしようとするために、ネットワークカードドライバ:
=>のsetenv IPADDR 192.168.0.200
=>のsetenvサーバIP 192.168.0.106
=> saveenv
の保存環境MMCへ...
MMCへの書き込み(0)...なさ
=>のping 192.168.0.106
FECデバイスの使用
ホスト192.168.0.106は生きています
= >のping 192.168.0.107
FECデバイス使用

ARP再試行回数を超えて、再び開始
pingが失敗しました。ホスト192.168.0.107が生きていない
a.bin => TFTP 12000000
FECデバイスの使用
サーバ192.168.0.106からTFTPを。当社のIPアドレスは192.168.0.200です
ファイル名「a.bin」。
ロード・アドレス:0x12000000
読み込ん:######################
455.1 KiBの/ S
行わ
= 319135(4de9fヘクス)転送バイト数
=>
うわーカード!私は、一見することができ

、ここものの、pingを実行ダウンロードすることができ、また確認し、ネットワークカードの初期化プロセスを変更することができる感じ。
共通のVim / board_f.c
board_early_init_f関数内部[] init_sequence_fアレイinit_fnc_t静的定数。
位置の関数:ボード/フリースケール/ mx6qarm2 / mx6qarm2.c
ソースコード:
int型board_early_init_f(ボイド)
{
setup_iomux_uart();
setup_iomux_enet()は、

0を返す
}
:setup_iomux_enet機能コード
静的ボイドsetup_iomux_enet(ボイド)
{
、imx_iomux_v3_setup_multiple_pads(enet_padsをARRAY_SIZE(enet_pads));
}
トラッキングenet_padsに:
iomux_v3_cfg_t enet_padsのCONST [] = {
MX6_PAD_KEY_COL1__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_KEY_COL2__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL)
MX6_PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_ENET_REF_CLK__ENET_TX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)、
};
このボードの私達の参照と私たちのボードフィートのリンクが同じである道の大部分を見つけ、ただし
上記のテストが、それでも一見(図を参照することができますピンを異なるために行くには、次の図は)少し変更しました。

 

修改后:
/ * XCLによってmodefied * /
iomux_v3_cfg_t CONST enet_pads [] = {
MX6_PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_ENET_RXD1__GPIO1_IO26 | MUX_PAD_CTRL(NO_PAD_CTRL)、
MX6_PAD_ENET_CRS_DV__GPIO1_IO25 | MUX_PAD_CTRL(NO_PAD_CTRL)、

MX6_PAD_RGMII_TXC__RGMII_TXC | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)、

MX6_PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)、
MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)、


MX6_PAD_ENET_REF_CLK__ENET_TX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL)
} ;
:次に、多重ピンの構成、及び、後で使いやすいトランシーバar8035をリセットするので、機能追加
追加することにより* / / * XCLを  
静的ボイドreset_ar8035(ボイド)  
{   
    ;揮発性unsigned int型I = 0x88888
    unsigned int型* REG(= (unsigned int型*)(GPIO1_BASE_ADDR + 0×04));
    REG |〜= 0x2000000。
    *((unsigned int型*)(GPIO1_BASE_ADDR + 0×04))= REG;

    REG = *((unsigned int型*)(GPIO1_BASE_ADDR + 0×00));
    REG&=〜0x2000000;
    *((unsigned int型*)(GPIO1_BASE_ADDR + $ 00) )= REG;

    しばらく(i--)
        ;
    REG = *((unsigned int型*)(GPIO1_BASE_ADDR + 0×00));
    REG |〜= 0x2000000;
    *((unsigned int型*)(GPIO1_BASE_ADDR + $ 00))= REG;
}
board_early_init_f関数を呼び出します。
/ * XCL * /によってModefied
(ボイド)int型board_early_init_f
{
setup_iomux_uart();
setup_iomux_enet();
reset_ar8035();
0を返す;
}
テストをコンパイルし、最終的に......ダウンロード再開
試験をも移植することによって完成します。

---------------------
著者:honorxcl
出典:CSDN
オリジナルます。https://blog.csdn.net/qq_15015097/article/details/79007735
免責事項:この記事ブロガーのオリジナルの記事、複製など、ボーエンのリンクを添付してください!

おすすめ

転載: www.cnblogs.com/fire909090/p/10979136.html