Index: avr-libc/tests/simulate/util/crc16-5.c
===================================================================
--- avr-libc/tests/simulate/util/crc16-5.c	(revision 0)
+++ avr-libc/tests/simulate/util/crc16-5.c	(revision 0)
@@ -0,0 +1,85 @@
+/* Copyright (c) 2010  Joerg Wunsch
+   Copyright (c) 2011  Frederic Nadeau
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+
+   * Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   * 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.
+   * Neither the name of the copyright holders nor the names of
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
+ */
+
+/* $Id$ */
+
+/* Test the various CRC algorithms.
+   Part 5:  8-bit CCITT-CRC, x^8 + x^2 + x + 1 (0xE0) */
+
+#include <stdint.h>
+#include <stdlib.h>
+
+#ifdef	__AVR__
+# include <util/crc16.h>
+#else  /* host computer */
+
+static uint8_t
+_crc8_ccitt_update (uint8_t inCrc, uint8_t inData)
+{
+    uint8_t   i;
+	uint8_t   data;
+
+	data = inCrc ^ inData;
+
+    for ( i = 0; i < 8; i++ )
+	{
+    	if (( data & 0x80 ) != 0 )
+    	{
+    		data <<= 1;
+        	data ^= 0x07;
+    	}
+    	else
+    	{
+    		data <<= 1;
+    	}
+    }
+    return data;
+}
+
+#endif  /* AVR */
+
+/* LTC6802-1 test vector (including CRC) */
+const char message[] = "\xE1\x04\x02\x20\x6C\x6C\x62";
+const size_t mlen = 7;
+
+#include <stdio.h>
+
+int main(void)
+{
+    uint8_t crc = 0;
+    uint8_t i;
+
+    for (i = 0; i < mlen; i++)
+        crc = _crc8_ccitt_update(crc, message[i]);
+    if (crc != 0) return __LINE__;
+
+    return 0;
+}
+
Index: avr-libc/include/util/crc16.h
===================================================================
--- avr-libc/include/util/crc16.h	(revision 2206)
+++ avr-libc/include/util/crc16.h	(working copy)
@@ -1,5 +1,7 @@
 /* Copyright (c) 2002, 2003, 2004  Marek Michalkiewicz
    Copyright (c) 2005, 2007 Joerg Wunsch
+   Copyright (c) 2006 Dave Hylands
+   Copyright (c) 2011 Frederic Nadeau
    All rights reserved.
 
    Redistribution and use in source and binary forms, with or without
@@ -332,4 +334,59 @@
 	return __crc;
 }
 
+/** \ingroup util_crc
+    Optimized CRC-8-CCITT calculation.
+
+    Polynomial: x^8 + x^2 + x + 1 (0xE0)<br>
+    Initial value: 0x00
+
+    The C equivalent has been originally written by Dave Hylands.
+    Assembly code is based on _crc_ibutton_update optimization.
+
+    The following is the equivalent functionality written in C.
+
+    \code
+    uint8_t
+    _crc8_ccitt_update (uint8_t inCrc, uint8_t inData)
+    {
+        uint8_t   i;
+        uint8_t   data;
+
+        data = inCrc ^ inData;
+
+        for ( i = 0; i < 8; i++ )
+        {
+            if (( data & 0x80 ) != 0 )
+            {
+                data <<= 1;
+                data ^= 0x07;
+            }
+            else
+            {
+                data <<= 1;
+            }
+        }
+        return data;
+    }
+    \endcode
+*/
+
+static __inline__ uint8_t
+_crc8_ccitt_update(uint8_t __crc, uint8_t __data)
+{
+    uint8_t __i, __pattern;
+    __asm__ __volatile__ (
+        "    eor    %0, %4" "\n\t"
+        "    ldi    %1, 8" "\n\t"
+        "    ldi    %2, 0x07" "\n\t"
+        "1:  lsl    %0" "\n\t"
+        "    brcc   2f" "\n\t"
+        "    eor    %0, %2" "\n\t"
+        "2:  dec    %1" "\n\t"
+        "    brne   1b" "\n\t"
+        : "=r" (__crc), "=d" (__i), "=d" (__pattern)
+        : "0" (__crc), "r" (__data));
+    return __crc;
+}
+
 #endif /* _UTIL_CRC16_H_ */
