imx6 mac地址设置

imx6的mac地址总是固定的值,所以需要更改,采用的方法是在uboot中设置环境变量,之后在kernel中使用uboot中设置的mac地址的值。本文记录更改的过程。

参考链接:

  http://www.cnblogs.com/zengjfgit/p/5711304.html

uboot

lib_arm/board.c                                                                 void start_armboot (void)                                                       
{                                                                               ...eth_initialize(gd->bd);                 ---------------------------+...                                                                |        
};                                                                     |        |        |        
int eth_initialize(bd_t *bis)                            <-------------+        
{                                                                               ....../* Try board-specific initialization first.  If it fails or isn't           * present, try the cpu-specific initialization */                          if (board_eth_init(bis) < 0)                                                cpu_eth_init(bis);                          -------------+              ......                                                       |              
}                                                                |              |              
int cpu_eth_init(bd_t *bis)                             <--------+              
{                                                                               int rc = -ENODEV;                                                           
#if defined(CONFIG_MXC_FEC)                                                     rc = mxc_fec_initialize(bis);    ------+                                    |                                    /* Board level init */                 |                                    enet_board_init();                     |                                    |                                    
#endif                                     |                                    return rc;                             |                                    
}                                          |                                    |                                    
int mxc_fec_initialize(bd_t *bis)   <------+                                    
{                                                                               ......if (fec_get_hwaddr(dev, ethaddr) == 0) {                  ------+       printf("got MAC address from IIM: %pM\n", ethaddr);         |       memcpy(dev->enetaddr, ethaddr, 6);                          |       fec_set_hwaddr(dev);                                        |       }                                                               |       }                                                                   |       |       return 1;                                                           |       
}                                                                       |       |       
static int fec_get_hwaddr(struct eth_device *dev, unsigned char *mac)<--+       
{                                                                               
#ifdef CONFIG_GET_FEC_MAC_ADDR_FROM_IIM                                         fec_get_mac_addr(mac);                       -------+                       return 0;                                           |                       
#else                                                   |                       return -1;                                          |                       
#endif                                                  |                       
}                                                       |                       |                       
#ifdef CONFIG_GET_FEC_MAC_ADDR_FROM_IIM                 |                       
int fec_get_mac_addr(unsigned char *mac)          <---- +                       
{                                                                               
#if 0                                                                           unsigned int value;                          //不读取寄存器中的值                               value = readl(OCOTP_BASE_ADDR + HW_OCOTP_MACn(0));                          mac[5] = value & 0xff;                                                      mac[4] = (value >> 8) & 0xff;                                               mac[3] = (value >> 16) & 0xff;                                              mac[2] = (value >> 24) & 0xff;                                              value = readl(OCOTP_BASE_ADDR + HW_OCOTP_MACn(1));                          mac[1] = value & 0xff;                                                      mac[0] = (value >> 8) & 0xff;                                               
#else                                                                           eth_getenv_enetaddr("ethaddr", mac);          //使用环境变量设置的mac地址                              
#endif                                                                          return 0;                                                                   
}                                                                               

kernel

1.设备

arch/arm/mach-mx6/board-mx6q_sabresd.c
MACHINE_START(MX6Q_SABRESD, "Freescale i.MX 6Quad/DualLite/Solo Sabre-SD Board")/* Maintainer: Freescale Semiconductor, Inc. */.boot_params = MX6_PHYS_OFFSET + 0x100,.fixup = fixup_mxc_board,.map_io = mx6_map_io,.init_irq = mx6_init_irq,.init_machine = mx6_sabresd_board_init,.timer = &mx6_sabresd_timer,.reserve = mx6q_sabresd_reserve,
MACHINE_ENDstatic void __init mx6_sabresd_board_init(void)
{......imx6_init_fec(fec_data);......
}arch/arm/mach-mx6/mx6_fec.c
void __init imx6_init_fec(struct fec_platform_data fec_data)
{//读取寄存器中的mac地址的值fec_get_mac_addr(fec_data.mac);//这里就已经随机生成了mac地址,在驱动中就不会再次设置,所以注释了//设备注册在驱动注册之前,先不要自动生成mac地址,由驱动来设置
//  if (!is_valid_ether_addr(fec_data.mac))
//      random_ether_addr(fec_data.mac);if (cpu_is_mx6sl())imx6sl_add_fec(&fec_data);elseimx6q_add_fec(&fec_data);
}

2.驱动

drivers/net/fec.c
//驱动设置mac地址
static void __inline__ fec_get_mac(struct net_device *ndev)
{struct fec_enet_private *fep = netdev_priv(ndev);struct fec_platform_data *pdata = fep->pdev->dev.platform_data;unsigned char *iap, tmpaddr[ETH_ALEN];/** try to get mac address in following order:** 1) module parameter via kernel command line in form*    fec.macaddr=0x00,0x04,0x9f,0x01,0x30,0xe0*/iap = macaddr;// 检查是否合法,不合法就通过flash设置/** 2) from flash or fuse (via platform data)*/if (!is_valid_ether_addr(iap)) {
#ifdef CONFIG_M5272if (FEC_FLASHMAC)iap = (unsigned char *)FEC_FLASHMAC;
#elseif (pdata)memcpy(iap, pdata->mac, ETH_ALEN);
#endif}// 检查是否合法,不合法就通过bootloader设置/** 3) FEC mac registers set by bootloader*/if (!is_valid_ether_addr(iap)) {*((unsigned long *) &tmpaddr[0]) =be32_to_cpu(readl(fep->hwp + FEC_ADDR_LOW));*((unsigned short *) &tmpaddr[4]) =be16_to_cpu(readl(fep->hwp + FEC_ADDR_HIGH) >> 16);iap = &tmpaddr[0];}// 随机生成/** 4) generate random mac */if (!is_valid_ether_addr(iap)) random_ether_addr(iap);memcpy(ndev->dev_addr, iap, ETH_ALEN);/* Adjust MAC if using macaddr */if (iap == macaddr)ndev->dev_addr[ETH_ALEN-1] = macaddr[ETH_ALEN-1] + fep->pdev->id;
}

Tony Liu

2016-9-22, Shenzhen

转载于:https://www.cnblogs.com/helloworldtoyou/p/5895778.html

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

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

相关文章

java try catch陷阱_Java异常处理最佳实践及陷阱防范

原标题&#xff1a;Java异常处理最佳实践及陷阱防范出自《深夜里的程序猿》作者&#xff1a;wangzenghuang前言不管在我们的工作还是生活中&#xff0c;总会出现各种“错误”&#xff0c;各种突发的“异常”。无论我们做了多少准备&#xff0c;多少测试&#xff0c;这些异常总会…

vivo手机怎么投屏到电脑_投屏软件电脑加手机投屏软件投屏

优秀的资源工具可以让你事半功倍&#xff01;本号文内资源已经手工转存整理&#xff0c;安全起见&#xff0c;回复 “领取资源” 按提示自助领取。今天分享的是一家公司出品的投屏神器。为避免被举报这里就不说出软件名了。它可以在局域网内把手机的屏幕投到电脑上&#xff0c;…

How to upload windows Sysprep Files to VMware vCenter Server Appliance 6.5(vC

vCSA5.5中可以登录到端口5480中去上传&#xff0c;vCSA 6.0以后就不支持了。但是可以通过Enable “Pi Shell”来做。 首先确保vCSA的ssh可用&#xff1a; 0. Make sure that SSH in enabled on the VCSA. Home > Administration > System configuration (under Deploymen…

开源短地址_如何在短短5分钟内完成您的第一个开源贡献

开源短地址by Roshan Jossey罗珊乔西(Roshan Jossey) 如何在短短5分钟内完成您的第一个开源贡献 (How to make your first open source contribution in just 5 minutes) The best way to level up your programming skills it to code more. The second best thing is to rea…

【Qt开发】QT对话框去掉帮助和关闭按钮 拦截QT关闭窗口的CloseEvent

建了一个对话框&#xff0c;我不想把边框去掉&#xff0c;只想去掉关闭按钮&#xff0c; setWindowFlags(windowFlags()&~Qt::WindowCloseButtonHint&~Qt::WindowContextHelpButtonHint); 结果那个问号的按钮去掉了&#xff0c;但是关闭按钮还在&#xff0c;求助啊 set…

Vivado Design Suite用户指南之约束的使用第二部分(约束方法论)

Constraints Methodology&#xff08;约束方法论&#xff09; 关于约束方法论 设计约束定义了编译流程必须满足的要求&#xff0c;以使设计在板上起作用。 并非所有步骤都使用所有约束在编译流程中。 例如&#xff0c;物理约束仅在实现步骤期间使用&#xff08;即&#xff0c;由…

eval函数 php_PHP的一句话木马代码和函数eval的简介

大清早的刚从床上爬起来。雨落就跑来找我问我这段代码是什么意思<?php eval($_POST[pp]);?>看了一下&#xff0c;post接收pp的值&#xff0c;抑制错误输出。呵呵开个玩笑&#xff0c;其实不是这么简单&#xff0c;这是一段PHP木马代码&#xff0c;也就是我们所说的后门…

linux安装python_Python - 爱豆

Python下载Python最新源码&#xff0c;二进制文档&#xff0c;新闻资讯等可以在Python的官网查看到&#xff1a;Python官网&#xff1a;你可以在以下链接中下载 Python 的文档&#xff0c;你可以下载 HTML、PDF 和 PostScript 等格式的文档。Python文档下载地址&#xff1a;doc…

如何将您的#100DaysOfCode登录转换为视觉体验

by Joe Warren通过乔沃伦 如何将您的&#xff03;100DaysOfCode登录转换为视觉体验 (How to Transform Your #100DaysOfCode Log Into a Visual Experience) Learning how to code is an unrivaled modern experience. As an aspiring developer, no matter what level you’r…

Python中集合(set)的操作及一些比较常见的用法

Python除了List、Tuple、Dict等常用数据类型外&#xff0c;还有一种数据类型叫做集合&#xff08;set&#xff09;&#xff0c;集合的最大特点是&#xff1a;集合里边的元素是不可重复的并且集合内的元素还是无序的&#xff0c;所以一般情况下集合常用的两个场景是&#xff1a;…

php中的图像下载函数,PHP实现的下载远程图片自定义函数分享

/*** PHP下载远程图片到本地** param $url string 远程文件地址* param $filename string 保存后的文件名(为空时则为随机生成的文件名&#xff0c;否则为原文件名)* param $fileType array 允许的文件类型* param $dirName string 文件保存的路径(路径其余部分根据时间系统自动…

Linux 文件的压缩与解压

1. tar结尾压缩命令 [roottest ~]# tar -cvf grub.tar /boot/grub/ 查看压缩包文件 [roottest ~]# tar -vtf grub.tar 解压文件 #tar -xvf grub.tar # tar -xvf grub.tar -C 解压目录 2. gz结尾压缩命令 # tar -zcvf grub.tar.gz /boot/grub gz结尾解压命令 #tar -zxvf gr…

深度学习笔记-卷积神经网络CNN与循环神经网络RNN有什么区别?

转载 https://blog.csdn.net/weixin_35227692/article/details/79223536转载于:https://www.cnblogs.com/USTBlxq/p/10445268.html

参考框架 系统 基准_带有基准的前端框架的实际比较

参考框架 系统 基准by Jacek Schae由Jacek Schae 带有基准的前端框架的实际比较 (A Real-World Comparison of Front-End Frameworks with Benchmarks) UPDATE: There is a newer version of this article更新&#xff1a;本文有较新的版本 A Real-World Comparison of Front…

ppt复制切片器_零基础小白自学PPT快速入门到精通(上)

零基础小白如何自学PPT快速入门到精通呢&#xff1f;40个保姆级小技巧助力你高效掌握PPT基础操作&#xff01;PPT在学习与工作中的应用越来越广泛&#xff1a;在学校时免不了要做毕业答辩、毕业论文&#xff0c;工作中时常要进行复盘总结、工作汇报、推广方案&#xff0c;有时甚…

网络安全初创公司SafeBreach获1500万美元A轮融资

今天&#xff0c;网络安全初创公司 SafeBreach 宣布完成1500 万美元 A 轮融资&#xff0c;新投资者德国电信、惠普公司、 Maverick Ventures 及现有投资者 Sequoia Capital 和 Shlomo Kramer 参投。公司计划利用本轮融资加大研发力度&#xff0c;扩大销售及营销团队&#xff0c…

php网站分区,PHP - Manual: 分区和分片 (官方文档)

分区和分片数据库群组是由于各种各样的原因建立的&#xff0c;他可以提升处理能力、容忍错误&#xff0c;并且提升大量服务器同时工作的的性能。群组有时会组合分区和共享功能&#xff0c;来将大量复杂的任务分拆成更加简单的任务&#xff0c;更加可控的单元。插件可以支持各种…

webBroser获取cookie

//取当前webBrowser登录后的Cookie值 [DllImport("wininet.dll", CharSet CharSet.Auto, SetLastError true)]static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, StringBuilder pchCookieData, ref int pcchCookieData, int dwFlags…

了解Linux操作系统发展阶段

一、硬件与软件发展历史 计算机由硬件和软件组成结构 二、Linux的发展史 Linux 操作系统是Unix操作系统的一种克隆系统。它诞生于1991年的10月5日&#xff08;只是第一次正式向外公布的时间&#xff09;。以后借助于Internet网络&#xff0c;并经过全世界各地计算机爱好者的共同…

c gui qt 4编程第二版_面试官问Linux下如何编译C程序,如何回答?为你编译演示

文章来源&#xff1a;嵌入式大杂烩 作者&#xff1a;ZhengNLWindows下常用IDE来编译&#xff0c;Linux下直接使用gcc来编译&#xff0c;编译过程是Linux嵌入式编程的基础&#xff0c;也是嵌入式高频基础面试问题。一、命令行编译及各个细分编译过程hello.c示例代码&#xff1a;…