当前位置:首页 > 操作系统 > MacOs

OK335xS mac address hacking

            <span>/*</span>
            <span>**********************************************************************
 *                       OK335xS mac address hacking
 * 声明:
 *     在一般的嵌入式产品中,一般mac地址都是存在于CPU芯片中,不过有时候
 * 我们也许会表示怀疑,因为我们可能更希望知道那些东西到底存在哪里,以一
 * 种什么样的形式存在。
 *
 *                                      2016-2-1 深圳 南山平山村 曾剑锋
 *********************************************************************</span>
            <span>*/</span>
            <span>

MACHINE_START(AM335XEVM, </span>
            <span>"</span>
            <span>am335xevm</span>
            <span>"</span>
            <span>)
    </span>
            <span>/*</span>
            <span> Maintainer: Texas Instruments </span>
            <span>*/</span>
            <span>
    .atag_offset    </span>= <span>0x100</span><span>,
    .map_io        </span>=<span> am335x_evm_map_io,
    .init_early    </span>=<span> am33xx_init_early,
    .init_irq    </span>=<span> ti81xx_init_irq,
    .handle_irq     </span>=<span> omap3_intc_handle_irq,
    .timer        </span>= &<span>omap3_am33xx_timer,
    .init_machine    </span>= am335x_evm_init,    -----------+<span>
MACHINE_END                                           </span>|
                                                      |<span>
MACHINE_START(AM335XIAEVM, </span><span>"</span><span>am335xiaevm</span><span>"</span>)             |
    <span>/*</span><span> Maintainer: Texas Instruments </span><span>*/</span>               |<span>
    .atag_offset    </span>= <span>0x100</span>,                          |<span>
    .map_io        </span>= am335x_evm_map_io,               |<span>
    .init_irq    </span>= ti81xx_init_irq,                   |<span>
    .init_early    </span>= am33xx_init_early,               |<span>
    .timer        </span>= &omap3_am33xx_timer,              |<span>
    .init_machine    </span>= am335x_evm_init,               |<span>
MACHINE_END                                           </span>|
                                                      |
                                                      |
<span>static</span><span>void</span> __init am335x_evm_init(<span>void</span>)   <----------+<span>
{
    am33xx_cpuidle_init();
    am33xx_mux_init(board_mux);
    omap_serial_init();
    am335x_evm_i2c_init();
    omap_sdrc_init(NULL, NULL);
    usb_musb_init(</span>&<span>musb_board_data);

    omap_board_config </span>=<span> am335x_evm_config;
    omap_board_config_size </span>=<span> ARRAY_SIZE(am335x_evm_config);

    _configure_device(EVM_SK, mfd_dev_cfg, PROFILE_NONE);

    daughter_brd_detected </span>= <span>false</span><span>;
    setup_zengjf();                              </span>------------------------------+
                                                                               |
    <span>/*</span><span>create  /proc/boardname to export info to userspace</span><span>*/</span>                    |<span>
    proc_init();                                                               </span>|
                                                                               |
    <span>/*</span><span> Create an alias for icss clock </span><span>*/</span>                                       |
    <span>if</span> (clk_add_alias(<span>"</span><span>pruss</span><span>"</span>, NULL, <span>"</span><span>pruss_uart_gclk</span><span>"</span>, NULL))                 |<span>
        pr_warn(</span><span>"</span><span>failed to create an alias: icss_uart_gclk --> pruss
</span><span>"</span>);      |
    <span>/*</span><span> Create an alias for gfx/sgx clock </span><span>*/</span>                                    |
    <span>if</span> (clk_add_alias(<span>"</span><span>sgx_ck</span><span>"</span>, NULL, <span>"</span><span>gfx_fclk</span><span>"</span>, NULL))                       |<span>
        pr_warn(</span><span>"</span><span>failed to create an alias: gfx_fclk --> sgx_ck
</span><span>"</span>);           |<span>
}                                                                              </span>|
                                                                               |
<span>/*</span><span> sbc-zengjf </span><span>*/</span>                                                               |
<span>#define</span> TLK110_PHY_ID       0x2000a211                                         |
<span>#define</span> LAN8710A_PHY_ID       0x7c0f1                                          |
<span>char</span> sbc_zengjf_phy1[<span>10</span>] = {<span>"</span><span>0:00</span><span>"</span>};                                           |
<span>char</span> sbc_zengjf_phy2[<span>10</span>] = {<span>"</span><span>0:01</span><span>"</span>};                                           |
                                                                               |
<span>static</span><span>void</span> setup_zengjf(<span>void</span>)                <--------------------------------+<span>
{
    pr_info(</span><span>"</span><span>The board is a sbc-zengjf.
</span><span>"</span><span>);

    </span><span>/*</span><span>which doesn‘t have Write Protect pin LAN8710A_PHY_ID </span><span>*/</span><span>
    am335x_mmc[</span><span>0</span>].gpio_wp = -<span>EINVAL;

    </span><span>int</span><span> ret;


    _configure_device(EVM_SK, sbc_zengjf_dev_cfg, PROFILE_NONE);

    am33xx_cpsw_init(AM33XX_CPSW_MODE_MII, sbc_zengjf_phy1, sbc_zengjf_phy2);   </span>---+<span>
    phy_register_fixup_for_uid(LAN8710A_PHY_ID , AM335X_EVM_PHY_MASK,              </span>|<span>
                                 am33xx_evm_tx_clk_dly_phy_fixup);                 </span>|<span>
}                                                                                  </span>|
                                                                                   |
                                                                                   |
<span>int</span> am33xx_cpsw_init(<span>enum</span> am33xx_cpsw_mac_mode mode, unsigned <span>char</span> *phy_id0,     <-+<span>
             unsigned </span><span>char</span> *<span>phy_id1)
{
    </span><span>struct</span> omap_hwmod *<span>oh;
    </span><span>struct</span> platform_device *<span>pdev;
    u32 mac_lo, mac_hi, gmii_sel;
    u32 i;

    mac_lo </span>=<span> omap_ctrl_readl(TI81XX_CONTROL_MAC_ID0_LO);
    mac_hi </span>= omap_ctrl_readl(TI81XX_CONTROL_MAC_ID0_HI);         ------------+<span>
    am33xx_cpsw_slaves[</span><span>0</span>].mac_addr[<span>0</span>] = mac_hi & <span>0xFF</span>;                       |<span>
    am33xx_cpsw_slaves[</span><span>0</span>].mac_addr[<span>1</span>] = (mac_hi & <span>0xFF00</span>) >> <span>8</span>;              |<span>
    am33xx_cpsw_slaves[</span><span>0</span>].mac_addr[<span>2</span>] = (mac_hi & <span>0xFF0000</span>) >> <span>16</span>;           |<span>
    am33xx_cpsw_slaves[</span><span>0</span>].mac_addr[<span>3</span>] = (mac_hi & <span>0xFF000000</span>) >> <span>24</span>;         |<span>
    am33xx_cpsw_slaves[</span><span>0</span>].mac_addr[<span>4</span>] = mac_lo & <span>0xFF</span>;                       |<span>
    am33xx_cpsw_slaves[</span><span>0</span>].mac_addr[<span>5</span>] = (mac_lo & <span>0xFF00</span>) >> <span>8</span>;              |
                                                                             |
    <span>/*</span><span> Read MACID0 from eeprom if eFuse MACID is invalid </span><span>*/</span>                  |
    <span>if</span> (!is_valid_ether_addr(am33xx_cpsw_slaves[<span>0</span>].mac_addr)) {              |
        <span>for</span> (i = <span>0</span>; i < ETH_ALEN; i++)                                       |<span>
            am33xx_cpsw_slaves[</span><span>0</span>].mac_addr[i] = am33xx_macid0[i];            |<span>
    }                                                                        </span>|
                                                                             |<span>
    mac_lo </span>= omap_ctrl_readl(TI81XX_CONTROL_MAC_ID1_LO);                     |<span>
    mac_hi </span>= omap_ctrl_readl(TI81XX_CONTROL_MAC_ID1_HI);                     |<span>
    am33xx_cpsw_slaves[</span><span>1</span>].mac_addr[<span>0</span>] = mac_hi & <span>0xFF</span>;                       |<span>
    am33xx_cpsw_slaves[</span><span>1</span>].mac_addr[<span>1</span>] = (mac_hi & <span>0xFF00</span>) >> <span>8</span>;              |<span>
    am33xx_cpsw_slaves[</span><span>1</span>].mac_addr[<span>2</span>] = (mac_hi & <span>0xFF0000</span>) >> <span>16</span>;           |<span>
    am33xx_cpsw_slaves[</span><span>1</span>].mac_addr[<span>3</span>] = (mac_hi & <span>0xFF000000</span>) >> <span>24</span>;         |<span>
    am33xx_cpsw_slaves[</span><span>1</span>].mac_addr[<span>4</span>] = mac_lo & <span>0xFF</span>;                       |<span>
    am33xx_cpsw_slaves[</span><span>1</span>].mac_addr[<span>5</span>] = (mac_lo & <span>0xFF00</span>) >> <span>8</span>;              |
    <span>//</span><span> Read MACID1 from eeprom if eFuse MACID is invalid                     |</span><span>if</span> (!is_valid_ether_addr(am33xx_cpsw_slaves[<span>1</span>].mac_addr)) {              |
        <span>for</span> (i = <span>0</span>; i < ETH_ALEN; i++)                                       |<span>
            am33xx_cpsw_slaves[</span><span>1</span>].mac_addr[i] = am33xx_macid1[i];            |<span>
    }                                                                        </span>|
                                                                             |
                                                                             |
    <span>switch</span> (mode) {                                                          |
    <span>case</span> AM33XX_CPSW_MODE_MII:                                               |<span>
        gmii_sel </span>= AM33XX_MII_MODE_EN;                                       |
        <span>break</span>;                                                               |
    <span>case</span> AM33XX_CPSW_MODE_RMII:                                              |<span>
        gmii_sel </span>= AM33XX_RMII_MODE_EN;                                      |
        <span>break</span>;                                                               |
    <span>case</span> AM33XX_CPSW_MODE_RGMII:                                             |<span>
        gmii_sel </span>= AM33XX_RGMII_MODE_EN;                                     |<span>
        am33xx_cpsw_slaves[</span><span>0</span>].phy_if = PHY_INTERFACE_MODE_RGMII;             |<span>
        am33xx_cpsw_slaves[</span><span>1</span>].phy_if = PHY_INTERFACE_MODE_RGMII;             |
        <span>break</span>;                                                               |
    <span>default</span>:                                                                 |
        <span>return</span> -EINVAL;                                                      |<span>
    }                                                                        </span>|
                                                                             |<span>
    writel(gmii_sel, AM33XX_CTRL_REGADDR(AM33XX_CONTROL_GMII_SEL_OFFSET));   </span>|
                                                                             |
    <span>if</span> (phy_id0 != NULL)                                                     |<span>
        am33xx_cpsw_slaves[</span><span>0</span>].phy_id = phy_id0;                              |
                                                                             |
    <span>if</span> (phy_id1 != NULL)                                                     |<span>
        am33xx_cpsw_slaves[</span><span>1</span>].phy_id = phy_id1;                              |
                                                                             |<span>
    memcpy(am33xx_cpsw_pdata.mac_addr,                                       </span>|<span>
            am33xx_cpsw_slaves[</span><span>0</span>].mac_addr, ETH_ALEN);                       |
                                                                             |<span>
    oh </span>= omap_hwmod_lookup(<span>"</span><span>mdio</span><span>"</span>);                                          |
    <span>if</span> (!oh) {                                                               |<span>
        pr_err(</span><span>"</span><span>could not find cpgmac0 hwmod data
</span><span>"</span>);                       |
        <span>return</span> -ENODEV;                                                      |<span>
    }                                                                        </span>|
                                                                             |<span>
    pdev </span>= omap_device_build(<span>"</span><span>davinci_mdio</span><span>"</span>, <span>0</span>, oh, &am33xx_cpsw_mdiopdata,  |
            <span>sizeof</span>(am33xx_cpsw_mdiopdata), NULL, <span>0</span>, <span>0</span>);                      |
    <span>if</span> (IS_ERR(pdev))                                                        |<span>
        pr_err(</span><span>"</span><span>could not build omap_device for cpsw
</span><span>"</span>);                    |
                                                                             |<span>
    oh </span>= omap_hwmod_lookup(<span>"</span><span>cpgmac0</span><span>"</span>);                                       |
    <span>if</span> (!oh) {                                                               |<span>
        pr_err(</span><span>"</span><span>could not find cpgmac0 hwmod data
</span><span>"</span>);                       |
        <span>return</span> -ENODEV;                                                      |<span>
    }                                                                        </span>|
                                                                             |<span>
    pdev </span>= omap_device_build(<span>"</span><span>cpsw</span><span>"</span>, -<span>1</span>, oh, &am33xx_cpsw_pdata,             |
            <span>sizeof</span>(am33xx_cpsw_pdata), NULL, <span>0</span>, <span>0</span>);                          |
    <span>if</span> (IS_ERR(pdev))                                                        |<span>
        pr_err(</span><span>"</span><span>could not build omap_device for cpsw
</span><span>"</span>);                    |
                                                                             |
    <span>return</span><span>0</span>;                                                                |<span>
}                                                                            </span>|
                                                                             |
<span>/*</span><span> TI81XX spefic control submodules </span><span>*/</span>                                       |
<span>#define</span> TI81XX_CONTROL_DEVCONF        0x600             <--------------------*---+
                                                                             |   |
<span>/*</span><span> TI81XX CONTROL_DEVCONF register offsets </span><span>*/</span>                                |   |
<span>#define</span> TI81XX_CONTROL_MAC_ID0_LO       (TI81XX_CONTROL_DEVCONF + 0x030)     |   |
<span>//</span><span> TI81XX_CONTROL_MAC_ID0_HI = 0x634              ---------------------------*---*-+</span><span>#define</span> TI81XX_CONTROL_MAC_ID0_HI       (TI81XX_CONTROL_DEVCONF + 0x034) <---+ --+ |
                                                                                   |
<span>/*</span><span>                                                                                 |
 * 1. 参考文档:                                                                   |
 *     AM335x ARM? Cortex?-A8 Microprocessors (MPUs) Technical Reference Manual    |
 *                                                                                 |
 * 2. 确认寄存器:                                                                 |
 *               Table 9-10. CONTROL_MODULE REGISTERS                              |
 *     +--------+------------------+-------------+----------------+                |
 *     | Offset | Acronym Register | Description | Section        |                |
 *     +--------+------------------+-------------+----------------+                |
 *     | 634h   | mac_id0_hi       |             | Section 9.3.26 |   <------------+
 *     +--------+------------------+-------------+----------------+
 *
 * 3. 寄存器说明:
 *     26.1.8.4.1 Device Initialization
 *         ......
 *         ? Device uses EFUSE registers mac_id0_lo and mac_id0_hi in the control module for Ethernet MAC address of the device.
 *         ......
 </span><span>*/</span>

 

原文:http://www.cnblogs.com/zengjfgit/p/5175569.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐