广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
ZLG/CF驱动中间件简要说明
CF 卡可以工作在 PC Card ATA I/O 模式( I/O 口模式),PC Card ATA Memory 模式
(MEMORY 模式 ),True IDE 模式。 CF 卡在 True IDE 模式下工作时兼容 IDE 硬盘,并且需用的 I/O 引 脚较少,因此推荐使用 CF 卡的 True IDE 模式。 ZLG/CF 驱动 中间件是基于 CF
卡 True IDE 模式的驱动,同时兼容 IDE 硬盘。
1 概述
1.1 ZLG/CF 简介
ZLG/CF 是广州周立功单片机发展有限公司开发的面向嵌入式系统开发中间件,是 ZLG
系列中间件的重要成员之一。该驱动可以实现对 CF 卡及 IDE 硬盘等大 容量 ATA 设 备存贮等基本操作 。其通过 μC/OS-II 实时操 作系统的信 号机制来实 现一个多任 务并行,完 全使 用
ANSI C 进行编写,可以象 μC/OS-II 那样支持多种 CPU。
1.2 ZLG/IP 的特点
该驱动通 过 简单的配 置 可以分别 使 用于单任 务 平台或基 于 μC/OS-II 实时 多任务操 作 系统平台; 全部代码由 ANSI C 编写,并且与目标处理器的存储器结构无关 (即与无论存储 器是大端结构 还是小端结 构均不影响 程序的执行),方便用 户 移植到自 己 的目标系 统 中 ;
ZLG/CF 为嵌入系统设计,如果您有固化手段,它可以嵌入到您的产品中成为产品的一部分。
2 ZLG/CF 驱动的结构视图
CF 卡驱动的结构如图 1 所示。
系统 硬件 GPIO
ATA设 备硬件 复位
ATA设 备探测
ATA设 备初始 化
ATA指 令执行应用 层
(文 件管理 系统 )
读写 ATA设备寄存 器操作ATA设备的API
函数
图 1 CF 卡驱动结构图
2.1 系统硬件 GPIO
使用系统的 I/O 引脚模拟 CF 卡接口及 IDE 硬盘接口。为读写 ATA 设备寄存器,ATA
设备硬件复位及 ATA 设备探测提供硬件接口。
- 1 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
2.2 读写 ATA 设备寄存器
控制硬件系统的 I/O 引脚,产生访问 CF 卡等 ATA 设备寄存器的读写时序,实现对 ATA
设备寄存器的访问,为 ATA 指令执行提供接口函数。
2.3 ATA 设备硬件复位
使用系统硬件层提供的硬件接口,控制 CF 卡等 ATA 设备进行硬件复位,为 ATA 设备初始化提供接口函数。
2.4 ATA 设备探测
使用系统硬件层提供的硬件接口,探测 CF 卡等 ATA 设备是否存在、插入和移出。使系统支持 CF 卡等 ATA 设备的热插拔。
2.5 ATA 设备初始化
系统起动时或探测到有 CF 卡等 ATA 设备插入时,需要使 ATA 设备复位,并初始化设备信息。初始化设备信息是通过执行设备识别指令获得。
2.6 ATA 指令执行
调用 ATA 设备寄存器的读写函数,操作 CF 卡的 ATA 指令集实现对 CF 卡等 ATA 设备操作。 ATA 指令执行为操作 ATA 设备的 API 函数层提供函数接口。
2.7 操作 ATA 设备的 API 函数
使用执行 ATA 指令函数,为应用层提供操作 CF 卡等 ATA 设备提供接口函数。使应用层操作 ATA 设备而不需要了解 ATA 的协议规范。
2.8 应用层(文件管理系统)
调用 ZLG/CF 驱动提供的 API 函数,结合 ZLG/FS 等文件管理系统对 CF 卡等 大容量 ATA
设备进行数据管理。
3 中间件配置选项
基于 uC/OS-II 操作系统
本驱动可用于单任务系统(不基于操作系统)和 uC/OS-II 多任务操 作系统,可通过
“U COSII” 宏 定义参数来选择。 如果基于 uC/OS-II 多任务操作系统,则需在,con fig.h” 配置文件中定义,UCOSII” 宏,如程序清单 1 中的(2)所示。
程序清单 1 驱动配置
/* CF 卡 IDE 的配置 */
#include "ide.h" (1)
#define UCOSI (2)
#define ATA_BUS_AT_8bit (3)
null 头文件
使用本驱动前,需在配置文件中包含头文件“IDE.H”如程序清单 1 中的(1)所示。
null 使用一个信号量
本驱动需要使用一个信号量事件,在配置 uC/OS-II 中的 OS_MAX_EVENTS 参 数时需注意。
null 总线设置
CF 卡默认支 持 16 位总线,但也可以设置为 8 位 。如果使用的是 8 位 总 线,需要对宏
“ATA_BUS_AT_8bit”进行定义,如程序清单 1 中的(3) 。
- 2 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
4 函数手册
4.1 硬件接口函数
硬件接口函数是与系统硬件相关的函数集,这部分函数为用户系统硬件与本驱动的接口函数。用户需针对自己的硬件系统来编写这部分函数。
表 1 和 表 2 描述了硬件系统需要提供给本驱动使用的接口函数。
表 1 SYS_IdeHardReset 函数
函数名称 SYS_IdeHardReset 所属文件 SysATA.C
函数原型 uint8 SYS_IdeHardReset (void)
功能描述 ATA 设备硬件复位
编译开关 无
函数参数 无
函数返回值

调用模块 Sys_WaitInUS() 延时微秒级函数
特殊说明
和注意要点
使复位引脚 IDE_RST 有效 (低电平 )保持大于 25 微秒,IDE_RST 无效 (高电 平 )后至少延迟 2 毫秒才可以对 ATA 设备读写寄存器操作。
范 例 void SYS_IdeHardReset(void) /*基于 ARM LPC2210,GPIO 引脚 IDE_RST*/
{
IOCLR = IDE_RST; /* 复位引脚置低 */
SYS_WaitInUS(30); /* 延时大于 25 微秒 */
IOSET = IDE_RST; /* 复位引脚置高 */
SYS_WaitInUS(5000); /* 延时大于 2 毫秒 */
}
表 2 ATA 设备寄存器操作函数列表
函数 输入数据类型 返回数据类型 描述
GetData() 无 unsigned char / unsigned short 读数据寄存器
SetData(x) unsigned char / unsigned short 无 写数据寄存器
GetERR() 无 unsigned char 读错误寄存器
SetFeature(x) unsigned char 无 写特征寄存器
GetSECCNT() 无 unsigned char 读扇区计数寄存器
SetSECCNT(x) unsigned char 无 写扇区计数寄存器
GetSector() 无 unsigned char 读扇区寄存器
SetSector(x) unsigned char 无 写扇区寄存器
GetCylinderLow() 无 unsigned char 读柱面低 8位寄存器
SetCylinderLow(x) unsigned char 无 写柱面低 8位寄存器
GetCylinderHigh() 无 unsigned char 读柱面高 8位寄存器
SetCylinderHigh(x) unsigned char 无 写柱面高 8位寄存器
GetDeviceHead() 无 unsigned char 读设备磁头寄存器
SetDeviceHead(x) unsigned char 无 写设备磁头寄存器
GetStatus() 无 unsigned char 读状态寄存器
SetCommand(x) unsigned char 无 写命令寄存器
GetAStatus() 无 unsigned char 读辅助状态寄存器
- 3 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
SetControl(x) unsigned char 无 写控制寄存器
表 3 ATA 设备探测函数
函数名称 SYS_HaveCard 所属文件 SysATA.C
函数原型 uint8 SYS_HaveCard(void)
功能描述 探测 CF 存储卡的插入及移出
编译开关 无
函数参数 无
函数返回值 TRUE,ATA 设备存在
FALSE,ATA 设备已移出或不存在
调用模块 无
特殊说明
和注意要点
该函数是必须的,即使硬件系统中没有设计对 ATA 设备 探测,也应使该函数一直返回 TRUE。
范 例
uint8 SYS_HaveCard(void)
{
#define DEVICE_IS_ATTACHED 0 /*硬件系统不探测设备是否存在 */
/*假设使用 LPC2210 的 P1.23(有 10K 的电 上电阻) 引脚的 GPIO 输入 方式检测设备是否存在,可以如下操作 */
//#define DEVICE_IS_ATTACHED (IO1PIN & (1<<23))
/*如果 DEVICE_IS_ATTACHED 为 0 却有设备存在,为 1 即没有 */
if(DEVICE_IS_ATTACHED)
return FALSE; /*没有设备存在,返回 FALSE*/
else
return TRUE; /*有设备存在,返回 TRUE*/
}
4.2 用户使用函数
使用 ZLG/CF 驱动程序,系统可以通过以下函数对 CF 卡等 ATA 设备进行基本操作。
表 4 ATA_INI 函数
函数名称 ATA_INI 所属文件 IDE.C
函数原型 void ATA_INI(void)
功能描述 ATA 设备驱 动初始化,应用于 uCOSII 操作系统,在该函数中创建信号量
CFIDESem。
编译开关 无
函数参数 无
函数返回值 无
调用模块 OSSemCreate()
特殊说明
和注意要点
在 uCOSII 操作系统中,对 ATA 设备进行操作前,必须先执行该函数。
范 例
main()
{
…,
ATA_INI(void);
ATA_FindIDEDevice();
…,
}
- 4 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
表 5 ATA_FindIDEDevice 函数
函数名称 ATA_FindIDEDevice 所属文件 IDE.C
函数原型 uint8 ATA_FindIDEDevice(void)
功能描述 对 ATA 接口设备进行进硬件复位,查找 ATA 接口上的设备。
编译开关 无
函数参数 无
函数返回值 无
调用模块 SYS_IdeHardReset () ATA 设备硬件复位
SetDeviceHead() 写设备磁头寄存器
GetDeviceHead() 读设备磁头寄存器
ATA_SetFeature () 功能设置函数
ATA_IssueIDEIdentify () ATA 设备识别
特殊说明
和注意要点
发现在新的设接入 ATA 接口时,调用该函数查找设备。
范 例 见表 4 范例。
表 6 ATA_ReadSector 函数
函数名称 ATA_ReadSector 所属文件 IDE.C
函数原型 uint8 ATA_ReadSector(uint8 Device,uint16 *Buffer,uint32 Sector,uint8 count)
功能描述 从硬盘读取一或多个扇区,放入到形参指定的内存中
编译开关 无
函数参数 Buffer,读出数据存放缓冲区地址
Sector,读扇区号
Count,连续读出的扇区数
函数返回值
TRUE:成功
FALSE:失败
调用模块
OSSemPend(),等待信号量
ATA_SelectDevice (),选择设备
ATA_WaitOnBusyNDrq(),等待数据请求
ATA_ReadData512B(),读 512 字节数据
ATA_WaitOnBusyNDrdy (),等待数据空闲
OSSemPost(),发送信号量
特殊说明
和注意要点
每读出一个扇区值为 512 节 字,读出的扇区数为 1~256 个,扇区数为 0 即为 256
个扇区。
范 例
// 在从设备 0 号扇区开始连续读出 2 个扇区的数据。
if(ATA_ReadSector(0x01,Buffer,0x00,0x02)==0)
{
/* 错误处理程序 */
}
表 7 ATA_WriteSector 函数
函数名称 ATA_WriteSector 所属文件 IDE.C
函数原型 uint8 ATA_WriteSector(uint8 Device,uint16 * Buffer,uint32 Sector,uint8 count)
功能描述 向 CF 卡或硬盘写入一或多个扇区数据
编译开关 无
函数参数 Device,选择操作的设备,0 为主设备,1 为从设备
- 5 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
Buffer,需写数的缓冲区地址
Sector,写入的扇区号
count,写入的扇区数
函数返回值
TRUE:成功
FALSE:失败
调用模块
OSSemPend(),等待信号量
ATA_SelectDevice (),选择设备
ATA_WaitOnBusyNDrq(),等待数据请求
ATA_WriteData512B(),写 512 字节数据
ATA_WaitOnBusyNDrdy (),等待数据空闲
OSSemPost(),发送信号量
特殊说明
和注意要点
每写入一个扇区值为 512 节 字,写入的扇区数为 1~256 个,扇区数为 0 即为 256
个扇区。
范 例
// 从主设备 0 号扇区开始连续写入 2 个扇区的数据。
if(ATA_WriteSector(0,Buffer,0x00,0x02)==0)
{
/* 错误处理程序 */
}
表 8 ATA_IdentifyDrive()函数
函数名称 ATA_IdentifyDrive 所属文件 IDE.C
函数原型 uint8 ATA_IdentifyDrive(uint8 Device,void *PTR)
功能描述 获取 ATA 设备描述信息。
编译开关 无
函数参数 Device,选择操作的设备,0 为主设备,1 为从设备
PTR,保存设备信息的缓冲区首址,。
函数返回值
TRUE:成功
FALSE:失败
调用模块
OSSemPend(),等待信号量
ATA_SelectDevice (),选择设备
ATA_WaitOnBusyNDrq(),等待数据请求
ATA_DriveAllInfo (),读取设备信息到缓冲区
ATA_WaitOnBusyNDrdy (),等待数据空闲
OSSemPost(),发送信号量
特殊说明
和注意要点
PTR 指向的缓冲区大于 512 节字。
范 例
if(ATA_IdentifyDrive(SelectDevice,buffer8))
{
#define DRIVEINFO ((PCF_IDENTIFY_DATA)buffer8) /*宏定义结构指针 */
Send("型 号,");
for(i=0;i<20;i++)
{
printf ("柱 面 数,");
SendHEXtoASC16(DRIVEINFO->NumberOfCylinders);
newline();// 换行
printf ("每柱面磁头数,");
SendHEXtoASC16(DRIVEINFO->NumberOfHeads);
newline();// 换行
printf ("每磁道扇区数,");
SendHEXtoASC16(DRIVEINFO->SectorsPerTrack);
newline();// 换行
}
else { /*出错处理 */ }
- 6 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
表 9 ATA_StandbyImmediate 函数
函数名称 ATA_StandbyImmediate 所属文件 IDE.C
函数原型 uint8 ATA_StandbyImmediate(uint8 Device)
功能描述 使 ATA 设备立即进入特机状态。
编译开关 无
函数参数 Device,选择操作的设备,0 为主设备,1 为从设备
函数返回值
TRUE:成功
FALSE:失败
调用模块
OSSemPend(),等待信号量
ATA_SelectDevice (),选择设备
ATA_WaitOnBusyNDrdy (),等待数据空闲
OSSemPost(),发送信号量
特殊说明
和注意要点
如果该设备不支持电源管理特性设置,执行该指令将发生指令中止出错。
范 例
if(ATA_StandbyImmediate(SelectDevice))
printf("进入待机,硬盘停止转动。 \n");
else
printf ("设备不支持电源管理特性,或设备不可用。 \n");
表 10 ATA_IdleImmediate()函数
函数名称 ATA_ IdleImmediate 所属文件 IDE.C
函数原型 uint8 ATA_ IdleImmediate (uint8 Device)
功能描述 使 ATA 设备立即返回空闲状态。
编译开关 无
函数参数 Device,选择操作的设备,0 为主设备,1 为从设备
函数返回值
TRUE:成功
FALSE:失败
调用模块
OSSemPend(),等待信号量
ATA_SelectDevice (),选择设备
ATA_WaitOnBusyNDrdy (),等待数据空闲
OSSemPost(),发送信号量
特殊说明
和注意要点
如果该设备不支持电源管理特性设置,执行该指令将发生指令中止出错。
范 例
if(ATA_ IdleImmediate (SelectDevice))
Send("设备返回空闲,硬盘开始转动。 \n");
else
Send("设备不支持电源管理特性,或设备不可用。 \n");
- 7 -