Mercurial > flash_v2
diff packages/devs/wallclock/dallas/ds1742/current/ds1742.inl @ 94:4642a6d35749 ecos-sw-2000-06-02
Merge from eCos master repository on 2000-06-02-07:47:04-BST
| author | jlarmour |
|---|---|
| date | Fri, 02 Jun 2000 17:35:00 +0000 |
| parents | |
| children | e0c0827131d1 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/devs/wallclock/dallas/ds1742/current/ds1742.inl @@ -0,0 +1,174 @@ +//========================================================================== +// +// devs/wallclock/ds1742.inl +// +// Wallclock implementation for Dallas 1742 +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####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 void +init_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 void +set_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 void +get_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
