海思Hiproinfo工具给自己的板子写mac地址(标记独立板子所用)

您所在的位置:网站首页 海思芯片hi3798烧写文件 海思Hiproinfo工具给自己的板子写mac地址(标记独立板子所用)

海思Hiproinfo工具给自己的板子写mac地址(标记独立板子所用)

2024-06-29 15:29| 来源: 网络整理| 查看: 265

  发下牢骚,海思的资料真是乱的可以。没有瑞芯微这么亲民,下边转入正题:

需求:要能给板子flash写入唯一MAC地址且能在安卓系统运行的时候读出来;

平台:cpu hi3798mv200;eMMC(作者用的是emmc)

实现原理:用Hiproinfo工具往deviceinfo区域写入私人订制的mac地址,比如11:22:33:44:55:66,然后在安卓系统中跑service读取出来另作它用;

实现步骤如下:

1.SDK里取出配置Hiproinfo工具(路径device/hisilicon/bigfish/sdk/tools/windows/HiProInfo/HiProInfo_en)放到windows环境去,注意这里最好用_en版本,不要_cn版本,本人吃过用不了的亏;

2.修改HiProInfo_en里的BurnConfig.ini文件,把“ProgrammerFileName = advca_programmer.bin”挡掉,不影响后边使用。另外“MacBurnAddress=0x1600000” 不要改动,不要自做聪明按照提示改成MacBurnAddress=0xc00000(其实这里SDK已经修改好了,只是

提示没修改,因为deviceinfo的起始地址是0x1600000!!!);

3.这时你的HiProInfo已经可以写MAC地址了,如图所示

4.板子接好串口,Hiproinfo工具按下“确定”按钮后,板子重新上电,烧写完成;具体步骤参考文档海思hi3798mv200之《量产烧写 使用指南》

5.在此顺便解释一下个人对Hiproinfo工具的理解,该工具应该是起动板子的fastboot,并且在fastboot阶段通过boot的命令把MAC地址写入0x1000000内存位置,把该位置的1个block(512字节)写入flash deviceinfo 起始地址0x16000000处;

 

 

下边是烧写完成后,Hiproinfo的log。

。。。略 Boot Env on eMMC     Env Offset:          0x00100000     Env Size:            0x00010000     Env Range:           0x00010000 start download process.

//写入11:22:33:44:55:66 (OK)

'mw.b 0x1000000 0xff 0x200' 命令返回成功!              ====》往内存0x1000000处以字节为单位写入0x200 个0xff

(OK)

'mw.l 0x1000000 0x323a3131 1' 命令返回成功!       ====》往内存0x1000000处以4个字节为单位 写入"11:2"

(OK)

'mw.l 0x1000004 0x33333a32 1' 命令返回成功!           ====》往内存0x1000004处以4个字节为单位 写入"2:33"  

(OK)

'mw.l 0x1000008 0x3a34343a 1' 命令返回成功!       ====》往内存0x1000000处以4个字节为单位 写入":44:"

(OK)

'mw.l 0x100000c 0x363a3535 1' 命令返回成功!       ====》往内存0x1000000处以4个字节为单位 写入"55:6"

(OK)

'mw.l 0x1000010 0x4d000036 1' 命令返回成功!       ====》往内存0x1000000处以4个字节为单位 写入"6"

(OK)

。。。。中间略过

'mw.l 0x100003c 0x3d5748 1' 命令返回成功!

MMC write: dev # 0, block # 4

5056, count 1 ... 1 blocks written: OK (OK)

'mmc write 0 0x1000000 0xb000 1' 命令返回成功!      ====》把内存地址0x1000000 长度为1*512大小的内容拷到第0个block偏移0xb000位置(具体我没搞懂,但实际位置应该是deviceinfo的起始地址0x16000000) 烧写成功!

6.安卓中读取MAC地址

使用java反射获取getDeviceinfo方法代码如下,具体反射如何使用参考巨人们的链接: 

 private void getBoxMacInfo(){         Class aClass = null;

        try {             aClass = Class.forName("com.hisilicon.android.hisysmanager.HiSysManager"); //获取到getDeviceinfo的类         } catch (ClassNotFoundException e) {             e.printStackTrace();             Log.e(TAG, "getBoxMacInfo: error!");         }

        Log.d(TAG, "getBoxMacInfo: getNAME" + aClass.getSimpleName()); //获取到getDeviceinfo的类的名字 //        Method[] methods = aClass.getMethods(); //        for(Method method: methods){ //            Log.d(TAG, "getBoxMacInfo: " + method.getName()); //        }

        Method mt = null;         try {             mt = aClass.getMethod("getDeviceinfo", int.class, int.class);         } catch (NoSuchMethodException e) {             e.printStackTrace();             Log.e(TAG, "getBoxMacInfo: getMethod error");         }

        try {             Log.d(TAG, "getBoxMacInfo: " + mt.invoke(aClass.newInstance(), 0, 512));//调用getDeviceinfo方法,打印MAC地址,即11:22:33:44:55:66 ,注意此处地址0是offset,512是长度         } catch (IllegalAccessException e) {             e.printStackTrace();         } catch (InvocationTargetException e) {             e.printStackTrace();         } catch (InstantiationException e) {             e.printStackTrace();         }     }

 

反射方法的使用参考:

1.Android Studio导入framework.jar等系统jar包方式https://blog.csdn.net/zhuzp_blog/article/details/51674468?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

但是里边要改正一下,不是compile files('libs/framwork.jar'),而是implementation files('libs/framework.jar')

补充:

Android framework编译出来的framework.jar和classes.jar的位置

为了能在android studio里使用framework层隐藏的接口,需要自己编译下framework的源码,得到framework.jar和classes.jar。具体路径如下:

如果编译debug版本:

src/out/target/product/projectXX/system/framewor framework.jar

如果是user版本:

src/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar

把classes.jar拷贝成framework.jar就可以了,。

 

另:class.forName( )方法中一定要填写完整类名(即包名+类名),即便该类与调用forName方法的类在同一包下,也需填写完整类名!

2.https://www.cnblogs.com/liweixml/p/11462813.html

3.https://blog.csdn.net/qq_39301804/article/details/78784887?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=12fd439f-e54b-48a1-b05c-55c600e04879&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

下图为系统中带hide的方法



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3