韦东山第二期视频之心得体会

韦东山第二期视频之心得体会

姓名:张猛

引用自:http://blog.csdn.net/u013985662/article/details/45575777

【嵌牛导读】:最近一直在收看韦东山老师的嵌入式视频,收获颇丰。第二期主要是关于一些设备驱动的编写示例,从最基础的按键驱动、LED驱动到复杂的LCD、触摸屏、网卡、以及各种总线驱动。今天主要对之前学习的LCD驱动做一个学习心得,将学习中的一些问题和收获和大家一起分享。

【嵌牛鼻子】:嵌入式 驱动LED

【嵌牛提问】:嵌入式学习过程中应该注意的坑,应该怎么样子学习提高效率

【嵌牛正文】:

我的开发板的Linux系统是linux-2.6.32.2,和我在Ubuntu虚拟机中的专用于编译模块文件的内核源码包一致(在刚开始因为两者的版本不一致导致在mini2440中加载.ko文件一直都报错:"invalid module format",也是个印象深刻的教训)。我的mini2440的LCD是滕宝的TD35,虽然和视频中的JZ2440不一样,但是大同小异,具体步骤如下。

首先在模块驱动程序中的初始化函数中进行一些基础操作,包括fb_info结构体的分配、设置LCD的固定参数(fb_info结构体中的fb_fix_screeninfo结构体实例fix)、设置可变的参数(fb_info中的fb_var_screeninfo结构体实例var)、设置操作函数(fb_ops结构体)、处理一些硬件相关的操作(如配置用于LCD的GPIO引脚)、以及最后的注册工作等等。

在这些韦东山老师整理出来的配置步骤中,我主要与大家分享下面几点:

1、第二步设置固定参数中有几点要格外注意。第一,fb_info.fix结构体中的成员smem_len和line_length变量的单位都是字节,很多时候单位是位的话要记得转换为字节。第二,成员visual要设为真彩色(FB_VISUAL_TRUECOLOR)。第三,成员smem_len表示了图像大小,要查看数据手册,单位同样也是字节。

2、第三步设置可变参数也有几点要注意。第一,var的成员xres表示的是一行的像素点,yres表示一列的像素点,而虚拟像素点xres_virtual和yres_virtual只需和xres,yres取相同值即可。第二,我的像素深度是16位,而初始像素深度为24位,其中RGB各占一个字节,但在16位像素中,RGB分别占5、6、5位,8位取高5位或高6位实现裁剪到5位或6位。

3、第四步操作函数中记得加上调色板相关的函数,在16位像素深度的图像处理中要用到调色板(palette)。将16位的像素值作为调色板数组的索引值,然后从数据类型为24位或32位的调试板中取色,这样达到了要求的像素深度。

4.第五步中主要是设置LCD相关的寄存器,包括LCDCON1至LCDCON5,以及LCDSADDR1到LCDSADDR3。这些寄存器的配置既需要阅读s3c2440的数据手册,也需要阅读LCD的数据手册,尤其的行信号的场信号的时序图,通过在其参数范围内进行调整,直到屏幕上出现理想的视图。

前面这些步骤就实现了基础的配置了,具体的代码如下:

static int __init lcd_init(void)

{

/*1.分配一个fb_info结构体*/

s3c_lcd=framebuffer_alloc(0,NULL);

/*2.1设置固定的参数*/

strcpy(s3c->fix.id,"mylcd");

//s3c->fix.smem_start之后再设

s3c_lcd.fix.smem_len=320*240*16/8;

s3c_lcd.fix.type=FB_TYPE_PACKED_PIXELS;

s3c_lcd.fix.visual=FB_VISUAL_TRUECOLOR;

s3c_lcd.fix.line_length=240*2;

/*2.2设置可变参数*/

s3c_lcd->var.xres=240;

s3c_lcd->var.yres=320;

s3c_lcd->var.xres_virtual=240;

s3c_lcd->var.yres_virtual=320;

s3c_lcd->var.bits_per_pixel=16;

s3c_lcd->var.red.offset=11;

s3c_lcd->var.red.length=5;

s3c_lcd->var.green.offset=5;

s3c_lcd->var.red.length=6;

s3c_lcd->var.blue.offset=0;

s3c_lcd->var.red.length=5;

s3c_lcd->var.active=FB_ACTIVATE_NOW;

/**设置操作函数***/

s3c_lcd->fbops=&s3c_lcdfb_ops;

/**其他设置*****/

s3c_lcd->pseudo_palette=pseudo_palette;//调色板

s3c_lcd->screen_size=240*320*2;

/**3.硬件相关的操作*******/

/*配置GPIO用于LCD*****/

GPCCON=ioremap(0x56000010, 4);

GPDCON=ioremap(0x56000030,4);

GPGCON=ioremap(0x56000060,4);

*GPCCON=0xaaaaaaaa;

*GPDCON=0xaaaaaaaa;

//配置LCD背光使能口

//GPGCON做LCD_POWER使能LCD电源口

*GPGCON | =(3<<8);

/**3.2根据LCD手册设置LCD控制器*****/

lcd_regs=ioremap(0x4D000000,sizeof(struct lcd_regs));

lcd_regs->lcdcon1=(6<<8)|(3<<5)|(0x0c<<1);

lcd_regs->lcdcon2=(3<<24)|(319<<14)|(1<<6)|(0<<0);

lcd_regs->lcdcon3=(19<<19)|(239<<8)|(9<<0);

lcd_regs->lcdcon4=9;

lcd_regs->lcdcon5=(1<<11)|(0<<10)|(1<<9)|(1<<8)|(1<<0);

/*3.3分配显存,并把地址告诉LCD控制器******/

s3c_lcd->screen_base=dma_alloc_writecombine(NULL,s3c_lcd->fix.smem_len,&s3c_lcd->fix.smem_start,GFP_KERNEL)

lcd_regs->lcdsaddr1=(s3c_lcd->fix.smem_start>>1)&~(3<<30);

lcd_regs->lcdsaddr2=((s3c_lcd->fix.smem_start+s3c_lcd->fix.smem.len)>>1)&0x1fffff;

lcd_regs->lcdsaddr3=(240*16/16);

//启动LCD

lcd_regs->lcdcon1 |=(1<<0);

lcd_regs->lcdcon5 |=(1<<3);

/**4.注册****/

register_framebuffer(s3c_lcd);

}

5.在完成这些初始化过程之后,就是自己发挥的部分了,可以通过读取HZK16文件来实现汉字库的导入来实现汉字,也可以通过Linux源码包的ASCII库文件来来实现显示字母和数字等常用标识。下面是我的部分字库读取函数,代码如下:

void lcd_show_ascii(unsigned char*fbmem_start,int x,int y,unsigned char c,unsigned int forecolor,int backcolor)

{

//指向内核中已定义的ASCII数组

unsigned char *dots=(unsignedchar *)&fontdata_8x16[c*16];

int i,b;

unsigned char by;

for(i=0;i<16;i++)//一个字母占16个字节共16*8位

{

by=dots[i];

for(b=7;b>=0;b--)//16表示行数,8表示列数

{

if(by&(1<

{

lcd_show_point(fbmem_start,x+7-b,y+i,forecolor);

}

else//否则为背景色,即不显示

{

lcd_show_point(fbmem_start,x+7-b,y+i,backcolor);

}

}

}

}

这整个过程有些复杂,但只需按部就班加上对实际情况的具体分析,相信就可以实现想要的效果了。当实现之后,就可以利用这个LCD屏幕来作为自己显示的又一个终端了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容