public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Christian Gmeiner" <christian@visual-page.de>
To: <linux-kernel@vger.kernel.org>
Subject: Problem with dvb-sysfs patch
Date: Mon, 31 May 2004 18:20:58 +0200	[thread overview]
Message-ID: <008501c4472c$44596960$0600a8c0@blackbox> (raw)

I mailinglist.

I am writing a sysfs patch for the dvb driver (linuxtv.org). I get some very
nice stuff runnning:

vdr root # ls -Rl /sys/class/dvb
/sys/class/dvb:
total 0
drwxr-xr-x  6 root root 0 May 31 17:11 adapter0

/sys/class/dvb/adapter0:
total 0
drwxr-xr-x  2 root root    0 May 31 17:11 demux0
drwxr-xr-x  2 root root    0 May 31 17:11 dvr0
-r--r--r--  1 root root 4096 May 31 17:11 frontend
drwxr-xr-x  2 root root    0 May 31 17:11 frontend0
-r--r--r--  1 root root 4096 May 31 17:11 name
drwxr-xr-x  2 root root    0 May 31 17:11 net0

/sys/class/dvb/adapter0/demux0:
total 0
-r--r--r--  1 root root 4096 May 31 17:11 adap
-r--r--r--  1 root root 4096 May 31 17:11 dev

/sys/class/dvb/adapter0/dvr0:
total 0
-r--r--r--  1 root root 4096 May 31 17:11 adap
-r--r--r--  1 root root 4096 May 31 17:11 dev

/sys/class/dvb/adapter0/frontend0:
total 0
-r--r--r--  1 root root 4096 May 31 17:11 adap
-r--r--r--  1 root root 4096 May 31 17:11 dev

/sys/class/dvb/adapter0/net0:
total 0
-r--r--r--  1 root root 4096 May 31 17:11 adap
-r--r--r--  1 root root 4096 May 31 17:11 dev

vdr root # ls -Rl /dev/dvb
/dev/dvb:
total 0
drwxr-xr-x  2 root root 0 May 31 17:11 adapter0

/dev/dvb/adapter0:
total 0
crw-rw----  1 root video 250, 7 May 31 17:11 adapter0
crw-rw----  1 root video 250, 4 May 31 17:11 demux0
crw-rw----  1 root video 250, 5 May 31 17:11 dvr0
crw-rw----  1 root video 250, 3 May 31 17:11 frontend0
crw-rw----  1 root video 250, 7 May 31 17:11 net0


But it is not possible for me to acces the device:

vdr root # ls /dev/dvb/adapter0/frontend0
/dev/dvb/adapter0/frontend0
vdr root # cat /dev/dvb/adapter0/frontend0
cat: /dev/dvb/adapter0/frontend0: No such device or address

I am using a 2.6.6 Kernel.

So here are now the programming stuff:

I have written an abstract interface to support devfs, sysfs and procfs. So
i have functions to un/register
adapters and devices

#ifndef DVB_SYSFS_DIR
#define DVB_SYSFS_DIR "dvb" //-> /sys/class/dvb/...
#endif

static struct class dvb_class = {
 .name = DVB_SYSFS_DIR
};

static ssize_t show_name(struct class_device *cd, char *buf)
{
 struct dvb_adapter *adap = container_of(cd, struct dvb_adapter, class_dev);
 sprintf(buf, "%s\n", adap->name);
 return strlen(buf) + 1;
}

static CLASS_DEVICE_ATTR(name, S_IRUGO, show_name, NULL);

static ssize_t show_frontend(struct class_device *cd, char *buf)
{
 struct dvb_adapter *adap = container_of(cd, struct dvb_adapter, class_dev);
 sprintf(buf, "%s\n", adap->frontend);
 return strlen(buf) + 1;
}

static CLASS_DEVICE_ATTR(frontend, S_IRUGO, show_frontend, NULL);

static ssize_t show_devnum(struct class_device *cd, char *buf)
{
 struct dvb_device *dvbdev = container_of(cd, struct dvb_device, class_dev);

 sprintf(buf, "%d:%d\n", DVB_MAJOR, nums2minor(dvbdev->adapter->num,
dvbdev->type, dvbdev->id));
 return strlen(buf) + 1;
}

static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_devnum, NULL);

static ssize_t show_adap(struct class_device *cd, char *buf)
{
 struct dvb_device *dvbdev = container_of(cd, struct dvb_device, class_dev);
 sprintf(buf, "adapter%d\n", dvbdev->adapter->num);
 return strlen(buf) + 1;
}

static CLASS_DEVICE_ATTR(adap, S_IRUGO, show_adap, NULL);


static struct class_device_attribute *dvb_adapter_attrs[] = {
 &class_device_attr_name,
 &class_device_attr_frontend,
 NULL
};

static struct class_device_attribute *dvb_device_attrs[] = {
 &class_device_attr_dev,
 &class_device_attr_adap,
 NULL
};

static void dvb_sysfs_register_adapter(struct dvb_adapter *adap)
{
 char name[64] = "";
 int i;

 adap->class_dev.class = &dvb_class;
 adap->class_dev.dev = NULL;
 adap->class_dev.class_data = adap;

 sprintf(name,"adapter%d", adap->num);
 strcpy(adap->class_dev.class_id, name);

 if (class_device_register(&adap->class_dev))
  printk(KERN_ERR "Unable to register dvb class device\n");

 for (i = 0; dvb_adapter_attrs[i]; i++)
  class_device_create_file(&(adap->class_dev), dvb_adapter_attrs[i]);
}

static void dvb_sysfs_unregister_adapter(struct dvb_adapter *adap)
{
 class_device_unregister(&(adap->class_dev));
}

static void dvb_sysfs_register_device(struct dvb_device *dvbdev)
{
 int i;
 char name[64] = "";
 struct class_device *class_dev = &(dvbdev->class_dev);

 sprintf(name,"%s%d", dnames[dvbdev->type], dvbdev->adapter->num);

 class_dev->class = &dvb_class;
 class_dev->class_data = dvbdev;
 strcpy(class_dev->class_id, name);

 kobject_init(&class_dev->kobj);
 strcpy(class_dev->kobj.name, name);
 class_dev->kobj.parent = &dvbdev->adapter->class_dev.kobj;
 class_dev->kobj.kset = dvbdev->adapter->class_dev.kobj.kset;
 class_dev->kobj.ktype = dvbdev->adapter->class_dev.kobj.ktype;
 class_dev->kobj.dentry = dvbdev->adapter->class_dev.kobj.dentry;
 kobject_register(&class_dev->kobj);

 for (i = 0; dvb_device_attrs[i]; i++)
  class_device_create_file(class_dev, dvb_device_attrs[i]);

 printk("DVB: register device %s\n", name);
}

static void dvb_sysfs_unregister_device(struct dvb_device *dvbdev)
{
 kobject_unregister(&dvbdev->class_dev.kobj);
}

static int dvb_sysfs_init(void)
{
 printk("DVB: Using sysfs funtions2\n");

 if (class_register(&dvb_class) != 0) {
  printk("DVB: adapter class failed to register properly");
  return -1;
 }

 return 0;
}

static void dvb_sysfs_exit(void)
{
 class_unregister(&dvb_class);
}

struct dvb_registrar_s dvb_sysfs_registrar =
{
 .register_adapter = &dvb_sysfs_register_adapter,
 .unregister_adapter = &dvb_sysfs_unregister_adapter,
 .register_device = &dvb_sysfs_register_device,
 .unregister_device = &dvb_sysfs_unregister_device,
 .dvbdev_init  = &dvb_sysfs_init,
 .dvbdev_exit  = &dvb_sysfs_exit,
};


So.. how are the functions called?

register_adapter -> /sys/class/adapter0

register_devices -> /sys/class/adapter0/DEVICENAME(ID)

But why can't i access the devices?

I hope you got enough infos about my programming problem, and maybe somebody
can help me out.

Greets, Christian



                 reply	other threads:[~2004-05-31 16:26 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='008501c4472c$44596960$0600a8c0@blackbox' \
    --to=christian@visual-page.de \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox