platform总线globalfifo驱动
- /*********************************************************************************
- * Copyright: (C) 2014 zhouguangfeng<zhouguangfeng91@gmail.com>
- + plat_globalfifo.c
- /*********************************************************************************
- * Copyright: (C) 2014 zhouguangfeng<zhouguangfeng91@gmail.com>
- * All rights reserved.
- *
- * Filename: plat_globalfifo.c
- * Description: This file is a commom platform driver
- *
- * Version: 1.0.0(08/19/2014)
- * Author: zhouguangfeng <zhouguangfeng91@gmail.com>
- * ChangeLog: 1, Release initial version on "08/19/2014 02:31:17 PM"
- *
- ********************************************************************************/
- #include <linux/fs.h>//struct file_operations
- #include <linux/types.h>//special type definition,like dev_t off_t defined by typedef
- #include <linux/init.h> // init and exit
- #include <linux/module.h>//support module load and unload
- #include <linux/errno.h>
- #include <linux/mm.h> //memory mannage ,include kmalloc.kfree and so on
- #include <linux/sched.h>
- #include <linux/cdev.h> //char device structure definition
- #include <asm/io.h> //io operation function ,like ioremap,iowrite
- #include <asm/system.h>
- #include <asm/ioctl.h> //for ioctl command
- #include <asm/uaccess.h>
- #include <linux/platform_device.h> //platform support
- #include <linux/kernel.h>
- #include <linux/device.h> //class_create() and device_create()
- #define GLOBALFIFO_SIZE 0x1000 /* 4K */
- #define NAME "globalfifo"
- #define KELNEL_OLD 0 /* decsion ioctl() */
- #ifndef GLOBALFIFO_MAJOR
- #define GLOBALFIFO_MAJOR 0
- #endif
- //#define GLOBALFIFO_CLEAR 0x17
- //#define MEM_CLEAR __IO (GLOBALFIFO_CLEAR, 0x20)
- #define MEM_CLEAR 0x20
- static int globalfifo_major = GLOBALFIFO_MAJOR;
- static int globalfifo_minor = ;
- /* ============================ Platform Device part =============================== */
- struct globalfifo_dev
- {
- struct cdev cdev;
- unsigned int current_len;
- unsigned char mem[GLOBALFIFO_SIZE];
- struct class *class;
- //struct semaphrore sem;
- // wait_queue_t r_wait;
- //wait_queue_t r_wait;
- } globalfifo_dev;
- static void plat_release(struct device * dev)
- {
- return;
- }
- static struct platform_device globalfifo_device = {
- .name = "globalfifo",
- .id = ,
- .dev = {
- .release = plat_release,
- },
- };
- /* ===================== globalfifo driver part ===========================*/
- int globalfifo_open(struct inode *inode, struct file *filp)
- {
- struct globalfifo_dev *dev;
- dev = container_of(inode->i_cdev, struct globalfifo_dev, cdev);
- filp->private_data = dev;
- return ;
- }
- int globalfifo_release(struct inode *inode, struct file *filp)
- {
- return ;
- }
- #if KELNEL_OLD
- static ssize_t globalfifo_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
- {
- struct globalfifo_dev *dev = filp->private_data;
- switch(cmd)
- {
- case MEM_CLEAR:
- memset(dev->mem, , GLOBALFIFO_SIZE);
- printk(KERN_INFO "globalfifo is set to zero\n");
- break;
- default:
- return -EINVAL;
- }
- return ;
- }
- #endif
- static ssize_t globalfifo_read(struct file *filp, char __user *buf, size_t size, loff_t *opps)
- {
- unsigned long p = *opps;
- unsigned int count = size;
- int ret = ;
- struct globalfifo_dev *dev = filp->private_data;
- if(p >= GLOBALFIFO_SIZE)
- {
- return count ? -ENXIO : ;
- }
- if(count > GLOBALFIFO_SIZE - p)
- {
- count = GLOBALFIFO_SIZE - p;
- }
- if(copy_to_user(buf, (void *)((dev->mem)+p), count))
- {
- ret = -EFAULT;
- }
- else
- {
- *opps += count;
- ret = count;
- printk(KERN_INFO"read %u bytes(s) from %lu\n", count, p);
- }
- return ret;
- }
- static ssize_t globalfifo_write(struct file *filp, const char __user *buf, size_t size, loff_t *opps)
- {
- unsigned long p = *opps;
- unsigned int count = size;
- int ret;
- struct globalfifo_dev *dev = filp->private_data;
- if(p >= GLOBALFIFO_SIZE)
- {
- return count ? -ENXIO : ;
- }
- if(count > GLOBALFIFO_SIZE - p)
- {
- count = GLOBALFIFO_SIZE - p;
- }
- if(copy_from_user(((dev->mem)+p), buf, count))
- {
- ret = -EFAULT;
- }
- else
- {
- *opps =+ count;
- ret = count;
- printk(KERN_INFO "written %u bytes(s) from %lu\n", count, p);
- }
- return ret;
- }
- #if 1
- static loff_t globalfifo_llseek(struct file *filp, loff_t offset, int orig)
- {
- loff_t ret = ;
- switch(orig)
- {
- case :
- if(offset < )
- {
- ret = -EINVAL;
- break;
- }
- if((unsigned int )offset > GLOBALFIFO_SIZE)
- {
- ret = -EINVAL;
- break;
- }
- filp->f_pos = (unsigned int)offset;
- ret = filp->f_pos;
- break;
- case :
- if((filp->f_pos + offset) > GLOBALFIFO_SIZE)
- { ret = -EINVAL;
- break;
- }
- if((filp->f_pos + offset) < )
- {
- ret = -EINVAL;
- break;
- }
- filp->f_pos += offset;
- ret = filp->f_pos;
- break;
- default:
- ret = -EINVAL;
- break;
- }
- return ret;
- }
- #endif
- static const struct file_operations globalfifo_fops ={
- .owner = THIS_MODULE,
- .read = globalfifo_read,
- .write = globalfifo_write,
- .open = globalfifo_open,
- .release = globalfifo_release,
- .llseek = globalfifo_llseek,
- #if KELNEL_OLD
- .unlocked_ioctl = globalfifo_ioctl,
- #endif
- };
- static int globalfifo_probe(struct platform_device *dev)
- {
- int ret;
- dev_t devno;
- /* Alloc for device major */
- if(globalfifo_major)
- {
- devno = MKDEV(globalfifo_major, globalfifo_minor);
- ret = register_chrdev_region(devno, , NAME);
- }
- else
- {
- ret = alloc_chrdev_region(&devno, , , NAME);
- globalfifo_major= MAJOR(devno);
- }
- /* Alloc for device major failure */
- if (ret < )
- {
- printk("%s driver can't get major %d\n", NAME, globalfifo_major);
- return ret;
- }
- /* Initialize globalfifo structure and register cdev*/
- memset(&globalfifo_dev, , sizeof(struct globalfifo_dev));
- cdev_init (&(globalfifo_dev.cdev), &globalfifo_fops);
- globalfifo_dev.cdev.owner = THIS_MODULE;
- ret = cdev_add (&(globalfifo_dev.cdev), devno , );
- if (ret)
- {
- printk (KERN_NOTICE "error %d add %s device", ret, NAME);
- goto fail_cdev_add;
- }
- globalfifo_dev.class = class_create(THIS_MODULE, NAME);
- if(IS_ERR(globalfifo_dev.class))
- {
- printk("%s driver create class failure\n", NAME);
- goto fail_class;
- }
- device_create(globalfifo_dev.class, NULL, devno, NULL, NAME);
- return ;
- fail_class:
- cdev_del(&(globalfifo_dev.cdev));
- fail_cdev_add:
- unregister_chrdev_region(devno, );
- printk("failure to insmod!\n");
- return ret;
- }
- static int globalfifo_remove(struct platform_device *pdev)
- {
- dev_t devno = MKDEV(globalfifo_major, globalfifo_minor);
- cdev_del(&globalfifo_dev.cdev);
- device_destroy(globalfifo_dev.class, devno);
- class_destroy(globalfifo_dev.class);
- unregister_chrdev_region(devno, );
- printk("s3c %s driver removed\n", NAME);
- return ;
- }
- static struct platform_driver globalfifo_driver = {
- .probe = globalfifo_probe,
- .remove = globalfifo_remove,
- .driver = {
- .name = "globalfifo",
- .owner = THIS_MODULE,
- },
- };
- static int __init globalfifo_init(void)
- {
- int ret = ;
- ret = platform_device_register(&globalfifo_device);
- if(ret)
- {
- printk(KERN_ERR "%s:%d: Can't register platform device %d\n", __FUNCTION__, __LINE__ ,ret);
- goto fail_reg_plat_dev;
- }
- printk("Register S3C %s Platform Device successfully.\n", NAME);
- ret = platform_driver_register(&globalfifo_driver);
- if(ret)
- {
- printk(KERN_ERR "%s:%d: Can't register platform driver %d\n", __FUNCTION__, __LINE__, ret);
- goto fail_reg_plat_drv;
- }
- printk("Register S3C %s Platform Driver successfully.\n", NAME);
- return ;
- fail_reg_plat_drv:
- platform_device_unregister(&globalfifo_device);
- fail_reg_plat_dev:
- return ret;
- }
- static void __exit globalfifo_exit(void)
- {
- printk("%s():%s remove %d platform drvier\n", __FUNCTION__, NAME, __LINE__);
- platform_driver_unregister(&globalfifo_driver);
- printk("%s():%s remove %d platform device\n", __FUNCTION__, NAME, __LINE__);
- platform_device_unregister(&globalfifo_device);
- }
- module_init(globalfifo_init);
- module_exit(globalfifo_exit);
- MODULE_ALIAS("platform: globalfifo");
- MODULE_LICENSE("GPL");
Makefile:
- #ARCH=x86
- ARCH=arm920t
- #PROJ=fl2440
- PWD=$(shell pwd)
- ifneq ("${ARCH}", "x86")
- CROSS_COMPILE ?= /opt/buildroot-2011.11/${ARCH}/usr/bin/arm-linux-
- KERNEL_DIR = ../../kernel/linux-3.8/
- else
- KERNEL_DIR = /lib/modules/$(shell uname -r)/build
- endif
- obj-m += plat_globalfifo.o
- all:
- make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
- @make clear
- clear:
- @rm -f *.o *.cmd *.mod.c
- @rm -rf *~ core .depend .tmp_versions Module.symvers modules.order -f
- @rm -f .*ko.* *ko.* .*.o.cmd
- clean:
- rm -f *.ko *.o
- rm -f cscope.* tags
测试程序:
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/ioctl.h>
- #include <string.h>
- #define MEM_CLEAR 0x20
- #define MAX 0x1000
- int main (int argc, char **argv)
- {
- int fd;
- char buf[MAX] = "hello world";
- char buf2[MAX];
- fd = open("/dev/globalfifo", O_RDWR, );
- write(fd, buf, sizeof(buf));
- lseek(fd, , SEEK_SET);
- read(fd, buf2, sizeof(buf2));
- printf("buf=%s, buf2=%s\n", buf, buf2);
- close(fd);
- return ;
- } /* ----- End of main() ----- */
platform总线globalfifo驱动的更多相关文章
- Linux驱动中的platform总线分析
copy from :https://blog.csdn.net/fml1997/article/details/77622860 概述 从Linux2.6内核起,引入一套新的驱动管理和注册机制:pl ...
- 详解Linux2.6内核中基于platform机制的驱动模型 (经典)
[摘要]本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型.首先介绍了Platform总线的基本概念,接着介绍了platform device和platform dri ...
- linux driver ------ platform模型,驱动开发分析
一.platform总线.设备与驱动 在Linux 2.6 的设备驱动模型中,关心总线.设备和驱动3个实体,总线将设备和驱动绑定.在系统每注册一个设备的时候,会寻找与之匹配的驱动:相反的,在系统每注册 ...
- linux设备驱动归纳总结(九):1.platform总线的设备和驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-111745.html linux设备驱动归纳总结(九):1.platform总线的设备和驱动 xxxx ...
- platform总线,设备,驱动的注册
linux设备驱动归纳总结(九):1.platform总线的设备和驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- platform总线驱动代码分析
/************************************************************************/ Linux内核版本:2.6.35.7 运行平台:三 ...
- fl2440 platform总线button字符设备驱动
驱动程序: #include "s3c_driver.h" #define DRV_DESC "S3C24XX button driver" /* Driver ...
- fl2440 platform总线led字符设备驱动
首先需要知道的是,设备跟驱动是分开的.设备通过struct device来定义,也可以自己将结构体封装到自己定义的device结构体中: 例如:struct platform_device: 在inc ...
- 【Linux开发】linux设备驱动归纳总结(九):1.platform总线的设备和驱动
linux设备驱动归纳总结(九):1.platform总线的设备和驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
随机推荐
- (原)win8下编译GLUT
1.到opengl官网下载glut源代码 2.修改glutwin32.mak下 # MSVC install directoriesLIBINSTALL = XXXXX\VC\lib //vs ...
- linux上java路径设置
linux上java路径设置 标签: javalinuxpath 2012-04-30 22:14 1843人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. 往/e ...
- Qt编写自定义控件插件路过的坑及注意事项
在一日一控件的口号下,终于写好了五十几个自定义控件,包括各种仪表盘,各种温度计,各种进度条,各种按钮等,具体可参见(http://www.cnblogs.com/feiyangqingyun/p/61 ...
- Auto CAD 2013的故障解决方法
一.问题的提出 Auto CAD 2013在使用过程中出现了错误:“安全系统(软件锁许可管理器) 不起作用或未正确安装.” 二.问题的分析 网络上很多地方转载了这么一个方法: 1) 启动Windows ...
- MAC 入门
1.安装java jdk eclipse 后发现运行不了,原因是JAVA_HOME 没有设置,真操蛋 export JAVA_HOME=`/usr/libexec/java_home` 2.安装bre ...
- sql server版本
10.00.1600 :SQL 2008 10.50.1600:SQL 2008 R2 10.50.2500:SQL 2008 R2 SP1
- 未能找到类型或命名空间名称“Coco”(是否缺少 using 指令或程序集引用)
未能找到类型或命名空间名称"Coco"(是否缺少 using 指令或程序集引用),如果你确实引用了,那说明你引用的和你的项目环境版本不一样,.NET framework的问题,修改 ...
- 路由器换大Flash
使用winhex自建编程器固件(我的是TP-WR941N V6) 1:使用winhex新建一个8M,16M的文件,编辑-全选,填充选块,填充十六进制数值 FF : 2:打开4M的原厂编程器固件(或者自 ...
- 自己动手搭建 MongoDB 环境,并建立一个 .NET HelloWorld 程序测试
关于 MongoDB,下面来自百度百科: MongoDB[1]是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. mongoDB[1] Mon ...
- codeforces George and Job
/* 题意:给一个长度为n的序列, 从中选择长度为m的k个区间(任意两个区间不会有公共部分) 使得所选择的区间的和最大! 思路:这是一种很常见的dp dp[i][j] 表示的是前 i 个数选择 j 个 ...