Linux驱动之系统移植----uboot移植_修改网络驱动(uboot无设备树版本)

news2024/9/28 11:12:21

uboot版本:uboot.2016.03
开发板:100ask_imx6ull_pro

修改网络驱动

须知
I.MX6UL/ULL内部有个以太网 MAC外设,也就是 ENET,需要外接一个 PHY芯片来实现网络通信功能,也就是内部 MAC+外部 PHY芯片的方案。(一个MAC可对应N个PHY芯片, PHY有地址索引)
也有些芯片没有内部以太网MAC如三星的 2440,4412, 因而采用 DM9000来实现联网功能。DM9000提供了一个类似 SRAM的访问接口,主控 CPU通过这个接口即可与DM9000进行通信,DM9000就是一个 MAC+PHY芯片。
内部 MAC+PHY芯片与 DM9000方案相比, 通信效率和速度上前者是碾压之势

通过开发板的原理图, 已知晓, 手头上的开发板采用了 ENET2使用 LAN8720A作为 PHY芯片.

LAN8720A有个管理接口, MDIO,两个线, MDIO和MDC, 时钟和数据线, 一个MDIO接口可以管理32个PHY芯片, MDIO通过PHY ADDR来确定访问哪个PHY芯片.

LAN8720A有复位引脚.

LAN8720驱动, 因为所有的PHY, 前16个寄存器一模一样是个phy的标准,在前16个寄存器的配置必须能够驱动phy芯片, 因此uboot里面会有已经写好了通用的PHY驱动, 所以理论上不需要修改.

原厂的网络模块原理图
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

开发板的网络模块原理图

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

通过和公板对比 我们发现网络通信接口都是使用的 RMII 接口 其中命令接口使用为 MDIO 接口,引脚 pin number 一致,只有 ENET2 RST 引脚不同,公板用74lv扩展出RST 引脚, 此时我们只需要修改 ENET2 RST 引脚即可 由于网卡时通过 PHY 地址来进行区分查找的 我们也要查看 PHY 芯片手册来知道如何确认 PHY 地址。

① ENET2的复位引脚,从图 33.2.7.2可以看出,ENET2的复位引脚 ENET2_RST接到了I.MX6ULL的 SNVS_TAMPER6
② ENET2所使用的 PHY芯片器件地址,从图 33.2.7.2可以看出,PHY器件地址为 0X1。

明确目的

  • 对ENET2添加复位引脚.
  • 对ENET2驱动添加复位功能.
  • 对驱动指定PHY ADDR.
  • 移除原有的74lv的相关驱动代码

修改PHY地址 指定PHY ADDR

打开include/configs/mx6ull_jzy_emmc.h
搜索到CONFIG_FEC_ENET_DEV

#define CONFIG_FEC_ENET_DEV		1

宏 CONFIG_FEC_ENET_DEV用于选择使用哪个网口,默认为 1,也就是选择ENET2。
搜索 CONFIG_FEC_MXC_PHYADDR

#if (CONFIG_FEC_ENET_DEV == 0) 
#define IMX_FEC_BASE              ENET_BASE_ADDR 
#define CONFIG_FEC_MXC_PHYADDR     0x2 
#define CONFIG_FEC_XCV_TYPE         RMII 
#elif (CONFIG_FEC_ENET_DEV == 1) 
#define IMX_FEC_BASE              ENET2_BASE_ADDR 
#define CONFIG_FEC_MXC_PHYADDR    0x1

前面根据原理图分析了, 使用的是enet2, 并且地址是0x1. 所以这里不需要做修改.

修改PHY初始化的选择
打开drivers/net/phy/phy.c
搜索函数 phy_init

int phy_init(void)
{
#ifdef CONFIG_PHY_AQUANTIA
	phy_aquantia_init();
#endif
#ifdef CONFIG_PHY_ATHEROS
	phy_atheros_init();
#endif
#ifdef CONFIG_PHY_BROADCOM
	phy_broadcom_init();
#endif
#ifdef CONFIG_PHY_CORTINA
	phy_cortina_init();
#endif
#ifdef CONFIG_PHY_DAVICOM
	phy_davicom_init();
#endif
#ifdef CONFIG_PHY_ET1011C
	phy_et1011c_init();
#endif
#ifdef CONFIG_PHY_LXT
	phy_lxt_init();
#endif
#ifdef CONFIG_PHY_MARVELL
	phy_marvell_init();
#endif
#ifdef CONFIG_PHY_MICREL
	phy_micrel_init();
#endif
#ifdef CONFIG_PHY_NATSEMI
	phy_natsemi_init();
#endif
#ifdef CONFIG_PHY_REALTEK
	phy_realtek_init();
#endif
#ifdef CONFIG_PHY_SMSC
	phy_smsc_init();
#endif
#ifdef CONFIG_PHY_TERANETICS
	phy_teranetics_init();
#endif
#ifdef CONFIG_PHY_TI
	phy_ti_init();
#endif
#ifdef CONFIG_PHY_VITESSE
	phy_vitesse_init();
#endif

	return 0;
}

其中phy_smsc_init定义了LAN8720的初始化

static struct phy_driver lan8710_driver = {
	.name = "SMSC LAN8710/LAN8720",
	.uid = 0x0007c0f0,
	.mask = 0xffff0,
	.features = PHY_BASIC_FEATURES,
	.config = &genphy_config_aneg,
	.startup = &genphy_startup,
	.shutdown = &genphy_shutdown,
};
......
int phy_smsc_init(void)
{
	phy_register(&lan8710_driver);
	phy_register(&lan911x_driver);
	phy_register(&lan8700_driver);
	phy_register(&lan8740_driver);

	return 0;
}

所以需要选择CONFIG_PHY_SMSC
回到mx6ull_jzy_emmc.h文件查找发现默认选择的是CONFIG_PHY_MICREL

#define CONFIG_PHY_MICREL

将其修改为CONFIG_PHY_SMSC

#define CONFIG_PHY_SMSC

屏蔽74LV595驱动代码
进入board/freescale/mx6ull_jzy_emmc/mx6ull_jzy_emmc.c文件
模仿74LV595定义一个gpio5_6

#define IOX_SDI IMX_GPIO_NR(5, 10)
#define IOX_STCP IMX_GPIO_NR(5, 7)
#define IOX_SHCP IMX_GPIO_NR(5, 11)
#define IOX_OE IMX_GPIO_NR(5, 8)

#define ENET2_RESET IMX_GPIO_NR(5, 6) 

找到int board_init(void)初始化函数

int board_init(void) 
{ 
 ...... 
	imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads)); 
    iox74lv_init(); 
    ......
}

将iox74lv_init();初始化函数删除

添加复位引脚的驱动

static iomux_v3_cfg_t const fec2_pads[]数组定义了引脚复用
添加gpio5_6的引脚

static iomux_v3_cfg_t const fec2_pads[] = {
	MX6_PAD_GPIO1_IO06__ENET2_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
	MX6_PAD_GPIO1_IO07__ENET2_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),

	MX6_PAD_ENET2_TX_DATA0__ENET2_TDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET2_TX_DATA1__ENET2_TDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 | MUX_PAD_CTRL(ENET_CLK_PAD_CTRL),
	MX6_PAD_ENET2_TX_EN__ENET2_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),

	MX6_PAD_ENET2_RX_DATA0__ENET2_RDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET2_RX_DATA1__ENET2_RDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET2_RX_EN__ENET2_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET2_RX_ER__ENET2_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_SNVS_TAMPER6__GPIO5_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),
};

setup_iomux_fec(int fec_id)是根据fec2_pads和fec1_pads网络IO配置数组来初始化网络IO, 需要在其中添加网络复位IO的初始化代码, 通过GPIO硬复位

static void setup_iomux_fec(int fec_id)
{
	if (fec_id == 0)
		imx_iomux_v3_setup_multiple_pads(fec1_pads,
						 ARRAY_SIZE(fec1_pads));
	else
		imx_iomux_v3_setup_multiple_pads(fec2_pads,
						 ARRAY_SIZE(fec2_pads));
}
||                                             ||
||*********************************************||
||                                             || 
static void setup_iomux_fec(int fec_id)
{
	if (fec_id == 0)
	{
		imx_iomux_v3_setup_multiple_pads(fec1_pads,
						 ARRAY_SIZE(fec1_pads));
	}
	else
	{
		imx_iomux_v3_setup_multiple_pads(fec2_pads,
						 ARRAY_SIZE(fec2_pads));
		gpio_direction_output(ENET2_RESET, 1);
		gpio_set_value(ENET2_RESET, 0);
		mdelay(20);
		gpio_set_value(ENET2_RESET, 1);
	}
}

这是通过LAN8720A芯片手册读到的信息, 将复位引脚拉低至少20ms复位.
这个硬件复位很重要!
否则可能导致 uboot无法识别 LAN8720A。

修改 drivers/net/phy/phy.c文件中的函数 genphy_update_link
uboot中的LAN8720A驱动依然有些问题,
打开文件
drivers/net/phy/phy.c,找到函数 genphy_update_link,这是个通用 PHY驱动函数,此函数用于更
新 PHY的连接状态和速度。
使用 LAN8720A的时候要使其复位一下, 这是软复位

 int genphy_update_link(struct phy_device *phydev) 
 { 
     unsigned int mii_reg; 
  
 #ifdef CONFIG_PHY_SMSC 
     static int lan8720_flag = 0; 
     int bmcr_reg = 0; 
     if (lan8720_flag == 0) { 
         bmcr_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);     
         phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);    
         while(phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR) & 0X8000) { 
             udelay(100);             
         } 
         phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr_reg);     
         lan8720_flag = 1; 
     } 
 #endif 
  
     /* 
      * Wait if the link is up, and autonegotiation is in progress 
      * (ie - we're capable and it's not done) 
      */ 
     mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR); 
... 
  
     return 0; 
 }

phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);读取MII_BMCR寄存器的值
phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);往寄存器MII_BMCR写入BMCR_RESET值,
#define BMCR_RESET 0x8000 /* Reset the DP83840 */
MII_BMCR寄存器的0x8000功能是复位
等待复位结束, 将之前存的默认值写回去.

编译后移植, 启动uboot 测试网络
设置网卡信息

=> setenv eth1addr 00:01:3f:2d:3e:4d
=> setenv ipaddr 192.168.31.178
=> setenv gatewayip 192.168.31.1
=> setenv netmask 255.255.255.0
=> setenv serverip 192.168.31.158
=> saveenv
=> ping 192.168.31.139
Using FEC1 device
host 192.168.31.139 is alive

成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5G NR标准 第11章 多天线传输

第11章 多天线传输 多天线传输是 NR 的关键组成部分,尤其是在较高频率下。 本章一般性地介绍了多天线传输的背景,然后详细描述了 NR 多天线预编码。 11.1 简介 使用多个天线进行传输和/或接收可以在移动通信系统中提供巨大的好处。 发射机和/或接收…

女友:不跟我解释清楚 Linux I/O 晚上你就睡沙发吧

目录阻塞 I/O非阻塞 I/OI/O复用信号驱动 I/O异步 I/O总结I/O 其实就是 input 和 output(输入输出) 在计算机操作系统中对应数据流的输入与输出,在 Linux 中,既有文件的 I/O,也有网络 I/O 无论是文件 I/O 还是网络 I/…

【大厂高频真题100题】《整数转罗马数字》 真题练习第21题 持续更新~

整数转罗马数字 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列…

【解决方案】智慧城管非现场执法系统

通过自建摄像头或利用辖区现有监控摄像头,利用人工智能技术,通过深度学习算法,系统能够全天候自动识别和采集城管违章行为,实现店外经营智能分析、无证游商智能分析、乱堆物堆料智能分析、暴露垃圾等场景的智能分析,从…

黄金分析师职级如何评定?初级、高级如何划分?

自从中国加入WTO以后,对外贸易和境外投资持续高速增长,为国家带来了了巨额外汇积累。发展黄金市场、提高黄金投资需求,成为我国应对国际金融风险显现和美元贬值的重要举措。然而,黄金投资市场健康、持续的发展,需要大量…

shell的模拟实现

目录 整体框架分析 代码演示 代码分析 整体框架分析 考虑下面这个与shell典型的互动: [xzyecs-333953 date16]$ ls makefile mycmd mycmd.cpp myexec myexec.c test.py [xzyecs-333953 date16]$ psPID TTY TIME CMD 21919 pts/0 00:00:00 bash …

jmeter之数据库配置及修改(工作日记3)

首先,jmeter要配置数据库需要安装 jdbc.jar包 官网连接:https://dev.mysql.com/downloads/ 步骤1: 步骤二: 步骤三: 步骤四: 接着我们去jmeter导入此jar包: 然后我们就可以在jmeter中去…

CSS3 多列布局

文章目录CSS3 多列布局概述常用属性使用column-count 列数column-width 列宽column-gap 间距column-rule 边框column-span 跨列案例瀑布流布局CSS3 多列布局 概述 在CSS3之前,如果想要设计类似报纸那样的多列布局,有两种方式可以实现:一种是…

kaggle平台学习复习笔记 | pandas

目录1.Creating, Reading and Writing2.Indexing, Selecting & Assigning3.Summary Functions and Maps4.Grouping and Sorting5.Data Types and Missing Values6.Renaming and Combining获得开展独立数据科学项目所需的技能。 1.Creating, Reading and Writing DataFram…

安全帽识别算法技术原理

应用背景:安全帽作为一种最常见和实用的个人防护用具,能够有效地防止和减轻外来危险源对头部的伤害。但在现场操作过程中,安全帽的佩戴很容易人为忽略,引发了不少人身伤害事故。为了保证工作人员都能在作业中佩戴安全帽&#xff0…

CentOS/Red Hat 安装cuDNN

创建于:2023.01.04 修改于:2023.01.04 文章目录1、找到cuDNN版本号2、下载cuDNN3、安装cuDNN4、参考资料本文是在Linux Red Hat下安装的cuDNN,且假定您已经安装好了NVIDIA驱动、CUDA。 本文是在CUDA 11.2 Red Hat条件下安装的cuDNN。 1、找…

超高清直播“出圈”下的沉浸式文博会

在引领文化产业发展的文博会现场,前沿科技元素随处可见。VR、AR、4K/8K、元宇宙……各种“文化科技”的元素以刷新视听极限的美好体验,冲击着观众的眼球和感知。文博会现场,BOSMA博冠于数字文化展区展示国产8K超高清摄像机、BOSMA博冠望远镜等…

(小甲鱼python)集合笔记合集一 集合(上)总结 集合的简单用法 集合的各种方法合集:子、交、并、补、差、对称差集、超集

一、基础复习 集合与字典区别 集合中所有元素都是独一无二的&#xff0c;并且也是无序的。 集合具有唯一性、无序性、有限性 >>> type({}) #字典 <class dict> >>> type({"one"}) #集合 <class set> >>> type…

微服务保护 Sentinel 实战

目录Sentinel什么是雪崩问题&#xff1f;服务保护技术对比Sentinel介绍和安装初识Sentinel安装Sentinel微服务整合Sentinel流量控制簇点链路快速入门流控模式关联模式链路模式流控效果warm up排队等待热点参数限流全局参数限流热点参数限流案例隔离和降级FeignClient整合Sentin…

nVisual各项隐藏项配置说明

nVisual可以部署在不同的项目中&#xff0c;但是每个项目都有自己不同的使用场景&#xff0c;有的不需要报表功能&#xff0c;有的不需要监测功能&#xff0c;还有的不需要连接外网的功能等。针对这些不同的需求&#xff0c;有必要且有可使用的机制来满足这些场景。 nVisual使…

PageRank算法

什么是PageRank&#xff1f; PageRankPageRankPageRank算法由GoogleGoogleGoogle创始人LarryPageLarry\ PageLarry Page在斯坦福大学时提出&#xff0c;又称PRPRPR&#xff0c;佩奇排名。主要针对网页进行排名&#xff0c;计算网站的重要性优化搜索引擎的搜索结果。PRPRPR值表示…

Java大学生档案系统高校学生档案系统

简介 Java基于springboot开发的学生档案系统&#xff0c;包含了权限管理&#xff0c;学生档案&#xff0c;学生成绩录入&#xff0c;教师管理等。 演示视频 https://www.bilibili.com/video/BV1XV411b761/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92…

SQL速算N日留存

之前才哥发布了《用SQL进行用户留存率计算》 链接&#xff1a;https://mp.weixin.qq.com/s/QJ8JUO00bVJe_K6sx_ttaw 简化数据后得到如下结构的数据&#xff1a; 由于用户和登录日期被设置为主键所以不需要再进行去重&#xff0c;下面看看如何快速求七日留存。 数据下载地址&…

数据中心基础设施管理(DCIM)工具

什么是DCIM DCIM (Data Center Infrastructure management) 数据中心基础设施管理 是将IT&#xff08;信息技术&#xff09;和设备管理结合起来对数据中心关键设备进行集中监控、容量规划等集中管理。通过软件、硬件和传感器等&#xff0c;DCIM提供一个独立的管理平台&#xf…

网购平台如何保障公平交易

抢购&#xff0c;是这三年来重复出现的关键词。 疫情初始&#xff0c;口罩、测温枪是抢购热点&#xff1b;随后&#xff0c;蔬菜从口罩接过“抢购”接力棒&#xff1b;不久后&#xff0c;退烧药、抗原、血氧仪、“特效药”先后成为抢购热点&#xff1b;甚至元旦假期间&#xf…