?? misc-watchdog-1.c
字號:
#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 + -