platform:RK3399
OS:Android 7.1
参考:
1.比特人生 https://blog.csdn.net/ielife/article/details/86719313
2.KrisFei https://blog.csdn.net/kris_fei/article/details/79447343?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158883304619726869022990%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=158883304619726869022990&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v25-4
1. 概述
对于一台运行Android系统的终端设备,一般会有许多出厂就已经确定的属性,这些属性唯一且具有特殊的作用。其中SN,MAC,IMEI(有通信模块)是最基础的几个属性,这些属性一般在出厂之前就会使用工具写到设备中,和设备绑定。
1.1 SN号
SN码是Serial Number的缩写,有时也叫SerialNo,也就是产品序列号,产品序列是为了验证“产品的合法身份”而引入的一个概念,它是用来保障用户的正版权益,享受合法服务的;一套正版的产品只对应一组产品序列号。SN码别称:机器码、认证码、注册申请码等。
SN号可以根据产品要求或者公司统一的编码规范进行编码,但是Android仍然对SN号有一定的限制要求,具体要求如下:
1. 英文字符和数字(a~z,A~Z,0~9)
2. 6~20个字符
1.2 mac地址
MAC地址是一个用来确认网络设备位置的位址。在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC位址 。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。
网络设备制造商生产时烧录在网卡(Network lnterface Card)的EPROM中,所以如果网络设备制造商已经烧录好了MAC地址,那么我们就不需要再次烧录。如果没有提前烧录,那就需要采购MAC地址池并在生产时将MAC地址烧录到设备中。一般OEM工厂可以提供MAC地址。
终端设备常见的MAC地址有:WIFI MAC,LAN MAC,BT MAC;这个需要根据产品具体确定,比如有的产品就可能没有LAN MAC.相应的也不需要烧录LAN MAC。
2. 烧录及测试
瑞芯微提供写号工具,请联系FAE获取最新的写号工具,SDK旧版本的工具可能存在问题.
2.1 烧录
2.1.1 设备方式
两种设备模式: maskrom 和 loader 模式 maskrom 进入方式:短接 FLASH CLK 引脚,在该模式下面写号,必须要选择正确的 MiniLoaderAll.bin。 loader 进入方式:开机时候按住“音量+”或者 adb reboot loader 命令,在该模式下面写号, 设备必须是已经有烧写过固件。
2.1.2 写号模式
如果不清楚使用那种模式,可以逐一尝试.注意错误勾选可能导致写号失败.
2.1.3 配置
1.代码配置
diff
2.软件配置
写号工具支持同时写入 7 个项,其中五个是预定义的(ID 是固定的,不能修改),剩下两个 用户可以通过修改 ID 自定义写入。 uboot、内核是通过 ID 来区别用户写入的内容的。用户可以 选择三种输入方式写号: 1) 手动模式 直接在主界面从键盘或者扫描枪输入要写入的数据项。 2) 自增模式 用户设定起始项,前缀和后缀,按十进制,或者十六进制递增生成写入数据项。 3) 文件模式 从文件获取写入的数据项,如果勾选“Bin 文件”,则会把整个文件写入;不勾选的话,则把选 择的文件当做文本文件,一次写入一行.
2.1.3 烧录
配置完成后,在首页点击写入,等待设备写入成功即可.
2.2 查看
有多种方式查看是否写入成功.
方式一:使用上面的写号软件读取.
方式二:使用串口抓取开机log
#Boot ver: 0000-00-00#0.00
12345678 //SN号
normal boot.
checkKey
方法三:传给Kernel的启动参数
mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(trust),0x00002000@0x00006000(uboot_ro),0x00002000@0x00008000(trust_ro),0x00002000@0x0000A000(misc),0x00008000@0x0000C000(resource),0x0000C000@0x00014000(kernel),0x00010000@0x00020000(boot),0x00020000@0x00030000(recovery),0x00038000@0x00050000(backup),0x00040000@0x00088000(cache),0x00600000@0x000C8000(system),0x00008000@0x006C8000(metadata),0x00000040@0x006D0000(verity_mode),0x00002000@0x006D0040(reserved),0x00000400@0x006D2040(frp),-@0x006D2440(userdata) storagemedia=emmc androidboot.oem_unlocked=0 uboot_logo=0x02000000@0x7dc00000 loader.timestamp=2020-04-24_12:20:44 SecureBootCheckOk=0 androidboot.serialno=12345678
方法四:使用adb
#adb devices
12345678 device
方法五:查看系统属性
getprop ro.serialno
getprop ro.boot.serialno
2.3 有效情况
在不擦除flash的情况下,SN号均有效,具体场景见下表.
操作|SN有效情况 -|- 单分区烧录|有效 整包烧录|无效 OTA差分升级|有效 OTA整包升级|有效 擦除Flash后烧录|无效 恢复出厂设置|有效
3. 获取串号(SN)
APK:
android.os.Build.SERIAL
ro.boot.serialno:
/system/core/init/init.cpp:
static
通过cmdline获取串号ro.boot.serialno,cmdline见上一小节方法三:
androidboot.serialno=12345678
sys.serialno:
system/core/drmservice/drmservice.c
if
由于是写入的SN,所以从idb中获取SN.
ro.serialno:
init.rk30board.rc:
//运行drmservice
service drmservice /system/bin/drmserviceclass mainoneshot# set ro.serialno
on property:sys.serialno=*setprop ro.serialno ${sys.serialno}