Ethernetのリンク状態を参照したい

弊社TCP/IPプロトコルスタック「μNet3」に関するご質問
返信する
アバター
eForce技術担当
記事: 193
登録日時: 2014年4月24日(木) 14:18

Ethernetのリンク状態を参照したい

投稿記事 by eForce技術担当 » 2017年4月14日(金) 16:27

対象:
μNet3/Compact、μNet3/Standard

質問:
Ethernetのリンク状態(リンクダウン、リンクアップ・通信速度)をアプリから参照したい

回答:
Ethernetドライバが認識しているリンク状態は net_dev_sts() にパラメータ「REF_ETH_LINK_STS」を渡すことで取得が可能です。(※)
取得した値をマスク値「PHY_STS_MSK」でANDします。その値が「PHY_STS_LINK_DOWN 」でなければリンクアップ状態です。

※Ethernetドライバの参照関数(eth_ref)がパラメータ「REF_ETH_LINK_STS」に対応している必要があります。

コード: 全て選択

/*【サンプルコード】*/
    ER ercd;
    UH val;

    ercd = net_dev_sts(1, REF_ETH_LINK_STS, (VP)&val);   /* 1 はデバイス番号 */
    if (E_OK == ercd) {
        if (PHY_STS_LINK_DOWN != (val & PHY_STS_MSK)) {
            /* リンクアップ状態 */
        }
        else {
            /* リンクダウン状態 */
        }
    }
    else {
        /* エラー(ドライバ初期化前など、ステータス取得可能状態ではない。) */
    }

--
/*【REF_ETH_LINK_STSパラメータで取得可能な値】*/
#define PHY_STS_LINK_DOWN       0x0000U     /* PHY media link down      */
#define PHY_STS_10HD            0x0100U     /* PHY 10M/Half-Duplex      */
#define PHY_STS_10FD            0x0200U     /* PHY 10M/Full-Duplex      */
#define PHY_STS_100HD           0x0400U     /* PHY 100M/Half-Duplex     */
#define PHY_STS_100FD           0x0800U     /* PHY 100M/Full-Duplex     */
#define PHY_STS_1000FD          0x1000U     /* PHY 1000M/Full-Duplex    */
#define PHY_STS_MSK             0xff00U     /* PHY mask */

アバター
eForce技術担当
記事: 193
登録日時: 2014年4月24日(木) 14:18

Re: Ethernetのリンク状態を参照したい

投稿記事 by eForce技術担当 » 2021年12月02日(木) 15:12

Ethernetリンクアップをコールバック関数にて通知することも可能です。

コード: 全て選択

/*【コールバック関数例 (●がリンクダウン検出箇所)】*/
    /* Callback function of ethernet driver */
    /* イーサネットドライバのコールバック関数 */
    /* gNET_DEV.usr_cbk(net_cfg.c)で本関数を登録します。もしくは */
    /* コンフィグレータから指定する場合、コンフィグレータ起動後
      [TCP/IP]→[インタフェース]→選択画面の[ユーザコールバック関数]で指定出来ます */

    void apl_eth_cbk(UH dev_num, UH evt, VP sts)
    {
        UW sts_lnk;

        if (evt == EV_CBK_DEV_LINK) {   /* リンク検出イベント */
            sts_lnk = (UW)sts;
            if (sts_lnk == PHY_STS_LINK_DOWN) {
                /* ●リンクダウン検出 */
            } else {
                /* リンクアップ検出 */
                switch (sts_lnk) {      /* ポート速度 */
                    case PHY_STS_10HD:      /* 10M Half */
                        break;
                    case PHY_STS_10FD:      /* 10M Full */
                        break;
                    case PHY_STS_100HD:     /* 100M Half */
                        break;
                    case PHY_STS_100FD:     /* 100M Full */
                        break;
                    case PHY_STS_1000FD:    /* 1000M Full */
                        break;
                    default:
                        break;
                }
            }
        }
    }

返信する