• u-boot移植(十三)---代码修改---裁剪及环境变量 二


    一、错误处理

      上一节遇到一个错误:

      

      print一下:

      

      发现我们在jz2440.h中静态写的网络参数都没有写进去。

      dm9000 address not set。 dm9000的地址未设置。

      

      这里对应两个函数:

      static int eth_pre_unbind(struct udevice *dev) 和 int eth_write_hwaddr(struct eth_device *dev, const char *base_name, int eth_number)

      这里两个函数对应着宏 CONFIG_DM_ETH。在文件中查找一下,这个宏定义的是什么:

      

      config中没有设置,则运行的应该是后面一个函数。后面一个函数是设置硬件地址。

      打印地址处的代码如下:

    1 #ifdef CONFIG_NET_RANDOM_ETHADDR
    2         net_random_ethaddr(dev->enetaddr);
    3         printf("
    Warning: %s (eth%d) using random MAC address - %pM
    ",
    4                dev->name, eth_number, dev->enetaddr);
    5 #else
    6         printf("
    Error: %s address not set1.
    ",
    7                dev->name);
    8         return -EINVAL;
    9 #endif

      env_enetaddr 是从eth_getenv_enetaddr_by_index此函数中获取到的。

    1 eth_getenv_enetaddr_by_index(base_name, eth_number, env_enetaddr);
    2 
    3 int eth_getenv_enetaddr_by_index(const char *base_name, int index,
    4                  uchar *enetaddr)
    5 {
    6     char enetvar[32];
    7     sprintf(enetvar, index ? "%s%daddr" : "%saddr", base_name, index);
    8     return eth_getenv_enetaddr(enetvar, enetaddr);
    9 }

      从几个函数中我们可以知道,如果我们的dev->enetaddr是0,则就会打印那条错误信息。

      试了好几个方法,都未成功设置,先放置在这里,进行其他的工作。

    二、nand分

      u-boot中输入mtdparts命令:

      

      

      jz2440.h中定义宏:

      定义宏 CONFIG_CMD_MTDPARTS 打开 mtdparts命令

      修改run_main_loop函数:

      

      mtdparts_init() 函数的作用就是构造分区,这些分区都是用数组表示的。

      查看其他地方的设置分区,仿照写入,如下:

      

      编译运行,结果如下:

       

      这里有个提醒:mtdparts variable not set, see 'help mtdparts'         no partitions defined

      这是因为没有带参数,下面已经打印出分区了。

      执行两条命令建立分区,如下:

      

      擦除分区:

      

      加入代码,自动执行分区的两条命令:

     1 static int run_main_loop(void)
     2 {
     3 #ifdef CONFIG_SANDBOX
     4     sandbox_main_loop_init();
     5 #endif
     6  //   mtdparts_init();                    /* 分区命令初始化 */
     7     run_command("mtdparts default",0);    /* 自动执行分区命令 */
     8     /* main_loop() can return to retry autoboot, if so just run it again */
     9     for (;;)
    10         main_loop();
    11     return 0;
    12 }

      编译运行就可以看到效果了。

    三、加入kernel启动命令行

      就两条命令:

      

      执行bootm就可以启动内核了

      

  • 相关阅读:
    简单了解enum
    PowerDesigner CDM 生成PDM时,外键的命名规则
    HADOOP docker(五):hadoop用户代理 Proxy user
    记一次云安全的安全事件应急响应
    docker学习笔记--重基础使用
    Elasticsearch学习随笔(二)-- Index 和 Doc 查询新建API总结
    Elasticsearch学习随笔(一)--原理理解与5.0核心插件部署过程
    ntopng-一款流量审计框架的安装以及应用
    Suricata规则编写——常用关键字
    浅谈运维中的安全问题-FTP篇
  • 原文地址:https://www.cnblogs.com/kele-dad/p/7074422.html
Copyright © 2020-2023  润新知