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;
 | |
| }
 |