?? main.c
字號:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"
#define TASK_STK_SIZE 100
OS_STK TaskStartStk[TASK_STK_SIZE];
void TaskStart(void *pdata);
/****************************************************************************
* 名稱:ASCII_TO_HEX()
* 功能:ASCII轉16進制數
****************************************************************************/
uint8 ASCII_TO_HEX(uint16 ASCII)
{ uint8 data;
uint8 HEX;
data=(uint8)ASCII;
if(data>'9')
data=data-'A' + 0x0a;
else
data=data-'0';
HEX = data;
data=(uint8)(ASCII>>8);
if(data>'9')
data=data-'A' + 0x0a;
else
data=data-'0';
HEX |= data<<4;
return HEX;
}
/*********************************************************************************************************
** 函數名稱: RetStateToPC
** 功能描述: 返回指令執行狀態到PC機
** 輸 入: 無
** 輸 出: 無
** 全局變量: 無
********************************************************************************************************/
void RetStateToPC(uint8 RetData)
{
uint8 RetData2PC[7]={'S','T','A','T','E',':','N'}; //初始化返回到PC的狀態
if(RetData)
{
RetData2PC[6]='Y'; //指令正常完成
}
UART0Write(RetData2PC,7); // 寫數據到PC
}
/*********************************************************************************************************
** 函數名稱: SendDriveInfo
** 功能描述: 返回指令執行狀態到PC機
** 輸 入: DeviceInfo,描述信息數據結構指針
** 輸 出: 無
** 全局變量: 無
********************************************************************************************************/
void SendDriveInfo(PCF_IDENTIFY_DATA DeviceInfo)
{
UART0Write((uint8*)DeviceInfo->ModelNumber,40);//發送設備型號
UART0Write((uint8*)DeviceInfo->SerialNumber,20);//發送設備序列號
UART0Write((uint8*)&DeviceInfo->CurrentSectorCapacity,4); //發送設備總扇區數
}
/*********************************************************************************************************
** 函數名稱: main
** 功能描述: c語言的主函數,由它啟動多任務環境
** 輸 入: 無
** 輸 出: 無
** 全局變量: 無
********************************************************************************************************/
int main (void)
{
OSInit();
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
OSStart();
return 0;
}
/*********************************************************************************************************
** 函數名稱: TaskStart
** 功能描述: μCOS-II的第一個任務,通常由它初始化目標板和建立其它任務
** 輸 入: 無
** 輸 出: 無
** 全局變量: 無
********************************************************************************************************/
uint8 DataBuff[0x1000]; //保存扇區數據緩沖區
void TaskStart(void *pdata)
{
#define DEVICE0 0
uint16 SectorCount; //扇區數
uint32 SectorNumber; //扇區號
uint32 ReceiveData; //接收到數據的字節數
uint16 i;
uint8 RetData,buff[15];
uint8 CommandCode;
pdata = pdata; /* 避免編譯警告 */
TargetInit(); /* 目標板初始化 */
for (;;)
{
err:
while ((UART0Getch() != 'Z'));
for(i=0;i<15;i++)buff[i]=UART0Getch();
if((buff[0]!='L')||(buff[1]!='G')||(buff[2]!=':')) goto err;
CommandCode = (ASCII_TO_HEX(buff[3])<<4)|ASCII_TO_HEX(buff[4]); //指令代碼
SectorNumber = (ASCII_TO_HEX(buff[5])<<28)|(ASCII_TO_HEX(buff[6])<<24)| //扇區號
(ASCII_TO_HEX(buff[7])<<20)|(ASCII_TO_HEX(buff[8])<<16)|
(ASCII_TO_HEX(buff[9])<<12)|(ASCII_TO_HEX(buff[10])<<8)|
(ASCII_TO_HEX(buff[11])<<4)|ASCII_TO_HEX(buff[12]);
SectorCount = (ASCII_TO_HEX(buff[13])<<4)|ASCII_TO_HEX(buff[14]); // 扇區數
switch(CommandCode)
{
case 0xE0://立即待機
RetData = ATA_StandbyImmediate(DEVICE0);
break;
case 0xE1://立即空閑
RetData = ATA_IdleImmediate(DEVICE0);
break;
case 0x20://讀扇區
RetData = ATA_ReadSector(DEVICE0,(uint16*)DataBuff,SectorNumber,SectorCount);//寫CF卡或IDE硬盤數扇區數據
if(SectorCount==0)
SectorCount =256; //如果扇區數為0,即操作256個扇區
ReceiveData = 512*SectorCount; //傳輸總字節數
UART0Write(DataBuff,ReceiveData); //傳輸數據到PC
break;
case 0x30://寫扇區
if(SectorCount==0) //如果扇區號為0即寫256個扇區
ReceiveData = 512*256; //需要收到的數據字節總數
else
ReceiveData = 512*SectorCount; //需要收到的數據字節總數
OS_ENTER_CRITICAL();
for(i=0;i<ReceiveData;i++)
{
DataBuff[i]=UART0Getch(); //接收扇區數據
}
OS_EXIT_CRITICAL();
RetData = ATA_WriteSector(DEVICE0,(uint16*)DataBuff,SectorNumber,SectorCount);//寫CF卡或IDE硬盤數扇區數據
break;
case 0xEC://獲取設備識別信息
RetData = ATA_IdentifyDrive(DEVICE0,DataBuff); //獲取設備識別信息
if(RetData)
SendDriveInfo((PCF_IDENTIFY_DATA)DataBuff); //傳輸數據到PC
break;
default:
RetData = FALSE;
break;
}
RetStateToPC(RetData);//向PC返回指令執行狀態
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -