?? sysata.c
字號:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: sysata.c
** Last modified Date: 2005-05-13
** Last Version: 1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Created by: Zhoulishan
** Created date: 2005-05-13
** Version: 1.0
** Descriptions: MagicARM2200 Driver
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
/*********************************************************************************************************
** 函數名稱: SYS_BusIni
** 功能描述: ATA總線初始化
** 輸 入: 無
** 輸 出: 無
** 全局變量:
** 調用模塊:
********************************************************************************************************/
void SYS_BusIni(void)
{
PINSEL1 &= ~((3<<((21-16)*2))|(3<<((22-16)*2)));
IO0DIR |= ATA_RST; // 配置復位引腳為輸出
IO0DIR &= ~ATA_CD; // 配置檢測卡引腳為輸入
}
/*********************************************************************************************************
** 函數名稱: SYS_WaitInUS
** 功能描述: 延時等級約1微秒函數,該函數根據系統時間不同與不同,但不應少到1微秒。
** 輸 入: times,延時時間等級
** 輸 出: 無
** 全局變量:
** 調用模塊:
********************************************************************************************************/
void SYS_WaitInUS(uint32 times)
{ uint32 c;
for(;0<times;times--)
for(c=0;c<4;c++);
}
/*********************************************************************************************************
** 函數名稱: ATA_HaveCard
** 功能描述: 判斷CF卡是否連接到,CF卡的CD1、CD2引腳與GND直接相接,可以通過該引腳判斷CF卡是否存在
** (對于IDE硬盤也有也多共地的引腳,也可以像CF卡那樣檢測但是這點ATA規范中并沒有說明)。
** 如果硬件上沒有相關的檢測,則應一直返回TRUE。
** 輸 入: 無
** 輸 出: TRUE,如果有設備存在,不管設備是主或是從,或可以返回TRUE(1);
** FALSE,如果設備不存在,即返回FALSE(0)
** 全局變量:
** 調用模塊:
********************************************************************************************************/
uint8 SYS_HaveCard(void)
{
//#define DEVICE_IS_ATTACHED IO0PIN&ATA_CD /*硬件設備檢測,設備是否存在*/
// if(DEVICE_IS_ATTACHED) /*如果DEVICE_IS_ATTACHED為0卻有設備存在,為1即沒有*/
// return FALSE; /*DEVICE_IS_ATTACHED不為0,沒有設備存在,返回FALSE*/
// else
return TRUE; /*DEVICE_IS_ATTACHED為0,有設備存在,返回TRUE*/
// 注意:如果只操作IDE硬盤,該函數無效,必須使該函數總返回TRUE。
}
/*********************************************************************************************************
** 函數名稱: SYS_PortIn
** 功能描述: 從ATA設備指定的寄存器中讀出一個字的數據,有些寄存器只有一個字節數有效。
** 輸 入: reg 寄存器名稱
** 輸 出: 讀出的數據
** 全局變量:
** 調用模塊:
********************************************************************************************************/
uint16 SYS_PortIn(uint32 reg)
{
uint16 res ;
volatile uint16 *start;
volatile uint16 *data;
volatile uint16 *end;
start = (volatile uint16 *)(ATA_NON|ATA_EN|ATA_RW|reg);
data = (volatile uint16 *) (ATA_NON|ATA_EN|ATA_ALE);
end = (volatile uint16 *) (ATA_NON|ATA_EN|ATA_RW|ATA_OUT|ATA_CS1|ATA_CS0);
*start = 0;
res = *data;
*end = 0;
return res;
}
/*********************************************************************************************************
** 函數名稱: SYS_PortOut
** 功能描述: 向ATA設備指定的寄存器中寫入一個字的數據,有些寄存器只有一個字節數有效。
** 輸 入: reg 寄存器名稱
** 輸 出: 無
** 全局變量:
** 調用模塊:
********************************************************************************************************/
void SYS_PortOut(uint32 reg, uint16 data)
{
volatile uint16 *start;
volatile uint16 *mydata;
volatile uint16 *end;
start = (volatile uint16 *) (ATA_NON|ATA_EN|ATA_RW|ATA_OUT|reg);
mydata = (volatile uint16 *)(ATA_NON|ATA_EN|ATA_ALE);
end = (volatile uint16 *) (ATA_NON|ATA_EN|ATA_RW|ATA_OUT|ATA_CS1|ATA_CS0);
*start = 0;
*mydata = data;
*end = 0;
}
/*********************************************************************************************************
** 函數名稱: SYS_IdeHardReset
** 功能描述: ATA設備硬件復位
** 輸 入: 無
** 輸 出: 無
** 全局變量:
** 調用模塊: SYS_WaitInUS(),等待微秒函數。
********************************************************************************************************/
void SYS_IdeHardReset(void)
{
IO0CLR = ATA_RST; /*復位引腳置低 */
SYS_WaitInUS(30); /*延時大于25微秒 */
IO0SET = ATA_RST; /*復位引腳置高 */
SYS_WaitInUS(5000); /*延時大于2毫秒,設備通常在480ms內完成硬件初始化和自診斷*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -