AM335X 屏幕旋转问题

renyiyuan 2013-11-14 04:12:55
各位好,
本人现将WEC7移植到了AM335X EVM上,默认是横屏800*480,我希望得到竖屏,网上看到很多这样的文章:
http://blog.csdn.net/nanjianhui/article/details/2569959

决定先看看注册表,
发现[HKEY_LOCAL_MACHINE\System\GDI\ROTATION]这项被注释掉了,也就是说第三方提供的BSP不支持,

在应用程序使用DevMode进行旋屏设置的方法也不行,ChangeDisplaySettingsEx()函数返回了DISP_CHANGE_BADMODE。

第三方提供的显示器驱动注册表:

第一段注释说"SurfaceMgr"只能为0,即只支持flat surface manager,不支持VRFB surface manager。
第二段注释说flat surface manager不支持旋屏,因为这样会导致溢出,我试了下,把"Angle"改成了1,结果果然得到了我不想要的结果,图形界面的方向没变,只是把Height和Width做了个对换:


我的目标是支持4.3'的480*272分辨率竖屏LCD显示,所以找到底层代码,看看能不能通过该分辨率实现:
struct lcd_panel panel_tfc_s9700 = {
LCDC_PANEL_TFT | LCDC_INV_VSYNC | LCDC_INV_HSYNC |
LCDC_HSVS_CONTROL, // config
DISPC_PIXELFORMAT_ARGB32, // bpp
800, // x_res
480, // y_res
30000000, // pixel_clock
47, // hsw
39, // hfp
39, // hbp
2, // vsw
13, // vfb
29, // vbp
0, // acb (????)
0, // mono_8bit_mode
0, // tft_alt_mode
COLOR_ACTIVE, //panel_shade
LCDC_panel_TFC_S9700RTWV35TR_init // init
};

将x_res ,y_res分别改为272、480,重新生成、部署镜像后发现屏幕出现了横向的条带,什么都看不清。

我去TI的WinCE论坛上看,也有人提出是因为AM335x的BSP不支持vrfb的原因,但没找到有什么实现竖屏的办法,所以想请各位大神帮忙,先不管分辨率的问题,看看还有什么办法能帮我实现90度旋屏,谢谢!
...全文
1126 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
reachfoo 2015-03-17
  • 打赏
  • 举报
回复
同样想求教这个问题,不知道你现在解决了没有,希望你解决了能告知一下,不胜感激。
headgo 2015-02-09
  • 打赏
  • 举报
回复
引用 11 楼 san48523911 的回复:
你好,请问有人解决吗,我修改底层驱动,实现翻转,但是拖动鼠标时,会有拖影,
我也有这样的需求,请问你是改了哪个文件?
headgo 2015-02-09
  • 打赏
  • 举报
回复
请问楼主解决了没有,如果解决了请回来说一下思路
san48523911 2014-07-01
  • 打赏
  • 举报
回复
你好,请问有人解决吗,我修改底层驱动,实现翻转,但是拖动鼠标时,会有拖影,
tqkjxs 2014-01-07
  • 打赏
  • 举报
回复
QQ1833750118联系
abc123dddd 2014-01-01
  • 打赏
  • 举报
回复
不知楼主问题解决没有? 修改panel_tfc_s9700应该是办不到的,因为这个结构是与具体的屏对应的。 我的思路(很可能不对!):从寄存器或显示缓冲区着手。
suwyhoho 2013-12-02
  • 打赏
  • 举报
回复
原厂的BSP支持吗
unsway123 2013-11-25
  • 打赏
  • 举报
回复
你用的是那颗芯片?
  • 打赏
  • 举报
回复
有的代码里面角度问题是直接赋值,这就是写死。 另外vsw等参数,你可以在屏的手册里面查出来,一般都有参考范围。 pixel_clock值不清楚,我只在it的bsp里面见到过,三星的没遇到。 it的bsp我换了lcd没改这个值也可以。
renyiyuan 2013-11-15
  • 打赏
  • 举报
回复
引用 2 楼 accessysq 的回复:
角度问题要看显示驱动里面怎么写,是否写死,还是有读注册表,我的BSP就提供宏可以自己选。 另外修改分辨率其他参数也要修改吧,不然会有问题的。
1. 请问,你说的“是否写死”是指什么? 2. 屏幕水平像素数 = hbp + x_res + hfp +hsw ,是这样吗? 这样算得屏幕水平像素数为39 + 800 + 39 + 47 = 925 , 如果x_res变了,其他的也要跟着变,让等式成立,我这么理解对吗? 还有如果改变分辨率,pixel_clock是否需要改?如何改? 谢谢!
renyiyuan 2013-11-15
  • 打赏
  • 举报
回复
引用 1 楼 hudaweikevin 的回复:
不支持旋转,那ANDROID怎么搞的,肯定是支持的,不然这片子卖不出去的 AM335X的CE很少有人弄的,你直接从官网下个CE7的BSP试试
1. 小弟用的是Adeneo公司提供的BSP,这也是TI指定的BSP,还没发现其他的官方BSP。因为BSP不支持,肯定要自己写底层了,但是一下子不知从何入手,大神们能不能给提供些思路; 2. 能否说说用AM335X做CE不主流的原因? 谢谢!
  • 打赏
  • 举报
回复
角度问题要看显示驱动里面怎么写,是否写死,还是有读注册表,我的BSP就提供宏可以自己选。 另外修改分辨率其他参数也要修改吧,不然会有问题的。
David_Hu 2013-11-15
  • 打赏
  • 举报
回复
不支持旋转,那ANDROID怎么搞的,肯定是支持的,不然这片子卖不出去的 AM335X的CE很少有人弄的,你直接从官网下个CE7的BSP试试
bbstr 2013-11-15
  • 打赏
  • 举报
回复
rotation should not be used with flat framebuffer 去找找bsp的release note吧,看看人家是在什么条件下可以rotate
/****************************************************************************** * 文件名称:ili932x.c * 摘 要:支持ILI9320和ILI9325驱动IC控制的QVGA显示屏,使用16位并行传输 到头文件中配置 屏幕使用方向和驱动IC类型 注意:16位数据线色彩分布>> BGR(565) *重要说明! 在.h文件中,#define Immediately时是立即显示当前画面 而如果#define Delay,则只有在执行了LCD_WR_REG(0x0007,0x0173); 之后才会显示,执行一次LCD_WR_REG(0x0007,0x0173)后,所有写入数 据都立即显示。 #define Delay一般用在开机画面的显示,防止显示出全屏图像的刷新 过程 ******************************************************************************/ #include "stm32f10x_lib.h" #include "ili932x.h" #include "spi_flash.h" /**************************************************************** 函数名:Lcd配置函数 功能:配置所有和Lcd相关的GPIO和时钟 引脚分配为: PE——16Bit数据总线 PD15——Lcd_rst PD14——Lcd_rd* PD13——Lcd_wr PD12——Lcd_rs* PD11——Lcd_cs PB5——Lcd_blaklight 背光靠场效应管驱动背光模块 *****************************************************************/ void Lcd_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /*开启相应时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE, ENABLE); /*所有Lcd引脚配置为推挽输出*/ /*16位数据*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOE, &GPIO_InitStructure); /*控制脚*/ GPIO_InitStructure.GPIO_Pin =GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; GPIO_Init(GPIOD, &GPIO_InitStructure); /*背光控制*/ GPIO_InitStructure.GPIO_Pin =GPIO_Pin_3; GPIO_Init(GPIOA, &GPIO_InitStructure); } /********************************************** 函数名:Lcd初始化函数 功能:初始化Lcd 入口参数:无 返回值:无 ***********************************************/ void Lcd_Initialize(void) { Lcd_Light_ON; DataToWrite(0xffff);//数据线全高 Set_nWr; Set_Cs; Set_Rs; Set_nRd; Set_Rst; Set_Rst; Delay_nms(1); Clr_Rst; Delay_nms(1); Set_Rst; Delay_nms(1); #ifdef ILI9325 LCD_WR_REG(0x00e3,0x3008); LCD_WR_REG(0x00e7,0x0012); LCD_WR_REG(0x00ef,0x1231);//Set the internal vcore voltage LCD_WR_REG(0x0001,0x0100);//S #endif #ifdef ILI9320 LCD_WR_REG(0x00e5,0x8000); LCD_WR_REG(0x0000,0x0001); LCD_WR_REG(0x0001,0x0100);//S Delay_nms(10); #endif LCD_WR_REG(0x0002,0x0700);//Line inversion #if ID_AM==000 LCD_WR_REG(0x0003,0x0000);//屏幕旋转控制 TFM=0,TRI=0,SWAP=1,16 bits system interface swap RGB to BRG,此处ORG和HWM 为0 #elif ID_AM==001 LCD_WR_REG(0x0003,0x0008); #elif ID_AM==010 LCD_WR_REG(0x0003,0x0010); #elif ID_AM==011 LCD_WR_REG(0x0003,0x0018); #elif ID_AM==100 LCD_WR_REG(0x0003,0x0020); #elif ID_AM==101 LCD_WR_REG(0x0003,0x0028); #elif ID_AM==110 LCD_WR_REG(0x0003,0x0030); #elif ID_AM==111 LCD_WR_REG(0x0003,0x0038); #endif LCD_WR_REG(0x0004,0x0000); LCD_WR_REG(0x0008,0x0207); LCD_WR_REG(0x0009,0x0000); LCD_WR_REG(0x000a,0x0000); LCD_WR_REG(0x000c,0x0001);//此处配置接口类型 16位 system接口 LCD_WR_REG(0x000d,0x0000); LCD_WR_REG(0x000f,0x0000); //电源配置 LCD_WR_REG(0x0010,0x0000); LCD_WR_REG(0x0011,0x0000); LCD_WR_REG(0x0012,0x0000); LCD_WR_REG(0x0013,0x0000); Delay_nms(200); LCD_WR_REG(0x0010,0x17b0); LCD_WR_REG(0x0011,0x0137); Delay_nms(50); LCD_WR_REG(0x0012,0x0139); Delay_nms(50); LCD_WR_REG(0x0013,0x1700); LCD_WR_REG(0x0029,0x000c); //LCD_WR_REG(0x002b,0x000d); Delay_nms(50); #if ID_AM==000 LCD_WR_REG(0x0020,0x00ef);//GRAM水平起始位置 LCD_WR_REG(0x0021,0x013f); #elif ID_AM==001 LCD_WR_REG(0x0020,0x00ef); LCD_WR_REG(0x0021,0x013f); #elif ID_AM==010 LCD_WR_REG(0x0020,0x0000); LCD_WR_REG(0x0021,0x013f); #elif ID_AM==011 LCD_WR_REG(0x0020,0x0000); LCD_WR_REG(0x0021,0x013f); #elif ID_AM==100 LCD_WR_REG(0x0020,0x00ef); LCD_WR_REG(0x0021,0x0000); #elif ID_AM==101 LCD_WR_REG(0x0020,0x00ef); LCD_WR_REG(0x0021,0x0000); #elif ID_AM==110 LCD_WR_REG(0x0020,0x0000); LCD_WR_REG(0x0021,0x0000); #elif ID_AM==111 LCD_WR_REG(0x0020,0x0000); LCD_WR_REG(0x0021,0x0000); #endif LCD_WR_REG(0x0030,0x0000); LCD_WR_REG(0x0031,0x0507); LCD_WR_REG(0x0032,0x0104); LCD_WR_REG(0x0035,0x0105); LCD_WR_REG(0x0036,0x0404); LCD_WR_REG(0x0037,0x0603); LCD_WR_REG(0x0038,0x0004); LCD_WR_REG(0x0039,0x0007); LCD_WR_REG(0x003c,0x0501); LCD_WR_REG(0x003d,0x0404); LCD_WR_REG(0x0050,0x0000);//水平 GRAM起始位置 LCD_WR_REG(0x0051,0x00ef);//水平GRAM终止位置 LCD_WR_REG(0x0052,0x0000);//垂直GRAM起始位置 LCD_WR_REG(0x0053,0x013f);//垂直GRAM终止位置 #ifdef ILI9325 LCD_WR_REG(0x0060,0xa700);//G #endif #ifdef ILI9320 LCD_WR_REG(0x0060,0x2700);//G #endif LCD_WR_REG(0x0061,0x0001);//Enables the grayscale inversion of the image by setting REV=1.?????????????????????????????? LCD_WR_REG(0x006a,0x0000);//不使用卷曲功能 LCD_WR_REG(0x0080,0x0000); LCD_WR_REG(0x0081,0x0000); LCD_WR_REG(0x0082,0x0000); LCD_WR_REG(0x0083,0x0000); LCD_WR_REG(0x0084,0x0000); LCD_WR_REG(0x0085,0x0000); LCD_WR_REG(0x0090,0x0010); LCD_WR_REG(0x0092,0x0000); LCD_WR_REG(0x0093,0x0003); LCD_WR_REG(0x0095,0x0110); LCD_WR_REG(0x0097,0x0000); LCD_WR_REG(0x0098,0x0000); //显示画面写入 0x0130是不显示当前画面 //0x0173是显示当前画面 LCD_WR_REG(0x0007,0x0130); #ifdef Immediately LCD_WR_REG(0x0007,0x0173); #endif //第一个像素的读取数据是无效值,这里事先读取一次,舍去无效值 } /**************************************/ #ifndef __ILI932X_H #define __ILI932X_H //定义驱动IC是ILI9320还是ILI9325 #define ILI9325 //ILI9325 //屏幕旋转定义 数字按照 ID[1:0]AM 按照PDF中的配置定义 #define ID_AM 110 //屏幕开始时显示方式,注意:当IDelay时显示第一幅画面是逐像素刷新的 //此时必须手动在刷新结束后加上 LCD_WR_REG(0x0007,0x0173);才能显示 //当Immediately时没有被注释掉是不需要此过程 #define Delay//Display Delay//Immediately //硬件相关的子函数 #define nWrPin 0x2000 #define CsPin 0x800 #define RsPin 0x1000 #define nRdPin 0x4000 #define RstPin 0x8000 #define Lcd_Light_ON GPIO_SetBits(GPIOA,GPIO_Pin_3); #define Lcd_Light_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_3); #define DataToWrite(PORTE) (*((volatile unsigned long *) 0x4001180C) = PORTE) #define Set_nWr (*((volatile unsigned long *) 0x40011410) = nWrPin) #define Clr_nWr (*((volatile unsigned long *) 0x40011414) = nWrPin) #define Set_Cs (*((volatile unsigned long *) 0x40011410) = CsPin) #define Clr_Cs (*((volatile unsigned long *) 0x40011414) = CsPin) #define Set_Rs (*((volatile unsigned long *) 0x40011410) = RsPin) #define Clr_Rs (*((volatile unsigned long *) 0x40011414) = RsPin) #define Set_nRd (*((volatile unsigned long *) 0x40011410) = nRdPin) #define Clr_nRd (*((volatile unsigned long *) 0x40011414) = nRdPin) #define Set_Rst (*((volatile unsigned long *) 0x40011410) = RstPin) #define Clr_Rst (*((volatile unsigned long *) 0x40011414) = RstPin)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧