ajian
驱动牛犊
驱动牛犊
  • 注册日期2001-08-21
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3316回复:17

atuhappy,求教配置ROM的CRC校验算法

楼主#
更多 发布于:2002-12-31 10:14
求教关于配置ROM的CRC校验问题:
我目前想编程序计算一下华硕出的一张卡PCI-1394C,它使用的是tsb43aa22芯片,我读出了ConfigROM的头37个Quadlets如下,
             0x7d5b2404,
             0x34393331,      
             0x02a000f0,
             0x00e01800,  
             0x02007dbc,
             0xbfcb0400,
             0xc083000c,
             0xf2500003,
             0x07000081,
             0x010000d1,
             0xe9ad0400,
             0xf2500012,
             0x00000013,
             0x00000017,
             0x0a000081,
             0x057c0800,
             0x00000080,
             0x09040000,
             0x0069004d,
             0x00720063,
             0x0073006f,
             0x0066006f,
             0x00000000,
             0x7dfc0c00,
             0x00000080,
             0x09040000,
             0x00330031,
             0x00340039,
             0x00500020,
             0x00000043,
             0x00000000,
             0x00000000,
             0x00000000,
             0x00000000,
             0x00000000,
             0x00000000,
             0x00000000
由第一个Quadlet:0x7d5b2404,知道info_length=0x04,
crc_length=0x24,rom_crc_value=0x7d5b没错吧,可是我就是用ISO/IEC-13213,8.1.5上的crc算法得不到正确结果,用你在版面上提供的算法也没得到正确结果,请问,问题出在哪里?请赐教!
kexin
ARRON
驱动老牛
驱动老牛
  • 注册日期2002-03-18
  • 最后登录2010-05-02
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-01 20:41
:O
你算的校验值是7d5b还是5b7d芽?
只用算
0x34393331,
0x02a000f0,
0x00e01800,
0x02007dbc
的校验值就行乐crc-16
ajian
驱动牛犊
驱动牛犊
  • 注册日期2001-08-21
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-02 09:45
请问,你用哪个CRC16算法,有没有验证得到正确结果过?
如果有的话,请贴出你的CRC16校验函数,非常感谢!
kexin
ARRON
驱动老牛
驱动老牛
  • 注册日期2002-03-18
  • 最后登录2010-05-02
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-02 09:52
请问,你用哪个CRC16算法,有没有验证得到正确结果过?
如果有的话,请贴出你的CRC16校验函数,非常感谢!

呼呼,crc-16有很多吗?我验证国亚
ajian
驱动牛犊
驱动牛犊
  • 注册日期2001-08-21
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-02 10:06
高手ARRON,
    请贴出你的函数吧,我实在不知问题出在哪里,我用的是ISO/IEC 13213上的函数,居然算出的CRC值与他给出的不同!但是,我必须要算出CRC值,才能做下一步的工作。请帮帮忙!
kexin
ARRON
驱动老牛
驱动老牛
  • 注册日期2002-03-18
  • 最后登录2010-05-02
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-01-02 10:09
高手ARRON,
    请贴出你的函数吧,我实在不知问题出在哪里,我用的是ISO/IEC 13213上的函数,居然算出的CRC值与他给出的不同!但是,我必须要算出CRC值,才能做下一步的工作。请帮帮忙!

呼呼,我用的也是别人的程序压:(
ARRON
驱动老牛
驱动老牛
  • 注册日期2002-03-18
  • 最后登录2010-05-02
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-01-02 10:20
WORD cal_crc(BYTE *ptr, BYTE len) {
  BYTE i;
  WORD crc=0;
  while(len--!=0) {
    for(i=0x80; i!=0; i/=2) {
      if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;}   /* 余式CRC乘以2再求CRC  */
        else crc*=2;
       if((*ptr&i)!=0) crc^=0x1021;                /* 再加上本位的CRC */
    }
    ptr++;
  }
  return(crc);
}


试试?
ARRON
驱动老牛
驱动老牛
  • 注册日期2002-03-18
  • 最后登录2010-05-02
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-01-02 10:42
你的一个crc算的是多少芽
ajian
驱动牛犊
驱动牛犊
  • 注册日期2001-08-21
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-01-02 10:50
#include <stdio.h>
#include <windows.h>

WORD cal_crc(BYTE *ptr, BYTE len)
{
BYTE i;
WORD crc=0;
while(len--!=0)
{
for(i=0x80; i!=0; i/=2)
{
if((crc&0x8000)!=0)
{
crc*=2; crc^=0x1021;/* 余式CRC乘以2再求CRC */
}
else
{
crc*=2;
}
if((*ptr&i)!=0) crc^=0x1021; /* 再加上本位的CRC */
}
ptr++;
}
return(crc);
}

void main(void)
{
BYTE DBigbuf[16] = {0x31,0x33,0x39,0x34,
0xf0,0x00,0xa0,0x02,
0x00,0x18,0xe0,0x00,
0xbc,0x7d,0x00,0x02
};

BYTE DLittlebuf[16]= {0x34,0x39,0x33,0x31,
 0x02,0xa0,0x00,0xf0,
 0x00,0xe0,0x18,0x00,
                          0x02,0x00,0x7d,0xbc
};
WORD    BYcrc;

BYcrc = cal_crc(DBigbuf,16);
printf(\" BYcrc = 0x%x\\n\",BYcrc);

return;
}

 BYcrc = 0x169b
Press any key to continue
用你的函数得到的结果如上,怎么还是不对阿?
kexin
ARRON
驱动老牛
驱动老牛
  • 注册日期2002-03-18
  • 最后登录2010-05-02
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-01-02 13:22
呼呼,我用的就是这个算法算出的crc,计算机可以找到设备芽 :o
ajian
驱动牛犊
驱动牛犊
  • 注册日期2001-08-21
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-01-02 15:08
我希望的是用我在论坛上发的第一篇帖子上的数据,计算出一个CRC值,这个CRC值正好和TSB43AA22芯片配置ROM中所提供的值0x7d5b相同。
请问你计算得到的CRC值正好是0x7d5b吗?
kexin
ARRON
驱动老牛
驱动老牛
  • 注册日期2002-03-18
  • 最后登录2010-05-02
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-01-02 15:47
ajian你算这个已经被算出来得crc干什么用芽 :D
ajian
驱动牛犊
驱动牛犊
  • 注册日期2001-08-21
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-01-02 16:09
抱歉我没有说清楚。
是这样的,我们买了一张1394接口卡(卡1)做测试用,同时自己也做了一张1394接口卡(卡2),完成相同的功能。不过,不知道配置ROM该怎么写数据,所以先把卡1的配置ROM的数据读出来,作为写入卡2的参考。现在,把卡1用1394数据线接到1394口上,主机能够马上识别新硬件,但卡2插上去却没有反应。
根据1394规范,我们知道配置ROM头中的CRC值需要预先计算出来,然后填进去,这个CRC值当然要正确,数据传输才会正确。所以,在已知卡1的CRC值和配置ROM的数据的前提下,当然要验证一下1394规范所提供的CRC计算函数的正确性,偏偏计算出的CRC值和已知值不同,所以很郁闷阿!
kexin
ARRON
驱动老牛
驱动老牛
  • 注册日期2002-03-18
  • 最后登录2010-05-02
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-01-02 17:07
呼呼,是这个意思芽:D
你用的就是那个芯片吗?
你的“但卡2插上去却没有反应。”
是什么意思呀?我觉得如果是这样的话应该是pci的问题芽,
configrom是1394 的node之间用的,不是他的问题把
我的一点想法芽,也可能不对 :D
ajian
驱动牛犊
驱动牛犊
  • 注册日期2001-08-21
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-01-02 17:59
哦,我说错了,卡2并不是PCI卡,而是1394设备,它通过1394数据线与1394接口卡相连,用DDK提供的win1394.exe可以应该看到有两个结点,但事实上只看到了一个结点,原因是新1394设备的配置ROM为空!
kexin
ARRON
驱动老牛
驱动老牛
  • 注册日期2002-03-18
  • 最后登录2010-05-02
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-01-02 22:41
你的意思是说把tsb43ab22configrom中的数据写到你的芯片中,但是找不到设备,是不是?

你用的都是tsb43ab22吗?
你确认你的设备端控制芯片已经正常工作乐么? :D
ARRON
驱动老牛
驱动老牛
  • 注册日期2002-03-18
  • 最后登录2010-05-02
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-01-02 22:42
我的qq是13286632 :cool:
ajian
驱动牛犊
驱动牛犊
  • 注册日期2001-08-21
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-01-03 09:17
我的QQ:12014631
kexin
游客

返回顶部