546 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			546 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/****************************************************************************
 | 
						|
 *
 | 
						|
 * Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | 
						|
 *
 | 
						|
 * This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics Ltd and MAY NOT
 | 
						|
 * be copied by any method or incorporated into another program without
 | 
						|
 * the express written consent of Aerospace C.Power. This Information or any portion
 | 
						|
 * thereof remains the property of Aerospace C.Power. The Information contained herein
 | 
						|
 * is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | 
						|
 * liability for its use in any way and conveys no license or title under
 | 
						|
 * any patent or copyright and makes no representation or warranty that this
 | 
						|
 * Information is free from patent or copyright infringement.
 | 
						|
 *
 | 
						|
 * ****************************************************************************/
 | 
						|
#include "os_utils.h"
 | 
						|
#include "os_types.h"
 | 
						|
#include "os_mem.h"
 | 
						|
 | 
						|
#include "iot_i2c_api.h"
 | 
						|
#include "iot_gpio_api.h"
 | 
						|
#include "iot_errno.h"
 | 
						|
#include "iot_lcd.h"
 | 
						|
#include "iot_io_api.h"
 | 
						|
 | 
						|
 | 
						|
/* Whether enable dump display data. */
 | 
						|
#define IOT_LCD_DUMP_DEBUG                 1
 | 
						|
 | 
						|
/* Whether key interruption is allowed. */
 | 
						|
#define HT16K23_KEY_INT_ENABLE             0
 | 
						|
 | 
						|
/* The iic config of ht16k23. */
 | 
						|
#define HT16K23_IIC_SLAVE_ADDR             0x73 /* I2C slave device addr. */
 | 
						|
 | 
						|
#define HT16K23_IIC_DISPLAY_RAM_START_ADDR 0  /* iot lcd display ram start addr. */
 | 
						|
#define HT16K23_IIC_KEY_ADDR               0x20 /* iot lcd key addr. */
 | 
						|
 | 
						|
#define HT16K23_IIC_INIT_COMPLETED         1
 | 
						|
#define HT16K23_IIC_INIT_UNCOMPLETED       0
 | 
						|
#define HT16K23_IIC_DEF_PORT               0    /* Port#0. */
 | 
						|
#define HT16K23_IIC_DEF_SPEED              50   /* 50K. */
 | 
						|
#define HT16K23_IIC_DEF_NACK_NUM           1    /* N-ACK number. */
 | 
						|
#define HT16K23_IIC_DEF_GPIO_SCL           28   /* GPIO28. */
 | 
						|
#define HT16K23_IIC_DEF_GPIO_SDA           36   /* GPIO36. */
 | 
						|
 | 
						|
#define HT16K23_IIC_DEF_GPIO_INT           22   /* GPIO22. */
 | 
						|
#define HT16K23_IIC_INT_ADDR               0x30 /* iot lcd int addr. */
 | 
						|
 | 
						|
#if HT16K23_KEY_INT_ENABLE
 | 
						|
/* set LCD to 16 * 8 display mode, int output, int pin level high is valied. */
 | 
						|
#define HT16K23_SET_MODE_CMD          0xA7
 | 
						|
#else
 | 
						|
/* set LCD to 16 * 8 display mode, no INT */
 | 
						|
#define HT16K23_SET_MODE_CMD          0xA1
 | 
						|
#endif
 | 
						|
 | 
						|
/* into normal mode and open the display. */
 | 
						|
#define HT16K23_SET_SYS_CMD_WORK      0x83
 | 
						|
 | 
						|
/* into standby mode. */
 | 
						|
#define HT16K23_SET_SYS_CMD_STANDBY   0x80
 | 
						|
 | 
						|
/* set key scan period to 3 clock period. */
 | 
						|
#define HT16K23_SET_CMD_KEY_SCAN      0xf9
 | 
						|
 | 
						|
/* seg reg operation. */
 | 
						|
typedef struct {
 | 
						|
    uint8_t seg_addr;             /* start addr of the display ram. */
 | 
						|
    display_bitmap seg_data;   /* the data that need to display. */
 | 
						|
}lcd_seg_item;
 | 
						|
 | 
						|
typedef struct _iot_lcd_iic_cfg_t
 | 
						|
{
 | 
						|
    uint32_t inited;            /* IIC initialization completed? 0, not yet
 | 
						|
                                 *                               1, done. */
 | 
						|
    uint32_t port;              /* IIC port number. */
 | 
						|
    uint32_t baud;              /* IIC baudrate, unit is Kb. */
 | 
						|
    uint32_t nack_wait_num;     /* wait nack number. */
 | 
						|
    uint16_t gpio_scl;          /* SCL gpio pin. */
 | 
						|
    uint16_t gpio_sda;          /* SDA gpio pin. */
 | 
						|
} iot_lcd_iic_cfg_t;
 | 
						|
 | 
						|
static iot_lcd_iic_cfg_t ht16k23_iic_cfg =
 | 
						|
{
 | 
						|
    HT16K23_IIC_INIT_UNCOMPLETED,       /* IIC initialization uncompleted. */
 | 
						|
    HT16K23_IIC_DEF_PORT,               /* IIC device port number. */
 | 
						|
    HT16K23_IIC_DEF_SPEED,              /* Baudrate, unit is Kb. */
 | 
						|
    HT16K23_IIC_DEF_NACK_NUM,           /* Wait nack number. */
 | 
						|
    HT16K23_IIC_DEF_GPIO_SCL,           /* SCL gpio pin. */
 | 
						|
    HT16K23_IIC_DEF_GPIO_SDA            /* SDA gpio pin. */
 | 
						|
};
 | 
						|
 | 
						|
iot_lcd_key_handle_cb key_handle_cb;
 | 
						|
 | 
						|
uint8_t iot_lcd_status = HT16K23_STAT_STANDBY;
 | 
						|
 | 
						|
/* display ram. */
 | 
						|
lcd_seg_item iot_lcd_seg_item_g;
 | 
						|
 | 
						|
#ifdef IOT_LCD_DUMP_DEBUG
 | 
						|
/*
 | 
						|
@brief iot_lcd_dump_display_data() - dump the display data.
 | 
						|
*/
 | 
						|
static void iot_lcd_dump_display_data_inner(uint8_t *display_buf,
 | 
						|
    uint32_t line)
 | 
						|
{
 | 
						|
    uint8_t *p = display_buf;
 | 
						|
    uint32_t i = 0, len = HT16K23_MAX_DISPLAY_RAM_LEN;
 | 
						|
 | 
						|
    iot_printf("lcd display data DUMP(%03d):", len);
 | 
						|
 | 
						|
    for(; i < len; i++) {
 | 
						|
        iot_printf("%02X ", p[i]);
 | 
						|
    }
 | 
						|
 | 
						|
    iot_printf("\n[dump end.@%04d]\n", line);
 | 
						|
 | 
						|
    return;
 | 
						|
}
 | 
						|
#else
 | 
						|
static void iot_lcd_dump_display_data_inner(uint8_t *display_buf,
 | 
						|
    uint32_t line)
 | 
						|
{
 | 
						|
    (void)display_buf;
 | 
						|
    (void)line;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#define iot_lcd_dump_display_data(buf) \
 | 
						|
        iot_lcd_dump_display_data_inner(buf, __LINE__)
 | 
						|
 | 
						|
/*
 | 
						|
@brief iot_lcd_iic_init() - init iic
 | 
						|
return:         ERR_OK:success.
 | 
						|
*               ERR_FAIL:failed.
 | 
						|
*/
 | 
						|
static uint8_t iot_lcd_iic_init()
 | 
						|
{
 | 
						|
    iot_i2c_module_cfg_t iic_cfg;
 | 
						|
 | 
						|
    iic_cfg.port = ht16k23_iic_cfg.port;
 | 
						|
    iic_cfg.baud = ht16k23_iic_cfg.baud;
 | 
						|
    iic_cfg.nack_wait_num = ht16k23_iic_cfg.nack_wait_num;
 | 
						|
    iic_cfg.gpio.scl = ht16k23_iic_cfg.gpio_scl;
 | 
						|
    iic_cfg.gpio.sda = ht16k23_iic_cfg.gpio_sda;
 | 
						|
 | 
						|
    /* iot_gpio_open_as_output can cancel the function bound on the GPIO.
 | 
						|
     * This is not necessary if those GPIOs are not multiplex.
 | 
						|
     */
 | 
						|
    if ((ERR_OK != iot_gpio_open_as_output(iic_cfg.gpio.scl))
 | 
						|
            || (ERR_OK != iot_gpio_open_as_output(iic_cfg.gpio.sda))) {
 | 
						|
        iot_printf("[%s][err] open gpio failed.\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    if (ERR_OK != iot_i2c_module_init(&iic_cfg)) {
 | 
						|
        iot_printf("[%s][err] init i2c failed.\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_printf("[%s] init i2c of the LCD ht16k23 successfully!\n", __FUNCTION__);
 | 
						|
    ht16k23_iic_cfg.inited = HT16K23_IIC_INIT_COMPLETED;
 | 
						|
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
@brief lcd_open() - open lcd, init into normal mode, LCD is 16*8
 | 
						|
return:         ERR_OK:success.
 | 
						|
*               ERR_FAIL:failed.
 | 
						|
*/
 | 
						|
static uint8_t iot_lcd_open(void)
 | 
						|
{
 | 
						|
    uint8_t ret = 0;
 | 
						|
    /* set LCD to 16 * 8 display mode, no INT. */
 | 
						|
    uint8_t mode_cmd = HT16K23_SET_MODE_CMD;
 | 
						|
 | 
						|
    /* into work mode and open the display. */
 | 
						|
    uint8_t sys_cmd = HT16K23_SET_SYS_CMD_WORK;
 | 
						|
 | 
						|
    /* set key scan period to 3 clock period. */
 | 
						|
    uint8_t key_scan_mode = HT16K23_SET_CMD_KEY_SCAN;
 | 
						|
 | 
						|
    if(HT16K23_IIC_INIT_COMPLETED != ht16k23_iic_cfg.inited) {
 | 
						|
        iot_printf("[%s][err] iot lcd iic not init!\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    ret |= iot_i2c_write(IOT_I2C_PORT_0, HT16K23_IIC_SLAVE_ADDR,
 | 
						|
        (char*)&mode_cmd, sizeof(mode_cmd));
 | 
						|
 | 
						|
    ret |= iot_i2c_write(IOT_I2C_PORT_0, HT16K23_IIC_SLAVE_ADDR,
 | 
						|
        (char*)&key_scan_mode, sizeof(key_scan_mode));
 | 
						|
 | 
						|
    ret |= iot_i2c_write(IOT_I2C_PORT_0, HT16K23_IIC_SLAVE_ADDR,
 | 
						|
        (char*)&sys_cmd, sizeof(sys_cmd));
 | 
						|
 | 
						|
    if(ret != ERR_OK) {
 | 
						|
        iot_printf("[%s][err] open lcd failed.\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_printf("[%s] open the LCD ht16k23 successfully!\n", __FUNCTION__);
 | 
						|
    iot_lcd_status = HT16K23_STAT_NORMAL;
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
@brief lcd_stand_by_set() - set system mode to stand by
 | 
						|
return:         ERR_OK:success.
 | 
						|
*               ERR_FAIL:failed.
 | 
						|
*/
 | 
						|
uint8_t iot_lcd_set_standby()
 | 
						|
{
 | 
						|
    uint8_t sys_cmd = HT16K23_SET_SYS_CMD_STANDBY;
 | 
						|
    uint8_t ret = 0;
 | 
						|
 | 
						|
    /* read key data before set mode standby. */
 | 
						|
    iot_poll_read_key_data();
 | 
						|
    /* will set standby fail, so delay 50ms.*/
 | 
						|
    os_delay(50);
 | 
						|
    ret = iot_i2c_write(IOT_I2C_PORT_0, HT16K23_IIC_SLAVE_ADDR, (char*)&sys_cmd,
 | 
						|
      sizeof(sys_cmd));
 | 
						|
    if(ret != ERR_OK) {
 | 
						|
        iot_printf("[%s][err] set standby failed.\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_printf("[%s] set the LCD ht16k23 into standby mode successfully!\n",
 | 
						|
        __FUNCTION__);
 | 
						|
    iot_lcd_status = HT16K23_STAT_STANDBY;
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
@brief iot_lcd_set_weakup() - set system mode to wakeup
 | 
						|
return:         ERR_OK:success.
 | 
						|
*               ERR_FAIL:failed.
 | 
						|
*/
 | 
						|
uint8_t iot_lcd_set_weakup()
 | 
						|
{
 | 
						|
    uint8_t sys_cmd = HT16K23_SET_SYS_CMD_WORK;
 | 
						|
    uint8_t ret = 0;
 | 
						|
 | 
						|
    ret = iot_i2c_write(IOT_I2C_PORT_0, HT16K23_IIC_SLAVE_ADDR, (char*)&sys_cmd,
 | 
						|
      sizeof(sys_cmd));
 | 
						|
    if(ret != ERR_OK) {
 | 
						|
        iot_printf("[%s][err] set wakeup failed.\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_printf("[%s] set the LCD ht16k23 into weakup mode successfully!\n",
 | 
						|
        __FUNCTION__);
 | 
						|
    iot_lcd_status = HT16K23_STAT_NORMAL;
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
@brief iot_lcd_get_status() - get lcd work status, normal or standby.
 | 
						|
return:            reference HT16K23_STAT_XXX.
 | 
						|
*/
 | 
						|
uint8_t iot_lcd_get_status()
 | 
						|
{
 | 
						|
    return iot_lcd_status;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
@brief lcd_clear_screen() - clear lcd screen
 | 
						|
return:         ERR_OK:success.
 | 
						|
*               ERR_FAIL:failed.
 | 
						|
*/
 | 
						|
uint8_t iot_lcd_clear_screen()
 | 
						|
{
 | 
						|
    uint8_t ret = 0;
 | 
						|
 | 
						|
    iot_lcd_seg_item_g.seg_addr = HT16K23_IIC_DISPLAY_RAM_START_ADDR;
 | 
						|
    os_mem_set(iot_lcd_seg_item_g.seg_data.display_data, 0,
 | 
						|
        HT16K23_MAX_DISPLAY_RAM_LEN);
 | 
						|
 | 
						|
    ret = iot_i2c_write(IOT_I2C_PORT_0, HT16K23_IIC_SLAVE_ADDR,
 | 
						|
        (char*)&iot_lcd_seg_item_g, sizeof(iot_lcd_seg_item_g));
 | 
						|
    if(ret != ERR_OK) {
 | 
						|
        iot_printf("[%s][err] clear lcd failed.\n", __FUNCTION__);
 | 
						|
       return ERR_FAIL;
 | 
						|
     }
 | 
						|
 | 
						|
    iot_printf("[%s] clear screen of the LCD ht16k23 successfully!\n",
 | 
						|
        __FUNCTION__);
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief iic_read_bytes() - read datas from reg addr 30H, 20H, 21H, 22H
 | 
						|
 *
 | 
						|
 * @param addr          adress of slave address
 | 
						|
 * @param reg           addr of read
 | 
						|
 * @param data          the pointer to read data buffer
 | 
						|
 * @param len           the number of read data
 | 
						|
 *
 | 
						|
 * @return              0: read successful
 | 
						|
 * @return              other: read failed
 | 
						|
 *
 | 
						|
 */
 | 
						|
static uint8_t iot_lcd_iic_read_bytes(uint8_t reg_addr, uint8_t *data, uint8_t len)
 | 
						|
{
 | 
						|
    uint8_t ret = 0;
 | 
						|
    uint8_t addr = reg_addr;
 | 
						|
    if((NULL == data) || (len == 0)) {
 | 
						|
        iot_printf("[%s][err] invalid params func.\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    if(HT16K23_IIC_INIT_COMPLETED != ht16k23_iic_cfg.inited) {
 | 
						|
        iot_printf("[%s][err] not init the i2c\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    ret = iot_i2c_write(IOT_I2C_PORT_0, HT16K23_IIC_SLAVE_ADDR, (char*)&addr, 1);
 | 
						|
    ret |= iot_i2c_read(IOT_I2C_PORT_0, HT16K23_IIC_SLAVE_ADDR, (char*)data, len);
 | 
						|
    if(ret != ERR_OK) {
 | 
						|
        iot_printf("[%s][err] i2c wirte|read failed.\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
@brief iot_lcd_get_display_status() - query display status.
 | 
						|
@param: display_buf    the buffer that save display ram data.
 | 
						|
@param: buf_len        the length of buf.
 | 
						|
return:         ERR_OK:success.
 | 
						|
*               ERR_FAIL:failed.
 | 
						|
*/
 | 
						|
uint8_t iot_lcd_get_display_data(display_bitmap *display_buf)
 | 
						|
{
 | 
						|
    if(NULL == display_buf) {
 | 
						|
        iot_printf("[%s][err]invaled params!\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    if(HT16K23_STAT_STANDBY == iot_lcd_status) {
 | 
						|
        iot_printf("[%s][err] LCD standby, not support operate the lcd ram!\n",
 | 
						|
            __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_lcd_seg_item_g.seg_addr = HT16K23_IIC_DISPLAY_RAM_START_ADDR;
 | 
						|
    os_mem_set(iot_lcd_seg_item_g.seg_data.display_data, 0,
 | 
						|
        HT16K23_MAX_DISPLAY_RAM_LEN);
 | 
						|
    if(ERR_OK != iot_lcd_iic_read_bytes(iot_lcd_seg_item_g.seg_addr,
 | 
						|
        iot_lcd_seg_item_g.seg_data.display_data, HT16K23_MAX_DISPLAY_RAM_LEN))
 | 
						|
    {
 | 
						|
        iot_printf("[%s][err] read i2c failed.\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_lcd_dump_display_data(iot_lcd_seg_item_g.seg_data.display_data);
 | 
						|
 | 
						|
    os_mem_cpy(display_buf->display_data,
 | 
						|
        iot_lcd_seg_item_g.seg_data.display_data, HT16K23_MAX_DISPLAY_RAM_LEN);
 | 
						|
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
@brief iot_lcd_set_display_data() - set display data.
 | 
						|
@param: display_data    data that set to the display memory.
 | 
						|
@param: data_len        the length of the display data.
 | 
						|
return:         ERR_OK:success.
 | 
						|
*               ERR_FAIL:failed.
 | 
						|
*/
 | 
						|
uint8_t iot_lcd_set_display_data(display_bitmap *display_data)
 | 
						|
{
 | 
						|
    if(NULL == display_data) {
 | 
						|
        iot_printf("[%s][err] invaled params!\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    if(HT16K23_STAT_STANDBY == iot_lcd_status) {
 | 
						|
        iot_printf("[%s][err] LCD standby, not support operate the lcd ram!\n",
 | 
						|
            __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_lcd_seg_item_g.seg_addr = HT16K23_IIC_DISPLAY_RAM_START_ADDR;
 | 
						|
    os_mem_set(iot_lcd_seg_item_g.seg_data.display_data,
 | 
						|
        0, HT16K23_MAX_DISPLAY_RAM_LEN);
 | 
						|
    os_mem_cpy(iot_lcd_seg_item_g.seg_data.display_data,
 | 
						|
        display_data->display_data, HT16K23_MAX_DISPLAY_RAM_LEN);
 | 
						|
 | 
						|
    iot_lcd_dump_display_data(iot_lcd_seg_item_g.seg_data.display_data);
 | 
						|
 | 
						|
    if(ERR_OK !=iot_i2c_write(IOT_I2C_PORT_0, HT16K23_IIC_SLAVE_ADDR,
 | 
						|
        (char*)&iot_lcd_seg_item_g, HT16K23_MAX_DISPLAY_RAM_LEN + 1)) {
 | 
						|
        iot_printf("[%s][err] write i2c failed.\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    return ERR_OK;
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
#if HT16K23_KEY_INT_ENABLE
 | 
						|
 | 
						|
/*
 | 
						|
@brief iot_lcd_key_handle_register() - register lcd key handle callback func.
 | 
						|
@param: keycb      the lcd key handle callback func.
 | 
						|
return:            ERR_OK:success.
 | 
						|
*                  ERR_FAIL:failed.
 | 
						|
*/
 | 
						|
uint8_t iot_lcd_key_handle_register(iot_lcd_key_handle_cb keycb)
 | 
						|
{
 | 
						|
    if(NULL != keycb) {
 | 
						|
        key_handle_cb = keycb;
 | 
						|
        return ERR_OK;
 | 
						|
    }
 | 
						|
 | 
						|
    return ERR_FAIL;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
@brief get_int_status() - get interrupt status
 | 
						|
return:         int_satus.
 | 
						|
*               ERR_FAIL:failed.
 | 
						|
*/
 | 
						|
static uint8_t iot_lcd_get_int_status()
 | 
						|
{
 | 
						|
    uint8_t int_reg_addr = HT16K23_IIC_INT_ADDR;
 | 
						|
    uint8_t int_satus = 0;
 | 
						|
 | 
						|
    if(ERR_OK != iot_lcd_iic_read_bytes(int_reg_addr, &int_satus, 1)) {
 | 
						|
        iot_printf("[%s][err] read i2c failed.\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    return int_satus;
 | 
						|
}
 | 
						|
 | 
						|
/* isr */
 | 
						|
static void key_handler_isr(int arg)
 | 
						|
{
 | 
						|
    uint8_t key_data = 0;
 | 
						|
    int int_status = 0;
 | 
						|
    (void)arg;
 | 
						|
 | 
						|
    int_status = iot_lcd_get_int_status();
 | 
						|
    key_data = iot_poll_read_key_data();
 | 
						|
    iot_printf("[%s] int_status:%d, key_data:%d\n", int_status, key_data);
 | 
						|
 | 
						|
    if(NULL != key_handle_cb) {
 | 
						|
        key_handle_cb(key_data);
 | 
						|
    }
 | 
						|
 | 
						|
    /* Prevent interrupted scanning too fast. */
 | 
						|
    os_delay(100);
 | 
						|
    iot_gpio_interrupt_enable(HT16K23_IIC_DEF_GPIO_INT, 1);
 | 
						|
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
@brief iot_lcd_int_init() - init interrupt
 | 
						|
return:         ERR_OK:success.
 | 
						|
*               ERR_FAIL:failed.
 | 
						|
*/
 | 
						|
uint8_t iot_lcd_int_init()
 | 
						|
{
 | 
						|
    uint8_t ret = 0;
 | 
						|
 | 
						|
    iot_gpio_set_pull_mode(HT16K23_IIC_DEF_GPIO_INT, GPIO_PULL_DOWN);
 | 
						|
    ret |= iot_gpio_open_as_interrupt(HT16K23_IIC_DEF_GPIO_INT);
 | 
						|
    ret |= iot_gpio_interrupt_config(HT16K23_IIC_DEF_GPIO_INT, GPIO_INT_LEVEL_HIGH,
 | 
						|
        (iot_gpio_isr_func)key_handler_isr, 0, GPIO_INT_FUNC_ENABLE_AUTOSTOP);
 | 
						|
    ret |= iot_gpio_interrupt_enable(HT16K23_IIC_DEF_GPIO_INT, 1);
 | 
						|
    if(ret != ERR_OK) {
 | 
						|
        iot_printf("[%s][err] int init failed!\n", __FUNCTION__);
 | 
						|
        iot_gpio_close(HT16K23_IIC_DEF_GPIO_INT);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    iot_printf("[%s] init the LCD ht16k23 successfully!\n", __FUNCTION__);
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
uint8_t iot_lcd_key_handle_register(iot_lcd_key_handle_cb keycb)
 | 
						|
{
 | 
						|
    (void)keycb;
 | 
						|
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
uint8_t iot_lcd_int_init()
 | 
						|
{
 | 
						|
    return ERR_OK;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
@brief iot_poll_read_key_data() - poll read ram key data
 | 
						|
                     If enable interrupt,when interrupt triggered will call it.
 | 
						|
                                  otherwise upper-app polling call is required
 | 
						|
* @return        which key was pressed.
 | 
						|
*                ERR_FAIL: something error.
 | 
						|
*/
 | 
						|
uint8_t iot_poll_read_key_data()
 | 
						|
{
 | 
						|
    /* key reg start addr. */
 | 
						|
    uint8_t addr = HT16K23_IIC_KEY_ADDR;
 | 
						|
    /* Three registers need to be read to empty them. */
 | 
						|
    uint8_t key_data[3];
 | 
						|
 | 
						|
    os_mem_set(key_data, 0, sizeof(key_data));
 | 
						|
    if(ERR_OK != iot_lcd_iic_read_bytes(addr, key_data, sizeof(key_data))) {
 | 
						|
        iot_printf("[%s][err] read i2c failed.\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    /* only data[0] is valied. */
 | 
						|
    return key_data[0];
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
@brief lcd_init() - lcd init, int init, open lcd, clear screen.
 | 
						|
@param: iot_lcd_type    lcd type..
 | 
						|
return:         ERR_OK:success.
 | 
						|
*               ERR_FAIL:failed.
 | 
						|
*/
 | 
						|
uint8_t iot_lcd_init()
 | 
						|
{
 | 
						|
    uint8_t ret = ERR_OK;
 | 
						|
 | 
						|
    ret |= iot_lcd_iic_init();
 | 
						|
    ret |= iot_lcd_open();
 | 
						|
    ret |= iot_lcd_clear_screen();
 | 
						|
    if(ret != ERR_OK) {
 | 
						|
        iot_printf("[%s][err] iot lcd init failed.\n", __FUNCTION__);
 | 
						|
        return ERR_FAIL;
 | 
						|
    }
 | 
						|
 | 
						|
    return ERR_OK;
 | 
						|
}
 |