Linux lcd驱动分析
CPU
zh e
lcd GPIO
n
Fa
rs
ig
ht
In
1
c.
LCD
core GPC8-GPC15 GPD0-GPD15
__________________________________________________________________________ 1001
1001
VD[0:23] GPDX
rs
ig
HSYNC
ht
239
(VSPW+1)
VSPW+1+VBPD+1
In
9
c.
HSYNC HSPW HSYNC HSYNC+1 VCLK
__________________________________________________________________________ 1001
1001
__________________________________________________________________________ 1001
1001
TFT HSYNC VCLK
VSYNC HSYNC VDEN
VSYNC
1
Sh
VSYNC VSPW+1 VBPD+1 CRT TFT WXCAT35-TG3#001F 3.5 TFT VFPD +1 CRT LCD HSYNC
1001
Sh
en
fbmem.c FrameBuffer
zh e
fbmem.c FrameBuffer
3.1
FrameBuffer
n
fb_info
fb_info struct fb_info { int node; struct fb_var_screeninfo var; /* Current var */ struct fb_fix_screeninfo fix; /* Current fix */ struct fb_videomode *mode; /* current mode */
ht
ux Framebuffer
In
BIOS fbmem.c
10
c.
Framebuffer Linux Framebuffer
Linux FrameBuffer
FrameBuffer
__________________________________________________________________________ 1001
1001
LCD_PWREN : LCD LCDVF0 : SEC TFT LCDVF1 : SEC TFT LCDVF2 : SEC TFT OE REV REVB
Sh
VFRAME LCD
LCD LCD
LCD VFRAME
en
VCLK VM
VLINE LCD
LCD VCLK LCD
zh e
AC VLINE 24 5 LCD 5V 3.3V
LCDCONX
LCD
LCd LCDCON1-LCDCON5( LCDSADDR1-LCDSADDR3
LCd LCd
n
S3c2410
Fa
LCD
S3C2410 LCDSADDR1-LCDSADDR3
rs
ig
DOS
lcd
view poit
linux
3.1 FrameBuffer Linux Lin FrameBuffer Framebuffer Framebuffer
ht
STN / STN/TFT STN (TFT)/SEC TFT / / SEC TFT
TFT / SEC TFT
In
4
c.
(STN/TFT/SEC TFT) TFT / SEC TFT
__________________________________________________________________________ 1001
STN
/
TFT
/ SEC TFT
(TFT)/SEC TFT SEC
LCDVF0 : SEC TFT LCDVF1 : SEC TFT LCDVF2 : SEC TFT
Fa
Samsung Electronics Company
rs
LCD
LCD
S3C2410 74LVCH162245
dev
74LVCH162245 LCD_CON
CLKVAL
zh e
VSYNC VSPW+1 VSYNC
VCLK
LCDCON1
n
VSYNC
Fa
Frame Rate = 1/ [ { (VSPW+1) + (VBPD+1) + (LIINEVAL + 1) + (VFPD+1) } * {(HSPW+1) + (HBPD +1) + (HFPD+1) + (HOZVAL + 1) }*{ 2 *( CLKVAL+1 ) / ( HCLK ) } ] VSPW VBPD VBPD+1 VSYNC LINEVAL VFBD: VFBD+1 LINEVAL+1 VSPW+1 HSYNC VBPD+1 VBPD+1
en
240*320
zh e
n
Fa
rs
ig
ht
In
6
c.
2.1
__________________________________________________________________________ 1001
1001
Sh
en
zh e
n
Fa
rs
ig
ht
In
7
c.
2.2
__________________________________________________________________________ 1001
1001
Sh
en
zh e
n
Fa
rs
ig
ht
In
8
2.3
c.
VSPW+1=tvp=3 -> VSPW=2 VBPD+1=15 -> VBPD=14 LINVAL+1=240-> LINVAL=239
__________________________________________________________________________ 1001
1001
Linux lcd
1001 2010-5-10
----------------------------------------------------------------------------------------------------------------------
Sh
en
----------------------------------------------------------------------------------------------------------------------
lcd GPCCON )
24
GPC0-7 GPCCON GPDCON = 0xaaaaaaaa
LCD GPC GPD
GPG4 GPCX
LCD_PWEREN LCD
= 0xaaaaaaaa;GPDCON
GPIO
Sh
GPIO
en
VFRAME/VSYNC/STV : VLINE/HSYNC/CPV :
STN
240
ig
65536
,bpp:bit per pixel
ht
320 LCD
)
S3C2410 1 LCD
S3C2410X LCD VFRAME VLINE
LCD
In
130
3
c.
LCD LCD VCLK VM
__________________________________________________________________________ 1001
LCD LCD LCD VLINE LCD
LCD
LCD
n
LCD
VM
Fa
VCLK VM 5V
LCD
LCD
RGB 16 5 LCD 3.3V
rs
S3C2410
16
TFT
ig
5V
S3C2410 S3C2410
LCD LCD
ht
5V
3.3V
In
STN
5
CON/COG
LCD
c.
LCD TFT
MCU
LCD
3
TFT LCD
VFRAME, VLINE,VCLK, VM,
en
17
VIDPRCS, TIMEGEN, and LPC3600
LCDCDMA
4/8
LCD
zh e
4 3.5 : TFT LCD
DMA CPU
VCLK, VM
n
: 130
LCD
:WX3500F-M15#04
Fa
=3.5cm
rs
64K
320*240( 24bpp 16BPP
/
TFT
/ SEC TFT
VCLK/LCD_HCLK : VD[23:0] : LCD
内核中lcd驱动分析
[ 0.366667] [DISP WRN] file:drivers/video/sun7i/disp/OSAL/OSAL_Clock.c,line:347: NULL hdle
de_bsp/de/disp_event.o de_bsp/de/disp_hdmi.o de_bsp/de/disp_hwc.o de_bsp/de/disp_layer.o\
de_bsp/de/disp_lcd.o de_bsp/de/disp_scaler.o de_bsp/de/disp_sprite.o de_bsp/de/disp_tv.o\
{
int ret = 0, err;
printk("hyh in lcd_module_init\n");
__inf("lcd_module_init\n");
alloc_chrdev_region(&devid, 0, 1, "lcd");
==============================内核中LCD驱动分析
20151008 aw LCD
===========driver/video/sun7i
--disp/
--Hdmi/
--lcd/ lcd_init
obj-$(CONFIG_LYCHEE_FB_SUN7I) += disp.o
LCD_get_panel_funs_0(&lcd0_cfg);
LinuxLCD驱动源码分析研究及移植
Linux地LCD驱动源码分析及移植(三部曲)第一部分:基于ARM9处理器地linux-2.6.32.2操作系统内核移植手记part5.1(LCD驱动源码分析及移植之platform device)b5E2R。
1.与LCD控制器硬件相关地寄存器内容请参照三星S3C2440A技术手册中地第15章.2. LCD Controller地平台设备定义如下(文件位于linux/arch/arm/plat-s3c24xx/devs.c):p1Ean。
1./* LCD Controller */2.3.static struct resource s3c_lcd_resource[] = {4. [0] = {5. .start = S3C24XX_PA_LCD,6. .end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,7. .flags = IORESOURCE_MEM,8. },9. [1] = {10. .start = IRQ_LCD,11. .end = IRQ_LCD,12. .flags = IORESOURCE_IRQ,13. }14.15.};16.17.static u64 s3c_device_lcd_dmamask = 0xffffffffUL;18.19.struct platform_device s3c_device_lcd = {20. .name = "s3c2410-lcd",21. .id = -1,22. .num_resources = ARRAY_SIZE(s3c_lcd_resource),23. .resource = s3c_lcd_resource,24. .dev = {25. .dma_mask = &s3c_device_lcd_dmamask,26. .coherent_dma_mask = 0xffffffffUL27. }28.};29.30.EXPORT_SYMBOL(s3c_device_lcd);平台设备地结构体定义为s3c_device_lcd,该设备在平台总线中地名字取为s3c2410-lcd,该平台设备申请地两个板级资源为以S3C24XX_PA_LCD为起始地IORESOURCE_MEM资源和一个定义为IRQ_LCD地IORESOURCE_IRQ资源.DXDiT。
linux的lcd驱动详细讲解
linux的lcd驱动详细讲解嵌入式驱动程序Day12Top1.LCD驱动设计开发1 LCD驱动设计开发1.1 问题通过lcd驱动开发掌握linux内核framebuffer驱动开发通用方法。
1.2 方案一、帧缓冲(Framebuffer)。
帧缓冲(Framebuffer)是Linux为显示设备提供的一个接口,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。
Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过 Framebuffer的读写直接对显存进行操作。
用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。
这种操作是抽象的,统一的。
用户不必关心物理显存的位置、换页机制等等具体细节。
这些都是由 Framebuffer设备驱动来完成的。
Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池。
CPU将运算后的结果放到这个水池,水池再将结果流到显示器,中间不会对数据做处理。
应用程序也可以直接读写这个水池的内容。
在应用程序中,一般通过将FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开/dev/fb0 设备,并通过mmap 系统调用进行地址映射。
FrameBuffer 设备还提供了若干 ioctl 命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。
二、FrameBuffer在Linux中的实现和机制。
Framebuffer对应的源文件在linux/drivers/video/目录下。
总的抽象设备文件为fbcon.c,在这个目录下还有与各种显卡驱动相关的源文件。
1.分析Framebuffer设备驱动。
基于Linux的液晶显示屏驱动技术的研究与应用
基于Linux的液晶显示屏驱动技术的研究与应用随着信息技术的快速发展,液晶显示屏已经成为我们日常生活中不可或缺的一部分。
而Linux作为一个开源操作系统,其稳定性和可定制性使其成为液晶显示屏驱动技术的理想选择。
本文将探讨基于Linux的液晶显示屏驱动技术的研究与应用。
首先,我们来了解一下液晶显示屏的基本原理。
液晶显示屏通过电场控制液晶分子的排列来实现图像的显示。
传统的驱动技术包括行列驱动和点阵驱动。
而基于Linux的液晶显示屏驱动技术主要涉及到软件层面的驱动程序和内核模块。
在软件层面,液晶显示屏驱动程序的开发需要考虑到图像传输、显示模式切换、颜色管理等方面的问题。
Linux提供了丰富的图形库和驱动接口,开发人员可以根据具体的需求来选择合适的工具和接口。
例如,通过使用X Window系统和Qt框架,开发人员可以更方便地实现图像传输和显示模式切换的功能。
此外,Linux还支持多种颜色管理方案,开发人员可以根据不同的需求选择合适的颜色管理方案。
在内核层面,液晶显示屏驱动技术的关键是对硬件设备的驱动程序的开发和调试。
Linux内核提供了丰富的设备驱动接口和框架,开发人员可以根据具体的设备特性来选择合适的驱动接口和框架。
例如,液晶显示屏驱动程序可以通过使用Framebuffer驱动接口或者Direct Rendering Manager框架来与硬件设备进行通信。
此外,Linux内核还支持动态电源管理和硬件加速等功能,开发人员可以通过调整相关参数来提高液晶显示屏的性能和功耗。
基于Linux的液晶显示屏驱动技术不仅在个人电脑和智能手机等消费电子产品中得到广泛应用,还在工业自动化、医疗设备和交通工具等领域发挥着重要作用。
例如,在工业自动化领域,液晶显示屏可以用来显示生产过程中的参数和状态信息,帮助操作员进行实时监控和控制。
在医疗设备领域,液晶显示屏可以用来显示医学图像和病人信息,帮助医生进行诊断和治疗。
总之,基于Linux的液晶显示屏驱动技术在信息技术领域中具有重要的意义。
ARM Linux平台下LCD控制器的配置及驱动分析
ARM Linux平台下LCD控制器的配置及驱动分析韩金利【摘要】The importance of LCD drive in Linux platform is introduced. The Samsung's 32-bit embed-ded microprocessor S3C2440A and LR043JC211 are presented for reference. By analyzing the interface circuit design of LCD display module and S3C2440 processor, this paper makes a detailed description of method and software configuration based on S3C-2440A the LCD controller. The LCD driver in the Linux is analyzed, and a verification method and the environment of experimental results are given as well.%介绍了linux平台下进行LCD驱动开发的重要性,以Samsung公司的32位嵌入式微处理器S3C2440A和LR043JC211为例,结合LCD显示模块与S3C2440处理器的接口电路设计,详细说明了基于S3C2440A处理器的LCD控制器的功能和软件配置方法,对Linux环境下LCD驱动进行分析,并给出了一种实验结果的验证环境与方法。
【期刊名称】《安徽电子信息职业技术学院学报》【年(卷),期】2013(000)004【总页数】4页(P34-36,39)【关键词】S3C2440A;LR043JC211;Linux;LCD驱动【作者】韩金利【作者单位】山西机电职业技术学院数控工程系,山西长治,046000【正文语种】中文【中图分类】TP368随着嵌入式处理器硬件成本的不断降低,嵌入式系统的应用更加广泛,对于大部分嵌入式系统开发者而言,显示系统的硬件和软件开发是不可回避的关键性技术 [1]。
MicrosoftWord-Linux的LCD驱动分析(四)
MicrosoftWord-Linux的LCD驱动分析(四)Linux 的 LCD 驱动分析(四)四、s3c2410fb_ops 变量详解在上面的文字中,较为详细的解释了platform device 相关的代码,通过上面的代码的执行,一个 platform 设备(framebuffer 被当作了 platform 设备)就加载到内核中去了。
就像一个 PCI 的网卡被加入到内核一样,不同的是 PCI 的网卡占用的是 PCI 总线,内核会直接支同 PCI 而对于 platform 设备需要用上面软件的方法加载到内核,持它。
网卡一样,设备需要驱动程序,刚才只是将 platform 设备注册到内核中,现在它还需要驱动程序,本节中就来看看这些驱动。
4.1 static struct fb_ops s3c2410fb_ops对于 s3c2410 的 framebuffer 驱动支持的操作主要有s3c2410fb_ops 变量中定义,该变量类型为 struct fb_ops,该类型的定义在 include/linux/fb.h 文件中。
下面看看对于 s3c2410 的驱动为该 framebuffer 提供了哪些操作。
static struct fb_ops s3c2410fb_ops = {.owner = THIS_MODULE,.fb_check_var = s3c2410fb_check_var,.fb_set_par = s3c2410fb_set_par,.fb_blank = s3c2410fb_blank,.fb_setcolreg = s3c2410fb_setcolreg,.fb_fillrect = cfb_fillrect,.fb_copyarea = cfb_copyarea,.fb_imageblit = cfb_imageblit,};上面的代码描述了支持的相关操作,下面主要会解释s3c2410****的函数,从.fb_fillrect 开始的三个函数将不会被提及,当然也可以去看看它们的行为是什么。
lcd驱动分析文档
嵌入式linux中的lcd驅動分析作者:傑洲村的木棉學校:廣東工業大學QQ:568109894在嵌入式linux中,lcd和觸控式螢幕驅動都是字元驅動,採用“檔層-驅動層”的介面方式,本文檔中分析的lcd驅動是針對linux2.6.13內核的,本人用的開發板是qq2440,lcd是三星的LTV3500V(帶觸控式螢幕的),具體分析的文件:是"include/linux/fb.h","drivers/video/s3c2410fb.h","drivers/video/s3c2410fb.c","drivers/video/fbmem.c","/include/asm/arch- s3c2410.fb.h(些標頭檔是針對s3c2440或s3c2410晶片的)",“/home/linux/5/kernel-2.6.13/arch/arm/mach-s3c2410/mach-smdk2410.c"(驅動移植主要就是要修改這個檔,配置一些參數)。
詳細看一下LCD的驅動,實際上,幾乎lcd設備驅動所要做的所有事情就是填充fb_info結構然後向系統註冊或登出它(1)fb.h包含了framebuffer所用到的結構(2)fbmem.c處於Framebuffer設備驅動技術的中心位置.它為上層應用程式提供系統調用也為下一層的特定硬體驅動提供介面;那些底層硬體驅動需要用到這兒的介面來向系統內核註冊它們自己. fbmem.c 為所有支援FrameBuffer的設備驅動提供了通用的介面,避免重復工作.(3)s3c2410fb.c就是特定硬體驅動(針對s3c2410晶片的),fbmem.c就是溝通應用層跟s3c2410fb.c的橋樑FrameBuffer設備驅動基於如下幾個檔:1)include/linux/fb.h2)drivers/video/fbmem.c3)drivers/video/s3c2410fb.c4)drivers/video/s3c2410fb.h5)include/asm/arch-s3c2410/fb.h現在先來分析這兩個檔:1.fb.h 包含了framebuffer 所用到的結構1)fb_fix_screeninfo 描述顯示卡的屬性,並且系統運行時不能被修改 structfb_fix_screeninfo {char id[16];unsigned long smem_start;/* identification string eg "TT Builtin" */ /* Start of frame buffer mem *//* (physical address) */__u32 smem_len;/* Length of frame buffer mem */__u32 type;__u32 type_aux;/* see FB_TYPE_* *//* Interleave for interleaved Planes */__u32 visual;/* see FB_VISUAL_* */ __u16 xpanstep;/* zero if no hardware panning */__u16 ypanstep;__u16 ywrapstep; __u32 line_length;/* zero if no hardware panning */ /* zero if no hardware ywrap */ /* length of a line in bytes */unsigned long mmio_start;/* Start of Memory Mapped I/O *//* (physical address) */__u32 mmio_len; __u32 accel;/* Length of Memory Mapped I/O *//* Indicate to driver which */ /* specific chip/card we have */};__u16 reserved[3];/* Reserved for future compatibility */2)fb_var_screeninfo 這個結構描述了顯示卡的特性struct fb_var_screeninfo {__u32 xres;__u32 yres;__u32 xres_virtual;/* visible resolution/* virtual resolution*/*/__u32 yres_virtual;__u32 xoffset; /* offset from virtual to visible */ __u32 yoffset;/* resolution*/__u32 bits_per_pixel; __u32 grayscale;/* guess what/* != 0 Graylevels instead of colors */*/struct fb_bitfield red; /* bitfield in fb mem if true color, */struct fb_bitfield green; /* else only length is significant */struct fb_bitfield blue;struct fb_bitfield transp; /* transparency */__u32 nonstd; /* != 0 Non standard pixel format */ __u32 activate;/* see FB_ACTIVATE_**/__u32 height; __u32 width;/* height of picture in mm/* width of picture in mm*/*/__u32 accel_flags; /* (OBSOLETE) see fb_info.flags *//* Timing: All values in pixclocks, except pixclock (of course) */__u32 pixclock; /* pixel clock in ps (pico seconds) */__u32 left_margin; /* time from sync to picture */__u32 right_margin; /* time from picture to sync */__u32 upper_margin; /* time from sync to picture */__u32 lower_margin;__u32 hsync_len; /* length of horizontal sync */__u32 vsync_len; /* length of vertical sync*/__u32 sync; /* see FB_SYNC_* */__u32 vmode; /* see FB_VMODE_* */__u32 rotate; /* angle we rotate counter clockwise */__u32 reserved[5]; /* Reserved for future compatibility */};3)fb_cmap描述設備無關的顏色映射資訊。
嵌入式Linux的LCD驱动的设计与实现 精品
嵌入式Linux的LCD驱动的设计与实现LCD Driver based on Linux第一章概述Linux操作系统有许多优点,最重要的就是它的内部实行细节对所有人都是公开的。
以前,操作系统的代码仅仅掌握在少数程序员手里,但是Linux使我们只要具备必要的技术能力,就可以方便的验证、理解、修改、移植操作系统,或者其中的某一部分。
驱动程序在Linux内核中扮演着特殊的角色。
它们使某个特定硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节。
用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。
将这些调用映射到作用于实际硬件的设备特有操作上,是驱动程序的主要任务。
这些接口可以使驱动程序独立于内核的其他部分而建立,以模块的形式,在需要时动态的插入到内核中,在不需要时可以移出内核。
显示出了其良好的特性。
由于液晶显示器的大量需求,以及Linux操作系统众多的优点,因此,本题目的设计选择了以Linux作为嵌入式设备的操作系统,对于基于Linux的嵌入式LCD驱动,将会有很好的应用前景。
1.1本课题的研究意义LCD(液晶显示)模块满足了嵌入式系统日益提高的要求,它可以显示汉字、字符和图形,同时还具有低压、低功耗、体积小、重量轻和超薄等很多优点。
随着嵌入式系统的应用越来越广泛,功能也越来越强大,对系统中的人机界面的要求也越来越高,在应用需求的驱使下,许多工作在Linux下的图形界面软件包的开发和移植工作中都涉及到底层LCD驱动的开发问题。
因此在嵌入式系统中开发LCD驱动得以广泛运用随着高性能嵌入式处理器的普及和硬件成本的不断降低,尤其是Arm系列处理器的推出,嵌入式系统的功能也越来越强。
在多媒体应用的推动下,彩色LCD也越来越多地应用到了嵌入式系统中,如新一代掌上电脑(PDA)多采用TFT显示器件,支持彩色图形界面,图片显示和视频媒体播放。
掌上电脑(PDA)的操作系统有微软Window CE, PalmOS等。
基于linux的嵌入式lcd驱动的设计毕业设计
哈尔滨工程大学毕业设计(论文)题目基于Linux的嵌入式LCD驱动设计学院通信与电子工程学院毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:摘要嵌入式设备因其种类多,复杂多样的特点决定嵌入式设备必须研发自己的设备驱动程序,而设备驱动程序在嵌入式系统中占有很重要的地位。
为此,本文深入研究与设计了基于嵌入式Linux的LCD驱动程序。
以ARM9开发板作为目标机,采用VMware虚拟平台以及Windows和Linux操作系统相结合的软件开发平台,搭建了研究和设计所需的交叉编译环境。
深入研究了内存与I/O访问、并发控制等关键技术。
进而采用帧缓冲技术,研发了LCD驱动程序,实现了对LCD的显示控制以及与内核的烧写。
以显示5个不同的颜色的应用程序对其测试,结果表明,所设计开发的LCD驱动程序运行稳定颜色鲜艳饱满,满足用户色彩界面开发的需求,达到设计目标。
关键词:嵌入式;Linux;设备驱动;帧缓冲;LCDAbstractAbstractEmbedded devices because of its variety of complex and diverse characteristics of the decision to embedded devices must develop their own device drivers, device driver plays an important role in embedded systems. In this paper, in-depth study and design of embedded Linux-based LCD driver. ARM9 development board as the target machine, using a combination of VMware virtualization platform, as well as Windows and Linux operating systems software development platform to build a research and design the required cross-compiler environment. In-depth study of the key technologies of memory and I/O access, concurrency control and so on. And then using the frame buffer technology, research and development of the LCD driver,LCD display control, and kernel programming. To show the application of five different colors of their test results show that the design and development of LCD driver stable full of bright colors, to meet the needs of the user color interface development, and meet the design goals.Keyword s: Embedded; Linux; device driver; frame buffer; the LCD目录摘要 (II)Abstract ................................................................................................................................... I V第一章绪论 (1)1.1 概述 (1)1.2 目前的发展现状及前景 (1)1.3 本文主要的研究意义 (2)1.4 本文的研究内容 (2)第2章系统设计综述 (4)2.1 操作系统的选择 (4)2.1.1 嵌入式系统的发展过程 (4)2.1.2 嵌入式的特点 (4)2.1.3 嵌入式程序的开发 (5)2.2 系统硬件的选择 (5)2.2.1 LCD液晶屏 (6)2.2.2 ARM9处理器 (7)2.2.3 S3C2440 处理器 (7)第3章创建嵌入式linux软件开发平台 (9)3.1 Linux系统 (9)3.2 Linux的发展过程 (9)3.3 Linux系统的优点 (10)3.4 基于ARM的嵌入式Linux交叉开发环境 (11)3.4.1 开发主机linux操作系统的安装 (11)3.4.2 开发主机基本服务及程序的安装、配置与使用 (11)3.4.3 Linux下模块操作命令简介 (11)3.4.4 建立交叉编译环境 (12)3.4.5 Makefile (13)第4章设备驱动程序关键技术介绍 (15)4.1 嵌入式Linux驱动程序 (15)4.1.1 设备驱动程序的作用 (15)4.2 Linux驱动程序关键技术 (15)4.2.1 内存与I/O端口 (15)4.2.2 并发控制 (17)第5章LCD驱动分析与实现 (19)5.1 LCD硬件原理 (19)5.1.1 LCD硬件需求与驱动控制分析 (19)5.1.2 S3C2440 CPU相关的GPIO介绍 (22)5.2 帧缓冲framebuffer (24)5.2.1 帧缓冲设备驱动结构 (24)5.2.3 Linux帧缓冲的关键数据结构 (25)5.3 LCD的关键数据结构 (28)5.4 LCD驱动程序设计 (29)5.4.1 创建设备 (29)5.4.2 注册设备驱动 (30)5.5 LCD驱动的测试程序 (31)结论 (33)参考文献 (34)附录1 (36)致谢 (64)第一章绪论1.1 概述现在的嵌入式开发始于微机时代的嵌入式应用的。
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()了。
