Files
arcs/arcs-sdk/drivers/lisa_display/lisa_display.h
2026-08-13 16:50:52 +08:00

480 lines
15 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Copyright (c) 2025, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file lisa_display.h
* @brief LISA Display 设备驱动接口
*/
#pragma once
#include "lisa_device.h"
#include <stdint.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
/* ========================================================================
* Display 类型定义
* ======================================================================== */
/**
* @brief Display 总线接口类型
*/
typedef enum {
LISA_DISPLAY_BUS_SPI_3WIRE = 0, /* 3线SPI接口SCLK, MOSI, CS*/
LISA_DISPLAY_BUS_SPI_4WIRE = 1, /* 4线SPI接口SCLK, MOSI, CS, D/C*/
LISA_DISPLAY_BUS_I8080 = 2, /* Intel 8080 并行接口 */
LISA_DISPLAY_BUS_QSPI = 3, /* QSPI 接口 */
LISA_DISPLAY_BUS_RGB = 4, /* RGB并行接口 */
} lisa_display_bus_type_t;
/**
* @brief Display 命令总线类型(用于 RGB 等需要独立配置通道的场景)
*/
typedef enum {
LISA_DISPLAY_CMD_BUS_NONE = 0, /* 命令和数据共用总线 */
LISA_DISPLAY_CMD_BUS_SW_SPI = 1, /* 软件 SPI 命令总线 */
} lisa_display_cmd_bus_type_t;
/* ========================================================================
* RGB LCD 配置数据结构
* ======================================================================== */
/**
* @brief RGB 输入格式
*/
typedef enum {
LISA_RGB_INPUT_FORMAT_RGB888 = 0,
LISA_RGB_INPUT_FORMAT_XRGB8888 = 1,
LISA_RGB_INPUT_FORMAT_RGB565 = 2,
} lisa_rgb_input_format_t;
/**
* @brief RGB 信号极性
*/
typedef enum {
LISA_RGB_POLARITY_POSITIVE = 0, /**< 正极性(上升沿有效) */
LISA_RGB_POLARITY_NEGATIVE = 1, /**< 负极性(下降沿有效) */
} lisa_rgb_polarity_t;
/**
* @brief RGB 输出格式
*/
typedef enum {
LISA_RGB_OUTPUT_FORMAT_RGB888 = 0,
LISA_RGB_OUTPUT_FORMAT_RGB666 = 1,
LISA_RGB_OUTPUT_FORMAT_RGB565 = 2,
LISA_RGB_OUTPUT_FORMAT_BGR888 = 3,
LISA_RGB_OUTPUT_FORMAT_BGR666 = 4,
LISA_RGB_OUTPUT_FORMAT_BGR565 = 5,
} lisa_rgb_output_format_t;
/**
* @brief Display 总线配置4线SPI
*/
typedef struct {
lisa_device_t *spi_dev; /* SPI设备指针 */
lisa_device_t *dc_gpio; /* D/C信号的GPIO设备 */
lisa_device_t *cs_gpio; /* CS信号的GPIO设备 */
uint32_t cs_pin; /* CS引脚号 */
uint32_t dc_pin; /* D/C引脚号 */
uint32_t spi_freq; /* SPI频率 */
} lisa_display_bus_spi_4wire_config_t;
/**
* @brief Display 总线配置3线SPI
*/
typedef struct {
lisa_device_t *spi_dev; /* SPI设备指针 */
uint32_t spi_freq; /* SPI频率 */
} lisa_display_bus_spi_3wire_config_t;
/**
* @brief Display 总线配置QSPI
*/
typedef struct {
lisa_device_t *qspi_dev; /* QSPI LCD 设备指针 */
uint32_t qspi_freq; /* QSPI LCD 时钟频率 */
lisa_device_t *cs_gpio; /* QSPI LCD CS GPIO 设备 */
uint32_t cs_pin; /* QSPI LCD CS 引脚 */
} lisa_display_bus_qspi_config_t;
/**
* @brief Display 总线配置RGB并行
*/
typedef struct {
lisa_device_t *rgb_dev; /* RGB控制器句柄 */
uint32_t pclk_hz; /* PCLK时钟频率 */
lisa_rgb_input_format_t input_format;
lisa_rgb_output_format_t output_format;
bool output_lsb_first;
lisa_rgb_polarity_t vsync_polarity;
lisa_rgb_polarity_t hsync_polarity;
lisa_rgb_polarity_t de_polarity;
lisa_rgb_polarity_t pclk_polarity;
uint32_t bounce_buffer_size;
struct {
uint16_t h_res;
uint16_t v_res;
uint8_t h_pulse_width;
uint8_t v_pulse_width;
uint8_t h_front_blanking;
uint8_t h_back_blanking;
uint8_t v_front_blanking;
uint8_t v_back_blanking;
} timings;
} lisa_display_bus_rgb_config_t;
/**
* @brief Display 命令通道配置(软件模拟 3 线 SPI
*/
typedef struct {
lisa_device_t *cs_gpio; /* CS 信号的 GPIO 设备 */
uint32_t cs_pin; /* CS 引脚号 */
lisa_device_t *scl_gpio; /* SCL 信号的 GPIO 设备 */
uint32_t scl_pin; /* SCL 引脚号 */
lisa_device_t *sda_gpio; /* SDA 信号的 GPIO 设备 */
uint32_t sda_pin; /* SDA 引脚号 */
uint32_t spi_freq; /* SPI 频率Hz*/
/* 时序和选项配置 */
uint8_t lsb_first; /* 1=LSB先传输, 0=MSB先传输 */
uint8_t cs_high_active; /* 1=CS高电平有效, 0=CS低电平有效 */
uint8_t spi_mode; /* SPI模式 0-3 (CPOL/CPHA) */
/* 3线DC位编码配置 */
uint8_t use_dc_bit; /* 1=使用DC位9位协议, 0=标准8位 */
uint8_t dc_zero_on_data; /* 1=数据时DC=0,命令时DC=1; 0=相反 */
} lisa_display_cmd_sw_spi_config_t;
/**
* @brief Display 命令通道配置联合体
*/
typedef union {
lisa_display_cmd_sw_spi_config_t sw_spi;
} lisa_display_cmd_bus_config_u;
/* --- 背光控制 --- */
/**
* @brief 背光控制类型
*/
typedef enum {
LISA_DISPLAY_BACKLIGHT_TYPE_PWM, /**< PWM 控制 */
LISA_DISPLAY_BACKLIGHT_TYPE_SINGLE_WIRE,/**< 单线控制 */
} lisa_display_backlight_type_t;
typedef enum {
LISA_DISPLAY_BLACKLIGHT_POLARITY_LOW, /* 低电平有效 */
LISA_DISPLAY_BLACKLIGHT_POLARITY_HIGH, /* 高电平有效 */
} lisa_display_backlight_polarity_t;
/**
* @brief PWM 背光配置
*/
typedef struct {
lisa_device_t *dev; /**< PWM 设备句柄 */
uint8_t channel; /**< PWM 通道 */
uint32_t freq; /**< PWM 频率 */
} lisa_display_backlight_pwm_config_t;
/**
* @brief 单线调光背光配置
*/
typedef struct {
lisa_device_t *dev; /**< 单线调光设备句柄 */
uint8_t pin; /**< 单线调光引脚 */
uint8_t steps; /**< 亮度步进数 */
uint8_t current_level; /**< 当前亮度级别 */
} lisa_display_backlight_single_wire_config_t;
/**
* @brief 背光控制句柄
*/
typedef struct {
lisa_display_backlight_type_t type; /**< 背光类型 */
union {
lisa_display_backlight_pwm_config_t pwm; /**< PWM 配置 */
lisa_display_backlight_single_wire_config_t sw; /**< 单线调光配置 */
} config;
lisa_display_backlight_polarity_t blacklight_polarity;
void *priv_data; /**< 背光驱动私有数据 */
} lisa_display_backlight_t;
/**
* @brief Display 总线配置联合体
*/
typedef union {
lisa_display_bus_spi_3wire_config_t spi_3wire;
lisa_display_bus_spi_4wire_config_t spi_4wire;
lisa_display_bus_qspi_config_t qspi;
lisa_display_bus_rgb_config_t rgb;
} lisa_display_bus_config_u;
/**
* @brief Display 总线配置结构体
*/
typedef struct {
lisa_display_bus_type_t bus_type; /* 总线类型 */
lisa_display_bus_config_u bus_config; /* 总线配置 */
/* 命令总线配置 */
lisa_display_cmd_bus_type_t cmd_bus_type; /* 命令总线类型 */
lisa_display_cmd_bus_config_u cmd_bus_config; /* 命令总线配置 */
#ifdef CONFIG_LISA_DISPLAY_COMPOSITE
void (*composite_activate)(int disp_idx); /* 复合显示激活回调 */
void (*composite_deactivate)(int disp_idx); /* 复合显示取消回调 */
#endif
lisa_device_t *rst_gpio; /* 复位信号的GPIO设备可选*/
uint32_t rst_pin; /* 复位引脚号 */
lisa_device_t *te_gpio; /* TE信号的GPIO设备可选*/
uint32_t te_pin; /* TE引脚号 */
lisa_display_backlight_t backlight; /* 背光控制配置type=NONE 表示无背光 */
} lisa_display_config_t;
/**
* @brief Display 像素格式
*/
typedef enum {
LISA_DISPLAY_PIXEL_FORMAT_RGB_888 = 0, /* RGB 888 格式 */
LISA_DISPLAY_PIXEL_FORMAT_RGB_565 = 1, /* RGB 565 格式 */
LISA_DISPLAY_PIXEL_FORMAT_BGR_565 = 2, /* BGR 565 格式 */
LISA_DISPLAY_PIXEL_FORMAT_ARGB_8888 = 3, /* ARGB 8888 格式 */
LISA_DISPLAY_PIXEL_FORMAT_MONO_1 = 4, /* 单色 1 位格式 */
} lisa_display_pixel_format_t;
/**
* @brief Display 方向
*/
typedef enum {
LISA_DISPLAY_ORIENTATION_0 = 0, /* 0 度 */
LISA_DISPLAY_ORIENTATION_90 = 1, /* 90 度 */
LISA_DISPLAY_ORIENTATION_180 = 2, /* 180 度 */
LISA_DISPLAY_ORIENTATION_270 = 3, /* 270 度 */
} lisa_display_orientation_t;
/**
* @brief Display 能力结构体
*/
typedef struct {
uint16_t width; /* 显示宽度(像素) */
uint16_t height; /* 显示高度(像素) */
lisa_display_pixel_format_t pixel_format; /* 当前像素格式 */
lisa_display_orientation_t orientation; /* 当前方向 */
uint32_t supported_pixel_formats; /* 支持的像素格式位掩码 */
} lisa_display_capabilities_t;
/**
* @brief Display 缓冲区描述符
*/
typedef struct {
uint16_t width; /* 缓冲区宽度(像素) */
uint16_t height; /* 缓冲区高度(像素) */
uint16_t pitch; /* 行间距(像素) */
uint32_t buf_size; /* 缓冲区大小(字节) */
} lisa_display_buffer_desc_t;
/**
* @brief Display 区域结构体
*/
typedef struct {
uint16_t x; /* 起始 X 坐标 */
uint16_t y; /* 起始 Y 坐标 */
uint16_t width; /* 区域宽度 */
uint16_t height; /* 区域高度 */
} lisa_display_rect_t;
/* ========================================================================
* Display 设备 API 结构体
* ======================================================================== */
typedef struct {
int (*get_capabilities)(lisa_device_t *dev, lisa_display_capabilities_t *caps);
int (*write)(lisa_device_t *dev, uint16_t x, uint16_t y, const lisa_display_buffer_desc_t *desc, const void *buf);
int (*blanking_on)(lisa_device_t *dev);
int (*blanking_off)(lisa_device_t *dev);
int (*set_brightness)(lisa_device_t *dev, uint8_t brightness);
int (*set_orientation)(lisa_device_t *dev, lisa_display_orientation_t orientation);
int (*attach_bus)(const lisa_device_t *dev, const lisa_display_config_t *config);
} lisa_display_api_t;
/* ========================================================================
* Display 对外接口函数
* ======================================================================== */
/**
* @brief 获取显示设备能力
*
* @param dev Display设备指针
* @param caps 输出参数,用于接收设备能力信息
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作
* @return <0 其他错误
*/
static inline int lisa_display_get_capabilities(lisa_device_t *dev, lisa_display_capabilities_t *caps)
{
if (!dev || !dev->api || !caps) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_display_api_t *api = (lisa_display_api_t *)dev->api;
return api->get_capabilities ? api->get_capabilities(dev, caps) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/**
* @brief 写入显示数据
*
* @param dev Display设备指针
* @param x 起始 X 坐标
* @param y 起始 Y 坐标
* @param desc 缓冲区描述符
* @param buf 数据缓冲区指针
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作
* @return <0 其他错误
*/
static inline int lisa_display_write(lisa_device_t *dev, uint16_t x, uint16_t y,
const lisa_display_buffer_desc_t *desc, const void *buf)
{
if (!dev || !dev->api || !desc || !buf) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_display_api_t *api = (lisa_display_api_t *)dev->api;
return api->write ? api->write(dev, x, y, desc, buf) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/**
* @brief 开启消隐(关闭显示)
*
* @param dev Display设备指针
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作
* @return <0 其他错误
*/
static inline int lisa_display_blanking_on(lisa_device_t *dev)
{
if (!dev || !dev->api) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_display_api_t *api = (lisa_display_api_t *)dev->api;
return api->blanking_on ? api->blanking_on(dev) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/**
* @brief 关闭消隐(开启显示)
*
* @param dev Display设备指针
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作
* @return <0 其他错误
*/
static inline int lisa_display_blanking_off(lisa_device_t *dev)
{
if (!dev || !dev->api) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_display_api_t *api = (lisa_display_api_t *)dev->api;
return api->blanking_off ? api->blanking_off(dev) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/**
* @brief 设置亮度
*
* @param dev Display设备指针
* @param brightness 亮度值 (0-100)
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作
* @return <0 其他错误
*/
static inline int lisa_display_set_brightness(lisa_device_t *dev, uint8_t brightness)
{
if (!dev || !dev->api || brightness > 100) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_display_api_t *api = (lisa_display_api_t *)dev->api;
return api->set_brightness ? api->set_brightness(dev, brightness) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/**
* @brief 设置显示方向
*
* @param dev Display设备指针
* @param orientation 显示方向
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作
* @return <0 其他错误
*/
static inline int lisa_display_set_orientation(lisa_device_t *dev, lisa_display_orientation_t orientation)
{
if (!dev || !dev->api) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_display_api_t *api = (lisa_display_api_t *)dev->api;
return api->set_orientation ? api->set_orientation(dev, orientation) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/**
* @brief 附加显示总线接口
*
* 用于配置显示总线接口SPI/RGB/MIPI DSI等及相关引脚。
*
* @param dev Display设备指针
* @param config 显示配置结构体
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作
* @return <0 其他错误
*/
static inline int lisa_display_attach_bus(lisa_device_t *dev, const lisa_display_config_t *config)
{
if (!dev || !dev->api || !config) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_display_api_t *api = (lisa_display_api_t *)dev->api;
return api->attach_bus ? api->attach_bus(dev, config) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/* ========================================================================
* 便捷宏定义
* ======================================================================== */
/**
* @brief RGB565 颜色宏
*/
#define LISA_DISPLAY_RGB565(r, g, b) ((((r) & 0xF8) << 8) | (((g) & 0xFC) << 3) | (((b) & 0xF8) >> 3))
/**
* @brief 常用颜色定义 (RGB565)
*/
#define LISA_DISPLAY_COLOR_BLACK 0x0000
#define LISA_DISPLAY_COLOR_WHITE 0xFFFF
#define LISA_DISPLAY_COLOR_RED 0xF800
#define LISA_DISPLAY_COLOR_GREEN 0x07E0
#define LISA_DISPLAY_COLOR_BLUE 0x001F
#define LISA_DISPLAY_COLOR_YELLOW 0xFFE0
#define LISA_DISPLAY_COLOR_CYAN 0x07FF
#define LISA_DISPLAY_COLOR_MAGENTA 0xF81F
#ifdef __cplusplus
}
#endif