diff --git a/drivers/tdisp/HD44780/tdisp_lld.c b/drivers/tdisp/HD44780/tdisp_lld.c new file mode 100644 index 00000000..b830a7ca --- /dev/null +++ b/drivers/tdisp/HD44780/tdisp_lld.c @@ -0,0 +1,87 @@ +/* + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file drivers/tdisp/HD44780/tdisp_lld.c + * @brief TDISP driver subsystem low level driver source for the HD44780 display + * + * @addtogroup TDISP + * @{ + */ + +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +#if GFX_USE_TDISP /*|| defined(__DOXYGEN__)*/ + +#ifndef TDISP_ROWS + #define TDISP_ROWS 16 +#endif +#ifndef TDISP_COLUMNS + #define TDISP_COLUMNS 2 +#endif + +#include "tdisp_lld_board_example.h" + +void TDISP_LLD(write_cmd)(uint8_t data) { + setpin_rs(FALSE); + setpin_rw(FALSE); + + write_bus(data); + + setpin_e(TRUE); + chThdSleepMicroseconds(1); + setpin_e(FALSE); + chThdSleepMicroseconds(5); +} + +void TDISP_LLD(write_data)(uint8_t data) { + setpin_rs(TRUE); + setpin_rw(FALSE); + + write_bus(data); + + setpin_e(TRUE); + chThdSleepMicroseconds(1); + setpin_e(FALSE); + chThdSleepMicroseconds(5); +} + +bool_t TDISP_LLD(init)(void) { + /* initialise hardware */ + init_board(); + + /* initialise controller */ + chThdSleepMilliseconds(50); + TDISP_LLD(write_cmd)(0x38); + chThdSleepMilliseconds(64); + TDISP_LLD(write_cmd)(0x0f); + chThdSleepMicroseconds(50); + TDISP_LLD(write_cmd)(0x01); + chThdSleepMilliseconds(5); + TDISP_LLD(write_cmd)(0x06); + chThdSleepMicroseconds(50); + + return TRUE; +} + +#endif /* GFX_USE_TDISP */ + diff --git a/drivers/tdisp/HD44780/tdisp_lld.mk b/drivers/tdisp/HD44780/tdisp_lld.mk new file mode 100644 index 00000000..88780bea --- /dev/null +++ b/drivers/tdisp/HD44780/tdisp_lld.mk @@ -0,0 +1,6 @@ +# List the required driver. +GFXSRC += $(GFXLIB)/drivers/tdisp/HD44780/tdisp_lld.c + +# Required include directories +GFXINC += $(GFXLIB)/drivers/tdisp/HD44780 + diff --git a/drivers/tdisp/HD44780/tdisp_lld_board_example.h b/drivers/tdisp/HD44780/tdisp_lld_board_example.h new file mode 100644 index 00000000..e07116d8 --- /dev/null +++ b/drivers/tdisp/HD44780/tdisp_lld_board_example.h @@ -0,0 +1,63 @@ +/* + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file drivers/tdisp/HD44780/tdisp_lld_board_example.h + * @brief TDISP driver subsystem board interface for the HD44780 display + * + * @addtogroup TDISP + * @{ + */ + +#ifndef _TDISP_LLD_BOARD_H +#define _TDISP_LLD_BOARD_H + +void init_board(void) { + palSetGroupMode(GPIOE, PAL_WHOLE_PORT, 0, PAL_MODE_OUTPUT_PUSHPULL); + palSetGroupMode(GPIOD, PAL_WHOLE_PORT, 0, PAL_MODE_OUTPUT_PUSHPULL); +} + +void setpin_e(bool_t state) { + if(state) + palSetPad(GPIOE, 2); + else + palClearPad(GPIOE, 2); +} + +void setpin_rs(bool_t state) { + if(state) + palSetPad(GPIOE, 0); + else + palClearPad(GPIOE, 0); +} + +void setpin_rw(bool_t state) { + if(state) + palSetPad(GPIOE, 1); + else + palClearPad(GPIOE, 1); +} + +void write_bus(uint8_t data) { + palWritePort(GPIOD, data); +} + +#endif /* _TDISP_LLD_BOARD_H */ + diff --git a/drivers/tdisp/HD44780/tdisp_lld_config.h b/drivers/tdisp/HD44780/tdisp_lld_config.h new file mode 100644 index 00000000..7ea80ea2 --- /dev/null +++ b/drivers/tdisp/HD44780/tdisp_lld_config.h @@ -0,0 +1,44 @@ +/* + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file drivers/tdisp/HD44780/tdisp_lld_config.h + * @brief TDISP Driver subsystem low level driver header for the HD44780 display. + * + * @addtogroup TDISP + * @{ + */ + +#ifndef _TDISP_LLD_CONFIG_H +#define _TDISP_LLD_CONFIG_H + +#if GFX_USE_TDISP + +/*===========================================================================*/ +/* Driver hardware support. */ +/*===========================================================================*/ + +#define TDISP_DRIVER_NAME "HD44780" +#define TDISP_LLD(x) tdisp_lld_##x##_HD44780 + +#endif /* GFX_USE_TDISP */ + +#endif /* _TDISP_LLD_CONFIG_H */ +/** @} */ diff --git a/gfx.mk b/gfx.mk index 545e3157..c4bb23b2 100644 --- a/gfx.mk +++ b/gfx.mk @@ -7,6 +7,7 @@ GFXINC += $(GFXLIB)/include GFXSRC += include $(GFXLIB)/src/gdisp/gdisp.mk +include $(GFXLIB)/src/tdisp/tdisp.mk include $(GFXLIB)/src/gevent/gevent.mk include $(GFXLIB)/src/gtimer/gtimer.mk include $(GFXLIB)/src/gwin/gwin.mk diff --git a/include/gfx.h b/include/gfx.h index 9dfe681a..79c176f4 100644 --- a/include/gfx.h +++ b/include/gfx.h @@ -109,6 +109,7 @@ #include "gdisp/gdisp.h" #include "gwin/gwin.h" #include "ginput/ginput.h" +#include "tdisp/tdisp.h" #endif /* _GFX_H */ /** @} */ diff --git a/include/tdisp/lld/tdisp_lld.h b/include/tdisp/lld/tdisp_lld.h new file mode 100644 index 00000000..d548f107 --- /dev/null +++ b/include/tdisp/lld/tdisp_lld.h @@ -0,0 +1,51 @@ +/* + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file include/tdisp/lld/tdisp_lld.h + * @brief TDISP driver subsystem low level driver header. + * + * @addtogroup TDISP + * @{ + */ + +#ifndef _TDISP_LLD_H +#define _TDISP_LLD_H + +#if GFX_USE_TDISP || defined(__DOXYGEN__) + +#include "tdisp_lld_config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern bool_t foo(void); +extern void write_cmd(uint8_t data); +extern void write_data(uint8_t data); + +#ifdef __cplusplus +} +#endif + +#endif /* GFX_USE_TDISP */ + +#endif /* _TDISP_LLD_H */ + diff --git a/include/tdisp/tdisp.h b/include/tdisp/tdisp.h new file mode 100644 index 00000000..9984ef62 --- /dev/null +++ b/include/tdisp/tdisp.h @@ -0,0 +1,56 @@ +/* + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file include/tdisp/tdisp.h + * @brief TDISP Graphic Driver subsystem header file. + * + * @addtogroup TDISP + * + * @details The TDISP module provides high level abstraction to interface pixel oriented graphic displays. + * + * @pre GFX_USE_TDISP must be set to TRUE in gfxconf.h + * + * @{ + */ + +#ifndef _TDISP_H +#define _TDISP_H + +#include "gfx.h" + +#if GFX_USE_TDISP || defined(__DOXYGEN__) + +/* Include the low level driver information */ +#include "tdisp/lld/tdisp_lld.h" + +bool_t tdispInit(void); +void tdispClear(void); +void tdispHome(void); +void tdispGotoXY(coord_t col, coord_t row); +void tdispDrawChar(char c); +void tdispDrawString(char *s); +void tdispDrawCharLocation(coord_t x, coord_t y, char c); +void tdispDrawStringLocation(coord_t x, coord_t y, char *s); + +#endif /* GFX_USE_TDISP */ + +#endif /* _TDISP_H */ + diff --git a/src/tdisp/tdisp.c b/src/tdisp/tdisp.c new file mode 100644 index 00000000..73db93a1 --- /dev/null +++ b/src/tdisp/tdisp.c @@ -0,0 +1,78 @@ +/* + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file src/tdisp/tdisp.c + * @brief TDISP Driver code. + * + * @addtogroup TDISP + * @{ + */ +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +#if GFX_USE_TDISP || defined(__DOXYGEN__) + +bool_t tdispInit(void) { + bool_t ret; + + ret = TDISP_LLD(init)(); + + return ret; +} + +void tdispClear(void) { + TDISP_LLD(write_cmd)(0x01); +} + +void tdispHome(void) { + TDISP_LLD(write_cmd)(0x02); +} + +void tdispGotoXY(coord_t col, coord_t row) { + uint8_t row_offsets[] = { 0x00, 0x40, 0x14, 0x54 }; + + TDISP_LLD(write_cmd)(0x80 | (col + row_offsets[row])); +} + +void tdispDrawChar(char c) { + TDISP_LLD(write_data)(c); +} + +void tdispDrawString(char *s) { + char c; + + while(c = s++) + tdispDrawChar(c); +} + +void tdispDrawCharLocation(coord_t x, coord_t y, char c) { + tdispGotoXY(x, y); + tdispDrawChar(c); +} + +void tdispDrawStringLocation(coord_t x, coord_t y, char *s) { + tdispGotoXY(x, y); + tdispDrawString(s); +} + +#endif /* GFX_USE_TDISP */ + diff --git a/src/tdisp/tdisp.mk b/src/tdisp/tdisp.mk new file mode 100644 index 00000000..a33fa34a --- /dev/null +++ b/src/tdisp/tdisp.mk @@ -0,0 +1,2 @@ +GFXSRC += $(GFXLIB)/src/tdisp/tdisp.c +