diff options
Diffstat (limited to 'c/src/libchip/display/disp_hcms29xx.c')
-rw-r--r-- | c/src/libchip/display/disp_hcms29xx.c | 932 |
1 files changed, 0 insertions, 932 deletions
diff --git a/c/src/libchip/display/disp_hcms29xx.c b/c/src/libchip/display/disp_hcms29xx.c deleted file mode 100644 index 5730b36ea9..0000000000 --- a/c/src/libchip/display/disp_hcms29xx.c +++ /dev/null @@ -1,932 +0,0 @@ -/*===============================================================*\ -| 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.org/license/LICENSE. | -+-----------------------------------------------------------------+ -| this file contains the SPI based driver for a HCMS29xx 4 digit | -| alphanumeric LED display | -\*===============================================================*/ - -#include <string.h> -#include <stdlib.h> - -#include <rtems.h> -#include <rtems/libio.h> -#include <bsp.h> -#include <rtems/libi2c.h> -#include <libchip/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 -}; - -static disp_hcms29xx_drv_t disp_hcms29xx_drv_tbl; - -/*========================================= - * 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; - size_t 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])) - + (size_t) 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 |= (unsigned char) dmsk; - } - } - return result; -} - -/*=========================================================================*\ -| Function: | -\*-------------------------------------------------------------------------*/ -static 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 */ - bool do_rotate /* rotate font, if true */ -) -/*-------------------------------------------------------------------------*\ -| Return Value: | -| rtems_status_code | -\*=========================================================================*/ -{ - - rtems_status_code rc = RTEMS_SUCCESSFUL; - char *alloc_next = (char *)dst; - size_t 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 = (const unsigned char *) 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: | -\*-------------------------------------------------------------------------*/ -static 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 */ - bool 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: | -\*-------------------------------------------------------------------------*/ -static 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; - bool char_avail; - const struct disp_font_glyph *glyph_ptr; - disp_font_t curr_font; - int i, 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[' ']; - } - - /* - * 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: | -\*-------------------------------------------------------------------------*/ -static 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; - 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: | -\*-------------------------------------------------------------------------*/ -static 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> | -\*=========================================================================*/ -{ - disp_hcms29xx_drv_t *softc_ptr = arg; - - rtems_event_send(softc_ptr->disp_param.task_id, DISP_HCMS29XX_EVENT_TIMER); -} - -/*=========================================================================*\ -| Function: | -\*-------------------------------------------------------------------------*/ -static rtems_task disp_hcms29xx_update_task - ( -/*-------------------------------------------------------------------------*\ -| Purpose: | -| this task updates the string in the display | -+---------------------------------------------------------------------------+ -| Input Parameters: | -\*-------------------------------------------------------------------------*/ - rtems_task_argument argument -) -/*-------------------------------------------------------------------------*\ -| 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_tbl; - - /* - * 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 = - (int) 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: | -\*-------------------------------------------------------------------------*/ -static 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; - disp_hcms29xx_drv_t *softc_ptr = &disp_hcms29xx_drv_tbl; - - /* - * 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); - } - 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 = &disp_hcms29xx_drv_tbl; - /* - * 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; - uint32_t cnt; - disp_hcms29xx_drv_t *softc_ptr = &disp_hcms29xx_drv_tbl; - - 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 >= - (int) 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 | -\*=========================================================================*/ -{ - - return RTEMS_SUCCESSFUL; -} - -/* - * driver operation tables - */ -static rtems_driver_address_table disp_hcms29xx_ops = { - .initialization_entry = disp_hcms29xx_dev_initialize, - .open_entry = disp_hcms29xx_dev_open, - .write_entry = disp_hcms29xx_dev_write, - .close_entry = disp_hcms29xx_dev_close -}; - - -static disp_hcms29xx_drv_t disp_hcms29xx_drv_tbl = { - {/* public fields */ - .ops = &disp_hcms29xx_ops, - .size = sizeof (disp_hcms29xx_drv_t), - }, - { /* our private fields */ - 0, - { 0 }, - 0, - { 0 }, - { 0 }, - 0, - 0, - 0, - false - } -}; - -rtems_libi2c_drv_t *disp_hcms29xx_driver_descriptor = - &disp_hcms29xx_drv_tbl.libi2c_drv_entry; - |