LINUX 产生PPM 驱动例子
APP:
- //author:DriverMonkey
- //phone:13410905075
- //mail:bookworepeng@Hotmail.com
- //qq:196568501
- #include<stdio.h>
- #include<string.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<fcntl.h>
- #include<unistd.h>
- #define US (1000)
- #define PPM_CHANEL 8
- #define FIX_LOW_TIME 100*US
- #define FIX_SYNC_TIME 5000
- static long long ppm_values[(PPM_CHANEL + 1)*2] =
- {FIX_LOW_TIME,1000*US, // 1
- FIX_LOW_TIME,1000*US, // 2
- FIX_LOW_TIME,1000*US, // 3
- FIX_LOW_TIME,1000*US, // 4
- FIX_LOW_TIME,1000*US, // 5
- FIX_LOW_TIME,1000*US, // 6
- FIX_LOW_TIME,1000*US, // 7
- FIX_LOW_TIME,1000*US, // 8
- FIX_LOW_TIME,FIX_SYNC_TIME*US, }; // 9
- int main(int argc,char *args[])
- {
- int fd;
- int channel = 0;
- long long value = 0;
- fd=open("/dev/ppm",O_WRONLY|O_CREAT,0640);
- if(fd < 0)
- return 0;
- if(argc > 3)
- return;
- channel = atol(args[1]);
- printf("input channle is: %d\n", channel);
- value = atol(args[2]);
- printf("input value is: %d\n", (int)value );
- printf("old value is:%d\n",(int)ppm_values[channel*2 + 1]);
- ppm_values[channel*2 + 1] = value*US;
- printf("new value is:%d\n",(int)ppm_values[channel*2 + 1]);
- write(fd,ppm_values,sizeof(ppm_values));
- sleep(20);
- close(fd);
- }
Driver:
- //author:DriverMonkey
- //phone:13410905075
- //mail:bookworepeng@Hotmail.com
- //qq:196568501
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/cdev.h>
- #include <linux/fs.h>
- #include <linux/device.h>
- #include <linux/syscalls.h>
- #include <linux/interrupt.h>
- #include <linux/gpio.h>
- #include <linux/of_gpio.h>
- #include <linux/of_platform.h>
- #include <linux/uaccess.h>
- #include <linux/string.h>
- #include <mach/gpio.h>
- #include <mach/irqs.h>
- #define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))
- #define US (1000)
- #define PPM_CHANEL 8
- #define FIX_LOW_TIME 100*US
- struct ppm_dev
- {
- struct cdev cdev;
- dev_t devno;
- struct class *ppm_class;
- int message_cdev_open;
- };
- struct ppm_dev ppm_dev;
- static long long ppm_values[(PPM_CHANEL + 1)*2] =
- {FIX_LOW_TIME,1000*US, // 1
- FIX_LOW_TIME,1000*US, // 2
- FIX_LOW_TIME,1000*US, // 3
- FIX_LOW_TIME,1000*US, // 4
- FIX_LOW_TIME,1000*US, // 5
- FIX_LOW_TIME,1000*US, // 6
- FIX_LOW_TIME,1000*US, // 7
- FIX_LOW_TIME,1000*US, // 8
- FIX_LOW_TIME,5000*US, }; // 9
- ktime_t ktime;
- static struct hrtimer hr_timer;
- static enum hrtimer_restart hrtimer_callback(struct hrtimer *timer)
- {
- static int index = 0;
- static ktime_t ktime;
- if(index == ((PPM_CHANEL + 1)*2))
- index = 0;
- ktime.tv64 = ppm_values[index];
- hrtimer_forward(timer, timer->base->get_time(), ktime);
- index++;
- if(ktime.tv64 == FIX_LOW_TIME)
- gpio_direction_output(GPIO_TO_PIN(0,27), 0);
- else
- gpio_direction_output(GPIO_TO_PIN(0,27), 1);
- //printk("%d\n",(int)ktime.tv64);
- return HRTIMER_RESTART;
- }
- static int ppm_open(struct inode *node, struct file *fd)
- {
- int ret = 0;
- printk("ppm_open()++\n");
- ktime = ktime_set( 0, 200*1000); // 200us
- hrtimer_init( &hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL );
- hr_timer.function = &hrtimer_callback;
- hrtimer_start( &hr_timer, ktime, HRTIMER_MODE_REL );
- printk("ppm_open()--\n");
- return ret;
- }
- ssize_t ppm_write(struct file *pfile,
- const char __user *buffer,
- size_t size,
- loff_t *pnull)
- {
- printk("ppm_write()++\n");
- if(size != sizeof(ppm_values))
- return 0;
- copy_from_user(ppm_values, buffer, size);
- printk("ppm_write()--\n");
- return size;
- }
- static int ppm_fasync(int fd, struct file *filp, int mode)
- {
- printk("ppm_fasync()++\n");
- printk("ppm_fasync()--\n");
- return 0;
- }
- static int ppm_release(struct inode *node, struct file *fd)
- {
- printk("ppm_release()++\n");
- hrtimer_cancel(&hr_timer);
- printk("ppm_release()--\n");
- return 0;
- }
- struct file_operations meassage_operatons =
- {
- .owner = THIS_MODULE,
- .open = ppm_open,
- .write = ppm_write,
- .fasync = ppm_fasync,
- .release = ppm_release,
- };
- static int __init ppm_init(void)
- {
- struct ppm_dev * dev;
- int ret = 0;
- dev = &ppm_dev;
- alloc_chrdev_region(&dev->devno, 0, 1, "out_ppm");
- dev->ppm_class = class_create(THIS_MODULE, "ppm_class");
- if(IS_ERR(dev->ppm_class)) {
- printk(KERN_ERR"Err: failed in creating class./n");
- goto fail1;
- }
- device_create(dev->ppm_class, NULL, dev->devno, NULL, "ppm");
- //init irq
- ret = gpio_request(GPIO_TO_PIN(0,27), "ppm_inter");
- if(ret){
- printk(KERN_ERR"gpio_request() failed !\n");
- goto fail1;
- }
- ret = gpio_direction_output(GPIO_TO_PIN(0,27), 1);
- if(ret){
- printk(KERN_ERR"gpio_direction_input() failed !\n");
- goto fail2;
- }
- cdev_init(&dev->cdev, &meassage_operatons);
- cdev_add(&dev->cdev, dev->devno, 1);
- if(ret){
- printk(KERN_ERR"request_irq() failed ! %d\n", ret);
- goto fail2;
- }
- printk("ppm_to_app_init(void)--\n");
- return 0;
- fail2:
- gpio_free(GPIO_TO_PIN(0,27));
- fail1:
- device_destroy(dev->ppm_class, dev->devno);
- class_destroy(dev->ppm_class);
- cdev_del(&dev->cdev);
- unregister_chrdev_region(dev->devno, 1);
- return ret;
- }
- static void __exit ppm_exit(void)
- {
- struct ppm_dev *dev = &ppm_dev;
- // printk("ppm_to_app_exit(void)++\n");
- gpio_free(GPIO_TO_PIN(0,27));
- device_destroy(dev->ppm_class, dev->devno);
- class_destroy(dev->ppm_class);
- cdev_del(&dev->cdev);
- unregister_chrdev_region(dev->devno, 1);
- // printk("ppm_to_app_exit(void)--\n");
- }
- module_init(ppm_init);
- module_exit(ppm_exit);
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("Driver Monkey");
- MODULE_DESCRIPTION("Test ppm");
LINUX 产生PPM 驱动例子的更多相关文章
- Linux FC/iSCSI存储设备管理系列(一):Linux系统设备驱动入门
Linux FC/iSCSI存储设备管理系列(一):Linux系统设备驱动入门 转载请在文首保留原文出处:EMC中文支持论坛 - https://community.emc.com/go/chines ...
- 【VS开发】【DSP开发】浅谈Linux PCI设备驱动(二)
我们在 浅谈Linux PCI设备驱动(一)中(以下简称 浅谈(一) )介绍了PCI的配置寄存器组,而Linux PCI初始化就是使用了这些寄存器来进行的.后面我们会举个例子来说明Linux PCI设 ...
- 【VS开发】【DSP开发】浅谈Linux PCI设备驱动(一)
要弄清楚Linux PCI设备驱动,首先要明白,所谓的Linux PCI设备驱动实际包括Linux PCI设备驱动和设备本身驱动两部分.不知道读者理不理解这句话,本人觉得这句话很重要,对于PCI.US ...
- (57)Linux驱动开发之三Linux字符设备驱动
1.一般情况下,对每一种设备驱动都会定义一个软件模块,这个工程模块包含.h和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现. 2.典型的无操作系统下的逻辑开发程序是: ...
- Linux Charger IC 驱动移植总结
Linux Charger IC 驱动移植总结 文章目录 Linux Charger IC 驱动移植总结 1 设备树的基本知识 设备树的概念 设备树的基本结构 compatible属性 举个栗子 2 ...
- linux块设备驱动之实例
1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major = register_blkdev(sbull_major, "sbull&quo ...
- Linux 视频设备驱动V4L2最常用的控制命令
http://blog.csdn.net/shaolyh/article/details/6583226 Linux 视频设备驱动V4L2最常用的控制命令使用说明(1.02) 命令 功能 VIDIOC ...
- linux 2.6 驱动笔记(一)
本文作为linux 2.6 驱动笔记,记录环境搭建及linux基本内核模块编译加载. 环境搭建: 硬件:OK6410开发板 目标板操作系统:linux 2.6 交叉编译环境:windows 7 + v ...
- 深入理解Linux字符设备驱动
文章从上层应用访问字符设备驱动开始,一步步地深入分析Linux字符设备的软件层次.组成框架和交互.如何编写驱动.设备文件的创建和mdev原理,对Linux字符设备驱动有全面的讲解.本文整合之前发表的& ...
随机推荐
- PostgreSQL Replication之第十一章 使用Skytools(3)
11.3 管理 pgq-queues Skytools 的一个核心组件是pgq.它提供了一个通用排队接口,它可以让您把消息从一个消息提供者传送到一个任意数目的接收者. 现在的问题是:一般来说,一个队列 ...
- Lintcode: Interval Sum
Given an integer array (index from 0 to n-1, where n is the size of this array), and an query list. ...
- Winform ListView 元素拖动
//ListView 属性 /* AllowDrop : True */ ListView objLVDrag; private void listView_DragDrop(object sende ...
- cluster集群
http://zwfang09.blog.sohu.com/entry/ Cluster 集群 ,群集 --- 负载均衡 LB ,load-balance --- 高可用集群 HA ,High Ava ...
- 杭电1241 Oil Deposits
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission ...
- js break continue
for 循环从 1 到 10 迭代变量 i.在循环主体中,if 语句将(使用取模运算符)检查 i 的值是否能被 5 整除.如果能被 5 整除,将执行 break 语句.alert 显示 "4 ...
- webpack我遇到的一些坑
我的第一个用于实验webpack的项目是一个拥有多个版本的项目.什么叫多个版本?这个项目对3个语言版本+3个不同城市版本+(移动端 + PC端),也就是3*3*2,18个版本. 我的第一次想法肯定是 ...
- MYSQL日期类型的加减更新使用INTERVAL 1 DAY
例如:UPDATE teachingplan SET teachPlanBeginTime = teachPlanBeginTime +INTERVAL 1 DAY
- [ubuntu] Can not run OpenProj on Ubuntu
Download openproj from http://sourceforge.net/projects/openproj/ Yes, you can only download the rpm ...
- [v]Debian类系统的有效国内源
源文件的位置 /etc/apt/sources.list 因为测试需要,装完Debian7 后,更新为163的源,但是后来装软件时,一些软件依赖包还是装不上.后来把163源稍加改动,就好用了.163源 ...