DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5477|回复: 7
打印 上一主题 下一主题

[UUProg] uuprog开发教程:Bootloader应用讲解4

[复制链接]
跳转到指定楼层
楼主
发表于 2014-11-18 06:09:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
       经过前几次的讲解我们已经多bootloader有了个认识,现在我们需要把更新代码加到我们的上位机上就完美了。同时还要给我们的更新界面做得好看些,配合些提示功能,完善更新固件功能。

从界面可以看出和前一节的实现功能差别很大,除了升级(前面的烧写)功能,其他去哪了呢?难道不需要了吗?
当然不是的,那些功能是不能少的,联机-》擦除-》烧写-》校验,这些功能都集成到升级功能里了,也就是他一次实现了前面的几个功能而已。

直接资源图中的升级按钮就会定位到实现功能函数了,如上图。
下面是实现代码
  1. void CUpdateFW::OnOk()
  2. {
  3.         // TODO: Add your control notification handler code here
  4. //        BOOL m_bUpdate=0;
  5.         int pos=0;
  6.         CString sVersion;
  7.         m_cProgress.SetRange(0,100);
  8.         m_cProgress.SetPos(0);
  9.         
  10.         if(m_bUpdate)
  11.         {
  12.         parent->SetAppLog("固件已更新完成!请不要再重试");
  13. //        OnDestroy();
  14.         AfxMessageBox(_T("固件已更新完成,请不要再重试,可以关闭了"));
  15.                         return;
  16.         }
  17.         
  18.         //加载文件
  19.         if(!m_sFilename.IsEmpty())
  20.         {
  21.                 if(pFlash != NULL)
  22.                         delete pFlash;
  23.                 pFlash = new CFlashmem(512);
  24.                 pFlash->ReadFromIHEX(m_sFilename.GetBuffer(m_sFilename.GetLength()));
  25.                
  26.                 if(pFlash->GetPageToAddress(0x0000) != NULL || pFlash->GetPageToAddress(0x2600) != NULL)
  27.                 {
  28.         parent->SetAppLog("文件地址错误,文件地址需要从0x2800开始!");
  29.                         pFlash->ClearAll();
  30.                         return;
  31.                 }
  32.                 else
  33.                 {
  34.         parent->SetAppLog("打开文件成功:"+m_sFilename);
  35.                         pos = 5;
  36.                         m_cProgress.SetPos(pos);
  37.                 }
  38.         }
  39.         else
  40.         {
  41.         parent->SetAppLog("请先指定待更新的固件!");
  42.                         return;
  43.         }

  44.         //打开设备
  45.         if(mUsbhid.Open(0))
  46.         {
  47.         parent->SetAppLog("打开设备成功!");
  48.                 mUsbhid.GetVersion(&sVersion);
  49.         parent->SetAppLog("固件版本:"+sVersion);
  50.                         pos += 5;
  51.                         m_cProgress.SetPos(pos);
  52.         }
  53.         else
  54.         {
  55.         parent->SetAppLog("打开设备失败!请检查编程器是否已进入更新模式!");
  56.                         return;

  57.         }

  58.         //擦除
  59.         parent->SetAppLog("开始擦除设备...");
  60.         CString str;
  61.         if(pFlash == NULL)
  62.                 return;
  63.         CPage* pPage;
  64.         pPage = pFlash->GetFirstpage();
  65.         while (pPage != NULL) {
  66.                 if(mUsbhid.EraseSector(pPage->GetPageaddress()))
  67.                 {
  68.                         str.Format("%.4X ",pPage->GetPageaddress());
  69.         parent->SetAppLog(str +  "擦除成功!");
  70.                         pos += 1;
  71.                         m_cProgress.SetPos(pos);
  72.                 }
  73.                 else
  74.                 {
  75.                         str.Format("%.4X ",pPage->GetPageaddress());
  76.         parent->SetAppLog(str +  "擦除失败!");
  77.                         return;
  78.                 }
  79.                 pPage = pPage->GetNext();
  80.         }
  81. //                        m_cProgress.SetPos(30);
  82.         
  83.         //下载
  84.         parent->SetAppLog("开始下载固件...");
  85.         pPage = pFlash->GetFirstpage();
  86.         while (pPage != NULL) {
  87.                 if(mUsbhid.Write(pPage->GetPageaddress(),pPage->GetData(),pPage->GetPagesize()))
  88.                 {
  89.                         str.Format("%.4X ",pPage->GetPageaddress());
  90.         parent->SetAppLog(str + "下载成功!");
  91.                         pos += 1;
  92.                         m_cProgress.SetPos(pos);
  93.                 }
  94.                 else
  95.                 {
  96.                         str.Format("%.4X ",pPage->GetPageaddress());
  97.         parent->SetAppLog(str + "下载失败!");
  98.                         return;
  99.                 }
  100.                 pPage = pPage->GetNext();
  101.         }
  102.         
  103.         //校验
  104.         parent->SetAppLog("开始校验固件...");
  105.         pPage = pFlash->GetFirstpage();
  106.         while (pPage != NULL) {
  107.                 if(mUsbhid.Verify(pPage->GetPageaddress(),pPage->GetData(),pPage->GetPagesize()))
  108.                 {
  109.                         str.Format("%.4X ",pPage->GetPageaddress());
  110.         parent->SetAppLog(str +  "校验成功!");
  111.                         m_bUpdate=true;
  112.                         pos += 1;
  113.                         m_cProgress.SetPos(pos);
  114.                 }
  115.                 else
  116.                 {
  117.                         str.Format("%.4X ",pPage->GetPageaddress());
  118.         parent->SetAppLog(str +  "校验失败!");
  119.                         m_bUpdate=false;
  120.                         return;
  121.                 }
  122.                 pPage = pPage->GetNext();
  123.         }         
  124.         
  125.         //运行
  126.         if(m_bUpdate)
  127.         {
  128.         parent->SetAppLog("固件更新成功!重启编程器...");
  129.         mUsbhid.Run();
  130.         parent->SetAppLog("重启成功!");
  131.                         m_cProgress.SetPos(100);
  132.         AfxMessageBox(_T("更新完成"));
  133.         }
  134.         else
  135.         {
  136.         parent->SetAppLog("固件更新失败!");
  137.         }
  138. }
复制代码
      看着挺复杂的,其实就是把联机-》擦除-》烧写-》校验这几个功能分步实现了,程序中都有相应提示,某人一直在说我们的代码看不懂,没有说明,不知道他要的说明是什么样的,这样的说明还看不懂的话那我也没法了,要是要每句都要写个提示的话我也无能为力了,你帮下忙吧。
        当然用到的函数和相关文件都得移植过来,不然编译肯定过不了,怎么移植呢,这里就不是要具体讲解的内容了,这些技能是作为一个程序员必须掌握的基本工了。一直不成功的话就自己看看源代码,比较下和你的有什么区别吧。(这里有可能用到比较工具软件之类,我就直接用windiff)
      界面还有些提示功能,以便显示你当前硬件和固件的信息,以及要更新后的信息,这部分功能是比较人性化的,但是我们这里只是做了初始化,还没有完全实现,所以源代码中找不到太多代码,这部分功能会在固件开发中一起实现的。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏1 分享分享 支持支持 反对反对
沙发
发表于 2014-11-18 17:53:53 | 只看该作者
关键要,标出有些代码的,出处。和注明哪里是版主自己写的代码,最好标出,引用代码的出处。还有用到什么工具,这很重要。
板凳
 楼主| 发表于 2014-11-18 20:13:15 | 只看该作者
jy11 发表于 2014-11-18 17:53
关键要,标出有些代码的,出处。和注明哪里是版主自己写的代码,最好标出,引用代码的出处。还有用到什么工 ...

这个自己看吧,写了说明还不够还要出处,出处完了是不是还要写明每个语句的含义,写了含义是不是还要标注在书本哪页对不对,求学不是这么做的吧,不懂的自己补习下
地板
发表于 2014-11-18 22:11:21 | 只看该作者
群主,里面是不是有协议啊?有就给我们讲解一下。
5#
发表于 2014-11-19 09:25:03 | 只看该作者
看不懂的那些人,应该主要是C++本身不熟悉,找本书仔细看看再来看代码估计就好多了
6#
 楼主| 发表于 2014-11-19 09:40:47 | 只看该作者
dwl65 发表于 2014-11-18 22:11
群主,里面是不是有协议啊?有就给我们讲解一下。

所谓的协议也只不过是些代码,交流方式而已,不需要想的那么复杂,就和你两个瓶口对着倒水一个原理,想得越复杂只会给自己架个更高的槛而已
7#
发表于 2015-1-12 08:56:07 | 只看该作者
有些看不懂的,知道大概的意思就行了。因为只给出了实现功能的代码,依赖的库并没有给出。
8#
 楼主| 发表于 2015-1-12 10:06:44 | 只看该作者
bywqdq 发表于 2015-1-12 08:56
有些看不懂的,知道大概的意思就行了。因为只给出了实现功能的代码,依赖的库并没有给出。

都是自己写的代码,没有用到调用库
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-11-23 09:23 , 耗时 0.122333 秒, 25 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

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