yystju 发表于 2010-12-22 14:47:13

linux DNW2 中的checksum问题。

使用上了DNW2,终于不用起windows的VM了。不过这个工具总报checksum不符。想到代码里除了数据还有10byte的内容,而文件大小还有RAM_BASE占了8个byte, 所以估计最后两个字节是校验码。

一开始想当然的认为是crc16,结果不是。于是开始猜,其实应该读读uboot代码的,不过老实说猜出来的好玩儿。我把100个字节的0x01放上去,结果checksum是100, 于是以为是直接加法。结果不对。然后发现100个0x02的checksum不是200而是100.然后100个0x04放上去是直接加和。所以怀疑是奇偶位分开求和的。

最后发现是每个byte的奇偶位分开求和然后求或的。所以添加以下的代码到dnw2代码的prepare_write_buf函数中。
============================
    u_int16_t checksum = 0;
    u_int16_t checksumOdd = 0;
    u_int16_t checksumEven = 0;
   
    for(i = 0; i < fs.st_size; ++i) {
      checksumOdd += (0xaa & (((char *)write_buf) + 8));
      checksumEven += (0x55 & (((char *)write_buf) + 8));
    }
   
    checksum = checksumOdd | checksumEven;

    printf("checksum : 0x%x\n", checksum);

    *((u_int16_t *)(write_buf + fs.st_size + 8)) = checksum;
-------------------------------------------------

另外从"http://code.google.com/p/am8/downloads/detail?name=dnw2.tar&can=2&q=label:Linux" 这里下载的代码的USB设备的设备号和vendor号都是对的。但是怀疑应该不是给OK6410改的, RAM_BASE不一样。这个需要自己改一下。

我用了下应该是正确的了。

yystju 发表于 2010-12-30 00:46:44

声明下:这个代码仍然不对。在部分情况下正确,部分不正确。有空我再搞搞.
页: [1]
查看完整版本: linux DNW2 中的checksum问题。