|
楼主 |
发表于 2021-5-26 00:12:24
|
显示全部楼层
已通过写入512字节的文件实现退出U盘模式。
实现方法不是最优,不过实现起来很简单。而且通过文件内容可以做不同的控制操作。
1、 在 int8_t STORAGE_Write(uint8_t lun, uint8_t * buf, uint32_t blk_addr, uint16_t blk_len) 中判断512字节扇区内容,
如果满足条件,设置 g_tVar.UsbEmmcRemoved = 1;
int8_t STORAGE_Write(uint8_t lun, uint8_t * buf, uint32_t blk_addr,
uint16_t blk_len)
{
int8_t ret = -1;
printf_ok("STORAGE_Write %d, %d\r\n", blk_addr, blk_len);
switch (lun)
{
case LUN_SD:
{
CheckQuitFile(buf); /* 检查退出文件 */
BSP_MMC_WriteBlocks((uint32_t *)buf, blk_addr, blk_len, 5000);
while(BSP_MMC_GetCardState() != MMC_TRANSFER_OK);
ret = 0;
}
break;
2、在主程序中, 执行删除文件,并退出U盘状态。
while (g_MainStatus == MS_USB_EMMC)
{
bsp_Idle();
if (g_tVar.UsbEmmcRemoved == 1)
{
g_tVar.UsbEmmcRemoved = 0;
bsp_DelayMS(1000); /* 延迟1秒,等待windows写入文件执行完毕 */
DeleteQuitFile(); /* 退出前删除退出文件 */
g_MainStatus = MS_LINK_MODE;/* 退出U盘状态 */
}
几个函数如下:
/*
*********************************************************************************************************
* 函 数 名: CheckQuitFile
* 功能说明: 判断512字节扇区内容,如果满足条件则退出USB磁盘模式。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void CheckQuitFile(uint8_t *buf)
{
uint32_t *p;
p = (uint8_t *)buf;
if (p[0] == 0x74697551) /* Quit */
{
uint8_t i;
for (i = 0; i < 128; i++)
{
if (p != 0x74697551)
{
break;
}
}
if (i == 128)
{
g_tVar.UsbEmmcRemoved = 1; /* 退出指令 */
}
}
}
/*
*********************************************************************************************************
* 函 数 名: DeleteQuitFile
* 功能说明: 删除退出文件
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void DeleteQuitFile(void)
{
//#define EMMC_QUIT_FILE "0:/H7-TOOL/quit_usb_emmc.txt"
f_unlink(EMMC_QUIT_FILE);
}
|
|