proc.c revision c7427409cd071a34c4a13c5c24531b7a10334e31
1ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef/*
2ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    module/proc.c
3ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    /proc interface for comedi
4ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
5ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    COMEDI - Linux Control and Measurement Device Interface
6ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    Copyright (C) 1998 David A. Schleef <ds@schleef.org>
7ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
8ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    This program is free software; you can redistribute it and/or modify
9ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    it under the terms of the GNU General Public License as published by
10ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    the Free Software Foundation; either version 2 of the License, or
11ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    (at your option) any later version.
12ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
13ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    This program is distributed in the hope that it will be useful,
14ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    but WITHOUT ANY WARRANTY; without even the implied warranty of
15ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    GNU General Public License for more details.
17ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
18ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    You should have received a copy of the GNU General Public License
19ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    along with this program; if not, write to the Free Software
20ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
22ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef*/
23ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
24ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef/*
25ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	This is some serious bloatware.
26ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
27ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	Taken from Dave A.'s PCL-711 driver, 'cuz I thought it
28ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	was cool.
29ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef*/
30ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
31ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef#define __NO_VERSION__
32ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef#include "comedidev.h"
33ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef#include <linux/proc_fs.h>
34b6c777571b8d387d3add91170826f32a379e4313Bill Pemberton/* #include <linux/string.h> */
35ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
36ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleefint comedi_read_procmem(char *buf, char **start, off_t offset, int len,
37ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	int *eof, void *data);
38ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
39ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleefextern comedi_driver *comedi_drivers;
40ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
41ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleefint comedi_read_procmem(char *buf, char **start, off_t offset, int len,
42ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	int *eof, void *data)
43ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef{
44ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	int i;
45ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	int devices_q = 0;
46ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	int l = 0;
47ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	comedi_driver *driv;
48ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
49ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	l += sprintf(buf + l,
50ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		"comedi version " COMEDI_RELEASE "\n"
51ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		"format string: %s\n",
52ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		"\"%2d: %-20s %-20s %4d\",i,driver_name,board_name,n_subdevices");
53ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
54ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	for (i = 0; i < COMEDI_NUM_BOARD_MINORS; i++) {
55ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		struct comedi_device_file_info *dev_file_info = comedi_get_device_file_info(i);
56ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		comedi_device *dev;
57ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
58c7427409cd071a34c4a13c5c24531b7a10334e31Bill Pemberton		if (dev_file_info == NULL)
59c7427409cd071a34c4a13c5c24531b7a10334e31Bill Pemberton			continue;
60ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		dev = dev_file_info->device;
61ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
62ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		if (dev->attached) {
63ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef			devices_q = 1;
64ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef			l += sprintf(buf + l, "%2d: %-20s %-20s %4d\n",
65ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef				i,
66ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef				dev->driver->driver_name,
67ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef				dev->board_name, dev->n_subdevices);
68ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		}
69ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	}
70ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	if (!devices_q) {
71ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		l += sprintf(buf + l, "no devices\n");
72ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	}
73ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
74ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	for (driv = comedi_drivers; driv; driv = driv->next) {
75ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		l += sprintf(buf + l, "%s:\n", driv->driver_name);
76ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		for (i = 0; i < driv->num_names; i++) {
77ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef			l += sprintf(buf + l, " %s\n",
78ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef				*(char **)((char *)driv->board_name +
79ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef					i * driv->offset));
80ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		}
81ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		if (!driv->num_names) {
82ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef			l += sprintf(buf + l, " %s\n", driv->driver_name);
83ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		}
84ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	}
85ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
86ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	return l;
87ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef}
88ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
89a8275fcaa7ca1f720f0c1b1c4c373964ffc9f72dJ.R. Mauro#ifdef CONFIG_PROC_FS
90ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleefvoid comedi_proc_init(void)
91ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef{
92ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	struct proc_dir_entry *comedi_proc;
93ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
94ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	comedi_proc = create_proc_entry("comedi", S_IFREG | S_IRUGO, 0);
95ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	if (comedi_proc)
96ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef		comedi_proc->read_proc = comedi_read_procmem;
97ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef}
98ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef
99ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleefvoid comedi_proc_cleanup(void)
100ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef{
101ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef	remove_proc_entry("comedi", 0);
102ed9eccbe8970f6eedc1b978c157caf1251a896d4David Schleef}
103a8275fcaa7ca1f720f0c1b1c4c373964ffc9f72dJ.R. Mauro#endif
104