📄 main.c
字号:
* 初始化驱动
*/
ucDevice = 0;
GdpData.ulSectorIndex = 0;
GdpData.uiNSectors = 0;
GdpData.pvRsvdForLow = &ucDevice;
GdpData.pucBuf = 0;
usRet = ataCommand(DISK_DRIVE_OPEN,&GdpData); /* 初始化驱动 */
if ((usRet == DISK_READ_NOT_OK) /* 驱动返回出错 */
||(usRet == DISK_WRITE_NOT_OK)
||(usRet == DISK_INIT_NOT_OK)
||(usRet == DISK_FALSE)
||(usRet == BAD_DISK_COMMAND) ) {
while (1);
}
/*
* 检查设备是否存在
*/
ucDevice = 0;
GdpData.ulSectorIndex = 0;
GdpData.uiNSectors = 0;
GdpData.pvRsvdForLow = &ucDevice;
GdpData.pucBuf = 0;
usRet = ataCommand(DISK_CHECK_DEVICE,&GdpData); /* 初始化驱动 */
if ((usRet == DISK_READ_NOT_OK) /* 驱动返回出错 */
||(usRet == DISK_WRITE_NOT_OK)
||(usRet == DISK_INIT_NOT_OK)
||(usRet == DISK_FALSE)
||(usRet == BAD_DISK_COMMAND) ) {
while (1);
}
/*
* 初始化设备
*/
ucDevice = 0;
GdpData.ulSectorIndex = 0;
GdpData.uiNSectors = 0;
GdpData.pvRsvdForLow = &ucDevice;
GdpData.pucBuf = 0;
usRet = ataCommand(DISK_DEVICE_OPEN,&GdpData); /* 初始化驱动 */
if ((usRet == DISK_READ_NOT_OK) /* 驱动返回出错 */
||(usRet == DISK_WRITE_NOT_OK)
||(usRet == DISK_INIT_NOT_OK)
||(usRet == DISK_FALSE)
||(usRet == BAD_DISK_COMMAND) ) {
while (1);
}
/*
* 查看设备是否就绪
*/
ucDevice = 0;
GdpData.ulSectorIndex = 0;
GdpData.uiNSectors = 0;
GdpData.pvRsvdForLow = &ucDevice;
GdpData.pucBuf = 0;
usRet = ataCommand(DISK_CHECK_DEVICE,&GdpData); /* 初始化驱动 */
if ((usRet == DISK_READ_NOT_OK) /* 驱动返回出错 */
||(usRet == DISK_WRITE_NOT_OK)
||(usRet == DISK_INIT_NOT_OK)
||(usRet == DISK_FALSE)
||(usRet == BAD_DISK_COMMAND) ) {
while (1);
}
mbox_Protocol = OSMboxCreate(NULL); /* 创建协议内容消息邮箱 */
while(1){
CFProtocol= OSMboxPend (mbox_Protocol,0,&err); /* 等待消息邮箱 */
switch(CFProtocol->CommandCode)
{
case 0xE0: /* 立即待机 */
ucDevice = 0;
GdpData.ulSectorIndex = 0;
GdpData.uiNSectors = 0;
GdpData.pvRsvdForLow = &ucDevice;
GdpData.pucBuf = 0;
usRet = ataCommand(DISK_DEVICE_CLOSE,&GdpData); /* 关闭设备 */
if (( usRet == DISK_FALSE)
||(usRet == BAD_DISK_COMMAND) ) {
CFProtocol->RetData=FALSE;
}
break;
case 0xE1: /* 立即空闲 */
ucDevice = 0;
GdpData.ulSectorIndex = 0;
GdpData.uiNSectors = 0;
GdpData.pvRsvdForLow = &ucDevice;
GdpData.pucBuf = 0;
usRet = ataCommand(DISK_DEVICE_OPEN,&GdpData); /* 打开设备 */
if (( usRet == DISK_FALSE)
||(usRet == BAD_DISK_COMMAND) ) {
CFProtocol->RetData=FALSE;
}
break;
case 0x20: /* 读扇区 */
ucDevice = 0;
GdpData.ulSectorIndex = CFProtocol->SectorNumber;
GdpData.uiNSectors = CFProtocol->SectorCount;
GdpData.pvRsvdForLow = &ucDevice;
GdpData.pucBuf = GucRData;
usRet = ataCommand(DISK_MULT_READ,&GdpData); /* 读扇区数据 */
if ((usRet == DISK_READ_NOT_OK)
||(usRet == DISK_WRITE_NOT_OK)
||(usRet == DISK_INIT_NOT_OK)
||(usRet == DISK_FALSE)
||(usRet == BAD_DISK_COMMAND) ) {
CFProtocol->RetData=FALSE;
} else CFProtocol->RetData=TRUE;
if(CFProtocol->SectorCount==0)
CFProtocol->SectorCount =256; /* 如果扇区数为0,即操作256个扇区*/
CFProtocol->ReceiveData = 512*CFProtocol->SectorCount;
for(i=0; i<CFProtocol->ReceiveData;i += 256){
uartWrite (UART0,(uint8*)&GucRData[i],256,NULL);/* 传输数据到PC */
OSTimeDly(OS_TICKS_PER_SEC/100);
}
break;
case 0x30: /* 写扇区 */
if(CFProtocol->SectorCount==0) /* 如果扇区号为0即写256个扇区 */
CFProtocol->ReceiveData = 512*256; /* 需要收到的数据字节总数 */
else
CFProtocol->ReceiveData = 512*CFProtocol->SectorCount;
for(i=0; i<CFProtocol->ReceiveData;i += 14) {
OSSemPend(poeUart0ReviceSem,0,&err);
OS_ENTER_CRITICAL();
uiNUM=uartFifoStatus(UART0,RX_FIFO);
uartRead (UART0,(uint8*)&GucWData[i],14,NULL);
if(uiNUM<14) {
uartRead (UART0,(uint8*)&GucWData[i],14,NULL);
break;
}
OS_EXIT_CRITICAL();
}
ucDevice = 0;
GdpData.ulSectorIndex = CFProtocol->SectorNumber;
GdpData.uiNSectors = CFProtocol->SectorCount;
GdpData.pvRsvdForLow = &ucDevice;
GdpData.pucBuf = GucWData;
usRet = ataCommand(DISK_MULT_WRITE,&GdpData); /* 写扇区数据 */
if ((usRet == DISK_READ_NOT_OK)
||(usRet == DISK_WRITE_NOT_OK)
||(usRet == DISK_INIT_NOT_OK)
||(usRet == DISK_FALSE)
||(usRet == BAD_DISK_COMMAND) ) {
CFProtocol->RetData=FALSE;
} else CFProtocol->RetData=TRUE;
break;
case 0xEC: /* 获取设备识别信息 */
ucDevice = 0;
CFProtocol->RetData = ATA_IdentifyDrive(ucDevice,GucWData); /* 获取设备识别信息 */
if(CFProtocol->RetData)
SendDriveInfo((PCF_IDENTIFY_DATA)GucWData); /* 传输数据到PC */
break;
default:
CFProtocol->RetData = FALSE;
break;
}
RetStateToPC(CFProtocol->RetData); /* 向PC返回指令执行状态 */
OSTimeDly(OS_TICKS_PER_SEC);
}
}
/*******************************************************************************************
** Function name: Uart0
** Descriptions: 无
** Input: 无
** Output: 无
*******************************************************************************************/
void Uart0 (void *pdata)
{
INT8U err;
int16 uiNUM;
uint8 temp=0;
uint16 i,j;
CFPROTOCOL CFProtocol;
pdata = pdata;
PINSEL0 |= ((0x01 << 4) | (0x01 << 6)); /* 设置P0.2和P0.3连接到UART0 */
uartInit (UART0, cUartArg, NULL); /* 初始化串口0 */
SetVICIRQ (6, 5, (uint32)uart0Isr);
uartWrite (UART0,(uint8*)cUartArg,sizeof(cUartArg),NULL); /* 向PC机报告串口设置 */
poeUart0ReviceSem = OSSemCreate(0); /* 创建发送中断信号量 */
while(1)
{
OSSemPend(poeUart0ReviceSem,0,&err); /* 等待接收中断信号量的同步 */
uiNUM=uartFifoStatus(UART0,RX_FIFO); /* 读取接收FIFO数据个数 */
uartRead (UART0,(uint8*)&temp,1,NULL); /* 读取首字符 */
if (temp != 'Z') { /* 判断首字符是否‘Z’ */
uartFifoFlush(UART0,RX_FIFO); /* 清空接收队列 */
continue;
}
for (i=0;i<uiNUM-1;i++) { /* 接收接下来的uiNUM-1个数据 */
uartRead(UART0,(uint8*)&CFProtocol.buff[i],1,NULL);
}
if((CFProtocol.buff[0]!='L') /* 判断协议头 */
||(CFProtocol.buff[1]!='G')
||(CFProtocol.buff[2]!=':')) {
i=0;
uartFifoFlush(UART0,RX_FIFO); /* 清空接收队列 */
break;
}
OSSemPend(poeUart0ReviceSem,0,&err); /* 协议没有接收完,继续 */
for (j=i;j<15;j++) { /* 接收剩下的数据 */
uartRead(UART0,(uint8*)&CFProtocol.buff[j],1,NULL);
}
uartFifoFlush(UART0,RX_FIFO);
if (i > 3){ /* 协议有效 */
/* 提取指令代码 */
CFProtocol.CommandCode = (ASCII_TO_HEX(CFProtocol.buff[3])<<4)
|ASCII_TO_HEX(CFProtocol.buff[4]);
/* 提取扇区号 */
CFProtocol.SectorNumber = (ASCII_TO_HEX(CFProtocol.buff[5])<<28)
|(ASCII_TO_HEX(CFProtocol.buff[6])<<24)
|(ASCII_TO_HEX(CFProtocol.buff[7])<<20)
|(ASCII_TO_HEX(CFProtocol.buff[8])<<16)
|(ASCII_TO_HEX(CFProtocol.buff[9])<<12)
|(ASCII_TO_HEX(CFProtocol.buff[10])<<8)
|(ASCII_TO_HEX(CFProtocol.buff[11])<<4)
| ASCII_TO_HEX(CFProtocol.buff[12]);
/* 提取扇区数 */
CFProtocol.SectorCount = ( ASCII_TO_HEX(CFProtocol.buff[13])<<4)
| ASCII_TO_HEX(CFProtocol.buff[14]);
OSMboxPost (mbox_Protocol,&CFProtocol); /* 发送消息邮箱,传递协议内容 */
}
OSTimeDly(OS_TICKS_PER_SEC/10);
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -