来源:韦东山嵌入式专栏_ARM裸机加强版维基教程
作者:韦东山
本文字数:2959,阅读时长:2.5分钟
前面编写了s3c2440_lcd_controller.c,以后我们只需往里面传入参数即可控制LCD控制器,对于我们的4.3寸LCD,配合LCD手册时序的介绍,相关的设置如下:
#define LCD_FB_BASE 0x33c00000lcd_params lcd_4_3_params = { .name = "lcd_4.3" .pins_polarity = { .de = NORMAL, /* normal: 高电平时可以传输数据 */ .pwren = NORMAL, /* normal: 高电平有效 */ .vclk = NORMAL, /* normal: 在下降沿获取数据 */ .rgb = NORMAL, /* normal: 高电平表示1 */ .hsync = INVERT, /* normal: 高脉冲 */ .vsync = INVERT, /* normal: 高脉冲 */ }, .time_sequence = { /* 垂直方向 */ .tvp= 10, /* vysnc脉冲宽度 */ .tvb= 2, /* 上边黑框, Vertical Back porch */ .tvf= 2, /* 下边黑框, Vertical Front porch */ /* 水平方向 */ .thp= 41, /* hsync脉冲宽度 */ .thb= 2, /* 左边黑框, Horizontal Back porch */ .thf= 2, /* 右边黑框, Horizontal Front porch */ .vclk= 9, /* MHz */ }, .xres = 480, .yres = 272, .bpp = 16, .fb_base = LCD_FB_BASE,};
完成了lcd控制器和参数的代码,现在还需要一个管理的中间层将两者连在一起。
我们用lcd_controller.c管理s3c2440_lcd_controller.c,它向上接受传入的LCD参数,向下传给对应的LCD控制器。lcd_controller.c管理下级的控制器的思路如下:
- a. 用数组保存下面各种lcd_controller;
- b. 提供register_lcd_controller给下面的代码设置数组;
- c. 提供select_lcd_controller(name)给上面的代码选择某个lcd_controller;
lcd_controller.c代码如下:
#define LCD_CONTROLLER_NUM 10static p_lcd_controller p_array_lcd_controller[LCD_CONTROLLER_NUM];static p_lcd_controller g_p_lcd_controller_selected;int register_lcd_controller(p_lcd_controller plcdcon){ int i; for (i = 0; i < LCD_CONTROLLER_NUM; i++) { if (!p_array_lcd_controller[i]) { p_array_lcd_controller[i] = plcdcon; return i; } } return -1; }int select_lcd_controller(char *name){ int i; for (i = 0; i < LCD_CONTROLLER_NUM; i++) { if (p_array_lcd_controller[i] && !strcmp(p_array_lcd_controller[i]->name, name)) { g_p_lcd_controller_selected = p_array_lcd_controller[i]; return i; } } return -1; }/* 向上: 接收不同LCD的参数 * 向下: 使用这些参数设置对应的LCD控制器 */int lcd_controller_init(p_lcd_params plcdparams){ /* 调用所选择的LCD控制器的初始化函数 */ if (g_p_lcd_controller_selected) { g_p_lcd_controller_selected->init(plcdparams); return 0; } return -1;}void lcd_contoller_add(void){ s3c2440_lcd_contoller_add();}同时,在s3c2440_lcd_controller.c里注册控制器:void s3c2440_lcd_contoller_add(void){ register_lcd_controller(&s3c2440_lcd_controller);}
这样,s3c2440_lcd_controller.c里的register_lcd_controller()将自己放在p_array_lcd_controller[]这个数组,然后上层的lcd_controller.c调用select_lcd_controller()传入要选择的LCD控制器,然后在数组里面找到名字名字匹配的LCD控制器进行相应的初始化。
同理,也通过lcd.c去管理lcd_4.3.c,思路如下:
- a. 有一个数组存放各类lcd的参数;
- b. 有一个register_led给下面的lcd程序来设置数组;
- c. 有一个select_lcd,供上层选择某款LCD;
参考前面的lcd_controller.c编辑lcd_controller.c如下:
#define LCD_NUM 10static p_lcd_params p_array_lcd[LCD_NUM];static p_lcd_params g_p_lcd_selected;int register_lcd(p_lcd_params plcd){ int i; for (i = 0; i < LCD_NUM; i++) { if (!p_array_lcd[i]) { p_array_lcd[i] = plcd; return i; } } return -1; }int select_lcd(char *name){ int i; for (i = 0; i < LCD_NUM; i++) { if (p_array_lcd[i] && !strcmp(p_array_lcd[i]->name, name)) { g_p_lcd_selected = p_array_lcd[i]; return i; } } return -1; }
在lcd_4.3.c里面把lcd参数注册进去:
void lcd_4_3_add(void){register_lcd(&lcd_4_3_params);}
以后只需要在lcd.c里面选择某款lcd和某款lcd控制器即可,底层的只管添加种类即可。
在lcd.c里面添加初始化函数如下:
int lcd_init(void){ /* 注册LCD */ lcd_4_3_add(); /* 注册LCD控制器 */ lcd_contoller_add(); /* 选择某款LCD */ select_lcd("lcd_4.3"); /* 选择某款LCD控制器 */ select_lcd_controller("s3c2440"); /* 使用LCD的参数, 初始化LCD控制器 */ lcd_controller_init(g_p_lcd_selected);}
上一篇:LCD原理详解及裸机程序分析——第005节_LCD控制器编程
下一篇:LCD原理详解及裸机程序分析——第007节_LCD编程简单测试