如何驱动TFT LCD-yanyuew-ChinaUnix博客

博客访问: 1455037
博文数量: 398
博客积分: 7276
博客等级: 少将
技术积分: 5660
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
一、【一】调试串口的设置
的调式过程经常需要通过trace看log的,trace前需要修改串口,有以下三种方法设置串口
1 通过手机进入模式设置
2 修改代码,修改Nvram_user_config.c中的NVRAM_EF_PORT_SETTING_DEFAULT[]
3.通过META工具修改在
连上meta:左上角选中 NVRAM Editor,在跳出的对话框里选择other LID,再选择NVRAM_EF_PORT_SETTING_LID,接下来read from nvram,对话框右边就会出现串口的设置情况,对调 tst_port_ps(输入0) 和 ps_port(输入99)的值,
二【【二】关于gpio口
Gpio的初始化在gpio_drv.c里,可以用提供的工具配置也可以用代码在里直接操作,二者的选择要看有没有定义宏__CUST_NEW__
工具初始化时要注意配置codegen.dws,该文件里配置的只是对gpio口的初始化,并不是所有的gpio口都要设置成工作时的模式,尤其是当作时钟和蓝牙部分的gpiio口,初始化时就设置成工作模式的话会造成电机电流过大的。
代码初始化时DRV_WriteReg()、DRV_Reg对gpio口寄存器操作,分别定义gpio口的模式,和方向(0:输入;1:输出),对单个gpio口操作用到以下函数(以gpio25为例):
GPIO_ModeSetup(25, 0);
设置GPIO25为模式0
GPIO_InitIO(1,25);
初始化GPIO25方向为输出
GPIO_WriteIO(0, 25 );
设值GPIO25输入低电平0
三、【三】键盘设置
1)键盘定义Keypad_def.c
如果定义 CUST_NEW,工具中的键盘定义对应在改文件里的 KEYPAD_MAPPING(keypad_drv.h);
2)硬件键盘定义与mmi键盘的对应 nKeyPadMap[]( Keybrd.c)
3)工程模式键盘测试函数EntryFMKeypadTest()
修改键盘测试时界面显示的键的名称
1. 做好上面的第一第二两步
2. FactoryModeSrc.c开始部分定义添加的键所要显示的名称,值,分别到keypad_layout[](确定要显示的位置),keypad_value[]
3.在EntryFMKeypadTest()函数中的数组IdleScreenDigits[]里添加要显示的键
4)如果要设置一个键不管在什么界面下都起作用的话(如手电筒开关或则其他需求)就需要在键盘的事件响应函数static void KeyEventHandler(KEYBRD_MESSAGE *eventKey)里设置,根据键值条用相应的响应函数,不过该函数及时在锁屏状态下也会执行的,需要根据需要添加条件语句
四、关于LCD
lcm背光驱动分为两种控制方式:
1. pwm这个是通过调占空比来调节亮度的持续信号;
2. PFM这个是通过脉冲的个数来控制LCM背光亮度。这个会有很小的几率造成亮度调节出错。在送多个脉冲的过程中不能保证不会出现什么中断什么的异常情况
Lcd相关函数
void init_lcd_interface(void) :函数
DRV_Reg(DRVPDN_CON1) &= (~DRVPDN_CON1_LCD); // 上电
set_lcd_driving_current(LCD_DRIVING_4MA); //模块电流(驱动能力)
SET_LCD_PARALLEL_CE2WR_SETUP_TIME(3);
SET_LCD_PARALLEL_CE2WR_HOLD_TIME(3);
SET_LCD_PARALLEL_CE2RD_SETUP_TIME(0);
SET_LCD_PARALLEL_WRITE_WAIT_STATE(5);
SET_LCD_PARALLEL_READ_LATENCY_TIME(0);
SET_LCD_ROI_CTRL_CMD_LATENCY(4);
设置cld的读写时序;
& && &&&该函数里的东西在更换lcd时一般是不用修改的,但对于对时序要求比较严的芯片时序不对会引起白瓶的
LCD_Init_HX8306A():初始化,该函数进行对lcd芯片的初始化
LCD_Init_HX8306A();块写操作,定义每次刷屏的区域
LCD_EnterSleep_HX8306A():进入休眠设置,一般进行关电源,关显示的操作使屏进入睡眠状态
LCD_ExitSleep_HX8306A():睡眠唤醒函数,注意在休眠函数里设置过的寄存器在该函数里要重新设置成初始化时的值
如果屏幕显示全部正常,只是倒了180°翻转GS
初始化里的延时太短会出现闪白屏现象,太长可能开不了机
& && &&&涉及gpio口
gpio_fm_i2c_scl_pin(I2C时钟信号)
gpio_fm_i2c_sda_pin(I2C数据信号)
I2C协议的时钟线和数据线要接上拉电阻,分别上拉, 有问题的时候先从fm芯片的电压和i2c信号量起,供电不够导致芯片不能正常工作,用了厂家提供的代码,i2c成功的话,软件就该没有什么问题了,
2、设置FM 默认频道的个数
NVRAM_EF_FM_RADIO_CHANNEL
3、手动收台可以收到台,自动搜索收不到台,可能因为上拉电阻阻值不合适,导致芯片读操作不正常
更换fm芯片:
修改make文件中FM_RADIO_CHIP定义fm芯片类型
修改option.mak文件中与FM_RADIO_CHIP相关的,主要是修改所的文件夹,有些根据FM_RADIO_CHIP定义文件夹就不用修改了有的会被写死,这种情况下要手动修改一下
2)FM的驱动文件添加到相应的文件里,修改其中的gpio口
3) 修改make\fm_drv\fm_drv.lis把新加的驱动文件添加进去
4)编译是如果出现找不到MT6188A1.obj文件,需要删除MCU\mtk_lib\MT6225\S00\gprs\fm_drv.lib重新remake就可以了
六、camera
涉及gpio口
SCCB_SERIAL_CLK_PIN
(I2C时钟信号)
SCCB_SERIAL_DATA_PIN
(I2C数据信号)
gpio_camera_reset_pin
gpio_camera_cmpdn_pin
gpio_camera_power_en_pin
像fm一样先要调试同通信过程,如果通信成功没有图像测试sensor的输入信号(如mclk)和输出信号(如pclk,桢同步,场同步信号);图像出来之后效果方面一般都是有fae帮忙调的,尤其是色彩方面的效果,下面简单列出偶之前遇到过的情况仅供参考一下
镜像(图像左右反)、翻转(图像上下反):这种情况可以通过修改sensor寄存器进行修改,有的sensor(如ov7670)只需要设置一位寄存器就好了,有的sensor在修改该寄存器位的时候会引起数据格式的改变,造成图像模糊色彩错乱,这时需要通过SET_CAMERA_INPUT_ORDER(INPUT_ORDER_CbYCrY1)相应的修改数据格式,也可以通过修改sensor修改数据格式,具体通过什么语句修改数据格式要看具体的版本和代码
& &对于做双摄像头的,要根据选择的摄像头对sensor镜像位进行不同的设置
& &也要控制好两个摄像头的powdown,否则前后摄像头会有干涉
图像模糊色彩不对,可能因为摄像头连接不好造成的也能能因为gpio口模式不对造成的,在使用配置文件工具里的INV 表示取反,如果作为摄像头数据线的gpio口在此选项打了对钩导致摄像头数据有问题,进入摄像头显示花屏
预览时有滚动的水波纹,可以通过设置sensor寄存器修改频率,也可以通过修改dummy_pixels,dummy_lines进行改善
预览分屏可以通过设置sensor寄存器修改频率,也可以把默认频率设置为50HZ
涉及gpio口
gpio_bt_power_pin
gpio_bt_reset_pin
gpio_bt_32k_pin
gpio_bt_urxd3_pin
gpio_bt_utxd3_pin
gpio_bt_pcmclk_pin
gpio_bt_pcmout_pin
gpio_bt_pcmin_pin
gpio_bt_pcmsync_pin
Mtk蓝牙这部分的代码的透明度不是很高,蓝牙容易造成待机电流大的问题
主要注意gpio口的初始化,尤其在使用工具配置gpio口的情况下不要在工具里就把蓝牙相关gpio口定义成gpio口模式就可以了,不要定义成功作模式,不用工具配置的话对蓝牙的配置函数在文件bt_common_config.c里,具体在数组const unsigned char bt_gpio_setting[16]里定义用哪一个gpio口
1. 基带(MT6225)与T卡相连管脚K15(GPIO44 MCWP) K16(GPIO45 MCINS)必须设置成模式1(硬上都要接地),否则不能T卡写保护不能向上写东西
2.T卡的mcck接在基带(MT6223)的U3脚上,该脚默认为BPI_BUS3,修改该管脚的模式修改基带寄存器ACIF_CON0的高两位的值,(也可以把BPI_BUS3用作mcck)
3. T卡热插拔控制宏
__MSDC_TFLASH_DAT3_1BIT_HOT_PLUG__
涉及gpio口
gpio_usb_enable_pin
usb_custom.c中函数void USB_PowerControl(kal_bool enable)注意gpio_usb_enable_pin的操作,否则会引起USB连上后,电脑不识别,找不到T卡;不同的硬件对USB的供电模式可能不一样,也不一定都会用到这个gpio口
供电不够会导致芯片没有正常工作以至找不到
log图片为bmp格式的,如果改成gif格式会导致meta连不上天线不能校准
flash类型不对也会导致meta连不上天线不能校准
射频文件l1d_custom_rf.h文件,对照原理图,主要配置BPI_BUS0到BPI_BUS9。打开顺序按如下步骤进行配置:PT2B是让6139开始工作,PT1是打开PA,pt2是打开天线开关,pt3是关闭所有射频。PA和天线开关分立的和整合的都应该按照以上顺序进行配置
十一、触摸屏TP
涉及gpio口
gpio_tp_spi_busy_pin
gpio_tp_spi_cs_pin
gpio_tp_spi_din_pin
gpio_tp_spi_clk_pin
gpio_tp_spi_dout_pin
触摸屏校准流程
touch_excute_cali()
touch_panel_adc_to_coordinate()
adc值转化为屏幕坐标
touch_panel_check_cali_stage1()& &&&
touch_panel_check_cali_stage2()
touch_panel_check_cali_stage3()& &&&判断测试三点
touch_panel_check_cali()& && &&&最终判决校准是否通过
HAND_WRITING_MAX_OFFSET,加大该值可以解决手写时划线划的快的话后半截笔画显示不出来的问题
十二、不能开机的可能原因
1.bin 文件超出
2.flash 不对
3.kcol6 公共开机键定义不对
4.23C平台需要在gpio_drv.c里打开camera的电源,否则编出来的也是开不了机的
5.打开触摸屏而不定义触摸中断会因assert引起开不了机
6.双卡版本6302的三个脚必须设置成模式1,否则重复重起,不停的循环显示logo
7.在nvrame里添加新的LID,logical_data_item_table_cust[]不能有#ifdefined
#endif,否则开机到显示完logo就死机
8.驱动不对
阅读(17903) | 评论(0) | 转发(7) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。【图文】TFT-LCD信号驱动动作示意图_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
TFT-LCD信号驱动动作示意图
大小:110.99KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢博客访问: 181235
博文数量: 73
博客积分: 5000
博客等级: 大校
技术积分: 665
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
linux内核引导参数
1.“boot=”  此参数指明包含引导扇区的设备名(如:/dev/had),若此项忽略,则从当前的根分区中读取引导扇区。
2.“root=”  此参数告诉内核启动时以哪个设备作为根文件系统使用,其设定值为构造内核时根文件系统的设备名,可用的设备名有:  (1)/dev/hdaN~/dev/hddN:ST-506兼容硬盘,a到d上的N个分区  (2)/dev/sdaN~/dev/sdeN:SCSI兼容硬盘,a到e上的N个分区  (3)/dev/xdaN~/dev/xdbN:XT兼容硬盘,a到b上的N个分区  (4)/dev/fdN:软盘,A:(N=0)或B:(N=1)  (5)/dev/nfs:由网络取得根文件系统的标志
3.“nfsroot=”  若需通过NFS提供根文件系统来引导无盘工作站,此参数为内核指定了网络根文件系统所在的机程序、目录及NFS,其格式为:nfsroot=(〈server_ip〉:)〈root_dir〉(,nfs_options〉)
4.“nfsaddrs=”  设定网络通讯所需的各种网络界面地址,如无此参数,则内核会试图用反向地址解析协定(RARP)或启动协定(BOOTP)找出这些参数,其格式为:  nfsaddrs=〈客户端IP〉:〈服务端IP〉:〈网关IP〉:〈子网屏蔽〉:〈客户端名称〉:〈网络设备名 〉:〈auto〉
5.“image=”  指定Linux的内核文件。6.“delay=”  设定引导第一个映像前的等待时间。7.“disk=”  此参数为某一特殊的硬盘定义非标准参数。8.“append=”  为内核传递一个可选的参数行,其典型的应用是为不能完全由系统自动识别的硬盘指定参数,如:append = "hd=64,32,202"
9.“label=”  此参数为每个映像指定一个名字,以供引导时选择。10.“read-only”  设定以只读方式挂入根文件系统,用于文件系统一致性检查(fsck)。
11.“install=”  安装一个指定文件作为新的引导扇区,缺省为/boot/boot.b。
12.“loader=”  说明所使用的链加载程序(chain loader),缺省为/boot/chain.b,如果不是从首硬盘或软盘启动,那么,此选项必须说明。
13.“table=”  说明包含分区表的设备名,如果此参数忽略,引导加载程序将不能传递分区信息到已引导的操作系统。
14.“init=”  内核初始化时执行的程序,通常过程为init、getty、rc和sh,版本1.3.43以来的Linux内核能够执行/sbin/init说明的命令行,若在引导过程中出现问题,则可设置init=/bin/sh直接跳到Shell。
15.“ramdisk_start=”  由于内核不能放在压缩的内存文件系统映像内,为使内核映像能够和压缩的内存映像放在一张软盘内,加入“ramdisk_start=〈offset〉”,这样内核才能开始执行。
16.“mem=”  此参数的目的之一是为Linux指定使用的内存数量:如mem=96MB,目的之二是指定mem=nopentium告诉内核不要使用4MB分页表。
17.“vga=”  设置显示模式,如80×50、132×44等。
18.“linear=”产生用于替换硬盘sector/head/cylinder地址(硬盘几何参数)的linear扇区地址。linear地址在运行时产生并且不依赖于硬盘几何参数。某些SCSI硬盘和一些以LBA方式使用的IDE硬盘可能会需要使用这个参数。
19.“prompt=”给出“boot:”提示,强制bootloader等待用户的键盘输入,按下回车键则立即 引导默认的操作系统,而按下Tab键则打印可供选择的操作系统。当“prompt”被设置而“timeout”没有被设置时,系统会一直处于等待状态而不引导任何操作系统。不设置该参数时,bootloader不给出“boot:”提示而直接引导默认操作系统,除非用户按下了Shift、Ctrl、Alt三键中的任何一个。
20.“timeout=”设置等待键盘输入的时长,单位是0.1秒。超过这段时间没有输入则为超时,系统将自动引导缺省的操作系统。如果不设置本参数,缺省的超时时间长度为无穷大。
21.“other=”设置包含非Linux操作系统,如DOS、SCO UNIX、Windows 95等系统引导映像的文件或设备。
22.”alias=name”
&&& 给当前操作系统起一别名。
注:红色为经常使用的!
阅读(292) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。博客访问: 704853
博文数量: 323
博客积分: 10026
博客等级: 上将
技术积分: 3430
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
CLK LCD LCD
CLK = (HCLK)/((CLKDIV+1)*2)
HCLK /2CLKDIVLCD
TFT LCD s3c2410
datasheetlcd lcd
阅读(1095) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。博客访问: 235021
博文数量: 73
博客积分: 5000
博客等级: 大校
技术积分: 705
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
栈由编译器自动分配释放管理。局部变量及每次函数调用时返回地址、以及调用者的环境信息(例如某些机器寄存器)都存放在栈中。新被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,C函数可以递归调用。堆需要由程序员分配释放管理,若程序员不释放,程序结束时可能由OS回收。通常在堆中进行动态存储分配。& 非初始化数据段通常将此段称为b s s段,这一名称来源于早期汇编程序的一个操作符,意思是“block started by symbol(由符号开始的块)”,未初始化的全局变量和静态变量存放在这里。在程序开始执行之前,内核将此段初始化为0。函数外的说明:long sum[1000] ; 使此变量存放在非初始化数据段中。& 初始化的数据通常将此段称为数据段,它包含了程序中需赋初值的变量。初始化的全局变量和静态变量存放在这里。例如,C程序中任何函数之外的说明:int maxcount = 99; 使此变量以初值存放在初始化数据段中。& 正文段C P U执行的机器指令部分。通常,正文段是可共享的,所以即使是经常环境指针环境表环境字符串执行的程序(如文本编辑程序、C编译程序、s h e l l等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外事故而修改其自身的指令。& 对于x86处理器上的Linux,正文段从0x单元开始,栈底在0xC0000000之下开始(栈由高地址向低地址方向增长)。堆顶和栈底之间未用的虚拟空间很大。& Shell的size命令可以看到一个程序的正文段(text)、数据段(data)、非初始化数据段(bss)及文件长度.[foxman@17:01:49 ]$size mydesign&& text&&& data&&&& bss&&&& dec&&&& hex filename& 79210&&& 1380&&&& 404&& 80994&& 13c62 mydesign& 堆与栈的区别由以下几点:& &&& 管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。&&& 空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M。当然,可以修改:&&& &&& 打开工程,依次操作菜单如下:Project-&Setting-&Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。注意:reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。& 碎片问题:对于堆来讲,频繁的new/delete势
必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至
于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。& 生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。& 分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。& 分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。& &&& 从这里可以看到,堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。&&& 虽然栈有如此众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。无论是堆还是栈,都要防止越界现象的发生,因为越界的结果要么是程序崩溃,要么是摧毁程序的堆、栈结构,产生以想不到的结果.& 来源:1.《UNIX环境高级编程》第3版2.http://www.52blog.net/user1/3843/archives/.shtml
阅读(2157) | 评论(0) | 转发(0) |
上一篇:没有了
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 yanyuebbs 的文章

 

随机推荐