📄 usbmain.c
字号:
#include "usbmain.h"
#include "D12CI.h"
#define BadBlockIndexBase 0xfd00
#define UsedBlockIndexBase 0xfe00
/////////// 说明:共能存储13*4=52个目录信息
#define IndexStringNameBase0 0xf000
#define IndexStringNameBase1 0xf100
#define IndexStringNameBase2 0xf200
#define IndexStringNameBase3 0xf300
#define IndexStringNameBase4 0xf400
#define IndexStringNameBase5 0xf500
#define IndexStringNameBase6 0xf600
#define IndexStringNameBase7 0xf700
#define IndexStringNameBase8 0xf800
#define IndexStringNameBase9 0xf900
#define IndexStringNameBase10 0xfa00
#define IndexStringNameBase11 0xfb00
#define IndexStringNameBase12 0xfc00
////////////
extern void F_Interrupt_On(void);
extern void F_System_Initial(void);
extern void F_Clear_WatchDog(void);
extern void F_Reconnect_USB(void);
extern void F_Control_Handler(void);
extern void badblock_check(void);
extern EPPFLAGS bEPPflags; //USB协议处理数据缓冲区
extern unsigned int MainEpBuf[]; //64字节接受数据缓冲区
extern unsigned int OneRecByteNum; //接受到的字节数目
CONTROL_TRANSFERS ControlData; //协议处理
extern unsigned char databuffer[528]; //外部闪存数据缓冲区
extern unsigned int badblock_table[21],key_code,play_flag; //坏块信息表
struct _file_infor
{
unsigned int index;
long size;
unsigned int type;
unsigned int year;
unsigned int month;
unsigned int date;
unsigned int name_length;
unsigned char name[40];
} file_infor;
unsigned int FileNameBuffer[4*64];
unsigned int *s,*d;
main()
{
unsigned char data_page_count=0,length=0; //传送数据次数
unsigned int real_write_page,real_write_byte,temp,i,k;
unsigned int block_used_table[50];
key_code=0;
play_flag=1;
F_System_Initial();
F_Reconnect_USB(); //PDIUSBD12芯片的软连接
F_Interrupt_On();
F_Clear_WatchDog();
lcd_clr();
lcd_clr();
s=(unsigned int *)BadBlockIndexBase;
d=badblock_table;
for(i=0;i<21;i++)
{ //读去坏块记录
*d++=F_FlashRead(s++);
}
// play(0);
// F_FlashErase(0xfe00); // 写入已用块数
// F_FlashWrite1Word(0xfe00+1,00);
while( TRUE )
{
if (bEPPflags.bits.bus_reset) //总线复位处理
{
bEPPflags.bits.bus_reset = 0;//清标志
}
if (bEPPflags.bits.suspend)//总线挂起处理
{
bEPPflags.bits.suspend= 0;//清标志
}
if (bEPPflags.bits.setup_packet)//协议处理
{
bEPPflags.bits.setup_packet = 0;//清标志
F_Control_Handler();
}
if(bEPPflags.bits.ep2_rxdone==1)
{
bEPPflags.bits.ep2_rxdone = 0;//清标志
F_D12_WriteEndpoint(5,1,0x00); //发送写完回应信号
switch(MainEpBuf[63])
{ case 0x00:
s=MainEpBuf;
d=(unsigned int *)(&databuffer[data_page_count*60]);
for(i=0;i<=47;i++)
{
*d++=(unsigned char)(*s++);
}
data_page_count=0;
real_write_page=((MainEpBuf[49]<<8)|0x00ff)&(MainEpBuf[48]|0xff00);
if(MainEpBuf[62]==0x00) //文件末尾的处理
{
s=(unsigned int *)UsedBlockIndexBase;
d=block_used_table;
for(i=0;i<50;i++)
{
*d++=F_FlashRead(s++);
}
temp=block_used_table[0];//得到语音段数
block_used_table[temp+1]=(real_write_page/32);//write 本段语音末块数
block_used_table[0]=temp+1;//MODIFY INDEX
F_FlashErase(UsedBlockIndexBase);
for(i=0;i<50;i++)
{ //察除内部FLASH的记录块
F_FlashWrite1Word(UsedBlockIndexBase+i,block_used_table[i]);//写入已用块数记录
}
}
real_write_page=logicaddr_to_phyaddr(real_write_page);
if((real_write_page%32)==0)
{ //整块开始标志
block_erase(real_write_page/32); //察除块
}
page_program(real_write_page); //页写
F_D12_WriteEndpoint(5,1,0x00); //发送写完回应信号
break;
case 0x01 :
s=MainEpBuf;
d=(unsigned int *)(&databuffer[data_page_count*60]);
for(i=0;i<=59;i++)
{
*d++=(unsigned char)(*s++);
}
data_page_count++;
break;
case 0x02 : // 得到已用块数
temp=F_FlashRead(UsedBlockIndexBase);
temp=F_FlashRead(UsedBlockIndexBase+temp);
MainEpBuf[0]=(unsigned char)temp;
MainEpBuf[1]=(unsigned char)(temp >>8);
F_D12_WriteEndpoint(5,2,MainEpBuf);//send blocknum by user
break;
case 0x06: //保存语音信息
//
s=(unsigned int *)UsedBlockIndexBase;
temp=*s-1;//得到语音段数
s=(unsigned int *)(IndexStringNameBase0+(temp/4)*0x0100);
d=(unsigned int *)FileNameBuffer;
for(i=0;i<((temp%4)*64);i++)
{
*d++=*s++;
}
d=(unsigned int *)(IndexStringNameBase0+(temp/4)*0x0100);
s=(unsigned int *)FileNameBuffer;
F_FlashErase(IndexStringNameBase0+(temp/4)*0x0100);
for(i=0;i<((temp%4)*64);i++)
{
F_FlashWrite1Word(IndexStringNameBase0+(temp/4)*0x0100+i,FileNameBuffer[i]);
}
for(k=0;k<64;k++)
{ //保存坏块记录
F_FlashWrite1Word(IndexStringNameBase0+k+i,MainEpBuf[k]);
}
break;
case 0x04: // 发送语音信息的名
s=(unsigned int *)UsedBlockIndexBase;
temp=*s;//得到语音段数
s=(unsigned int *)IndexStringNameBase0;
if(temp!=0xffff)
{
for(k=0;k<temp;k++)
{
d=MainEpBuf;
for(i=0;i<64;i++)
{
*d++=*s++;
}
MainEpBuf[63]=k; //未完成标志
F_D12_WriteEndpoint(5,64,MainEpBuf);
}
}
MainEpBuf[63]=0xaa; //发送完成标志
F_D12_WriteEndpoint(5,64,MainEpBuf);
break;
case 0x05 : // 快速格式化
s=(unsigned int *)UsedBlockIndexBase;
F_FlashErase(s);
for(i=0;i<50;i++) //察除内部FLASH的记录块
{
F_FlashWrite1Word(s++,0);//写入已用块数记录
}
F_FlashErase(BadBlockIndexBase);
for(i=0;i<21;i++)
{ //保存坏块记录
F_FlashWrite1Word(BadBlockIndexBase+i,badblock_table[i]);
}
F_D12_WriteEndpoint(5,1,0); //发送写完回应信号
break;
case 0x03 : // 格式化
s=(unsigned int *)UsedBlockIndexBase;
F_FlashErase(s);
for(i=0;i<50;i++) //察除内部FLASH的记录块
{
F_FlashWrite1Word(s++,0);//写入已用块数记录
}
badblock_check(); //坏块检测
F_FlashErase(BadBlockIndexBase);
for(i=0;i<21;i++)
{ //保存坏块记录
F_FlashWrite1Word(BadBlockIndexBase+i,badblock_table[i]);
}
break;
default: break;
} //end case
} //end if //发送接收到的字节,OneRecByteNum<=64
// add_key();
F_Clear_WatchDog();
} // End while
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -