diff options
-rw-r--r-- | c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog | 5 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/tqm8xx/configure.ac | 20 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/tqm8xx/console/console.c | 8 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/tqm8xx/include/bsp.h | 15 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/tqm8xx/irq/irq.c | 12 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/tqm8xx/spi/spi.c | 268 | ||||
-rw-r--r-- | c/src/libchip/display/disp_hcms29xx.c | 72 | ||||
-rw-r--r-- | c/src/libchip/display/disp_hcms29xx.h | 94 | ||||
-rw-r--r-- | c/src/libchip/display/font_hcms29xx.c | 2 | ||||
-rw-r--r-- | c/src/libchip/display/font_hcms29xx.h | 2 |
10 files changed, 361 insertions, 137 deletions
diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog b/c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog index 226ad27d6a..45f4d160f3 100644 --- a/c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog +++ b/c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog @@ -1,3 +1,8 @@ +2010-01-18 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> + + * configure.ac, console/console.c, include/bsp.h, irq/irq.c, + spi/spi.c: various fixes + 2009-12-16 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> * console/console.c: adapted to new prototype for *_write diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/configure.ac b/c/src/lib/libbsp/powerpc/tqm8xx/configure.ac index d989356eb6..a72893cffc 100644 --- a/c/src/lib/libbsp/powerpc/tqm8xx/configure.ac +++ b/c/src/lib/libbsp/powerpc/tqm8xx/configure.ac @@ -51,7 +51,7 @@ RTEMS_BSPOPTS_HELP([PRINTK_CHN], each other.]) RTEMS_BSPOPTS_SET([CONS_SMC1_MODE],[tqm8xx_stk8xx],[CONS_MODE_POLLED]) -RTEMS_BSPOPTS_SET([CONS_SMC1_MODE],[pghplus],[CONS_MODE_POLLED]) +RTEMS_BSPOPTS_SET([CONS_SMC1_MODE],[pghplus],[CONS_MODE_IRQ]) RTEMS_BSPOPTS_SET([CONS_SMC1_MODE],[*],[CONS_MODE_UNUSED]) RTEMS_BSPOPTS_HELP([CONS_SMC1_MODE], [(BSP--SMC1 UART IF mode) Must be defined if SMC1 is used as a tty (UART) @@ -89,6 +89,24 @@ RTEMS_BSPOPTS_HELP([CONS_SCC4_MODE], channel. Set it to CONS_MODE_POLLED for polled operation, CONS_MODE_IRQ for interrupt driven (spooled) operation. Set it to CONS_MODE_UNUSED, if not used]) +RTEMS_BSPOPTS_SET([SPI_BOARD_INIT_FNC],[pghplus],[bsp_pghplus_spi_init]) +RTEMS_BSPOPTS_SET([SPI_BOARD_INIT_FNC],[*],[bsp_dummy_spi_init]) +RTEMS_BSPOPTS_HELP([SPI_BOARD_INIT_FNC], +[(BSP--SPI board init function) Specify the function that inits the board + port lines and further devices.]) + +RTEMS_BSPOPTS_SET([SPI_SEND_STOP_FNC],[pghplus],[bsp_pghplus_spi_send_stop]) +RTEMS_BSPOPTS_SET([SPI_SEND_STOP_FNC],[*],[bsp_dummy_spi_send_stop]) +RTEMS_BSPOPTS_HELP([SPI_SEND_STOP_FNC], +[(BSP--SPI send stop function) Specify the function that deaddresses SPI + devices. Set to bsp_dummy_spi_send_stop for dummy implementation]) + +RTEMS_BSPOPTS_SET([SPI_SEND_ADDR_FNC],[pghplus],[bsp_pghplus_spi_sel_addr]) +RTEMS_BSPOPTS_SET([SPI_SEND_ADDR_FNC],[*],[bsp_dummy_spi_sel_addr]) +RTEMS_BSPOPTS_HELP([SPI_SEND_ADDR_FNC], +[(BSP--SPI send address function) Specify the function that addresses SPI + devices. Set to bsp_dummy_spi_sel_addr for dummy implementation]) + # add selection of primary network interface RTEMS_BSPOPTS_SET([BSP_USE_NETWORK_FEC],[pghplus],[1]) RTEMS_BSPOPTS_SET([BSP_USE_NETWORK_FEC],[*],[0]) diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c b/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c index 80f1cbd412..a4cda15d34 100644 --- a/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c +++ b/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c @@ -499,19 +499,21 @@ sccInterruptHandler (void *arg) static void mpc8xx_console_irq_on(const rtems_irq_connect_data *irq) { - CHN_MASK_SET(irq->name,3); /* Enable TX and RX interrupts */ + CHN_MASK_SET(irq->name - BSP_CPM_IRQ_LOWEST_OFFSET, + 3); /* Enable TX and RX interrupts */ } static void mpc8xx_console_irq_off(const rtems_irq_connect_data *irq) { - CHN_MASK_SET(irq->name,0); /* Disable TX and RX interrupts */ + CHN_MASK_SET(irq->name - BSP_CPM_IRQ_LOWEST_OFFSET, + 0); /* Disable TX and RX interrupts */ } static int mpc8xx_console_irq_isOn(const rtems_irq_connect_data *irq) { - return (0 != CHN_MASK_GET(irq->name)); /* Check TX and RX interrupts */ + return (0 != CHN_MASK_GET(irq->name - BSP_CPM_IRQ_LOWEST_OFFSET)); /* Check TX and RX interrupts */ } static void diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/include/bsp.h b/c/src/lib/libbsp/powerpc/tqm8xx/include/bsp.h index 8544390f05..548d5a91db 100644 --- a/c/src/lib/libbsp/powerpc/tqm8xx/include/bsp.h +++ b/c/src/lib/libbsp/powerpc/tqm8xx/include/bsp.h @@ -132,6 +132,21 @@ extern int rtems_scc_enet_driver_attach (struct rtems_bsdnet_ifconfig *config, #undef RTEMS_BSP_HAS_IDE_DRIVER /* + * SPI driver configuration + */ + + /* select values for SPI addressing */ +#define PGHPLUS_SPI_ADDR_EEPROM 0 +#define PGHPLUS_SPI_ADDR_DISP4 1 + /* NOTE: DISP4 occupies two consecutive addresses for data and control port */ +#define PGHPLUS_SPI_ADDR_DISP4_DATA (PGHPLUS_SPI_ADDR_DISP4) +#define PGHPLUS_SPI_ADDR_DISP4_CTRL (PGHPLUS_SPI_ADDR_DISP4_DATA+1) + + /* bit masks for Port B lines */ +#define PGHPLUS_PB_SPI_EEP_CE_MSK (1<< 0) +#define PGHPLUS_PB_SPI_DISP4_RS_MSK (1<<15) +#define PGHPLUS_PB_SPI_DISP4_CE_MSK (1<<14) +/* * our (internal) bus frequency */ extern uint32_t BSP_bus_frequency; diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/irq/irq.c b/c/src/lib/libbsp/powerpc/tqm8xx/irq/irq.c index 1e87902566..2991636392 100644 --- a/c/src/lib/libbsp/powerpc/tqm8xx/irq/irq.c +++ b/c/src/lib/libbsp/powerpc/tqm8xx/irq/irq.c @@ -52,14 +52,14 @@ rtems_status_code bsp_irq_enable_at_SIU(rtems_vector_number irqnum) rtems_status_code bsp_irq_disable_at_CPM(rtems_vector_number irqnum) { rtems_vector_number vecnum = irqnum - BSP_CPM_IRQ_LOWEST_OFFSET; - m8xx.cimr &= ~(1 << (31 - vecnum)); + m8xx.cimr &= ~(1 << (vecnum)); return RTEMS_SUCCESSFUL; } rtems_status_code bsp_irq_enable_at_CPM(rtems_vector_number irqnum) { rtems_vector_number vecnum = irqnum - BSP_CPM_IRQ_LOWEST_OFFSET; - m8xx.cimr |= (1 << (31 - vecnum)); + m8xx.cimr |= (1 << (vecnum)); return RTEMS_SUCCESSFUL; } @@ -193,10 +193,12 @@ rtems_status_code mpc8xx_cpic_initialize( void) /* * make sure CPIC request proper level at SIU interrupt controller */ - m8xx.cicr = (0x00e41f00 | + m8xx.cicr = (0x00e41f80 | ((BSP_CPM_INTERRUPT/2) << 13)); - - return RTEMS_SUCCESSFUL; + /* + * enable CPIC interrupt in SIU interrupt controller + */ + return bsp_irq_enable_at_SIU(BSP_CPM_INTERRUPT); } /* diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/spi/spi.c b/c/src/lib/libbsp/powerpc/tqm8xx/spi/spi.c index 134dd536d0..4c5d2ffe86 100644 --- a/c/src/lib/libbsp/powerpc/tqm8xx/spi/spi.c +++ b/c/src/lib/libbsp/powerpc/tqm8xx/spi/spi.c @@ -19,7 +19,8 @@ #include <stdlib.h> #include <bsp.h> #include <mpc8xx.h> -#include "spi.h" +#include <bsp/spi.h> +#include <libchip/disp_hcms29xx.h> #include <rtems/error.h> #include <rtems/bspIo.h> #include <errno.h> @@ -625,7 +626,7 @@ int m8xx_spi_ioctl /*=========================================================================*\ | Function: | \*-------------------------------------------------------------------------*/ -static rtems_status_code bsp_spi_sel_addr +static rtems_status_code bsp_dummy_spi_sel_addr ( /*-------------------------------------------------------------------------*\ | Purpose: | @@ -639,48 +640,111 @@ static rtems_status_code bsp_spi_sel_addr ) /*-------------------------------------------------------------------------*\ | Return Value: | +| rtems_status_code | +\*=========================================================================*/ +{ + return RTEMS_SUCCESSFUL; +} + +/*=========================================================================*\ +| Function: | +\*-------------------------------------------------------------------------*/ +static rtems_status_code bsp_dummy_spi_send_start +( +/*-------------------------------------------------------------------------*\ +| Purpose: | +| dummy function, SPI has no start condition | ++---------------------------------------------------------------------------+ +| Input Parameters: | +\*-------------------------------------------------------------------------*/ + rtems_libi2c_bus_t *bh /* bus specifier structure */ +) +/*-------------------------------------------------------------------------*\ +| Return Value: | +| o = ok or error code | +\*=========================================================================*/ +{ + return RTEMS_SUCCESSFUL; +} + +/*=========================================================================*\ +| Function: | +\*-------------------------------------------------------------------------*/ +static rtems_status_code bsp_dummy_spi_send_stop +( +/*-------------------------------------------------------------------------*\ +| Purpose: | +| deselect SPI | ++---------------------------------------------------------------------------+ +| Input Parameters: | +\*-------------------------------------------------------------------------*/ + rtems_libi2c_bus_t *bh /* bus specifier structure */ +) +/*-------------------------------------------------------------------------*\ +| Return Value: | | o = ok or error code | \*=========================================================================*/ { -#if defined(PGH360) + return RTEMS_SUCCESSFUL; +} + +/*=========================================================================*\ +| Function: | +\*-------------------------------------------------------------------------*/ +static rtems_status_code bsp_pghplus_spi_sel_addr +( +/*-------------------------------------------------------------------------*\ +| Purpose: | +| address a slave device on the bus | ++---------------------------------------------------------------------------+ +| Input Parameters: | +\*-------------------------------------------------------------------------*/ + rtems_libi2c_bus_t *bh, /* bus specifier structure */ + uint32_t addr, /* address to send on bus */ + int rw /* 0=write,1=read */ +) +/*-------------------------------------------------------------------------*\ +| Return Value: | +| rtems_status_code | +\*=========================================================================*/ +{ +#if defined(PGHPLUS) + pbdat_val = m8xx.pbdat | (PGHPLUS_SPI_PB_DISP4_RS_MSK | + PGHPLUS_SPI_PB_DISP4_CE_MSK | + PGHPLUS_SPI_PB_EEP_CE_MSK); /* * select given device */ - /* - * GPIO1[24] is SPI_A0 - * GPIO1[25] is SPI_A1 - * GPIO1[26] is SPI_A2 - * set pins to address - */ switch(addr) { - case PGH360_SPI_ADDR_EEPROM: - m8xx.pbdat &= ~PGH360_PB_SPI_EEP_CE_MSK; + case PGHPLUS_SPI_ADDR_EEPROM: + pbdat_val &= ~PGHPLUS_SPI_PB_EEP_CE_MSK; break; - case PGH360_SPI_ADDR_DISP4_DATA: - m8xx.pbdat = (m8xx.pbdat - & ~(PGH360_PB_SPI_DISP4_CE_MSK | - PGH360_PB_SPI_DISP4_RS_MSK)); + case PGHPLUS_SPI_ADDR_DISP4_DATA: + pbdat_val = (m8xx.pbdat + & ~(PGHPLUS_PB_SPI_DISP4_CE_MSK | + PGHPLUS_PB_SPI_DISP4_RS_MSK)); break; - case PGH360_SPI_ADDR_DISP4_CTRL: - m8xx.pbdat = (m8xx.pbdat - & ~(PGH360_PB_SPI_DISP4_CE_MSK) - | PGH360_PB_SPI_DISP4_RS_MSK); + case PGHPLUS_SPI_ADDR_DISP4_CTRL: + pbdat_val = (m8xx.pbdat + & ~(PGHPLUS_PB_SPI_DISP4_CE_MSK) + | PGHPLUS_PB_SPI_DISP4_RS_MSK); break; default: return RTEMS_INVALID_NUMBER; } -#endif /* PGH360 */ + m8xx_pbdat = pbdat_val +#endif /* PGHPLUS */ return RTEMS_SUCCESSFUL; } /*=========================================================================*\ | Function: | \*-------------------------------------------------------------------------*/ -static rtems_status_code bsp_spi_send_start_dummy +static rtems_status_code bsp_pghplus_spi_send_stop ( /*-------------------------------------------------------------------------*\ | Purpose: | -| dummy function, SPI has no start condition | +| deselect SPI | +---------------------------------------------------------------------------+ | Input Parameters: | \*-------------------------------------------------------------------------*/ @@ -691,39 +755,121 @@ static rtems_status_code bsp_spi_send_start_dummy | o = ok or error code | \*=========================================================================*/ { - return 0; +#if defined(DEBUG) + printk("bsp_pghplus_spi_send_stop called... "); +#endif + m8xx.pbdat = (m8xx.pbdat + | PGHPLUS_PB_SPI_DISP4_CE_MSK + | PGHPLUS_PB_SPI_EEP_CE_MSK); +#if defined(DEBUG) + printk("... exit OK\r\n"); +#endif + return RTEMS_SUCCESSFUL; } /*=========================================================================*\ | Function: | \*-------------------------------------------------------------------------*/ -static rtems_status_code bsp_spi_send_stop +static rtems_status_code bsp_pghplus_spi_init ( /*-------------------------------------------------------------------------*\ | Purpose: | -| deselect SPI | +| do board specific init: | +| - initialize pins for addressing | +| - register further drivers | +---------------------------------------------------------------------------+ | Input Parameters: | \*-------------------------------------------------------------------------*/ - rtems_libi2c_bus_t *bh /* bus specifier structure */ + int spi_busno ) /*-------------------------------------------------------------------------*\ | Return Value: | | o = ok or error code | \*=========================================================================*/ { + int ret_code; + #if defined(DEBUG) - printk("bsp_spi_send_stop called... "); + printk("bsp_pghplus_spi_init called... "); #endif -#if defined(PGH360) - m8xx.pbdat = (m8xx.pbdat - | PGH360_PB_SPI_DISP4_CE_MSK - | PGH360_PB_SPI_EEP_CE_MSK); + + /* + * init port pins used to address/select SPI devices + */ + + /* + * set up ports + * LINE PAR DIR DAT + * ----------------------- + * EEP_CE 0 1 act-high + * DISP4_CS 0 1 act-high + * DISP4_RS 0 1 active + */ + + /* set Port B Pin Assignment Register... */ + m8xx.pbpar = + (m8xx.pbpar + & ~(PGHPLUS_PB_SPI_EEP_CE_MSK + | PGHPLUS_PB_SPI_DISP4_CE_MSK + | PGHPLUS_PB_SPI_DISP4_RS_MSK)); + + /* set Port B Data Direction Register... */ + m8xx.pbdir = + m8xx.pbdir + | PGHPLUS_PB_SPI_EEP_CE_MSK + | PGHPLUS_PB_SPI_DISP4_CE_MSK + | PGHPLUS_PB_SPI_DISP4_RS_MSK; + + /* set Port B Data Register to inactive CE state */ + m8xx.pbdat = + m8xx.pbdat + | PGHPLUS_PB_SPI_DISP4_CE_MSK + | PGHPLUS_PB_SPI_DISP4_RS_MSK; + + /* + * register devices + */ + ret_code = rtems_libi2c_register_drv("disp", + disp_hcms29xx_driver_descriptor, + spi_busno,PGHPLUS_SPI_ADDR_DISP4); + if (ret_code < 0) { + return -ret_code; + } + +#if defined(DEBUG) + printk("... exit OK\r\n"); +#endif + return RTEMS_SUCCESSFUL; +} + +/*=========================================================================*\ +| Function: | +\*-------------------------------------------------------------------------*/ +static rtems_status_code bsp_dummy_spi_init +( +/*-------------------------------------------------------------------------*\ +| Purpose: | +| do board specific init: | +| - initialize pins for addressing | +| - register further drivers | ++---------------------------------------------------------------------------+ +| Input Parameters: | +\*-------------------------------------------------------------------------*/ + int spi_busno +) +/*-------------------------------------------------------------------------*\ +| Return Value: | +| o = ok or error code | +\*=========================================================================*/ +{ +#if defined(DEBUG) + printk("bsp_dummy_spi_init called... "); #endif + #if defined(DEBUG) printk("... exit OK\r\n"); #endif - return 0; + return RTEMS_SUCCESSFUL; } /*=========================================================================*\ @@ -732,9 +878,9 @@ static rtems_status_code bsp_spi_send_stop rtems_libi2c_bus_ops_t bsp_spi_ops = { init: m8xx_spi_init, - send_start: bsp_spi_send_start_dummy, - send_stop: bsp_spi_send_stop, - send_addr: bsp_spi_sel_addr, + send_start: bsp_dummy_spi_send_start, + send_stop: SPI_SEND_STOP_FNC, + send_addr: SPI_SEND_ADDR_FNC, read_bytes: m8xx_spi_read_bytes, write_bytes: m8xx_spi_write_bytes, ioctl: m8xx_spi_ioctl @@ -780,41 +926,6 @@ rtems_status_code bsp_register_spi */ rtems_libi2c_initialize (); - /* - * init port pins used to address/select SPI devices - */ - -#if defined(PGH360) - - /* - * set up ports - * LINE PAR DIR DAT - * ----------------------- - * EEP_CE 0 1 act-high - * DISP4_CS 0 1 act-high - * DISP4_RS 0 1 active - */ - - /* set Port B Pin Assignment Register... */ - m8xx.pbpar = - (m8xx.pbpar - & ~(PGH360_PB_SPI_EEP_CE_MSK - | PGH360_PB_SPI_DISP4_CE_MSK - | PGH360_PB_SPI_DISP4_RS_MSK)); - - /* set Port B Data Direction Register... */ - m8xx.pbdir = - m8xx.pbdir - | PGH360_PB_SPI_EEP_CE_MSK - | PGH360_PB_SPI_DISP4_CE_MSK - | PGH360_PB_SPI_DISP4_RS_MSK; - - /* set Port B Data Register to inactive CE state */ - m8xx.pbdat = - m8xx.pbdat - | PGH360_PB_SPI_DISP4_CE_MSK - | PGH360_PB_SPI_DISP4_RS_MSK; -#endif /* * register SPI bus @@ -825,23 +936,12 @@ rtems_status_code bsp_register_spi return -ret_code; } spi_busno = ret_code; -#if defined(PGH360) - /* - * register devices - */ -#if 0 - ret_code = rtems_libi2c_register_drv(RTEMS_BSP_SPI_FLASH_DEVICE_NAME, - spi_flash_m25p40_rw_driver_descriptor, - spi_busno,0x00); - if (ret_code < 0) { - return -ret_code; - } -#endif -#endif /* defined(PGH360) */ + + SPI_BOARD_INIT_FNC(spi_busno); /* * FIXME: further drivers, when available */ - return 0; + return RTEMS_SUCCESSFUL; } diff --git a/c/src/libchip/display/disp_hcms29xx.c b/c/src/libchip/display/disp_hcms29xx.c index 3cb850fb90..cd4a7aaf41 100644 --- a/c/src/libchip/display/disp_hcms29xx.c +++ b/c/src/libchip/display/disp_hcms29xx.c @@ -33,7 +33,7 @@ #include <rtems/libio.h> #include <bsp.h> #include <rtems/libi2c.h> -#include "disp_hcms29xx.h" +#include <libchip/disp_hcms29xx.h> #include "font_hcms29xx.h" #define FONT_BASE font_hcms29xx_base @@ -59,6 +59,8 @@ const rtems_libi2c_tfr_mode_t spi_disphcms29xx_tfr_mode = { .idle_char = 0 }; +static disp_hcms29xx_drv_t disp_hcms29xx_drv_tbl; + /*========================================= * font management functions */ @@ -544,7 +546,7 @@ static rtems_task disp_hcms29xx_update_task +---------------------------------------------------------------------------+ | Input Parameters: | \*-------------------------------------------------------------------------*/ - rtems_task_argument argument /* softc_ptr */ + rtems_task_argument argument ) /*-------------------------------------------------------------------------*\ | Return Value: | @@ -555,7 +557,7 @@ static rtems_task disp_hcms29xx_update_task 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; + disp_hcms29xx_drv_t *softc_ptr = &disp_hcms29xx_drv_tbl; /* * initialize display: @@ -748,11 +750,7 @@ rtems_device_driver disp_hcms29xx_dev_initialize */ { rtems_status_code rc = RTEMS_SUCCESSFUL; - static char *devname = {"/dev/disp"}; - disp_hcms29xx_drv_t *softc_ptr = NULL; - /* - * FIXME: get softc_ptr - */ + disp_hcms29xx_drv_t *softc_ptr = &disp_hcms29xx_drv_tbl; /* * initialize font management @@ -803,13 +801,7 @@ rtems_device_driver disp_hcms29xx_dev_initialize } 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); + disp_hcms29xx_update_task,0); } return rc; } @@ -834,10 +826,7 @@ rtems_device_driver disp_hcms29xx_dev_open | rtems_status_code | \*=========================================================================*/ { - disp_hcms29xx_drv_t *softc_ptr = NULL; - /* - * FIXME: get softc_ptr - */ + disp_hcms29xx_drv_t *softc_ptr = &disp_hcms29xx_drv_tbl; /* * ensure, that disp_hcms29xx device is assumed to be empty */ @@ -868,10 +857,7 @@ rtems_device_driver disp_hcms29xx_dev_write { rtems_libio_rw_args_t *args = arg; uint32_t cnt; - disp_hcms29xx_drv_t *softc_ptr = NULL; - /* - * FIXME: get softc_ptr - */ + disp_hcms29xx_drv_t *softc_ptr = &disp_hcms29xx_drv_tbl; for (cnt = 0;cnt < args->count;cnt++) { /* @@ -924,22 +910,30 @@ rtems_device_driver disp_hcms29xx_dev_close | rtems_status_code | \*=========================================================================*/ { - disp_hcms29xx_drv_t *softc_ptr = NULL; - /* - * FIXME: get softc_ptr - */ - return RTEMS_NOT_IMPLEMENTED; - - /* 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; } + +/* + * 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 */ + } +}; + +rtems_libi2c_drv_t *disp_hcms29xx_driver_descriptor = + &disp_hcms29xx_drv_tbl.libi2c_drv_entry; + diff --git a/c/src/libchip/display/disp_hcms29xx.h b/c/src/libchip/display/disp_hcms29xx.h index 332d46562d..6898205c07 100644 --- a/c/src/libchip/display/disp_hcms29xx.h +++ b/c/src/libchip/display/disp_hcms29xx.h @@ -32,7 +32,7 @@ extern "C" { #define DISP_HCMS29XX_TEXT_CNT (128) typedef struct { - rtems_device_major_number minor; /* minor device number */ + rtems_device_minor_number minor; /* minor device number */ /* * in the disp_buffer, the string to be displayed is placed */ @@ -60,8 +60,98 @@ extern "C" { /* * pass this descriptor pointer to rtems_libi2c_register_drv */ - extern rtems_libi2c_drv_t *disp_hcms29xx__driver_descriptor; + extern rtems_libi2c_drv_t *disp_hcms29xx_driver_descriptor; +/*=========================================================================*\ +| 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 | +\*=========================================================================*/ + +/*=========================================================================*\ +| 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 | +\*=========================================================================*/ + +/*=========================================================================*\ +| 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 | +\*=========================================================================*/ + +/*=========================================================================*\ +| 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 | +\*=========================================================================*/ + +#define DISP_HCMS29XX_DRIVER { \ + disp_hcms29xx_dev_initialize, \ + disp_hcms29xx_dev_open, \ + NULL, \ + disp_hcms29xx_dev_write, \ + NULL, \ + disp_hcms29xx_dev_close} + + #ifdef __cplusplus } #endif diff --git a/c/src/libchip/display/font_hcms29xx.c b/c/src/libchip/display/font_hcms29xx.c index 3838e1f3e2..1262af9043 100644 --- a/c/src/libchip/display/font_hcms29xx.c +++ b/c/src/libchip/display/font_hcms29xx.c @@ -1560,7 +1560,7 @@ struct disp_font_glyph glyph_hp_fixed_5_7_127 = { 5, 0, bitmap_hp_fixed_5_7_127, }; -const struct disp_font_base font_base_hp_fixed_5_7 = { +const struct disp_font_base font_hcms29xx_base = { 1, /* trans */ {5, 7, 0, -1}, /* fbb w, h, x, y */ 7, 0, /* ascent, descent */ diff --git a/c/src/libchip/display/font_hcms29xx.h b/c/src/libchip/display/font_hcms29xx.h index 486cfeaeea..d0e67bbbcb 100644 --- a/c/src/libchip/display/font_hcms29xx.h +++ b/c/src/libchip/display/font_hcms29xx.h @@ -31,8 +31,6 @@ extern "C" { #endif -extern disp_font_t font_hcms29xx; - extern struct disp_font_base font_hcms29xx_base; #ifdef __cplusplus |