linux - fpga-framebuff驱动

* linux/drivers/video/fpga_fb.c --fpga graphics adaptor frame buffer device

*  Created 16 Sep2011

*      Based on dnfb.c

*

* History:

*

* This file is subject to the terms and conditions of the GNU General Public

* License.  See the file COPYING in the main directory of this archive

* for more details.

*/

#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/interrupt.h>

#include <linux/platform_device.h>

#include <asm/setup.h>

#include <asm/system.h>

#include <asm/irq.h>

#include <linux/clk.h>

#include <linux/fb.h>

#include <linux/module.h>

#define LCD_WIDTH    320

#define LCD_HEIGHT   240

#define DISPRAMBUFLSZ (LCD_WIDTH/8)

#define DISPRAMBUFSIZE (DISPRAMBUFLSZ*LCD_HEIGHT)

/* display_ video definitions */

static void __iomem *io_data=NULL;

static void __iomem *io_cmd=NULL;

static void __iomem *io_ctrl=NULL;

static unsigned long ioo_data=0;

static unsigned   char *rambuf_org  =   NULL;

static unsigned   char *rambuf_cur  =   NULL;

/* frame buffer operations */

// zydzfb_blank控制屏幕开关

static int zydzfb_blank(int blank, struct fb_info *info);

static struct fb_ops zydzfb_ops = {

.owner     = THIS_MODULE,

//.fb_blank   = zydzfb_blank,

.fb_fillrect  = cfb_fillrect,

.fb_copyarea  = cfb_copyarea,

.fb_imageblit = cfb_imageblit,

};

struct fb_var_screeninfo zydzfb_var __devinitdata = {

.xres         =   320,//实际x轴分辨率

.yres             =   240,//实际y轴分辨率

.xres_virtual =   320,//虚拟x轴分辨率

.yres_virtual =   240,//虚拟y轴分辨率

.bits_per_pixel=  1,  //定义每个点用多少位表示

.height       = -1,

.width     = -1,

//.vmode      = FB_VMODE_NONINTERLACED,

};

static struct fb_fix_screeninfo zydzfb_fix __devinitdata = {

.id           =   "zydzfb",//设备名称

.type             =   FB_TYPE_PACKED_PIXELS,

.visual           =   FB_VISUAL_MONO01 ,/* Monochr. 1=Black 0=White */

.line_length  = DISPRAMBUFLSZ,

};

/*

* Initialization

*/

static int __devinit zydzfb_probe(struct platform_device *dev)

{

struct fb_info *info;

int err = 0;

info = framebuffer_alloc(0, &dev->dev);

if (!info)

return -ENOMEM;

info->fbops = &zydzfb_ops;

info->fix = zydzfb_fix;

info->fix.smem_start = virt_to_phys(rambuf_cur);

info->fix.smem_len   = DISPRAMBUFSIZE;

info->var = zydzfb_var;

/* Virtual address */

info->screen_base = rambuf_cur;

info->screen_size = DISPRAMBUFSIZE;

err = fb_alloc_cmap(&info->cmap, 2, 0);

if (err < 0) {

framebuffer_release(info);

return err;

}

err = register_framebuffer(info);

if (err < 0) {

fb_dealloc_cmap(&info->cmap);

framebuffer_release(info);

return err;

}

platform_set_drvdata(dev, info);

/* now we have registered we can safely setup the hardware */

printk("display_ frame buffer alive and kicking !\n");

return err;

}

void disp_init( )

{

static int inited=0;

if(inited)return;

io_data=ioremap_nocache(LCD_DATA_PORT,32);

io_cmd=ioremap_nocache(LCD_CTRL_PORT,32);

io_ctrl=ioremap_nocache(LCD_PERH_PORT,32);

rambuf_org =   kmalloc(DISPRAMBUFSIZE,GFP_KERNEL);

rambuf_cur =   kmalloc(DISPRAMBUFSIZE,GFP_KERNEL);

lcd_reset();

inited=1;

}

unsigned char re_uc(unsigned char x)

{

x = (x&0x0f)<<4 |(x&0xf0)>>4;

x = (x&0x33)<<2 |(x&0xcc)>>2;

x = (x&0x55)<<1 |(x&0xaa)>>1;

return x;

}

static struct timer_list timer_key;

void fb_timer_func(unsigned long pa)

{

int i;

for(i=0;i<LCD_HEIGHT*DISPRAMBUFLSZ;i++)

{

if(rambuf_org[i]!=rambuf_cur[i])

{

WriteLCDCmd(SRCSET_CMD);

WriteLCDData(i%0x100);

WriteLCDData(i/0x100);

WriteLCDCmd(MEMWRITE_CMD);

WriteLCDData(re_uc(rambuf_cur[i]));

rambuf_org[i]=rambuf_cur[i];

}

}

mod_timer(&timer_key,jiffies+20);

}

static struct platform_driver zydzfb_driver = {

.probe = zydzfb_probe,

.driver    = {

.name  = "zydzfb",

},

};

static struct platform_device zydzfb_device = {

.name  = "zydzfb",

};

int __init zydzfb_init(void)

{

int ret,i,j;

disp_init( );

ret = platform_driver_register(&zydzfb_driver);

if (!ret) {

ret = platform_device_register(&zydzfb_device);

if (ret)

platform_driver_unregister(&zydzfb_driver);

}

init_timer(&timer_key);

timer_key.function=&fb_timer_func;

timer_key.expires=jiffies+10;

timer_key.data = 0;

add_timer(&timer_key);

return ret;

}

static void __exit zydzfb_exit(void)

{

del_timer(&timer_key);

platform_device_unregister(&zydzfb_device);

platform_driver_unregister(&zydzfb_driver);

if (rambuf_org)

kfree(rambuf_org);

if (rambuf_cur)

kfree(rambuf_cur);

}

module_init(zydzfb_init);

module_exit(zydzfb_exit);

MODULE_LICENSE("GPL");

时间: 2024-12-08 01:12:33

linux - fpga-framebuff驱动的相关文章

Linux 添加程序驱动

发现想要每天都写博客真不容易,每天都要写技术就意味着每天都要学新知识,没什么新知识,还真不好意思瞎写. 1. Linux 加载设备驱动 #insmod 设备驱动路径             如insmod /fpga.ko #mknod /dev/fpga8k c 248 0      创建/proc/dev/fpga8k 设备节点:其中 c 代表字符设备:248 主设备号:0 从设备号 主设备号---用来区分不同的硬件设备:从设备号,用来区分相同的硬件设备. #cat /proc/device

(57)Linux驱动开发之三Linux字符设备驱动

1.一般情况下,对每一种设备驱动都会定义一个软件模块,这个工程模块包含.h和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现. 2.典型的无操作系统下的逻辑开发程序是:这种三层的裸机驱动模型是足够满足低耦合.高内聚的特点的. 3.当有操作系统存在时,设备驱动成为了连接硬件和内核的桥梁,这时候的设备驱动对外表现为操作系统的API,与直接裸机开发不同,裸机开发时的设备驱动是应用工程师的API.如果设备驱动都按照操作系统给出的独立于设备的接口而设计,应用程序将可以使用统

在开发板Linux上挂载"驱动"挂载不成功,出现提示server 172.27.52.100 not responding, still trying

1.在开发板具体操作步骤如下: 1.1 :设置IP ifconfig eth0 172.27.52.200 1.2 :ping通 虚拟机Linux 主机Linux ping XXX.XXX.XXX.XXX 1.3.挂接 mount -t nfs -o nolock  XXX.XXX.XXX.XXX:/work/nfs_root/first_fs  /mnt // 例如:mount -t nfs -o nolock  172.27.52.100:/work/nfs_root/first_fs  /

linux字符设备驱动

一.字符设备.字符设备驱动与用户空间访问该设备的程序三者之间的关系. 如图,在Linux内核中使用cdev结构体来描述字符设备,通过其成员dev_t来定义设备号(分为主.次设备号)以确定字符设备的唯一性.通过其成员file_operations来定义字符设备驱动提供给VFS的接口函数,如常见的open().read().write()等. 在Linux字符设备驱动中,模块加载函数通过register_chrdev_region( ) 或alloc_chrdev_region( )来静态或者动态获

Linux下spi驱动开发

转载至:http://www.embedu.org/Column/Column367.htm 作者:刘洪涛,华清远见嵌入式学院讲师. 一.概述 基于子系统去开发驱动程序已经是linux内核中普遍的做法了.前面写过基于I2C子系 统的驱动开发.本文介绍另外一种常用总线SPI的开发方法.SPI子系统的开发和I2C有很多的相似性,大家可以对比学习.本主题分为两个部分叙述,第一 部分介绍基于SPI子系统开发的理论框架:第二部分以华清远见教学平台FS_S5PC100上的M25P10芯片为例(内核版本2.6

TQ2440学习笔记——Linux上I2C驱动的两种实现方法(1)

作者:彭东林 邮箱:[email protected] 内核版本:Linux-3.14 u-boot版本:U-Boot 2015.04 硬件:TQ2440 (NorFlash:2M   NandFlash:256M  内存:64M) 摘要 这里并不深入分析Linux下I2C驱动的实现,只是以TQ2440硬件平台为例分析I2C驱动的两种方法. 第一种方法: 使用S3C2440自带的I2C控制器实现,这个kernel已经支持,我们只需要配置即可. 第二种方法: 使用GPIO模拟,这个在kernel中

linux总线设备驱动模型

本篇文章通过平台总线设备模型为例,讲解总线设备驱动模型: platform_device_register的作用: 1.把device放入bus的device链表 2.从bus的driver链表中取出每一个driver,用bus的match函数判断driver能否支持这个device 3.若可以支持,调用driver的probe函数 platform_driver_register的作用: 1.将driver放入bus的driver链表 2.从bus的device链表中取出每一个device,用

Linux之初试驱动20160613

这篇文章主要介绍一下Linux内核下的驱动结构与书写,以及介绍Linux下简单使用驱动的应用程序: 首先我们直接看使用驱动的简单应用程序: #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> int main(int argc, char **argv) { int fd; unsigned c

linux块设备驱动之实例

前两篇blog已经基本熟悉了块设备的相关结构,这里来总结下ldd3中提到的一些块设备驱动例题: 1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major = register_blkdev(sbull_major, "sbull"); if (0 >= sbull_major){ printk(KERN_WARNING "sbull: unable to get major number!\n"); return

fpga的驱动调试dev_dbg 无输出

最近需要调试一个fpga的驱动,整的很蛋疼!dev_dbg 想使用这个作为调试输出都不成功,已经被彻底打败了!反思中... 目前是根据以下相关设置后均不能打印,和网上说的有些出入,问题还得研究下. 驱动程序调用dev_dbg的地方 打卡debug功能 printk.c的console默认级别也修改为8了 device.h文件 #insmod 3s3gs.ko 3s3gs Ethernet Driver, V0.11 FPGA id 23310001 FPGA Version: 0.9b022,