LINUXLCD

合集下载

单片机和linux嵌入式操作系统区别

单片机和linux嵌入式操作系统区别

单片机和linux嵌入式操作系统区别随着嵌入式行业硬件平台的性能增强,项目需求和功能日益复杂,ARM公司推出的 CORTEX-M3,更是让以往做单片机的工程师在芯片和技术选型面临两难选择,本专题将从芯片价格、整个系统的硬件软件设计及维护的成本等各个方面给您提供一个参考,并从技术角度分析单片机和带操作系统的系统的软件开发的异同点。

● 1.单片机与ARM等新处理器的价格比较● 2.带操作系统与不带操作系统的软件开发的区别● 2.1.驱动开发的区别● 2.2.应用程序开发的区别1. 单片机与ARM等新处理器的价格比较表1自己不熟悉的芯片和技术,最后的成本也可能更高。

2. 带操作系统与不带操作系统的软件开发的区别用通俗的话来说,一个处理芯片不运行操作系统,我们就把它称为单片机,而单片机编程就是写裸板程序,这个程序直接在板子上运行;相对的,另一种程序就是基于操作系统的程序,说得简单点就是,这种程序可以通过统一的接口调用“别人写好的代码”,在“别人的基础上”更快更方便地实现自己的功能。

2.1. 驱动开发的区别驱动开发的区别我总结有两点:能否借用、是否通用。

2.1.1 能否借用基于操作系统的软件资源非常丰富,你要写一个Linux设备驱动时,首先在网上找找,如果有直接拿来用;其次是找到类似的,在它的基础上进行修改;如果实在没有,就要研究设备手册,从零写起。

而不带操作系统的驱动开发,一开始就要深入了解设备手册,从零开始为它构造运行环境,实现各种函数以供应用程序使用。

举个例子,要驱动一块LCD,在单片机上的做法是:①首先要了解LCD的规格,弄清楚怎么设置各个寄存器,比如设置LCD的时钟、分辨率、象素②划出一块内存给LCD使用③编写一个函数,实现在指定坐标描点。

比如根据x、y坐标在这块内存里找到这个象素对应的小区域,填入数据。

基于操作系统时,我们首先是找到类似的驱动,弄清楚驱动结构,找到要修改的地方进行修改。

下面是单片机操作LCD的代码:①初始化:void Tft_Lcd_Init(int type){/** 设置LCD控制器的控制寄存器LCDCON1~5* 1. LCDCON1:* 设置VCLK的频率:VCLK(Hz) = HCLK/[(CLKVAL+1)x2]* 选择LCD类型: TFT LCD* 设置显示模式: 16BPP* 先禁止LCD信号输出* 2. LCDCON2/3/4:* 设置控制信号的时间参数* 设置分辨率,即行数及列数* 现在,可以根据公式计算出显示器的频率:* 当HCLK=100MHz时,* Rate =1/[{(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)}x* {(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)}x * {2x(CLKVAL+1)/(HCLK)}]* = 60Hz* 3. LCDCON5:* 设置显示模式为16BPP时的数据格式: 5:6:5* 设置HSYNC、VSYNC脉冲的极性(这需要参考具体LCD 的接口信号): 反转* 半字(2字节)交换使能*/LCDCON1 = (CLKVAL_TFT_320240<<8) | (LCDTYPE_TFT<<5) | \(BPPMODE_16BPP<<1) | (ENVID_DISABLE<<0);LCDCON2 = (VBPD_320240<<24) |(LINEVAL_TFT_320240<<14) | \(VFPD_320240<<6) |(VSPW_320240);LCDCON3 = (HBPD_320240<<19) | (HOZVAL_TFT_320240<<8) | (HFPD_320240);LCDCON4 = HSPW_320240;// LCDCON5 = (FORMAT8BPP_565<<11) | (HSYNC_INV<<9) | (VSYNC_INV<<8) | \// (HWSWP<<1);LCDCON5 = (FORMAT8BPP_565<<11) |(HSYNC_INV<<9) | (VSYNC_INV<<8) | (VDEN_INV << 6) | \(HWSWP<<0);/** 设置LCD控制器的地址寄存器LCDSADDR1~3* 帧内存与视口(view point)完全吻合,* 图像数据格式如下:* |----PAGEWIDTH----|* y/x 0 1 2 239* 0 rgb rgb rgb ... rgb* 1 rgb rgb rgb ... rgb* 1. LCDSADDR1:* 设置LCDBANK、LCDBASEU* 2. LCDSADDR2:* 设置LCDBASEL: 帧缓冲区的结束地址A[21:1]* 3. LCDSADDR3:* OFFSIZE等于0,PAGEWIDTH等于(240*2/2)*/LCDSADDR1 = ((LCDBUFFER>>22)<<21) |LOWER21BITS(LCDBUFFER>>1);LCDSADDR2 = LOWER21BITS((LCDBUFFER+ \(LINEVAL_TFT_320240+1 )*(HOZVAL_TFT_320240+1)*2)>>1);LCDSADDR3 = (0<<11) | (LCD_XSIZE_TFT_320240*2/2);/* 禁止临时调色板寄存器 */TPAL = 0;fb_base_addr = LCDBUFFER;bpp = 16;xsize = 320;ysize = 240;}②描点:/** 画点* 输入参数:* x、y : 象素坐标* color: 颜色值* 对于16BPP: color的格式为0xAARRGGBB (AA = 透明度),* 需要转换为5:6:5格式* 对于8BPP: color为调色板中的索引值,* 其颜色取决于调色板中的数值*/void PutPixel(UINT32 x, UINT32 y, UINT32 color){UINT8 red,green,blue;switch (bpp){case 16:{UINT16 *addr = (UINT16*)fb_base_addr + (y * xsize + x);red = (color >> 19) & 0x1f;green = (color >> 10) & 0x3f;blue = (color >> 3) & 0x1f;color = (red << 11) | (green << 5) | blue; // 格式5:6:5*addr = (UINT16) color;break;}case 8:{UINT8 *addr = (UINT8 *)fb_base_addr + (y * xsize + x);*addr = (UINT8) color;break;}default:break;}}下面是在Linux的LCD驱动里修改的地方(arch\arm\mach-s3c2440\mach-smdk2440.c):/* 320x240 */static struct s3c2410fb_mach_info smdk2440_lcd_cfg__initdata = {.regs = {.lcdcon1 = S3C2410_LCDCON1_TFT16BPP | \S3C2410_LCDCON1_TFT | \S3C2410_LCDCON1_CLKVAL(0x04),.lcdcon2 = S3C2410_LCDCON2_VBPD(1) | \S3C2410_LCDCON2_LINEVAL(239) | \ S3C2410_LCDCON2_VFPD(5) | \S3C2410_LCDCON2_VSPW(1),.lcdcon3 = S3C2410_LCDCON3_HBPD(36) | \S3C2410_LCDCON3_HOZVAL(319) | \S3C2410_LCDCON3_HFPD(19),.lcdcon4 = S3C2410_LCDCON4_MVAL(13) | \S3C2410_LCDCON4_HSPW(5),.lcdcon5 = S3C2410_LCDCON5_FRM565 |S3C2410_LCDCON5_INVVLINE |S3C2410_LCDCON5_INVV |S3C2410_LCDCON5_INVVDEN |S3C2410_LCDCON5_PWREN |S3C2410_LCDCON5_HWSWP,},.gpccon = 0xaaaa56aa,.gpccon_mask = 0xffffffff,.gpcup = 0xffffffff,.gpcup_mask = 0xffffffff,.gpdcon = 0xaaaaaaaa,.gpdcon_mask = 0xffffffff,.gpdup = 0xffffffff,.gpdup_mask = 0xffffffff,.fixed_syncs = 1,.type = S3C2410_LCDCON1_TFT,.width = 320,.height = 240,.xres = {.min = 320,.max = 320,.defval = 320,},.yres = {.max = 240,.min = 240,.defval = 240,},.bpp = {.min = 16,.max = 16,.defval = 16,},};这并不表示代码Linux的驱动程序就比单片机的驱动程序好写,怎么在几万个文件中找到要修改的代码,这也是需要艰苦的学习的。

LCD管脚配置为GPIO功能方法

LCD管脚配置为GPIO功能方法

LCD管脚配置为GPIO功能方法在嵌入式linux系统中,LCD引脚往往被linux内核所占用,无法当作GPIO使用。

但如果有时需要把LCD引脚当作GPIO使用呢?本文就来教给你配置的相关方法。

一、开发环境1.开发主机环境:Ubuntu 12.04(64位)、arm-fsl-linux-gnueabi-gcc系列交叉工具链。

2.硬件清单:EPC-287C-L工控主板。

3.软件资源:产品光盘资料:EPC-28x-L V1.02;内核源码包:linux-2.6.35.3.tar.bz2。

二、原理概述EPC-287C-L的LCD管脚支持功能复用,通过修改内核配置,可以将这些管脚复用为GPIO功能。

一、技术实现注意:在开始进行下面的操作之前,请首先确认 ubuntu 主机的开发环境已经搭建好。

如需了解这方面的内容,请参考产品光盘资料中的《EPC-28x-L 用户手册_V1.09》第4.1节。

将linux-2.6.35.3.tar.bz2源码包复制到ubuntu系统的“~/”目录,将其解压后可得到linux-2.6.35.3目录,参考命令如下:vmuser@Linux-host:~$ tar -jxvf linux-2.6.35.3.tar.bz2进入linux-2.6.35.3目录,执行build-kernel脚本,参考命令如下:vmuser@Linux-host:~$ cd linux-2.6.35.3vmuser@Linux_host:~/ linux-2.6.35.3$ ./build-kernel此时终端将会打印如图所示的可接受选项,输入数字“3”选择为EPC-M28x编译内核。

在编译的过程中,需要用户确认两个选项,此时按照下面红色字体所示输入后等待编译完成即可:choice[1-4]: 4half open source (BSP_HALFOPENSOURCE) [Y/n] (NEW) Y(回车)vectors address (VECTORS_PHY_ADDR) [0] 0System Timer support Compare Match interrupt (MXS_TIMER_WITH_MACH) [Y/n] y Memory type is mDDR (MEM_mDDR) [N/y/?] nDMA memory zone size (DMA_ZONE_SIZE) [16] 16** Wireless LAN*Wireless LAN (WLAN) [Y/n/?] yUSB ZD1201 based Wireless device support (USB_ZD1201) [N/m/y/?] nIEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP) (HOSTAP) [N/m/y/?] n Atheros AR600x support (non mac80211) (ATH6K_LEGACY) [N/m/y/?] nBroadcom 4329/30 wireless cards support (BCMDHD) [N/m/y/?] (NEW) N(回车)编译完成后,终端返回命令行提示符,此时输入make menuconfig命令进入内核配置界面,如图所示在配置首页“Linux Kernel Configuration”中进入“Device Drivers”,再进入“Graphics support”菜单中,取消该菜单页的所有编译选项支持,如图所示退出并保存内核配置,然后输入如下所示命令,重新编译uImage。

基于嵌入式Linux的TFT LCD IP及驱动的设计

基于嵌入式Linux的TFT LCD IP及驱动的设计

{ 因版 面有限 ,本文 已做部 分删 节 ,完 整 版 请 登 陆 W W. p c r. W e w. n c e o n查 闽1
维普资讯
I 目辑 l 怡 莫欣 栏 编
FF IO模块实现

。 Ae 国大学生电子设计竞赛 lr中 ta
高校 园
处开始读取数据 ,并按照 T 的格式输出。图 实现 f 中各模块 由 A ao u 连接在一起。A ao v lnB s v ln AvlnB s MA Matr ao u D s 负责按照控制模 e
B s 一种 简单 的 总 线 结构 ,N o 处理 器 和 块的指令 ,读取 S AM 中的数据 ,并写入到 u是 is I I DR
4 0×2 ye, G 5 5 i存入帧缓冲 , 8 B ts R B 6 ,1bt 6 ) 然 用于控 制 L D控 制器的工作和指示其 工作状 C 后将帧缓冲的首地址写入到L D控 制器 , C 并启 态 。
动 L D控 制器 。 控 制器 自动从 传 来 的首 地 址 C 该
A ao u A Ma tr v lnB sDM se主设备接 口模块
各种外设都是通过 A a nB s 接在一起。由 FF 中 ,其 核 心 部分 是 D A地址 累加 器 。 当 vl u 连 o IO M
图 1 以 看 出 , 为 Sae的 S A C n ol 条 件 满 足 时 ,地 址 累加 器 开 始 在 10 z 时 可 作 l r DR M o t l r v r e 0 MH 的 分 别要 受 到 Poesr C o t l r 控 制 , 钟 下 以 4 为 单 位 开 始 累 加 用 于 生 成 读 取 rc s 和L DC n ol 的 o r e

几种GUI比较

几种GUI比较

几种嵌入式GUI介绍一、MicroWindowsCentury软件公司维护的,较早出现的开放源代码的嵌入式嵌入式GUI特点:1主要特色:提供较为完善的图形功能,支持多种外部设备输入,包括LCD、鼠标和键盘等。

2核心是基于显示设备接口的,绝大部分使用C语言开发的,移植性很强。

3主要在linux、wince等操作系统上运行。

4对硬件资源的需求:文件存储空间:100k-600k输入输出接口:支持frambuffer ,支持每像素1、2、4、8、16、24、32.支持彩色和灰度显示。

支持鼠标、键盘、触摸屏。

CPU:支持intel 16位32位,MIPS R4000、ARM。

二、Qt/Embedded(简称QtE)QtE是一个专门为嵌入式系统设计图形用户界面的工具包,挪威Trolltech 公司产品。

1995年正式发行第一个版本Qt0.9。

Linux桌面系统的KDE 就是基于Qt库开发的,Qt与linux操作系统的兼容性最好。

特点:1主要特色:支持多种平台,移植时只需重新编译代码而不需要对代码进行修改。

2模块化,可剪裁,极其适合嵌入式系统的“小而快”的要求。

3用C++编写,为开发者提供清晰的框架。

4 For free 版本代码完全开放。

三、uc/GUIuC/GUI是一个通用的嵌入式应用的图形模块,它是美国Micrium公司开发的一种高效的、与处理器和LCD控制器独立的通用GUI,可以适用各种CPU和LCD,uC/GUI完全以ANSI-C编写,因此它与处理器无关,在单任务和多任务操作系统都可以很好的应用、可以很方便地移植到不同的操作系统和嵌入式微处理器上,并可支持不同尺寸的图形液晶显示器。

它采用层次化的设计,功能强大,移植方便,被广泛地应用于嵌入式领域,如PDA、机顶盒以及DVD NCD播放机等(1)支持任何8位、16位和32位的CPU,只要求CPU具有相应的ANSI-C编译器即可;(2)所有硬件接口定义都使用可配置的宏;(3)字符、位图可显示与LCD的任意点,并不限制与字节长度的整数倍数地址;(4)所有程序在长度和速度方面都进行了优化,结构清晰;(5)对于慢速的LCD控制器,可以使用缓冲存储器减少访问时间,提高显示速度。

1.8寸LCD模块用户手册说明书

1.8寸LCD模块用户手册说明书

1.8inch LCD ModuleUSER MANUALOVERVIEWThis product is 1.8inch resistive screen module with resolution 128x160. It has internal controller and uses SPI interface for communication. It has already basic functions: setting the point size, the line thickness, drawing circle, rectangle, and displaying English characters.We provide Raspberry Pi, STM32 and Arduino routines for this product.FEATURESDisplay type: TFTInterface: SPIDriver: ST7735SColors: 256KResolution: 128 x 160 (Pixel)Product size: 56.5 x 34(mm)Display size: 35.4(W) x 28.03(H)(mm)Pixel size: 0.219(W) x 0.219(H)(MM)Operating temperature: -30°C ~ 85°CINTERFACE DESCRIPTIONMarking Description3V3 3.3V powerGND groundDIN SPI data inputCLK SPI clockCS chip selectDC data/commandRST resetBL back lightPROGRAM ANALYSIS1.Working principles:ST7735S is 132 x 162 pixels LCD panel, but the product is 128 x 160 pixels LCD display.In the display there are two processes: the horizontal direction scanning – from the 2nd pixel, the vertical direction scanning – from the 1st pixel. So, you can see that positions of pixels in RAM correspond to their actual positions while displaying.The LCD supports 12-bit, 16-bit and 18-bit per pixel input formats. They correspond to RGB444, RGB565 and RGB666 color formats. This routine uses the RGB565 color format, which is commonly used.LCD uses 4-wired SPI communication interface, which can save a lot of GPIO ports and provides fast data transfer to LCD as well.munication protocolNote: there is a difference from traditional SPI. Here we only need display, so sine wires come from slave to host are hidden. The detailed information please refer to datasheet at page 58RESX: Reset. Pull-down while powering on the module. Generally set as 1IM2: data communication mode pin, which define usage of SPICSX: chip selection control pin. If CS=0 – the chip is selectedD/CX: data/command control pin, if DC=0 – command is written, otherwise – data are writtenSDA: transmitted RGB dataSCL: SPI clockThe SPI communication protocol of the data transmission uses control bits: clock phase (CPHA) and clock polarity (CPOL):The value of CPOL determines the level when the serial synchronous clock is in idle state. CPOL=0, that its idle level is 0.The value of CPHA determines the timing of the data bits relative to the clock pulses. CPHA=0, data is sampled at the first clock pulse edge.The combination of these two parameters provides 4 modes of SPI data transmission. The commonly used is SPI0 mode, it is that GPOL=0 and CPHA=0.From the figure above, SCLK begins to transfer data at the first falling edge. 8 bits data are transferred at one clock period. Use SPI0 mode, High bits transfer first, and LOW bits following. DEMO CODERaspberry Pi, STM32 and Arduino programs are provided, wherein Raspberry Pi provides BCM2835, WiringPi and python programs. It implements common graphical functions as drawing dot, line, rectangle, circle, setting their sizes and line with; filling arias, and displaying English characters of 5 common fonts and other display’s functions.Following instructions are offered for you convenienceRASPBERRY1.Hardware connection1.8inch LCD module Raspberry Pi3.3V 3.3VGND GNDDIN MOSI (PIN 19)CLK SCLK (PIN23)CS CE0 (PIN 8)DC GPIO.6 (PIN 22)RST GPIO.2 (PIN13)BL GPIO.5 (PIN18)2.Enable SPI function of the Raspberry Pisudo raspi-configSelect: Advanced Options -> SPI -> yesActivate SPI hardware driver.3.Installation of librariesFore detailed information about libraries installation, please refer to this page:https:///wiki/Libraries_Installation_for_RPiIt is description of WiringPi, bcm2835 and python libraries installation.ageBCM2835 and WiringPi program should be only copied into directory of Raspberry Pi ()by samba or directly copy to the SD card). The following code are compied directly to the user directory of Pi.4.1Usage of BCM2835Run ls command as you can see below:bin: contains “.o” files.We don’t need to change it generallyFonts: contains 5 commonly used fontsPic: contains pictures used for displaying. The resolution of pictures must be 128x128,otherwise they cannot be displayed properly. And the format of pictures must be BMP.Obj: contains object files, like main.c, LCD_Driver.c, DEV_Config.c, LCD_GUI.c and theirheader files.main.c: The mian function. What need to note is that even though there are LCD_ScanDir used to control the direction of scanning, you need not to change it. Because this module is designed for Raspberry Pi, and for compatibility, we don’t recommend you to change it.DEV_Config.c:Definations of Raspberry Pi’s pins and the communication mode.LCD_Driver.c: Drive code of LCD. Need not change generally.LCD_BMP.c: Reading and analyzing BMP files and display themMakefile: This file contains compilation rules. If there are some changes in code, please run make clean to clean all the dependency file and executable files. Then execute make to compile the whole project and generate new executable files.tftlcd_1in8: executable file, generated by command makeTo run the program, you just need to run this command on terminal: sudo ./tftlcd_1in8 4.2WiringPiInput ls command, now you can see following:T he folders is similar to BCM2835’s. The only differences are that:1.WiringPi oprates by read/write the device files of Linux OS. and the bcm2835 is libraryfunction of Raspberry Pi’s CPU, it operates registers directly. Thus, if you have usedbcm2835 libraries firstly, the usage of WiringPi code will be failed. In this case, you just need to reboot the system and try again.2.Due to the first difference, they underlying configuration are different. In DEV_Config.c,use wiringpiPi and the corresponding wiringPiSPI to provide underlay interfaces.The program executed by command sudo ./tftlcd_1in8 as well4.3PythonInput ls command, you can see that:LCD_1in8.py: Driver code of LCDLCD_Config.py: configuration of hardware underlaying interface.Executing program: sudo python LCD_1in8.pyNote: Some of the OS don’t have image libraries. In this case, you can run: sudo apt-get install python-imaging to install the image library.Image is an image processing library of python, represents any image by an image object.Thus, we can create a blank image by new, its size must be same as the display size of LCD.Then draw picture by Draw library, finally, transfer the image to the LCD. Here usingImage.load() too read RGB888 data of pixel, and convert to RGB565. Scanning every pixel then we could get the whole image for displaying. Its most important code is as below:5.Auto-runInitialize autorun in Raspberry Pi by configuring code of /etc/rc.local file:sudo vim /etc/rc.localBefore exit0 add:sudo python /home/pi/python/demo.py &Important: to place the program /home/pi/python/demo.py at the same director, you can input command pwd to get the path. And & character is necessary at the end of command line, otherwise probable need to reinstall the system (impossible terminate the process by pressing ctrl+c, impossible to login with pi user permission).STM32This demo uses XNUCLEO-F103RB developing board and is based on HAT library.1.Hardware connection1.8inch LCD XNUCLEO-F103RBVCC 3V3GND GNDDIN PA7CLK PA5CS PB6DC PA8RST PA9BL PC72.Expected resultProgram the demo into the development Board. Firstly the screen is refreshed completely, then a solid line, dashed line, open circle, solid circle, rectangle, solid torque are drawn and English characters are shown.ARDUINOUNO PLUS Arduino development board is used here.1.Hardware connection1.8inch LCD Arduino3.3V 3V3GND GNDDIN D11CLK D13CS D10DC D7RST D8BL D92.Due to small global memory 2Kb of UNO PLUS, the display can’t work in graphical mode,but the calling method is the same. Just because there is no enough memory, this demo is not provided.COMPATIBLE CODE PORTINGOffered demo is the commonly used programs, which are able to be ported. They can be used with two screens and the difference is only in initialization of them and their sizes.The usage method is defined by macros. In LCD_Driver.h or in LCD.h:#define LCD_1IN44#define LCD_1in8.As the name of the macros, they are used for 1.44inch and 1.8inch LCD separately. To use for one LCD, just need to comment other one.For example://#define LCD_1IN44#define LCD_1IN8Here we use it for 1.8inch LCD, so we comment the 1.44 macro. After saving, Run make clean to remove dependency files, and then run make to generate new executable files.。

Linux2.6内核移植系列教程

Linux2.6内核移植系列教程

Linux2.6内核移植系列教程第一:Linux 2.6内核在S3C2440平台上移植此教程适合2.6.38之前的版本,其中2.6.35之前使用同一yaffs补丁包,2.6.36--2.6.28 yaffs文件系统有所改变,2.6.39之后的暂时不支持,源码下载请到:/1.解压linux-2.6.34.tar.bz2源码包#tar jxvf linux-2.6.34.tar.bz22.修改linux-2.6.34/Makefile文件,在makefile中找到以下两条信息并做修改ARCH ? =armCROSS_COMPILE?=/usr/local/arm/4.3.2/bin/arm-linux-注意:交叉编译器的环境变量也需要改为4.3.2#export PATH=/usr/local/arm/4.3.2/bin/:$PATH其中ARCH变量用来决定:配置、编译时读取Linux源码arch目录下哪个体系结构的文件PATH 用来决定交叉编译器版本3.修改机器类型ID号Linux源码中支持多种平台的配置信息,内核会根据bootloader传进来的mach-types决定那份平台的代码起作用,本人手里的板子是仿照三星公司官方给出的demo板改版而来,所以采用arch/arm/mach-s3c2440/mach-smdk2440.c此配置文件,打开此文件,翻到最后,有以下信息:MACHINE_START(S3C2440, "SMDK2440")/* Maintainer: Ben Dooks <ben@> */.phys_io= S3C2410_PA_UART,.io_pg_offst= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,.boot_params= S3C2410_SDRAM_PA + 0x100,.init_irq= s3c24xx_init_irq,.map_io= smdk2440_map_io,.init_machine= smdk2440_machine_init,.timer= &s3c24xx_timer,MACHINE_ENDMACHINE_START(S3C2440, "SMDK2440")决定了此板子的mach-types,可以在以下文件中找到S3C2440对应的具体数字,"arch/arm/tools/mach-types"文件查找S3C2440,362,这里刚好与我们的bootloader相同,所以不用做修改,直接保存退出即可,如果不同则根据bootloader的内容修改此文件,或根据此文件修改boorloader的内容(在vivi中可通过param show查看,u-boot在Y:\test\u-boot_src\u-boot_edu-2010.06\board\samsung\unsp2440\unsp2440.c文件:gd->bd->bi_arch_number = MACH_TYPE_S3C2440;中决定)。

《嵌入式系统开发(Linux)》实验5 LCD显示图片

《嵌入式系统开发(Linux)》实验5  LCD显示图片

《嵌入式系统原理及应用》实验报告班级:学号:姓名:日期:实验5 LCD显示图片1.实验目的(1)编写一个在开发板LCD上显示RGB888格式图像文件的应用程序。

2.实验设备硬件:PC机一台、mini2440开发板软件:WindowsXP系统Vbox虚拟机,Ubuntu系统。

3.实验程序应用程序LCD_img.c如下。

#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <sys/mman.h>#include <string.h>#define DEVICE_NAME "/dev/fb0"#define XSIZE 240#define YSIZE 320#define PI 3.1415926unsigned short *fb_mem_kernel; //16bitstatic void PutPixel(unsigned int x,unsigned int y,unsigned short rgb565);unsigned int size = XSIZE*YSIZE*2;int main(int argc, char *argv[]){int fp, i, j;char Red32,Green32,Blue32,Red565,Green565,Blue565;unsigned short RGB565;FILE *img_fp;fp = open("/dev/fb0", O_RDWR); //用open打开设备文件fb_mem_kernel = mmap(0,size,PROT_READ | PROT_WRITE,MAP_SHARED,fp,0);memset(fb_mem_kernel,0x00,size);img_fp = fopen(argv[1], "r"); //用fopen打开普通文件fseek(img_fp, 0x36L, SEEK_SET);for(j=YSIZE;j>0;j--){ //rgb888 to rgb565for(i=0;i<XSIZE;i++){fread(&Blue32,sizeof(char),1,img_fp);fread(&Green32,sizeof(char),1,img_fp);fread(&Red32,sizeof(char),1,img_fp);Red565 = Red32 >> 3; // 5-bit redGreen565 = Green32 >> 3; // 6-bit greenBlue565 = Blue32 >> 3; // 5-bit blueRGB565 = (Red565<<(11))|(Green565<<5)|Blue565;PutPixel(i,j,RGB565) ;}}fclose(img_fp);close(fp);return 0;}static void PutPixel(unsigned int x,unsigned int y,unsigned short rgb565) {if ((x <= XSIZE) && (y <= YSIZE)){*(fb_mem_kernel+(y-1)*XSIZE+(x-1))=rgb565;}}4、实验步骤对应用程序LCD_img.c的编译、加载。

Linux液晶参数配置

Linux液晶参数配置

Linux液晶参数配置基于EPC-28x-L工控板修订历史目录1. 适用范围 (1)2. 开发环境 (2)3. 技术实现 (3)3.1解压内核源码 (3)3.1.1解压内核源码 (3)3.1.2选择配置文件 (3)3.2配置7寸液晶屏参数 (3)3.2.1选择液晶参数 (4)3.2.2编译内核 (4)3.3配置3.5寸等其他液晶屏参数 (4)3.3.1增加液晶参数定义 (5)3.3.2添加液晶参数选项 (5)3.3.3选择3.5寸液晶参数配置 (6)3.3.4编译内核 (7)3.4LCD液晶参数计算 (7)3.4.1水平时序 (8)3.4.2垂直时序 (9)3.4.3补充 (9)4. 免责声明 (10)1. 适用范围本文主要介绍在EPC-287C-L工控板(M287-128LI核心板)上,配置液晶显示参数。

文中描述的方法,适用于EPC-28x-L、M28x-L工控板与工控核心板。

其应用原理,也适用于A28x-L、IoT-396x-L等i.MX28x系列其他支持Linux系统的产品。

2. 开发环境1) 开发主机环境:Ubuntu 12.04(64位)、gcc-4.4.4-glibc-2.11.1-multilib-1.0系列交叉工具链2) 硬件清单:EPC-287C-L 工控板(M287-128LI)3) 软件资源:光盘EPC-280_283_287 V1.05中的内核源码包:linux-2.6.35.3-102c9c0.tar.bz2。

(或者更高版本光盘资料提供的内核源码包)3. 技术实现注意:在开始进行下面的操作之前,请首先确认ubuntu主机的开发环境已经搭建好。

如需了解这方面的内容,请参考产品光盘资料中的《EPC-28x-L用户手册.pdf》第4章。

3.1 解压内核源码3.1.1 解压内核源码将EPC-280_283_287 V1.05光盘中的linux-2.6.35.3-102c9c0.tar.bz2源码包,复制到ubuntu 系统的“~/”目录下,将其解压得到linux-2.6.35.3 目录,参考命令如下:vmuser@Linux-host:~$ tar –jxvf linux-2.6.35.3-102c9c0.tar.bz23.1.2 选择配置文件linux-2.6.35.3-102c9c0.tar.bz2源码中,包含多种ARM9内核配置文件。

韦东山老师LCD驱动程序源码

韦东山老师LCD驱动程序源码
* HBPD=16
* bit[18:8]: 多少列, 240, 所以HOZVAL=240-1=239
* bit[7:0] : HFPD, 发出最后一行里最后一个象素数据之后,再过多长时间才发出HSYNC
* LCD手册T8-T11=251-240=11, 所以HFPD=11-1=10
unsigned long lcdintpnd;
unsigned long lcdsrcpnd;
unsigned long lcdintmsk;
unsigned long lpcsel;
};
static struct fb_ops s3c_lcdfb_ops = {
*gpccon = 0xaaaaaaaa; /* GPIO管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND */
*gpdcon = 0xaaaaaaaa; /* GPIO管脚用于VD[23:8] */
*gpbcon &= ~(3); /* GPB0设置为输出引脚 */
*gpbcon |= 1;
*gpbdat &= ~1; /* 输出低电平 */
*gpgcon |= (3<<8); /* GPG4用作LCD_PWREN */
/* 3.2 根据LCD手册设置LCD控制器, 比如VCLK的频率等 */
lcd_regs = ioremap(0x4D000000, sizeof(struct lcd_regs));
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <asm/io.h>

linux_lcd

linux_lcd

Linux-2.6.20的LCD驱动分析(二).1 驱动的入口点摆在面前的第一个问题相信应该是,这个函数是从那里开始运行的。

这里就应该从long long ago 开始了,打开drivers/video/s3c2410fb.c文件,然后找到s3c2410fb_init函数,先不管它里面是怎么回事,再把目光下移就会看到这样一串字符串module_init(s3c2410fb_init),郁闷,这和S3C2410fb_probe有啥关系嘛?这个问题问的好!不要着急慢慢往下面走。

先摸摸module_init是何方神圣再说,于是乎我就登陆了http://lxr.linux.no/linux+v2.6.20/网站,在上面一搜,原来module_init老家在include/linux/init.h,原来它居然还有两重身份,其原型如下:#ifndef MODULE……#define module_init(x) __initcall(x); ①……#else……#define module_init(initfn) \ ②static inline initcall_t __inittest(void) \{ return initfn; } \int init_module(void) __attribute__((alias(#c)));……#endif从上面可以看出,module_init到底用哪个,就取决于MODULE了,那么MODULE的作用是什么呢?我们知道Linux可以将设备当作模块动态加进内核,也可以直接编译进内核,说到这里大概有点明白MODULE的作用了,不错!它就是要控制一个驱动加入内核的方式。

定义了MODULE就表示将设备当作模块动态加入。

所以上面的①表示将设备加进内核。

在②中的__attribute__((alias(#initfn)))很有意思,这代表什么呢?主要alias就是属性的意思,它的英文意思是别名,可以在/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ ref/fn_attrib_alias.htm找到它的详细说明,这里简单的说int init_module(void)__attribute__((alias(#initfn)));的意思为init_module是initfn的别名,或者init_module是initfn的一个连接,再简单一点说这个时候module_init宏基因突变成了init_module()了。

44.Linux君正X1000-添加st7789v显示

44.Linux君正X1000-添加st7789v显示

44.Linux君正X1000-添加st7789v显⽰由于板⼦LCD旧屏是ili9335型号的,旧屏有时候会断货,如果断货则使⽤⼀个st7789v型号的LCD它们两个屏的区别在于初始化屏的参数不同,引脚都⼀样,也就是说需要使板⼦同时⽀持ili9335型号和st7789v型号思路:1.uboot在显⽰LOG(初始化屏参数)之前,通过命令来读LCD型号,来检测LCD型号,然后来修改初始化屏的参数.2.如果屏是新屏,则设置bootargs,向内核传递参数lcd_type=new3.当kernel收到参数lcd_type=new时,则在初始化LCD之前,修改屏的参数.改uboot⾸先来看单板配置信息,根据配置找到哪个⽂件是初始化LCD屏的根据make ap60pro_uImage_sfc_nand命令,找ap60pro_uImage_sfc_nand单板信息vi ./u-boot/boards.cfg 找到:# Target ARCH CPU Board name Vendor SoC Options##############################################################ap60pro_uImage_sfc_nand mips xburst ap60pro ingenic x1000 ap60pro:SPL_SFC_NAND,LIBSLEEP,GET_BT_MAC 从上⾯看到board name为ap60pro,所以最终通过下⾯⼏个来初始化:./arch/mips/cpu/xburst\x1000\start.S //启动代码./include/configs/ap60pro.h //各种define配置./board/ingenic/ap60pro //单板配置源⽂件查看ap60pro.h,查看LCD相关的define配置查找CONFIG_ILI9335_240X320,找到在./board/ingenic/ap60pro/Makefile⾥调⽤:COBJS-$(CONFIG_ILI9335_240X320) += lcd-ili9335_240x320.o //保存LCD初始化参数的信息查找CONFIG_ILI9335_240X320,找到在./drivers/video/Makefile⾥调⽤:COBJS-$(CONFIG_JZ_LCD_V13) += jz_lcd/jz_lcd_v13.o //根据lcd-ili9335_240*320.c来初始化LCD修改lcd-ili9335_240x320.c添加st7789v初始化的数组表(在代码中以New_ili9335_data_table数组表⽰):struct smart_lcd_data_table ili9335_data_table[] = { //旧屏的初始化参数表{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0xec},{SMART_CONFIG_DATA,0x1e},{SMART_CONFIG_DATA,0x8f},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x01},{SMART_CONFIG_DATA,0x01},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x02},{SMART_CONFIG_DATA,0x02},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x03},{SMART_CONFIG_DATA,0x10},{SMART_CONFIG_DATA,0x30},{SMART_CONFIG_UDELAY,10000},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x08},{SMART_CONFIG_DATA,0x02},{SMART_CONFIG_DATA,0x02},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x0a},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x08}, //enable te {SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x0d},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x0f},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x60},{SMART_CONFIG_DATA,0x27},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x61},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x6a},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_UDELAY,10000},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x10},{SMART_CONFIG_DATA,0x16},{SMART_CONFIG_DATA,0x90},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x11},{SMART_CONFIG_DATA,0x02},{SMART_CONFIG_DATA,0x27},{SMART_CONFIG_UDELAY,10000},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x12},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x0d},{SMART_CONFIG_UDELAY,10000},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x21},{SMART_CONFIG_DATA,0x16},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x29},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x18},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x2b},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x0a},{SMART_CONFIG_UDELAY,10000},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x20},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x21},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},//============Gamma============{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x31},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x07},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x32},{SMART_CONFIG_DATA,0x04},{SMART_CONFIG_DATA,0x04},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x35},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x02},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x36},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x0f},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x37},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x03},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x38},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x39},{SMART_CONFIG_DATA,0x03},{SMART_CONFIG_DATA,0x02},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x3c},{SMART_CONFIG_DATA,0x02},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x3d},{SMART_CONFIG_DATA,0x0f},{SMART_CONFIG_DATA,0x00},//============================= // set RAM address{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x50},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x51},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0xef},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x52},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x53},{SMART_CONFIG_DATA,0x01},{SMART_CONFIG_DATA,0x3f},{SMART_CONFIG_UDELAY,10000},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x80},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x81},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x83},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x84},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x85},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x90},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x10},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x91},{SMART_CONFIG_DATA,0x06},{SMART_CONFIG_DATA,0x00},//display on{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x07},{SMART_CONFIG_DATA,0x01},{SMART_CONFIG_DATA,0x33},{SMART_CONFIG_CMD,0x00},{SMART_CONFIG_CMD,0x22},};unsigned long truly_cmd_buf[]= {0x22002200,};struct jzfb_config_info jzfb1_init_data = {.num_modes = 1,.modes = &jzfb1_videomode,.lcd_type = LCD_TYPE_SLCD,.bpp = 24, //R8G8B8.pinmd = 0,.smart_config.rsply_cmd_high = 0,.smart_config.csply_active_high = 0,/* write graphic ram command, in word, for example 8-bit bus, write_gram_cmd=C3C2C1C0. */ .smart_config.newcfg_fmt_conv = 0,.smart_config.clkply_active_rising = 1,.smart_config.data_times = 2,.smart_config.write_gram_cmd = truly_cmd_buf,.smart_config.length_cmd = ARRAY_SIZE(truly_cmd_buf),.smart_config.bus_width = 8, //总线8位的.smart_config.length_data_table = ARRAY_SIZE(ili9335_data_table),.smart_config.data_table = ili9335_data_table,.dither_enable = 1,};//新屏的初始化参数表static struct smart_lcd_data_table New_ili9335_data_table[] = {{SMART_CONFIG_CMD,0x11},{SMART_CONFIG_UDELAY,120000}, //Sleep out{SMART_CONFIG_CMD,0x36}, //控制{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_CMD,0x21}, //0x13显⽰不反转 ,21h 反显{SMART_CONFIG_CMD,0x3A},{SMART_CONFIG_DATA,0x05},{SMART_CONFIG_CMD,0x2A},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x01},{SMART_CONFIG_DATA,0x3F},{SMART_CONFIG_CMD,0xB2}, //前后肩{SMART_CONFIG_DATA,0x0C},{SMART_CONFIG_DATA,0x0C},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x33},{SMART_CONFIG_DATA,0x33},{SMART_CONFIG_CMD,0xB7}, //VGH VGL{SMART_CONFIG_DATA,0x35},{SMART_CONFIG_CMD,0xBB}, //VCOM{SMART_CONFIG_DATA,0x1E},{SMART_CONFIG_CMD,0xC0}, //LCM{SMART_CONFIG_DATA,0x2C},{SMART_CONFIG_CMD,0xC2},{SMART_CONFIG_DATA,0x01},{SMART_CONFIG_CMD,0xC3}, //VRH( vcom+vcom offset+vdv) {SMART_CONFIG_DATA,0x27},{SMART_CONFIG_CMD,0xC4}, //vdv{SMART_CONFIG_DATA,0x20},{SMART_CONFIG_CMD,0xC6}, //帧率{SMART_CONFIG_DATA,0x0F},{SMART_CONFIG_CMD,0xD0}, //功率控制模式{SMART_CONFIG_DATA,0xA4},{SMART_CONFIG_DATA,0xA1},{SMART_CONFIG_CMD,0xE0}, //正GAMMA{SMART_CONFIG_DATA,0xD0},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x05},{SMART_CONFIG_DATA,0x03},{SMART_CONFIG_DATA,0x02},{SMART_CONFIG_DATA,0x07},{SMART_CONFIG_DATA,0x3F},{SMART_CONFIG_DATA,0x55},{SMART_CONFIG_DATA,0x50},{SMART_CONFIG_DATA,0x09},{SMART_CONFIG_DATA,0x14},{SMART_CONFIG_DATA,0x15},{SMART_CONFIG_DATA,0x22},{SMART_CONFIG_DATA,0x25},{SMART_CONFIG_CMD,0xE1}, //负GAMMA{SMART_CONFIG_DATA,0xD0},{SMART_CONFIG_DATA,0x00},{SMART_CONFIG_DATA,0x05},{SMART_CONFIG_DATA,0x03},{SMART_CONFIG_DATA,0x02},{SMART_CONFIG_DATA,0x07},{SMART_CONFIG_DATA,0x3F},{SMART_CONFIG_DATA,0x55},{SMART_CONFIG_DATA,0x54},{SMART_CONFIG_DATA,0x0C},{SMART_CONFIG_DATA,0x18},{SMART_CONFIG_DATA,0x14},{SMART_CONFIG_DATA,0x22},{SMART_CONFIG_DATA,0x25},{SMART_CONFIG_CMD,0x11}, // sleep out{SMART_CONFIG_UDELAY,120000},{SMART_CONFIG_CMD,0x29},//Display On{SMART_CONFIG_UDELAY,20000},};unsigned long New_truly_cmd_buf[]= {0x2C2C2C2C,};void switch_lcd_New(void) //切换为ST7789V{jzfb1_init_data.smart_config.data_table = New_ili9335_data_table;jzfb1_init_data.smart_config.length_data_table = ARRAY_SIZE(New_ili9335_data_table);jzfb1_init_data.smart_config.write_gram_cmd = New_truly_cmd_buf;}//... ...查看jz_lcd_v13.c调⽤顺序从uboot启动时,调⽤board_init_r()函数开始:-> board_init_r()-> stdio_init()-> drv_lcd_init() //初始化硬件LCD-> drv_video_init() //绘制log其中drv_lcd_init()中调⽤顺序为:-> drv_lcd_init()-> lcd_init()-> lcd_ctrl_init() // 位于drivers\video\jz_lcd\Jz_lcd_v13.c所以,接下来,我们便来修改jz_lcd_v13.c,让uboot在初始化LCD之前,读LCD的ID,是否需要切换新屏参数修改jz_lcd_v13.c由于X1000的SLCD控制寄存器只能向LCD写命令/数据,没有读数据的寄存器,所以我们便需要使⽤GPIO来模拟时序,读出ID来参考ST7789V数据⼿册,找到ID命令为04h:参考ST7789V数据⼿册,找到读写8080时序图:接下来开始改代码://添加下⾯函数,通过GPIO模拟LCD寄存器,来实现读IDvoid gpio_setfunc(unsigned int gpioPort,enum gpio_function fun){enum gpio_port port;switch((gpioPort /32)){case0: port = GPIO_PORT_A; break;case1: port = GPIO_PORT_B; break;case2: port = GPIO_PORT_C; break;case3: port = GPIO_PORT_D; break;default:port = GPIO_NR_PORTS; break;}gpio_set_func(port, fun, 1<< (gpioPort % 32));if(fun == GPIO_OUTPUT0||fun == GPIO_OUTPUT1) {if(fun == GPIO_OUTPUT0)gpio_direction_output(gpioPort, 0);elsegpio_direction_output(gpioPort, 1);}}static void write_SLCD_CD(int isCOMD,unsigned int value) //写命令/数据{#define SLCD_DC 20#define SLCD_WR 17#define SLCD_RD 16#define SLCD_CS 18int i;gpio_direction_output(GPIO_PB(SLCD_CS), 1);for( i=0;i<8;i++){gpio_setfunc(GPIO_PA(i),GPIO_OUTPUT0);gpio_direction_output(GPIO_PA(i), (value>>i)&0x01);}mdelay(10);if(isCOMD!=0) //如果是写命令,则拉低DC脚{gpio_direction_output(GPIO_PB(SLCD_DC), 0);}else{gpio_direction_output(GPIO_PB(SLCD_DC),1);}gpio_direction_output(GPIO_PB(SLCD_WR), 0);gpio_direction_output(GPIO_PB(SLCD_RD), 1);gpio_direction_output(GPIO_PB(SLCD_CS), 0);mdelay(4);gpio_direction_output(GPIO_PB(SLCD_WR), 1);mdelay(7);}static unsigned int read_SLCD_DATA(void) //读数据{#define SLCD_DC 20#define SLCD_WR 17#define SLCD_RD 16#define SLCD_CS 18int i;int ret=0;gpio_direction_output(GPIO_PB(SLCD_CS), 1); //取消⽚选for( i=0;i<8;i++) //将data脚设为输⼊脚{gpio_setfunc(GPIO_PA(i),GPIO_INPUT);}gpio_direction_output(GPIO_PB(SLCD_DC), 1);gpio_direction_output(GPIO_PB(SLCD_WR), 1);gpio_direction_output(GPIO_PB(SLCD_RD), 0);gpio_direction_output(GPIO_PB(SLCD_CS), 0); //选中⽚选mdelay(4);gpio_direction_output(GPIO_PB(SLCD_RD), 1);for( i=0;i<8;i++)ret|=(gpio_get_value(GPIO_PA(i))<<i);mdelay(7);return ret;}static void lcd_func_init(int isRestore){int i,n;#define SLCD_DC 20#define SLCD_WR 17#define SLCD_RD 16#define SLCD_TE 19 //input#define SLCD_CS 18if(isRestore) //恢复管脚为LCD控制寄存器{for(i=0;i<8;i++)gpio_setfunc(GPIO_PA(i),GPIO_FUNC_1);gpio_setfunc(GPIO_PB(SLCD_DC),GPIO_FUNC_1);gpio_setfunc(GPIO_PB(SLCD_WR),GPIO_FUNC_1);gpio_setfunc(GPIO_PB(SLCD_RD),GPIO_FUNC_1);gpio_setfunc(GPIO_PB(SLCD_TE),GPIO_FUNC_1);gpio_setfunc(GPIO_PB(SLCD_CS),GPIO_FUNC_1);}else //设置为普通IO管脚 {for(i=0;i<8;i++)gpio_setfunc(GPIO_PA(i),GPIO_OUTPUT0);gpio_setfunc(GPIO_PB(SLCD_DC),GPIO_OUTPUT0);gpio_setfunc(GPIO_PB(SLCD_WR),GPIO_OUTPUT0);gpio_setfunc(GPIO_PB(SLCD_RD),GPIO_OUTPUT0);gpio_setfunc(GPIO_PB(SLCD_TE),GPIO_INPUT);gpio_setfunc(GPIO_PB(SLCD_CS),GPIO_OUTPUT0);}mdelay(200);}static u8 Read_ID_isNewLcd(void){#define SLCD_DC 20#define SLCD_WR 17#define SLCD_RD 16#define SLCD_TE 19 //input#define SLCD_CS 18u8 ret = 0;u8 IDH,IDL;lcd_func_init(0); //设置LCD相关的引脚,设置为普通IO脚write_SLCD_CD(1,0x04); //写⼊0x04命令IDH = read_SLCD_DATA();IDL = read_SLCD_DATA();printf("Read ID: 0x%X 0x%X\r\n",IDH,IDL);IDH = read_SLCD_DATA();IDL = read_SLCD_DATA();printf("Read ID: 0x%X 0x%X\r\n",IDH,IDL);if(IDL!=0x52) //如果值!=0X52,则表⽰是旧屏ili9335{ret =1;}lcd_func_init(1); //将lcd相关引脚配置为LCD控制脚mdelay(10);return ret;}extern void switch_lcd_New(void) ;static int lcd_type_isNew=0;void set_lcd_type_from_cmdline(void) //设置bootargs,向内核传递lcd_type参数{if(lcd_type_isNew){run_command("set bootargs "CONFIG_BOOTARGS" lcd_type=new ", 0);}}//在lcd_ctrl_init()函数⾥添加读ID函数void lcd_ctrl_init(void *lcd_base){if(Read_ID_isNewLcd()==0) //读ID,检测是否是新屏{printf("Read_ID_isNewLcd=0\r\n");switch_lcd_New(); //调⽤Lcd-ili9335_240x320.c的切换新屏参数的函数lcd_type_isNew=1;}//... ... 后⾯的代码不需要修改,因为后⾯便会根据LCD初始化参数表.来初始化LCD}上⾯的set_lcd_type_from_cmdline()函数需要在后⾯调⽤main_loop()的时候之前被调⽤,所以还需要修改board_init_r()函数(arch\mips\lib\Board.c ).然后装上旧屏ili9335,启动uboot,查看读的屏幕ID,屏幕显⽰正常:然后换为新屏,启动uboot,查看读的ID信息,log显⽰正常:启动内核时,也可以看到传递给内核bootargs有我们新添的参数:然后在内核中,便通过新参数再次设置屏参数表即可.。

ARM11嵌入式系统Linux下LCD的驱动设计

ARM11嵌入式系统Linux下LCD的驱动设计

与 喇 De i n o s g f LCD i i n Li x Ba e n ARM l Dr v ng i nu s d o Em b d e y t m l e d d S se



ZH AN G J a we ,ZHOU — o g,I O n i i An d n U Yo g
c ts t t hs a e ha t i me ho c n bt i f l wi a va a e f s e s e d, smpl r t d a o a n olo ng d nt g s: a t r p e i e drv r nd i e a
s r ng r t a p a t to . t o e r ns l n a i n Ke r s:Ii x;A R M 1 y wo d nu LCD rve 1; d i r;Fr m e ufe ; PI a b frG O
Ab ta t sr c :Th C d ie 2L n x b sd0 eL D r ri iu ae n ARM 1 mb d e y tm ssu id A t o f v 1 e e d ds se wa t de . meh d o l
ICD rv ng d sgn o he b s so hef a bu f r nd t e ho n t a i fr ad n d ii e i n t a i ft r me fe .a wo m t dso he b ss o e i g a ii nd wrtng GPI O d r c l we e n l e . Th a v nt ge a s d a a s f h t e ie ty r a a yz d e d a a s nd dia v nt ge o t e hr e LCD rve swe e s m ma ie y t s i g A d i r r u rz d b e tn . ICD o r lmo s i c nt o de wa mplm e t d b o b — e n e y c m i

linux中lcd的用法

linux中lcd的用法

在Linux中,LCD通常指的是液晶显示器,但也指代其他与LCD相关的命令或库。

以下是一些的用法:
控制LCD显示:Linux下可以通过一些标准的Linux命令来控制LCD显示,例如“lcdsett”命令可以调节显示屏的分辨率和色彩深度,“lcdclear”命令可以清空LCD的显示内容,“lcdputs”命令可以在LCD上输出一个字符串,“lcdget”命令可以获取LCD屏幕上指定位置上的像素值等。

显示系统状态:Linux系统中的LCD可以用于显示各种信息,如系统状态、测试结果、磁盘空间利用率等。

这些信息可以让系统管理员更好地掌控系统的状态。

视频流或游戏画面:Linux系统还支持使用LCD显示视频流或游戏画面,利用LCD来实现用户端图形界面等,用以丰富Linux系统的用户界面,进一步提升用户体验。

Local Change Directory:在Linux中,“lcd”是“Local Change Directory”的缩写,意为本地变更目录,它是一个命令,常用于shell脚本中,在当前工作目录中进行目录切换。

通过使用“lcd”命令,可以在shell脚本中更灵活地处理目录切换,使得脚本执行期间可以在不同的目录中进行操作,而不会影响到脚本执行结束后的环境。

以上是一些关于Linux中LCD的用法,但具体使用方法会因不同的环境和用途而有所不同。

arm_linux_logo的更改以及启动信息的显示方法

arm_linux_logo的更改以及启动信息的显示方法

1、LCD的kernel启动信息显示要想让Linux的启动信息从LCD和串口同时输出,作如下设置.修改uboot中的启动参数信息。

#define CONFIG_BOOTARGS \"console=tty0 console=ttyS0,115200 earlyprintk " \"mtdparts=atmel_nand:128k(bootstrap)ro,384k(uboot)ro," \"128k(env),128k(env_redundant),256k(spare)," \"1M(dtb),6M(kernel)ro,-(rootfs) " \"root=/dev/mtdblock7 rw rootfstype=yaffs2"#elif CONFIG_SYS_USE_MMC//前面的console=tty0是信息输出到LCD屏上, 一定要在前面!!// console=ttyS0,115200使kernel启动期间的信息息刚开始输出到串口0上,波特率为115200;// 用户空间的串口编程针对的仍是/dev/ttyS0等2、uboot、kernel LOGO图片的更改arm Linux的uboot、Kernel开机动画默认为公司图标及小企鹅图标,uboot的图标在u-boot-at91-u-boot-2015.01-at91\tools\logos下面,kernel的图标在driver/video/logo下面。

但是在实际的开发应用中,我们常常需要做的是更改系统默认的开机启动画面,更换企业的特有logo图片。

2.1 uboot LOGO图片的更改修改u-boot的开机logo其实很简单。

请见下面步骤。

1. 获取一张BMP的图片,修改之,让其色深为8位,即256色,如果用24位,则显示出问题。

2. 将制作好的BMP图片,放置到u-boot-at91-u-boot-2015.01-at91\tools\logos下面替换公司LOGO图片。

Linux驱动之LCD驱动编写

Linux驱动之LCD驱动编写

Linux驱动之LCD驱动编写在这篇博客中已经分析了编写LCD驱动的步骤,接下来就按照这个步骤来字尝试字节编写LCD驱动。

⽤的LCD屏幕为tft 屏,每个像素点为16bit。

对应与红绿蓝分别为565。

1、分配⼀个fb_info结构2、设置fb_info结构3、硬件相关的操作,配置LCD时钟、配置IO端⼝、配置LCD寄存器。

4、最终注册fbinfo结构到registered_fb数组要理解LCD的⼯作原理,需要了解LCD的时钟,在TFT的LCD中有如下的时钟。

这个⼏个时钟数据在配置LCD寄存器时都说需要设置的。

1、VCLK:两个像素之间的时钟,即两个像素隔多长时间才能显⽰下⼀个像素2、HSYNC:⽔平同步时钟,即第⼀⾏像素点显⽰完成之后隔多长时间才能开始下⼀⾏的显⽰3、VSYNC:垂直⽅向的同步时钟,也叫帧同步信号,即⼀帧数据显⽰完成之后(⼀帧数据表⽰⼀个屏幕显⽰完成,即⼀个显存的数据全部取完),过多长下⼀帧数据才开始显⽰本节需要⽤到的函数:void *dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp); //分配DMA缓存区给显存//返回值为:申请到的DMA缓冲区的虚拟地址,若为NULL,表⽰分配失败,则需要使⽤dma_free_writecombine()释放内存,避免内存泄漏//参数如下://*dev:指针,这⾥填0,表⽰这个申请的缓冲区⾥没有内容//size:分配的地址⼤⼩(字节单位)//*handle:申请到的物理起始地址//gfp:分配出来的内存参数,标志定义在<linux/gfp.h>,常⽤标志如下://GFP_ATOMIC ⽤来从中断处理和进程上下⽂之外的其他代码中分配内存. 从不睡眠.//GFP_KERNEL 内核内存的正常分配. 可能睡眠.//GFP_USER ⽤来为⽤户空间页来分配内存; 它可能睡眠.分配⼀段DMA缓存区,分配出来的内存会禁⽌cache缓存(因为DMA传输不需要CPU)它和 dma_alloc_coherent ()函数相似,不过 dma_alloc_coherent ()函数是分配出来的内存会禁⽌cache缓存以及禁⽌写⼊缓冲区dma_free_writecombine(dev,size,cpu_addr,handle); //释放缓存//cpu_addr:虚拟地址,//handle:物理地址释放DMA缓冲区, dev和size参数和上⾯的⼀样struct fb_info *framebuffer_alloc(size_t size, struct device *dev); //申请⼀个fb_info结构体,//size:额外的内存,//*dev:指针, 这⾥填0,表⽰这个申请的结构体⾥没有内容int register_framebuffer(struct fb_info *fb_info);//向内核中注册fb_info结构体,若内存不够,注册失败会返回负数int unregister_framebuffer(struct fb_info *fb_info) ;//注销内核中fb_info结构体本节需要⽤到的结构体:fb_info结构体如下:struct fb_info {... ...struct fb_var_screeninfo var; //可变的参数struct fb_fix_screeninfo fix; //固定的参数... ...struct fb_ops *fbops; //操作函数... ...char __iomem *screen_base; //显存虚拟起始地址unsigned long screen_size; //显存虚拟地址长度void *pseudo_palette;//假的16⾊调⾊板,⾥⾯存放了16⾊的数据,可以通过8bpp数据来找到调⾊板⾥⾯的16⾊颜⾊索引值,模拟出16⾊颜⾊来,节省内存,不需要的话就指向⼀个不⽤的数组即可 ... ...};其中操作函数fb_info-> fbops 结构体写法如下:static struct fb_ops s3c_lcdfb_ops = {.owner = THIS_MODULE,.fb_setcolreg = my_lcdfb_setcolreg,//设置调⾊板fb_info-> pseudo_palette,⾃⼰构造该函数.fb_fillrect = cfb_fillrect, //填充矩形,⽤/drivers/video/ cfbfillrect.c⾥的函数即可.fb_copyarea = cfb_copyarea, //复制数据, ⽤/drivers/video/cfbcopyarea.c⾥的函数即可.fb_imageblit = cfb_imageblit, //绘画图形, ⽤/drivers/video/imageblit.c⾥的函数即可};固定的参数fb_info-> fix 结构体如下:struct fb_fix_screeninfo {char id[16]; //id名字unsigned long smem_start; //framebuffer物理起始地址__u32 smem_len; //framebuffer长度,字节为单位__u32 type; //lcd类型,默认值0即可__u32 type_aux; //附加类型,为0__u32 visual; //画⾯设置,常⽤参数如下// FB_VISUAL_MONO01 0 单⾊,0:⽩⾊,1:⿊⾊// FB_VISUAL_MONO10 1 单⾊,1:⽩⾊,0:⿊⾊// FB_VISUAL_TRUECOLOR 2 真彩(TFT:真彩)// FB_VISUAL_PSEUDOCOLOR 3 伪彩// FB_VISUAL_DIRECTCOLOR 4 直彩 __u16 xpanstep; /*如果没有硬件panning就赋值为0 */ __u16 ypanstep; /*如果没有硬件panning就赋值为0 */ __u16 ywrapstep; /*如果没有硬件ywrap就赋值为0 */ __u32 line_length; /*⼀⾏的字节数 ,例:(RGB565)240*320,那么这⾥就等于240*16/8 */ /*以下成员都可以不需要*/ unsigned long mmio_start; /*内存映射IO的起始地址,⽤于应⽤层直接访问寄存器,可以不需要*/__u32 mmio_len; /* 内存映射IO的长度,可以不需要*/__u32 accel;__u16 reserved[3];};可变的参数fb_info-> var 结构体如下:structfb_var_screeninfo{ __u32xres; /*可见屏幕⼀⾏有多少个像素点*/__u32 yres; /*可见屏幕⼀列有多少个像素点*/__u32 xres_virtual; /*虚拟屏幕⼀⾏有多少个像素点 */__u32 yres_virtual; /*虚拟屏幕⼀列有多少个像素点*/__u32 xoffset; /*虚拟到可见屏幕之间的⾏偏移,若可见和虚拟的分辨率⼀样,就直接设为0*/ __u32 yoffset; /*虚拟到可见屏幕之间的列偏移*/__u32 bits_per_pixel; /*每个像素的位数即BPP,⽐如:RGB565则填⼊16*/__u32 grayscale; /*⾮0时,指的是灰度,真彩直接填0即可*/struct fb_bitfield red; //fb缓存的R位域, fb_bitfield结构体成员如下://__u32 offset; 区域偏移值,⽐如RGB565中的R,就在第11位//__u32 length; 区域长度,⽐如RGB565的R,共有5位//__u32 msb_right; msb_right ==0,表⽰数据左边最⼤, msb_right!=0,表⽰数据右边最⼤struct fb_bitfield green; /*fb缓存的G位域*/struct fb_bitfield blue; /*fb缓存的B位域*/ /*以下参数都可以不填,默认为0*/struct fb_bitfield transp; /*透明度,不需要填0即可*/__u32nonstd; /* != 0表⽰⾮标准像素格式*/__u32 activate; /*设为0即可*/__u32height; /*外设⾼度(单位mm),⼀般不需要填*/__u32width; /*外设宽度(单位mm),⼀般不需要填*/__u32 accel_flags; /*过时的参数,不需要填*//* 除了pixclock本⾝外,其他的都以像素时钟为单位*/__u32pixclock; /*像素时钟(⽪秒)*/__u32 left_margin; /*⾏切换,从同步到绘图之间的延迟*/__u32right_margin; /*⾏切换,从绘图到同步之间的延迟*/__u32upper_margin; /*帧切换,从同步到绘图之间的延迟*/__u32lower_margin; /*帧切换,从绘图到同步之间的延迟*/__u32hsync_len; /*⽔平同步的长度*/__u32 vsync_len; /*垂直同步的长度*/__u32 sync;__u32 vmode;__u32 rotate;__u32reserved[5]; /*保留*/}1.写驱动程序:(驱动设置:参考⾃带的LCD平台驱动drivers/video/s3c2410fb.c )1.1 步骤如下:在驱动init⼊⼝函数中:1)分配⼀个fb_info结构体2)设置fb_info 2.1)设置固定的参数fb_info-> fix 2.2) 设置可变的参数fb_info-> var 2.3) 设置操作函数fb_info-> fbops 2.4) 设置fb_info 其它的成员3)设置硬件相关的操作 3.1)配置LCD引脚 3.2)根据LCD⼿册设置LCD控制器 3.3)分配显存(framebuffer),把地址告诉LCD控制器和fb_info4)开启LCD,并注册fb_info: register_framebuffer() 4.1) 直接在init函数中开启LCD(后⾯讲到电源管理,再来优化) 控制LCDCON5允许PWREN信号, 然后控制LCDCON1输出PWREN信号, 输出GPB0⾼电平来开背光, 4.2) 注册fb_info在驱动exit出⼝函数中:1)卸载内核中的fb_info2) 控制LCDCON1关闭PWREN信号,关背光,iounmap注销地址3)释放DMA缓存地址dma_free_writecombine()4)释放注册的fb_info1.2 具体代码如下:#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <asm/io.h> //含有iomap函数iounmap函数#include <asm/uaccess.h>//含有copy_from_user函数#include <linux/device.h>//含有类相关的处理函数#include <linux/fb.h> //含有fb_info结构体定义//#include <asm/dma-mapping.h> //含有dma_free_writecombine宏定义#include <linux/dma-mapping.h> //含有dma_free_writecombine宏定义#include <linux/platform_device.h>//含有平台设备总线模型相关变量#include <linux/mm.h>#include <linux/slab.h>//#include <linux/module.h>//#include <linux/kernel.h>//#include <linux/errno.h>//#include <linux/string.h>//#include <linux/mm.h>//#include <linux/slab.h>//#include <linux/delay.h>//#include <linux/fb.h>//#include <linux/init.h>//#include <linux/dma-mapping.h>//#include <linux/interrupt.h>//#include <linux/workqueue.h>//#include <linux/wait.h>//#include <linux/platform_device.h>//#include <linux/clk.h>//#include <asm/io.h>//#include <asm/uaccess.h>//#include <asm/div64.h>//#include <asm/mach/map.h>//#include <asm/arch/regs-lcd.h>//#include <asm/arch/regs-gpio.h>//#include <asm/arch/fb.h>/*lcd控制寄存器放在⼀个结构体⾥⾯*/struct lcd_regs {unsigned long lcdcon1;unsigned long lcdcon2;unsigned long lcdcon3;unsigned long lcdcon4;unsigned long lcdcon5;unsigned long lcdsaddr1;unsigned long lcdsaddr2;unsigned long lcdsaddr3;unsigned long redlut;unsigned long greenlut;unsigned long bluelut;unsigned long reserved[9];unsigned long dithmode;unsigned long tpal;unsigned long lcdintpnd;unsigned long lcdsrcpnd;unsigned long lcdintmsk;unsigned long lpcsel;};static struct fb_info *s3c_mylcdfb_info;//fb_info结构体static volatile unsigned long *gpbcon;//GPB0⽤于lcd背光的控制static volatile unsigned long *gpbdat;//GPB0⽤于lcd背光的控制static volatile unsigned long *gpccon;static volatile unsigned long *gpdcon;static volatile unsigned long *gpgcon;//GPG4⽤于lcd电源static volatile struct lcd_regs* lcd_regs;//lcd寄存器static u32 pseudo_palette[16]; //调⾊板内存/* from pxafb.c */static inline unsigned int chan_to_field(unsigned int chan, struct fb_bitfield *bf){chan &= 0xffff; //取出16bit的数据chan >>= 16 - bf->length; //return chan << bf->offset;}static int s3c_mylcdfb_setcolreg(unsigned int regno, unsigned int red,unsigned int green, unsigned int blue,unsigned int transp, struct fb_info *info){unsigned int val;if (regno > 16)return1;/* ⽤red,green,blue三原⾊构造出val */val = chan_to_field(red, &info->var.red);val |= chan_to_field(green, &info->var.green);val |= chan_to_field(blue, &info->var.blue);//((u32 *)(info->pseudo_palette))[regno] = val;pseudo_palette[regno] = val;return0;}static struct fb_ops s3c_mylcdfb_ops = { //操作函数结构体.owner = THIS_MODULE,.fb_setcolreg = s3c_mylcdfb_setcolreg,//待会设置,这个是调⾊板,如果使⽤⼩于16bit的像素需要⽤到 .fb_fillrect = cfb_fillrect,.fb_copyarea = cfb_copyarea,.fb_imageblit = cfb_imageblit,};static int lcd_drv_init(void){/*1、分配⼀个fb_info*/s3c_mylcdfb_info = framebuffer_alloc(0,NULL);//size为额外分配的⼤⼩,这⾥不需要,所以设为0if(s3c_mylcdfb_info==NULL){printk("unframebuffer_alloc\n");return1;}/*2、设置*//*2.1 设置固定的参数*/strcpy(s3c_mylcdfb_info->fix.id, "mylcd");//名字//s3c_mylcdfb_info->fix.smem_start = ;//显存的物理起始地址,后⾯设置s3c_mylcdfb_info->fix.smem_len = 480*272*16/8;//单位为字节,每个像素点占⽤16bit :565,显存的⼤⼩ s3c_mylcdfb_info->fix.type = FB_TYPE_PACKED_PIXELS;//LCD类型,填充像素的类型 tft//s3c_mylcdfb_info->fix.type_aux= //附加的LCD类型,不需要设置s3c_mylcdfb_info->fix.visual = FB_VISUAL_TRUECOLOR;//视觉类型,选择真彩⾊s3c_mylcdfb_info->fix.line_length = 480*16/8; //⼀⾏的长度,单位为字节// s3c_mylcdfb_info->fix.mmio_start = //控制lcd的寄存器的物理地址// s3c_mylcdfb_info->fix.mmio_len = //控制lcd的寄存器的⼤⼩/*2.2 设置可变的参数*/s3c_mylcdfb_info->var.xres = 480;//x⽅向的分辨率s3c_mylcdfb_info->var.yres = 272;//y⽅向的分辨率s3c_mylcdfb_info->var.xres_virtual = 480;//x⽅向的虚拟分辨率s3c_mylcdfb_info->var.yres_virtual = 272;//y⽅向的虚拟分辨率s3c_mylcdfb_info->var.bits_per_pixel = 16;//每个像素的⼤⼩,单位为bits3c_mylcdfb_info->var.grayscale = 0;//灰度值s3c_mylcdfb_info->var.red.length = 5;//红⾊像素占⽤的长度,单位bits3c_mylcdfb_info->var.green.length = 6;//绿⾊像素占⽤的长度,单位bits3c_mylcdfb_info->var.blue.length = 5;//蓝⾊像素占⽤的长度,单位bits3c_mylcdfb_info->var.red.offset= 11;//红⾊像素在16bit中的偏移值s3c_mylcdfb_info->var.green.offset= 6;//绿⾊像素在16bit中的偏移值s3c_mylcdfb_info->var.blue.offset=0;//蓝⾊像素在16bit中的偏移值s3c_mylcdfb_info->var.red.msb_right= 0;//低位在前还是⾼位在前,⼀般⾼位在前,也就是⼩端模式s3c_mylcdfb_info->var.green.msb_right= 0;s3c_mylcdfb_info->var.blue.msb_right=0;s3c_mylcdfb_info->var.activate = FB_ACTIVATE_NOW;//使⽤默认参数,显存⽴刻⽣效/*2.3 设置操作函数*/s3c_mylcdfb_info->fbops = &s3c_mylcdfb_ops;/*2.4 其它的⼀些设置 */s3c_mylcdfb_info->pseudo_palette = pseudo_palette;//调⾊板的地址//s3c_mylcdfb_info->screen_base = ;//显存的虚拟基地址s3c_mylcdfb_info->screen_size = 480*272*16/8;//单位为字节,每个像素点占⽤16bit :565,显存的⼤⼩/*3、硬件相关的操作 *//*3.1、配置GPIO⽤于LCD*/gpbcon = ioremap(0x56000010, 8);//将实际的寄存器地址转换为虚拟地址gpccon = ioremap(0x56000020 , 4);gpdcon = ioremap(0x56000030 , 4);gpgcon = ioremap(0x56000060 , 4);gpbdat = gpbcon + 1;*gpccon = 0xaaaaaaaa; /* GPIO管脚⽤于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND */*gpdcon = 0xaaaaaaaa; /* GPIO管脚⽤于VD[23:8] */*gpbcon &= ~(3); /* GPB0设置为输出引脚 */*gpbcon |= 1;*gpbdat &= ~1; /* 输出低电平关闭LCD背光 */*gpgcon |= (3<<8); /* GPG4⽤作LCD_PWREN 电源*//*3.2、根据LCD⼿册设置LCD控制器,⽐如VCLK的频率等 */lcd_regs = ioremap(0X4D000000 , sizeof(struct lcd_regs));/** bit[17:8] : VCLK = HCLK / [(CLKVAL+1) x 2]* 10M = 100M/[(CLKVAL+1) x 2]* CLKVAL = 4** bit[6:5] :PNRMODE = 11显⽰模式,选择TFT模式** bit[4:1] :BPPMODE = 1100;像素=16bit 565** bit[0] :ENVID = 0;先关闭LCD控制器*/lcd_regs->lcdcon1 = (4<<8) | (3<<5) | (0x0c<<1);///** [31:24] : VBPD = 帧同步信号发出后,过多长时间开始显⽰数据,单位为⾏,理解为1⾏的时间* 看LCD⼿册tvb = VBPD + 1 = 2;所以VBPD = 1** [23:14]:LINEVAL + 1= 272;,所以LINEVAL = 271;垂直⽅向尺⼨,多少⾏** [13:6]:VFPD = ⼀帧的数据传输完成之后,过多长时间开始下⼀帧数据的帧同步信号,单位为⾏,理解为1⾏的时间 * 看LCD⼿册tvf = VFPD + 1 = 2;所以VFPD = 1** [5:0]:VSPW = 帧同步信号的脉冲宽度,单位为⾏* 看LCD⼿册tvp = VSPW + 1 =10;所以VSPW = 9*/lcd_regs->lcdcon2 = (1<<24) | (271<<14) | (1<<6) | (9<<0);/** [25:19]:HBPD = ⾏同步信号发出后,经过多少个VCLK,才发送像素的数据,单位为VCLK* 看LCD⼿册thb = HBPD + 1 = 2;所以HBPD=1** [18:8]:HOZVAL + 1 = 480,所以 HOZVAL = 479;⽔平⽅向尺⼨,多少列**[7:0]:HFPD = ⼀⾏的像素数据传输完成之后,经过多长时间,才能发送下⼀个⾏同步信号,单位为VCLK*看LCD⼿册thf = HFPD + 1 = 2;所以HFPD = 1;*/lcd_regs->lcdcon3 = (1<<19) | (479<<8) | (1<<0);/** [7:0]:HSPW = ⾏同步信号的脉冲宽度,单位为VCLK* 看LCD⼿册thp = HSPW + 1 = 41;所以HSPW = 40**/lcd_regs->lcdcon4 = (40<<0);/** [11] :FRM565 = 1;16位模式的格式 R:G:B = 5:6:5* [10] :INVVCLK = 0;VCLK在哪个边沿取数据 = 0表⽰下降沿取数据* [9] :INVVLINE = 1;⾏同步信号是否需要反转= 1需要反转* [8] :INVVFRAME = 1;帧同步信号是否需要反转= 1需要反转* [7] :INVVD = 0; 数据是否需要反转* [6] :INVVDEN = 0; 数据使能信号是否需要反转* [5] :INVPWREN = 0;电源使能信号是否需要反转* [4] :INVLEND = 0;⾏结束信号是否需要反转* [3] :PWREN = 0;电源使能信号,先不使能* [2] :ENLEND = 1;//⾏结束信号先使能* [1:0] :BSWP 、HWSWP = 0 1;字节内部不需要交换,字节间需要交换*/lcd_regs->lcdcon5= (1<<11) | (3<<8) | (1<<2) | (1<<0);/*3.3、显存和调⾊板设置 *//**利⽤dma_alloc_writecombine分配⼀块连续的显存*/s3c_mylcdfb_info->screen_base = dma_alloc_writecombine(NULL,s3c_mylcdfb_info->screen_size,(&(s3c_mylcdfb_info->fix.smem_start)),GFP_KERNEL);//返回虚拟地址if(s3c_mylcdfb_info->screen_base==NULL) //如果显存分配失败,直接返回{printk("undma_alloc_writecombine\n");return1;}/**将显存的地址告诉LCD控制器(物理地址)*/lcd_regs->lcdsaddr1 = (s3c_mylcdfb_info->fix.smem_start >> 1) & (~(3<<30));//起始地址lcd_regs->lcdsaddr2 = ((s3c_mylcdfb_info->fix.smem_start + s3c_mylcdfb_info->screen_size) >> 1) & 0x1fffff;//结束地址lcd_regs->lcdsaddr3 = (480*16/16); /* ⼀⾏的长度(单位: 2字节) *///s3c_lcd->fix.smem_start = xxx; /* 显存的物理地址 *//* 启动LCD */lcd_regs->lcdcon1 |= (1<<0); /* 使能LCD控制器 */lcd_regs->lcdcon5 |= (1<<3); /* 使能LCD本⾝电源 */*gpbdat |= 1; /* 输出⾼电平, 使能背光 *//*4、注册LCD*/register_framebuffer(s3c_mylcdfb_info);printk("register_framebuffer\n");return0;}static void lcd_drv_exit(void){unregister_framebuffer(s3c_mylcdfb_info);lcd_regs->lcdcon1 &= ~(1<<0); /* 关闭LCD本⾝ */*gpbdat &= ~1; /* 关闭背光 */dma_free_writecombine(NULL, s3c_mylcdfb_info->fix.smem_len, s3c_mylcdfb_info->screen_base, s3c_mylcdfb_info->fix.smem_start);iounmap(lcd_regs);iounmap(gpbcon);iounmap(gpccon);iounmap(gpdcon);iounmap(gpgcon);framebuffer_release(s3c_mylcdfb_info);}module_init(lcd_drv_init);module_exit(lcd_drv_exit);MODULE_LICENSE("GPL");2.重新编译内核,去掉默认的LCDmake menuconfig ,进⼊menu菜单重新设置内核参数:进⼊Device Drivers-> Graphics support:<M> S3C2410 LCD framebuffer support //将⾃带的LCD驱动设为模块, 不编进内核中然后make uImage 编译内核make modules 编译模块为什么要编译模块?因为LCD驱动相关的⽂件也没有编进内核,⽽fb_ops⾥的成员fb_fillrect(), fb_copyarea(), fb_imageblit()⽤的都是drivers/video下⾯的3个⽂件,所以需要这3个的.ko模块,如下图所⽰:3.挂载驱动将编译好的LCD驱动模块和drivers/video⾥的3个.ko模块放⼊nfs⽂件系统⽬录中然后烧写内核, 先装载3个/drivers/video下编译好的模块,再来装载LCD驱动模块挂载LCD驱动后, 如下图,可以通过 ls -l /dev/fb* 命令查看已挂载的LCD设备节点:4.测试运⾏测试有两种:echo hello> /dev/tty1 // LCD上便显⽰hello字段cat Makefile>/dev/tty1 // LCD上便显⽰Makeflie⽂件的内容4.1使⽤上节的键盘驱动在LCD终端打印命令⾏vi /etc/inittab //修改inittab, inittab:配置⽂件,⽤于启动init进程时,读取inittab添加->tty1::askfirst:-/bin/sh //将sh进程(命令⾏)输出到tty1⾥,也就是使LCD输出信息然后重启,insmod装载3个/drivers/video下编译好的模块,再来insmod装载LCD驱动模块,tty1设备便有了,就能看到提⽰信息:如下图,我们insmod上⼀节的键盘驱动后,按下enter键,便能在LCD终端上操作linux了从上图可以看到按下enter键,它就启动了⼀个进程号772的-sh进程,如下图发现这个-sh的描述符都指向了tty1:以上内容转载⾃。

LCD程序设计

LCD程序设计

FrameBuffer原理 5. FrameBuffer原理
它可以用来做双缓冲。双缓冲就是你的程序分配了可以 填充两个屏幕的内存。将offset设为0,将显示前400行 (假设是标准的vga),同时可以秘密的在400行到799行 构建另一个屏幕,当构建结束时,将yoffset设为400,新 的屏幕将立刻显示出来。现在将开始在第一块内存区中 构建下一个屏幕的数据,如此继续。这在动画中十分有 用。 将bits_per_pixel 设为1,2,4,8,16,24或32来改变 颜色深度(color depth)。不是所有的视频卡和驱动都支 持全部颜色深度。当颜色深度改变,驱动将自动改变fbbitfields。 现在我们知道了结构的细节了,但还不清楚如何去 获得或设置它们。这里有一些ioctl的命令可以参考,见程 序清单 1.3。
2.实验设备
硬件: 硬件: PC机 PC机 1台 MagicARM2410教学实验开发平台 MagicARM2410教学实验开发平台 1台 软件: 软件: RedHat Linux 9.0操作系统 9.0操作系统 Windows 98/2000/XP操作系统(可选) 98/2000/XP操作系统 可选) 操作系统( 嵌入式Linux开发环境 嵌入式Linux开发环境
LCD程序设计 程序设计
祝烈煌 中教832 liehuangz@
LCD程序设计 程序设计
1.实验目的
(1) 掌握Linux系统下FrameBuffer驱动的基本使 掌握Linux系统下 系统下FrameBuffer驱动的基本使 用方法; 用方法; (2) 掌握FrameBuffer常用API函数的使用方法。 掌握FrameBuffer常用 常用API函数的使用方法 函数的使用方法。 (3) 掌握编写LCD函数库 掌握编写LCD函数库 (4) 掌握使用LCD函数库 掌握使用L FrameBuffer原理

嵌入式Chapter5

嵌入式Chapter5

static int example_release(struct inode *inode, struct file *filp) { return 0; } static ssize_t example_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { return 0; } static ssize_t example_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) {

ioctl int ioctl(int fd, int cmd, …);
典型的外设编程方法
Int main(void) { int fd; char buf[100]; int size;
fd = open(“/dev/xx”, O_RDWR);
while(1){ read(fd, buf, size); write(fd, buf, size); } close(fd); return 0;

字符设备驱动程序框架
//hello.c #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/fs.h> #include <linux/proc_fs.h> #include <linux/fcntl.h> #define EXAMPLE_MAJOR 251 #define EXAMPLE_DEVNAME "example" #define EXAMPLE_DRIVER "example: " static int example_open(struct inode *inode, struct file *filp) { printk("Example\n"); return 0; }

LCD4Linux

LCD4Linux

Was ist LCD4Linux?
● ● ● ● ●
ein Daemon Ansteuerung von allen gängigen Displays Darstellung verschiedenster Informationen maximal flexibles Layout Unterstützung von Zusatzfeatures
Konfiguration Layout
Layout L16x2 { Row1 { Col1 'Busy' Col10 'Heartbeat' Col11 'BusyBar' } Row2 { Col1 'Disk' Col11 'DiskBar' } }
Status / Ausblick
● ●
– – – –
Temperaturmessung Lüfter-Drehzahlmessung Lüfter-Drehzahlsteuerung ...
Historie
~1998: erstes Display, erstes Programm ~1999: Übergang in den “ewigen Swapspace” 01/2000: zweiter Anlauf, Registrierung bei SourceForge 03/2000: erste öffentliche Version 0.95 04/2000: 0.96 08/2000: 0.97 09/2001: 0.98 (3 Entwickler) 08/2003: 0.9.9 + 0.9.10 09/2003: 0.9.11 11/2003: komplettes Redesign ??/2004: 0.10.0 (15 Entwickler)

13.2.2 LCD控制器的寄存器设置_嵌入式Linux系统实训教程_[共3页]

13.2.2  LCD控制器的寄存器设置_嵌入式Linux系统实训教程_[共3页]

第13章 LCD 驱动实例◆ 209 ◆ 13.2 S3C2410的LCD 控制器及IO 配置前面一个小节,只是抽象地了解了LCD 的显示原理及其工作时序。

究竟如何产生这些时序信号来控制LCD 显示图像呢?这就是本小节需要解决的问题。

一块LCD 屏显示图像不但需要LCD 驱动器,还需要相应的LCD 控制器。

通常LCD 驱动器会以COF/COG 的形式与LCD 玻璃基板制作在一起,而LCD 控制器则有外部电路来实现。

LCD 器件种类繁多,驱动方法也各不相同,但是无论哪种类型的器件,无论使用什么不同的驱动方法,都是以调整施加到像素上的电压、相位、频率、有效值、时序、占空比等一系列参数、特性来建立起一定的驱动条件实现显示的。

许多微控器(如S3C2410)都直接集成了LCD 控制器。

用户首先准备好要显示的图像数据,并将其放到一片指定的内存区域,这片存储区域称它为显示缓存区,简称显存,它与Linux 中的帧缓冲区(FrameBuffer )的概念密切相关,LCD 控制器负责从显存中读取图像数据并按照一定的控制时序将其发给LCD 驱动器,同时控制LCD 驱动器实现图像在LCD 的显示。

13.2.1 LCD 控制器S3C2410的LCD 控制器主要功能是传送图像数据和产生必要的控制信号,图像数据构成在LCD 上显示的图像,控制信号则用来控制前面介绍的各种参数从而可以正确显示。

如图13-4所示,VD[23:0]是数据引脚,是用来传送图像数据。

其他的引脚则是传送控制信号的。

REGBANK 是寄存器组的英文缩写,它包括17个可编程的寄存器,正是通过这些寄存器的设置来控制LCD 控制器。

LCDCDMA 是专为传送视频数据的专用DMA ,它自动实现将视频缓冲区中的数据传送到LCD 驱动器中。

由于有了这个专用的DMA ,视频数据可以不用CPU 的干涉在LCD 上显示,这极大地减轻了处理器的负担。

图13-4 S3C2410的LCD 控制器13.2.2 LCD 控制器的寄存器设置下面来看看S3C2410的LCD 控制器中一些主要寄存器的描述,并针对实例中所用的TFT 屏进行设置。

LCD_TFT,RGB接口在LINUX系统中的设置

LCD_TFT,RGB接口在LINUX系统中的设置

;----------------------------------------------------------------------------------;disp init configuration;;disp_mode (0:screen0<screen0,fb0>; 1:screen1<screen1,fb0>);screenx_output_type (0:none; 1:lcd; 3:hdmi;);screenx_output_mode (used for hdmi output, 0:480i 1:576i 2:480p 3:576p 4:720p50) ; (5:720p60 6:1080i50 7:1080i60 8:1080p24 9:1080p50 10:1080p60);fbx format (0:ARGB 1:ABGR 2:RGBA 3:BGRA 5:RGB565 8:RGB888 12:ARGB4444 16:ARGB1555 18:RGBA5551);fbx_width,fbx_height (framebuffer horizontal/vertical pixels, fix to output resolution while equal 0);lcdx_backlight (lcd init backlight,the range:[0,256],default:197;----------------------------------------------------------------------------------[disp_init]disp_init_enable = 1disp_mode = 0screen0_output_type = 1screen0_output_mode = 5screen1_output_type = 3screen1_output_mode = 5fb0_format = 0fb0_width = 0fb0_height = 0fb1_format = 0fb1_width = 0fb1_height = 0lcd0_backlight = 50lcd1_backlight = 50;----------------------------------------------------------------------------------;lcd0 configuration;lcd_if: 0:hv(sync+de); 1:8080; 2:ttl; 3:lvds; 4:dsi; 5:edp;lcd_x: lcd horizontal resolution;lcd_y: lcd vertical resolution;lcd_width: width of lcd in mm;lcd_height: height of lcd in mm;lcd_dclk_freq: in MHZ unit;lcd_pwm_freq: in HZ unit;lcd_pwm_pol: lcd backlight PWM polarity;lcd_pwm_max_limit lcd backlight PWM max limit(<=255);lcd_hbp: hsync back porch;lcd_ht: hsync total cycle;lcd_vbp: vsync back porch;lcd_vt: vysnc total cycle;lcd_hspw: hsync plus width;lcd_vspw: vysnc plus width;lcd_lvds_if: 0:single link; 1:dual link;lcd_lvds_colordepth: 0:8bit; 1:6bit;lcd_lvds_mode: 0:NS mode; 1:JEIDA mode;lcd_frm: 0:disable; 1:enable rgb666 dither; 2:enable rgb656 dither ;lcd_gamma_en lcd gamma correction enable;lcd_bright_curve_en lcd bright curve correction enable;lcd_cmap_en lcd color map function enable;lcdgamma4iep: Smart Backlight parameter, lcd gamma vale * 10;; decrease it while lcd is not bright enough; increase while lcd is too bright;----------------------------------------------------------------------------------[lcd0_para]lcd_used = 1lcd_driver_name = "default_lcd"lcd_bl_0_percent = 0lcd_bl_40_percent = 23lcd_bl_100_percent = 100lcd_if = 0lcd_x = 800lcd_y = 480lcd_width = 150lcd_height = 94lcd_dclk_freq = 30lcd_pwm_used = 1lcd_pwm_ch = 0lcd_pwm_freq = 50000lcd_pwm_pol = 1lcd_pwm_max_limit = 255lcd_hbp = 46lcd_ht = 928lcd_hspw = 0lcd_vbp = 23lcd_vt = 1050lcd_vspw = 0lcd_frm = 0lcd_cmap_en = 0lcd_dsi_if = 2lcd_dsi_lane = 4lcd_dsi_format = 0lcd_dsi_te = 0lcd_lvds_if = 0lcd_lvds_colordepth = 1lcd_lvds_mode = 0lcd_hv_clk_phase = 0lcd_hv_sync_polarity = 0lcd_gamma_en = 0lcd_bright_curve_en = 0lcd_cmap_en = 0lcdgamma4iep = 22lcd_bl_en = port:PD29<1><0><default><1>lcd_bl_regulator = "none"lcd_power = "vcc-lcd"lcd_power1 =lcd_power2 =;lcdd0 = port:PD18<3><0><default><default> ;lcdd1 = port:PD19<3><0><default><default> ;lcdd2 = port:PD20<3><0><default><default> ;lcdd3 = port:PD21<3><0><default><default> ;lcdd4 = port:PD22<3><0><default><default> ;lcdd5 = port:PD23<3><0><default><default> ;lcdd6 = port:PD24<3><0><default><default> ;lcdd7 = port:PD25<3><0><default><default> ;lcdd8 = port:PD26<3><0><default><default> ;lcdd9 = port:PD27<3><0><default><default>lcdd2 = port:PD2<2><0><default><default> lcdd3 = port:PD3<2><0><default><default> lcdd4 = port:PD4<2><0><default><default> lcdd5 = port:PD5<2><0><default><default> lcdd6 = port:PD6<2><0><default><default> lcdd7 = port:PD7<2><0><default><default>lcdd10 = port:PD10<2><0><default><default>lcdd11 = port:PD11<2><0><default><default>lcdd12 = port:PD12<2><0><default><default>lcdd13 = port:PD13<2><0><default><default>lcdd14 = port:PD14<2><0><default><default>lcdd15 = port:PD15<2><0><default><default>lcdd18 = port:PD18<2><0><default><default>lcdd19 = port:PD19<2><0><default><default>lcdd20 = port:PD20<2><0><default><default>lcdd21 = port:PD21<2><0><default><default>lcdd22 = port:PD22<2><0><default><default>lcdd23 = port:PD23<2><0><default><default>lcdclk = port:PD24<2><0><default><default>lcdde = port:PD25<2><0><default><default>lcdhsync = port:PD26<2><0><default><default>lcdvsync = port:PD27<2><0><default><default>lcd_io_regulator = "vcc-lvds-18"lcd_io_regulator1 = "vcc-pd";lcd_gpio_0 = port:PD25<1><0><default><0>;lcd_gpio_1 = port:PD26<1><0><default><0>;lcd_io_regulator1 = "vcc-pd";----------------------------------------------------------------------------------。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档