void SYs PortOut(uint32 reg, uint16 data) 使用16位总线 OS ENTER CRITICALO /关中断* IO2DIR=IO2DIR ATA DATA 设置数据总线为输出* IoICLR= Addr cs at P1 地址与片选信号都为低电平制 lOISEL=reg: /地址高电平位输出完成地址的设置 IO2CLR=ATA DATA /数据总线上输出全为低电平 IO2SET= data<<16 /输出数据高位* LOOCLR= IDE WR. *写信号为低电平保持大于165nS* IOOSET= IDE WR *写信号脚置高[与低>162nsy* IOISET= Addr CS at P1; 输出控制信号置高* IO2DIR & MASK DATA. 使数据线为输入,降低功耗 OS EXIT CRITICALO: /开中断 #endif 开中断及关中断函数如程序清单14所示。 程序清单14开、关总中断函数 #ifndef UCOSll *关中断 nline OS ENTER CRITICAL( void) asm CPSR RO. RO. #NoInt MSR CPSR C RO /*开中断 inline OS EXIT CRITICAL(void) MRS RO CPSR RORO. #NoInt MSR CPSR C RO
#else void SYS_PortOut(uint32 reg, uint16 data) /*使用 16 位总线*/ { OS_ENTER_CRITICAL(); /*关中断*/ IO2DIR = IO2DIR | ATA_DATA; /*设置数据总线为输出*/ IO1CLR = Addr_CS_at_P1; /*地址与片选信号都为低电平*/ IO1SET = reg; /*地址高电平位输出,完成地址的设置*/ IO2CLR = ATA_DATA; /*数据总线上输出全为低电平*/ IO2SET = data<<16; /*输出数据高位*/ IO0CLR = IDE_WR; /*写信号为低电平,保持大于 165nS*/ IO0SET = IDE_WR; /*写信号脚置高[与低>162ns]*/ IO1SET = Addr_CS_at_P1; /*输出控制信号置高*/ IO2DIR &= MASK_DATA; /*使数据线为输入,降低功耗*/ OS_EXIT_CRITICAL(); /*开中断*/ } #endif 开中断及关中断函数如程序清单 1.4 所示。 程序清单 1.4 开、关总中断函数 #ifndef UCOSII (1) #define NoInt 0x80 /* 关中断 */ __inline OS_ENTER_CRITICAL(void) { __asm { MRS R0, CPSR ORR R0, R0, #NoInt MSR CPSR_c, R0 } } /* 开中断 */ __inline OS_EXIT_CRITICAL(void) { __asm { MRS R0, CPSR BIC R0, R0, #NoInt MSR CPSR_c, R0 }
#endif (1)如果驱动用于uOSH操作系统,则不需要编译这两个开、关中断函数,因为在 uCOS中已定义了这两个函数 SYS PortIn0和 SYS PartOut(函数通过使用程序清单15中定义的ATA设备寄存器的地 址的宏作为参数,实现对ATA设备各寄存器的读写操作。 ZLG/CF驱动读写ATA设备寄存器的函数如程序清单16所示 程序清单15设备寄存器地址宏定义 /*GPI0引脚影射寄存器地址*/ Define ATA REG DATA IDE CSI /*数据寄存器* #define ATA REG ERR (IDE CSI IDE AO) /*读错误寄存器* #define ATA REG FEATURE (DE CSI IDE AO) /*写功能寄存器* Define ATA REG SECCNT (IDE CSI IDE Al) /*扇区计数器*/ Define ATA REG SECTOR (IDE CSI IDE Al+ IDE AO) /*扇区号*/ #define ATA REG CYLI LOW (IDE CSI IDE A2) /*柱面低8位*/ #define ATA REG CYLI HIGH (IDE CSI IDE A2+ IDE AO) /*柱面高8位* Define ATA REG DEVICE HEAD (IDE CSI IDE A2 IDE Al /*选择主从,模式,磁头* Define ATA REG COMMAND (IDE_CS1+IDE_A2+IDE_A1+IDEA0)/*写命令寄存器 #define ATA REG STATUS ( IDE CSI+IDE_A2+IDE_A1+IDEA0)/*读状态寄存器* Define ATA REG CONTROL (DE CSO+ IDE A2 IDE Al) /*写控制寄存器* Define ATA REG ASTATUS (IDE CSO IDE A2 IDE Al) *读辅助状态寄存器*/ 程序清单16读写设备相关寄存器接口函数 /驱动与硬件对ATA设备寄存器操作接口* #define GetDatao SYS PortIn(ATA REG DATA) /读数据寄存器,与驱动接口考 SYS PortOut(ATA REG DATA, X) /写数据寄存器,与驱动接口 #define getERRO SYS PortIn(ATA REG ERR) /读错误寄存器,与驱动接口* # define set feature(x) SYS Potou( ATA REG FEATUREX)/写特征寄存器,与驱动接口 #define GetSECCNTO SYS PortIn(ATA REG SECCNT) /读扇区计数寄存器,与驱动接口啊 #define SetsECCNT(x) SYS PortOut(ATA REG SECCNT, X) /写扇区计数寄存器,与驱动接口 #define GetSectorO SYS PortIn(ATA REG SECTOR) *读扇区寄存器与驱动接口* define SetSectort(x) SYS PortOut( ATA REG SECTOR. X)写扇区寄存器与驱动接口 # define GetCylinderLowO SYs_ Portin( ATA REG CYLINDER LOW)/读柱面低寄存器,与驱动接口 # define SetCylinderLow(x) SYS Partout( ATA REG_CYLⅠNDER_LOW,xy写柱面低寄存器与驱动接口 #define GetCylinderHighO SYS PortIn(ATA REG CYLI HIGH /读柱面高8位寄存器,与驱动接口* # define SetCylinderHigh(x)SYS_ Partout( ATA REG CYLI HIGHX)/写柱面高8位寄存器,与驱动接口* # define GetDeviceHeado SYS PortIn( ATA REG DEⅤ CE HEAD)/读设备磁头寄存器,与驱动接口 # define SetDeviceHead(x) SYS PartOut( ATA REG DEYⅥ CE HEAD,x)/*写设备磁头寄存器,与驱动接口 SYS PortIn(ATA REG STATUS) /*读状态寄存器与驱动接口* # define setCommand(x)SYS_ Potou( ATA REG_ COMMAND,x)写命令寄存器与驱动接口 硬件复位函数
} #endif (1) 如果驱动用于 uC/OS-II 操作系统,则不需要编译这两个开、关中断函数,因为在 uC/OS-II 中已定义了这两个函数。 SYS_PortIn()和SYS_PortOut()函数通过使用程序清单1.5中定义的ATA设备寄存器的地 址的宏作为参数,实现对 ATA 设备各寄存器的读写操作。 ZLG/CF 驱动读写 ATA 设备寄存器的函数如程序清单 1.6 所示。 程序清单 1.5 设备寄存器地址宏定义 /*GPIO 引脚影射寄存器地址*/ #define ATA_REG_DATA IDE_CS1 /*数据寄存器*/ #define ATA_REG_ERR (IDE_CS1 + IDE_A0) /*读错误寄存器*/ #define ATA_REG_FEATURE (IDE_CS1 + IDE_A0) /*写功能寄存器*/ #define ATA_REG_SECCNT (IDE_CS1 + IDE_A1) /*扇区计数器*/ #define ATA_REG_SECTOR (IDE_CS1 + IDE_A1 + IDE_A0) /*扇区号*/ #define ATA_REG_CYLI_LOW (IDE_CS1 + IDE_A2) /*柱面低 8 位*/ #define ATA_REG_CYLI_HIGH (IDE_CS1 + IDE_A2 + IDE_A0) /*柱面高 8 位*/ #define ATA_REG_DEVICE_HEAD (IDE_CS1 + IDE_A2 + IDE_A1) /*选择主从,模式,磁头*/ #define ATA_REG_COMMAND (IDE_CS1 + IDE_A2 + IDE_A1 + IDE_A0) /*写命令寄存器*/ #define ATA_REG_STATUS (IDE_CS1 + IDE_A2 + IDE_A1 + IDE_A0) /*读状态寄存器*/ #define ATA_REG_CONTROL (IDE_CS0 + IDE_A2 + IDE_A1) /*写控制寄存器*/ #define ATA_REG_ASTATUS (IDE_CS0 + IDE_A2 + IDE_A1) /*读辅助状态寄存器*/ 程序清单 1.6 读写设备相关寄存器接口函数 /*驱动与硬件对 ATA 设备寄存器操作接口*/ #define GetData() SYS_PortIn(ATA_REG_DATA) /*读数据寄存器,与驱动接口*/ #define SetData(x) SYS_PortOut(ATA_REG_DATA,x) /*写数据寄存器,与驱动接口*/ #define GetERR() SYS_PortIn(ATA_REG_ERR) /*读错误寄存器,与驱动接口*/ #define SetFeature(x) SYS_PortOut(ATA_REG_FEATURE,x) /*写特征寄存器,与驱动接口*/ #define GetSECCNT() SYS_PortIn(ATA_REG_SECCNT) /*读扇区计数寄存器,与驱动接口*/ #define SetSECCNT(x) SYS_PortOut(ATA_REG_SECCNT,x) /*写扇区计数寄存器,与驱动接口*/ #define GetSector() SYS_PortIn(ATA_REG_SECTOR) /*读扇区寄存器,与驱动接口*/ #define SetSector(x) SYS_PortOut(ATA_REG_SECTOR,x) /*写扇区寄存器,与驱动接口*/ #define GetCylinderLow() SYS_PortIn(ATA_REG_CYLINDER_LOW) /*读柱面低寄存器,与驱动接口*/ #define SetCylinderLow(x) SYS_PortOut(ATA_REG_CYLINDER_LOW,x)/*写柱面低寄存器,与驱动接口*/ #define GetCylinderHigh() SYS_PortIn(ATA_REG_CYLI_HIGH) /*读柱面高 8 位寄存器,与驱动接口*/ #define SetCylinderHigh(x) SYS_PortOut(ATA_REG_CYLI_HIGH,x) /*写柱面高 8 位寄存器,与驱动接口*/ #define GetDeviceHead() SYS_PortIn(ATA_REG_DEVICE_HEAD) /*读设备磁头寄存器,与驱动接口*/ #define SetDeviceHead(x) SYS_PortOut(ATA_REG_DEVICE_HEAD,x)/*写设备磁头寄存器,与驱动接口*/ #define GetStatus() SYS_PortIn(ATA_REG_STATUS) /*读状态寄存器,与驱动接口*/ #define SetCommand(x) SYS_PortOut(ATA_REG_COMMAND,x) /*写命令寄存器,与驱动接口*/ 2.硬件复位函数