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

📄 misc-watchdog-1.c

📁 本程序是在arm9200平台上实现看门狗的驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <linux/config.h>
#include <linux/module.h>

#include <linux/init.h>
#include <linux/smp.h>
#include <linux/smp_lock.h>
#include <linux/sched.h>
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/string.h>
#include <linux/pm.h>
#include <linux/miscdevice.h>
#include <linux/poll.h>

#include <asm/dma.h>
#include <asm/semaphore.h>
#include <asm/uaccess.h>
#include <asm/hardware.h>

#include <asm/io.h>
#include <asm/system.h>


#define WATCHDOG_MINOR 131   //misc次设备号

#define WDIOC_GETSTATUS 1
#define WDIOC_GETBOOTSTATUS 2
#define WDIOC_KEEPALIVE 3
#define WDIOC_SETTIMEOUT 4
#define WDIOC_GETTIMEOUT 5

//------------------------------
//define of rtc
#define WDIOC_READ_DATE 10
#define WDIOC_READ_TIME 11
#define WDIOC_WRITE_DATE 12
#define WDIOC_WRITE_TIME 13

//----------------------------------------------
//define of led
//----------------------------------------------
#define USER_LED1	AT91C_PIO_PA24

//-----------------------------------------------
//define of Fram
//-----------------------------------------------
#define FM_SCK AT91C_PIO_PC0
#define FM_SI  AT91C_PIO_PC2
#define FM_SO  AT91C_PIO_PC1


#define TOUCH_CS1  AT91C_PIO_PD5
#define TOUCH_CS2  AT91C_PIO_PD8
#define FM_CS1     AT91C_PIO_PD9
#define FM_CS2     AT91C_PIO_PD10

//------------------------------------------------
//define of rtc
//-------------------------------------------------
#define MY_RTC_CS AT91C_PIO_PB29
#define MY_RTC_SCK AT91C_PIO_PB27
#define MY_RTC_IO AT91C_PIO_PB28

static int timeout=3;
static int timer_alive=0;
//static int testmode;

#define TIMER_MARGIN 60  /* (secs) Default is 1 minute */
static int soft_margin = TIMER_MARGIN; /* in seconds */

static char aaa=0x00;

struct my_date
	{
	unsigned char year;
	unsigned char month;
	unsigned char day;
	};

struct my_time
	{
	unsigned char hour;
	unsigned char min;
	unsigned char sec;
	};

struct my_data_of_fram
	{
	unsigned char flag_of_which_fram;
	unsigned char flag_of_command;
	unsigned char add1;
	unsigned char add2;
	unsigned char len;
	unsigned char data_buffer[100];
	};
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
//------------------------functions of rtc
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------

//--------------------------------------------------------------
//-------set time
//--------------------------------------------------------------
static struct my_time my_read_time(void)
{
		int i;
		unsigned char bit;
		unsigned char cmd=0x05;
		unsigned char read_data=0;
		struct my_time mm;

//-----------------------------------------------
//read second
//-----------------------------------------------		
		AT91_SYS->PIOB_OER|=MY_RTC_IO;
 		cmd=0x81;//second 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);

		AT91_SYS->PIOB_ODR|=MY_RTC_IO;

		udelay(10);
		for( i=0;i<=7;i++ )
				{
				read_data=read_data>>1;
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(5);

				if( (AT91_SYS->PIOB_PDSR&MY_RTC_IO)!=0 )
						read_data|=0x80;
				else
						read_data&=0x7f;

				udelay(5);

				AT91_SYS->PIOB_CODR=MY_RTC_SCK;

				udelay(10);
				}

		mm.sec=read_data;
//printk("read data=%d",read_data );

		udelay(20);
		AT91_SYS->PIOB_CODR=MY_RTC_CS;
		udelay(20);
//-----------------------------------------------
//read hour
//-----------------------------------------------		
		AT91_SYS->PIOB_OER|=MY_RTC_IO;
 		cmd=0x85;//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);

		AT91_SYS->PIOB_ODR|=MY_RTC_IO;

		udelay(10);
		for( i=0;i<=7;i++ )
				{
				read_data=read_data>>1;
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(5);

				if( (AT91_SYS->PIOB_PDSR&MY_RTC_IO)!=0 )				
						read_data|=0x80;
				else
						read_data&=0x7f;

				udelay(5);
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;

				
				udelay(10);
				}
				
		mm.hour=read_data;
//printk("read data=%d",read_data );

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

//-----------------------------------------------
//read min
//-----------------------------------------------		
		AT91_SYS->PIOB_OER|=MY_RTC_IO;
 		cmd=0x83;//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);

		AT91_SYS->PIOB_ODR|=MY_RTC_IO;

		udelay(10);
		for( i=0;i<=7;i++ )
				{
				read_data=read_data>>1;
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(5);

				if( (AT91_SYS->PIOB_PDSR&MY_RTC_IO)!=0 )				
						read_data|=0x80;
				else
						read_data&=0x7f;

				udelay(5);
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;

				
				udelay(10);
				}
				
 	mm.min=read_data;
//printk("read data=%d",read_data );

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

//----------------------------------------------------------------
//-------------read date
//----------------------------------------------------------------
static struct my_date my_read_date(void)
{
		int i;
		unsigned char bit;
		unsigned char cmd=0x05;
		unsigned char read_data=0;
		struct my_date mm;

//-----------------------------------------------
//read year
//-----------------------------------------------		
		AT91_SYS->PIOB_OER|=MY_RTC_IO;
 		cmd=0x8d;//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);

		AT91_SYS->PIOB_ODR|=MY_RTC_IO;

		udelay(10);
		for( i=0;i<=7;i++ )
				{
				read_data=read_data>>1;
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(5);

				if( (AT91_SYS->PIOB_PDSR&MY_RTC_IO)!=0 )				
						read_data|=0x80;
				else
						read_data&=0x7f;

				udelay(5);
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;

				
				udelay(10);
				}
				
		mm.year=read_data;
//printk("read data=%d",read_data );

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


//-----------------------------------------------
//read month
//-----------------------------------------------		
		AT91_SYS->PIOB_OER|=MY_RTC_IO;
 		cmd=0x89;//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);

		AT91_SYS->PIOB_ODR|=MY_RTC_IO;

		udelay(10);
		for( i=0;i<=7;i++ )
				{
				read_data=read_data>>1;
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(5);

				if( (AT91_SYS->PIOB_PDSR&MY_RTC_IO)!=0 )				
						read_data|=0x80;
				else
						read_data&=0x7f;

				udelay(5);
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;

				
				udelay(10);
				}
				
		mm.month=read_data;
//printk("read data=%d",read_data );

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

//-----------------------------------------------
//read day
//-----------------------------------------------		
		AT91_SYS->PIOB_OER|=MY_RTC_IO;
 		cmd=0x87;//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);

		AT91_SYS->PIOB_ODR|=MY_RTC_IO;

		udelay(10);
		for( i=0;i<=7;i++ )
				{
				read_data=read_data>>1;
				AT91_SYS->PIOB_SODR=MY_RTC_SCK;
				udelay(5);

				if( (AT91_SYS->PIOB_PDSR&MY_RTC_IO)!=0 )				
						read_data|=0x80;
				else
						read_data&=0x7f;

				udelay(5);
				AT91_SYS->PIOB_CODR=MY_RTC_SCK;

				
				udelay(10);
				}
				
		mm.day=read_data;
//printk("read data=%d",read_data );

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

//----------------------------------------------------------------------------
//-----------set date
//----------------------------------------------------------------------------
static void write_rtc_date( struct my_date my_date_set )
{
		int i;
		unsigned char bit;
		unsigned char cmd=0x05;
		unsigned char read_data=0;

//		struct my_date 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

⌨️ 快捷键说明

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