master/rtdm.c
branchstable-1.5
changeset 2700 93ef210e9b56
parent 2524 6d9865c37b6f
child 2706 43f8e40a183d
equal deleted inserted replaced
2699:ed6b9e0d7c05 2700:93ef210e9b56
    32 
    32 
    33 #include <linux/module.h>
    33 #include <linux/module.h>
    34 #include <linux/slab.h>
    34 #include <linux/slab.h>
    35 #include <linux/mman.h>
    35 #include <linux/mman.h>
    36 
    36 
    37 #include <rtdm/rtdm_driver.h>
    37 #include <rtdm/driver.h>
    38 
    38 
    39 #include "master.h"
    39 #include "master.h"
    40 #include "ioctl.h"
    40 #include "ioctl.h"
    41 #include "rtdm.h"
    41 #include "rtdm.h"
    42 
    42 
    60 int ec_rtdm_ioctl(struct rtdm_dev_context *, rtdm_user_info_t *,
    60 int ec_rtdm_ioctl(struct rtdm_dev_context *, rtdm_user_info_t *,
    61         unsigned int, void __user *);
    61         unsigned int, void __user *);
    62 
    62 
    63 /****************************************************************************/
    63 /****************************************************************************/
    64 
    64 
       
    65 static struct rtdm_driver ec_rtdm_driver = {
       
    66 	.profile_info		=	RTDM_PROFILE_INFO(foo,
       
    67 							  RTDM_CLASS_EXPERIMENTAL,
       
    68 							  222,
       
    69 							  1),
       
    70 	.device_flags		=	RTDM_NAMED_DEVICE,
       
    71 	.device_count		=	1,
       
    72 	.context_size		=	sizeof(ec_rtdm_context_t).
       
    73 	.ops = {
       
    74         .open      = ec_rtdm_open;
       
    75         .close_nrt = ec_rtdm_close,
       
    76         .ioctl_rt  = ec_rtdm_ioctl,
       
    77         .ioctl_nrt = ec_rtdm_ioctl
       
    78 	},
       
    79 };
       
    80 
    65 /** Initialize an RTDM device.
    81 /** Initialize an RTDM device.
    66  *
    82  *
    67  * \return Zero on success, otherwise a negative error code.
    83  * \return Zero on success, otherwise a negative error code.
    68  */
    84  */
    69 int ec_rtdm_dev_init(
    85 int ec_rtdm_dev_init(
    70         ec_rtdm_dev_t *rtdm_dev, /**< EtherCAT RTDM device. */
    86         ec_rtdm_dev_t *rtdm_dev, /**< EtherCAT RTDM device. */
    71         ec_master_t *master /**< EtherCAT master. */
    87         ec_master_t *master /**< EtherCAT master. */
    72         )
    88         )
    73 {
    89 {
    74     int ret;
    90     int ret;
       
    91 
       
    92     MODULE_VERSION
    75 
    93 
    76     rtdm_dev->master = master;
    94     rtdm_dev->master = master;
    77 
    95 
    78     rtdm_dev->dev = kzalloc(sizeof(struct rtdm_device), GFP_KERNEL);
    96     rtdm_dev->dev = kzalloc(sizeof(struct rtdm_device), GFP_KERNEL);
    79     if (!rtdm_dev->dev) {
    97     if (!rtdm_dev->dev) {
    80         EC_MASTER_ERR(master, "Failed to reserve memory for RTDM device.\n");
    98         EC_MASTER_ERR(master, "Failed to reserve memory for RTDM device.\n");
    81         return -ENOMEM;
    99         return -ENOMEM;
    82     }
   100     }
    83 
   101     
    84     rtdm_dev->dev->struct_version = RTDM_DEVICE_STRUCT_VER;
   102     rtdm_dev->dev->label = kzalloc(RTDM_MAX_DEVNAME_LEN+1, GFP_KERNEL);
    85     rtdm_dev->dev->device_flags = RTDM_NAMED_DEVICE;
   103     if (!rtdm_dev->dev->label) {
    86     rtdm_dev->dev->context_size = sizeof(ec_rtdm_context_t);
   104         EC_MASTER_ERR(master, "Failed to reserve memory for RTDM device name.\n");
    87     snprintf(rtdm_dev->dev->device_name, RTDM_MAX_DEVNAME_LEN,
   105         return -ENOMEM;
       
   106         kfree(rtdm_dev->dev);
       
   107     }
       
   108     
       
   109 
       
   110     rtdm_dev->dev->driver = &ec_rtdm_driver;
       
   111     snprintf(rtdm_dev->dev->label, RTDM_MAX_DEVNAME_LEN,
    88             "EtherCAT%u", master->index);
   112             "EtherCAT%u", master->index);
    89     rtdm_dev->dev->open_nrt = ec_rtdm_open;
       
    90     rtdm_dev->dev->ops.close_nrt = ec_rtdm_close;
       
    91     rtdm_dev->dev->ops.ioctl_rt = ec_rtdm_ioctl;
       
    92     rtdm_dev->dev->ops.ioctl_nrt = ec_rtdm_ioctl;
       
    93     rtdm_dev->dev->device_class = RTDM_CLASS_EXPERIMENTAL;
       
    94     rtdm_dev->dev->device_sub_class = 222;
       
    95     rtdm_dev->dev->driver_name = "EtherCAT";
       
    96     rtdm_dev->dev->driver_version = RTDM_DRIVER_VER(1, 0, 2);
       
    97     rtdm_dev->dev->peripheral_name = rtdm_dev->dev->device_name;
       
    98     rtdm_dev->dev->provider_name = "EtherLab Community";
       
    99     rtdm_dev->dev->proc_name = rtdm_dev->dev->device_name;
       
   100     rtdm_dev->dev->device_data = rtdm_dev; /* pointer to parent */
   113     rtdm_dev->dev->device_data = rtdm_dev; /* pointer to parent */
       
   114 
   101 
   115 
   102     EC_MASTER_INFO(master, "Registering RTDM device %s.\n",
   116     EC_MASTER_INFO(master, "Registering RTDM device %s.\n",
   103             rtdm_dev->dev->driver_name);
   117             rtdm_dev->dev->driver_name);
   104     ret = rtdm_dev_register(rtdm_dev->dev);
   118     ret = rtdm_dev_register(rtdm_dev->dev);
   105     if (ret) {
   119     if (ret) {
   106         EC_MASTER_ERR(master, "Initialization of RTDM interface failed"
   120         EC_MASTER_ERR(master, "Initialization of RTDM interface failed"
   107                 " (return value %i).\n", ret);
   121                 " (return value %i).\n", ret);
       
   122         kfree(rtdm_dev->dev->label);
   108         kfree(rtdm_dev->dev);
   123         kfree(rtdm_dev->dev);
   109     }
   124     }
   110 
   125 
   111     return ret;
   126     return ret;
   112 }
   127 }
   120         )
   135         )
   121 {
   136 {
   122     int ret;
   137     int ret;
   123 
   138 
   124     EC_MASTER_INFO(rtdm_dev->master, "Unregistering RTDM device %s.\n",
   139     EC_MASTER_INFO(rtdm_dev->master, "Unregistering RTDM device %s.\n",
   125             rtdm_dev->dev->driver_name);
   140             rtdm_dev->dev->label);
   126     ret = rtdm_dev_unregister(rtdm_dev->dev, 1000 /* poll delay [ms] */);
   141     ret = rtdm_dev_unregister(rtdm_dev->dev, 1000 /* poll delay [ms] */);
   127     if (ret < 0) {
   142     if (ret < 0) {
   128         EC_MASTER_WARN(rtdm_dev->master,
   143         EC_MASTER_WARN(rtdm_dev->master,
   129                 "Failed to unregister RTDM device (code %i).\n", ret);
   144                 "Failed to unregister RTDM device (code %i).\n", ret);
   130     }
   145     }
   131 
   146 
       
   147     kfree(rtdm_dev->dev->label);
   132     kfree(rtdm_dev->dev);
   148     kfree(rtdm_dev->dev);
   133 }
   149 }
   134 
   150 
   135 /****************************************************************************/
   151 /****************************************************************************/
   136 
   152