170 lines
7.2 KiB
C
170 lines
7.2 KiB
C
/****************************************************************************
|
|
* include/nuttx/lcd/pcf8574_lcd_backpack.h
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the
|
|
* License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef __INCLUDE_NUTTX_LCD_PCF8574_LCD_BACKPACK_H
|
|
#define __INCLUDE_NUTTX_LCD_PCF8574_LCD_BACKPACK_H
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <nuttx/i2c/i2c_master.h>
|
|
#include <sys/ioctl.h>
|
|
#include <nuttx/lcd/slcd_ioctl.h>
|
|
#include <nuttx/lcd/slcd_codec.h>
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
/* Configurations of some well-known boards.
|
|
* You may still have to modify the address if was changed from the default.
|
|
* You will also need to specify the geometry of your attached LCD display.
|
|
* You can support:
|
|
* 1x8, 1x12, 1x16, 2x8, 2x12, 2x16, 2x20, 2x24, 2x40, 4x16, 4x20
|
|
* Pretty much anything on the market except 4x40, which really consists of
|
|
* two separate 2x40 controllers, and the I2C backpack doesn't support those
|
|
* due to the second 'E' line being needed.
|
|
* Additionally, you still need to set the (row,col) geometry explicitly,
|
|
* since there is not a means of determining this dynamically.
|
|
* Consider these 'informative'.
|
|
* XXX Note, actual testing has been done on LCD_I2C_BACKPACK_CFG_MJKDZ
|
|
* and LCD_I2C_BACKPACK_CFG_SAINSMART only, the others come from online
|
|
* research.
|
|
*/
|
|
|
|
/* board marked 'mjkdz' and Arduino-IIC-LCD GY-LCD-V1 */
|
|
|
|
#define LCD_I2C_BACKPACK_CFG_MJKDZ {0x20,4,5,6,0,1,2,3,7,false,0,0}
|
|
|
|
/* YwRobot/DFRobot/SainSmart */
|
|
|
|
#define LCD_I2C_BACKPACK_CFG_SAINSMART {0x27,2,1,0,4,5,6,7,3,true,0,0}
|
|
|
|
/* Robot Arduino LCM1602/2004 */
|
|
|
|
#define LCD_I2C_BACKPACK_CFG_ROBOT {0x27,2,1,0,4,5,6,7,3,false,0,0}
|
|
|
|
/* I2CLCDextraIO board modded for backlight (pnp transistor) */
|
|
|
|
#define LCD_I2C_BACKPACK_CFG_I2CIO_PNP {0x38,6,5,4,0,1,2,3,7,false,0,0}
|
|
|
|
/* I2CLCDextraIO board modded for backlight (npn transistor) */
|
|
|
|
#define LCD_I2C_BACKPACK_CFG_I2CIO_NPN {0x38,6,5,4,0,1,2,3,7,true,0,0}
|
|
|
|
/* SLCDIOC_CREATECHAR: Create a custom character pattern
|
|
*
|
|
* argument: pointer to slcd_createchar_s structure (defined below)
|
|
*/
|
|
|
|
#define SLCDIOC_CREATECHAR _SLCDIOC(0x80)
|
|
|
|
/****************************************************************************
|
|
* Public Types
|
|
****************************************************************************/
|
|
|
|
/* Used to specify the pin wiring for this particular module */
|
|
|
|
struct pcf8574_lcd_backpack_config_s
|
|
{
|
|
uint8_t addr; /* I2C address; 'unshifted' (i.e. disregarding the LSB R/W bit)
|
|
* these can vary widely depending on board pullups, whether it
|
|
* uses a PCF8574-T or -AT, etc. Many default to either 0x20
|
|
* or 0x27, and some default to 0x38 or 0x3f. Check with seller.
|
|
*/
|
|
uint8_t en; /* gpio bit for LCD EN */
|
|
uint8_t rw; /* gpio bit for LCD RW */
|
|
uint8_t rs; /* gpio bit for LCD RS */
|
|
uint8_t d4; /* gpio bit for LCD D4 */
|
|
uint8_t d5; /* gpio bit for LCD D5 */
|
|
uint8_t d6; /* gpio bit for LCD D6 */
|
|
uint8_t d7; /* gpio bit for LCD D7 */
|
|
uint8_t bl; /* gpio bit for backlight control */
|
|
|
|
bool bl_active_high; /* is the backlight control active high? */
|
|
|
|
uint8_t rows; /* screen geometry, rows, 1, 2 or 4 */
|
|
uint8_t cols; /* screen geometry, cols, 8, 12, 16, 20, 24, 40 */
|
|
};
|
|
|
|
/* Used with the SLCDIOC_CREATECHAR ioctl call */
|
|
|
|
struct slcd_createchar_s
|
|
{
|
|
uint8_t idx; /* Custom character index; 0-7. Note; you'll probably
|
|
* want to avoid code point 0 unless you really need it,
|
|
* because embedded nul in a C string can cause surprises.
|
|
*/
|
|
uint8_t bmp[8]; /* Custom character bitmap. The bitmap is structured as
|
|
* a 5x8 bitmap. '1' = pixel on, msb-lsb left-to-right,
|
|
* and right-justified (i.e. only bits 4-0 are used).
|
|
* Each byte represents 1 row. By convention, you are
|
|
* expected to leave the last row all 0's, because it is
|
|
* used by the cursor, but this is not strictly required.
|
|
*/
|
|
};
|
|
|
|
/****************************************************************************
|
|
* Public Functions Definitions
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: pcf8574_lcd_backpack_register
|
|
*
|
|
* Description:
|
|
* Register a character driver that is a I2C LCD 'backpack' based on the
|
|
* PCF8574 I2C IO expander. It allows operation of the ever-popular HD44780
|
|
* based LCDs via I2C instead of parallel (saving a bunch of gpio lines).
|
|
*
|
|
* There are a multitude of these available from various sources
|
|
* (e.g. ebay).
|
|
* They typically vary by gpio-to-lcd pin mapping, and I2C address, but
|
|
* otherwise are functionally identical.
|
|
*
|
|
* The characters presented for codes depend on the masked rom of the
|
|
* particular LCD device attached, but the most common are:
|
|
* 'A00', which present 0x20-0x7f, and 0xa0-0xff', similar to JIS X 0201
|
|
* 'A02', which present 0x10-0xff, and include various european symbols
|
|
* In both cases, codes 0x00-0x07 map to the CGRAM characters, which can be
|
|
* loaded via ioctl SLCDIOC_CREATECHAR (q.v.).
|
|
*
|
|
* This driver supports the SLCD codec for various escape sequences; q.v.
|
|
* nuttx/lcd/slcd_codec.h for details. This driver supports the SLCD ioctl
|
|
* interface for various extended commands; q.v. nuttx/lcd/slcd_ioctl.h for
|
|
* details. This driver supports an additional ioctl for defining custom
|
|
* characters; see above for details.
|
|
*
|
|
* Input Parameters:
|
|
* devpath - path to device node; arbitrary, but typically '/dev/lcd0' or
|
|
* such
|
|
* i2c - the low-level i2c bus onto which to bind
|
|
* cfg - the board-specific configuration
|
|
*
|
|
****************************************************************************/
|
|
|
|
int pcf8574_lcd_backpack_register(FAR const char *devpath,
|
|
FAR struct i2c_master_s *i2c,
|
|
FAR struct pcf8574_lcd_backpack_config_s *cfg);
|
|
|
|
#endif /* __INCLUDE_NUTTX_LCD_PCF8574_LCD_BACKPACK_H */
|