⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hal4sys.c

📁 前一段参考本程序为AT91RM9200开发板添加了一个USB MSD Bulk-Only下载接口
💻 C
字号:
/*
   //*************************************************************************
   //
   //                  P H I L I P S   P R O P R I E T A R Y
   //
   //           COPYRIGHT (c)   1999 BY PHILIPS SINGAPORE.
   //                     --  ALL RIGHTS RESERVED  --
   //
   // File Name:	    Hal4sys.C
   // Author:           Hilbert Zhang ZhenYu
   // Created:          Nov. 19, 99
   // Modified:
   // Revision: 		0.0.
   //
   //*************************************************************************
   //
   //*************************************************************************
   */
#include <reg51.h>                /* special function register declarations   */
#include <intrins.h>

#undef   GLOBAL_EXT

#include "SysCnfg.h"
#include "BasicTyp.H"

#include "Hal4Sys.h"

/*
   //*************************************************************************
   // Public Data
   //*************************************************************************
*/
// MCU Timer 0
INT8_EXT    Hal4Sys_ClockTicks;
//unsigned char IRQ_Reg_data;

/*
   //*************************************************************************
   // Functions
   //*************************************************************************
*/
void Hal4Sys_InitTimer0(void)
{
    //Init Timer0;
    TIMER0_MODE &= 0XF0;    // clear Timer 0 amd Keep Timer 1
	TIMER0_MODE |= 0X01;    // 16bit Timer
	TIMER0_PRIORITY = 0;    // 0 prority of Timer 0
	TIMER0_IRQ_ENABLE = 1;  // Enable IRQ Timer0

#ifdef WORK_AT_12MHZ
    TIMER0_LOW = 0x00;    // 1 MS interval @12MHz
	TIMER0_HIGH =TIMER0_AT12MHZ;
#endif

#ifdef WORK_AT_24MHZ
    TIMER0_LOW = 0x00;    // 1 MS interval @24MHz
    TIMER0_HIGH =TIMER0_AT24MHZ;
#endif

#ifdef WORK_AT_36MHZ
    TIMER0_LOW = 0x00;    // 1 MS interval @36MHz
    TIMER0_HIGH =TIMER0_AT36MHZ;
#endif

#ifdef WORK_AT_48MHZ
    TIMER0_LOW = 0x00;    // 1 MS interval @48MHz
    TIMER0_HIGH =TIMER0_AT48MHZ;
#endif

    TIMER0_START = 1;       // Start Timer 0
}

void Hal4Sys_Wait4US(void)
{
#ifdef WORK_AT_12MHZ
    // @12MHz
    // LCALL = 2 MC
    // RET = 2MC
#endif

#ifdef WORK_AT_24MHZ
    // @24MHz
    _nop_();
    _nop_();
    _nop_();
    _nop_();
#endif

#ifdef WORK_AT_36MHZ
    // @36MHz
    _nop_();
    _nop_();
    _nop_();
    _nop_();

    _nop_();
    _nop_();
    _nop_();
    _nop_();
#endif

#ifdef WORK_AT_48MHZ
    // @48MHz
    _nop_();
    _nop_();
    _nop_();
    _nop_();

    _nop_();
    _nop_();
    _nop_();
    _nop_();

    _nop_();
    _nop_();
    _nop_();
    _nop_();
#endif
}
void Hal4Sys_WaitInUS(INT16 time)
{

#ifdef WORK_AT_12MHZ
    time >>= 3; //time = time * MACHINECYCLE_AT12MHZ/LOOP_MC;
#endif

#ifdef WORK_AT_24MHZ
    time >>= 2; //time = time * MACHINECYCLE_AT24MHZ/LOOP_MC;
#endif

#ifdef WORK_AT_36MHZ
    time >>= 1; //time = time * MACHINECYCLE_AT36MHZ/LOOP_MC;
#endif

#ifdef WORK_AT_48MHZ
    time >>= 1; //time = time * MACHINECYCLE_AT48MHZ/LOOP_MC;
#endif

   for( ; time != 0; time -- );
 }


/*-----------------------------------------------------------
//    Address memory map
// 		D12_command	$101
//		D12_data	$100
//
//		ATA_error_reg 			$1F1 (read)
//		ATA_feature_reg			$1F1 (write)
//		ATA_sector_count_reg	$1F2 (read/write)
//		ATA_sector_number_reg	$1F3 (read/write)
//		ATA_Cylinder_low_reg	$1F4 (read/write)
//		ATA_Cylinder_high_reg	$1F5 (read/write)
//		ATA_drive/head_reg		$1F6 (read/write)
//		ATA_status_reg			$1F7 (read)
//		ATA_command_reg			$1F7 (write)
//		ATA_alternate_status_reg $3F6 (read)
//		ATA_device_control_reg	$3f6 (write)
//		ATA_drive_address_reg	$3f7 (read)

*/
void Hal4Sys_WaitInMS(INT8 time)
{
    LowerIRQL();
    time += Hal4Sys_ClockTicks;
	//while(Hal4Sys_ClockTicks != time );
}

/*  PIO mode for D12 access */

void Hal4Sys_D12CmdPortOutB( INT8 val)
{
//     	 unsigned char xdata *ext_address;
//	     ext_address=D12_command;
//	     *ext_address = val;              //   write cycle
  *((INT8 xdata *)D12_command) = val;

}

void Hal4Sys_D12DataPortOutB( INT8 val)
{
//    	 unsigned char xdata *ext_address;
//     ext_address=(D12_data&0xff00);
//	     *ext_address = val;              //   write cycle

  *((INT8 xdata *)D12_data) = val;

}

unsigned char Hal4Sys_D12DataPortInB( void)
{

//  	     unsigned char c;
//         unsigned char xdata *ext_address;
//         ext_address=(D12_data&0xff00);
//         c = *ext_address ;              //   read cycle
//       	 return c;
 return *((INT8 xdata *)D12_data);

}


void Hal4Sys_ATAPortOutB(INT16 Addr, INT8 Data)
{

//   		 unsigned char xdata *ext_address;
//   	     ext_address = (Addr & 0xff00);
//	     *ext_address = Data;
 *((INT8 xdata *)Addr) = Data;

}

INT8 Hal4Sys_ATAPortInB(INT16 Addr)
{
 		return *((INT8 xdata *)Addr);

}

INT16 Hal4Sys_ATADataPortInW(void)
{
 //    INT16 i;
 return  *((INT16 xdata *)ATAREG4IN_DATA);
 //    i += ( *((INT8 xdata *)ATAREG4IN_DATA2))<<8;    // HI = P0
 //    return(i);
}

/*
INT16 Hal4Sys_SwapINT16(INT16 wData)
{
    return ( (wData<<8)|(wData>>8) );
}

INT32 Hal4Sys_SwapINT32(INT32 dData)
{
    dData = (dData&0xff)<<24|(dData&0xff00)<<8|(dData&0xff000000)>>24|(dData&0xff0000)>>8;
	return dData;

}
*/

void Hal4Sys_ResetD12(void)
{
  //  D12CS_N  = 1; // CS disactive!!!
    D12RST_N = 0; // reset D12 , Holdup time > 2 uS.
   // Hal4Sys_Wait4US();
    Hal4Sys_WaitInMS(2000);
    D12RST_N = 1;
  //  D12CS_N  = 0;
    Hal4Sys_WaitInUS(400);
}

void Hal4Sys_InitD12(void)
{
    Hal4Sys_ResetD12();

    D12INT_EDGE = 0;        // Level trigle for D12INT_N
    D12INT_PRIORITY = 0;    // 0 Priority Level of D12INT_N
    D12INT_ENABLE = 1;      // Enalbe External IRQ0 for D12INT_N
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -