[En-Nut-Discussion] Platform independent HD44780 driver (remove old ones)
Thiago A. Corrêa
thiago.correa at gmail.com
Tue Sep 16 15:14:43 CEST 2014
I think it would be best to strip code that is not used instead of
trying make it build as an unusable module. Then client code at least
gets a build error instead of a runtime error if they forget to set
something in the configurator.
I will just add something like:
#if defined(NECESSARY_CONFIG1) && defined(NECESSARY_CONFIG1)
// all code
#endif
On Tue, Sep 16, 2014 at 10:06 AM, Uwe Bonnes
<bon at elektron.ikp.physik.tu-darmstadt.de> wrote:
>>>>>> "Thiago" == Thiago A Corrêa <thiago.correa at gmail.com> writes:
>
> Thiago> Ok, I've uploaded it. It isn't fancy at all, HD44780 is fairly
> Thiago> simple. It might need some tweaking. Let me know if anyone has
> Thiago> problems with it.
>
> Probably appended patch is better.
> --
> Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
>
> Institut fuer Kernphysik Schlossgartenstrasse 9 64289 Darmstadt
> --------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
> diff --git a/nut/dev/hd44780.c b/nut/dev/hd44780.c
> index 90f6a27..82b9e19 100644
> --- a/nut/dev/hd44780.c
> +++ b/nut/dev/hd44780.c
> @@ -80,26 +80,60 @@
> #define LCD_LONG_DELAY 400
> #endif
>
> +#if defined(LCD_EN_PIO_ID)
> +#undef GPIO_ID
> #define GPIO_ID LCD_EN_PIO_ID
> #include <cfg/arch/porttran.h>
> static INLINE void LCD_EN_SET(void) { GPIO_SET_HI(LCD_EN_BIT); }
> static INLINE void LCD_EN_CLR(void) { GPIO_SET_LO(LCD_EN_BIT); }
> static INLINE void LCD_EN_INIT(void) { GPIO_OUTPUT(LCD_EN_BIT); }
> -#undef GPIO_ID
> +#else
> +#define LCD_EN_SET()
> +#define LCD_EN_CLR()
> +#define LCD_EN_INIT()
> +#endif
>
> +#if defined(LCD_RS_PIO_ID)
> +#undef GPIO_ID
> #define GPIO_ID LCD_RS_PIO_ID
> #include <cfg/arch/porttran.h>
> static INLINE void LCD_RS_SET(void) { GPIO_SET_HI(LCD_RS_BIT); }
> static INLINE void LCD_RS_CLR(void) { GPIO_SET_LO(LCD_RS_BIT); }
> static INLINE void LCD_RS_INIT(void) { GPIO_OUTPUT(LCD_RS_BIT); }
> -#undef GPIO_ID
> +#else
> +#define LCD_RS_SET()
> +#define LCD_RS_CLR()
> +#define LCD_RS_INIT()
> +#endif
>
> +#if defined( LCD_RW_PIO_ID)
> +#undef GPIO_ID
> #define GPIO_ID LCD_RW_PIO_ID
> #include <cfg/arch/porttran.h>
> static INLINE void LCD_RW_SET(void) { GPIO_SET_HI(LCD_RW_BIT); }
> static INLINE void LCD_RW_CLR(void) { GPIO_SET_LO(LCD_RW_BIT); }
> static INLINE void LCD_RW_INIT(void) { GPIO_OUTPUT(LCD_RW_BIT); }
> -#undef GPIO_ID
> +#else
> +#define LCD_RW_SET()
> +#define LCD_RW_CLR()
> +#define LCD_RW_INIT()
> +#endif
> +
> +#if defined(LCD_DATA_PIO_ID)
> +#define PORT_SET_CONF() GpioPortConfigSet( LCD_DATA_PIO_ID, LCD_DATA_MASK, GPIO_CFG_INPUT | GPIO_CFG_PULLUP )
> +#define PORT_GET() GpioPortGet( LCD_DATA_PIO_ID & LCD_DATA_MASK)
> +#define PORT_SET_HIGH(x) GpioPortSetHigh( LCD_DATA_PIO_ID, x & LCD_DATA_MASK )
> +#define PORT_SET_Low(x) GpioPortSetLow ( LCD_DATA_PIO_ID, x & LCD_DATA_MASK )
> +#else
> +#define PORT_SET_CONF()
> +#define PORT_GET() 0
> +#define PORT_SET_HIGH(x)
> +#define PORT_SET_LOW(x)
> +#endif
> +
> +#if !defined(LCD_DATA_LSB)
> +#define LCD_DATA_LSB 0
> +#endif
>
> /*!
> * \addtogroup xgDisplay
> @@ -112,13 +146,13 @@ static INLINE uint8_t LcdReadNibble(void)
> {
> uint8_t ret;
> LCD_RW_SET();
> - GpioPortConfigSet( LCD_DATA_PIO_ID, LCD_DATA_MASK, GPIO_CFG_INPUT | GPIO_CFG_PULLUP );
> + PORT_SET_CONF();
> LCD_EN_SET();
> NutMicroDelay(LCD_SHORT_DELAY);
> - ret = GpioPortGet( LCD_DATA_PIO_ID ) & LCD_DATA_MASK;
> + ret = PORT_GET();
> ret >>= LCD_DATA_LSB;
> LCD_EN_CLR();
> - GpioPortConfigSet( LCD_DATA_PIO_ID, LCD_DATA_MASK, GPIO_CFG_OUTPUT );
> + PORT_SET_CONF();
> NutMicroDelay(LCD_SHORT_DELAY);
> return ret;
> }
> @@ -164,8 +198,8 @@ static void LcdDelay(int xt)
> static void LcdWriteNibble(unsigned int nib)
> {
> nib <<= LCD_DATA_LSB;
> - GpioPortSetHigh( LCD_DATA_PIO_ID, nib & LCD_DATA_MASK );
> - GpioPortSetLow( LCD_DATA_PIO_ID, ~nib & LCD_DATA_MASK );
> + PORT_SET_HIGH(nib);
> + PORT_SET_LOW(~nib);
>
> /* Create Enable Pulse:
> * For HD44780 Displays we need:
> @@ -277,11 +311,11 @@ static int LcdInit(NUTDEVICE * dev)
> {
> LCD_RS_INIT();
> LCD_RW_INIT();
> - GpioPortConfigSet( LCD_DATA_PIO_ID, LCD_DATA_MASK, GPIO_CFG_OUTPUT );
> + PORT_SET_CONF();
>
> LCD_RS_CLR();
> LCD_RW_CLR();
> - GpioPortSetLow( LCD_DATA_PIO_ID, LCD_DATA_MASK );
> + PORT_SET_LOW(0xff);
> NutMicroDelay(30);
>
> LCD_EN_INIT();
> _______________________________________________
> http://lists.egnite.de/mailman/listinfo/en-nut-discussion
More information about the En-Nut-Discussion
mailing list