firefly rk3288 解决刷入Linux固件后mac地址一样的问题

原理:使用cpuid生成mac地址

1、修改u-boot/net/eth_common.c里的eth_env_set_enetaddr函数为:

int eth_env_set_enetaddr(const char *name, const uchar *enetaddr)
{
        char buf[ARP_HLEN_ASCII + 1];
        sprintf(buf, "%pM", enetaddr);
		return env_set(name, buf);
}

2、修改u-boot/board/firefly/firefly-rk3288/firefly-rk3288.c里的setup_macaddr函数为:

void setup_macaddr(void)
{
#if CONFIG_IS_ENABLED(CMD_NET)
        int ret;
        const char *cpuid = env_get("cpuid#");
        u8 hash[SHA256_SUM_LEN];
        int size = sizeof(hash);
        u8 mac_addr[6];
        u8 mac1_addr[6];

        /* Only generate a MAC address, if none is set in the environment */
        //if (env_get("ethaddr"))
        //      return;

        if (!cpuid) {
                debug("%s: could not retrieve 'cpuid#'\n", __func__);
                return;
        }

        ret = hash_block("sha256", (void *)cpuid, strlen(cpuid), hash, &size);
        if (ret) {
                debug("%s: failed to calculate SHA256\n", __func__);
                return;
        }

        /* Copy 6 bytes of the hash to base the MAC address on */
        memcpy(mac_addr, hash, 6);

        /* Make this a valid MAC address and set it */
        mac_addr[0] &= 0xfe;  /* clear multicast bit */
        mac_addr[0] |= 0x02;  /* set local assignment bit (IEEE802) */
        eth_env_set_enetaddr("ethaddr", mac_addr);
        memcpy(mac1_addr, hash, 6);
        mac1_addr[5]++;
        eth_env_set_enetaddr("eth1addr", mac1_addr);
#endif

        return;
}

4、在u-boot/include/common.h里添加如下函数定义(我加在45行):

void setup_macaddr(void);

5、在u-boot/common/autoboot.c的autoboot_command函数入口,调用setup_macaddr函数:

void autoboot_command(const char *s)
{
        debug("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>");
        setup_macaddr();
        if (stored_bootdelay != -1 && s && !abortboot(stored_bootdelay)) {
#if defined(CONFIG_AUTOBOOT_KEYED) && !defined(CONFIG_AUTOBOOT_KEYED_CTRLC)
                int prev = disable_ctrlc(1);    /* disable Control C checking */
#endif

                run_command_list(s, -1, 0);
                autoboot_command_fail_handle();

#if defined(CONFIG_AUTOBOOT_KEYED) && !defined(CONFIG_AUTOBOOT_KEYED_CTRLC)
                disable_ctrlc(prev);    /* restore Control C checking */
#endif
        }

#ifdef CONFIG_MENUKEY
        if (menukey == CONFIG_MENUKEY) {
                s = env_get("menucmd");
                if (s)
                        run_command_list(s, -1, 0);
        }
#endif /* CONFIG_MENUKEY */
}

结束。

课程简述  Android是目前最为流行的移动操作系统之一,它的开发涉及到多个知识领域。本课程将深入介绍Android系统启动过程中的重要组成部分——init进程,并探讨与之相关的多项关键技术。我们还将提供实际的开发案例,以RK3399开发板为例,通过演示Android产品配置、init启动流程、selinux权限管理、init.rc启动脚本定制等实际案例,让学员深入理解这些技术在实际产品开发中的应用场景和实现方法,提高学员的实际开发能力和经验,从而更好地应对实际产品开发中遇到的问题和挑战。知识运用方向学习Android启动方面的知识,可以参与如下实际开发工作项:启动流程定制: 根据产品需求调整Android启动流程,包括修改init.rc脚本、修改启动顺序和等待时间、加入自定义服务等。属性系统定制: 通过Android属性系统定制化启动流程,例如增加产品版本信息、定制开机音量等。日志系统分析: 掌握日志的捕捉、分析和排错技术,在启动过程中,需要加入调试信息来方便开发人员进行调试,同时需要进行日志的优化,避免日志输出过多占用过多的系统资源。selinux安全策略定制:在Android系统中,selinux是一种安全机制,用于保护系统的敏感资源和数据。在实际开发中,可能需要对selinux策略进行定制,以确保系统的安全性和稳定性。课程内容主要内容简述1, RK3399 开发板操作这部分内容重点介绍如何在FIreFly开发板上将Android 10系统运行起来, 包含编译FireFly的Android源码下载和编译, 镜像烧录运行,内核和模块编译,以及RK3399内核启动init进程的过程。2, 产品定制这部分讲解获取到方案商或者原厂提供的源码后, 如何定制一个新的产品,产品配置文件和模型, 原始代码中的配置文件和定制化东西3, Android日志代码编之前讲过Android的日志系统, 并没涉及到代码编, 这个部分重点讲解C/C++, java代码编日志的API和代码4, 属性系统在Android中,属性使用的非常频繁的,可以用来作为进程间通信,也可以用于一些行为控制, 这个部分会重点介绍属性系统框架, API接口, 属性文件等知识点5,selinux进程对文件进行访问时,Android 4.3就开始集成了selinux权限管控, 如果需要启动某个脚本或者服务, selinux的配置就避免不了,并且Android8之后, Android系统对进程访问的权限管控的非常严格。6, init.rc脚本Android定义的一种脚本, 改脚本是有init进程启动, 是非常重要的一个脚本, 会包含系统中的其他很多脚本, 在我们系统开发时, 我们经常通过这个脚本进行一些定制化动作。7, init进程代码分析想要了解一个系统,就必须对源码进行分析和理解, 这个章节,带大家去跟读init进程代码, 这样,换了另外一个Android版本,完全就可以去读代码, 知道有什么变化。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值