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

📄 rtc.c

📁 T-Kernel Driver Sample
💻 C
字号:
/*""FILE COMMENT""**************************************************************       System Name : RENESAS T-Engine/micro T-Engine*       File Name   : rtc.c*       Version     : 1.00.00*       Contents    : CLOCK device driver sysdepend routines*       Model       : SH7145 micro T-Engine *       CPU         : SH7145F(SH-2) *       Compiler    : GNU*       OS          : T-Kernel*       note        : The Software is being delivered to you "AS IS" *                   : and Renesas,whether explicitly or implicitly makes  *                   : no warranty as to its Use or performance. *                   : RENESAS AND ITS SUPPLIER DO NOT AND CANNOT WARRANT *                   : THE PERFORMANCE OR RESULTS YOU MAY OBTAIN  BY USING *                   : THE SOFTWARE. AS TO ANY MATTER INCLUDING WITHOUT *                   : LIMITATION NONINFRINGEMENT OF THIRD PARTY RIGHTS,*                   : MERCHANTABILITY, INTEGRATION, SATISFACTORY QUALITY, *                   : OR FITNESS FOR ANY PARTICULAR PURPOSE.*                     *                     If H-UDI(e.g. E10A or MyICE) is connected,*                     RTC device do not worked.*                     (SCI2 and H-UDI are multiplexed)  **       Copyright (c) 2005 RENESAS TECHNOLOGY CORP. All Rights Reserved.*       AND RENESAS SOLUTIONS CORP. All Rights Reserved.*       history   : 2005.01.21 ver1.00.00*""FILE COMMENT END""*********************************************************/#include "clkdrv.h"/* Definition of SH7145 registers */#define REG_RTCCEDATA  	(volatile unsigned short *)0xFFFF8380 /* PADRH */#define REG_RTCCEMODE	(volatile unsigned short *)0xFFFF8384 /* PAIORH */#define REG_RTCSCIMODE  (volatile unsigned short *)0xFFFF83B8 /* PECRL1 */#define REG_RTCSCIMODE2	(volatile unsigned short *)0xFFFF83B4 /* PEIORL */#define REG_RTCSCIMST	(volatile unsigned short *)0xFFFF861C /* MSTCR1 */#define REG_RTCSMR      (volatile unsigned char *)0xFFFF81C0  /* SMR    */#define REG_RTCBRR      (volatile unsigned char *)0xFFFF81C1  /* BRR    */#define REG_RTCSCR      (volatile unsigned char *)0xFFFF81C2  /* SCR    */#define REG_RTCTXD      (volatile unsigned char *)0xFFFF81C3  /* TXD    */#define REG_RTCSSR      (volatile unsigned char *)0xFFFF81C4  /* SSR    */#define REG_RTCRXD      (volatile unsigned char *)0xFFFF81C5  /* RXD    */#define REG_RTCSDCR     (volatile unsigned char *)0xFFFF81C6  /* SDCR   *//* Definition of the RTC controller *//* register address */#define REG_SEC          0x00#define REG_MIN          0x10#define REG_HOUR         0x20#define REG_WEEK         0x30#define REG_DAY          0x40#define REG_MONTH        0x50#define REG_YEAR         0x60#define REG_ADJ          0x70#define REG_ALARM_W_MIN  0x80#define REG_ALARM_W_HOUR 0x90#define REG_ALARM_W_WEEK 0xA0#define REG_ALARM_D_MIN  0xB0#define REG_ALARM_D_HOUR 0xC0#define REG_CTRL1        0xE0#define REG_CTRL2        0xF0/* transfer format */#define WRITE_RTC_1BYTE  0x08#define READ_RTC_1BYTE   0x0C#define WRITE_RTC_BURST  0x00#define READ_RTC_BURST   0x04/* Bit field for RTC register */#define RTC_XSTP         0x10#define RTC_VDET         0x40#define RTC_Y2KBIT       0x80/* SCI2 bps */#define	RTC_DEFBPS	6	/* RTC max clock 1MHz *//* convert BIN <-> BCD */#define	BIN2BCD(v)	((((v) / 10) << 4) + ((v) % 10))#define	BCD2BIN(v)	(((v) >> 4) * 10 + ((v) & 0x0f))/* definition of local function */LOCAL void rtcsciwait(int time);/*""FUNC COMMENT""******************************************************* * ID          : * Outline     : write data to RV5C348B register *----------------------------------------------------------------------- * Include     : tk/tkernel.h  *----------------------------------------------------------------------- * Definition  : LOCAL void writeRTC(W idx, W data) *----------------------------------------------------------------------- * Function    : write data to RV5C348B register *----------------------------------------------------------------------- * Argument    : W idx; register index *             : W data; write data  *-----------------------------------------------------------------------  * Return      : None *----------------------------------------------------------------------- * Input       : None  * Output      : None  *----------------------------------------------------------------------- * Used Func   : None *----------------------------------------------------------------------- * Notice      : None *""FUNC COMMENT END""***************************************************/LOCAL void writeRTC(W idx, W data) {	unsigned char tendflg;	*REG_RTCCEDATA = 1;                  /* set CE -> high  */	rtcsciwait(1);                       /* setup [tCES]    */ 	*REG_RTCSCR = 0x20;                  /* set TE bit      */	while((*REG_RTCSSR & 0x80) == 0);    /* wait TDRE bit   */ 	*REG_RTCTXD = idx | WRITE_RTC_1BYTE; /* send command    */	*REG_RTCSSR = *REG_RTCSSR & ~0x80;   /* clear TDRE bit  */	do {		tendflg = *REG_RTCSSR;           /* wait TEND bit   */	} while(!(tendflg & 0x04));	while((*REG_RTCSSR & 0x80) == 0);    /* wait TDRE bit   */	*REG_RTCTXD = data;                  /* send data       */	*REG_RTCSSR = *REG_RTCSSR & ~0x80;   /* clear TDRE bit  */	do {		tendflg = *REG_RTCSSR;           /* wait TEND bit   */	} while(!(tendflg & 0x04));	*REG_RTCSCR = 0x00;                  /* clear TE bit    */ 	*REG_RTCCEDATA = 0;                  /* set "CE" -> low */}/*""FUNC COMMENT""******************************************************* * ID          : * Outline     : read data from RTC(RV5C348) *----------------------------------------------------------------------- * Include     : tk/tkernel.h  *----------------------------------------------------------------------- * Definition  : LOCAL INT readRTC(W idx) *----------------------------------------------------------------------- * Function    : read data from RV5C348B *----------------------------------------------------------------------- * Argument    : W idx; register index *             : W data; write data  *-----------------------------------------------------------------------  * Return      : None *----------------------------------------------------------------------- * Input       : None  * Output      : None  *----------------------------------------------------------------------- * Used Func   : None *----------------------------------------------------------------------- * Notice      : None *""FUNC COMMENT END""***************************************************/int errflg;LOCAL INT readRTC(W idx){	unsigned char data,sci_flg,tendflg;	*REG_RTCCEDATA = 1;                  /* set "CE" -> high */	*REG_RTCSCR = 0x20;                  /* set RE bit       */	while((*REG_RTCSSR & 0x80) == 0);    /* wait TDRE bit    */	*REG_RTCTXD = idx|READ_RTC_1BYTE;    /* send command     */	*REG_RTCSSR = *REG_RTCSSR & ~0x80;   /* clear TDRE bit   */ 	do {		tendflg = *REG_RTCSSR;           /* wait TEND bit    */	} while(!(tendflg & 0x04));	*REG_RTCSCR = 0x10;                  /* set RE bit       */	do {		sci_flg = *REG_RTCSSR;           /* wait RDRF bit    */	} while(!(sci_flg & 0x40));	data = *REG_RTCRXD & 0xFF;           /* receive data     */	*REG_RTCSSR = sci_flg & ~0x40;       /* clear RDRF bit   */	*REG_RTCSCR = 0x00;                  /* clear TE,RE bit  */	*REG_RTCCEDATA = 0;                  /* set "CE" -> low  */	return(data);}/*""FUNC COMMENT""******************************************************* * ID          : * Outline     : set current time to RTC *----------------------------------------------------------------------- * Include     : tk/tkernel.h  *----------------------------------------------------------------------- * Definition  : ER	setRTCTIME(VP date_tim) *----------------------------------------------------------------------- * Function    : set current time to RTC *----------------------------------------------------------------------- * Argument    : VP date_time *-----------------------------------------------------------------------  * Return      : None *----------------------------------------------------------------------- * Input       : None  * Output      : None  *----------------------------------------------------------------------- * Used Func   : writeRTC() *----------------------------------------------------------------------- * Notice      : None *""FUNC COMMENT END""***************************************************/EXPORT	ER	setRTCTIME(VP date_time) {	int         year;	UB          y2kflg;	DATE_TIM	*dt;	dt = (DATE_TIM *)date_time;	if(dt->d_year>=100) {		year = dt->d_year - 100;		y2kflg = RTC_Y2KBIT;	} else {		year = dt->d_year;		y2kflg = 0;	}	/* convert BIN to BCD code */	year = BIN2BCD(year);		dt->d_month = BIN2BCD(dt->d_month);		dt->d_day = BIN2BCD(dt->d_day);		dt->d_hour = BIN2BCD(dt->d_hour);		dt->d_min = BIN2BCD(dt->d_min);		dt->d_sec = BIN2BCD(dt->d_sec);			/* set date and time to RTC */	writeRTC(REG_YEAR,  year);	writeRTC(REG_MONTH, dt->d_month|y2kflg);	writeRTC(REG_WEEK,  dt->d_wday);	writeRTC(REG_HOUR,  dt->d_hour);	writeRTC(REG_MIN,   dt->d_min);	writeRTC(REG_SEC,   dt->d_sec);	writeRTC(REG_DAY,   dt->d_day);		return E_OK;}/*""FUNC COMMENT""******************************************************* * ID          : * Outline     : get current time from RTC *----------------------------------------------------------------------- * Include     : tk/tkernel.h  *----------------------------------------------------------------------- * Definition  : ER	getRTCTIME(VP date_tim) *----------------------------------------------------------------------- * Function    : get current time to RTC *----------------------------------------------------------------------- * Argument    : VP date_time *-----------------------------------------------------------------------  * Return      : None *----------------------------------------------------------------------- * Input       : None  * Output      : None  *----------------------------------------------------------------------- * Used Func   : readRTC() *----------------------------------------------------------------------- * Notice      : None *""FUNC COMMENT END""***************************************************/EXPORT	ER	getRTCTIME(VP date_time){	DATE_TIM	*dt;	INT	sec;	dt = (DATE_TIM *)date_time;	/* get time from RTC */	do {		sec        = readRTC(REG_SEC);		dt->d_year  = readRTC(REG_YEAR);		dt->d_month = readRTC(REG_MONTH);		dt->d_day   = readRTC(REG_DAY);		dt->d_hour  = readRTC(REG_HOUR);		dt->d_min   = readRTC(REG_MIN);		dt->d_wday  = readRTC(REG_WEEK);		dt->d_sec   = readRTC(REG_SEC);	} while (sec != dt->d_sec);	/* convert BCD to BIN */	dt->d_year = BCD2BIN(dt->d_year);		if(dt->d_month & RTC_Y2KBIT) {		dt->d_year += 100;		dt->d_month &= ~RTC_Y2KBIT;	}		dt->d_month = BCD2BIN(dt->d_month);		dt->d_day = BCD2BIN(dt->d_day);		dt->d_hour = BCD2BIN(dt->d_hour);		dt->d_min = BCD2BIN(dt->d_min);		dt->d_sec = BCD2BIN(dt->d_sec);		return E_OK;}/*""FUNC COMMENT""******************************************************* * ID          : * Outline     : initial setting for RTC *----------------------------------------------------------------------- * Include     : tk/tkernel.h  *----------------------------------------------------------------------- * Definition  : ER	initRTC() *----------------------------------------------------------------------- * Function    : initial setting for RTC  *----------------------------------------------------------------------- * Argument    : None *-----------------------------------------------------------------------  * Return      : None *----------------------------------------------------------------------- * Input       : None  * Output      : None  *----------------------------------------------------------------------- * Used Func   : rtcsciwait()  *             : readRTC() *             : writeRTC() *----------------------------------------------------------------------- * Notice      : IF USE RTC,Can not use H-UDI(e.g. E10A/MyICE) debugger *""FUNC COMMENT END""***************************************************/EXPORT	ER	initRTC(void){	int data;	/* stand-by registers */	*REG_RTCSCIMST	= *REG_RTCSCIMST & 0xFFFB; /* clear MSTP18(SCI2) */ 	/* initialize SCI2 for RTC */	*REG_RTCSCR = 0x01;              /* CKE1:0 = 1 => SCLK out */	*REG_RTCSMR = 0x80;              /* clocked serial mode */	*REG_RTCBRR = RTC_DEFBPS;        /* n=0,N=6 -> 0.9MHz */	*REG_RTCSDCR = 0xFA;             /* MSB first */	rtcsciwait(1);	/* initialize ports */	*REG_RTCCEMODE  = 0x0001;        /* PA16(CE) output */	*REG_RTCCEDATA  = 0x0000;        /* low  output */	*REG_RTCSCIMODE = 0x0022;        /* TXD2,SCK2 */	*REG_RTCSCIMODE2 = 0x0100;       /* SCK2(PE8) output */	/* get RTC initial status(backup or not?) */	data = readRTC(REG_CTRL2);	if(data&(RTC_XSTP|RTC_VDET)) {		/* If RTC is not backuped,set initial control value */		writeRTC(REG_CTRL1,0x30);    /* Alarm Off,24hour mode */		writeRTC(REG_CTRL2,0x00);	}	return E_OK;}/*""FUNC COMMENT""******************************************************* * ID          : * Outline     : RTC wait  *----------------------------------------------------------------------- * Include     : tk/tkernel.h  *----------------------------------------------------------------------- * Definition  : ER	rtcsciwait() *----------------------------------------------------------------------- * Function    : RTC wait *----------------------------------------------------------------------- * Argument    : int time  *-----------------------------------------------------------------------  * Return      : None *----------------------------------------------------------------------- * Input       : None  * Output      : None  *----------------------------------------------------------------------- * Used Func   : None  *----------------------------------------------------------------------- * Notice      : None *""FUNC COMMENT END""***************************************************/LOCAL void rtcsciwait(int time){	volatile int i;	for(i=0;i<time;i++);}/* Set/get Auto Power ON time(not supported) */EXPORT	ER	setRTCAutoPWRON(VP date_tim) { return E_NOSPT;}EXPORT	ER	getRTCAutoPWRON(VP date_tim) { return E_NOSPT;}/* Set/get non volatile register */EXPORT	INT	setRTCREGS(VP buf, INT size) { return E_NOSPT;}EXPORT	INT	getRTCREGS(VP buf, INT size) { return E_NOSPT;}

⌨️ 快捷键说明

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