ds1742.inl
来自「eCos操作系统源码」· INL 代码 · 共 184 行
INL
184 行
//==========================================================================//// devs/wallclock/ds1742.inl//// Wallclock implementation for Dallas 1742////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): jskov// Contributors: jskov// Date: 2000-05-25// Purpose: Wallclock driver for Dallas 1742////####DESCRIPTIONEND####////==========================================================================#ifndef DS_BASE# error "Need to know base of DS1742 RAM"#endif#include <cyg/infra/cyg_type.h> // Common type definitions and support#include <cyg/hal/hal_io.h> // IO macros// Offsets from DS_BASE#define DS_SECONDS 0x7f9 // control bit!#define DS_SECONDS_MASK 0x7f#define DS_MINUTES 0x7fa#define DS_HOUR 0x7fb#define DS_DAY 0x7fc // control bits#define DS_DAY_MASK 0x07#define DS_DATE 0x7fd#define DS_MONTH 0x7fe#define DS_YEAR 0x7ff#define DS_CENTURY 0x7f8 // control bits!#define DS_CENTURY_MASK 0x3f// Control bits#define DS_SECONDS_OSC 0x80 // set to stop oscillator (power save)#define DS_CENTURY_READ 0x40 // set during read#define DS_CENTURY_WRITE 0x80 // set during write#define DS_DAY_BF 0x80 // battery flag#define DS_DAY_FT 0x40 // frequency test// Make sure test modes are disabled and that clock is running.static voidinit_ds_hwclock(void){ cyg_uint8 _tmp; // Enable clock HAL_READ_UINT8(DS_BASE+DS_SECONDS, _tmp); _tmp &= ~DS_SECONDS_OSC; HAL_WRITE_UINT8(DS_BASE+DS_SECONDS, _tmp); // clear frequency test HAL_READ_UINT8(DS_BASE+DS_DAY, _tmp); _tmp &= ~DS_DAY_FT; HAL_WRITE_UINT8(DS_BASE+DS_DAY, _tmp);}static voidset_ds_hwclock(cyg_uint32 year, cyg_uint32 month, cyg_uint32 mday, cyg_uint32 hour, cyg_uint32 minute, cyg_uint32 second){ cyg_uint8 _tmp; // Init write operation HAL_READ_UINT8(DS_BASE+DS_CENTURY, _tmp); _tmp &= ~(DS_CENTURY_WRITE|DS_CENTURY_READ); _tmp |= DS_CENTURY_WRITE; HAL_WRITE_UINT8(DS_BASE+DS_CENTURY, _tmp); // Entries with control bits HAL_READ_UINT8(DS_BASE+DS_CENTURY, _tmp); _tmp &= ~DS_CENTURY_MASK; _tmp |= TO_BCD(year/100) & DS_CENTURY_MASK; HAL_WRITE_UINT8(DS_BASE+DS_CENTURY, _tmp); HAL_READ_UINT8(DS_BASE+DS_SECONDS, _tmp); _tmp &= ~DS_SECONDS_MASK; _tmp |= TO_BCD(second) & DS_SECONDS_MASK; HAL_WRITE_UINT8(DS_BASE+DS_SECONDS, _tmp); HAL_READ_UINT8(DS_BASE+DS_DAY, _tmp); _tmp &= ~DS_DAY_FT; // clear frequency test HAL_WRITE_UINT8(DS_BASE+DS_DAY, _tmp); // Dedicated entries HAL_WRITE_UINT8(DS_BASE+DS_YEAR, TO_BCD(year % 100)); HAL_WRITE_UINT8(DS_BASE+DS_MONTH, TO_BCD(month)); HAL_WRITE_UINT8(DS_BASE+DS_DATE, TO_BCD(mday)); HAL_WRITE_UINT8(DS_BASE+DS_HOUR, TO_BCD(hour)); HAL_WRITE_UINT8(DS_BASE+DS_MINUTES, TO_BCD(minute)); // Enable clock HAL_READ_UINT8(DS_BASE+DS_SECONDS, _tmp); _tmp &= ~DS_SECONDS_OSC; HAL_WRITE_UINT8(DS_BASE+DS_SECONDS, _tmp); // Finish write operation HAL_READ_UINT8(DS_BASE+DS_CENTURY, _tmp); _tmp &= ~(DS_CENTURY_WRITE|DS_CENTURY_READ); HAL_WRITE_UINT8(DS_BASE+DS_CENTURY, _tmp);}static voidget_ds_hwclock(cyg_uint32* year, cyg_uint32* month, cyg_uint32* mday, cyg_uint32* hour, cyg_uint32* minute, cyg_uint32* second){ cyg_uint8 _tmp; // Init read operation HAL_READ_UINT8(DS_BASE+DS_CENTURY, _tmp); _tmp &= ~(DS_CENTURY_WRITE|DS_CENTURY_READ); _tmp |= DS_CENTURY_READ; HAL_WRITE_UINT8(DS_BASE+DS_CENTURY, _tmp); // Entries with control bits HAL_READ_UINT8(DS_BASE+DS_CENTURY, _tmp); _tmp &= DS_CENTURY_MASK; *year = 100*TO_DEC(_tmp); HAL_READ_UINT8(DS_BASE+DS_SECONDS, _tmp); _tmp &= DS_SECONDS_MASK; *second = TO_DEC(_tmp); // Dedicated entries HAL_READ_UINT8(DS_BASE+DS_YEAR, _tmp); *year += TO_DEC(_tmp); HAL_READ_UINT8(DS_BASE+DS_MONTH, _tmp); *month = TO_DEC(_tmp); HAL_READ_UINT8(DS_BASE+DS_DATE, _tmp); *mday = TO_DEC(_tmp); HAL_READ_UINT8(DS_BASE+DS_HOUR, _tmp); *hour = TO_DEC(_tmp); HAL_READ_UINT8(DS_BASE+DS_MINUTES, _tmp); *minute = TO_DEC(_tmp); // Finish read operation HAL_READ_UINT8(DS_BASE+DS_CENTURY, _tmp); _tmp &= ~(DS_CENTURY_WRITE|DS_CENTURY_READ); HAL_WRITE_UINT8(DS_BASE+DS_CENTURY, _tmp);}//-----------------------------------------------------------------------------// End of devs/wallclock/ds1742.inl
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?