首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

直接调用libusb库实现S12x解锁

直接调用libusb库实现S12x解锁

本帖最后由 HotCat 于 2010-1-18 16:56 编辑

本人是菜鸟,为了玩汽车外挂电脑调喷油,上了飞思卡尔的贼船。用的TBDML + codewarrior 5.0,上星期下载程序,无意间把地址0xff0f地址当成了向量地址,程序一烧上去,BDM就提示连不上了。在论坛上找了好多资料,说是被锁上了,在win7下按照步骤解锁一次都没有成功,气得吐血。拿到卖板子的地方去搞,他们也是搞了好久才搞好,折腾半天,还怀疑过板子有问题。我拿回来换XP,把芯片锁了后再unsecure,居然不是每次都能成功,有时候成功,有时候失败。这个问题不解决以后还怎么玩呢,毕竟是用在汽车发动机上的东西,不能乱来啊。还好我是搞软件的,拿出bus hound分析PC和TBDML的通讯协议,然后在tbdml.dll源代码基础上改一改,居然很好用。在win7下程序执行不到2秒钟unsecure就完成了。现在把部分代码贴上来

  1. int main()
  2. {
  3. int devs;
  4. tbdml_usb_init();
  5. devs = tbdml_init();
  6. printf("tbdml_init, found %d devices\n", devs);
  7. if(!devs)
  8.   return 0;
  9. tbdml_open(0);
  10. // set target 0x1e
  11. tbdml_set_target_type(0);
  12. // get target speed
  13. tbdml_target_sync();
  14. // set bdm interface bit rate
  15. tbdml_set_speed(16.00);
  16. // reset to special mode
  17. tbdml_target_reset(0);
  18. // get target speed
  19. tbdml_get_speed();
  20. // disable cop
  21. tbdml_write_byte(0x3c, 0);
  22. tbdml_write_byte(0x100, 0x11); // clock divider
  23. tbdml_write_byte(0x106, 0x30); // clear any error flags
  24. tbdml_write_byte(0x102, 0x00); // CCOBIX = 0
  25. tbdml_write_byte(0x10a, 0x08); // 0x08 Erase All Blocks
  26. tbdml_write_byte(0x106, 0x80); // launch command
  27. Sleep(1000);
  28. tbdml_write_byte(0x100, 0x11); // clock divider
  29. tbdml_write_byte(0x106, 0x30); // clear any error flags
  30. tbdml_write_byte(0x102, 0x00); // CCOBIX = 0
  31. tbdml_write_byte(0x10a, 0x06); // 0x06 Program P-Flash
  32. tbdml_write_byte(0x10b, 0x7f); // identify P-Flash
  33. tbdml_write_byte(0x102, 0x01); // CCOBIX = 1
  34. tbdml_write_byte(0x10a, 0xff); // P-Flash address hi
  35. tbdml_write_byte(0x10b, 0x08); // P-Flash address lo
  36. tbdml_write_byte(0x102, 0x02); // CCOBIX = 2
  37. tbdml_write_byte(0x10a, 0xff); // Word 0 program value hi
  38. tbdml_write_byte(0x10b, 0xff); // Word 0 program value lo
  39. tbdml_write_byte(0x102, 0x03); // CCOBIX = 3
  40. tbdml_write_byte(0x10a, 0xff); // Word 1 program value hi
  41. tbdml_write_byte(0x10b, 0xff); // Word 1 program value lo
  42. tbdml_write_byte(0x102, 0x04); // CCOBIX = 4
  43. tbdml_write_byte(0x10a, 0xff); // Word 2 program value hi
  44. tbdml_write_byte(0x10b, 0xff); // Word 2 program value lo
  45. tbdml_write_byte(0x102, 0x05); // CCOBIX = 5
  46. tbdml_write_byte(0x10a, 0xff); // Word 3 program value hi
  47. tbdml_write_byte(0x10b, 0xfe); // Flash Options/Security Byte
  48. tbdml_write_byte(0x106, 0x80); // launch command

  49. return 0;
  50. }
复制代码
注意,在secure状态下,下面三个函数

tbdml_set_target_type(0)
tbdml_target_sync()
tbdml_set_speed(16.00);

都会返回失败,不用理它,继续执行

当然这段代码是假设没有对Flash进行保护,如果Flash高地址被保护了,就需要先去掉保护,然后再mass erase。具体操作请参见AN2400,里面对Flash操作讲得很详细

另外编译的时候要用MingW+mSYS来编译,我是偷懒直接在libusb源代码的Makefile文件上改了改把要编译的代码加进去。我试过用VC2005调用libusb老是symbol有问题,一调用usb函数内存就崩了。

附件是libusb + tbdml源码,我是在tbdml源码上改的,在tests\tbdml目录下,然后修改了主Makefile,有MingW+mSYS环境的话就直接make,完了后在Makefile目录下生成tbdml.exe

libusb-win32-src-0.1.12.2.rar (155.77 KB)
1

评分次数

  • yumuzi

看的出来你对飞思卡尔、汽车电子很精通,而且发帖的格式很严谨。
虽然是新注册的用户,但还是想真诚的邀请你做版主。
————
如果你愿意,可联系我:
   QQ”30995614
   E-mail" dongjw@eccn.com

                                        论坛管理员:yumuzi
                                               2010.1.19
返回列表