[LinuxPPS] Some help with linuxpps

Marc Leclerc marc_x at videotron.ca
Fri Apr 2 01:07:24 CEST 2010


Hi,

Excuse my lack of know how on Linux, I am truly working on it and
finding it exiting...

In order to create the none entry I need the access write I believe it
to be, the major is 253

in my file to make the nodes for example I have

/dev/gpio/59 c 644 0 0 250 59

Could you tell me if you'd like the string i must use and the
description of the entries so I may continue learning.

Nest I will adapt your driver and see what happens.

Thanks for your time, Appreciated

Marc

On Mon, 2010-03-29 at 16:35 -0400, Jeff Angielski wrote:
> Marc Leclerc wrote:
> 
> > 
> > I plan to use a gpio to connect the PPS pulse to my device PORT G pin 0
> > which can be configured as interrupt if that is required?. It also can
> > be map to /dev/gpio/83, also if required?. Here I cannot solve how to
> > have the device present (do I need an entry in /etc/makedevs.d?) and how
> > to configure the pin (interrupt or input) and the driver to use that
> > gpio. Is there a need for me to do some coding to get the precess going
> > or does the driver take care of this?
> 
> I am struggling trying to make all of this work but I can at least 
> answer this question.
> 
> As a quick hack, just scan /proc/devices and look for the pps device. 
> This will give you your character device major number.  Just manually 
> create the nodes using mknod.  It's a hack but it will get you started. 
>   Later you can get udev to add it automagically.
> 
> You will need to configure it is as interrupt.  Nobody is "polling" the 
> GPIO line.
> 
> Here is a simple IRQ client that I am currently playing with that you 
> may find useful as a starting point.  The driver works but still can use 
> some cleanup.
> 
> 
> 
> *
>   * pps-hwirq.c
>   *
>   *
>   * Based on the ktimer from:
>   * Copyright (C) 2005-2006   Rodolfo Giometti <giometti at linux.it>
>   *
>   *   This program is free software; you can redistribute it and/or modify
>   *   it under the terms of the GNU General Public License as published by
>   *   the Free Software Foundation; either version 2 of the License, or
>   *   (at your option) any later version.
>   *
>   *   This program is distributed in the hope that it will be useful,
>   *   but WITHOUT ANY WARRANTY; without even the implied warranty of
>   *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>   *   GNU General Public License for more details.
>   *
>   *   You should have received a copy of the GNU General Public License
>   *   along with this program; if not, write to the Free Software
>   *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
>   */
> 
> 
> #include <linux/kernel.h>
> #include <linux/module.h>
> #include <linux/init.h>
> #include <linux/time.h>
> #include <linux/timer.h>
> #include <linux/pps_kernel.h>
> #include <linux/irq.h>
> #include <linux/interrupt.h>
> 
> /*
>   * Global variables
>   */
> 
> /* TODO: Make a module parameter and leave this as default */
> #define PPS_HWIRQ_DEFAULT	6
> static unsigned int pps_hwirq = PPS_HWIRQ_DEFAULT;
> 
> /* TODO: Make a structure to share all of this */
> static unsigned int pps_virq;
> static int source;
> 
> /*
>   *
>   */
> static irqreturn_t pps_hwirq_handler(int irq, void *parm)
> {
> 	struct timespec __ts;
> 	struct pps_ktime ts;
> 
> 	/* First of all we get the time stamp... */
> 	getnstimeofday(&__ts);
> 
> 	/* ... and translate it to PPS time data struct */
> 	ts.sec = __ts.tv_sec;
> 	ts.nsec = __ts.tv_nsec;
> 
> 	pps_event(source, &ts, PPS_CAPTUREASSERT, NULL);
> 
> 	pr_debug("PPS event at %lu\n", jiffies);
> 
> 	return IRQ_HANDLED;
> }
> 
> /*
>   * The echo function
>   */
> 
> static void pps_hwirq_echo(int source, int event, void *data)
> {
> 	pr_info("echo %s %s for source %d\n",
> 		event & PPS_CAPTUREASSERT ? "assert" : "",
> 		event & PPS_CAPTURECLEAR ? "clear" : "",
> 		source);
> }
> 
> /*
>   * The PPS info struct
>   */
> 
> /* TODO: Decipher the needed flags */
> static struct pps_source_info pps_hwirq_info = {
> 	.name		= "pps_hwirq",
> 	.path		= "",
> 	.mode		= PPS_CAPTUREASSERT | PPS_OFFSETASSERT | \
> 			  PPS_ECHOASSERT | \
> 			  PPS_CANWAIT | PPS_TSFMT_TSPEC,
> 	.echo		= pps_hwirq_echo,
> 	.owner		= THIS_MODULE,
> };
> 
> /*
>   * Module staff
>   */
> 
> static void __exit pps_hwirq_exit(void)
> {
> 	free_irq(pps_virq, NULL);
> 
> 	pps_unregister_source(source);
> 
> 	pr_info("hwirq PPS source unregistered\n");
> }
> 
> static int __init pps_hwirq_init(void)
> {
> 	int ret;
> 
> 	pps_virq = irq_create_mapping(NULL, pps_hwirq);
> 	if (pps_virq == NO_IRQ) {
> 		printk(KERN_ERR "cannot create irq mapping for hw irq: %d\n", pps_hwirq);
> 		return -EINVAL;
> 	}
> 
> 	/* TOOD: Do we need to pass anything into the handler? */
> 	ret = request_irq( pps_virq, pps_hwirq_handler, IRQF_TRIGGER_RISING, 
> "pps hwirq", NULL);
> 	if (ret) {
> 		printk(KERN_ERR "failed to register handler for virq: %d\n", pps_virq);
> 		return ret;
> 	}
> 
> 	ret = pps_register_source(&pps_hwirq_info,
> 				PPS_CAPTUREASSERT | PPS_OFFSETASSERT);
> 
> 	if (ret < 0) {
> 		printk(KERN_ERR "cannot register hwirq source\n");
> 		return ret;
> 	}
> 	source = ret;
> 
> 	pr_info("hwirq PPS source registered at %d\n", source);
> 
> 	return  0;
> }
> 
> module_init(pps_hwirq_init);
> module_exit(pps_hwirq_exit);
> 
> MODULE_AUTHOR("Jeff Angielski <jeff at theptrgroup.com>");
> MODULE_DESCRIPTION("Hardware interrupt PPS source");
> MODULE_LICENSE("GPL");
> 
> 
> 





More information about the LinuxPPS mailing list