FFU操作流程
1、FFU在开始之前,主机首先要检查eMMC设备是否支持FFU兼容性,通过读取EXT_CSD
寄存器的SUPPORTED_MODES
和FW_CONFIG
,如果支持FFU功能,即可开始FFU流程。
2、FFU操作的开始,用户需要通过切换EXT_CSD
寄存器中的MODE_CONFIG
字段的值将emmc切换到FFU模式。
3、在FFU模式中,主机会用CMD17/CMD18/CMD24/CMD25
,下载新的firmware并且读取供应商专有数据,在此模式下,主机应该将这些命令的参数设置为与FFU_ARG
字段中的一致。如果这些命令有不同的参数,则设备行为没有定义,emmc会有不确定的动作,FFU进程可能会失败。
4、用户需要设置块长度为DATA_SECTOR_SIZE
。下载的FW文件包(固件包)必须与DATA_SECTOR_SIZE
保持对齐(有必要时可以文件内部填充数据)。
5、一旦进入FFU模式,用户可以使用一次或多次命令向emmc发送固件文件包;可以设置EXT_CSD
寄存器中的MODE_CONFIG
字段的值将emmc恢复到常规的读写命令功能,并回到正常状态;切出FFU模式会终止固件文件包传输。
6、当改回到FFU模式后,用户必须检查FFU状态,通过读取EXT_CSD
寄存器中的NUMBER_OF_FW_SECTORS_CORRECTLY_PROGRAMMED
字段获取成功传输的sectors数目,确定是否下载成功。如果得到的扇区数为0,则重新启动下载,如果得到的扇区数不为0,则从下一个扇区继续下载。
7、如果设备支持MODE_OPERATION_CODES
,用户可以通过将MODE_OPERATION_CODES
设置为FFU_ABORT
来终止固件传输,并通知emmc FFU过程停止。emmc应把NUMBER_OF_FW_SECTORS_CORRECTLY_PROGRAMMED
设置为0,并准备接受新的固件文件包。
8、作为响应,emmc应把NUMBER_OF_FW_SECTORS_CORRECTLY_PROGRAMMED
设置为0,并准备接受新的固件文件包。如果已经成功将固件文件包传输给了emmc,用户可以设置MODE_OPERATION_CODES
为FFU_INSTALL
,emmc会相应设置NUMBER_OF_FW_SECTORS_CORRECTLY_PROGRAMMED
为0,然后安装新的固件,设置EXT_CSD
寄存器中的MODE_CONFIG
为正常模式。
9、如果在执行FFU_INSTALL
安装命令之前,用户存在CMD0,HW_Reset,Power Cycle等动作,设备将终止下载进程。
10、如果设备不支持MODE_OPERATION_CODES
,用户设置EXT_CSD
寄存器中的MODE_CONFIG
为正常模式,启动CMD0/HW_Reset/Power Cycle安装新的固件。这种情况设备不需要使用NUMBER_OF_FW_SECTORS_CORRECTLY_PROGRAMMED
。