![8be34e9f5f2732524f2b9105b83cce52.png](https://i-blog.csdnimg.cn/blog_migrate/05bcd16afeba9eed3d50768ef87b3a47.jpeg)
来源:韦东山嵌入式专栏_ARM裸机加强版维基教程
作者:韦东山
本文字数:1449,阅读时长:1.5分钟
开始正式编写程序,根据前面的框架,新建如下文件:
font.c、framebuffer.c、geometry.c、lcd.c、lcd_4.3.c、lcd_controller.c、s3c2440_lcd_controller.c、lcd_test.c
首先编写lcd_controller.c,它向上要接收不同LCD的参数,向下要使用这些参数设置对应的LCD控制器。
前面我们列举了LCD的参数,例如引脚的极性、时序、数据的格式bpp、分辨率等,使用面向对象的思维方式,将这些封装成结构体放在lcd.h中:
enum { NORMAL = 0, INVERT = 1,};/* NORMAL : 正常极性 * INVERT : 反转极性 */typedef struct pins_polarity { int vclk; /* normal: 在下降沿获取数据 */ int rgb; /* normal: 高电平表示1 */ int hsync; /* normal: 高脉冲 */ int vsync; /* normal: 高脉冲 */}pins_polarity, *p_pins_polarity;typedef struct time_sequence { /* 垂直方向 */ int tvp; /* vysnc脉冲宽度 */ int tvb; /* 上边黑框, Vertical Back porch */ int tvf; /* 下边黑框, Vertical Front porch */ /* 水平方向 */ int thp; /* hsync脉冲宽度 */ int thb; /* 左边黑框, Horizontal Back porch */ int thf; /* 右边黑框, Horizontal Front porch */ int vclk;}time_sequence, *p_time_sequence;typedef struct lcd_params { /* 引脚极性 */ pins_polarity pins_pol; /* 时序 */ time_sequence time_seq; /* 分辨率, bpp */ int xres; int yres; int bpp; /* framebuffer的地址 */ unsigned int fb_base;}lcd_params, *p_lcd_params;
以后就使用lcd_params结构体来表示lcd参数。
对于有多个lcd的情况,再定义个一个结构体,包含指针初始化函数和使能函数,放在lcd_controller.h里面:
typedef struct lcd_controller { void (*init)(p_lcd_params plcdparams); void (*enable)(void); void (*disable)(void);}lcd_controller, *p_lcd_controller;
最后在lcd_controller.c里传入lcd参数,再通过指针函数初始化对应的lcd控制器:
void lcd_controller_init(p_lcd_params plcdparams){ /* 调用2440的LCD控制器的初始化函数 */ lcd_controller.init(plcdparams);}
在s3c2440_lcd_controller.c还需构造一个当前soc的lcd控制器结构体:
struct lcd_controller s3c2440_lcd_controller = { .init = xxx, .enalbe = xxx, .disable = xxx,};
上一篇:LCD原理详解及裸机程序分析——第003节_编程框架与准备
下一篇:LCD原理详解及裸机程序分析——第005节_LCD控制器编程