Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153790
  • 博文数量: 28
  • 博客积分: 1476
  • 博客等级: 上尉
  • 技术积分: 356
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-11 11:39
文章分类
文章存档

2011年(1)

2010年(18)

2009年(9)

我的朋友

分类:

2010-07-26 17:25:33

    经过一个月的时间终于把Android的fastboot移植号了,将这一个月的移植经历写一下。
    首先,我移植的这个fastboot在我的前面一个人已经弄了好长一段时间了,可当时比较急,于是只弄了一个简单版的USB自动更新,没有用到与fastboot协议相关的东西。但却给我后来的移植提供了很大帮助,要是没有他先前的努力,把USB驱动移植好了,那我可就要吃苦头了,所以先谢谢他了。
    其次,在移植中遇到的困难,由于以前没有弄过USB,只是看过一段时间的USB协议,但那是很久以前了,所以也忘得差不多了。没办法,只能先看两天的协议,所以头一个星期基本上就在看协议,然后抓包,然后在看协议,不断重复,直到熟悉USB设备上电时,主机与设备之间是怎么协商,然后通信的。第二周,被来打又临时叫去弄一个SD卡启动的东东,耽误了一星期,但是后来证明弄这个SD启动卡出来,为我后来的调试带来很大的方便。第三周,由于中断了一星期,于是又抓了一天包,看了一天。然后就开始看代码,慢慢的打开其中的调试信息,看了几天后,觉得原先移植的这个USB驱动,在协议部分的逻辑很混乱,所以自己重新从内核中又将中断处理这部分的代码移植了过来。到第四周前两天终于从设备上电到枚举都调通了,只差接受数据部分的逻辑了。这时大问题出现了,在上一篇文章中已经说过了,就是代码超出了256k,加的log太多,boot运行到一半就死了,经过在CSDN上与别人讨论,解决问题,就是从onenand中只复制了256k的代码,而我现在的代码已经超过了这个值,只要知道问题出现的地方后,改起来就方便了。这里真多谢之前弄了个SD的启动卡,因为手里没仿真器,要是boot死了,那就麻烦了,有了SD启动卡,只需5秒就可以回复boot。后来几天,数据部分也调通了,已经可以使用前一个同事弄的应用层的下载程序下载文件到板子中了,只差移植fastboot的代码了,协议部分的代码已经有了,只要能将它与USB驱动连接起来就行了。第五周,还号fastboot的协议不是很复杂,代码看起来也很顺,只需原boot已经有的功能,适当修改些代码就行了,所以移植也没有什么困难。最后出现的问题,下载速度超级慢,下一个2M的内核,下载了5分钟,无法忍受,由于使用的是虚拟机,所以第一直觉就是虚拟机的问题,但找了一台直接使用linux系统的机器,速度是快了不少,但还是很慢,第二直觉就想到可能是端点接受的包的大小太小,查代码得知,一个端点所接受的包的大小是512字节,用的是高速模式。又查手册得知,端点最大支持2047个字节,于是将其改为最大,运行后,XP直接死机,linux里不支持;然后在改为1024,XP下还是死机;linux下可以了;然后在试,在XP下,超过512就会死机,linux下超过1024就不支持。看来还是linux稳定,不会随便死机。最后决定还是改为512,慢一点也好,不要死机。绕了一圈又回来了;后来分析,boot不向内核,没有线程,而有突然想到,printf在内核里是要休眠的,因为执行时间比较长,于是就将所有的printf语句注销掉,在重新下载,这下好了,使用虚拟机,下载一个81M的文件系统使用了72秒,而直接使用linux系统的,只需36秒,不错!!在看fastboot部分的代码的时候发现一个问题,每次驱动接受一个包并读取到内存当中后,fastboot又在将这个包的内容复制到它自己的缓冲区,这不是多复制了一次吗?后来经测试,在boot中使用cp命令从一个缓冲区复制一个100M的内容到另一个缓冲区,在虚拟机下居然用了30多秒,不行啊,这效率也太低了,为何不将包的内容直接复制到fastboot的缓冲区呢?又修改代码,这部分代码不难,但比较难处理,应为还有一个临界值需要处理,当要下载的文件大小与端点能接受的包的大小取余时,不为0比较号处理,为0比较难处理。在这里转了2个工作日,还是转出来了。这次下载速度翻了一倍,虚拟机使用37秒,linux系统只使用10秒,爽啊!!!
      最后,USB协议本身不复杂,但是分类很多很杂,这一个月下来,弄的只是冰山一角。如果在配合内核一起,那就很庞大了,USB子系统恐怕也是linux驱动的众多子系统里其中之一最难搞的一个吧!!!fastboot协议在网上比较难找,我打个包供要学习的或正在弄这一不分的朋友学习学习。
      存在的问题,虽然移植好了,但还是有点问题:使用fastboot直接从内存启动时,系统启动到一半后,会不停的出现一个USB OTG的端点使用错误的log;而现将内核,ramdisk,文件系统下载并烧写到nand中,在从nand中启动时,就不会出现这个问题,这个问题还在解决当中。
      下一步,看看怎么弄一个DMA方式的,看看速度还会不会在提高了。

文件:fastboot协议.tar.gz
大小:14KB
下载:下载
阅读(7022) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

八颗牙齿2017-07-20 10:57:13

大牛,你好,这么久了也不知道还能否联系上你。想请教个问题,就是我现在想把android源码中的fastboot相关代码功能移植windows代码,改写成相关接口。最近看了看,能力有限,感觉工程量好大,有没有什么好的办法能快速转成windows所用的代码。