Problem with dvb-sysfs patch

From: Christian Gmeiner (christian_at_visual-page.de)
Date: 05/31/04

  • Next message: Jan-Benedict Glaw: "Re: Resume enhancement: restore pci config space"
    To: <linux-kernel@vger.kernel.org>
    Date:	Mon, 31 May 2004 18:20:58 +0200
    
    

    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

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/


  • Next message: Jan-Benedict Glaw: "Re: Resume enhancement: restore pci config space"

    Relevant Pages

    • RE: I request inclusion of SAS Transport Layer and AIC-94xx into the kernel
      ... > translate the CSMI handler in the aacraid driver to a similar sysfs ... > consider rewriting SDI for sysfs and move ... send the line "unsubscribe linux-kernel" in ... More majordomo info at http://vger.kernel.org/majordomo-info.html ...
      (Linux-Kernel)
    • Re: [RFC] Reliable video POSTing on resume
      ... sysfs can be a one stop shop for all ... > resources (i.e. MMIO ranges, fb memory, etc.) and legacy I/O ports and ... send the line "unsubscribe linux-kernel" in ... More majordomo info at http://vger.kernel.org/majordomo-info.html ...
      (Linux-Kernel)
    • [Announce] megaraid_mbox 2.20.4.3 patch
      ... replace with the sysfs attribute. ... To remove drives and change ... most of command will return within timeout. ... static int megaraid_abort_handler; ...
      (Linux-Kernel)
    • Re: [RFC] EDAC and the sysfs
      ... > definitely has been a bit thin on information on sysfs ... for anyone doing any driver core stuff. ... send the line "unsubscribe linux-kernel" in ... More majordomo info at http://vger.kernel.org/majordomo-info.html ...
      (Linux-Kernel)
    • [RFC/PATCH 17/22] W1: cleanup slave refcounting & more
      ... static struct device_attribute w1_slave_attribute_val = ... int err; ... return err; ... "sysfs file creation for failed. ...
      (Linux-Kernel)