TI am335x 核心分析----乙太網移植
TI am335x的乙太網移植:
1.1配置MII的管腳
static struct pinmux_config rmii1_pin_mux[]= {
{"mii1_crs.rmii1_crs_dv",OMAP_MUX_MODE1 | AM33XX_PIN_INPUT_PULLDOWN},
{"mii1_rxer.rmii1_rxer",OMAP_MUX_MODE1|AM33XX_PIN_INPUT_PULLDOWN},
{"mii1_tx_en.rmii1_txen",OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT},
{"mii1_tx_d1.rmii1_txd1",OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT},
{"mii1_txd0.rmii1_txd0",OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT},
{"mii1_rxd1.rmii1_rxd1",OMAP_MUX_MODE1 | AM33XX_PIN_INPUT_PULLDOWN},
{"mii1_rxd0.rmii1_rxd0",OMAP_MUX_MODE1 | AM33XX_PIN_INPUT_PULLDOWN},
{"rmii1_refclk.rmii1_refclk",OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
{"mdio_data.mdio_data",OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
{"mdio_clk.mdio_clk", OMAP_MUX_MODE0| AM33XX_PIN_OUTPUT_PULLUP},
{NULL, 0},
};
static struct pinmux_config rmii2_pin_mux[]= {
{"gpmc_csn3.rmii2_crs_dv",OMAP_MUX_MODE2 |AM33XX_PIN_INPUT_PULLDOWN},
// {"gpmc_wpn.mii2_rxerr", OMAP_MUX_MODE3|AM33XX_PIN_INPUT_PULLDOWN},
{"gpmc_wpn.rmii2_rxerr",OMAP_MUX_MODE3 |AM33XX_PIN_INPUT_PULLDOWN},
{"gpmc_a0.mii2_txen",OMAP_MUX_MODE3 | AM33XX_PIN_OUTPUT},
{"gpmc_a4.mii2_txd1", OMAP_MUX_MODE3| AM33XX_PIN_OUTPUT},
{"gpmc_a5.mii2_txd0", OMAP_MUX_MODE3| AM33XX_PIN_OUTPUT},
{"gpmc_a10.mii2_rxd1",OMAP_MUX_MODE3| AM33XX_PIN_INPUT_PULLDOWN},
{"gpmc_a11.mii2_rxd0",OMAP_MUX_MODE3 | AM33XX_PIN_INPUT_PULLDOWN},
{"mii1_col.rmii2_refclk",OMAP_MUX_MODE1 |AM33XX_PIN_INPUT_PULLDOWN},
{"mdio_data.mdio_data",OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
{"mdio_clk.mdio_clk", OMAP_MUX_MODE0| AM33XX_PIN_OUTPUT_PULLUP},
{NULL, 0},
};
1.2初始化函式
Setup_general_purpose(void)
{
……
am33xx_cpsw_init(AM33XX_CPSW_MODE_RMII,NULL, NULL);
/* Atheros Tx Clkdelay Phy fixup */
phy_register_fixup_for_uid(AM335X_EVM_PHY_ID, AM335X_EVM_PHY_MASK,
beaglebone_phy_fixup);
……
}
#defineAM335X_EVM_PHY_ID 0x20005c90 //Tbao
staticstruct cpsw_slave_data am33xx_cpsw_slaves[] = {
{
.slave_reg_ofs = 0x200,
.sliver_reg_ofs= 0xd80,
.phy_id = "0:01",
.dual_emac_reserved_vlan= CPSW_PORT_VLAN_SLAVE_0,
//.mac_addr=
},
{
.slave_reg_ofs = 0x300,
.sliver_reg_ofs= 0xdc0,
.phy_id = "0:02",
.dual_emac_reserved_vlan= CPSW_PORT_VLAN_SLAVE_1,
},
};
選擇暫存器的模式:
#defineAM33XX_RMII_MODE_EN ((1 <<0) | (1 << 2) | (1<<6) | (1<<7))
am33xx_cpsw_init()
{
……
struct omap_hwmod *oh;
struct platform_device *pdev;
u32 mac_lo, mac_hi, gmii_sel;
u32 i;
mac_lo = omap_ctrl_readl(TI81XX_CONTROL_MAC_ID0_LO);
mac_hi =omap_ctrl_readl(TI81XX_CONTROL_MAC_ID0_HI);
am33xx_cpsw_slaves[0].mac_addr[0] = mac_hi& 0xFF;
am33xx_cpsw_slaves[0].mac_addr[1] = (mac_hi& 0xFF00) >> 8;
am33xx_cpsw_slaves[0].mac_addr[2] = (mac_hi& 0xFF0000) >> 16;
am33xx_cpsw_slaves[0].mac_addr[3] = (mac_hi& 0xFF000000) >> 24;
am33xx_cpsw_slaves[0].mac_addr[4] = mac_lo& 0xFF;
am33xx_cpsw_slaves[0].mac_addr[5] = (mac_lo& 0xFF00) >> 8;
/* Read MACID0 from eeprom if eFuse MACID isinvalid */
if (!is_valid_ether_addr(am33xx_cpsw_slaves[0].mac_addr)){
for (i = 0; i < ETH_ALEN; i++)
am33xx_cpsw_slaves[0].mac_addr[i]= am33xx_macid0[i];
}
mac_lo =omap_ctrl_readl(TI81XX_CONTROL_MAC_ID1_LO);
mac_hi =omap_ctrl_readl(TI81XX_CONTROL_MAC_ID1_HI);
am33xx_cpsw_slaves[1].mac_addr[0] = mac_hi& 0xFF;
am33xx_cpsw_slaves[1].mac_addr[1] = (mac_hi& 0xFF00) >> 8;
am33xx_cpsw_slaves[1].mac_addr[2] = (mac_hi& 0xFF0000) >> 16;
am33xx_cpsw_slaves[1].mac_addr[3] = (mac_hi& 0xFF000000) >> 24;
am33xx_cpsw_slaves[1].mac_addr[4] = mac_lo& 0xFF;
am33xx_cpsw_slaves[1].mac_addr[5] = (mac_lo& 0xFF00) >> 8;
/* Read MACID1 from eeprom if eFuse MACID isinvalid */
if(!is_valid_ether_addr(am33xx_cpsw_slaves[1].mac_addr)) {
for (i = 0; i < ETH_ALEN; i++)
am33xx_cpsw_slaves[1].mac_addr[i]= am33xx_macid1[i];
}
switch (mode) {
case AM33XX_CPSW_MODE_MII:
gmii_sel = AM33XX_MII_MODE_EN;
break;
case AM33XX_CPSW_MODE_RMII:
gmii_sel = AM33XX_RMII_MODE_EN; // 1100 0101
am33xx_cpsw_slaves[0].phy_if =PHY_INTERFACE_MODE_RMII; //Tbao------
am33xx_cpsw_slaves[1].phy_if =PHY_INTERFACE_MODE_RMII;
break;
case AM33XX_CPSW_MODE_RGMII:
gmii_sel = AM33XX_RGMII_MODE_EN;
am33xx_cpsw_slaves[0].phy_if =PHY_INTERFACE_MODE_RGMII;
am33xx_cpsw_slaves[1].phy_if =PHY_INTERFACE_MODE_RGMII;
break;
default:
return -EINVAL;
}
writel(gmii_sel,AM33XX_CTRL_REGADDR(AM33XX_CONTROL_GMII_SEL_OFFSET));
if (phy_id0 != NULL)
am33xx_cpsw_slaves[0].phy_id =phy_id0;
if (phy_id1 != NULL)
am33xx_cpsw_slaves[1].phy_id =phy_id1;
memcpy(am33xx_cpsw_pdata.mac_addr,
am33xx_cpsw_slaves[0].mac_addr,ETH_ALEN);
oh = omap_hwmod_lookup("mdio");
if (!oh) {
pr_err("could not find cpgmac0hwmod data\n");
return -ENODEV;
}
pdev =omap_device_build("davinci_mdio", 0, oh, &am33xx_cpsw_mdiopdata,
sizeof(am33xx_cpsw_mdiopdata),NULL, 0, 0);
if (IS_ERR(pdev))
pr_err("could not buildomap_device for cpsw\n");
oh = omap_hwmod_lookup("cpgmac0");
if (!oh) {
pr_err("could not find cpgmac0hwmod data\n");
return -ENODEV;
}
pdev = omap_device_build("cpsw", -1,oh, &am33xx_cpsw_pdata,
sizeof(am33xx_cpsw_pdata),NULL, 0, 0);
if (IS_ERR(pdev))
pr_err("could not buildomap_device for cpsw\n");
return 0;
}
……
}
經過以上的移植,乙太網能夠起來。。
2017/09/21 於深圳南山
相關推薦
TI am335x 核心分析----乙太網移植
TI am335x的乙太網移植: 1.1配置MII的管腳 static struct pinmux_config rmii1_pin_mux[]= { {"mii1_crs.rmii1_crs_dv",OMAP_MUX_MODE1 | AM33XX_PIN_INPUT_P
TI am335x 核心分析----乙太網移植
TI am335x的乙太網移植: 1.1配置MII的管腳 static struct pinmux_config rmii1_pin_mux[]= { {"mii1_crs.rmii1_crs_dv",OMAP_MUX_MODE1 | AM33XX_PIN_INPUT_P
TI am335x 核心分析2--資源遍歷程式碼分析
MPU平臺:OAMP3352 核心版本:3.2.0 宣告:我講解的範疇是從核心解壓以後經過彙編程式碼執行最後跳到第一個C程式碼這個點開始講解,一直講到檔案系統被正確的掛載起來,使用者可以登入!至於之前的彙編程式碼我會以後另開文章講解.
TI am335x 核心LOGO 和進度條移植
核心LOGO: 1、AM335x晶片,Linux啟動畫面小企鵝在make menuconfig彈出的介面中選擇Devuce Driver中選擇Graphics support 中的Bootup logo中的Standard blac
TI am335x 核心原始碼編譯命令等
1.插入環境變數: cd /etc vim profile 在末尾加入:export PATH=<sdk path>/linux-devkit/sysroots/x86_64-arago-linux/usr/bin:$PATH &n
am335x 核心原始碼分析2 LCD移植
1、/arch/arm/mach-omap2/board-am335xevm.c/lcdc_init(){得到LCD硬體引數struct da8xx_lcdc_platform_data} -> am33xx_register_lcdc() -> omap_device_
linux 核心程式碼分析1 TI am335x
1. TI AM335x 核心原始碼分析 1.1 Board-am335xevm.c Board-am335xevm.c(./arch/arm/mach-omap2)中開始執行入口: MACHINE_START(A
TI am335x U-boot移植(正常啟動)
****************************************************************** &
TI am335x系列(am3352)LCD驅動修改移植
1、/arch/arm/mach-omap2/board-am335xevm.c/lcdc_init(){得到LCD硬體引數struct da8xx_lcdc_platform_data} -> am33xx_register_lcdc() -> omap_d
基於TI AM335x創龍開發板的快速體驗
AM335x ARM Cortex-A8 著手體驗的是創龍TL335x-IDK,這個板子的特點如下:基於 TI AM335x ARM Cortex-A8 CPU,主頻可高達 1GHz,運算能力可高達 2000DMIPS,搭配DDR3,兼容 eMMC 和 NAND FLASH,超高性價比; 2 個 PR
區塊鏈遊戲FOMO3D智能合約核心分析
技術 重寫 term 時間 交流 aio 流程 blue 角度 最近做一個區塊鏈的項目,需要徹底分析FOMO3D的智能合約,順便熟悉一下區塊鏈的開發流程。首先為了能跑FOMO3D的智能合約我嘗試了truffle+galanche,對我來說不太理想,我就自己用python+s
Linux核心分析第二次作業
這周學習了《庖丁解牛Linux核心分析》並且學習了實驗樓的相關知識。 在實驗樓的虛擬環境下編寫程式碼: 通過gcc編譯後,使用檢視檔案命令:cat -n 20189223.c 在vim中,通過“g/\.s
PostgreSQL資料庫核心分析學習(一)
PostgreSQL 資料庫由連線管理系統(系統控制器)、編譯執行系統、儲存管理系統、事務系統和系統表五大部分組成。 2.1系統表 資料字典是關係資料庫系統管理控制資訊的核心 在postgreSQL資料庫系統中,系統表扮演資料字典的角色 存放結構元資料,
Linux 核心分析及應用
編輯推薦 本書分模組介紹了 Linux 作業系統的核心設計和實現,針對關鍵概念、演算法和資料結構做了重點的講解。同時,對諸多經典應用程式進行了剖析,如 Nginx、Memcached、Redis、LVS 等,講解如何利用作業系統提供的底層支援進行合理的應用設計和實現。 內容簡介 本書由架構師親
Linux核心分析第六次作業
分析system_call中斷處理過程 一、先在實驗樓的虛擬機器中MenuOs增加utsname和utsname-asm指令。 具體實現如下: 1、克隆最新新版本的menu,之後進入menu 2、進入test.c,完成之後make rootfs,使系統自動編譯自動執行 3.設定分割點,用gdb追
PostgreSQL核心分析——BTree索引
文中附圖參考至《PostgreSQL資料庫核心分析》 (一)概念描述 B+樹是一種索引資料結構,其一個特徵在於非葉子節點用於描述索引,而葉子節點指向具體的資料儲存位置。在PostgreSQL中,存在結構相似的BTree索引,該資料結構最先引用於《Effiicient Locking for Concurr
Linux核心分析第七次作業
分析Linux核心建立一個新程序的過程 Linux中建立程序一共有三個函式: 1. fork,建立子程序 2. vfork,與fork類似,但是父子程序共享地址空間,而且子程序先於父程序執行。 3. clone,主要用於建立執行緒 程序建立的大概過程 通過之前的學習,我們
Android核心分析之GUI框架的原理
在Android中Window 是個弱化了的概念,更多的表現在View這個概念上。在很大程度上,Android 的View的概念可以代替Microsoft Window 這個概念。不過是換了一個側重點有點不一樣而已。 原始GUI基本框架 首先我們從Android 的SDK 外特性空間開始,在
Linux4.9.9核心SD卡移植(適配fs4412平臺)
本文適配fs4412開發板,使用的核心為linux4.9.9。 1.修改裝置樹 vi arch/arm/boot/dts/exynos4412-liebao.dts 修改: &sdhci_2 { bus-width = <4>;