Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57094
  • 博文数量: 9
  • 博客积分: 227
  • 博客等级: 二等列兵
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-19 02:11
文章分类
文章存档

2012年(9)

分类: LINUX

2012-04-22 09:14:19

四、帧缓冲(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; /*LCDIO空间*/
void __iomem *lcd_base; /*LCDIO空间映射到虚拟地址*/
struct device *dev;

struct s3c2410fb_hw regs; /*表示5LCD配置寄存器,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) |
      给主人留下些什么吧!~~