(以下为飞天的研究成果)
华亚机的通信协议如下:
一、连机
1.发送c ("\x63\x0A")
2.等待收到机顶盒初始化信息,可以判断是否收到"BL: Initialize"
3.收到"BL: Initialize"立即发送up命令("\x75\x70\x0A"),这一步如果过了则不能连机成功
4.机顶盒返回 up ("\x75\x70\x0A")
5.发送. ("\x1E")
6.接收. ("\x1E")
二、读数据
1.发送- ("0x2D")
2.发送读的地址,占四个字节,读从0xBFC00000开始
3.发送读的长度,占两个字节("\x00\x04")
4.接收从机顶盒发送来的数据,读的长度+4个字节,后四个字节是校验
重复第一步直到读完数据
三、写数据
步骤A:
发送 解压的BURN代码,到内存地址0x80001000
步骤B:发完之后直接发送BIN文件数据
发送数据开始地址0x80080000
1.发送< ("0x3C")
2.发送写的地址,占四个字节
3.发送写的长度,占两个字节("\x00\x04")
4.发送要刷写的数据,长度和上面定义的长度一样
5.机顶盒返回写入数据的校验,4个字节
重复第一步直到写完数据
步骤C:
1.发送 3C 目标地址 长度 内存中要复制的开始地址
3C
00 01 00 A0
04 00
00 00 08 80
2.接收CRC
3.发送 3C 目标地址 长度 FLASH地址偏移长度
3C
04 01 00 A0
04 00
00 00 00 00
4.接收CRC
5.发送 3C 目标地址 长度 要写的长度,和发送的数据长度相同
3C
08 01 00 A0
04 00
00 00 10 00
6.接收CRC
7.运行地址中的代码
发送 4B 00 10 00 80[color=red][/color]
下面附上C++的实现代码:
char data[20]={0};
nLen=0x400;
switch (ConnectStep)
{
case 0:
Comm_.Read(data,1);
if(memcmp(data,"\x3A",1)==0 || memcmp(data,"\x3B",1))
{
Comm_.Close();
Comm_.Open(nCom, nBaudRate,EVENPARITY);
Comm_.Write("\x75\x70\x0A",3);
ConnectStep++;
break;
}
Comm_.Write("\x63\x0A",2);
break;
case 1:
{
Comm_.Read(data,5);
if(memcmp(data,"\x75\x70\x0A",3)==0)
{
Sleep(200);
Comm_.Write("\x1E",1);
ConnectStep++;
}
break;
}
case 2:
Comm_.Read(data,1);
if(memcmp(data,"\x1E",1)==0)
{
ConnectStep++;
if(bReadOp)
{
AddText("已经连接上机顶盒,开始读取数据...\r\n");
nAddr=nReadStart;
memcpy(pLength,&nLength,2);
memcpy(pAddr,&nAddr,4);
memcpy(pLength,&nLen,2);
Comm_.Write("\x2D",1);
Comm_.Write((char *)pAddr,4);
Comm_.Write((char *)pLength,2);
}
else
{
AddText("已经连接上机顶盒,开始发送BURN代码...\r\n");
unsigned char cmd[7]={0};
nAddr=nBootStart;
cmd[0]=0x3C;
memcpy(&cmd[1],&nAddr,4);
memcpy(&cmd[5],&nLen,2);
Comm_.Write(cmd,7);
unsigned char *pReadData;
pReadData=pBootData+nBootToalReaded;
nBootToalReaded+=0x400;
Comm_.Write(pReadData,0x400);
nCRC32=crc32_mpeg(pReadData,0x400);
nAddr+=0x400;
}
}
break;
default:
break;
}
稍后上传其它内容,敬请关注
本人没有时间和技术完成全部,请高手完成了发我一份源代码,我只要DELPHI的源代码,多谢!
注:全是理论上的半成品,绝对不能用的噢!