共2条
1/1 1 跳转至页
S3C44B0X,G35LCD 【讨论】S3C44B0X,G35LCD彩色液晶驱动程序
问
S3C44BOX,当使用G35,320*240,256彩色液晶屏时,遇到一些问题,由于我才大三,
第一次编写显示驱动程序,第一次使用S3C44BOX所以遇到了很多问题,目前算是入了点门,
希望我的问题能解决。大家一起学习,我的邮箱是:zbz38@163.com
下面问题中也加入了自己的理解。
(1)在Port_Init()的问题:
关键词:rPCONC,rPDATC,rPUPC,rPCOND,rPDATD,rPUPD,frameBuffer256
我看到对rPCONC、rPDATC、rPUPC、rPCOND、rPDATD、rPUPD有好几种赋值:
有rPCONC=0x0f05f555;//0x0f00ff54;//0xffffff;//0x5f55ffff;//0x0f051455;
rPDATC=0xffff;//0x3fff;
rPUPC=0x3000;//0x30c0;//0x0;
rPCOND=0xaaaa;//0x8aaa;
rPDATD=0xff;
rPUPD=0x
【我的问题】针对G35是哪个值呢,rPCONC、rPCOND寄存器各个 位 的具体含意是什么呢?
rPDATC、rPDATD里的各个 位 具体含意是什么呢?
PS:目前理解:当rPCOND=0xaaaa时,说明Group D端口的所有引脚都给LCD控制器使用,
GPD[3:0]-VD[3:0],GPD[4]-VCLK,GPD[5]-VLINE,GPD[6]-VM,GPD[7]-VFRAME
当rPCONC是上面的某个值时(不知道哪个),说明Group C端口的部分引脚给LCD控制器使用,
GPC[7:4]-VD[7:4]
我在程序中,没有看到讲画图时将数据通过rPDATC[7:4]和rPDATD[3:0]输出到G35 LCD上面显示,
而是通过对frameBuffer256的赋值来显示,我理解为通过SDRAM缓冲区的赋值显示数据,我也这么
的给frameBuffer256赋值,什么都没有显示。我也没看到对VLINE,VFRAME等的操作,我理解为对
frameBuffer256的赋值已经包括了X,Y的操作,但我没办法演示,因为压根我的程序连基本的显示
都没实现。另外frameBuffer256是如何将数据送到了VD[7:0]的,我不清楚,因为我不知道frameBuffer256
的地址以及VD[7:0]的地址,我也没明白在哪儿操作页码,以实现动画。
附:程序中是这样给frameBuffer256开辟内存的:
frameBuffer256=(unsigned int (*)[SCR_XSIZE/4])malloc(ARRAY_SIZE_COLOR);
(2)在Lcd_Init()中的问题:
关键词:rLCDCON1,rLCDCON2,rLCDSADDR1,rLCDSADDR2,rLCDSADDR3,frameBuffer256首地址,调色板
源程序代码:rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_COLOR<<12);
// disable,8B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
既然是WDLY=8clk,WLH=8clk,为什么rLCDCON1的[9:8]=11B,[11:10]=11B呢,我查了一下
说明文档:[9:8]=11B,[11:10]=11B时是16clk的,8clk的话是01B,这儿的代码是不是错了呢?
是不是要修正为:
rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0x1<<8)|(0x1<<10)|(CLKVAL_COLOR<<12);
源代码:rLCDSADDR1= (0x3<<27) | ( ((U32)frameBuffer256>>22)<<21 ) | M5D((U32)frameBuffer256>>1);
// 256-color, LCDBANK, LCDBASEU
(其中:#define M5D(n) ((n) & 0x1fffff))
该代码个人理解为将 视频缓冲区的首地址的高6位[26:21] 对应到 系统存储区frameBuffer256的首地址的高6位[27:22],
显示缓冲区首地址的低21位(即显示缓冲区上部地址) 对应到 系统存储区frameBuffer256的首地址的低21位[21:1]
因此视频缓冲区的首地址构成:[26:0]分成两部份:[26:21]+[20:0]分别指向被系统缓冲区的A[27:22]和A[21:1];
这就是说在系统中存放视频的存储区(这就是真正的视频缓冲区)首地址为:frameBuffer256的首地址。
问题是:系统存储区的A[0]怎么办,一半的数据不是丢失了吗。
比如:0: ;frameBuffer256 = 0x0c 00 00 00 ;执行(*frameBuffer256)=data0;
1: ;frameBuffer256 = 0x0c 00 00 01 ;执行frameBuffer256++,然后(*frameBuffer256)=data1;
2: ;frameBuffer256 = 0x0c 00 00 02 ;执行frameBuffer256++,然后(*frameBuffer256)=data2;
3: ;frameBuffer256 = 0x0c 00 00 03 ;执行frameBuffer256++,然后(*frameBuffer256)=data3;
由于frameBuffer256地址的最低位[0]并没有付给视频缓冲区,这意味着上面的第0行语句赋值data0将被第1行语句
赋值data0所取代,同理第3行取代第2行赋值。相当于数据丢失了一半。
数据丢失就会失真,这个东东我就不理解了。
另外,【frameBuffer256的首地址在哪里定义的呢?】
源代码:rLCDSADDR2= M5D((((U32)frameBuffer256+(SCR_XSIZE*SCR_YSIZE))>>1)) | (MVAL<<21);
即视频缓冲区的末地址
源代码:rLCDSADDR3= (LCD_XSIZE/2) | ( ((SCR_XSIZE-LCD_XSIZE)/2)<<9 );
对虚拟显示屏的设置(PAGEWIDTH)|(OFFSIZE),16BIT为单位,由于采用8位一个象素的液晶显示屏,因此要除2
源代码:rREDLUT =0xfdb96420;
rGREENLUT=0xfdb96420;
rBLUELUT =0xfb40;
rDITHMODE=0x0;
rDP1_2 =0xa5a5;
rDP4_7 =0xba5da65;
rDP3_5 =0xa5a5f;
rDP2_3 =0xd6b;
rDP5_7 =0xeb7b5ed;
rDP3_4 =0x7dbe;
rDP4_5 =0x7ebdf;
rDP6_7 =0x7fdfbfe;
我只知道是颜色值查找对应表,不知道这些具体数字是怎么来的?
(3)在void Lcd_DispON(),void_Lcd PowerReset(void),void PowerUp(void)
关键词:rPDATC[8],rPDATC[4],rPDATC[5]
源代码:void Lcd_DispON(void)
{
Delay(5000);
rPDATC = ( rPDATC & (~(1<<8)) );
Delay(5000);
}
从这个函数中可以知道rPDATC[8]控制液晶屏的开和关
问题是:在哪儿指定了用rPDATC[8]来控制它的开和关的?
如果是Port_Init()里面的rPCONC,具体是怎么决定的?
源代码:void Lcd_PowerReset(void)
{
U8 i;
rPDATC = ( rPDATC | 3<<4 ); //crtl=1,adj=1
for(i=0;i<1;i++);
rPDATC = ( rPDATC & (~(1<<5)) ); //ctrl=0
for(i=0;i<2;i++);
rPDATC = ( rPDATC | 1<<5 ); //ctrl=1
for(i=0;i<1;i++);
rPDATC = ( rPDATC & (~(1<<4)) ); //adj=0
}
源代码:void Lcd_PowerUp(void)
{
U8 i;
rPDATC = ( rPDATC | 2<<4 ); //ctrl=1,adj=0
for(i=0;i<2;i++);
rPDATC = ( rPDATC | 1<<4 ); //adj=1
for(i=0;i<1;i++);
rPDATC = ( rPDATC & (~(1<<4)) ); //adj=0
for(i=0;i<2;i++);
}
从上面这两个函数猜出:ctrl=rPDATC[4],adj=rPDATC[5];
问题: 这个两个变量是怎么控制电源的?同时为什么是rPDATC[4],rPDATC[5],是在哪儿给它们指定的?
如果是Port_Init()里面的rPCONC,具体是怎么决定的?
(4)显示屏的换页问题
一般动画的实现可以有三种方式:
1、对象颜色画对象,背景颜色画对象,不断移动实现动画
2、保存画面到缓冲区,移动坐标,将缓冲区的内容输出到画面,实现动画
另外一种3、就是通过换页方式实现动画
不知道S3C44BOX,G35_LCD,是怎么实现换页操作的
以上就是我目前的问题,尤其是第一个问题,关于rPCONC问题和显示缓冲区frameBuffer256首地址在哪儿被指定的问题?
谢谢大家帮忙看看,点播点播。 答 1: 只要花心思还是很容易入门的,我是第一次搞这个G35液晶驱动终于搞出来了,上面的问题,大家可以继续探讨。G35是240*320不是320*240,并且它的坐标是在右下角,而不是左上角,选择扫描方式时最好用4-dual方式,另外HOZVAL的值大家要小心,不是按说明书上给的值,大家根据需要尽情去改动,不要拘束。另外,rPCONC,rPCOND直接参考44BOX的说明书就可以了注意是英文版,里面有详细介绍。而frameBuffer在开辟空间时,给分配了内存的一个首地址,这根据需要来。其他的应该没什么大问题了。如果要支持汉字,可以自己写一个简单的软件,将字库的汉字点阵数据COPY出来供给程序就可以了,不用自己凑一个汉字,太累了。
只要花心思还是很容易入门的,我是第一次搞这个,虽然花了5,6天就搞这个S3C44BOX上G35的驱动,但还是学到不少东西,大家共同努力。 答 2: 我的理解: 真正的RGB 0f 0f ff 插表的只是高4位支持一下!
你的问题大概看了一下,因为这几天把板子的几个功能调了一下,昨天今天都在液晶屏这里。基本上搞明白,但是有一个不是很清楚,你怎么理解颜色表。
redlut 0xfdb96420
greenlut 0xfdb96420
bluelut 0xfb40
我的系统(44b stn 640*480 )
一个字节对应一个像素点,332格式。那么0x03这个字节为什么就是蓝色呢?
分析: 0x03(000 0000 11) 查表 red 0 green 0 bule f
问题:那么 RGB 0 0 15根本就不可能培出来蓝色 ????那怎么回是蓝色呢?
我的理解: 真正的RGB 0f 0f ff 插表的只是高4位。但是好像没找到那里有介绍的???
//++++++++++++++++++++++++
我自己编写了 Lcd_Printf 仿照Uart_Printf ,功能基本相同。自己做的字库,只有ASCII 里面的常用字符。要的话我发给你。不过给你之前我的自己整理以下:)。
第一次打这么字。 答 3: 要啊很想要啊,你发到我的邮箱里:zbz38@163.com
:) 答 4: 本来今天想修改一下timer5中断,定时将rtc送到液晶显示但是不知道咋回事,我的中断进不了了,你调中断了吗??? 答 5: 发送了,不过没有整理的。 答 6: 收到收到谢谢:) 答 7: 我的定时器也搞定了,使用定时器5,定时1s 刷新时间。 答 8: 能将您的程序转发我一份吗,我也在做lcd非常感谢!我的email:huhaohoo@eyou.com
第一次编写显示驱动程序,第一次使用S3C44BOX所以遇到了很多问题,目前算是入了点门,
希望我的问题能解决。大家一起学习,我的邮箱是:zbz38@163.com
下面问题中也加入了自己的理解。
(1)在Port_Init()的问题:
关键词:rPCONC,rPDATC,rPUPC,rPCOND,rPDATD,rPUPD,frameBuffer256
我看到对rPCONC、rPDATC、rPUPC、rPCOND、rPDATD、rPUPD有好几种赋值:
有rPCONC=0x0f05f555;//0x0f00ff54;//0xffffff;//0x5f55ffff;//0x0f051455;
rPDATC=0xffff;//0x3fff;
rPUPC=0x3000;//0x30c0;//0x0;
rPCOND=0xaaaa;//0x8aaa;
rPDATD=0xff;
rPUPD=0x
【我的问题】针对G35是哪个值呢,rPCONC、rPCOND寄存器各个 位 的具体含意是什么呢?
rPDATC、rPDATD里的各个 位 具体含意是什么呢?
PS:目前理解:当rPCOND=0xaaaa时,说明Group D端口的所有引脚都给LCD控制器使用,
GPD[3:0]-VD[3:0],GPD[4]-VCLK,GPD[5]-VLINE,GPD[6]-VM,GPD[7]-VFRAME
当rPCONC是上面的某个值时(不知道哪个),说明Group C端口的部分引脚给LCD控制器使用,
GPC[7:4]-VD[7:4]
我在程序中,没有看到讲画图时将数据通过rPDATC[7:4]和rPDATD[3:0]输出到G35 LCD上面显示,
而是通过对frameBuffer256的赋值来显示,我理解为通过SDRAM缓冲区的赋值显示数据,我也这么
的给frameBuffer256赋值,什么都没有显示。我也没看到对VLINE,VFRAME等的操作,我理解为对
frameBuffer256的赋值已经包括了X,Y的操作,但我没办法演示,因为压根我的程序连基本的显示
都没实现。另外frameBuffer256是如何将数据送到了VD[7:0]的,我不清楚,因为我不知道frameBuffer256
的地址以及VD[7:0]的地址,我也没明白在哪儿操作页码,以实现动画。
附:程序中是这样给frameBuffer256开辟内存的:
frameBuffer256=(unsigned int (*)[SCR_XSIZE/4])malloc(ARRAY_SIZE_COLOR);
(2)在Lcd_Init()中的问题:
关键词:rLCDCON1,rLCDCON2,rLCDSADDR1,rLCDSADDR2,rLCDSADDR3,frameBuffer256首地址,调色板
源程序代码:rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_COLOR<<12);
// disable,8B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
既然是WDLY=8clk,WLH=8clk,为什么rLCDCON1的[9:8]=11B,[11:10]=11B呢,我查了一下
说明文档:[9:8]=11B,[11:10]=11B时是16clk的,8clk的话是01B,这儿的代码是不是错了呢?
是不是要修正为:
rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0x1<<8)|(0x1<<10)|(CLKVAL_COLOR<<12);
源代码:rLCDSADDR1= (0x3<<27) | ( ((U32)frameBuffer256>>22)<<21 ) | M5D((U32)frameBuffer256>>1);
// 256-color, LCDBANK, LCDBASEU
(其中:#define M5D(n) ((n) & 0x1fffff))
该代码个人理解为将 视频缓冲区的首地址的高6位[26:21] 对应到 系统存储区frameBuffer256的首地址的高6位[27:22],
显示缓冲区首地址的低21位(即显示缓冲区上部地址) 对应到 系统存储区frameBuffer256的首地址的低21位[21:1]
因此视频缓冲区的首地址构成:[26:0]分成两部份:[26:21]+[20:0]分别指向被系统缓冲区的A[27:22]和A[21:1];
这就是说在系统中存放视频的存储区(这就是真正的视频缓冲区)首地址为:frameBuffer256的首地址。
问题是:系统存储区的A[0]怎么办,一半的数据不是丢失了吗。
比如:0: ;frameBuffer256 = 0x0c 00 00 00 ;执行(*frameBuffer256)=data0;
1: ;frameBuffer256 = 0x0c 00 00 01 ;执行frameBuffer256++,然后(*frameBuffer256)=data1;
2: ;frameBuffer256 = 0x0c 00 00 02 ;执行frameBuffer256++,然后(*frameBuffer256)=data2;
3: ;frameBuffer256 = 0x0c 00 00 03 ;执行frameBuffer256++,然后(*frameBuffer256)=data3;
由于frameBuffer256地址的最低位[0]并没有付给视频缓冲区,这意味着上面的第0行语句赋值data0将被第1行语句
赋值data0所取代,同理第3行取代第2行赋值。相当于数据丢失了一半。
数据丢失就会失真,这个东东我就不理解了。
另外,【frameBuffer256的首地址在哪里定义的呢?】
源代码:rLCDSADDR2= M5D((((U32)frameBuffer256+(SCR_XSIZE*SCR_YSIZE))>>1)) | (MVAL<<21);
即视频缓冲区的末地址
源代码:rLCDSADDR3= (LCD_XSIZE/2) | ( ((SCR_XSIZE-LCD_XSIZE)/2)<<9 );
对虚拟显示屏的设置(PAGEWIDTH)|(OFFSIZE),16BIT为单位,由于采用8位一个象素的液晶显示屏,因此要除2
源代码:rREDLUT =0xfdb96420;
rGREENLUT=0xfdb96420;
rBLUELUT =0xfb40;
rDITHMODE=0x0;
rDP1_2 =0xa5a5;
rDP4_7 =0xba5da65;
rDP3_5 =0xa5a5f;
rDP2_3 =0xd6b;
rDP5_7 =0xeb7b5ed;
rDP3_4 =0x7dbe;
rDP4_5 =0x7ebdf;
rDP6_7 =0x7fdfbfe;
我只知道是颜色值查找对应表,不知道这些具体数字是怎么来的?
(3)在void Lcd_DispON(),void_Lcd PowerReset(void),void PowerUp(void)
关键词:rPDATC[8],rPDATC[4],rPDATC[5]
源代码:void Lcd_DispON(void)
{
Delay(5000);
rPDATC = ( rPDATC & (~(1<<8)) );
Delay(5000);
}
从这个函数中可以知道rPDATC[8]控制液晶屏的开和关
问题是:在哪儿指定了用rPDATC[8]来控制它的开和关的?
如果是Port_Init()里面的rPCONC,具体是怎么决定的?
源代码:void Lcd_PowerReset(void)
{
U8 i;
rPDATC = ( rPDATC | 3<<4 ); //crtl=1,adj=1
for(i=0;i<1;i++);
rPDATC = ( rPDATC & (~(1<<5)) ); //ctrl=0
for(i=0;i<2;i++);
rPDATC = ( rPDATC | 1<<5 ); //ctrl=1
for(i=0;i<1;i++);
rPDATC = ( rPDATC & (~(1<<4)) ); //adj=0
}
源代码:void Lcd_PowerUp(void)
{
U8 i;
rPDATC = ( rPDATC | 2<<4 ); //ctrl=1,adj=0
for(i=0;i<2;i++);
rPDATC = ( rPDATC | 1<<4 ); //adj=1
for(i=0;i<1;i++);
rPDATC = ( rPDATC & (~(1<<4)) ); //adj=0
for(i=0;i<2;i++);
}
从上面这两个函数猜出:ctrl=rPDATC[4],adj=rPDATC[5];
问题: 这个两个变量是怎么控制电源的?同时为什么是rPDATC[4],rPDATC[5],是在哪儿给它们指定的?
如果是Port_Init()里面的rPCONC,具体是怎么决定的?
(4)显示屏的换页问题
一般动画的实现可以有三种方式:
1、对象颜色画对象,背景颜色画对象,不断移动实现动画
2、保存画面到缓冲区,移动坐标,将缓冲区的内容输出到画面,实现动画
另外一种3、就是通过换页方式实现动画
不知道S3C44BOX,G35_LCD,是怎么实现换页操作的
以上就是我目前的问题,尤其是第一个问题,关于rPCONC问题和显示缓冲区frameBuffer256首地址在哪儿被指定的问题?
谢谢大家帮忙看看,点播点播。 答 1: 只要花心思还是很容易入门的,我是第一次搞这个G35液晶驱动终于搞出来了,上面的问题,大家可以继续探讨。G35是240*320不是320*240,并且它的坐标是在右下角,而不是左上角,选择扫描方式时最好用4-dual方式,另外HOZVAL的值大家要小心,不是按说明书上给的值,大家根据需要尽情去改动,不要拘束。另外,rPCONC,rPCOND直接参考44BOX的说明书就可以了注意是英文版,里面有详细介绍。而frameBuffer在开辟空间时,给分配了内存的一个首地址,这根据需要来。其他的应该没什么大问题了。如果要支持汉字,可以自己写一个简单的软件,将字库的汉字点阵数据COPY出来供给程序就可以了,不用自己凑一个汉字,太累了。
只要花心思还是很容易入门的,我是第一次搞这个,虽然花了5,6天就搞这个S3C44BOX上G35的驱动,但还是学到不少东西,大家共同努力。 答 2: 我的理解: 真正的RGB 0f 0f ff 插表的只是高4位支持一下!
你的问题大概看了一下,因为这几天把板子的几个功能调了一下,昨天今天都在液晶屏这里。基本上搞明白,但是有一个不是很清楚,你怎么理解颜色表。
redlut 0xfdb96420
greenlut 0xfdb96420
bluelut 0xfb40
我的系统(44b stn 640*480 )
一个字节对应一个像素点,332格式。那么0x03这个字节为什么就是蓝色呢?
分析: 0x03(000 0000 11) 查表 red 0 green 0 bule f
问题:那么 RGB 0 0 15根本就不可能培出来蓝色 ????那怎么回是蓝色呢?
我的理解: 真正的RGB 0f 0f ff 插表的只是高4位。但是好像没找到那里有介绍的???
//++++++++++++++++++++++++
我自己编写了 Lcd_Printf 仿照Uart_Printf ,功能基本相同。自己做的字库,只有ASCII 里面的常用字符。要的话我发给你。不过给你之前我的自己整理以下:)。
第一次打这么字。 答 3: 要啊很想要啊,你发到我的邮箱里:zbz38@163.com
:) 答 4: 本来今天想修改一下timer5中断,定时将rtc送到液晶显示但是不知道咋回事,我的中断进不了了,你调中断了吗??? 答 5: 发送了,不过没有整理的。 答 6: 收到收到谢谢:) 答 7: 我的定时器也搞定了,使用定时器5,定时1s 刷新时间。 答 8: 能将您的程序转发我一份吗,我也在做lcd非常感谢!我的email:huhaohoo@eyou.com
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |