赞助论坛
  • 4312阅读
  • 0回复

我的 Hi2023 实验数据-(4)实验CRC数据 [复制链接]

楼层直达
发帖
30
精华
0
金币
45
威望
0
贡献
0
好评
0
注册
2010-01-07
楼主    zhanggx01 发表于: 2010-01-13 11:23:30 
【补充四:实验CRC数据的方法】
前面我所实验中有个运气因素,就是改了节目表参数后,机顶盒仍然可看,但有许多机顶盒中你改了节目参数后,上电后盒子要重新搜索中,从而盒子又回到了12个神语台。这说明可能在这些盒子中有校验机制。下来我们来作一下这种机制的实验。
[ 以下感谢和我实验的网友:我只提出方案,网友们测试的――再次感谢!! ]
如果是有校验,要知道的是以下几个问题
1、在哪里校验,是程序区?还是数据区?如果是数据区,是数据区的哪一部分.
2、如果是校验,采用校验机制是什么,是CRC中的哪种方式?

猜测,以下均为猜测中……..希望对感兴趣的朋友有用
对表的CRC校验一般是表校验法:
首先要有一个基表 crc16_table[] 或 crc32_table[], 这个表是固定不变的表,用它做为CRC的基础
再有要有是算法
CRC_crc16Cal(U8 *buffer, U32 size, U16 *CRC16)
{   U16 crc16 = 0x0000;   //或是0xFFFF
  U32 i;
  for (i = 0; i < size; i++)
    crc16 = (crc16 << 8 ) ^ crc16_table[((crc16 >> 8) ^ *buffer++) & 0xFF];
  *CRC16 = crc16;
}

CRC_crc32Cal(U8 * buffer, U32 size, U32 * CRC32)
{   U32 crc32 = 0xFFFFFFFF;     //或是0x00000000
  U32 i,temp1,temp2,temp3;
  for (i = 0; i < size; i++)
  {
    temp1 = (crc32 << 8);
    temp2 = crc32_table[((crc32 >> 24) ^ *buffer) & 0xFF];
    temp3 = temp1 ^ temp2;
    crc32 = (crc32 << 8) ^ crc32_table[((crc32 >> 24) ^ *buffer++) & 0xFF];
  }
  *CRC32 = crc32;
}

需要校验的地方有:
取NIT表时校验: GetNit(),在这里对PID进行校验 和存的 PID比较
取PMT表时校验: GetPmt(),
好复杂哦…..不找了; 但是它校完了总会再写回flash的
最后干脆把 SPIFlash 的第3脚一直拉为高电平算了,让flash 禁写,只能读出不能写
呵呵……………………,好了,下来还是改开机LOGO吧

以前文章请阅:
[url]http://bbs.lcdhome.net/read-htm-tid-14410-fpage-4-toread--page-1.html[/url]

本次文章见下附件: