* |----------------------------------------------------------------|
* | ubo-header-signature(256) |
* |----------------------------------------------------------------|
* | ubo-header(64) |
* |----------------------------------------------------------------|
* | payload |
* |----------------------------------------------------------------|
* | ctrdata(solution dependent length) |
* |----------------------------------------------------------------|
* | signature(256) |
* |----------------------------------------------------------------|
*
* image_get_data_size(ubo-header) = LengthOf(payload)
*
* ubo-header-signature = SignatureOf(ubo-header)
* KeyOf(ubo-header-signature) = ABL_RSA_PKx
*
* signature = SignatureOf(payload(clear) + ctrdata)
* KeyOf(signature) = ABL_RSA_PKx
3922 OTP mapping路径
\\alinet\tpe\DMS\STB\STB_Project\Fuse_setting\C3922
###########################
\\alinet\tpe\DMS\STB\STB_Project\Fuse_setting\C3922 C3922_OTP_Mapping_Table_20170914.xls
//depot/IC_Support/OTP/ALiOTP_Tool_Release/OTP_Control_Modify/otp_sysctrl_r.exe
if [ "$BR2_TARGET_GENERICFS_P1_ENCRYPT_BY_UK" != "ABL_AES_NONE" ];then
message "encrypt boot code area: ====>"
cd $TEMPDIR
cp ${TEMPDIR}/bl.in ${TEMPDIR}/boot_total_area_clear.abs
cp ${TEMPDIR}/bl.in ${TEMPDIR}/boot_total_area_encrypt.abs
cp ${TEMPDIR}/boot_total_area_encrypt.abs ./../
cd ..
./tools/bl_tool BL_Encrypted_M3755.cmd
cp ./boot_total_area_encrypt.abs ${TEMPDIR}/boot_total_area_encrypt.abs
cp ${TEMPDIR}/boot_total_area_encrypt.abs ${TEMPDIR}/bl.in
echo -e "\033[44;31;4;5m|->boot_total_area.abs<-|\033[0m encrypt Done!"
[ $? -ne 0 ] && message "($BASH_SOURCE:$FUNCNAME:$LINENO) Error!" && exit 1
fi
ret=$?
if [ $ret != 0 ]; then
echo "$0 with error[$ret]"
exit 1
fi
//depot/Documents/cas/Chip_Level/Riscure/M3755/
//depot/Documents/S0000/S5000/Bootrom/Bootrom0_Design/C3503D_BootRom_0_Datasheet_V1.0.docx
typedef struct{
unsigned long id;
unsigned long len;
unsigned long offset;
unsigned long crc;
unsigned char name[16];
unsigned char version[16];
unsigned char time[16];
unsigned char reserved[64];
}CHUNK_HEADER;
block_len = sto_fetch_long(ota_offset + CHUNK_LENGTH) - CHUNK_HEADER_SIZE + CHUNK_NAME;
得到block_len 就是和下面的接口是一样的。工具先剪掉16字节,然后处理去拿,拿完之后再加上16字节。
ret = bl_get_chunk_len(chid, &block_addr, &block_len);
这个接口,拿到的数据就是正常的长度。
#define ABL_DUMP(prompt, data, len) \
do{ \
int i, l=(int)(len); \
printf("\033[0;32;32m%s\033[m\n",prompt); \
for(i=0; i<l; i++){ \
printf("0x%02X,",*(u_char*)((unsigned int)data+i)); \
if((i+1)%16==0) \
printf("\n"); \
} \
if((i)%16==0) \
printf("\n"); \
else \
printf("\n"); \
}while(0)
#else
#define ABL_DUMP(fmt, args...) do {} while (0)
#endif
dd if=product_sabbat_dual_main.abs of=main.abs bs=1k skip=2111 count=1650
比如 你要提取product_sabbat_dual.abs 当中的maincode abs
bs:一个block的大小
skip: 从文件的开头,跳过多少个 bs
count :要提取的长度
dd if=product_sabbat_dual_main.abs of=main.abs bs=1k skip=2111 count=1650
dd命令中seek和skip的用法
dd命令中seek和skip用法,感兴趣的朋友可以参考下。
假如有一个文件abc.gz,大小为83456k,我想用dd命令实现如下备份 结果:首先将备份分成三个部分,第一部分为备份文件abc.gz的前10000k,第二部分为中间的70000k,最后备份后面的3456k.
备份方法如下三条命令:
复制代码 代码如下:
dd if=abc.gz of=abc.gz.bak1 bs=1k count=10000
dd if=abc.gz of=abc.gz.bak2 bs=1k skip=10000 count=70000
dd if=abc.gz of=abc.gz.bak3 bs=1k skip=80000
恢复方法如下:
复制代码 代码如下:
dd if=abc.gz.bak1 of=abc.gz
dd if=abc.gz.bak2 of=abc.gz bs=1k seek=10000
dd if=abc.gz.bak3 of=abc.gz bs=1k seek=80000
这时查看一下恢复的文件将和原来的文件一模一样,说明备份成功了。
说明:
skip=xxx是在备份时对if 后面的部分也就是原文件跳过多少块再开始备份;
seek=xxx则是在备份时对of 后面的部分也就是目标文件跳过多少块再开始写。
具体事例见:
product_sabbat_dual_main.abs 只有对maincode 进行了签名,没有加密,你想单独提取带签名的maincode的chunk
从开头 跳过 2112*1024 = 2162688 = 0x210000
maincode 加上chunk头,再加上签名一共 0x19AEE0 因为按照1K为单位进行提取的,
所以提取 0x19B000 = 1683456 /1024 =1644
dd if=product_sabbat_dual_main.abs of=main_test.abs bs=1k skip=2112 count=1644
#######################################################################
typedef struct{
unsigned long id; --chunk id 4byte 09 F6 01 00
unsigned long len; --chunk len 4byte,实际的数据段大小,00 00 00 70 实际的数据的长度,有chunck header,没有签名
unsigned long offset; --chunk offset 4byte,整个chunk分配的大小 00 00 02 00,也就是这个地方放着给这个chunk的的大小。offset = sto_fetch_long(addr + CHUNK_OFFSET),就能够得到这个chunk的大小。
unsigned long crc; --chunk crc 4byte, crc校验,4E 43 52 43
unsigned char name[16]; --chunk 名字,不能太长
unsigned char version[16];版本号
unsigned char time[16];日期
unsigned char reserved[64];预留的
}CHUNK_HEADER;
4*4 + 3*16 + 64 = 128
addr:0x0005fe00,id:0x09f60100,len:0x00000070,offset:0x00000200, crc:0x4e435243,
addr:0x00060000,id:0x01fe0101,len:0x001cb896,offset:0x0024c000, crc:0x07fd289c,
###############################################
09 F6 01 00 00 00 00 70 00 00 02 00 4E 43 52 43
48 44 43 50 4B 65 79 00 FF FF FF FF FF FF FF FF 名字
30 30 30 30 30 30 30 31 00 FF FF FF FF FF FF FF 版本
32 30 31 35 2D 30 39 2D 32 34 00 FF FF FF FF FF 日期
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 预留
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
###############################################
[File]
id=0x09F60100
offset=0x00200
file=empty_hdcp.key
NCRC = "NCRC"
name="HDCPKey"
ver="00000001"
time=2015.11.17
#################################
ret = bl_get_chunk_len(chid, &block_addr, &block_len);
block_addr 在flash上面的地址,位置
block_len 在flash上面的实际内容,裸数据的大小。
sto_get_data(sto_dev, main_decrypted, block_addr - CHUNK_HEADER_SIZE, CHUNK_HEADER_SIZE)
block_addr - CHUNK_HEADER_SIZE 去拿数据的时候,给入去掉chunk头的大小,因为去拿的时候,包括头了,内存已经有头了
就是默认是连头一起拿的,可以读取main_decrypted地址上面的数据,查看,main_decrypted所在的位置开始的地方是chunk头的数据。
data_id = sto_fetch_long((UINT32)pointer + CHUNK_ID);拿chunk的id号
data_len = sto_fetch_long((UINT32)pointer + CHUNK_LENGTH);拿chunk的长度,包括头和裸数据
data_off = sto_fetch_long((UINT32)pointer + CHUNK_OFFSET);拿chunk的offset分配的大小
data_crc = sto_fetch_long((UINT32)pointer + CHUNK_CRC);拿chunk的crc
###############@@@@ 7.xbranch uboot启动流程。
void main_loop(void)
#if defined(CONFIG_ALI_PLATFORM) && defined(CONFIG_ALI_AUTOBOOT_APP)
s = ali_autoboot_command();
abl_autoboot_app();
#if defined(CONFIG_ENABLE_SHOW_OSD)
//show osd
abl_app_show_osd,// show logo and ....入口。
#endif
#endif
联系客服