- 积分
- 55
贡献1
飞刀0 FD
注册时间2010-11-14
在线时间14 小时
扫一扫,手机访问本帖
|
使用上了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不一样。这个需要自己改一下。
我用了下应该是正确的了。 |
|