阅读:3316回复:17
atuhappy,求教配置ROM的CRC校验算法
求教关于配置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算法得不到正确结果,用你在版面上提供的算法也没得到正确结果,请问,问题出在哪里?请赐教! |
|
|
沙发#
发布于:2003-01-01 20:41
:O
你算的校验值是7d5b还是5b7d芽? 只用算 0x34393331, 0x02a000f0, 0x00e01800, 0x02007dbc 的校验值就行乐crc-16 |
|
板凳#
发布于:2003-01-02 09:45
请问,你用哪个CRC16算法,有没有验证得到正确结果过?
如果有的话,请贴出你的CRC16校验函数,非常感谢! |
|
|
地板#
发布于:2003-01-02 09:52
请问,你用哪个CRC16算法,有没有验证得到正确结果过? 呼呼,crc-16有很多吗?我验证国亚 |
|
地下室#
发布于:2003-01-02 10:06
高手ARRON,
请贴出你的函数吧,我实在不知问题出在哪里,我用的是ISO/IEC 13213上的函数,居然算出的CRC值与他给出的不同!但是,我必须要算出CRC值,才能做下一步的工作。请帮帮忙! |
|
|
5楼#
发布于:2003-01-02 10:09
高手ARRON, 呼呼,我用的也是别人的程序压:( |
|
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); } 试试? |
|
7楼#
发布于:2003-01-02 10:42
你的一个crc算的是多少芽
|
|
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 用你的函数得到的结果如上,怎么还是不对阿? |
|
|
9楼#
发布于:2003-01-02 13:22
呼呼,我用的就是这个算法算出的crc,计算机可以找到设备芽 :o
|
|
10楼#
发布于:2003-01-02 15:08
我希望的是用我在论坛上发的第一篇帖子上的数据,计算出一个CRC值,这个CRC值正好和TSB43AA22芯片配置ROM中所提供的值0x7d5b相同。
请问你计算得到的CRC值正好是0x7d5b吗? |
|
|
11楼#
发布于:2003-01-02 15:47
ajian你算这个已经被算出来得crc干什么用芽 :D
|
|
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值和已知值不同,所以很郁闷阿! |
|
|
13楼#
发布于:2003-01-02 17:07
呼呼,是这个意思芽:D
你用的就是那个芯片吗? 你的“但卡2插上去却没有反应。” 是什么意思呀?我觉得如果是这样的话应该是pci的问题芽, configrom是1394 的node之间用的,不是他的问题把 我的一点想法芽,也可能不对 :D |
|
14楼#
发布于:2003-01-02 17:59
哦,我说错了,卡2并不是PCI卡,而是1394设备,它通过1394数据线与1394接口卡相连,用DDK提供的win1394.exe可以应该看到有两个结点,但事实上只看到了一个结点,原因是新1394设备的配置ROM为空!
|
|
|
15楼#
发布于:2003-01-02 22:41
你的意思是说把tsb43ab22configrom中的数据写到你的芯片中,但是找不到设备,是不是?
你用的都是tsb43ab22吗? 你确认你的设备端控制芯片已经正常工作乐么? :D |
|
16楼#
发布于:2003-01-02 22:42
我的qq是13286632 :cool:
|
|
17楼#
发布于:2003-01-03 09:17
我的QQ:12014631
|
|
|