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

📄 misc-watchdog-1.c

📁 本程序是在arm9200平台上实现看门狗的驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);
		AT91_SYS->PIOB_CODR=MY_RTC_CS;	
		udelay(20);

//--------------------------------------------
//write year 
//--------------------------------------------
		AT91_SYS->PIOB_OER|=MY_RTC_IO;
		cmd=0x8c;//year register
		AT91_SYS->PIOB_SODR=MY_RTC_CS;
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);

		cmd=my_date_set.year;//0x01;//mmy_time_set.year;//0x11;//year data
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);
		AT91_SYS->PIOB_CODR=MY_RTC_CS;	
		udelay(20);

//---------------------------------------------
//write month
//---------------------------------------------
		AT91_SYS->PIOB_OER|=MY_RTC_IO;
		cmd=0x88;//month register
		AT91_SYS->PIOB_SODR=MY_RTC_CS;
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);

		cmd=my_date_set.month;//month data
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);
		AT91_SYS->PIOB_CODR=MY_RTC_CS;	
		udelay(20);
//---------------------------------------------------
//write day
//---------------------------------------------------
		AT91_SYS->PIOB_OER|=MY_RTC_IO;
		cmd=0x86;//day register
		AT91_SYS->PIOB_SODR=MY_RTC_CS;
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);

		cmd=my_date_set.day;//day data
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);
		AT91_SYS->PIOB_CODR=MY_RTC_CS;	
		udelay(20);
}

//--------------------------------------------------------------------------------
//--------read time
//--------------------------------------------------------------------------------
static void write_rtc_time( struct my_time my_time_set )
{
		int i;
		unsigned char bit;
		unsigned char cmd=0x05;
		unsigned char read_data=0;

//		struct my_time m;

//--------------------------------------------------------------------
//write write protect reg
//---------------------------------------------------------------------
		AT91_SYS->PIOB_OER|=MY_RTC_IO;///set RTC_IO output
		cmd=0x8e;//write protect reg
		AT91_SYS->PIOB_SODR=MY_RTC_CS;
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);

		cmd=0x00;//=0x00 register can write ,=0x80 register can not write
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);
		AT91_SYS->PIOB_CODR=MY_RTC_CS;
		udelay(20);
//------------------------------------------
//write second to enable osc
//------------------------------------------
		AT91_SYS->PIOB_OER|=MY_RTC_IO;
		cmd=0x80;//second reg
		AT91_SYS->PIOB_SODR=MY_RTC_CS;
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);

		cmd=0x00;//=0x00 osc is enable =0x80 osc is disable
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);
		AT91_SYS->PIOB_CODR=MY_RTC_CS;	
		udelay(20);

//----------------------------------------------
//write hour
//----------------------------------------------
		AT91_SYS->PIOB_OER|=MY_RTC_IO;
		cmd=0x84;//hour register
		AT91_SYS->PIOB_SODR=MY_RTC_CS;
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);

		cmd=my_time_set.hour;//hour data
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);
		AT91_SYS->PIOB_CODR=MY_RTC_CS;	
		udelay(20);
//--------------------------------------------------
//write min
//--------------------------------------------------
		AT91_SYS->PIOB_OER|=MY_RTC_IO;
		cmd=0x82;//min register
		AT91_SYS->PIOB_SODR=MY_RTC_CS;
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);

		cmd=my_time_set.min;//min data
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd>>i )&0x01;
				if( bit )
						AT91_SYS->PIOB_SODR=MY_RTC_IO;
	      else
						AT91_SYS->PIOB_CODR=MY_RTC_IO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;
				udelay(5);
				}

		udelay(20);
		AT91_SYS->PIOB_CODR=MY_RTC_CS;	
}
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
//------------------------functions of Fram
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------

//---------------------------------------------------------------------------------------------------
//----------write data to fm 1
//---------------------------------------------------------------------------------------------------
static void write_to_fm_1( unsigned char add1,unsigned char add2,unsigned char len,unsigned char *p )
{
		int i,j;
		unsigned char bit;
		unsigned char cmd=0x05;
		unsigned char read_data=0;

		//write write-enabe command
		cmd=0x06;
		AT91_SYS->PIOD_SODR=FM_CS2;
		AT91_SYS->PIOD_CODR=FM_CS1;
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd<<i )&0x80;
				if( bit )
						AT91_SYS->PIOC_SODR=FM_SO;
	      else
						AT91_SYS->PIOC_CODR=FM_SO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOC_SODR=FM_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOC_CODR=FM_SCK;
				udelay(5);
				}
		AT91_SYS->PIOD_SODR=FM_CS1;

		udelay(20);

		//write command
		cmd=0x02;
		AT91_SYS->PIOD_CODR=FM_CS1;
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd<<i )&0x80;
				if( bit )
						AT91_SYS->PIOC_SODR=FM_SO;
	      else
						AT91_SYS->PIOC_CODR=FM_SO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOC_SODR=FM_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOC_CODR=FM_SCK;
				udelay(5);
				}

		udelay(20);

		cmd=add1;
		AT91_SYS->PIOD_CODR=FM_CS1;
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd<<i )&0x80;
				if( bit )
						AT91_SYS->PIOC_SODR=FM_SO;
	      else
						AT91_SYS->PIOC_CODR=FM_SO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOC_SODR=FM_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOC_CODR=FM_SCK;
				udelay(5);
				}

		udelay(20);

		cmd=add2;
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd<<i )&0x80;
				if( bit )
						AT91_SYS->PIOC_SODR=FM_SO;
	      else
						AT91_SYS->PIOC_CODR=FM_SO;
				udelay(5);

				//CLK High
				AT91_SYS->PIOC_SODR=FM_SCK;
				udelay(10);
				//CLK Low
				AT91_SYS->PIOC_CODR=FM_SCK;
				udelay(5);
				}
	
		udelay(20);

		for( j=0;j<len;j++ )
				{
				cmd=*p;
				p++;
				for( i=0;i<=7;i++ )
						{
						//CMD Output
						bit=( cmd<<i )&0x80;
						if( bit )
								AT91_SYS->PIOC_SODR=FM_SO;
			      else
								AT91_SYS->PIOC_CODR=FM_SO;
						udelay(5);

						//CLK High
						AT91_SYS->PIOC_SODR=FM_SCK;
						udelay(10);
						//CLK Low
						AT91_SYS->PIOC_CODR=FM_SCK;
						udelay(5);
						}
				}

		AT91_SYS->PIOD_SODR=FM_CS1;
		udelay(20);
}

//-------------------------------------------------------------------------------------------------------------
//-----------read data from Fram 1
//-------------------------------------------------------------------------------------------------------------
static unsigned char read_from_fm_1( unsigned char add1,unsigned char add2,unsigned char len,unsigned char *p )
{
		int i,j;
		unsigned char bit;
		unsigned char cmd=0x05;
		unsigned char read_data=0;
		unsigned char read[10];

		//write read command
		cmd=0x03;
		AT91_SYS->PIOD_SODR=FM_CS2;
		AT91_SYS->PIOD_CODR=FM_CS1;
		udelay(10);
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd<<i )&0x80;
				if( bit )
						AT91_SYS->PIOC_SODR=FM_SO;
	      else
						AT91_SYS->PIOC_CODR=FM_SO;
				udelay(5);

				//CLK Low
				AT91_SYS->PIOC_CODR=FM_SCK;
				udelay(10);
				//CLK High
				AT91_SYS->PIOC_SODR=FM_SCK;
				udelay(5);
				}

		udelay(20);

		cmd=add1;
		for( i=0;i<=7;i++ )
				{
				//CMD Output
				bit=( cmd<<i )&0x80;
				if( bit )
						AT91_SYS->PIOC_SODR=FM_SO;
	      else
						AT91_SYS->PIOC_CODR=FM_SO;
				udelay(5);

⌨️ 快捷键说明

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