tm4c dfu

设备固件升级设备类驱动程序

尽管USB设备固件升级功能主要由USB引导加载程序(引导USB)提供,希望支持DFU功能的应用程序应该在其配置描述符中公开这一点,并且能够接收来自主机的请求,指示它们应该切换到DFU模式以接收升级。DFU设备类支持这种运行时DFU功能,为应用程序提供了一种简单的方法,用于向主机指示它具有DFU功能,并指示正在请求基于USB的固件升级。设备类不常见,因为它必须用作组合设备的一部分。运行时DFU功能本身没有任何意义,因为它基本上只是DFU USB引导加载程序存在和可用的指示。支持DFU运行时设备类的任何设备也必须使用USB引导加载程序,因为它实现所有DFU模式操作并执行实际的升级操作。运行时设备类将两个部分添加到主应用程序的配置描述符中—一个DFU接口描述符和一个DFU功能描述符。从主机发送到DFU接口的标准DFU分离请求导致对客户端应用程序进行回调,指示它必须将控制权传输回USB引导加载程序(通过USBDDFUUpdateBegin()函数)。此函数从USB总线中删除应用程序的现有设备,然后重新进入引导加载程序,引导加载程序依次发布DFU模式描述符,并作为能够从主机下载或上载应用程序映像的纯DFU设备重新连接到总线。

使用DFU设备类

boot_demo_usb应用程序提供了一个使用设备固件升级类的应用程序示例。要在应用程序中支持DFU,请执行以下操作:

1。确保您的应用程序与USB引导加载程序(boot_USB)一起运行。这要求它链接到从用于构建引导加载程序的bl_config.h中定义的标签APP_START_address中定义的地址运行。通常,对于USB引导加载程序,这是0x1800。

2.按照原型向应用程序添加一个函数:

uint32_t dfudetachecallback(void*pvCBData,uint32_t ui32Event,uint32_t ui32MsgData,void*pvMsgData)

此函数只需要检查ui32Event,如果它是USBD_DFU_EVENT_DETACH,则通知应用程序主循环它应该退出并将控制权传递回USB引导加载程序进行准备固件升级。

3.在应用程序主循环中添加一种机制,以检测DFUDetachCallback函数中的信号集并调用USBDDFUUpdateBegin()函数。此函数整理并将控制权传递给引导加载程序。

4.定义tDFUInstance类型的结构,确保链接器将其放置在SRAM中。这被DFU类驱动程序用作工作区。

5.定义一个tUSBDFUDevice类型的结构,并初始化它以包含指向回调函数和实例数据工作区的指针。

DFU运行时接口初始化和自定义结构

tUSBDDFUDevice g_sDFUDevice =
{
DFUDetachCallback,
(void*)&g_sDFUDevice
};

6. Create an array of structures of type tCompositeEntry which define the individual device class
instances that are to be used in the composite device. A structure defining a composite device
containing a HID interface and the DFU runtime interface would look like the following:
//****************************************************************************
//
// The number of device class instances that this composite device uses.
//
//****************************************************************************
#define NUM_DEVICES  2
//****************************************************************************
//
// The array of devices supported by this composite device.
//
//****************************************************************************
tCompositeEntry g_psCompDevices[NUM_DEVICES];

6。创建tCompositeEntry类型的结构数组,该数组定义要在组合设备中使用的各个设备类实例。定义包含HID接口和DFU运行时接口的组合设备的结构如下所示:

//****************************************************************************
//此组合设备使用的设备类实例数。
//****************************************************************************
#define NUM_DEVICES  2
//****************************************************************************
此组合设备支持的设备数组
//****************************************************************************
tCompositeEntry g_psCompDevices[NUM_DEVICES];

7.定义复合设备类所需的附加结构和存储。对于上述HID/DFU设备,如下所示:

//****************************************************************************
//
//为顶级复合设备类分配设备数据
//
//****************************************************************************
tUSBDCompositeDevice g_sCompDevice =
{
//
// TI USBLib VID.
//
USB_VID_TI_1CBE,
//
//复合HID/DFU设备的PID。
//
USB_PID_COMP_HID_DFU,
//
//这以毫安为单位。
//
500,
//
//总线供电设备。
//
USB_CONF_ATTR_BUS_PWR,
//
//设备事件处理程序函数指针(接收CONNECT、DISCONNECT和其他设备级通知)。
DeviceHandler,
//
//字符串表。
这是主设备的字符串表(无DFU字符串必填)
//
g_pStringDescriptors,
NUM_STRING_DESCRIPTORS,
//
//复合设备数组
//
NUM_DEVICES,
g_psCompDevices
};
//****************************************************************************
//
//复合设备可以写入组合配置的缓冲区描述符。
//
//****************************************************************************
uint8_t g_pui8cDescriptorBuffer[COMPOSITE_DDFU_SIZE + COMPOSITE_DHID_SIZE];

8.重新编写USB库初始化函数调用以使用复合设备。同样,遵循HID/DFU示例:

//
//初始化组成我们的组合的每个设备实例。
//USB设备。
//
pvMouseDevice =
USBDHIDMouseCompositeInit(0, &g_sMouseDevice, &g_psCompDevices[0]);
pvDFUDevice =
USBDDFUCompositeInit(0, &g_sDFUDevice, &g_psCompDevices[1]);
//
//将我们的设备信息传递给USB库,初始化USB。
//控制器,并将设备连接到总线。
//
USBDCompositeInit(0, &g_sCompDevice, DESCRIPTOR_BUFFER_SIZE,
g_pcDescriptorBuffer);

用于DFU设备的Windows驱动程序

由于DFU在USB设备上显示为另一个接口,因此需要设备驱动程序,即使接口本质上是静态的,并且除了在运行时模式下侦听单个请求之外什么也不做。Microsoft Windows的任何版本都不包含通用设备固件升级驱动程序,因此任何支持DFU的应用程序都必须提供适当的驱动程序。对于USBLib应用程序,SW USB windrivers xxxx软件包中提供了一个DFU驱动程序,可以通过以下链接下载:http://www.ti.com/tivaware。DFU驱动程序在USB引导加载程序(boot_USB)和DFU设备类提供的运行时DFU接口之间是通用的。它由两个特定于USBLib的dll以及微软为WinUSB子系统提供的联合安装程序组成。支持32位和64位的WindowsXP、WindowsVista和Windows7。这两个dll是:

lmusbdll.dll

WinUSB之上的一种低级接口,提供简单的数据包传输和接收,并能在端点0上执行控制事务。应用程序可以使用此接口生成,而无需下载和安装Windows设备驱动程序工具包。由于Windows SDK中没有提供WinUSB头,DLL本身需要构建Windows DDK。lmdfu.dll

DFU函数之上的高级API。此DLL允许在总线上找到支持DFU的设备,并允许从这些设备下载或上载应用程序映像。

要为启用DFU的设备创建驱动程序,请从引导创建一个新的.INF文件bool_usb.inf接口例如,用设备的VID、PID和DFU接口号替换原始文件中的接口号,或将此.inf的内容(具有相同的更改)合并为组合设备的.inf。请注意,设备在DFU模式下发布PID 0x00FF,因此除了复合设备的标准PID之外,还必须确保driver.INF文件包含一个条目,用于为发布此PID的设备安装驱动程序

DFU设备的编程DFU设备上的固件可以使用LM Flash程序员应用程序或命令行dfuprog工具进行更新。dfuprog的源代码包含在所有支持usb的工具包的发行版中,可以在C:\ti\TivaWare-for-C series \tools\dfuprog中找到,假设您在默认位置安装了TivaWare。应用程序的可执行文件作为“windows端USB工具包示例”包(SW-USB-win-xxxx)的一部分安装,可以通过http://www.ti.com/tivaware上的链接下载。默认情况下,dfuprog.exe可以在C:\Program Files\T穰\ TivaWare \ usb_examples工具

LM Flash程序员只列出连接在DFU模式下的DFU设备,但dfuprog工具也允许运行时DFU设备被枚举并切换到DFU模式,以便使用LM Flash程序员或另一个dfuprog调用进行编程。命令dfuprog -e枚举所有连接到主机系统的具有dfu能力的设备,并提供关于每个设备的信息。将设备从运行时模式切换到DFU模式,发出命令dfuprog -i -m

其中<索引>是要切换模式的设备的索引(dfuprog -e时显示)。当一个设备从运行时模式切换到DFU模式时,您将听到Windows通常表示一个USB设备已经断开连接,然后在引导加载程序启动并将is DFU模式描述符发布到主机时立即重新连接。这些描述符使用PID 0x00FF,而不是按照USB DFU规范中建议的由复合设备发布的PID。一旦这种模式切换发生,设备将可见在LM Flash程序员的设备列表显示时,“手动配置”是选择与“USB DFU”接口。如果模式切换时LMFlash正在运行,按“刷新”键搜索并显示DFU设备。要在DFU模式下编程设备,要么使用LM Flash程序员的GUI或dfuprog -f <文件名>。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值