<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)!