From 08ed54a4f0066766cb0a3c3a2d5efafed120eb48 Mon Sep 17 00:00:00 2001 From: "jianzhen.guo" Date: Tue, 8 Nov 2022 20:05:16 +0800 Subject: [PATCH] [Modify] Modify lcd driver. --- drivers/drivers-x16xx/include/x16xx_hal_lcd.h | 83 +++---- drivers/drivers-x16xx/src/x16xx_hal_lcd.c | 213 ++++++++++++------ 2 files changed, 187 insertions(+), 109 deletions(-) diff --git a/drivers/drivers-x16xx/include/x16xx_hal_lcd.h b/drivers/drivers-x16xx/include/x16xx_hal_lcd.h index 8a11b64b..07856dd8 100644 --- a/drivers/drivers-x16xx/include/x16xx_hal_lcd.h +++ b/drivers/drivers-x16xx/include/x16xx_hal_lcd.h @@ -139,13 +139,6 @@ struct srdmadesc { unsigned long InterruptControl; }; -struct lcdc_srdma_cfg { - enum fb_fmt fb_fmt; - void *fb_mem; - int is_video; - int stride; -}; - #define EVEN_RGBTORGB 0x00000000U #define EVEN_RGBTORBG ((uint32_t)TFT_TRAN_CFG_COLOR_EVEN_0) #define EVEN_RGBTOBGR ((uint32_t)TFT_TRAN_CFG_COLOR_EVEN_1) @@ -160,6 +153,32 @@ struct lcdc_srdma_cfg { #define ODD_RGBTOGBR ((uint32_t)TFT_TRAN_CFG_COLOR_ODD_2) #define ODD_RGBTOGRB ((uint32_t)TFT_TRAN_CFG_COLOR_ODD_0 | TFT_TRAN_CFG_COLOR_ODD_2) +struct tft_config{ + int even_line_order; + int odd_line_order; + enum lcdc_signal_polarity pix_clk_polarity; + enum lcdc_signal_level de_active_level; + enum lcdc_signal_level hsync_active_level; + enum lcdc_signal_level vsync_active_level; +}; + +struct slcd_config{ + unsigned int pixclock_when_init; + //int te_gpio; + int cmd_of_start_frame; + int mcu_data_width; + int mcu_cmd_width; + enum lcdc_signal_polarity wr_data_sample_edge; + enum lcdc_dc_pin dc_pin; + enum lcdc_signal_polarity te_data_transfered_edge; + enum lcdc_te_type te_pin_mode; + enum lcdc_signal_level rdy_cmd_send_level; + int enable_rdy_pin:1; + + struct smart_lcd_data_table *slcd_data_table; + unsigned int slcd_data_table_length; +}; + struct lcd_data{ const char *name; unsigned int refresh; @@ -176,32 +195,15 @@ struct lcd_data{ enum fb_fmt fb_fmt; enum lcdc_lcd_mode lcd_mode; enum lcdc_out_format out_format; - struct { - int even_line_order; - int odd_line_order; - enum lcdc_signal_polarity pix_clk_polarity; - enum lcdc_signal_level de_active_level; - enum lcdc_signal_level hsync_active_level; - enum lcdc_signal_level vsync_active_level; - } tft; - struct { - unsigned int pixclock_when_init; - int te_gpio; - int cmd_of_start_frame; - int mcu_data_width; - int mcu_cmd_width; - enum lcdc_signal_polarity wr_data_sample_edge; - enum lcdc_dc_pin dc_pin; - enum lcdc_signal_polarity te_data_transfered_edge; - enum lcdc_te_type te_pin_mode; - enum lcdc_signal_level rdy_cmd_send_level; - int enable_rdy_pin:1; - } slcd; - - int height; // 屏的物理高度,单位毫米 - int width; // 屏的物理宽度,单位毫米 - struct smart_lcd_data_table *slcd_data_table; - unsigned int slcd_data_table_length; + + struct tft_config *tft; + struct slcd_config *slcd; + + int frame_status; + int frame_index; + uint32_t frame_mem; + uint32_t frame_size; + int (*power_on)(void); int (*power_off)(void); }; @@ -209,7 +211,8 @@ struct lcd_data{ typedef struct __LCD_HandleTypeDef { DPU_TypeDef *Instance; struct lcd_data *pdata; - struct srdmadesc *desc; +#define MAX_SRDMA_DESC_NUM 3 + struct srdmadesc *desc[MAX_SRDMA_DESC_NUM]; HAL_LockTypeDef *lock; } LCD_HandleTypeDef; @@ -345,11 +348,11 @@ typedef struct __LCD_HandleTypeDef { * @defgroup LCD_exported_macros_group6 中断标志 * @{ */ -#define __HAL_INT_EOD(__HANDLE__) READ_BIT((__HANDLE__)->Instance->DC_ST, DC_INT_FLAG_INT_EOD_0) -#define __HAL_INT_UOT(__HANDLE__) READ_BIT((__HANDLE__)->Instance->DC_ST, DC_INT_FLAG_INT_UOT_0) -#define __HAL_INT_SSA(__HANDLE__) READ_BIT((__HANDLE__)->Instance->DC_ST, DC_INT_FLAG_INT_SSA_0) -#define __HAL_INT_SOS(__HANDLE__) READ_BIT((__HANDLE__)->Instance->DC_ST, DC_INT_FLAG_INT_SOS_0) -#define __HAL_INT_EOS(__HANDLE__) READ_BIT((__HANDLE__)->Instance->DC_ST, DC_INT_FLAG_INT_EOS_0) +#define __HAL_INT_EOD(__HANDLE__) READ_BIT((__HANDLE__)->Instance->DC_INT_FLAG, DC_INT_FLAG_INT_EOD_0) +#define __HAL_INT_UOT(__HANDLE__) READ_BIT((__HANDLE__)->Instance->DC_INT_FLAG, DC_INT_FLAG_INT_UOT_0) +#define __HAL_INT_SSA(__HANDLE__) READ_BIT((__HANDLE__)->Instance->DC_INT_FLAG, DC_INT_FLAG_INT_SSA_0) +#define __HAL_INT_SOS(__HANDLE__) READ_BIT((__HANDLE__)->Instance->DC_INT_FLAG, DC_INT_FLAG_INT_SOS_0) +#define __HAL_INT_EOS(__HANDLE__) READ_BIT((__HANDLE__)->Instance->DC_INT_FLAG, DC_INT_FLAG_INT_EOS_0) /** * @defgroup LCD_exported_macros_group7 读取DMA的最大长度 * @{ @@ -577,6 +580,8 @@ void HAL_SRDMA_INIT(LCD_HandleTypeDef *hlcd, uint32_t *buffer); void process_slcd_data_table(LCD_HandleTypeDef * hlcd, struct smart_lcd_data_table *table, unsigned int length); void lcdc_irq_handler(int irq, void *data); void HAL_SRDMA_START(LCD_HandleTypeDef *hlcd); +void HAL_PAN_DISPLAY(LCD_HandleTypeDef *hlcd, unsigned int frame_num); +void dump_rdma_desc_reg(LCD_HandleTypeDef *hlcd); // 删除此行, 添加内容 // 删除此行, 添加内容 diff --git a/drivers/drivers-x16xx/src/x16xx_hal_lcd.c b/drivers/drivers-x16xx/src/x16xx_hal_lcd.c index 97922bef..74c3c3d7 100644 --- a/drivers/drivers-x16xx/src/x16xx_hal_lcd.c +++ b/drivers/drivers-x16xx/src/x16xx_hal_lcd.c @@ -124,6 +124,22 @@ static void lcdc_dump_regs(LCD_HandleTypeDef *hlcd) prom_printk("==================================================================================\n"); } +void dump_rdma_desc_reg(LCD_HandleTypeDef *hlcd) +{ + unsigned int ctrl; + ctrl = READ_REG(hlcd->Instance->DC_CTRL); + ctrl |= (1 << 2); + WRITE_REG(hlcd->Instance->DC_CTRL, ctrl); + + prom_printk("====================rdma Descriptor register======================\n"); + prom_printk("RdmaNextCfgAddr: %lx\n",*(volatile unsigned int *)(0xb3050000 + 0x2114)); + prom_printk("FrameBufferAddr: %lx\n",*(volatile unsigned int *)(0xb3050000 + 0x2114)); + prom_printk("Stride: %lx\n",*(volatile unsigned int *)(0xb3050000 + 0x2114)); + prom_printk("ChainCfg: %lx\n",*(volatile unsigned int *)(0xb3050000 + 0x2114)); + prom_printk("InterruptControl: %lx\n",*(volatile unsigned int *)(0xb3050000 + 0x2114)); + prom_printk("==================rdma Descriptor register end======================\n"); +} + static void init_tft(LCD_HandleTypeDef *hlcd) { struct lcd_data *pdata = hlcd -> pdata; @@ -145,28 +161,28 @@ static void init_tft(LCD_HandleTypeDef *hlcd) __HAL_VDS(hlcd,vds); __HAL_VDE(hlcd,vde); - if(pdata->tft.pix_clk_polarity == AT_FALLING_EDGE){ + if(pdata->tft->pix_clk_polarity == AT_FALLING_EDGE){ __HAL_SET_CLK_INV(hlcd); }else{ __HAL_CLEAR_CLK_INV(hlcd); } - if(pdata->tft.de_active_level == AT_LOW_LEVEL){ + if(pdata->tft->de_active_level == AT_LOW_LEVEL){ __HAL_SET_DE_DL(hlcd); }else{ __HAL_CLEAR_DE_DL(hlcd); } - if(pdata->tft.hsync_active_level == AT_LOW_LEVEL){ + if(pdata->tft->hsync_active_level == AT_LOW_LEVEL){ __HAL_SET_HSYNC_DL(hlcd); }else{ __HAL_CLEAR_HSYNC_DL(hlcd); } - if(pdata->tft.vsync_active_level == AT_LOW_LEVEL){ + if(pdata->tft->vsync_active_level == AT_LOW_LEVEL){ __HAL_SET_VSYNC_DL(hlcd); }else{ __HAL_CLEAR_VSYNC_DL(hlcd); } - __HAL_COLOR_EVEN(hlcd,pdata->tft.even_line_order); - __HAL_COLOR_ODD(hlcd,pdata->tft.odd_line_order); + __HAL_COLOR_EVEN(hlcd,pdata->tft->even_line_order); + __HAL_COLOR_ODD(hlcd,pdata->tft->odd_line_order); __HAL_TFAN(hlcd,pdata->lcd_mode); } @@ -195,49 +211,49 @@ static void init_slcd(LCD_HandleTypeDef *hlcd) __HAL_DBI_TYPE(hlcd,dbi_type); /* 设置传输格式 */ __HAL_PIX_FMT(hlcd,pix_fmt); /* 设置颜色(RGB)格式 */ __HAL_TE_ANTI_JIT_3(hlcd); /* 使用3个pixclk周期对TE进行采样,以防抖动 */ - __HAL_TE_MD_FRONT(hlcd); /* 设置TE的活动边沿 */ + __HAL_TE_MD_BACK(hlcd); /* 设置TE的活动边沿 */ /* 选择是否等待TE,再发送数据 */ - if(pdata->slcd.te_pin_mode == TE_LCDC_TRIGGER){ + if(pdata->slcd->te_pin_mode == TE_LCDC_TRIGGER){ __HAL_TE_SWITCH_WAIT(hlcd); }else{ __HAL_TE_SWITCH_NOWAIT(hlcd); } /* 选择是否等待RDY,再发送命令或数据*/ - __HAL_RDY_SWITCH(hlcd,pdata->slcd.enable_rdy_pin); + __HAL_RDY_SWITCH(hlcd,pdata->slcd->enable_rdy_pin); __HAL_CS_EN_GPIO(hlcd); /* 设置CS引脚由GPIO控制还是SLCD控制 */ __HAL_CS_DP_HIGH(hlcd); /* 设置CS的默认极性 */ /* 设置RDY的默认极性*/ - if(pdata->slcd.rdy_cmd_send_level == AT_HIGH_LEVEL){ + if(pdata->slcd->rdy_cmd_send_level == AT_HIGH_LEVEL){ __HAL_RDY_DP_HIGH(hlcd); }else{ __HAL_RDY_DP_LOW(hlcd); } /* 设置命令和数据的默认电平值 */ - if(pdata->slcd.dc_pin == CMD_HIGH_DATA_LOW){ + if(pdata->slcd->dc_pin == CMD_HIGH_DATA_LOW){ __HAL_DC_MD_HIGH(hlcd); }else{ __HAL_DC_MD_LOW(hlcd); } /* */ - if(pdata->slcd.wr_data_sample_edge == AT_RISING_EDGE){ + if(pdata->slcd->wr_data_sample_edge == AT_RISING_EDGE){ __HAL_WR_MD_LOW(hlcd); }else{ __HAL_WR_MD_HIGH(hlcd); } /* 设置读写电平 */ - if(pdata->slcd.te_data_transfered_edge == AT_RISING_EDGE){ - __HAL_TE_DP_HIGH(hlcd); - }else{ + if(pdata->slcd->te_data_transfered_edge == AT_RISING_EDGE){ __HAL_TE_DP_LOW(hlcd); + }else{ + __HAL_TE_DP_HIGH(hlcd); } - __HAL_DWIDTH(hlcd,pdata->slcd.mcu_data_width); /* 设置屏幕数据总线宽度 */ - __HAL_CWIDTH(hlcd,pdata->slcd.mcu_cmd_width); /* 面板命令及其参数的宽度。单位bit */ + __HAL_DWIDTH(hlcd,pdata->slcd->mcu_data_width); /* 设置屏幕数据总线宽度 */ + __HAL_CWIDTH(hlcd,pdata->slcd->mcu_cmd_width); /* 面板命令及其参数的宽度。单位bit */ WRITE_REG(hlcd->Instance->SLCD_WR_DUTY, 0); /* */ WRITE_REG(hlcd->Instance->SLCD_TIMING, 0); __HAL_V_SIZE(hlcd,pdata->yres); /* 设置屏幕宽高 */ __HAL_H_SIZE(hlcd,pdata->xres); WRITE_REG(hlcd->Instance->SLCD_SLOW_TIME, 0); /* 设置延时 */ - //prom_printk("hlcd->Instance->SLCD_PANEL_CFG = %08x\n",hlcd->Instance->SLCD_PANEL_CFG); +// prom_printk("hlcd->Instance->SLCD_PANEL_CFG = %08x\n",hlcd->Instance->SLCD_PANEL_CFG); } static inline unsigned long bit_field_mask(int start, int end) @@ -331,10 +347,10 @@ static int init_lcd_gpio(struct lcd_data *pdata) case SLCD_6800: case SLCD_8080:{ int width; - if(pdata->slcd.mcu_cmd_width > pdata->slcd.mcu_data_width){ - width = pdata->slcd.mcu_cmd_width; + if(pdata->slcd->mcu_cmd_width > pdata->slcd->mcu_data_width){ + width = pdata->slcd->mcu_cmd_width; }else{ - width = pdata->slcd.mcu_data_width; + width = pdata->slcd->mcu_data_width; } if (width == MCU_WIDTH_8BITS) ret = slcd_init_gpio_data8(); @@ -420,7 +436,7 @@ static int check_scld_fmt(LCD_HandleTypeDef * hlcd) if (pdata->lcd_mode >= SLCD_SPI_3LINE) return -1; - int width = pdata->slcd.mcu_data_width; + int width = pdata->slcd->mcu_data_width; if (width == MCU_WIDTH_8BITS) { if (pix_fmt != OUT_FORMAT_RGB565 && pix_fmt != OUT_FORMAT_RGB888) return -1; @@ -447,6 +463,61 @@ static inline int is_slcd(struct lcd_data *pdata) return pdata->lcd_mode >= SLCD_6800; } +static int lcdc_tft_pan_display(LCD_HandleTypeDef *hlcd, struct srdmadesc *frame) +{ + WRITE_REG(hlcd->Instance->DC_SRD_CHAIN_ADDR, CPHYSADDR(frame)); + __HAL_SRD_CHAIN_START(hlcd); + + HAL_Delay(50); + return 0; +} + +static int lcdc_slcd_pan_display(LCD_HandleTypeDef *hlcd, struct srdmadesc *frame) +{ + int i = 10; + int ret = -1; + + while(i--){ + if(hlcd->pdata->frame_status != state_clear && + hlcd->pdata->frame_status != state_display_end){ + HAL_Delay(10); /* ms */ + } else if(hlcd->pdata->frame_status == state_display_end){ + ret = 0; + break; + } + } + + if(ret){ + prom_printk("lcd busy!\n"); + return ret; + } + hlcd->pdata->frame_status = state_display_start; + //HAL_Delay(50); + + WRITE_REG(hlcd->Instance->DC_SRD_CHAIN_ADDR, CPHYSADDR(frame)); + + if(hlcd->pdata->frame_status != state_display_start) { + __HAL_SRD_CHAIN_START(hlcd); + } + return 0; +} + +void HAL_PAN_DISPLAY(LCD_HandleTypeDef *hlcd, unsigned int frame_num) +{ + int ret; + int index; + struct srdmadesc *frame; + struct lcd_data *pdata = hlcd->pdata; + + frame = hlcd->desc[frame_num]; + + if (!is_tft(hlcd->pdata)) + ret = lcdc_slcd_pan_display(hlcd, frame); + else + ret = lcdc_tft_pan_display(hlcd, frame); + +} + static void init_lcdc(LCD_HandleTypeDef *hlcd) { struct lcd_data *pdata = hlcd -> pdata; @@ -455,7 +526,7 @@ static void init_lcdc(LCD_HandleTypeDef *hlcd) __HAL_UOT_MSK(hlcd); __HAL_SSA_MSK(hlcd); __HAL_SOS_MSK(hlcd); -// __HAL_EOS_MSK(hlcd); + __HAL_EOS_MSK(hlcd); WRITE_REG(hlcd->Instance->DC_CLR_ST, READ_REG(hlcd->Instance->DC_INT_FLAG)); __HAL_BURST_LEN_RDMA(hlcd, BURST_LEN_RDMA_32); @@ -505,7 +576,7 @@ static int slcd_pixclock_cycle(struct lcd_data *pdata) { int cycle = 0; - int width = pdata->slcd.mcu_data_width; + int width = pdata->slcd->mcu_data_width; int pix_fmt = pdata->out_format; if (width == MCU_WIDTH_8BITS) { if (pix_fmt == OUT_FORMAT_RGB565) @@ -522,7 +593,6 @@ static int slcd_pixclock_cycle(struct lcd_data *pdata) cycle = 1; } - return cycle * 2 + 1; } @@ -547,8 +617,8 @@ void auto_calculate_pixel_clock(struct lcd_data *pdata) pdata->pixclock *= slcd_pixclock_cycle(pdata); } - if (!pdata->slcd.pixclock_when_init) - pdata->slcd.pixclock_when_init = pdata->xres * pdata->yres * 3; + if (!pdata->slcd->pixclock_when_init) + pdata->slcd->pixclock_when_init = pdata->xres * pdata->yres * 3; } } @@ -583,65 +653,65 @@ void HAL_LCDC_ENABLE(LCD_HandleTypeDef *hlcd) pdata->power_on(); if (is_slcd(pdata)){ - process_slcd_data_table(hlcd, pdata->slcd_data_table, pdata->slcd_data_table_length); - __HAL_FMT_EN(hlcd); + process_slcd_data_table(hlcd, pdata->slcd->slcd_data_table, pdata->slcd->slcd_data_table_length); +// __HAL_FMT_EN(hlcd); } -// lcdc_dump_regs(hlcd); + + hlcd->pdata->frame_status = state_clear; } void HAL_SRDMA_INIT(LCD_HandleTypeDef *hlcd, uint32_t *buffer) { + struct lcd_data *lcd = hlcd->pdata; + int i; int format; - switch (hlcd->pdata->fb_fmt) { - case fb_fmt_RGB555: - format = 0; break; - case fb_fmt_RGB565: - format = 2; break; - case fb_fmt_ARGB8888: - case fb_fmt_RGB888: - format = 4; break; - default: - prom_printk("format err:%d\n", hlcd->pdata->fb_fmt); break; - } + for (i = 0; i < MAX_SRDMA_DESC_NUM; i++){ + switch (hlcd->pdata->fb_fmt) { + case fb_fmt_RGB555: + format = 0; break; + case fb_fmt_RGB565: + format = 2; break; + case fb_fmt_ARGB8888: + case fb_fmt_RGB888: + format = 4; break; + default: + prom_printk("format err:%d\n", hlcd->pdata->fb_fmt); break; + } - hlcd->desc->RdmaNextCfgAddr = CPHYSADDR(hlcd->desc); + hlcd->desc[i]->RdmaNextCfgAddr = CPHYSADDR(hlcd->desc[i]); - hlcd->desc->FrameCtrl = 0; - hlcd->desc->FrameCtrl |= (format << 19); - hlcd->desc->FrameCtrl |= (0 << 16); - hlcd->desc->FrameCtrl &= ~(1); + hlcd->desc[i]->FrameCtrl = 0; + hlcd->desc[i]->FrameCtrl |= (format << 19); + hlcd->desc[i]->FrameCtrl |= (0 << 16); + hlcd->desc[i]->FrameCtrl &= ~(1); - hlcd->desc->InterruptControl = 0; + hlcd->desc[i]->InterruptControl = 0; + hlcd->desc[i]->InterruptControl |= 1 << 1; + hlcd->desc[i]->InterruptControl |= 1 << 2; + hlcd->desc[i]->InterruptControl |= 1 << 17; - hlcd->desc->stride = hlcd->pdata->xres; - hlcd->desc->FrameBufferAddr = CPHYSADDR(buffer); + hlcd->desc[i]->stride = hlcd->pdata->xres; - CleanDCache_by_Addr((unsigned long*)hlcd->desc, sizeof(struct srdmadesc)); + hlcd->desc[i]->FrameBufferAddr = CPHYSADDR(((unsigned long)buffer) + format * i * hlcd->pdata->frame_mem);//??? - WRITE_REG(hlcd->Instance->DC_SRD_CHAIN_ADDR, CPHYSADDR(hlcd->desc)); + CleanDCache_by_Addr((unsigned long*)hlcd->desc[i], sizeof(struct srdmadesc)); + //prom_printk("==================== rdma desc =====================\n"); + //prom_printk("hlcd->desc[%d]->RdmaNextCfgAddr = %x\n",i, hlcd->desc[i]->RdmaNextCfgAddr); + //prom_printk("hlcd->desc[%d]->FrameCtrl = %x\n",i, hlcd->desc[i]->FrameCtrl); + //prom_printk("hlcd->desc[%d]->InterruptControl= %x\n",i, hlcd->desc[i]->InterruptControl); + //prom_printk("hlcd->desc[%d]->stride = %x\n",i, hlcd->desc[i]->stride); + //prom_printk("hlcd->desc[%d]->FrameBufferAddr = %x\n",i, hlcd->desc[i]->FrameBufferAddr); + //prom_printk("==================== rdma desc =====================\n"); + } } void HAL_SRDMA_START(LCD_HandleTypeDef *hlcd) { + WRITE_REG(hlcd->Instance->DC_SRD_CHAIN_ADDR, CPHYSADDR(hlcd->desc[0])); __HAL_SRD_CHAIN_START(hlcd); -// lcdc_dump_regs(hlcd); + lcdc_dump_regs(hlcd); } -/** - * @} - */ -/* 8.导出函数实现 (Exported Funcs)-------------------------------------- */ -/** - * @defgroup TEMPLATE_exported_funcs_impl TEMPLATE 导出函数实现 (Exported Funcs) - * @{ - */ - -// 删除此行, 添加内容 -// 删除此行, 添加内容 - -/** - * @} - */ void lcdc_irq_handler(int irq, void *data) { LCD_HandleTypeDef *hlcd = (LCD_HandleTypeDef*)data; @@ -649,7 +719,8 @@ void lcdc_irq_handler(int irq, void *data) __HAL_Lock(hlcd->lock); if (__HAL_INT_EOD(hlcd)) { - prom_printk("__HAL_INT_EOD\n"); + //prom_printk("__HAL_INT_EOD\n"); + hlcd->pdata->frame_status = state_display_end; __GEN_CLR_DISP_END(hlcd); __HAL_UnLock(hlcd->lock); return; @@ -657,6 +728,7 @@ void lcdc_irq_handler(int irq, void *data) if (__HAL_INT_SSA(hlcd)) { prom_printk("__HAL_INT_SSA\n"); __GEN_CLR_STOP_SRD_ACK(hlcd); + hlcd->pdata->frame_status = state_stop; __HAL_UnLock(hlcd->lock); return; } @@ -668,14 +740,15 @@ void lcdc_irq_handler(int irq, void *data) return; } if (__HAL_INT_EOS(hlcd)) { - prom_printk("RDMA END\n"); + //prom_printk("RDMA END\n"); __GEN_CLR_SRD_END(hlcd); __HAL_UnLock(hlcd->lock); return; } if (__HAL_INT_SOS(hlcd)) { __GEN_CLR_SRD_START(hlcd); - prom_printk("RDAM START\n"); + hlcd->pdata->frame_status = state_display_start; + //prom_printk("RDAM START\n"); __HAL_UnLock(hlcd->lock); return; } -- Gitee