Index: c/src/libchip/Makefile.am
===================================================================
--- c/src/libchip/Makefile.am	(revision 25a92bc1ed79b0eb5967fa454220ea90810c7ebb)
+++ c/src/libchip/Makefile.am	(revision 80a0ae82484749af38a490dea139286e95a060eb)
@@ -13,4 +13,13 @@
 noinst_LIBRARIES =
 noinst_PROGRAMS =
+
+# display
+if LIBCHIP
+include_libchip_HEADERS += display/disp_hcms29xx.h
+
+noinst_LIBRARIES += libdisplay.a
+libdisplay_a_SOURCES = display/disp_hcms29xx.c display/font_hcms29xx.c
+libdisplay_a_CPPFLAGS = $(AM_CPPFLAGS)
+endif
 
 # flash
Index: c/src/libchip/display/disp_fonts.h
===================================================================
--- c/src/libchip/display/disp_fonts.h	(revision 80a0ae82484749af38a490dea139286e95a060eb)
+++ c/src/libchip/display/disp_fonts.h	(revision 80a0ae82484749af38a490dea139286e95a060eb)
@@ -0,0 +1,37 @@
+/* $Id$ */
+
+#ifndef DISP_FONTS_H
+#define DISP_FONTS_H
+
+#include <rtems.h>
+
+typedef int8_t disp_font_dimen;
+
+struct disp_font_bounding_box
+{
+  disp_font_dimen w, h, x, y; 
+}; 
+
+struct disp_font_glyph
+{
+  struct disp_font_bounding_box bb;
+  disp_font_dimen wx, wy;
+  const unsigned char *bitmap;
+};
+
+struct disp_font_base
+{
+  int8_t trans;
+  struct disp_font_bounding_box fbb;
+  disp_font_dimen ascent, descent;
+  uint8_t default_char;
+  struct disp_font_glyph *latin1[256];
+};
+
+typedef struct disp_font_base *disp_font_t;
+
+/* Prototypes ------------------------------------------------- */
+
+/* End -------------------------------------------------------- */
+
+#endif /* not defined DISP_FONTS_H */
Index: c/src/libchip/display/disp_hcms29xx.c
===================================================================
--- c/src/libchip/display/disp_hcms29xx.c	(revision 80a0ae82484749af38a490dea139286e95a060eb)
+++ c/src/libchip/display/disp_hcms29xx.c	(revision 80a0ae82484749af38a490dea139286e95a060eb)
@@ -0,0 +1,942 @@
+/*===============================================================*\
+| Project: display driver for HCMS29xx                            |
++-----------------------------------------------------------------+
+| File: disp_hcms29xx.c                                           |
++-----------------------------------------------------------------+
+|                    Copyright (c) 2008                           |
+|                    Embedded Brains GmbH                         |
+|                    Obere Lagerstr. 30                           |
+|                    D-82178 Puchheim                             |
+|                    Germany                                      |
+|                    rtems@embedded-brains.de                     |
++-----------------------------------------------------------------+
+| The license and distribution terms for this file may be         |
+| found in the file LICENSE in this distribution or at            |
+|                                                                 |
+| http://www.rtems.com/license/LICENSE.                           |
+|                                                                 |
++-----------------------------------------------------------------+
+| this file contains the SPI based driver for a HCMS29xx 4 digit  |
+| alphanumeric LED display                                        |
++-----------------------------------------------------------------+
+|  $Id$
+\*===============================================================*/
+
+#include <string.h>
+#include <stdlib.h>
+
+#ifndef ARRAY_COUNT
+#define ARRAY_COUNT(a) (sizeof(a)/sizeof(a[0]))
+#endif /* ARRAY_COUNT */
+
+#include <rtems.h>
+#include <rtems/libio.h>
+#include <bsp.h>
+#include <rtems/libi2c.h>
+#include "disp_hcms29xx.h"
+#include "font_hcms29xx.h"
+#define FONT_BASE font_hcms29xx_base
+
+
+#define DISP_HCMS29XX_DIGIT_CNT (4)
+#define DISP_HCMS29XX_SEMA_NAME      rtems_build_name('D','4','I','Q')
+#define DISP_HCMS29XX_TRNS_SEMA_NAME rtems_build_name('D','4','T','R')
+#define DISP_HCMS29XX_TIMER_NAME     rtems_build_name('D','4','T','M')
+#define DISP_HCMS29XX_TASK_NAME      rtems_build_name('D','4','T','A')
+
+#define DISP_HCMS29XX_EVENT_TIMER  RTEMS_EVENT_1
+#define DISP_HCMS29XX_EVENT_NEWSTR RTEMS_EVENT_2
+
+
+static disp_font_t disp_hcms29xx_font_normal;
+static disp_font_t disp_hcms29xx_font_rotate;
+const rtems_libi2c_tfr_mode_t spi_disphcms29xx_tfr_mode = {
+  .baudrate = 1000000,
+  .bits_per_char = 8,
+  .lsb_first = TRUE,
+  .clock_inv = TRUE,
+  .clock_phs = TRUE,
+  .idle_char = 0
+};
+
+/*=========================================
+ * font management functions
+ */
+
+/*=========================================================================*\
+| Function:                                                                 |
+\*-------------------------------------------------------------------------*/
+static rtems_status_code disp_hcms29xx_font_struct_size
+  (
+/*-------------------------------------------------------------------------*\
+| Purpose:                                                                  |
+|   compute size of font data structure tree                                |
++---------------------------------------------------------------------------+
+| Input Parameters:                                                         |
+\*-------------------------------------------------------------------------*/
+  disp_font_t            src,           /* source font                     */
+  size_t                *dst_size       /* destination: size of font struct*/
+)
+/*-------------------------------------------------------------------------*\
+| Return Value:                                                             |
+|    rtems_status_code                                                      |
+\*=========================================================================*/
+{
+  
+  rtems_status_code rc = RTEMS_SUCCESSFUL;
+  size_t font_size = 0;
+  int glyph_idx;
+  /*
+   * check parameters
+   */
+  if ((rc == RTEMS_SUCCESSFUL) &&
+      (src == NULL)) {
+    rc = RTEMS_INVALID_ADDRESS;
+  }
+  if (rc == RTEMS_SUCCESSFUL) {
+    font_size = 
+      sizeof(*src);                      /* font_base structure       */
+  }
+  glyph_idx = 0;
+  while ((rc == RTEMS_SUCCESSFUL) &&
+	 (glyph_idx < (sizeof(src->latin1)/sizeof(src->latin1[0])))) {
+    if (src->latin1[glyph_idx] != NULL) {
+      font_size += sizeof(*(src->latin1[glyph_idx]))
+	+src->latin1[glyph_idx]->bb.w;
+    }
+    glyph_idx++;
+  }	 
+  *dst_size = font_size;  
+  
+  return rc;
+}
+
+/*=========================================================================*\
+| Function:                                                                 |
+\*-------------------------------------------------------------------------*/
+static inline unsigned char disp_hcms29xx_bitswap
+  (
+/*-------------------------------------------------------------------------*\
+| Purpose:                                                                  |
+|   swap data bits in byte (7<->0 , 6<->1 etc)                              |
++---------------------------------------------------------------------------+
+| Input Parameters:                                                         |
+\*-------------------------------------------------------------------------*/
+  unsigned char byte 
+)
+/*-------------------------------------------------------------------------*\
+| Return Value:                                                             |
+|    rtems_status_code                                                      |
+\*=========================================================================*/
+{
+  unsigned char result = 0;
+  int smsk,dmsk;
+  for (smsk =  0x01,dmsk=0x80;
+       smsk < 0x100; 
+       smsk<<=1   ,dmsk>>=1) {
+    if ((byte & smsk) != 0) {
+      result |= dmsk;
+    }
+  }
+  return result;
+}
+
+/*=========================================================================*\
+| Function:                                                                 |
+\*-------------------------------------------------------------------------*/
+rtems_status_code disp_hcms29xx_copy_font
+  (
+/*-------------------------------------------------------------------------*\
+| Purpose:                                                                  |
+|   copy font data from source to dest font structure                       |
++---------------------------------------------------------------------------+
+| Input Parameters:                                                         |
+\*-------------------------------------------------------------------------*/
+  disp_font_t src,                      /* source font                     */
+  struct disp_font_base *dst,           /* ptr to destination font         */
+  int shift_cnt,                        /* shift count for font            */
+  boolean do_rotate                     /* rotate font, if TRUE            */
+)
+/*-------------------------------------------------------------------------*\
+| Return Value:                                                             |
+|    rtems_status_code                                                      |
+\*=========================================================================*/
+{
+  
+  rtems_status_code rc = RTEMS_SUCCESSFUL;
+  char *alloc_next = (char *)dst;
+  int glyph_idx = 0;
+  int glyph_size;
+  unsigned char byte;
+  int bcnt;
+
+  /*
+   * check parameters
+   */
+  if ((rc == RTEMS_SUCCESSFUL) && 
+      ((src == NULL) ||
+       (dst == NULL))) {
+    rc = RTEMS_INVALID_ADDRESS;
+  }
+  /*
+   * copy font_base structure
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    *dst = *src;
+    alloc_next += sizeof(*dst);
+  }
+  /*
+   * for all glyphs: assign own glyph memory
+   */
+  glyph_idx = 0;
+  while ((rc == RTEMS_SUCCESSFUL) &&
+	 glyph_idx < (sizeof(src->latin1)/sizeof(src->latin1[0]))) {
+    if (src->latin1[glyph_idx] != NULL) {
+      /*
+       * allocate space for glyph
+       */
+      dst->latin1[glyph_idx] = (struct disp_font_glyph *)alloc_next;
+      alloc_next += sizeof(*(dst->latin1[glyph_idx]));
+      /*
+       * copy source values. 
+       * Note: bitmap will be reassigned later
+       */
+      *(struct disp_font_glyph *)(dst->latin1[glyph_idx]) = 
+	*(src->latin1[glyph_idx]);
+    }
+    else {
+      dst->latin1[glyph_idx] = NULL;
+    }
+    glyph_idx++;
+  }	 
+  
+  /*
+   * for all glyphs: reassign bitmap
+   */
+  glyph_idx = 0;
+  while ((rc == RTEMS_SUCCESSFUL) &&
+	 glyph_idx < (sizeof(src->latin1)/sizeof(src->latin1[0]))) {
+    if (src->latin1[glyph_idx] != NULL) {
+      glyph_size = src->latin1[glyph_idx]->bb.w;
+      /*
+       * allocate space for glyph_bitmap
+       */
+      dst->latin1[glyph_idx]->bitmap = alloc_next;
+      alloc_next += glyph_size;
+      /*
+       * copy/transform bitmap
+       */
+      for (bcnt = 0;bcnt < glyph_size;bcnt++) {
+	if (do_rotate) {
+	  byte = src->latin1[glyph_idx]->bitmap[glyph_size - 1 - bcnt];
+	  byte = disp_hcms29xx_bitswap(byte);
+	}
+	else {
+	  byte = src->latin1[glyph_idx]->bitmap[bcnt];
+	}
+	if (shift_cnt < 0) {
+	  byte = byte >> shift_cnt;
+	}
+	else if (shift_cnt > 0) {
+	  byte = byte >> shift_cnt;
+	}
+	((unsigned char *)(dst->latin1[glyph_idx]->bitmap))[bcnt] = byte;      
+      }
+    }
+    glyph_idx++;
+  }	 
+  return rc;
+}
+
+/*=========================================================================*\
+| Function:                                                                 |
+\*-------------------------------------------------------------------------*/
+rtems_status_code disp_hcms29xx_alloc_copy_font
+  (
+/*-------------------------------------------------------------------------*\
+| Purpose:                                                                  |
+|   copy font data from source to dest font structure, alloc all data       |
++---------------------------------------------------------------------------+
+| Input Parameters:                                                         |
+\*-------------------------------------------------------------------------*/
+  const disp_font_t src,                /* source font                     */
+  disp_font_t *dst,                     /* ptr to destination font         */
+  int shift_cnt,                        /* shift count for font            */
+  boolean do_rotate                     /* rotate font, if TRUE            */
+)
+/*-------------------------------------------------------------------------*\
+| Return Value:                                                             |
+|    rtems_status_code                                                      |
+\*=========================================================================*/
+{
+  
+  rtems_status_code rc = RTEMS_SUCCESSFUL;
+  size_t src_size = 0;
+  /*
+   * check parameters
+   */
+  if ((rc == RTEMS_SUCCESSFUL) && 
+      ((src == NULL)
+       || (dst == NULL))) {
+    rc = RTEMS_INVALID_ADDRESS;
+  }
+  /*
+   * determine size of source data
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = disp_hcms29xx_font_struct_size(src,&src_size);
+  }
+  /*
+   * allocate proper data area
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    *dst = malloc(src_size);
+    if (*dst == NULL) {
+      rc = RTEMS_UNSATISFIED;
+    }
+  }
+  /*
+   * scan through source data, copy to dest
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = disp_hcms29xx_copy_font(src,*dst,shift_cnt,do_rotate);
+  }
+  return rc;
+}
+
+/*=========================================
+ * SPI communication functions
+ */
+
+/*=========================================================================*\
+| Function:                                                                 |
+\*-------------------------------------------------------------------------*/
+rtems_status_code disp_hcms29xx_send_to_display
+  (
+/*-------------------------------------------------------------------------*\
+| Purpose:                                                                  |
+|   request access semaphore to SPI, prepare buffer descriptors, start      |
+|   transfer via SPI to display                                             |
++---------------------------------------------------------------------------+
+| Input Parameters:                                                         |
+\*-------------------------------------------------------------------------*/
+   disp_hcms29xx_drv_t *softc_ptr,
+   const volatile char *disp_buffer /* start of chars to display (4 chars or 'til \0)*/
+)
+/*-------------------------------------------------------------------------*\
+| Return Value:                                                             |
+|    rtems_status_code                                                      |
+\*=========================================================================*/
+{
+  rtems_status_code rc = RTEMS_SUCCESSFUL;
+  boolean char_avail;
+  const struct disp_font_glyph *glyph_ptr;
+  disp_font_t curr_font;
+  int i,digit,ret_cnt;
+  unsigned char c;
+
+  /*
+   * select device, set transfer mode, address device
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = rtems_libi2c_send_start(softc_ptr->disp_param.minor);
+  }
+  /*
+   * set transfer mode
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = -rtems_libi2c_ioctl(softc_ptr->disp_param.minor,
+			     RTEMS_LIBI2C_IOCTL_SET_TFRMODE,
+			     &spi_disphcms29xx_tfr_mode);
+  }
+
+  /*
+   * address device
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = rtems_libi2c_send_addr(softc_ptr->disp_param.minor,TRUE);
+  }
+
+  /*
+   * send data
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    curr_font = 
+      softc_ptr->disp_param.rotate 
+      ? disp_hcms29xx_font_rotate 
+      : disp_hcms29xx_font_normal;
+
+    char_avail = TRUE;
+    /*
+     * FIXME: for rotated display, write last character first...
+     * maybe we should copy everything to a common buffer and use 
+     * ONE SPI transfer?
+     */
+    for (i = 0;
+	 ((rc == RTEMS_SUCCESSFUL) &&
+	  (i < DISP_HCMS29XX_DIGIT_CNT));
+	  i++) {
+      /* test for end of string... */
+      c = disp_buffer[i]; /* perform consistent read of disp_buffer */
+      if (char_avail && (c == '\0')) {
+	char_avail = FALSE;
+      }
+      glyph_ptr = (char_avail 
+		   ? curr_font->latin1[c]
+		   : NULL);
+      if (glyph_ptr == NULL) {
+	glyph_ptr = curr_font->latin1[' '];
+      }	   
+
+      digit = (softc_ptr->disp_param.rotate 
+	       ? DISP_HCMS29XX_DIGIT_CNT-1-i 
+	       : i);
+      /*
+       * send 5 bytes from (char *)glyph_ptr->bitmap to SPI
+       */
+      if (rc == RTEMS_SUCCESSFUL) {
+	ret_cnt = rtems_libi2c_write_bytes(softc_ptr->disp_param.minor,
+					   glyph_ptr->bitmap,5);
+	if (ret_cnt < 0) {
+	  rc = -ret_cnt;
+	}
+      }
+    }
+  }
+  /*
+   * finish transfer
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = rtems_libi2c_send_stop(softc_ptr->disp_param.minor);
+  }
+
+  return rc;
+}
+
+/*=========================================================================*\
+| Function:                                                                 |
+\*-------------------------------------------------------------------------*/
+rtems_status_code disp_hcms29xx_send_to_control
+  (
+/*-------------------------------------------------------------------------*\
+| Purpose:                                                                  |
+|   request access semaphore to SPI, prepare buffer descriptors, start      |
+|   transfer via SPI to display                                             |
++---------------------------------------------------------------------------+
+| Input Parameters:                                                         |
+\*-------------------------------------------------------------------------*/
+   disp_hcms29xx_drv_t *softc_ptr,
+   int pwm,   /* value for pwm of LEDs, 0..15 */
+   int peak,  /* value for peak current for LEDs, 0..3 */
+   int sleep, /* value to make display "sleep" (0..1 */
+   int div,   /* divider for external osc input, unused here */
+   int chain  /* mode to drive other displays, unused here */
+)
+/*-------------------------------------------------------------------------*\
+| Return Value:                                                             |
+|    rtems_status_code                                                      |
+\*=========================================================================*/
+{
+  rtems_status_code rc = RTEMS_SUCCESSFUL;
+  int run, ret_cnt;
+  volatile uint8_t ctrl_buffer;
+
+  /* two accesses, control word 0 and 1 */
+  for (run = 0;
+       ((rc == RTEMS_SUCCESSFUL) && (run <= 1));
+       run++) {
+    if (rc == RTEMS_SUCCESSFUL) {
+      if (run == 0) {
+	ctrl_buffer = 
+	  (0              << 7) | 
+	  ((sleep & 0x01) << 6) |
+	  ((peak  & 0x03) << 4) |
+	  ((pwm & 0x0f)   << 0);
+      }
+      else {
+	ctrl_buffer = 
+	  (1              << 7) | 
+	  ((div   & 0x01) << 1) |
+	  ((chain & 0x01) << 0);
+      }
+      /*
+       * select device, set transfer mode, address device
+       */
+      if (rc == RTEMS_SUCCESSFUL) {
+	rc = rtems_libi2c_send_start(softc_ptr->disp_param.minor);
+      }
+      /*
+       * set transfer mode
+       */
+      if (rc == RTEMS_SUCCESSFUL) {
+	rc = -rtems_libi2c_ioctl(softc_ptr->disp_param.minor,
+				 RTEMS_LIBI2C_IOCTL_SET_TFRMODE,
+				 &spi_disphcms29xx_tfr_mode);
+      }
+
+      /*
+       * address device
+       */
+      if (rc == RTEMS_SUCCESSFUL) {
+	rc = rtems_libi2c_send_addr(softc_ptr->disp_param.minor,TRUE);
+      }
+
+      /*
+       * send 1 byte from ctrl_buffer
+       */
+      if (rc == RTEMS_SUCCESSFUL) {
+	ret_cnt = rtems_libi2c_write_bytes(softc_ptr->disp_param.minor,
+					   &ctrl_buffer,1);
+	if (ret_cnt < 0) {
+	  rc = -ret_cnt;
+	}
+      }
+    }
+  } /* next run ... */
+
+  /*
+   * finish transfer
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = rtems_libi2c_send_stop(softc_ptr->disp_param.minor);
+  }
+
+  return rc;
+}
+
+/*=========================================================================*\
+| Function:                                                                 |
+\*-------------------------------------------------------------------------*/
+rtems_timer_service_routine disp_hcms29xx_timer_sr
+/*-------------------------------------------------------------------------*\
+| Purpose:                                                                  |
+|   this task updates the string in the display                             |
++---------------------------------------------------------------------------+
+| Input Parameters:                                                         |
+\*-------------------------------------------------------------------------*/
+(
+ rtems_id id, /* ID of timer, not used  */
+ void * arg   /* calling arg: softc_ptr */
+)
+/*-------------------------------------------------------------------------*\
+| Return Value:                                                             |
+|    <none used>                                                            |
+\*=========================================================================*/
+{
+  rtems_status_code rc = RTEMS_SUCCESSFUL;
+  disp_hcms29xx_drv_t *softc_ptr = arg;
+  
+
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = rtems_event_send(softc_ptr->disp_param.task_id,
+			  DISP_HCMS29XX_EVENT_TIMER);
+  }
+}
+
+/*=========================================================================*\
+| Function:                                                                 |
+\*-------------------------------------------------------------------------*/
+rtems_task disp_hcms29xx_update_task
+  (
+/*-------------------------------------------------------------------------*\
+| Purpose:                                                                  |
+|   this task updates the string in the display                             |
++---------------------------------------------------------------------------+
+| Input Parameters:                                                         |
+\*-------------------------------------------------------------------------*/
+   rtems_task_argument argument /* softc_ptr */
+)
+/*-------------------------------------------------------------------------*\
+| Return Value:                                                             |
+|    <never exits>                                                          |
+\*=========================================================================*/
+{
+  rtems_event_set  my_events;
+  rtems_status_code rc = RTEMS_SUCCESSFUL;
+  int disp_offset = 0;
+  rtems_id disp_hcms29xx_timer_id;
+  disp_hcms29xx_drv_t *softc_ptr = (disp_hcms29xx_drv_t *)argument;
+
+  /*
+   * initialize display:
+   */
+  /*
+   * set control attributes for display
+   * maximum brightness...
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = disp_hcms29xx_send_to_control(softc_ptr,
+				       14,3,1,0,0);/* pwm/peak/nosleep/div/chain */
+  }
+  
+  /*
+   * set display to blank
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = disp_hcms29xx_send_to_display(softc_ptr,
+				       "");
+  }
+
+  /*
+   * create timer for scrolling
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = rtems_timer_create(DISP_HCMS29XX_TIMER_NAME,
+			    &disp_hcms29xx_timer_id);
+  }
+
+  while (rc == RTEMS_SUCCESSFUL) {
+    /*
+     * wait for any event
+     */
+    rc = rtems_event_receive(DISP_HCMS29XX_EVENT_NEWSTR |
+			     DISP_HCMS29XX_EVENT_TIMER ,
+			     RTEMS_WAIT | RTEMS_EVENT_ANY,
+			     RTEMS_NO_TIMEOUT,
+			     &my_events);
+    if (my_events & DISP_HCMS29XX_EVENT_NEWSTR) {
+      /*
+       * fetch new string consistently into local buffer 
+       */
+      if (rc == RTEMS_SUCCESSFUL) {
+	rc = rtems_semaphore_obtain(softc_ptr->disp_param.trns_sema_id,
+				    RTEMS_WAIT,RTEMS_NO_TIMEOUT);
+      }
+      if (rc == RTEMS_SUCCESSFUL) {
+	strncpy(softc_ptr->disp_param.disp_buffer,
+		softc_ptr->disp_param.trns_buffer,
+		sizeof(softc_ptr->disp_param.disp_buffer));
+	softc_ptr->disp_param.disp_buffer[sizeof(softc_ptr->disp_param.disp_buffer)-1] = '\0';
+	softc_ptr->disp_param.disp_buf_cnt = 
+	  strlen(softc_ptr->disp_param.disp_buffer);	
+      }
+      if (rc == RTEMS_SUCCESSFUL) {
+	rc = rtems_semaphore_release(softc_ptr->disp_param.trns_sema_id);
+      }
+      /* 
+       * set initial offset to negative value
+       * to make string static for some ticks
+       */
+      disp_offset = -4;
+    }
+    if (my_events & DISP_HCMS29XX_EVENT_TIMER) {
+      /*
+       * increase disp_offset, if possible, otherwise reset it
+       */
+      if ((disp_offset < 0) ||
+	  (disp_offset < softc_ptr->disp_param.disp_buf_cnt-
+	   DISP_HCMS29XX_DIGIT_CNT/2)) {
+	disp_offset++;
+      }
+      else {
+	disp_offset = -4;
+      }
+    }
+    /*
+     * display string, starting from disp_offset
+     */
+    if (disp_offset < 0) {
+      rc = disp_hcms29xx_send_to_display(softc_ptr,
+					 softc_ptr->disp_param.disp_buffer);
+    }
+    else if (disp_offset 
+	     < (softc_ptr->disp_param.disp_buf_cnt - DISP_HCMS29XX_DIGIT_CNT)) {
+      rc = disp_hcms29xx_send_to_display(softc_ptr,
+					 softc_ptr->disp_param.disp_buffer+disp_offset);
+    }
+    else {
+      rc = disp_hcms29xx_send_to_display(softc_ptr,
+					 softc_ptr->disp_param.disp_buffer
+					 + softc_ptr->disp_param.disp_buf_cnt
+					 - DISP_HCMS29XX_DIGIT_CNT);
+    }
+    /* 
+     * activate timer, if needed
+     */
+    if (rc == RTEMS_SUCCESSFUL) {
+      if (softc_ptr->disp_param.disp_buf_cnt > DISP_HCMS29XX_DIGIT_CNT) {
+	rc = rtems_timer_fire_after(disp_hcms29xx_timer_id,
+				    50,
+				    disp_hcms29xx_timer_sr,
+				    NULL);
+      }
+      else {
+	rc = rtems_timer_cancel(disp_hcms29xx_timer_id);
+      }
+    }
+  }    
+  /*
+   * FIXME: display task is dead... 
+   */
+}
+
+/*=========================================================================*\
+| Function:                                                                 |
+\*-------------------------------------------------------------------------*/
+rtems_status_code disp_hcms29xx_update
+  (
+/*-------------------------------------------------------------------------*\
+| Purpose:                                                                  |
+|   move given string to display task                                       |
++---------------------------------------------------------------------------+
+| Input Parameters:                                                         |
+\*-------------------------------------------------------------------------*/
+   disp_hcms29xx_drv_t *softc_ptr,
+   const char *src
+)
+/*-------------------------------------------------------------------------*\
+| Return Value:                                                             |
+|    rtems_status_code                                                      |
+\*=========================================================================*/
+{
+  rtems_status_code rc = RTEMS_SUCCESSFUL;
+  
+  /*
+   * obtain trns semaphore
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = rtems_semaphore_obtain(softc_ptr->disp_param.trns_sema_id,
+				RTEMS_WAIT,RTEMS_NO_TIMEOUT);
+  }
+  /*
+   * copy string...
+   */
+  strncpy(softc_ptr->disp_param.trns_buffer,src,
+	  sizeof(softc_ptr->disp_param.trns_buffer));
+  softc_ptr->disp_param.trns_buffer[sizeof(softc_ptr->disp_param.trns_buffer)-1] = '\0';
+
+  /*
+   * release trns semaphore
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = rtems_semaphore_release(softc_ptr->disp_param.trns_sema_id);
+  }
+
+  /*
+   * send event to task
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = rtems_event_send(softc_ptr->disp_param.task_id,
+			  DISP_HCMS29XX_EVENT_NEWSTR);
+  }
+  
+  return rc;
+}
+
+/*=========================================================================*\
+| Function:                                                                 |
+\*-------------------------------------------------------------------------*/
+rtems_device_driver disp_hcms29xx_dev_initialize
+  (
+/*-------------------------------------------------------------------------*\
+| Purpose:                                                                  |
+|   prepare the display device driver to accept write calls                 |
+|   register device with its name                                           |
++---------------------------------------------------------------------------+
+| Input Parameters:                                                         |
+\*-------------------------------------------------------------------------*/
+  rtems_device_major_number  major,
+  rtems_device_minor_number  minor,
+  void                      *arg
+)
+/*-------------------------------------------------------------------------*\
+| Return Value:                                                             |
+|    rtems_status_code                                                      |
+\*=========================================================================*/
+/*
+ * Initialize and register the device
+ */
+{
+  rtems_status_code rc = RTEMS_SUCCESSFUL;
+  static char *devname = {"/dev/disp"};
+  disp_hcms29xx_drv_t *softc_ptr;
+  /*
+   * FIXME: get softc_ptr
+   */
+
+  /*
+   * initialize font management
+   * FIXME: check, that default glyph exists
+   * FIXME: check font size to be 5x7
+   */  
+  /*
+   * translate font according to direction/baseline
+   */  
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = disp_hcms29xx_alloc_copy_font(
+			       &FONT_BASE,
+			       &disp_hcms29xx_font_normal,
+			       FONT_BASE.descent, /* shift to visibility... */
+			       FALSE); /* do not rotate */
+  }
+  /* FIXME: translate font for rotation */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = disp_hcms29xx_alloc_copy_font(&FONT_BASE,
+			       &disp_hcms29xx_font_rotate,
+			       0, /* do not shift */
+			       TRUE); /* rotate font */
+  }
+  /*
+   * create the trns_buffer semaphore
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = rtems_semaphore_create (DISP_HCMS29XX_TRNS_SEMA_NAME,1,
+				     RTEMS_PRIORITY
+				     |RTEMS_BINARY_SEMAPHORE
+				     |RTEMS_INHERIT_PRIORITY
+				     |RTEMS_NO_PRIORITY_CEILING
+				     |RTEMS_LOCAL,
+				     0,
+				     &softc_ptr->disp_param.trns_sema_id);
+  }
+ 
+  /*
+   * create and start display task
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = rtems_task_create(DISP_HCMS29XX_TASK_NAME,
+			   20,
+			   RTEMS_MINIMUM_STACK_SIZE,
+			   RTEMS_INTERRUPT_LEVEL(0) | RTEMS_TIMESLICE,
+			   RTEMS_DEFAULT_ATTRIBUTES,
+			   &softc_ptr->disp_param.task_id);
+  }
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = rtems_task_start(softc_ptr->disp_param.task_id, 
+			  disp_hcms29xx_update_task, 0 );
+  }
+  /*
+   * Register the device
+   */
+  if (rc == RTEMS_SUCCESSFUL) {
+    rc = rtems_io_register_name (devname, major, 0);
+  }
+  return rc;
+}	  
+
+/*=========================================================================*\
+| Function:                                                                 |
+\*-------------------------------------------------------------------------*/
+rtems_device_driver disp_hcms29xx_dev_open
+(
+/*-------------------------------------------------------------------------*\
+| Purpose:                                                                  |
+|   open the display device                                                 |
++---------------------------------------------------------------------------+
+| Input Parameters:                                                         |
+\*-------------------------------------------------------------------------*/
+  rtems_device_major_number  major,
+  rtems_device_minor_number  minor,
+  void                      *arg
+)
+/*-------------------------------------------------------------------------*\
+| Return Value:                                                             |
+|    rtems_status_code                                                      |
+\*=========================================================================*/
+{
+  disp_hcms29xx_drv_t *softc_ptr;
+  /*
+   * FIXME: get softc_ptr
+   */
+  /* 
+   * ensure, that disp_hcms29xx device is assumed to be empty
+   */
+  softc_ptr->disp_param.dev_buf_cnt = 0;
+
+  return RTEMS_SUCCESSFUL;
+}
+ 
+/*=========================================================================*\
+| Function:                                                                 |
+\*-------------------------------------------------------------------------*/
+rtems_device_driver disp_hcms29xx_dev_write
+(
+/*-------------------------------------------------------------------------*\
+| Purpose:                                                                  |
+|   write to display device                                                 |
++---------------------------------------------------------------------------+
+| Input Parameters:                                                         |
+\*-------------------------------------------------------------------------*/
+  rtems_device_major_number  major,
+  rtems_device_minor_number  minor,
+  void                      *arg
+)
+/*-------------------------------------------------------------------------*\
+| Return Value:                                                             |
+|    rtems_status_code                                                      |
+\*=========================================================================*/
+{
+  rtems_libio_rw_args_t *args = arg;
+  int cnt;
+  disp_hcms29xx_drv_t *softc_ptr;
+  /*
+   * FIXME: get softc_ptr
+   */
+
+  for (cnt = 0;cnt < args->count;cnt++) {
+    /*
+     * accumulate characters written into display dev buffer 
+     */
+    if (((softc_ptr->disp_param.dev_buf_cnt > 0) 
+	&&((args->buffer[cnt] == '\n')
+	   || (args->buffer[cnt] == '\0'))
+	 )
+	||( softc_ptr->disp_param.dev_buf_cnt >= 
+	    sizeof(softc_ptr->disp_param.dev_buffer) - 1)) {
+      softc_ptr->disp_param.dev_buffer[softc_ptr->disp_param.dev_buf_cnt] = '\0';
+      /*
+       * transfer string to display string, redisplay it... 
+       */
+      disp_hcms29xx_update(softc_ptr,softc_ptr->disp_param.dev_buffer);
+      softc_ptr->disp_param.dev_buf_cnt = 0;      
+    }
+    /* 
+     * write to dev_buf, if '\n' occured or display device buffer is full
+     */
+    if ((args->buffer[cnt] != '\n') &&
+	(args->buffer[cnt] != '\0')) {
+      softc_ptr->disp_param.dev_buffer[softc_ptr->disp_param.dev_buf_cnt++] = 
+	args->buffer[cnt];
+    }
+  }
+  args->bytes_moved = args->count;
+
+  return RTEMS_SUCCESSFUL;
+}
+
+/*=========================================================================*\
+| Function:                                                                 |
+\*-------------------------------------------------------------------------*/
+rtems_device_driver disp_hcms29xx_dev_close
+(
+/*-------------------------------------------------------------------------*\
+| Purpose:                                                                  |
+|   close the display device                                                |
++---------------------------------------------------------------------------+
+| Input Parameters:                                                         |
+\*-------------------------------------------------------------------------*/
+  rtems_device_major_number  major,
+  rtems_device_minor_number  minor,
+  void                      *arg
+)
+/*-------------------------------------------------------------------------*\
+| Return Value:                                                             |
+|    rtems_status_code                                                      |
+\*=========================================================================*/
+{
+  disp_hcms29xx_drv_t *softc_ptr;
+  /*
+   * FIXME: get softc_ptr
+   */
+  /* flush buffer, if not empty */
+  if (softc_ptr->disp_param.dev_buf_cnt > 0) {
+      softc_ptr->disp_param.dev_buffer[softc_ptr->disp_param.dev_buf_cnt] = 
+	'\0';
+      /*
+       * transfer string to display string, redisplay it... 
+       */
+      disp_hcms29xx_update(softc_ptr,softc_ptr->disp_param.dev_buffer);
+      softc_ptr->disp_param.dev_buf_cnt = 0;      
+  }    
+  return RTEMS_SUCCESSFUL;
+}
Index: c/src/libchip/display/disp_hcms29xx.h
===================================================================
--- c/src/libchip/display/disp_hcms29xx.h	(revision 80a0ae82484749af38a490dea139286e95a060eb)
+++ c/src/libchip/display/disp_hcms29xx.h	(revision 80a0ae82484749af38a490dea139286e95a060eb)
@@ -0,0 +1,69 @@
+/*===============================================================*\
+| Project: display driver for HCMS29xx                            |
++-----------------------------------------------------------------+
+| File: disp_hcms29xx.h                                           |
++-----------------------------------------------------------------+
+|                    Copyright (c) 2008                           |
+|                    Embedded Brains GmbH                         |
+|                    Obere Lagerstr. 30                           |
+|                    D-82178 Puchheim                             |
+|                    Germany                                      |
+|                    rtems@embedded-brains.de                     |
++-----------------------------------------------------------------+
+| The license and distribution terms for this file may be         |
+| found in the file LICENSE in this distribution or at            |
+|                                                                 |
+| http://www.rtems.com/license/LICENSE.                           |
+|                                                                 |
++-----------------------------------------------------------------+
+| this file declares the SPI based driver for a HCMS29xx 4 digit  |
+| alphanumeric LED display                                        |
++-----------------------------------------------------------------+
+|  $Id$
+\*===============================================================*/
+#ifndef _DISP_HCMS29XX_H
+#define _DISP_HCMS29XX_H
+#include <rtems.h>
+#include <time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define DISP_HCMS29XX_TEXT_CNT (128)
+
+  typedef struct {
+    rtems_device_major_number minor;   /* minor device number            */
+    /* 
+     * in the disp_buffer, the string to be displayed is placed
+     */
+    char disp_buffer[DISP_HCMS29XX_TEXT_CNT];
+    int  disp_buf_cnt; /* number of valid chars in disp_buffer */
+    /*
+     * in the trns buffer the string is transfered to display task 
+     */
+    char trns_buffer[DISP_HCMS29XX_TEXT_CNT];
+    /* 
+     * in the dev_buffer, characters will be accumulated before display... 
+     */
+    char dev_buffer[DISP_HCMS29XX_TEXT_CNT];
+    int  dev_buf_cnt; /* number of valid chars in dev_buffer */
+    
+    rtems_id trns_sema_id;  /* ID of disp trns buffer sema   */
+    rtems_id task_id;       /* ID of disp task               */
+    rtems_boolean rotate;  /* FLAG: display is upside down       */
+  } spi_disp_hcms29xx_param_t;
+
+  typedef struct {
+    rtems_libi2c_drv_t        libi2c_drv_entry;
+    spi_disp_hcms29xx_param_t disp_param;
+  } disp_hcms29xx_drv_t;
+  /*
+   * pass this descriptor pointer to rtems_libi2c_register_drv 
+   */
+  extern rtems_libi2c_drv_t *disp_hcms29xx__driver_descriptor;
+  
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _DISP_HCMS29XX_H */
Index: c/src/libchip/display/font_hcms29xx.c
===================================================================
--- c/src/libchip/display/font_hcms29xx.c	(revision 80a0ae82484749af38a490dea139286e95a060eb)
+++ c/src/libchip/display/font_hcms29xx.c	(revision 80a0ae82484749af38a490dea139286e95a060eb)
@@ -0,0 +1,1824 @@
+/*===============================================================*\
+| Project: display driver for HCMS29xx                            |
++-----------------------------------------------------------------+
+| File: font_hcms29xx.c                                           |
++-----------------------------------------------------------------+
+|                    Copyright (c) 2008                           |
+|                    Embedded Brains GmbH                         |
+|                    Obere Lagerstr. 30                           |
+|                    D-82178 Puchheim                             |
+|                    Germany                                      |
+|                    rtems@embedded-brains.de                     |
++-----------------------------------------------------------------+
+| The license and distribution terms for this file may be         |
+| found in the file LICENSE in this distribution or at            |
+|                                                                 |
+| http://www.rtems.com/license/LICENSE.                           |
+|                                                                 |
++-----------------------------------------------------------------+
+| This file defines the 5x7 bit font used in disp_hcms29xx        |
++-----------------------------------------------------------------+
+|  $Id$
+\*===============================================================*/
+
+#include <stddef.h>
+#include "disp_fonts.h"
+
+const unsigned char bitmap_hp_fixed_5_7_0 [5] = {
+  0x08,
+  0x1c,
+  0x3e,
+  0x7f,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_0 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_0,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_1 [5] = {
+  0x30,
+  0x45,
+  0x48,
+  0x40,
+  0x30 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_1 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_1,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_2 [5] = {
+  0x45,
+  0x29,
+  0x11,
+  0x29,
+  0x45 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_2 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_2,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_3 [5] = {
+  0x7d,
+  0x09,
+  0x11,
+  0x21,
+  0x7d 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_3 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_3,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_4 [5] = {
+  0x7d,
+  0x09,
+  0x05,
+  0x05,
+  0x79 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_4 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_4,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_5 [5] = {
+  0x38,
+  0x44,
+  0x44,
+  0x38,
+  0x44 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_5 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_5,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_6 [5] = {
+  0x7e,
+  0x01,
+  0x29,
+  0x2e,
+  0x10 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_6 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_6,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_7 [5] = {
+  0x30,
+  0x4a,
+  0x4d,
+  0x49,
+  0x30 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_7 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_7,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_8 [5] = {
+  0x60,
+  0x50,
+  0x48,
+  0x50,
+  0x60 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_8 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_8,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_9 [5] = {
+  0x1e,
+  0x04,
+  0x04,
+  0x38,
+  0x40 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_9 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_9,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_10 [5] = {
+  0x3e,
+  0x49,
+  0x49,
+  0x49,
+  0x3e 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_10 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_10,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_11 [5] = {
+  0x62,
+  0x14,
+  0x08,
+  0x10,
+  0x60 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_11 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_11,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_12 [5] = {
+  0x40,
+  0x3c,
+  0x20,
+  0x20,
+  0x1c 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_12 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_12,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_13 [5] = {
+  0x08,
+  0x7c,
+  0x04,
+  0x7c,
+  0x02 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_13 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_13,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_14 [5] = {
+  0x38,
+  0x44,
+  0x44,
+  0x3c,
+  0x04 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_14 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_14,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_15 [5] = {
+  0x41,
+  0x63,
+  0x55,
+  0x49,
+  0x41 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_15 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_15,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_16 [5] = {
+  0x10,
+  0x08,
+  0x78,
+  0x08,
+  0x04 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_16 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_16,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_17 [5] = {
+  0x18,
+  0x24,
+  0x7e,
+  0x24,
+  0x18 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_17 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_17,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_18 [5] = {
+  0x5e,
+  0x61,
+  0x01,
+  0x61,
+  0x5e 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_18 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_18,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_19 [5] = {
+  0x78,
+  0x14,
+  0x15,
+  0x14,
+  0x78 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_19 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_19,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_20 [5] = {
+  0x38,
+  0x44,
+  0x45,
+  0x3c,
+  0x40 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_20 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_20,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_21 [5] = {
+  0x78,
+  0x15,
+  0x14,
+  0x15,
+  0x78 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_21 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_21,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_22 [5] = {
+  0x38,
+  0x45,
+  0x44,
+  0x3d,
+  0x40 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_22 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_22,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_23 [5] = {
+  0x3c,
+  0x43,
+  0x42,
+  0x43,
+  0x3c 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_23 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_23,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_24 [5] = {
+  0x38,
+  0x45,
+  0x44,
+  0x45,
+  0x38 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_24 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_24,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_25 [5] = {
+  0x3c,
+  0x41,
+  0x40,
+  0x41,
+  0x3c 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_25 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_25,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_26 [5] = {
+  0x38,
+  0x42,
+  0x40,
+  0x42,
+  0x38 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_26 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_26,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_27 [5] = {
+  0x08,
+  0x08,
+  0x2a,
+  0x1c,
+  0x08 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_27 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_27,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_28 [5] = {
+  0x20,
+  0x7e,
+  0x02,
+  0x02,
+  0x02 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_28 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_28,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_29 [5] = {
+  0x12,
+  0x19,
+  0x15,
+  0x12,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_29 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_29,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_30 [5] = {
+  0x48,
+  0x7e,
+  0x49,
+  0x41,
+  0x42 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_30 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_30,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_31 [5] = {
+  0x01,
+  0x12,
+  0x7c,
+  0x12,
+  0x01 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_31 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_31,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_32 [5] = {
+  0x00,
+  0x00,
+  0x00,
+  0x00,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_32 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_32,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_33 [5] = {
+  0x00,
+  0x5f,
+  0x00,
+  0x00,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_33 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_33,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_34 [5] = {
+  0x00,
+  0x03,
+  0x00,
+  0x03,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_34 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_34,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_35 [5] = {
+  0x14,
+  0x7f,
+  0x14,
+  0x7f,
+  0x14 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_35 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_35,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_36 [5] = {
+  0x24,
+  0x2a,
+  0x7f,
+  0x2a,
+  0x12 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_36 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_36,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_37 [5] = {
+  0x23,
+  0x13,
+  0x08,
+  0x64,
+  0x62 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_37 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_37,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_38 [5] = {
+  0x36,
+  0x49,
+  0x56,
+  0x20,
+  0x50 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_38 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_38,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_39 [5] = {
+  0x00,
+  0x0b,
+  0x07,
+  0x00,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_39 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_39,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_40 [5] = {
+  0x00,
+  0x00,
+  0x3e,
+  0x41,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_40 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_40,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_41 [5] = {
+  0x00,
+  0x41,
+  0x3e,
+  0x00,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_41 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_41,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_42 [5] = {
+  0x08,
+  0x2a,
+  0x1c,
+  0x2a,
+  0x08 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_42 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_42,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_43 [5] = {
+  0x08,
+  0x08,
+  0x3e,
+  0x08,
+  0x08 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_43 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_43,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_44 [5] = {
+  0x00,
+  0x58,
+  0x38,
+  0x00,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_44 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_44,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_45 [5] = {
+  0x08,
+  0x08,
+  0x08,
+  0x08,
+  0x08 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_45 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_45,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_46 [5] = {
+  0x00,
+  0x30,
+  0x30,
+  0x00,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_46 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_46,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_47 [5] = {
+  0x20,
+  0x10,
+  0x08,
+  0x04,
+  0x02 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_47 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_47,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_48 [5] = {
+  0x3e,
+  0x51,
+  0x49,
+  0x45,
+  0x3e 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_48 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_48,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_49 [5] = {
+  0x00,
+  0x42,
+  0x7f,
+  0x40,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_49 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_49,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_50 [5] = {
+  0x62,
+  0x51,
+  0x49,
+  0x49,
+  0x46 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_50 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_50,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_51 [5] = {
+  0x22,
+  0x41,
+  0x49,
+  0x49,
+  0x36 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_51 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_51,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_52 [5] = {
+  0x18,
+  0x14,
+  0x12,
+  0x7f,
+  0x10 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_52 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_52,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_53 [5] = {
+  0x27,
+  0x45,
+  0x45,
+  0x45,
+  0x39 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_53 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_53,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_54 [5] = {
+  0x3c,
+  0x4a,
+  0x49,
+  0x49,
+  0x30 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_54 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_54,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_55 [5] = {
+  0x01,
+  0x71,
+  0x09,
+  0x05,
+  0x03 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_55 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_55,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_56 [5] = {
+  0x36,
+  0x49,
+  0x49,
+  0x49,
+  0x36 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_56 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_56,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_57 [5] = {
+  0x06,
+  0x49,
+  0x49,
+  0x29,
+  0x1e 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_57 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_57,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_58 [5] = {
+  0x00,
+  0x36,
+  0x36,
+  0x00,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_58 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_58,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_59 [5] = {
+  0x00,
+  0x5b,
+  0x3b,
+  0x00,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_59 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_59,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_60 [5] = {
+  0x00,
+  0x08,
+  0x14,
+  0x22,
+  0x41 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_60 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_60,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_61 [5] = {
+  0x14,
+  0x14,
+  0x14,
+  0x14,
+  0x14 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_61 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_61,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_62 [5] = {
+  0x41,
+  0x22,
+  0x14,
+  0x08,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_62 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_62,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_63 [5] = {
+  0x02,
+  0x01,
+  0x51,
+  0x09,
+  0x06 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_63 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_63,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_64 [5] = {
+  0x3e,
+  0x41,
+  0x5d,
+  0x55,
+  0x1e 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_64 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_64,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_65 [5] = {
+  0x7e,
+  0x09,
+  0x09,
+  0x09,
+  0x7e 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_65 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_65,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_66 [5] = {
+  0x7e,
+  0x49,
+  0x49,
+  0x49,
+  0x36 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_66 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_66,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_67 [5] = {
+  0x3e,
+  0x41,
+  0x41,
+  0x41,
+  0x22 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_67 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_67,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_68 [5] = {
+  0x7f,
+  0x41,
+  0x41,
+  0x41,
+  0x3e 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_68 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_68,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_69 [5] = {
+  0x7f,
+  0x49,
+  0x49,
+  0x49,
+  0x41 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_69 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_69,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_70 [5] = {
+  0x7f,
+  0x09,
+  0x09,
+  0x09,
+  0x01 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_70 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_70,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_71 [5] = {
+  0x3e,
+  0x41,
+  0x41,
+  0x51,
+  0x32 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_71 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_71,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_72 [5] = {
+  0x7f,
+  0x08,
+  0x08,
+  0x08,
+  0x7f 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_72 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_72,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_73 [5] = {
+  0x00,
+  0x41,
+  0x7f,
+  0x41,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_73 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_73,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_74 [5] = {
+  0x20,
+  0x40,
+  0x40,
+  0x40,
+  0x3f 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_74 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_74,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_75 [5] = {
+  0x7f,
+  0x08,
+  0x14,
+  0x22,
+  0x41 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_75 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_75,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_76 [5] = {
+  0x7f,
+  0x40,
+  0x40,
+  0x40,
+  0x40 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_76 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_76,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_77 [5] = {
+  0x7f,
+  0x02,
+  0x0c,
+  0x02,
+  0x7f 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_77 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_77,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_78 [5] = {
+  0x7f,
+  0x04,
+  0x08,
+  0x10,
+  0x7f 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_78 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_78,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_79 [5] = {
+  0x3e,
+  0x41,
+  0x41,
+  0x41,
+  0x3e 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_79 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_79,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_80 [5] = {
+  0x7f,
+  0x09,
+  0x09,
+  0x09,
+  0x06 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_80 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_80,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_81 [5] = {
+  0x3e,
+  0x41,
+  0x51,
+  0x21,
+  0x5e 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_81 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_81,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_82 [5] = {
+  0x7f,
+  0x09,
+  0x19,
+  0x29,
+  0x46 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_82 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_82,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_83 [5] = {
+  0x26,
+  0x49,
+  0x49,
+  0x49,
+  0x32 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_83 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_83,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_84 [5] = {
+  0x01,
+  0x01,
+  0x7f,
+  0x01,
+  0x01 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_84 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_84,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_85 [5] = {
+  0x3f,
+  0x40,
+  0x40,
+  0x40,
+  0x3f 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_85 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_85,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_86 [5] = {
+  0x07,
+  0x18,
+  0x60,
+  0x18,
+  0x07 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_86 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_86,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_87 [5] = {
+  0x7f,
+  0x20,
+  0x18,
+  0x20,
+  0x7f 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_87 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_87,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_88 [5] = {
+  0x63,
+  0x14,
+  0x08,
+  0x14,
+  0x63 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_88 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_88,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_89 [5] = {
+  0x03,
+  0x04,
+  0x78,
+  0x04,
+  0x03 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_89 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_89,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_90 [5] = {
+  0x61,
+  0x51,
+  0x49,
+  0x45,
+  0x43 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_90 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_90,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_91 [5] = {
+  0x00,
+  0x00,
+  0x7f,
+  0x41,
+  0x41 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_91 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_91,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_92 [5] = {
+  0x02,
+  0x04,
+  0x08,
+  0x10,
+  0x20 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_92 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_92,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_93 [5] = {
+  0x41,
+  0x41,
+  0x7f,
+  0x00,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_93 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_93,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_94 [5] = {
+  0x04,
+  0x02,
+  0x7f,
+  0x02,
+  0x04 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_94 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_94,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_95 [5] = {
+  0x40,
+  0x40,
+  0x40,
+  0x40,
+  0x40 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_95 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_95,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_96 [5] = {
+  0x00,
+  0x07,
+  0x0b,
+  0x00,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_96 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_96,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_97 [5] = {
+  0x38,
+  0x44,
+  0x44,
+  0x3c,
+  0x40 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_97 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_97,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_98 [5] = {
+  0x7f,
+  0x48,
+  0x44,
+  0x44,
+  0x38 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_98 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_98,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_99 [5] = {
+  0x38,
+  0x44,
+  0x44,
+  0x44,
+  0x44 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_99 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_99,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_100 [5] = {
+  0x38,
+  0x44,
+  0x44,
+  0x48,
+  0x7f 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_100 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_100,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_101 [5] = {
+  0x38,
+  0x54,
+  0x54,
+  0x54,
+  0x08 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_101 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_101,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_102 [5] = {
+  0x08,
+  0x7e,
+  0x09,
+  0x02,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_102 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_102,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_103 [5] = {
+  0x08,
+  0x14,
+  0x54,
+  0x54,
+  0x3c 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_103 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_103,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_104 [5] = {
+  0x7f,
+  0x08,
+  0x04,
+  0x04,
+  0x78 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_104 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_104,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_105 [5] = {
+  0x00,
+  0x44,
+  0x7d,
+  0x40,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_105 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_105,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_106 [5] = {
+  0x20,
+  0x40,
+  0x44,
+  0x3d,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_106 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_106,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_107 [5] = {
+  0x00,
+  0x7f,
+  0x10,
+  0x28,
+  0x44 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_107 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_107,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_108 [5] = {
+  0x00,
+  0x41,
+  0x7f,
+  0x40,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_108 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_108,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_109 [5] = {
+  0x78,
+  0x04,
+  0x18,
+  0x04,
+  0x78 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_109 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_109,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_110 [5] = {
+  0x7c,
+  0x08,
+  0x04,
+  0x04,
+  0x78 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_110 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_110,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_111 [5] = {
+  0x38,
+  0x44,
+  0x44,
+  0x44,
+  0x38 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_111 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_111,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_112 [5] = {
+  0x7c,
+  0x14,
+  0x24,
+  0x24,
+  0x18 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_112 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_112,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_113 [5] = {
+  0x18,
+  0x24,
+  0x14,
+  0x7c,
+  0x40 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_113 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_113,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_114 [5] = {
+  0x00,
+  0x7c,
+  0x08,
+  0x04,
+  0x04 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_114 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_114,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_115 [5] = {
+  0x48,
+  0x54,
+  0x54,
+  0x54,
+  0x20 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_115 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_115,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_116 [5] = {
+  0x04,
+  0x3e,
+  0x44,
+  0x20,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_116 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_116,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_117 [5] = {
+  0x3c,
+  0x40,
+  0x40,
+  0x20,
+  0x7c 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_117 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_117,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_118 [5] = {
+  0x1c,
+  0x20,
+  0x40,
+  0x20,
+  0x1c 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_118 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_118,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_119 [5] = {
+  0x3c,
+  0x40,
+  0x30,
+  0x40,
+  0x3c 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_119 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_119,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_120 [5] = {
+  0x44,
+  0x28,
+  0x10,
+  0x28,
+  0x44 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_120 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_120,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_121 [5] = {
+  0x04,
+  0x48,
+  0x30,
+  0x08,
+  0x04 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_121 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_121,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_122 [5] = {
+  0x44,
+  0x64,
+  0x54,
+  0x4c,
+  0x44 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_122 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_122,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_123 [5] = {
+  0x00,
+  0x08,
+  0x36,
+  0x41,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_123 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_123,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_124 [5] = {
+  0x00,
+  0x00,
+  0x77,
+  0x00,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_124 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_124,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_125 [5] = {
+  0x00,
+  0x41,
+  0x36,
+  0x08,
+  0x00 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_125 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_125,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_126 [5] = {
+  0x08,
+  0x04,
+  0x08,
+  0x10,
+  0x08 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_126 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_126,
+};
+
+const unsigned char bitmap_hp_fixed_5_7_127 [5] = {
+  0x2a,
+  0x55,
+  0x2a,
+  0x55,
+  0x2a 
+};
+const struct disp_font_glyph glyph_hp_fixed_5_7_127 = {
+  {5,7,0,0},
+  5, 0, bitmap_hp_fixed_5_7_127,
+};
+
+const struct disp_font_base font_base_hp_fixed_5_7 = {
+  1,               /* trans */
+  {5, 7, 0, -1},  /* fbb w, h, x, y */
+  7, 0,            /* ascent, descent */
+  0,               /* default_char */
+  {&glyph_hp_fixed_5_7_0,
+  &glyph_hp_fixed_5_7_1,
+  &glyph_hp_fixed_5_7_2,
+  &glyph_hp_fixed_5_7_3,
+  &glyph_hp_fixed_5_7_4,
+  &glyph_hp_fixed_5_7_5,
+  &glyph_hp_fixed_5_7_6,
+  &glyph_hp_fixed_5_7_7,
+  &glyph_hp_fixed_5_7_8,
+  &glyph_hp_fixed_5_7_9,
+  &glyph_hp_fixed_5_7_10,
+  &glyph_hp_fixed_5_7_11,
+  &glyph_hp_fixed_5_7_12,
+  &glyph_hp_fixed_5_7_13,
+  &glyph_hp_fixed_5_7_14,
+  &glyph_hp_fixed_5_7_15,
+  &glyph_hp_fixed_5_7_16,
+  &glyph_hp_fixed_5_7_17,
+  &glyph_hp_fixed_5_7_18,
+  &glyph_hp_fixed_5_7_19,
+  &glyph_hp_fixed_5_7_20,
+  &glyph_hp_fixed_5_7_21,
+  &glyph_hp_fixed_5_7_22,
+  &glyph_hp_fixed_5_7_23,
+  &glyph_hp_fixed_5_7_24,
+  &glyph_hp_fixed_5_7_25,
+  &glyph_hp_fixed_5_7_26,
+  &glyph_hp_fixed_5_7_27,
+  &glyph_hp_fixed_5_7_28,
+  &glyph_hp_fixed_5_7_29,
+  &glyph_hp_fixed_5_7_30,
+  &glyph_hp_fixed_5_7_31,
+  &glyph_hp_fixed_5_7_32,
+  &glyph_hp_fixed_5_7_33,
+  &glyph_hp_fixed_5_7_34,
+  &glyph_hp_fixed_5_7_35,
+  &glyph_hp_fixed_5_7_36,
+  &glyph_hp_fixed_5_7_37,
+  &glyph_hp_fixed_5_7_38,
+  &glyph_hp_fixed_5_7_39,
+  &glyph_hp_fixed_5_7_40,
+  &glyph_hp_fixed_5_7_41,
+  &glyph_hp_fixed_5_7_42,
+  &glyph_hp_fixed_5_7_43,
+  &glyph_hp_fixed_5_7_44,
+  &glyph_hp_fixed_5_7_45,
+  &glyph_hp_fixed_5_7_46,
+  &glyph_hp_fixed_5_7_47,
+  &glyph_hp_fixed_5_7_48,
+  &glyph_hp_fixed_5_7_49,
+  &glyph_hp_fixed_5_7_50,
+  &glyph_hp_fixed_5_7_51,
+  &glyph_hp_fixed_5_7_52,
+  &glyph_hp_fixed_5_7_53,
+  &glyph_hp_fixed_5_7_54,
+  &glyph_hp_fixed_5_7_55,
+  &glyph_hp_fixed_5_7_56,
+  &glyph_hp_fixed_5_7_57,
+  &glyph_hp_fixed_5_7_58,
+  &glyph_hp_fixed_5_7_59,
+  &glyph_hp_fixed_5_7_60,
+  &glyph_hp_fixed_5_7_61,
+  &glyph_hp_fixed_5_7_62,
+  &glyph_hp_fixed_5_7_63,
+  &glyph_hp_fixed_5_7_64,
+  &glyph_hp_fixed_5_7_65,
+  &glyph_hp_fixed_5_7_66,
+  &glyph_hp_fixed_5_7_67,
+  &glyph_hp_fixed_5_7_68,
+  &glyph_hp_fixed_5_7_69,
+  &glyph_hp_fixed_5_7_70,
+  &glyph_hp_fixed_5_7_71,
+  &glyph_hp_fixed_5_7_72,
+  &glyph_hp_fixed_5_7_73,
+  &glyph_hp_fixed_5_7_74,
+  &glyph_hp_fixed_5_7_75,
+  &glyph_hp_fixed_5_7_76,
+  &glyph_hp_fixed_5_7_77,
+  &glyph_hp_fixed_5_7_78,
+  &glyph_hp_fixed_5_7_79,
+  &glyph_hp_fixed_5_7_80,
+  &glyph_hp_fixed_5_7_81,
+  &glyph_hp_fixed_5_7_82,
+  &glyph_hp_fixed_5_7_83,
+  &glyph_hp_fixed_5_7_84,
+  &glyph_hp_fixed_5_7_85,
+  &glyph_hp_fixed_5_7_86,
+  &glyph_hp_fixed_5_7_87,
+  &glyph_hp_fixed_5_7_88,
+  &glyph_hp_fixed_5_7_89,
+  &glyph_hp_fixed_5_7_90,
+  &glyph_hp_fixed_5_7_91,
+  &glyph_hp_fixed_5_7_92,
+  &glyph_hp_fixed_5_7_93,
+  &glyph_hp_fixed_5_7_94,
+  &glyph_hp_fixed_5_7_95,
+  &glyph_hp_fixed_5_7_96,
+  &glyph_hp_fixed_5_7_97,
+  &glyph_hp_fixed_5_7_98,
+  &glyph_hp_fixed_5_7_99,
+  &glyph_hp_fixed_5_7_100,
+  &glyph_hp_fixed_5_7_101,
+  &glyph_hp_fixed_5_7_102,
+  &glyph_hp_fixed_5_7_103,
+  &glyph_hp_fixed_5_7_104,
+  &glyph_hp_fixed_5_7_105,
+  &glyph_hp_fixed_5_7_106,
+  &glyph_hp_fixed_5_7_107,
+  &glyph_hp_fixed_5_7_108,
+  &glyph_hp_fixed_5_7_109,
+  &glyph_hp_fixed_5_7_110,
+  &glyph_hp_fixed_5_7_111,
+  &glyph_hp_fixed_5_7_112,
+  &glyph_hp_fixed_5_7_113,
+  &glyph_hp_fixed_5_7_114,
+  &glyph_hp_fixed_5_7_115,
+  &glyph_hp_fixed_5_7_116,
+  &glyph_hp_fixed_5_7_117,
+  &glyph_hp_fixed_5_7_118,
+  &glyph_hp_fixed_5_7_119,
+  &glyph_hp_fixed_5_7_120,
+  &glyph_hp_fixed_5_7_121,
+  &glyph_hp_fixed_5_7_122,
+  &glyph_hp_fixed_5_7_123,
+  &glyph_hp_fixed_5_7_124,
+  &glyph_hp_fixed_5_7_125,
+  &glyph_hp_fixed_5_7_126,
+  &glyph_hp_fixed_5_7_127,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+   NULL}
+};
Index: c/src/libchip/display/font_hcms29xx.h
===================================================================
--- c/src/libchip/display/font_hcms29xx.h	(revision 80a0ae82484749af38a490dea139286e95a060eb)
+++ c/src/libchip/display/font_hcms29xx.h	(revision 80a0ae82484749af38a490dea139286e95a060eb)
@@ -0,0 +1,42 @@
+/*===============================================================*\
+| Project: display driver for HCMS29xx                            |
++-----------------------------------------------------------------+
+| File: font_hcms29xx.h                                           |
++-----------------------------------------------------------------+
+|                    Copyright (c) 2008                           |
+|                    Embedded Brains GmbH                         |
+|                    Obere Lagerstr. 30                           |
+|                    D-82178 Puchheim                             |
+|                    Germany                                      |
+|                    rtems@embedded-brains.de                     |
++-----------------------------------------------------------------+
+| The license and distribution terms for this file may be         |
+| found in the file LICENSE in this distribution or at            |
+|                                                                 |
+| http://www.rtems.com/license/LICENSE.                           |
+|                                                                 |
++-----------------------------------------------------------------+
+| This file declares the 5x7 bit font used in disp_hcms29xx       |
++-----------------------------------------------------------------+
+|  $Id$
+\*===============================================================*/
+
+#ifndef FONT_HCMS29XX_H
+#define FONT_HCMS29XX_H
+
+#include "disp_fonts.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern disp_font_t font_hcms29xx;
+
+extern const struct disp_font_base font_hcms29xx_base;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* not defined FONT_HCMS29XX_H */
Index: c/src/libchip/preinstall.am
===================================================================
--- c/src/libchip/preinstall.am	(revision 25a92bc1ed79b0eb5967fa454220ea90810c7ebb)
+++ c/src/libchip/preinstall.am	(revision 80a0ae82484749af38a490dea139286e95a060eb)
@@ -34,4 +34,9 @@
 	@: > $(PROJECT_INCLUDE)/libchip/$(dirstamp)
 PREINSTALL_DIRS += $(PROJECT_INCLUDE)/libchip/$(dirstamp)
+endif
+if LIBCHIP
+$(PROJECT_INCLUDE)/libchip/disp_hcms29xx.h: display/disp_hcms29xx.h $(PROJECT_INCLUDE)/libchip/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libchip/disp_hcms29xx.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/libchip/disp_hcms29xx.h
 endif
 if LIBCHIP
