JDI屏幕参数配置

JDI屏幕有2种接口:并口(JDI_PARALLEL)和串口(JDI_SERIAL)。

并口(JDI_PARALLEL)

目前并口的比较常见,他一般需要LCDC和一个LP-PWM配合:

  1. LP-PWM (Low power PWM 低功耗PWM, 支持系统睡眠时输出PWM波形)用于输出刷新时钟 XFRP/FRP/VCOM, 在58x之后一个LP-PWM可以控制2个pin脚输出相反的波形

  2. LCDC(LCD Controller)则用于输出像素数据和其他控制信号

参数配置讲解

以下图这个屏幕的时序图为例,这是一个240x240的屏幕, 这个时序图需要的参数配置如下: alt text

static LCDC_InitTypeDef lcdc_int_cfg =
{
    .lcd_itf = LCDC_INTF_JDI_PARALLEL,
    .freq = 746268, //HCK frequency

    /* 
        Useless parameter for JDI PARALLEL interface, 
        used to pass the format checking here. 
    */ 
    .color_mode = LCDC_PIXEL_FORMAT_RGB565, 

    .cfg = {
        .jdi = {
            .bank_col_head = 0, //Vertical Blanking pixles at the head
            .valid_columns = 240, //Vertical valid pixles
            .bank_col_tail = 4, //Vertical Blanking pixles at the tail

            .bank_row_head = 0, //Horizontal Blanking rows at the head
            .valid_rows = 240, //Horizontal valid rows
            .bank_row_tail = 4, //Horizontal Blanking rows at the tail

            /* 
                ENB will be active during column [64~190]
            */
            .enb_start_col = 32, 
            .enb_end_col = 95,
        },
    },

};
  • bank_col_head, valid_columns, bank_col_tail, bank_row_head, valid_rows, bank_row_tail, 这些参数都是以像素为单位,注意时序图上垂直方向每2个VCK沿为一个像素,水平方向每1个HCK沿为两个像素。

  • enb_start_col和enb_end_col是ENB信号的起始和结束列除以2,这个配置在大部分手册上要求不是很严格, 但是他们的范围是[0, (bank_col_head+valid_columns+bank_col_tail)/2]

刷新时钟

在LCD_DisplayOn和LCD_DisplayOff函数内部,通过一个外部定义的rt_device名称(JDI_FRP_LPPWM_INTERFACE_NAME)来启动和关闭PWM设备的输出,目的是开关FRP/XFRP/VCOM的输出。

PWM的时钟频率通过接口rt_pwm_set设置,如下代码中是60Hz,50%占空比的输出设置:


/**
  * @brief  Enables the Display.
  * @param  None
  * @retval None
  */
static void LCD_DisplayOn(LCDC_HandleTypeDef *hlcdc)
{
    /* Display On, enable the FRP&XFRP output */
#ifdef JDI_FRP_LPPWM_INTERFACE_NAME
    struct rt_device_pwm *device = (struct rt_device_pwm *)rt_device_find(JDI_FRP_LPPWM_INTERFACE_NAME);
    if (!device)
    {
        LOG_E("Can not find FRP LPPWM device:%s", JDI_FRP_LPPWM_INTERFACE_NAME);
    }
    else
    {
        if (0 == (device->parent.open_flag & RT_DEVICE_OFLAG_OPEN))
        {
            rt_device_open((struct rt_device *)device, RT_DEVICE_OFLAG_RDWR);
            rt_pwm_set(device, 1, 16 * 1000 * 1000, 8 * 1000 * 1000); // Set period to 16ms, pulse to 8ms
            rt_pwm_enable(device, 1); //Enable PWM output
        }
    }
#endif
}

/**
  * @brief  Disables the Display.
  * @param  None
  * @retval None
  */
static void LCD_DisplayOff(LCDC_HandleTypeDef *hlcdc)
{
    /* Display Off, disable the FRP&XFRP output */
#ifdef JDI_FRP_LPPWM_INTERFACE_NAME
    struct rt_device_pwm *device = (struct rt_device_pwm *)rt_device_find(JDI_FRP_LPPWM_INTERFACE_NAME);
    if (!device)
    {
        LOG_E("Can not find FRP LPPWM device:%s", JDI_FRP_LPPWM_INTERFACE_NAME);
    }
    else
    {
        if (device->parent.open_flag & RT_DEVICE_OFLAG_OPEN)
        {
            rt_pwm_disable(device, 1); //Disable PWM output
            rt_device_close((struct rt_device *)device);
        }
    }
#endif
}

串口(JDI_SERIAL)

串口的JDI目前我们没有测试过,虽然硬件上是支持的。