Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
DIY综合交流区
RK瑞芯微_Rockchip
音乐播放器
RK2706播放器printf定位到LCD
发布于 2011-10-21 22:17:04 浏览:9698
订阅该版
[attachment=-2] 看RM970原理图得知LCD中IM0 IM1 ID0都接上了GND,查LCD(控制器为SPFD5420A)得知,此时LCD工作于18bit,80-system.既为最常见的MCU接口. 所以配置RK2706来说是这么一个通用流程: 1.设置相应引脚为LCD功能 ```c void iomux_lcd(void) { unsigned long muxa; muxa = SCU_IOMUXA_CON & ~(IOMUX_LCD_VSYNC|IOMUX_LCD_DEN|0xff); muxa |= IOMUX_LCD_D18|IOMUX_LCD_D20|IOMUX_LCD_D22|IOMUX_LCD_D17|IOMUX_LCD_D16; SCU_IOMUXA_CON = muxa; SCU_IOMUXB_CON |= IOMUX_LCD_D815; } ``` 2.设置LCD寄存器,配置时序. ```c void lcdctrl_init(void) { /* alpha b111 * stop at current frame complete * MCU mode * 24b RGB */ LCDC_CTRL = ALPHA(7) | LCDC_STOP | LCDC_MCU | RGB24B; MCU_CTRL = ALPHA_BASE(0x3f) | MCU_CTRL_BYPASS; HOR_ACT = 400 + 3; /* define horizonatal active region */ VERT_ACT = 240; /* define vertical active region */ VERT_PERIOD = 0xfff; /* CSn/WEn/RDn signal timings */ LINE0_YADDR = LINE_ALPHA_EN | 0x7fe; LINE1_YADDR = LINE_ALPHA_EN | ((1 * 400) - 2); LINE2_YADDR = LINE_ALPHA_EN | ((2 * 400) - 2); LINE3_YADDR = LINE_ALPHA_EN | ((3 * 400) - 2); LINE0_UVADDR = 0x7fe + 1; LINE1_UVADDR = ((1 * 400) - 2 + 1); LINE2_UVADDR = ((2 * 400) - 2 + 1); LINE3_UVADDR = ((3 * 400) - 2 + 1); LCDC_INTR_MASK = INTR_MASK_LINE; /* INTR_MASK_EVENLINE; */ } ``` 3.初始化LCD寄存器. ```c void lcd_init_device() { unsigned int x, y; iomux_lcd(); /* setup pins for 18bit lcd interface */ lcdctrl_init(); /* basic lcdc module configuration */ lcdctrl_bypass(1); /* run in bypass mode - all writes goes directly to lcd controller */ lcd_write_reg(RESET, 0x0001); delay_nop(10000); lcd_write_reg(RESET, 0x0000); delay_nop(10000); lcd_write_reg(IF_ENDIAN, 0x0000); /* order of receiving data */ lcd_write_reg(DRIVER_OUT_CTRL, 0x0000); lcd_write_reg(ENTRY_MODE, 0x1038); lcd_write_reg(WAVEFORM_CTRL, 0x0100); lcd_write_reg(SHAPENING_CTRL, 0x0000); lcd_write_reg(DISPLAY_CTRL2, 0x0808); lcd_write_reg(LOW_PWR_CTRL1, 0x0001); lcd_write_reg(LOW_PWR_CTRL2, 0x0010); lcd_write_reg(EXT_DISP_CTRL1, 0x0000); lcd_write_reg(EXT_DISP_CTRL2, 0x0000); lcd_write_reg(BASE_IMG_SIZE, 0x3100); ...................... } ``` 细心的朋友会发现这些寄存器初始值都为16bit,而LCD为18bit,所以得用下面函数转换成18bit后才能写给LCD. ```c __inline unsigned int lcd_data_transform(unsigned int data) { /* 18 bit interface */ unsigned int r, g, b; r = (data & 0x0000fc00)<<8; g = ((data & 0x00000300) << 6) | ((data & 0x000000e0) << 5); b = (data & 0x00000001f) << 3; return (r | g | b); } ``` 初试化完毕后,一个不约而同的规则便是实现画横竖线与打点了. ``` /* 画水平线 */ void rt_hw_lcd_draw_hline(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_t y) { lcd_write_reg(WINDOW_H_START, y); lcd_write_reg(WINDOW_H_END, y); lcd_write_reg(WINDOW_V_START, x1); lcd_write_reg(WINDOW_V_END, x2); lcd_write_reg(GRAM_H_ADDR, y); lcd_write_reg(GRAM_V_ADDR, x1); lcd_cmd(GRAM_WRITE); /* Prepare to write GRAM */ while (x1 < x2) { LCD_DATA = lcd_pixel_transform(*c); x1++; } } /* 垂直线 */ void rt_hw_lcd_draw_vline(rtgui_color_t *c, rt_base_t x, rt_base_t y1, rt_base_t y2) { lcd_write_reg(WINDOW_H_START, y1); lcd_write_reg(WINDOW_H_END, y2); lcd_write_reg(WINDOW_V_START, x); lcd_write_reg(WINDOW_V_END, x); lcd_SetCursor(x, y1); lcd_cmd(GRAM_WRITE); /* Prepare to write GRAM */ while (y1 < y2) { LCD_DATA = lcd_pixel_transform(*c); y1++; } } /* 设置像素点 颜色,X,Y */ void rt_hw_lcd_set_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y) { lcd_write_reg(WINDOW_H_START, y); lcd_write_reg(WINDOW_H_END, y); lcd_write_reg(WINDOW_V_START, x); lcd_write_reg(WINDOW_V_END, x); lcd_SetCursor(x,y); lcd_cmd(GRAM_WRITE); LCD_DATA = lcd_pixel_transform(*c); } ``` 注意这SPFD5420A打点函数与常见的控制器还不一样,还要设置窗口为此点.要不然会有些莫名奇妙的问题.(起码这边测试的是这样). 实现打点函数后便可以将printf定位到LCD了,新建Retarget.c文件,在里面实现fputc()函数 ```c int fputc(int ch, FILE *f) { int MaxX = 400 / 6; int MaxY = 240 / 12; int n; if(ch != ' ' && ch != ' ' && ch != '�') { lcd_show_char(CurrentX*6, ((CurrentY + MaxY)%MaxY)*12, ch); } CurrentX++; return 1; } ``` 这里并没考虑更多情况,请各位按需要自行改进. 最后顺便在rtthread.h加上: ```c #define rt_kprintf printf ``` 两个应该注意的地方.一是记得开背光,二是Options-Target-Use Micro LIB选项记得勾上,而且启动代码中Micro_Lib_Stack_Size宏大小最好相应改大. 如无意外printf,与rt_kprintf都已经定位到LCD了. [attachment=-1] 附件为SPFD5420A数据手册 [attach]0[/attach] - [SPFD5420A.rar](uploads/2304_0a1912ad2c8c871f972447d3444fcac9.rar)
![lcd.jpg](https://oss-club.rt-thread.org/uploads/2304_82c54a37b1bc2a2829fcc846db65fbc9.jpg)
![lcd_printf.jpg](https://oss-club.rt-thread.org/uploads/2304_77e8cdd17a6c8701dc9b55ec9a26acfd.jpg)
![截图5420.png](https://oss-club.rt-thread.org/uploads/3871_d4dd4923e99cfcaaa11e2e8794747e91.png)
![数据转换.png](https://oss-club.rt-thread.org/uploads/3871_83c14b49f1fd62c1539d420c74aea4ab.png)
查看更多
5
个回答
默认排序
按发布时间排序
bernard
2011-10-21
这家伙很懒,什么也没写!
也可以去实现下RTT的console,这样可以不用做rt_kprintf到printf的转换,然后使用printf [s:158] 不过默认在RTT下还真不能够使用printf (Keil MDK),需要实现一些retarget.c中的函数。实现retarget.c还是非常有好处的,这样可以使用Keil MDK中提供的libc大部分功能,对于程序移植非常有帮助(就好比GNU GCC上实现newlib c库的移植)。 是否还有朋友想和zzm一起来玩rk2706播放器的?他肯定是最好的伙伴与老师了 当然顺带还可以学习下RT-Thread [s:187]
looongway
2012-02-13
这家伙很懒,什么也没写!
非常感谢楼主分享大量的研究结果和心得。有个地方很纠结,就是那个转换函数。 1. 不知道理解对不对,该函数是 将数据 D15D14D13D12 D11D10D9D8 D7D6D5D4 D3D2D1D0 转换成 0000 0000 D15D14D13D12 D11D10 0 0 D9 D8 0 D7 D6 D5 00 D4D3D2D1 D0 000 估计是RGB888的吧?排版很麻烦,请见附图 [attach]886[/attach] 2.不理解为什么配置5420的寄存器(16位,丢掉D0和D9)要换成上述的格式。 根据5420的datasheet(见附图),转换方式应该是D15-D8左移2位,D7-D0左移1位。 3.根据RM970的原理图,D17,16是打乱顺序的,SDK的RK27换屏指南说,18位屏采用全部18根数据线时必须这样连接,纠结这个“必须”,更纠结用这种数据线连接顺序并采用原数据转换方式,配置lcd驱动寄存器又是怎样得到正确的结果的呢? 4.另外能请楼主推荐个单步调试方法,想用来验证一下数据的,不知楼主现在有没有空,能进一步弄出视频就完美了。 向楼主学习。 [attach]885[/attach]
zzm24
2012-02-17
这家伙很懒,什么也没写!
>非常感谢楼主分享大量的研究结果和心得。有个地方很纠结,就是那个转换函数。... 这个没细究,因为我也是拿来主义,直接copy了Rockbox的代码,当然Rockbox rk2706部分也是来自SDK。 关于所说的调试问题,是不可能有单步调试的了,或者说怎么可能有呢?一个rt_kprintf足以。 开源固件的工程个人觉得已经很方便了,配置好了只要点击编译就秒下到播放器并且运行。 关于这播放器的问题,也只能靠记忆了,因为与现在的工作一点也不相干,也会有一段时间(或者更长)与RT-Thread无缘。
aozima
2012-02-17
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
祝楼主工作顺利,常回来看看。
撰写答案
登录
注册新账号
关注者
0
被浏览
9.7k
关于作者
zzm24
这家伙很懒,什么也没写!
提问
12
回答
26
被采纳
0
关注TA
发私信
相关问题
1
[项目]搞个开源的硬件项目
2
硬件计划贴,及时更新,欢迎提意见
3
软件计划贴,及时更新,欢迎提意见::WMA,MOUNT,LWIP等问题急需解决.
4
MMS协议
5
定点的wma解压库-libwma
6
QQ群记录 [20090821]
7
STM32网络收音机PCB报名征集
8
第一版调试记录
9
第二版硬件讨论
10
RADIO项目相关模块规格--欢迎大家自己做板时规格与此兼容,减少重复劳动
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
2
RT-Thread EtherKit开源以太网硬件正式发布
3
如何在master上的BSP中添加配置yml文件
4
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
5
RT-Thread 发布 EtherKit开源以太网硬件!
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
15
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部