📄 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)));
IO2DIR |= ATA_RST; // 配置复位引脚为输出
IO2DIR &= ~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_ALE|reg);
data = (volatile uint16 *) (ATA_NON|ATA_EN|ATA_RW|reg);
end = (volatile uint16 *) (ATA_NON|ATA_EN|ATA_ALE|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_ALE|ATA_OUT|reg);
mydata = (volatile uint16 *)(ATA_NON|ATA_EN|ATA_RW|reg);
end = (volatile uint16 *) (ATA_NON|ATA_EN|ATA_ALE|ATA_OUT|ATA_CS1|ATA_CS0);
*start = 0;
*mydata = data;
*end = 0;
}
/*********************************************************************************************************
** 函数名称: SYS_IdeHardReset
** 功能描述: ATA设备硬件复位
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块: SYS_WaitInUS(),等待微秒函数。
********************************************************************************************************/
void SYS_IdeHardReset(void)
{
IO2CLR = ATA_RST; /*复位引脚置低 */
SYS_WaitInUS(30); /*延时大于25微秒 */
IO2SET = ATA_RST; /*复位引脚置高 */
SYS_WaitInUS(5000); /*延时大于2毫秒,设备通常在480ms内完成硬件初始化和自诊断*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -