四、帧缓冲(FrameBuffer)设备驱动实例代码:
①、建立驱动文件:my2440_lcd.c,依就是驱动程序的最基本结构:FrameBuffer驱动的初始化和卸载部分及其他,如下:
#include <linux/kernel.h> #include <linux/module.h> #include <linux/errno.h> #include <linux/init.h> #include <linux/platform_device.h> #include <linux/dma-mapping.h> #include <linux/fb.h> #include <linux/clk.h> #include <linux/interrupt.h> #include <linux/mm.h>
#include <linux/slab.h> #include <linux/delay.h> #include <asm/irq.h> #include <asm/io.h> #include <asm/div64.h> #include <mach/regs-lcd.h> #include <mach/regs-gpio.h> #include <mach/fb.h> #include <linux/pm.h>
/*FrameBuffer设备名称*/ static char driver_name[] = "my2440_lcd";
/*定义一个结构体用来维护驱动程序中各函数中用到的变量 先别看结构体要定义这些成员,到各函数使用的地方就明白了*/ struct my2440fb_var { int lcd_irq_no; /*保存LCD中断号*/ struct clk *lcd_clock; /*保存从平台时钟队列中获取的LCD时钟*/ struct resource *lcd_mem; /*LCD的IO空间*/ void __iomem *lcd_base; /*LCD的IO空间映射到虚拟地址*/ struct device *dev;
struct s3c2410fb_hw regs; /*表示5个LCD配置寄存器,s3c2410fb_hw定义在mach-s3c2410/include/mach/fb.h中*/
/*定义一个数组来充当调色板。 据数据手册描述,TFT屏色位模式为8BPP时,调色板(颜色表)的长度为256,调色板起始地址为0x4D000400*/ u32 palette_buffer[256];
u32 pseudo_pal[16]; unsigned int palette_ready; /*标识调色板是否准备好了*/ };
/*用做清空调色板(颜色表)*/ #define PALETTE_BUFF_CLEAR (0x80000000)
/*LCD平台驱动结构体,平台驱动结构体定义在platform_device.h中,该结构体成员接口函数在第②步中实现*/ static struct platform_driver lcd_fb_driver = { .probe = lcd_fb_probe, /*FrameBuffer设备探测*/ .remove = __devexit_p(lcd_fb_remove), /*FrameBuffer设备移除*/ .suspend = lcd_fb_suspend, /*FrameBuffer设备挂起*/ .resume = lcd_fb_resume, /*FrameBuffer设备恢复*/ .driver = { /*注意这里的名称一定要和系统中定义平台设备的地方一致,这样才能把平台设备与该平台设备的驱动关联起来*/ .name = "s3c2410-lcd", .owner = THIS_MODULE, }, };
static int __init lcd_init(void) { /*在Linux中,帧缓冲设备被看做是平台设备,所以这里注册平台设备*/ return platform_driver_register(&lcd_fb_driver); }
static void __exit lcd_exit(void) { /*注销平台设备*/ platform_driver_unregister(&lcd_fb_driver); }
module_init(lcd_init); module_exit(lcd_exit);
MODULE_LICENSE("GPL"); MODULE_AUTHOR("Huang Gang"); MODULE_DESCRIPTION("My2440 LCD FrameBuffer Driver"); |
②、LCD平台设备各接口函数的实现:
注:暂存的内容只能恢复到当前文章的编辑器中,如需恢复到其他文章中,请编辑该文章并从暂存箱中恢复;或者直接复制以上内容,手工恢复到相关文章。
恢复到编辑器 关闭
function sendPV(){ var pvTrack = new PvTrack(); pvTrack.type = 35; // 频道类别ID pvTrack.channel = 189; // 频道ID pvTrack.pageType = 0; pvTrack.track(); } window.setTimeout("sendPV()", 0); var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-20237423-2']); _gaq.push(['_setDomainName', '.chinaunix.net']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? '' : '') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://"); document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F0ee5e8cdc4d43389b3d1bfd76e83216b' type='text/javascript'%3E%3C/script%3E"));
阅读(3141) | 评论(0) | 转发(0) |