4、自动化USBISP
有时候,要求系统执行固件的更新不需要用户介入。要求用户确定哪个盘驱动器连接到USB设备,或要求他们手动删除和重写一个文件,常常是很复杂的事情。在电脑程序的控制下,固件经常需要被自动更新。此部分将描述这是如何实现。为了在电脑上全自动化运行,程序需要找到正确的USB设备进行更新,改变USB设备“handle”到一个文件路径,检查CRP模式,存盘的文件烧写到flash,在确保flash内容保存的情况下最终卸载盘设备器。这些步骤将被单独的讨论。这能有效的验证被烧写的固件文件。通过LPC134X用户手册里的“CriterionforValidUserCode”,可以对其进行验证,这已用WindowsISP工具执行过。它也合理的验证在被烧写的设备空间里是相同长度。这是在Mac和Linux系统中应用的ISP例子。注意:在这些步骤中产生的一些偏差,在不同操作系统的简易执行中影响不大。
4.1找到正确的USB设备
枚举USB设备的方法取决于不同的操作系统。在Linux上,大多数分配提供一个叫lsusb的程序,这程序能搜索指定供应商ID和产品ID的USB设备。然后,udevadm(目前系统上使用udev设备文件系统)可以分列出USB型号ID和系统设备路径。LPC1300系列的型号ID为“NXP_LPC13XX_IFLASH”。一旦供应商ID、产品ID和型号ID被确认,你肯定会发现一个处于ISP模式的NXPLPC1300微控制器。在Windows和MacOS-X中,这个步骤有点不同。在Mac上,可以从磁盘数据库取得的USB设备型号信息,也就没有去找实际USB设备。相反,直到正确的生产商和设备型号被找到,磁盘设备才开始检测。在Windows下,有相似的过程,通过iTunerUsbManager来检索磁盘信息。
4.2改变USB设备控制权到文件路径
在Linux中,一个USB设备的控制权能被转换到文件路径,通过循环访问在udev文件系统中的所有盘设备和为它们的系统设备路径查询udevadm,直到一个带有ISP的USB设备被找到。
1、lsusb以生产商ID和NXPISP设备产品ID来命名。lsusb输出总线和设备ID到standardout(控制台)。输出结果用来为USB设备创建一个udev路径,例如,总线2设备3的路径为/dev/bus/usb/002/003。
2、一个盘设备名从/dev截取,在我们的样品脚本中,我们使用一个与/dev/sd[a-z]匹配的通配符,并在设备间循环,这些设备与像/dev/sda,/dev/sdb,/dev/sdc,etc这样的组合相匹配。这就可以在系统上找到磁盘驱动器,包括硬盘和USB大容量存储器。
3、完整的低级盘设备文件路径用udevadminfo-qpath–n/dev/sdX查找,如果盘设备与我们找到的USB设备有联系,那么返回的文件路径以低级USB设备文件路径开头。
4、最后,mount命令的输出用于决定在步骤2测试过的盘设备名安装到linux文件系统的哪个地方。我们现在有了一个文件系统路径用于我们的的USBISP设备并能够访问firmware.bin
在Mac和Windows系统下,我们采用盘操作(替代USB设备操作)和查询操作系统的盘符和文件路径
4.3检查代码的read保护(CRP)
LPC1300USBISP的特色是设置USB盘的盘符指出CRP模式。USBISPflash编程器的稳定设计将检查盘符来确认CRP没有使能。在Linux系统下,FAT盘文件系统盘符能用mtools包读出。遗憾的是,这不被推荐,因为它需要administrative来访问。另一种方法在Linux系统下读文件系统盘符是使用mount-l命令,如果你的系统mount版本能够支持的话。这将列出所有安装的文件系统和它们的盘符。在Mac和Windows操作系统中,盘符信息显示在DiskDescription目录或在Volume中来自WMI各自的目标检索。
如果CRP1或CRP2被使能,在USBISP盘中的firmware.bin文件在新文件能写入之前肯定要被删除来禁止代码保护。删除firmware.bin后,设备需要掉电和重连接,以使改变的CRP设置生效,这样固件就能更新。如果CRP3被使能,设备不能被擦除和固件不能被更新。
4.4写文件到程序flash
在Windows操作系统下,几乎任一标准文件系统写时序都这样工作,Windows多样的FAT文件系统以ISP磁盘上的第一个空闲块作为起始,来分配块。在Linux操作系统中,设备自己能直接被写(用/dev),但需要同时使用dd来确认块序列。这方法不被推荐,因为它要求用户有administrative的权限。第二个选择是打开USBISP盘中已存在的firmware.bin并重写内容。如果文件打开后没有截位,新的数据将以与已有文件(ISP固件建立的文件)相同的规则写入。(记住“filemetadata”是通过ROM代码创建的,且不存储到flash)通过conv=nocreat,notrunc.选项,使用dd来写入firmware.bin文件,可以实现重写。如果代码用C语言,尽可能的使用open(path,O_RDWR)或fopen(path,“r+”)。此外,在Windows操作系统中没有必要覆盖已有的文件,这样,就有存储空间可用,只要覆盖或删除当前文件以释放存储空间。在我们提供的Windows程序例子中,我们使了C#函数System.IO.File.WriteAllBytes(filePath,firmwareData),在写之前做了简化处理。