📄 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 "main.h"
#define CFCARD_ID 11 /* 任务的ID */
#define CFCARD_PRIO CFCARD_ID /* 任务的优先级 */
#define CFCARD_STACK_SIZE 256 /* 定义用户堆栈长度 */
#define Uart0_ID 12 /* 任务的ID */
#define Uart0_PRIO Uart0_ID /* 任务的优先级 */
#define Uart0_STACK_SIZE 512 /* 定义用户堆栈长度 */
OS_STK CFCARD_STACK[CFCARD_STACK_SIZE];
OS_STK Uart0_STACK[Uart0_STACK_SIZE];
void CFCARD(void *pdata); /* CF卡驱动任务,优先级11 */
void Uart0(void *pdata); /* 通信任务,优先级12 */
OS_EVENT *poeUart0ReviceSem ; /* 串口接收中断同步信号量 */
OS_EVENT *mbox_Protocol ; /* 协议消息邮箱 */
typedef struct _CFProtocol {
uint16 SectorCount; /* 协议的扇区数 */
uint32 SectorNumber; /* 协议的扇区号 */
uint32 ReceiveData; /* 接收到数据的字节数 */
uint8 RetData,buff[15]; /* 协议的状态及缓存 */
uint8 CommandCode; /* 协议的命令代码 */
} CFPROTOCOL;
typedef struct _IDENTIFY_DATA {
uint16 GeneralConfiguration; // 00 普通设置-CF卡标志0x848A
uint16 NumberOfCylinders; // 1 默认柱面数
uint16 Reserved1; // 2
uint16 NumberOfHeads; // 3 默认磁头数
uint16 UnformattedBytesPerTrack; // 4 在2.0规范已不使用
uint16 UnformattedBytesPerSector; // 5 在2.0规范已不使用
uint16 SectorsPerTrack; // 6 每磁道默认扇区数
uint32 SectorsPerCard; // 7-8 每卡扇区数(Word 7=MSW,Word 8=LSW)
uint16 VendorUnique; // 9 在2.0规范已不使用
uint16 SerialNumber[10]; // 10-19 ASCII序列号(靠右填写)
uint16 BufferType; // 20 在2.0规范已不使用
uint16 BufferSectorSize; // 21 在2.0规范已不使用
uint16 NumberOfEccBytes; // 22 读/写长指令时的ECC字节数
uint16 FirmwareRevision[4]; // 23-26 ASCII固件版本。大端格式
uint16 ModelNumber[20]; // 27-46 ASCII模式号(靠左填写),大端格式
uint16 MaximumBlockTransfer; // 47 多重 读/写指令最大扇区号。
uint16 Reserved2; // 48
uint16 Capabilities; // 49
uint16 Reserved3; // 50
uint16 PioCycleTimingMode; // 51 PIO数据传输周期时序模式
uint16 DmaCycleTimingMode; // 52 在2.0规范已不使用
uint16 TranslationFieldsValid; // 53 0位为1,Word54 to 58 有效;1位为1,Word64 to 70 有效
uint16 NumberOfCurrentCylinders; // 54 当前柱面数
uint16 NumberOfCurrentHeads; // 55 当前磁头数
uint16 CurrentSectorsPerTrack; // 56 当前每磁道扇区数
uint32 CurrentSectorCapacity; // 57-58 当前扇区容量(LBAs)(Word 58=MSW,Word 57=LSW)
uint16 CurrentMultiSectorSetting; // 59 位8为1,则位0-7,指出可多扇区读写的扇区数
uint32 UserAddressableSectors; // 60-61 LAB模式下可被寻址的扇区数
uint16 Reserved4[2] ; // 62-63
uint16 AdvancedPIOModes ; // 64 在2.0规范使用
uint16 Reserved6[2] ; // 65-66
uint16 MinimumPIOCycleTime; // 67 非流控制下最小PIO传输周期时间
uint16 MinimumPIOCycleTimeIORDY; // 68 IORDY流控制小最小PIO传输周期时间
uint16 Reserved7[10]; // 69-79
uint32 AtaVersion; // 80-81 CF卡返回0
uint16 FeaturesCommandSupported[3]; // 82-84 特征/命令集技持
uint16 FeaturesCommandEnabled[3]; // 85-87 特征/命令集使能
uint16 Reserved8; // 88
uint16 MajorRevision; // 89 安全单位完全擦除的时间要求
uint16 MinorRevision; // 90 增强型安全单位完全擦除的时间要求
uint16 PowerManagementValue; // 91 当前高级电源管理值
uint16 Reserved9[36]; // 92-127
uint16 SecurityStatus; // 128 安全状态
uint16 VendorUniqueBytes[32]; // 129-159
uint16 PowerRequirementDescription; // 160 电源要求描述
uint16 Reserved10; // 161
uint16 KeyManagementSupported; // 162 按键管理表
uint16 Reserved11[83]; // 163-255
} CF_IDENTIFY_DATA, *PCF_IDENTIFY_DATA;
#define CF_BUFSIZE 0x10000
uint8 GucWData[CF_BUFSIZE];
uint8 GucRData[CF_BUFSIZE];
DISK_PARAMETER GdpData;
char cUartArg[] = "BaudRate=19200 DataBits=8 StopBits=1 Parity=0 RtsControl=0";
extern INT16U ataCommand (INT8U ucCommand, void *vpParameter);
/*********************************************************************************************************
** Function name : main
** Descriptions : 主函数
** Input : 无
** Output : 无
** Created Date : 2006-04-11
********************************************************************************************************/
int main (void)
{
OSInit();
OSTaskCreateExt(CFCARD,
(void *)0,
&CFCARD_STACK[CFCARD_STACK_SIZE-1],
CFCARD_PRIO,
CFCARD_ID,
&CFCARD_STACK[0],
CFCARD_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSStart();
}
/*********************************************************************************************************
* 名称: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'; /* 指令正常完成 */
}
uartWrite (UART0, RetData2PC, sizeof(RetData2PC), NULL);
}
void SendDriveInfo(PCF_IDENTIFY_DATA DeviceInfo)
{
uartWrite (UART0, (uint8*)DeviceInfo->ModelNumber, 40, NULL); /* 发送设备型号 */
uartWrite (UART0, (uint8*)DeviceInfo->SerialNumber, 20, NULL); /* 发送设备序列号 */
uartWrite (UART0, (uint8*)&DeviceInfo->CurrentSectorCapacity, 4, NULL);
/* 发送设备总扇区数 */
}
/********************************************************************************************************
** Function name: CFCARD
** Descriptions: 无
** Input: 无
** Output: 无
*********************************************************************************************************/
extern uint8 ATA_IdentifyDrive(uint8,uint8*);
void CFCARD (void *pdata)
{
int i;
INT8U err;
uint8 ucDevice;
uint16 usRet;
uint8 uiNUM;
CFPROTOCOL *CFProtocol;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
/*
* 外部总线配置
*/
#if CF_EPC2468_EN
PINSEL9 = 0x01<<28; /* CS0(4.30) */
PINSEL6 = 0x55555555; /* D0--D15 */
PINSEL8 = 0x55555555; /* A0--A15 */
PINSEL9 |= 0x00055555; /* A19--A23,nOE,nWE */
PINMODE5 |= (0X03<<18); /* P2.25下拉 */
EMCControl = 0x01; /* 使能EMC、禁止映象 */
EMCStaticConfig0 = 0x00000181; /* 字节状态位PB为1,nOE读、nWR写,
16位数据总线,使用延时 */
#endif
TargetInit();
pdata = pdata;
OSTaskCreateExt(Uart0,
(void *)0,
&Uart0_STACK[Uart0_STACK_SIZE-1],
Uart0_PRIO,
Uart0_ID,
&Uart0_STACK[0],
Uart0_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -