| 
 | 
沙发
 
 
 楼主 |
发表于 2023-4-14 14:47:40
|
只看该作者
 
 
 
 本帖最后由 lushidegreen 于 2023-4-14 14:49 编辑  
 
LCD驱动文件如下:// lcd_drv.h 
#ifndef _LCD_DRV_H_ 
#define _LCD_DRV_H_ 
 
#include <xdc/std.h> 
#include <stdio.h> 
#include <stdarg.h> 
 
#include "lcd_drv.h" 
 
//================================宏定义========================================================= 
 
// LCD 分辨率 
#define LCD_WIDTH               (480) 
#define LCD_HEIGHT              (360) 
 
// 调试板的大小和偏移 
#define PALETTE_SIZE            32 
#define PALETTE_OFFSET          4 
 
// TFT LCD显存数据结构体 
typedef struct 
{ 
        uint8_t palette[PALETTE_OFFSET+PALETTE_SIZE]; 
        uint16_t dat[LCD_HEIGHT][LCD_WIDTH]; 
}fb_data_t; 
 
void tft_lcd_draw_pixel(uint16_t x, uint16_t y, uint16_t color); 
void tft_lcd_draw_xline(uint16_t x, uint16_t y, uint16_t length, uint16_t color); 
void tft_lcd_draw_yline(uint16_t x, uint16_t y, uint16_t length, uint16_t color); 
void tft_lcd_fill_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color, uint8_t dir_mode); 
 
void lcdc_raster_init(unsigned int cpu_freq); 
 
#endif 
 
 
// lcd_drv.c 
#include <xdc/std.h> 
#include <ti/sysbios/knl/Queue.h> 
#include <ti/sysbios/knl/Task.h> 
 
#include "hw_types.h" 
#include "soc_C6748.h" 
#include "hw_psc_C6748.h" 
#include "hw_syscfg0_C6748.h" 
 
#include "psc.h" 
#include "gpio.h" 
#include "spi.h" 
#include "lidd.h" 
#include "raster.h" 
 
#include "lcd_drv.h" 
#include "Drv_SpiFlash.h" 
 
#include "board.h" 
 
#include "DEBUG_config.h" 
 
/************************外部变量******************************/ 
//无 
 
/************************全局变量******************************/ 
//无 
 
/************************模块局部变量******************************/ 
//无 
 
#define GrOffScreen16BPPSize(lWidth, lHeight)            \ 
        (4 + (16*2) + (lWidth * lHeight * 2)) 
 
#pragma DATA_ALIGN(g_pucBuffer0, 4); 
unsigned char g_pucBuffer0[GrOffScreen16BPPSize(LCD_WIDTH, LCD_HEIGHT)]; 
 
// 图形库显示结构 
// tDisplay g_s800x480x16Display; 
 
// 调色板 
unsigned short palette_32b[PALETTE_SIZE/2] = 
                        {0x4000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 
                         0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u}; 
 
// 全局显示上下文 
// tContext g_sContext; 
/****************************************************************************/ 
/*                                                                          */ 
/*              LCD 中断服务函数                                            */ 
/*                                                                          */ 
/****************************************************************************/ 
void LCDIsr(void) 
{ 
    unsigned int  status; 
 
    status = RasterIntStatus(SOC_LCDC_0_REGS,RASTER_END_OF_FRAME0_INT_STAT | 
                                             RASTER_END_OF_FRAME1_INT_STAT ); 
 
    RasterClearGetIntStatus(SOC_LCDC_0_REGS, status); 
} 
 
// 输入频率的单位是MHz 
void lcdc_raster_init(unsigned int cpu_freq) 
{ 
    // 禁用光栅 
    RasterDisable(SOC_LCDC_0_REGS); 
 
    // 时钟配置 
    RasterClkConfig(SOC_LCDC_0_REGS,10000000, cpu_freq*1000000/2); 
 
    // 配置 LCD DMA 控制器 
    RasterDMAConfig(SOC_LCDC_0_REGS, RASTER_DOUBLE_FRAME_BUFFER, 
                    RASTER_BURST_SIZE_16, RASTER_FIFO_THRESHOLD_8, 
                    RASTER_BIG_ENDIAN_DISABLE); 
 
    // 模式配置(例如:TFT 或者 STN,彩色或者黑白 等等) 
    RasterModeConfig(SOC_LCDC_0_REGS, RASTER_DISPLAY_MODE_TFT, 
                     RASTER_PALETTE_DATA, RASTER_COLOR, RASTER_RIGHT_ALIGNED); 
 
    // 帧缓存数据以 LSB 方式排列 
    RasterLSBDataOrderSelect(SOC_LCDC_0_REGS); 
 
    // 禁用 Nibble 模式 
    RasterNibbleModeDisable(SOC_LCDC_0_REGS); 
 
    // 配置光栅控制器极性 
    RasterTiming2Configure(SOC_LCDC_0_REGS, RASTER_FRAME_CLOCK_LOW | 
                                            RASTER_LINE_CLOCK_LOW  | 
                                            RASTER_PIXEL_CLOCK_LOW | 
                                            RASTER_SYNC_EDGE_RISING| 
                                            RASTER_SYNC_CTRL_ACTIVE| 
                                            RASTER_AC_BIAS_HIGH     , 0, 255); 
 
        // RasterHparamConfig(baseAddr,     numOfppl, hsw,hfp,hbp); 
    RasterHparamConfig(SOC_LCDC_0_REGS, LCD_WIDTH, 10, 4, 10); 
        // RasterVparamConfig( baseAddr,    Lpp,       vsw,vfp,vbp); 
        RasterVparamConfig(SOC_LCDC_0_REGS, LCD_HEIGHT, 4, 8, 12); 
 
        // 配置 FIFO DMA 延时 
        RasterFIFODMADelayConfig(SOC_LCDC_0_REGS, 2); 
 
    unsigned int i = 0, j = 0; 
        unsigned char *src, *dest; 
 
          // 配置基本框架 
        RasterDMAFBConfig(SOC_LCDC_0_REGS, 
                                          (unsigned int)(g_pucBuffer0+PALETTE_OFFSET), 
                                          (unsigned int)(g_pucBuffer0+PALETTE_OFFSET) + sizeof(g_pucBuffer0) - 2 - PALETTE_OFFSET, 
                                          0); 
 
        RasterDMAFBConfig(SOC_LCDC_0_REGS, 
                                          (unsigned int)(g_pucBuffer0+PALETTE_OFFSET), 
                                          (unsigned int)(g_pucBuffer0+PALETTE_OFFSET) + sizeof(g_pucBuffer0) - 2 - PALETTE_OFFSET, 
                                          1); 
 
        // 拷贝调色板到离屏显存中 
        src = (unsigned char *)palette_32b; 
        dest = (unsigned char *)(g_pucBuffer0+PALETTE_OFFSET); 
        for( i = 4; i < (PALETTE_SIZE+4); i++) 
        { 
                *dest++ = *src++; 
        } 
 
        // 使能LCD帧结束中断 
        RasterEndOfFrameIntEnable(SOC_LCDC_0_REGS); 
 
        // 使能光栅 
        RasterEnable(SOC_LCDC_0_REGS); 
} 
 
/****************************************************************************/ 
unsigned int LCDVersionGet(void) 
{ 
    return 1; 
} 
 
/** 
 * @brief: TFT LCD写一个像素到显存 
 * @author: lusd 
 * @param [in] x, 横轴坐标, 范围0~479 
 * @param [in] y, 纵轴坐标, 范围0~359 
 * @param [in] color, RGB565颜色值 
 * @return none. 
 */ 
void tft_lcd_draw_pixel(uint16_t x, uint16_t y, uint16_t color) 
{ 
        fb_data_t *fb_dat; 
 
        if ((x < LCD_WIDTH) && (y < LCD_HEIGHT)) { 
                fb_dat = (fb_data_t *)(g_pucBuffer0); 
                fb_dat->dat[y][x] = color; 
        } 
} 
 
 
/** 
 * @brief: TFT LCD在显存中画横线 
 * @author: lusd 
 * @param [in] x, 横轴起始坐标, 范围0~479 
 * @param [in] y, 纵轴起始坐标, 范围0~359 
 * @param [in] length, 长度, 范围0~479, 超出屏幕部分忽略 
 * @param [in] color, RGB565颜色值 
 * @return none. 
 */ 
void tft_lcd_draw_xline(uint16_t x, uint16_t y, uint16_t length, uint16_t color) 
{ 
        uint16_t *dest16; 
        fb_data_t *fb_dat; 
 
        if ((x < LCD_WIDTH) && (y < LCD_HEIGHT)) { 
                fb_dat = (fb_data_t *)(g_pucBuffer0); 
                dest16 = &(fb_dat->dat[y][x]); 
                if ((x + length) > LCD_WIDTH) { 
                        length = LCD_WIDTH - x; 
                } 
                while (length--) { 
                        *dest16++ = color; 
                }                 
        } 
} 
 
/** 
 * @brief: TFT LCD在显存中画竖线 
 * @author: lusd 
 * @param [in] x, 横轴起始坐标, 范围0~479 
 * @param [in] y, 纵轴起始坐标, 范围0~359 
 * @param [in] length, 长度, 范围0~359, 超出屏幕部分忽略 
 * @param [in] color, RGB565颜色值 
 * @return none. 
 */ 
void tft_lcd_draw_yline(uint16_t x, uint16_t y, uint16_t length, uint16_t color) 
{ 
        uint16_t h, y_end; 
        fb_data_t *fb_dat; 
 
        if ((x < LCD_WIDTH) && (y < LCD_HEIGHT)) { 
                fb_dat = (fb_data_t *)(g_pucBuffer0); 
                if ((y + length) > LCD_HEIGHT) { 
                        length = LCD_HEIGHT - y; 
                } 
                y_end = y + length; 
                for (h=y; h<y_end; h++) { 
                        fb_dat->dat[h][x] = color; 
                } 
        } 
} 
 
/** 
 * @brief: TFT LCD在显存中填充一个矩形区域 
 * @author: lusd 
 * @param [in] x, 横轴起始坐标, 范围0~479 
 * @param [in] y, 纵轴起始坐标, 范围0~359 
 * @param [in] width, 宽, 范围0~479, 超出屏幕部分忽略 
 * @param [in] height, 高, 范围0~359, 超出屏幕部分忽略 
 * @param [in] color, RGB565颜色值 
 * @return none. 
 */ 
void tft_lcd_fill_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) 
{ 
        uint16_t w, h, x_end, y_end; 
        fb_data_t *fb_dat; 
 
        if ((x < LCD_WIDTH) && (y < LCD_HEIGHT)) { 
                fb_dat = (fb_data_t *)(g_pucBuffer0); 
                if ((x + width) > LCD_WIDTH) { 
                        width = LCD_WIDTH - x; 
                } 
                if ((y + height) > LCD_HEIGHT) { 
                        height = LCD_HEIGHT - y; 
                } 
                x_end = x + width; 
                y_end = y + height; 
 
                for (h=y; h<y_end; h++) { 
                        for (w=x; w<x_end; w++) { 
                                fb_dat->dat[h][w] = color; 
                        } 
                } 
        } 
} 
 
 |   
 
 
 
 |