?? sysata.c
字號(hào):
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機(jī)發(fā)展有限公司
** 研 究 所
** 產(chǎn)品一部
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: IDE.c
**創(chuàng) 建 人: 周立山
**最后修改日期:
**描 述: 與ZLG/CF驅(qū)動(dòng)的接口函數(shù)。
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: 周立山
** 版 本: v1.0
** 日 期:
** 描 述: 完整版
**
**--------------當(dāng)前版本修訂------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
/*********************************************************************************************************
** 函數(shù)名稱(chēng): SYS_BusIni
** 功能描述: ATA總線(xiàn)初始化
** 輸 入: 無(wú)
** 輸 出: 無(wú)
** 全局變量: 無(wú)
** 調(diào)用模塊: 無(wú)
********************************************************************************************************/
void SYS_BusIni(void)
{
PINSEL1 &= 0xffffc003; /*使用到的P0口GPIO引腳設(shè)置*/
PINSEL2 = (PINSEL2 & 0x0f8cf9c0) | 0x00000014; /*使用到的P1及P2口GPIO引腳設(shè)置*/
IO0DIR &= (~(IDE_DMAREQ + IDE_INTRQ)); /*P0相關(guān)輸入引腳初始化*/
IO0DIR |= (IDE_RST + IDE_WR + IDE_RD); /*P0相關(guān)輸出引腳初始化*/
IO1DIR &= (~(IDE_DMACK + IDE_IOCS16 + IDE_PDIAG)); /*P1相關(guān)輸入引腳初始化*/
IO1DIR |= (IDE_A0 + IDE_A1 +IDE_A2 + IDE_CS0 + IDE_CS1 + IDE_CSEL); /*P1相關(guān)輸出引腳初始化*/
IO2DIR &= (~ATA_DATA); /*數(shù)據(jù)總線(xiàn)初始化為輸入*/
IO0SET = IDE_RST + IDE_WR + IDE_RD; /*CF卡復(fù)位引腳及讀寫(xiě)信號(hào)引腳初始輸出高電平*/
IO1SET = IDE_CS0 + IDE_CS1; /*CF卡片選初始化輸入高電平*/
IO1CLR = IDE_A0 + IDE_A1 +IDE_A2 + IDE_CSEL; /*地址初始化,并設(shè)置當(dāng)前CF卡為主盤(pán)*/
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng): SYS_WaitInUS
** 功能描述: 延時(shí)等級(jí)約1微秒函數(shù),該函數(shù)根據(jù)系統(tǒng)時(shí)間不同與不同,但不應(yīng)少到1微秒。
** 輸 入: times,延時(shí)時(shí)間等級(jí)
** 輸 出: 無(wú)
** 全局變量: 無(wú)
** 調(diào)用模塊: 無(wú)
********************************************************************************************************/
void SYS_WaitInUS(uint32 times)
{ uint32 c;
for(;0<times;times--)
for(c=0;c<4;c++);
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng): ATA_HaveCard
** 功能描述: 判斷CF卡是否連接到,CF卡的CD1、CD2引腳與GND直接相接,可以通過(guò)該引腳判斷CF卡是否存在
** (對(duì)于IDE硬盤(pán)也有也多共地的引腳,也可以像CF卡那樣檢測(cè)但是這點(diǎn)ATA規(guī)范中并沒(méi)有說(shuō)明)。
** 如果硬件上沒(méi)有相關(guān)的檢測(cè),則應(yīng)一直返回TRUE。
** 輸 入: 無(wú)
** 輸 出: TRUE,如果有設(shè)備存在,不管設(shè)備是主或是從,或可以返回TRUE(1);
** FALSE,如果設(shè)備不存在,即返回FALSE(0)
** 全局變量: 無(wú)
** 調(diào)用模塊: 無(wú)
********************************************************************************************************/
uint8 SYS_HaveCard(void)
{
#define DEVICE_IS_ATTACHED 0 /*硬件設(shè)備(EasyARM2200開(kāi)發(fā)板)沒(méi)有檢測(cè),設(shè)備是否存在*/
/*假設(shè)使用LPC2210的P1.23(有10K的電上電阻)引腳的GPIO輸入方式檢測(cè)設(shè)備是否存在,可以如下操作*/
//#define DEVICE_IS_ATTACHED (IO1PIN & (1<<23))
if(DEVICE_IS_ATTACHED) /*如果DEVICE_IS_ATTACHED為0卻有設(shè)備存在,為1即沒(méi)有*/
return FALSE; /*DEVICE_IS_ATTACHED不為0,沒(méi)有設(shè)備存在,返回FALSE*/
else
return TRUE; /*DEVICE_IS_ATTACHED為0,有設(shè)備存在,返回TRUE*/
}
#ifndef UCOSII
#define NoInt 0x80
/* 關(guān)中斷 */
__inline OS_ENTER_CRITICAL(void)
{
__asm
{
MRS R0, CPSR
ORR R0, R0, #NoInt
MSR CPSR_c, R0
}
}
/* 開(kāi)中斷 */
__inline OS_EXIT_CRITICAL(void)
{
__asm
{
MRS R0, CPSR
BIC R0, R0, #NoInt
MSR CPSR_c, R0
}
}
#endif
/*********************************************************************************************************
** 函數(shù)名稱(chēng): SYS_PortIn
** 功能描述: 從ATA設(shè)備指定的寄存器中讀出一個(gè)字的數(shù)據(jù),有些寄存器只有一個(gè)字節(jié)數(shù)有效。
** 輸 入: reg 寄存器名稱(chēng)
** 輸 出: 讀出的數(shù)據(jù)
** 全局變量: 無(wú)
** 調(diào)用模塊: OS_ENTER_CRITICAL(),關(guān)中斷
** OS_EXIT_CRITICAL(),清中斷
********************************************************************************************************/
#ifdef ATA_BUS_AT_8bit
uint16 SYS_PortIn(uint32 reg)
{
uint16 res ;
OS_ENTER_CRITICAL(); /*關(guān)中斷*/
IO2DIR = IO2DIR & MASK_DATA; /*定義輸出口其它為輸入(ATA_DATA為輸入)*/
IO1CLR = Addr_CS_at_P1; /*地址與片選信號(hào)都為低電平*/
IO1SET = reg; /*地址高電平位輸出,完成地址的設(shè)置*/
/*讀低字節(jié)*/
IO0CLR = IDE_RD; /*讀信號(hào)腳置低*/
res = (uint8)((IO2PIN&ATA_DATA) >>16); /*讀取數(shù)據(jù)*/
IO0SET = IDE_RD; /*使讀信號(hào)為高*/
/*讀高字節(jié)*/
if(reg==ATA_REG_DATA) /*如果讀數(shù)據(jù)寄存器,讀高字節(jié)*/
{
IO0CLR = IDE_RD; /*讀信號(hào)腳置低*/
res += (uint16)((IO2PIN&ATA_DATA)>>8); /*讀取數(shù)據(jù)*/
IO0SET = IDE_RD; /*使讀信號(hào)為高*/
}
IO1SET = Addr_CS_at_P1; /*輸出控制信號(hào)置高*/
OS_EXIT_CRITICAL(); /*開(kāi)中斷*/
return res; /*返回?cái)?shù)值*/
}
#else
uint16 SYS_PortIn(uint32 reg)
{
uint16 res ;
OS_ENTER_CRITICAL(); /*關(guān)中斷*/
IO2DIR = IO2DIR & MASK_DATA; /*定義輸出口其它為輸入(ATA_DATA為輸入)*/
IO1CLR = Addr_CS_at_P1; /*控所硬盤(pán)引腳信號(hào)輸出(輸出高電平)*/
IO1SET = reg; /*控所硬盤(pán)引腳信號(hào)輸出(輸出低電平)*/
IO0CLR = IDE_RD; /*讀信號(hào)腳置低*/
res = (uint16)(IO2PIN >>16); /*讀取數(shù)據(jù)*/
IO0SET = IDE_RD;
IO1SET = Addr_CS_at_P1; /*輸出控制信號(hào)置高*/
OS_EXIT_CRITICAL(); /*開(kāi)中斷*/
return res;
}
#endif
/*********************************************************************************************************
** 函數(shù)名稱(chēng): SYS_PortIn
** 功能描述: 向ATA設(shè)備指定的寄存器中寫(xiě)入一個(gè)字的數(shù)據(jù),有些寄存器只有一個(gè)字節(jié)數(shù)有效。
** 輸 入: reg 寄存器名稱(chēng)
** 輸 出: 無(wú)
** 全局變量: 無(wú)
** 調(diào)用模塊: OS_ENTER_CRITICAL(),關(guān)中斷
** OS_EXIT_CRITICAL(),清中斷
********************************************************************************************************/
#ifdef ATA_BUS_AT_8bit
void SYS_PortOut(uint32 reg, uint16 data)
{
OS_ENTER_CRITICAL(); /*關(guān)中斷*/
IO2DIR = IO2DIR | ATA_DATA; /*設(shè)置數(shù)據(jù)總線(xiàn)為輸出*/
IO1CLR = Addr_CS_at_P1; /*地址與片選信號(hào)都為低電平*/
IO1SET = reg; /*地址高電平位輸出,完成地址的設(shè)置*/
/*寫(xiě)低字節(jié)*/
IO2CLR = ATA_DATA; /*數(shù)據(jù)總線(xiàn)上輸出全為低電平*/
IO2SET = data<<16; /*輸出數(shù)據(jù)高位*/
IO0CLR = IDE_WR; /*寫(xiě)信號(hào)為低電平,保持大于165nS*/
IO0SET = IDE_WR; /*寫(xiě)信號(hào)腳置高[與低>162ns]*/
if(reg==ATA_REG_DATA) /*如果訪(fǎng)問(wèn)的寄存器為16位的數(shù)據(jù)寄存器*/
{ /*寫(xiě)高字節(jié)*/
IO2CLR = ATA_DATA; /*數(shù)據(jù)線(xiàn)輸出全為低電平*/
IO2SET = data<<8; /*輸出高電平的數(shù)據(jù)位*/
IO0CLR = IDE_WR; /*寫(xiě)信號(hào)為低電平,保持大于165nS*/
IO0SET = IDE_WR; /*寫(xiě)信號(hào)腳置高[與低>162ns]*/
}
IO1SET = Addr_CS_at_P1; /*輸出控制信號(hào)置高*/
IO2DIR &= MASK_DATA; /*使數(shù)據(jù)線(xiàn)為輸入,降低功耗*/
OS_EXIT_CRITICAL(); /*開(kāi)中斷*/
}
#else
void SYS_PortOut(uint32 reg, uint16 data)
{
OS_ENTER_CRITICAL(); /*關(guān)中斷*/
IO2DIR = IO2DIR | ATA_DATA; /*設(shè)置數(shù)據(jù)總線(xiàn)為輸出*/
IO1CLR = Addr_CS_at_P1; /*地址與片選信號(hào)都為低電平*/
IO1SET = reg; /*地址高電平位輸出,完成地址的設(shè)置*/
IO2CLR = ATA_DATA; /*數(shù)據(jù)總線(xiàn)上輸出全為低電平*/
IO2SET = data<<16; /*輸出數(shù)據(jù)高位*/
IO0CLR = IDE_WR; /*寫(xiě)信號(hào)為低電平,保持大于165nS*/
IO0SET = IDE_WR; /*寫(xiě)信號(hào)腳置高[與低>162ns]*/
IO1SET = Addr_CS_at_P1; /*輸出控制信號(hào)置高*/
IO2DIR &= MASK_DATA; /*使數(shù)據(jù)線(xiàn)為輸入,降低功耗*/
OS_EXIT_CRITICAL(); /*開(kāi)中斷*/
}
#endif
/*********************************************************************************************************
** 函數(shù)名稱(chēng): SYS_IdeHardReset
** 功能描述: ATA設(shè)備硬件復(fù)位
** 輸 入: 無(wú)
** 輸 出: 無(wú)
** 全局變量: 無(wú)
** 調(diào)用模塊: SYS_WaitInUS(),等待微秒函數(shù)。
********************************************************************************************************/
void SYS_IdeHardReset(void)
{
IOCLR = IDE_RST; /*復(fù)位引腳置低 */
SYS_WaitInUS(30); /*延時(shí)大于25微秒 */
IOSET = IDE_RST; /*復(fù)位引腳置高 */
SYS_WaitInUS(5000); /*延時(shí)大于2毫秒,設(shè)備通常在480ms內(nèi)完成硬件初始化和自診斷*/
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -