嵌入式爱好者

查看: 8850|回复: 1

linux DNW2 中的checksum问题。

[复制链接]

14

主题

54

帖子

55

积分

扫一扫,手机访问本帖
发表于 2010-12-22 14:47:13 | 显示全部楼层 |阅读模式
使用上了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)[i]);
        checksumEven += (0x55 & (((char *)write_buf) + 8)[i]);
    }
   
    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不一样。这个需要自己改一下。

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

使用道具 举报

14

主题

54

帖子

55

积分

 楼主| 发表于 2010-12-30 00:46:44 | 显示全部楼层
声明下:这个代码仍然不对。在部分情况下正确,部分不正确。有空我再搞搞.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-11-15 06:51

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表