ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:49.07KB ,
资源ID:7390893      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7390893.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(linux2628下6410LCD驱动分析.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

linux2628下6410LCD驱动分析.docx

1、linux2628下6410LCD驱动分析linux2.6.28下6410LCD驱动分析本文不详细分析lcd的每行代码,只是做简单的构架分析, 要详细的分析可以参考 LCD驱动是用了device 和driver架构,首先看arch/arm/mach-s3c6410/mach-smdk6410.c文件,在353行有这样一个数组static struct platform_device *smdk6410_devices _initdata = &s3c_device_lcd,我们在进里面了解详情,在arch/arm/palt-s3c64xx/devs.c文件里有s3c_device_lcd变量的

2、定义static struct resource s3c_lcd_resource = 0 = .start = S3C64XX_PA_LCD, /lcd寄存器的起始地址.end = S3C64XX_PA_LCD + SZ_1M - 1,/lcd寄存器的结束地址,.flags = IORESOURCE_MEM,1 = .start = IRQ_LCD_VSYNC,/lcd中断寄存器起始地址,在s3cfb_probe用.end = IRQ_LCD_SYSTEM,.flags = IORESOURCE_IRQ,;static u64 s3c_device_lcd_dmamask = 0xfffff

3、fffUL;struct platform_device s3c_device_lcd = .name = s3c-lcd,/这个会和driver中的name一样,driver/根据这个进行匹配.id = -1,.num_resources = ARRAY_SIZE(s3c_lcd_resource),.resource = s3c_lcd_resource,.dev = .dma_mask= &s3c_device_lcd_dmamask,.coherent_dma_mask= 0xffffffffUL;在arch/arm/mach-s3c6410/mach-smdk6410.c文件的sta

4、tic void _init smdk6410_machine_init(void)函数中有这么一句话platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices);这个就是对device设备进行注册,在注册driver驱动时,会根据name找到相应的device进行匹配,然后会调用probe。 下面分析driver,在drivers/video/samsung/s3cfb.c文件的最下面有这样的一段代码static struct platform_driver s3cfb_driver = .probe= s3cfb_p

5、robe, /匹配的话会调用这个函数.remove= s3cfb_remove,.suspend= s3cfb_suspend,.resume= s3cfb_resume, .driver= .name= s3c-lcd,/上面说的,内核会根据这个来找到相应的device.owner= THIS_MODULE,;int _devinit s3cfb_init(void)return platform_driver_register(&s3cfb_driver);/进行drive注册匹配后会掉用s3cfb_probe();这个函数里面对fbinfo进行初始化,对相关寄存器进行初始化,在6410l

6、cd驱动中,主要要修改的几个文件是:drivers/video/samsung目录下的s3cfb.c,假设你在配置的时候即用make menuconfig命令,在里面选择的是480WV,他对应的文件时s3cfb_lte480wv.c,s3cfb_lte480wv.c是和屏参数相关的文件。还有个要改的文件是s3cfb_fimd4x.c,这个文件主要是涉及寄存器的一些参数的配置。 主要几个重点:对构架的分析,理清楚各个文件的关系。s3cfb.c中的s3cfb_probe主要是在根据s3cfb_fimd4x.c和s3cfb_lte480wv.c文件来初始fbinfo,并且写相关LCD寄存器。s3cf

7、b_lte480wv.c主要是记录屏的参数,在这里进行修改来满足不同的lcd屏。s3cfb_fimd4x.c是对寄存器的值进行初始化,比如各个窗口的显示模式、颜色表寄存器的模式、各个窗口的控制寄存器,此文件还包含6410对于lcd的特殊功能,用ioctl来进行实现的。fbmem.c这个是fb字符设备驱动,每个窗口都是一个字符设备,在s3cfb_probe中通过调用register_buffer进行注册,注意,里面有一个fb_notifier_call_chain,他最终会调用drivers/video/console/fbcon.c中的fbcon_init,里面会有对logo的调用;fbmem

8、.c文件里还有通用的ioctl功能调用,适合所有带lcd控制器的处理器,这个文件时通用的,每个处理器的fbmem都是一样的,做成了和硬件无关。 lcd驱动简单构架图abcs3c2410_lcd & frame buffer 驱动分析 int _init s3c2410fb_probe(struct device *dev) struct s3c2410fb_info *info; struct fb_info *fbinfo; struct platform_device *pdev = to_platform_device(dev); struct s3c2410fb_hw *mregs;

9、int ret; int irq; int i; mach_info = dev-platform_data;/获取lcd相关寄存器配置信息 if (mach_info = NULL) dev_err(dev,no platform data for lcd, cannot attachn); return -EINVAL; mregs = &mach_info-regs; irq = platform_get_irq(pdev, 0); if (irq par;/调用framebuffer_alloc分配内存的时候,其实顺带分配了struct s3c2410fb_info结构,紧跟struc

10、t fb_info结构的后面,fbinfo-par指针处。 info-fb = fbinfo; dev_set_drvdata(dev, fbinfo); s3c2410fb_init_registers(info);/lcd相关寄存器配置 dprintk(devinitn); strcpy(fbinfo-fix.id, driver_name); /* 配置信息存储起来,以后用到 */ memcpy(&info-regs, &mach_info-regs, sizeof(info-regs); info-mach_info = dev-platform_data; /* 以下配置,详细请参考

11、网上资料 */ fbinfo-fix.type = FB_TYPE_PACKED_PIXELS; fbinfo-fix.type_aux = 0; fbinfo-fix.xpanstep = 0; fbinfo-fix.ypanstep = 0; fbinfo-fix.ywrapstep = 0; fbinfo-fix.accel = FB_ACCEL_NONE; fbinfo-var.nonstd = 0; fbinfo-var.activate = FB_ACTIVATE_NOW; /* 设置分辨率 */ fbinfo-var.height = mach_info-height; fbin

12、fo-var.width = mach_info-width; fbinfo-var.accel_flags = 0; fbinfo-var.vmode = FB_VMODE_NONINTERLACED; fbinfo-fbops = &s3c2410fb_ops;/重要的fop结构(fb设备本质上是字符设备) fbinfo-flags = FBINFO_FLAG_DEFAULT; fbinfo-pseudo_palette = &info-pseudo_pal; fbinfo-var.xres = mach_info-xres.defval; fbinfo-var.xres_virtual

13、= mach_info-xres.defval; fbinfo-var.yres = mach_info-yres.defval; fbinfo-var.yres_virtual = mach_info-yres.defval; fbinfo-var.bits_per_pixel = mach_info-bpp.defval; fbinfo-var.upper_margin = S3C2410_LCDCON2_GET_VBPD(mregs-lcdcon2) +1; fbinfo-var.lower_margin = S3C2410_LCDCON2_GET_VFPD(mregs-lcdcon2)

14、 +1; fbinfo-var.vsync_len = S3C2410_LCDCON2_GET_VSPW(mregs-lcdcon2) + 1; fbinfo-var.left_margin = S3C2410_LCDCON3_GET_HFPD(mregs-lcdcon3) + 1; fbinfo-var.right_margin = S3C2410_LCDCON3_GET_HBPD(mregs-lcdcon3) + 1; fbinfo-var.hsync_len = S3C2410_LCDCON4_GET_HSPW(mregs-lcdcon4) + 1; /* 配色板设置(采用5、6、5模式

15、) */ fbinfo-var.red.offset = 11; fbinfo-var.green.offset = 5; fbinfo-var.blue.offset = 0; fbinfo-var.transp.offset = 0; fbinfo-var.red.length = 5; fbinfo-var.green.length = 6; fbinfo-var.blue.length = 5; fbinfo-var.transp.length = 0; /* 计算需要申请的framer buffer大小(以字节为单位) */ fbinfo-fix.smem_len = mach_in

16、fo-xres.max * mach_info-yres.max * mach_info-bpp.max / 8; for (i = 0; i palette_bufferi = PALETTE_BUFF_CLEAR; if (!request_mem_region(unsigned long)S3C24XX_VA_LCD, SZ_1M, s3c2410-lcd) ret = -EBUSY; goto dealloc_fb; dprintk(got LCD regionn); ret = request_irq(irq, s3c2410fb_irq, SA_INTERRUPT, pdev-na

17、me, info); if (ret) dev_err(dev, cannot get irq %d - err %dn, irq, ret); ret = -EBUSY; goto release_mem; info-clk = clk_get(NULL, lcd); if (!info-clk | IS_ERR(info-clk) printk(KERN_ERR failed to get lcd clock sourcen); ret = -ENOENT; goto release_irq; clk_use(info-clk); clk_enable(info-clk); dprintk

18、(got and enabled clockn); msleep(1); /* Initialize video memory */ ret = s3c2410fb_map_video_memory(info); if (ret) printk( KERN_ERR Failed to allocate video RAM: %dn, ret); ret = -ENOMEM; goto release_clock; dprintk(got video memoryn); ret = s3c2410fb_init_registers(info);/怎么再次初始化lcd相关寄存器了? ret = s

19、3c2410fb_check_var(&fbinfo-var, fbinfo);/注册frame buffer前的一个例行检查 ret = register_framebuffer(fbinfo); if (ret node, fbinfo-fix.id); return 0;free_video_memory: s3c2410fb_unmap_video_memory(info);release_clock: clk_disable(info-clk); clk_unuse(info-clk); clk_put(info-clk);release_irq: free_irq(irq,info

20、);release_mem: release_mem_region(unsigned long)S3C24XX_VA_LCD, S3C24XX_SZ_LCD);dealloc_fb: framebuffer_release(fbinfo); return ret;/* * s3c2410fb_map_video_memory(): * Allocates the DRAM memory for the frame buffer. This buffer is * remapped into a non-cached, non-buffered, memory region to * allow

21、 palette and pixel writes to occur without flushing the * cache. Once this area is remapped, all virtual memory * access to the video memory should occur at the new region. */static int _init s3c2410fb_map_video_memory(struct s3c2410fb_info *fbi) dprintk(map_video_memory(fbi=%p)n, fbi); fbi-map_size

22、 = PAGE_ALIGN(fbi-fb-fix.smem_len + PAGE_SIZE);/页对齐 fbi-map_cpu = dma_alloc_writecombine(fbi-dev, fbi-map_size, &fbi-map_dma, GFP_KERNEL);/目前我只知道用于分配可供dma使用的内存,其中返回地址fbi-map_cpu为虚拟地址,fbi-map_dma为物理地址。 fbi-map_size = fbi-fb-fix.smem_len;/恢复真实的大小 if (fbi-map_cpu) /* prevent initial garbage on screen *

23、/ dprintk(map_video_memory: clear %p:%08xn, fbi-map_cpu, fbi-map_size); memset(fbi-map_cpu, 0xf0, fbi-map_size); fbi-screen_dma = fbi-map_dma;/物理地址 fbi-fb-screen_base = fbi-map_cpu;/虚拟地址 fbi-fb-fix.smem_start = fbi-screen_dma;/物理地址 dprintk(map_video_memory: dma=%08x cpu=%p size=%08xn, fbi-map_dma, f

24、bi-map_cpu, fbi-fb-fix.smem_len); return fbi-map_cpu ? 0 : -ENOMEM;static struct s3c2410fb_mach_info sbc2410_lcdcfg _initdata = .fixed_syncs= 0, .regs= .lcdcon1= S3C2410_LCDCON1_TFT16BPP | S3C2410_LCDCON1_TFT | S3C2410_LCDCON1_CLKVAL(6), .lcdcon2= S3C2410_LCDCON2_VBPD(2) | S3C2410_LCDCON2_LINEVAL(319) | S3C2410_LCDCON2_VFPD(0) | S3C2410_LCDCON2_

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1