U-Boot中MAC地址设置及往内核中传递资料.docVIP

U-Boot中MAC地址设置及往内核中传递资料.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、内核参数的传递 U-Boot向Linux驱动传递参数的方式有两种,一为在系统启动的时候由bootloader传入,还有一种是将驱动编译成模块,将参数作为模块加载的参数传入。 内核通过setup接口接受Bootloader传入的参数。方式如下: static int __init param_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,我们可以用过setenv ethaddr Mac地址来设置开发板的mac地址。 二、bootm传递参数的方式 在bootm执行的流程图中,可以看到会调用do_bootm_linux()在执行Linux内核,内核的起始地址如下: void (*theKernel)(int zero, int arch, uint params); 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()中被初始化: ?????? /* arch number of SMDK2410-Board */ ?????? gd-bd-bi_arch_number = MACH_TYPE_SMDK2410; /* 193 */ ?????? /* adress of boot parameters */ ?????? gd-bd-bi_boot_params = 0 可以看到,U-Boot传给内核的参数表存放在内存中起始偏移0×100的位置,这里只是指定了“指针”的位置,但还没初始化其中的值,这是在do_bootm_linux()中跳到内核前去完成的。 值得注意的是, 内核的默认运行地址的0前面就是留给参数用的。所以一般不要将内核下载到该地址之前,以免冲掉了传给内核的参数。 三、参数列表的构建 #if defined (CONFIG_SETUP_MEMORY_TAGS) || \ ??? defined (CONFIG_CMDLINE_TAG) || \ ??? defined (CONFIG_INITRD_TAG) || \ defined (CONFIG_SERIAL_TAG) ?????? setup_start_tag (bd); #ifdef CONFIG_SERIAL_TAG ?????? setup_serial_tag (params); #endif #ifdef CONFIG_REVISION_TAG ?????? setup_revision_tag (params); #endif #ifdef CONFIG_SETUP_MEMORY_TAGS ?????? setup_memory_tags (bd); #endif #ifdef CONFIG_CMDLINE_TAG ?????? setup_commandline_tag (bd, commandline); #endif #ifdef CONFIG_INITRD_TAG ?????? if (initrd_start initrd_end) ????????????? setup_initrd_tag (bd, initrd_start, initrd_end); #endif #if defined (CONFIG_VFD) || defined (CONFIG_LCD) ?????? setup_videolfb_tag ((gd_t *) gd); #endif ?????? setup_end_tag (bd); #endif 四、解决U-Boot命令行中不能重新设置ethaddr的问题,经常会

文档评论(0)

精品课件 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档