[coreboot] libpayload: CMOS / BCD functions

Jordan Crouse jordan.crouse at amd.com
Thu Mar 27 22:05:23 CET 2008


On 27/03/08 21:24 +0100, Uwe Hermann wrote:
> See patch.
> 
> 
> I'll follow-up with a coreinfo patch to dump the whole CMOS array.
> 
> Uwe.
> -- 
> http://www.hermann-uwe.de  | http://www.holsham-traders.de
> http://www.crazy-hacks.org | http://www.unmaintained-free-software.org

> Add initial support for some basic CMOS read/write functions and the
> bcd2dec()/dec2bcd() functions we'll need for (among other things)
> converting some date/time parameters in CMOS.
> 
> Signed-off-by: Uwe Hermann <uwe at hermann-uwe.de>

Acked-by: Jordan Crouse <jordan.crouse at amd.com>

Good stuff!

> Index: include/libpayload.h
> ===================================================================
> --- include/libpayload.h	(Revision 3190)
> +++ include/libpayload.h	(Arbeitskopie)
> @@ -41,6 +41,18 @@
>  #define MAX(a,b) ((a) > (b) ? (a) : (b))
>  #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
>  
> +/* Some CMOS byte definitions */
> +#define CMOS_RTC_SECONDS        0
> +#define CMOS_RTC_MINUTES        2
> +#define CMOS_RTC_HOURS          4
> +#define CMOS_RTC_DAY            7
> +#define CMOS_RTC_MONTH          8
> +#define CMOS_RTC_YEAR           9
> +
> +/* drivers/cmos.c */
> +u8 cmos_read(u8 addr);
> +void cmos_write(u8 val, u8 addr);
> +
>  /* drivers/keyboard.c */
>  int keyboard_havechar(void);
>  unsigned char keyboard_get_scancode(void);
> @@ -87,6 +99,10 @@
>  void *calloc(size_t nmemb, size_t size);
>  void *realloc(void *ptr, size_t size);
>  
> +/* libc/lib.c */
> +int bcd2dec(int b);
> +int dec2bcd(int d);
> +
>  /* libc/memory.c */
>  void *memset(void *s, int c, size_t n);
>  void *memcpy(void *dst, const void *src, size_t n);
> Index: libc/Makefile.inc
> ===================================================================
> --- libc/Makefile.inc	(Revision 3190)
> +++ libc/Makefile.inc	(Arbeitskopie)
> @@ -28,5 +28,4 @@
>  ##
>  
>  TARGETS-y += libc/malloc.o libc/printf.o libc/console.o libc/string.o
> -TARGETS-y += libc/memory.o libc/ctype.o
> -TARGETS-y += libc/ipchecksum.o
> +TARGETS-y += libc/memory.o libc/ctype.o libc/ipchecksum.o libc/lib.o
> Index: libc/lib.c
> ===================================================================
> --- libc/lib.c	(Revision 0)
> +++ libc/lib.c	(Revision 0)
> @@ -0,0 +1,51 @@
> +/*
> + * This file is part of the libpayload project.
> + *
> + * Copyright (C) 2008 Uwe Hermann <uwe at hermann-uwe.de>
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. The name of the author may not be used to endorse or promote products
> + *    derived from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +/*
> + * Convert a number in BCD format to decimal.
> + *
> + * @param b The BCD number.
> + * @return The given BCD number in decimal format.
> + */
> +int bcd2dec(int b)
> +{
> +	return ((b >> 4) & 0x0f) * 10 + (b & 0x0f);
> +}
> +
> +/*
> + * Convert a number in decimal format into the BCD format.
> + *
> + * @param d The decimal number.
> + * @return The given decimal number in BCD format.
> + */
> +int dec2bcd(int d)
> +{
> +	return ((d / 10) << 4) | (d % 10);
> +}
> +
> Index: Config.in
> ===================================================================
> --- Config.in	(Revision 3190)
> +++ Config.in	(Arbeitskopie)
> @@ -68,6 +68,10 @@
>         depends VGA_CONSOLE
>         default y
>  
> +config CMOS
> +       bool "Support for reading/writing CMOS bytes"
> +       default y
> +
>  endmenu
>  
>  menu "Build Options"
> Index: drivers/cmos.c
> ===================================================================
> --- drivers/cmos.c	(Revision 0)
> +++ drivers/cmos.c	(Revision 0)
> @@ -0,0 +1,69 @@
> +/*
> + * This file is part of the libpayload project.
> + *
> + * Copyright (C) 2008 Uwe Hermann <uwe at hermann-uwe.de>
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. The name of the author may not be used to endorse or promote products
> + *    derived from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +/*
> + * Datasheet:
> + *  - Name: MC146818: Real-time Clock Plus RAM (RTC)
> + *  - PDF: http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC146818.pdf
> + *  - Order number: MC146818/D
> + */
> +
> +/*
> + * See also:
> + * http://bochs.sourceforge.net/techspec/CMOS-reference.txt
> + * http://www.bioscentral.com/misc/cmosmap.htm
> + */
> +
> +#include <libpayload.h>
> +
> +#define RTC_PORT 0x70
> +
> +/**
> + * Read a byte from the specified CMOS address.
> + * 
> + * @param addr The CMOS address to read a byte from.
> + * @return The byte at the given CMOS address.
> + */
> +u8 cmos_read(u8 addr)
> +{
> +	outb(addr, RTC_PORT);
> +	return inb(RTC_PORT + 1);
> +}
> +
> +/**
> + * Write a byte to the specified CMOS address.
> + * 
> + * @param val The byte to write to CMOS.
> + * @param addr The CMOS address to write to.
> + */
> +void cmos_write(u8 val, u8 addr)
> +{
> +	outb(addr, RTC_PORT);
> +	outb(val, RTC_PORT + 1);
> +}
> Index: drivers/Makefile.inc
> ===================================================================
> --- drivers/Makefile.inc	(Revision 3190)
> +++ drivers/Makefile.inc	(Arbeitskopie)
> @@ -31,3 +31,4 @@
>  TARGETS-$(CONFIG_SERIAL_CONSOLE) += drivers/serial.o
>  TARGETS-$(CONFIG_VGA_CONSOLE) += drivers/vga.o
>  TARGETS-$(CONFIG_PC_KEYBOARD) += drivers/keyboard.o
> +TARGETS-$(CONFIG_CMOS) += drivers/cmos.o

> -- 
> coreboot mailing list
> coreboot at coreboot.org
> http://www.coreboot.org/mailman/listinfo/coreboot

-- 
Jordan Crouse
Systems Software Development Engineer 
Advanced Micro Devices, Inc.





More information about the coreboot mailing list