为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > U-Boot中MAC地址设置及往内核中传递

U-Boot中MAC地址设置及往内核中传递

2019-09-10 3页 doc 17KB 12阅读

用户头像 个人认证

平忠

教育

举报
U-Boot中MAC地址设置及往内核中传递精心整理精心整理精心整理一、内核参数的传递U-Boot向Linux驱动传递参数的方式有两种,一为在系统启动的时候由bootloader传入,还有一种是将驱动编译成模块,将参数作为模块加载的参数传入。内核通过setup接口接受Bootloader传入的参数。方式如下:staticint__initparam_mac_setup(char*str){……}__setup(“mac=”,param_mac_setup);这样,当在Bootloader中指定“mac=00...
U-Boot中MAC地址设置及往内核中传递
精心整理精心整理精心整理一、内核参数的传递U-Boot向Linux驱动传递参数的方式有两种,一为在系统启动的时候由bootloader传入,还有一种是将驱动编译成模块,将参数作为模块加载的参数传入。内核通过setup接口接受Bootloader传入的参数。方式如下:staticint__initparam_mac_setup(char*str){……}__setup(“mac=”,param_mac_setup);这样,当在Bootloader中指定“mac=00:2E:79:38:6D:4E”,系统在加载这个模块的时候,就会执行相应的param_mac_setup()函数,而传入给它的参数就是等号后面的物理地址“00:2E:79:38:6D:4E”。这样,该函数就可以对它进行相应的处理。在U-Boot中,默认设置mac地址的参数为ethaddr,我们可以用过setenvethaddrMac地址来设置开发板的mac地址。二、bootm传递参数的方式在bootm执行的图中,可以看到会调用do_bootm_linux()在执行Linux内核,内核的起始地址如下:void(*theKernel)(intzero,intarch,uintparams);image_header_t*hdr=&header;??????theKernel=(void(*)(int,int,uint))ntohl(hdr->ih_ep);header是uImage的头部,通过头部,得到内核映像起始的执行地址,标识为theKernel。从中也可以看到,内核接受三个参数,第一个为0,第二个为系统的ID号,第三个是传入内核的参数。在do_bootm_linux()的最后,会跳到内核去执行:??????theKernel(0,bd->bi_arch_number,bd->bi_boot_params);最后两个参数在board/smdk2410/smdk2410.c的board_init()中被初始化:??????/*archnumberofSMDK2410-Board*/??????gd->bd->bi_arch_number=MACH_TYPE_SMDK2410;/*193*/??????/*adressofbootparameters*/可以看到,U-Boot传给内核的参数存放在内存中起始偏移0×100的位置,这里只是指定了“指针”的位置,但还没初始化其中的值,这是在do_bootm_linux()中跳到内核前去完成的。三、参数列表的构建#ifdefined(CONFIG_SETUP_MEMORY_TAGS)||\???defined(CONFIG_CMDLINE_TAG)||\???defined(CONFIG_INITRD_TAG)||\defined(CONFIG_SERIAL_TAG)??????setup_start_tag(bd);#ifdefCONFIG_SERIAL_TAG??????setup_serial_tag(&params);#endif#ifdefCONFIG_REVISION_TAG??????setup_revision_tag(&params);#endif#ifdefCONFIG_SETUP_MEMORY_TAGS??????setup_memory_tags(bd);#endif#ifdefCONFIG_CMDLINE_TAG??????setup_commandline_tag(bd,commandline);#endif#ifdefCONFIG_INITRD_TAG??????if(initrd_start&&initrd_end)?????????????setup_initrd_tag(bd,initrd_start,initrd_end);#endif#ifdefined(CONFIG_VFD)||defined(CONFIG_LCD)??????setup_videolfb_tag((gd_t*)gd);#endif??????setup_end_tag(bd);#endif四、解决U-Boot命令行中不能重新设置ethaddr的问,经常会提示Can’toverwrite“ethaddr”common/cmd_nvedit.c中函数_do_setenv中找到#ifndefCONFIG_ENV_OVERWRITE/**EthernetAddressandserial#canbesetonlyonce,*verisreadonly.*/#ifdefCONFIG_HAS_UID/*Allowserial#forcedoverwritewith0xdeaf4addflag*/if(((strcmp(name,“serial#”)==0)&&(flag!=0xdeaf4add))||#elseif((strcmp(name,“serial#”)==0)||#endif((strcmp(name,“ethaddr”)==0)#ifdefined(CONFIG_OVERWRITE_ETHADDR_ONCE)&&defined(CONFIG_ETHADDR)&&(strcmp((char*)env_get_addr(oldval),MK_STR(CONFIG_ETHADDR))!=0)#endif/*CONFIG_OVERWRITE_ETHADDR_ONCE&&CONFIG_ETHADDR*/)){printf(“Can’toverwrite\”%s\”\n”,name);return1;}#endif把((strcmp(name,“ethaddr”)==0)替换成(0即可;五.为了让U-Boot命令行中设置的参数ethaddr传递到内核,必须修改U-Boot和linux内核两个地方:(1)U-Boot修改:lib_arm/armlinux.c???在????#ifdefCONFIG_CMDLINE_TAG?????????????setup_commandline_tag(bd,commandline);???下面添加如下语句:???char*buf1=malloc(1024);???sprintf(buf1,“%smac=%s”,getenv(“bootargs”),getenv(“ethaddr”));???setup_commandline_tag(bd,buf1);(2)linux内核修改:drivers/net/davinci_emac.cstaticintemac_eth_setup(void)???{前面添加:staticchardavinci_mac_addr_uboot[20]=“”;??staticint__initparam_mac_setup(char*str)???{???????strncpy(davinci_mac_addr_uboot,str,sizeof(davinci_mac_addr_uboot));??}???__setup(“mac=”,param_mac_setup);并在函数emac_eth_setup内部语句printk(“TIDaVinciEMAC:MACaddressis%s\n”,emac_eth_string);前面添加:strncpy(emac_eth_string,davinci_mac_addr_uboot,sizeof(emac_eth_string));添加完毕,重新编译uboot和内核。参考文献:精心整理精心整理精心整理
/
本文档为【U-Boot中MAC地址设置及往内核中传递】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索